{"version":3,"file":"static/js/main.7d1782f5.js","mappings":"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9P,EAAA,GACAojH,EAAA,GACA5a,EAAA,GACAjxE,EAAA,GACAo5F,EAAA,GACAxxD,EAAA,GACA57B,EAAA,GACApH,EAAA,GACA8qB,EAAA,EACA34B,EAAA,GACA2zF,EAAA,GACAva,EAAA,GACA7vE,EAAA,GACA24F,EAAA,GACAvxD,EAAA,GACAh8B,EAAA,GACAtG,EAAA,GACAkqB,EAAA,GACAwsC,EAAA,GACA2iB,EAAA,EACA5jG,EAAA,QACAkqJ,EAAA,GACA31E,EAAA,GACAi3K,EAAA,GACAC,EAAA,IACAC,EAAA,GACA1zM,EAAA,GACAovB,EAAA,GACA1yB,EAAA,GACA/xB,EAAA,GACA67D,EAAA,EACA9qE,EAAA,IACAi4O,EAAA,IACAC,EAAA,EACA7vO,EAAA,IACA8vO,EAAA,IACAC,EAAA,KACAC,EAAA,IACAC,EAAA,IACAC,EAAA,IACAC,EAAA,IACA7kL,EAAA,IACAuZ,EAAA,KACAY,EAAA,OACAqN,EAAA,MACApN,EAAA,MACA0qK,EAAA,QACArtP,EAAA,KACAm3M,EAAA,WACAm2C,EAAA,YACAC,EAAA,YACAC,EAAA,WACAC,EAAA,GACAz+I,MACG66H,IACD4iB,EA2DG,OAAEF,WAzDUjE,GAAY,CAC7Bx5P,IACAojH,KACA5a,KACAjxE,KACAo5F,KACAxxD,KACA57B,KACApH,KACA8qB,KACA34B,IACA2zF,KACAva,KACA7vE,KACA24F,KACAvxD,KACAh8B,KACAtG,KACAkqB,KACAwsC,KACA2iB,KACA5jG,IACAkqJ,UACA31E,KACAi3K,KACAC,KACAC,MACA1zM,KACAovB,KACA1yB,KACA/xB,KACA67D,KACA9qE,IACAi4O,MACAC,MACA7vO,IACA8vO,MACAC,MACAC,OACAC,MACAC,MACAC,MACA7kL,MACAuZ,MACAY,OACAqN,SACApN,QACA0qK,QACArtP,UACAm3M,OACAm2C,aACAC,cACAC,cACAC,aACAz+I,QAGmB66H,QACvB,CClHO,MAAM6jB,GAAoE,CAC/E5+P,EAAG,CAAEmM,KAAM,UAAW8jD,SAAU,UAChC14B,GAAI,CAAEprB,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AI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,MAAO,CAAEl/B,KAAM,2BACh+iWhQ,EAAM4wB,IAAIye,gBAAgB3kB,GAC1BiH,EAAS,IAAIi3F,OAAO5oH,GAC1B,OAAI4wB,IAAAue,gBAAgBnvC,GACb2xB,CACT,GCAd,SAASm6G,GACP71H,EACAyU,GAEA,GAAIzU,aAAkBmkG,kBAAmB,CACvC,IAAQjxE,OAAQnpC,EAAckpC,MAAOvX,GAAgB1b,EAAOykI,wBAE5D,GAAqB,IAAjB16I,GAAsC,IAAhB2xB,EACxB,MAAO,CAAEuX,MAAOvX,EAAcjH,EAAkBye,OAAQnpC,EAAe0qB,EAE3E,CAEA,MAAO,CAAEwe,MAAOjzB,EAAOizB,MAAOC,OAAQlzB,EAAOkzB,OAC/C,CAEA,SAAS03R,KACP,OAAO13T,KAAK+kB,MAAMppB,SAAS,IAAMkpB,KAAKgF,SAASluB,SAAS,IAAI06C,OAAO,EAAG,EACxE,CA6BO,IAAMzoB,GAAN,MAAMA,EAsDJrb,WAAAA,CAAYgP,GAhHrB,IAAAiH,EAAAgB,EAAAP,EA6DEnQ,GAAA,KAAiB,gBAAgB,IAAI2pH,IAErC3pH,GAAA,KAAiB,OAEjBA,GAAA,KAAiB,WAEjBA,GAAA,KAAiB,WAEjBA,GAAA,KAAQ,0BAAkD,CACxD0tR,QAAS,GACTksB,UAAU,EACVljE,gBAAiB,GACjBukE,aAAc,EACdz8P,SAAU,EACV2yF,MAAM,EACN7uI,KAAM,UACNynD,QAAS,CAAC,EAAG,GACbkyP,gBAAiB,EACjBzrH,MAAO,EACPwrH,YAAa,EACbn/P,UAAU,EACVq+P,WAAW,EACXW,UAAU,EACVC,WAAW,EACXL,UAAU,EACV3B,uBAAuB,EACvBR,aAAc,CACZ9xR,iBAAkBlR,MAEpBglS,kBAAmB,GACnBC,cAAe,GACf75P,YAAQ,EACR12D,YAAQ,EACR4wT,SAAS,EACT3gF,SAAU,OAKZj7N,GAAA,KAAQ,YAAoB,GAE5BA,GAAA,KAAiB,oBAEjBA,GAAA,KAAiB,sBAEjBA,GAAA,KAAiB,sBAEjBA,GAAA,KAAiB,uBAEjBA,GAAA,KAAiB,sBAGf7e,KAAK66M,QAAUvzL,EAAOspI,OAEtB5wJ,KAAKyxM,IAAA,aAAA50M,OAAmB4gU,MACxB,IAAM7gU,EAAW0qB,EAAOo2S,UAAY,gBAGpC19T,KAAK29T,QAAUhqS,EAAgBiqS,eAAeC,UAAUjhU,GAExD+2B,EAAgBiqS,eAAeE,wBAAwB99T,KAAKyxM,IAAK70M,GAE7D+2B,EAAgBoqS,UAClB/9T,KAAKg+T,aAAa,aAAc,CAAE3jT,IAAKsZ,EAAgBoqS,WAGzD/9T,KAAKi+T,QAAQrrS,GAAAjxB,GAAA,GACR2lB,GADQ,CAEX6wS,aAAcvlS,GAAAjxB,GAAA,GACT2lB,EAAO6wS,cADE,CAEZ9xR,kBAAkB,OAAA9X,EAAAjH,EAAO6wS,mBAAP,EAAA5pS,EAAqB8X,mBAAoBlR,KAE3DijS,kBAAmB,OAAAppS,EAAA,OAAAO,EAAAjI,EAAO6wS,mBAAP,EAAA5oS,EAAqB6oS,oBAArBppS,OAKvBhvB,KAAK29T,QAAQ7wT,iBAAiB,UAAW9M,KAAKk+T,mBAAmBz7T,KAAKzC,OAEtEA,KAAKg5T,iBAAmBh5T,KAAKi5T,aAAax2T,KAAKzC,MAE/CA,KAAKk5T,mBAAqBl5T,KAAKm5T,eAAe12T,KAAKzC,MAEnDA,KAAKo5T,mBAAqBp5T,KAAKq5T,eAAe52T,KAAKzC,MAEnDA,KAAKs5T,oBAAsBt5T,KAAKu5T,gBAAgB92T,KAAKzC,MAErDA,KAAKw5T,mBAAqBx5T,KAAKy5T,gBAAgBh3T,KAAKzC,KACtD,CAEck+T,kBAAAA,CAAmB52S,GAAoC,OAAA8H,GAAA,KACnE,sBAAMxyB,EAaF0qB,EAAM/f,KAEL3K,EAAYyH,KACY,WAAvBzH,EAAYuI,QAAuBvI,EAAYI,OAAOmhU,aAAen+T,KAAKyxM,YACtEzxM,KAAKo+T,gCACXp+T,KAAKg4T,cAAc9hG,SAASt5N,EAAYI,OAAOuI,OAE3CutB,IAAc9yB,KAAK66M,mBAAmB7jG,oBACpCh3G,KAAKq+T,wBAAwBlG,aAAaC,mBAC5C5gS,GAAkB82O,QAAQtuQ,KAAK66M,QAAS76M,MAGtCA,KAAKq+T,wBAAwBlG,aAAa+B,YAC5CjmS,GAAqBq6O,QAAQtuQ,KAAK66M,QAAS76M,QAKtB,eAAvBpD,EAAYuI,QAA2BvI,EAAYI,OAAOmhU,aAAen+T,KAAKyxM,YAC1EzxM,KAAKo+T,gCACXp+T,KAAKg4T,cAAc9hG,SAASt5N,EAAYI,OAAOuI,QAGtB,cAAvB3I,EAAYuI,QAA0BvI,EAAYI,OAAOmhU,aAAen+T,KAAKyxM,KAC/EzxM,KAAKg4T,cAAc9hG,SAASt5N,EAAYI,OAAOuI,OAGtB,eAAvB3I,EAAYuI,QAA2BvI,EAAYI,OAAOmhU,aAAen+T,KAAKyxM,YAC1EzxM,KAAKo+T,gCACXp+T,KAAKq+T,wBAAwB/D,UAAW,EACxCt6T,KAAKg4T,cAAc9hG,SAASt5N,EAAYI,OAAOuI,QAGtB,YAAvB3I,EAAYuI,QAAwBvI,EAAYI,OAAOmhU,aAAen+T,KAAKyxM,MAC7EzxM,KAAKq+T,wBAAwBvE,aAAgBl9T,EAAYI,OAAOuI,MAAqBu0T,aACrF95T,KAAKg4T,cAAc9hG,SAASt5N,EAAYI,OAAOuI,QAGtB,aAAvB3I,EAAYuI,QAAyBvI,EAAYI,OAAOmhU,aAAen+T,KAAKyxM,KAC9EzxM,KAAKg4T,cAAc9hG,SAASt5N,EAAYI,OAAOuI,OAGtB,aAAvB3I,EAAYuI,QAAyBvI,EAAYI,OAAOmhU,aAAen+T,KAAKyxM,YACxEzxM,KAAKo+T,gCACXp+T,KAAKg4T,cAAc9hG,SAASt5N,EAAYI,OAAOuI,QAGtB,YAAvB3I,EAAYuI,QAAwBvI,EAAYI,OAAOmhU,aAAen+T,KAAKyxM,YACvEzxM,KAAKo+T,gCACXp+T,KAAKg4T,cAAc9hG,SAASt5N,EAAYI,OAAOuI,QAGtB,WAAvB3I,EAAYuI,QAAuBvI,EAAYI,OAAOmhU,aAAen+T,KAAKyxM,YACtEzxM,KAAKo+T,gCACXp+T,KAAKg4T,cAAc9hG,SAASt5N,EAAYI,OAAOuI,QAGtB,WAAvB3I,EAAYuI,QAAuBvI,EAAYI,OAAOmhU,aAAen+T,KAAKyxM,YACtEzxM,KAAKo+T,gCACXp+T,KAAKg4T,cAAc9hG,SAASt5N,EAAYI,OAAOuI,QAGtB,gBAAvB3I,EAAYuI,QAA4BvI,EAAYI,OAAOmhU,aAAen+T,KAAKyxM,YAC3EzxM,KAAKo+T,gCACXp+T,KAAKg4T,cAAc9hG,SAASt5N,EAAYI,OAAOuI,QAGtB,YAAvB3I,EAAYuI,QAAwBvI,EAAYI,OAAOmhU,aAAen+T,KAAKyxM,YACvEzxM,KAAKo+T,gCACXp+T,KAAKg4T,cAAc9hG,SAASt5N,EAAYI,OAAOuI,QAGrD,GAEc,CAAA04T,OAAAA,CAAQ32S,GAA+B,OAAA8H,GAAA,uBA/OvD,IAAAG,EAgPI,IAAI3yB,EAGFA,EADEoD,KAAK66M,mBAAmB7jG,kBACdh3G,KAAK66M,QAAQyjH,6BAEbt+T,KAAK66M,QAGnB,IAAQsjH,WAAA5vS,SAAqBvuB,KAAKg+T,aAChC,SACAr8T,GAAA,CACEw8T,WAAYn+T,KAAKyxM,IACjBniM,OAAQsjB,GAAAjxB,GAAA,GACH2lB,GADG,CAGNspI,OAAQh0J,KAEP8rI,GAAc1oI,KAAK66M,SAAS,OAAAtrL,EAAAjI,EAAO6wS,mBAAP,EAAA5oS,EAAqB8W,mBAAoBlR,OAE1E,CAACv4B,IAGH,GAAI2xB,IAAevuB,KAAKyxM,IACtB,MAAM,IAAItzM,MAAM,wBAGlB6B,KAAKu+T,UAAW,QAEVv+T,KAAKo+T,+BACb,IAEA,YAAW1iQ,GACT,OAAO17D,KAAKq+T,wBAAwB3iQ,QACtC,CAEA,aAAWq+P,GACT,OAAO/5T,KAAKq+T,wBAAwBtE,SACtC,CAEA,YAAWW,GACT,OAAO16T,KAAKq+T,wBAAwB3D,QACtC,CAEA,aAAWC,GACT,OAAO36T,KAAKq+T,wBAAwB1D,SACtC,CAEA,gBAAWb,GACT,OAAO95T,KAAKq+T,wBAAwBvE,YACtC,CAEA,YAAWQ,GACT,OAAOt6T,KAAKq+T,wBAAwB/D,QACtC,CAEA,mBAAWQ,GACT,OAAO96T,KAAKq+T,wBAAwBvD,eACtC,CAEA,eAAWD,GACT,OAAO76T,KAAKq+T,wBAAwBxD,WACtC,CAEA,WAAWjyP,GACT,OAAO5oE,KAAKq+T,wBAAwBz1P,OACtC,CAEA,SAAWymI,GACT,OAAOrvM,KAAKq+T,wBAAwBhvH,KACtC,CAEA,YAAWhyI,GACT,OAAOr9D,KAAKq+T,wBAAwBhhQ,QACtC,CAEA,WAAWo9P,GACT,OAAOz6T,KAAKq+T,wBAAwB5D,OACtC,CAEA,QAAWt5S,GACT,OAAOnhB,KAAKq+T,wBAAwBl9S,IACtC,CAEA,UAAWyvI,GACT,OAAO5wJ,KAAK66M,OACd,CAEA,YAAW49G,GACT,OAAOz4T,KAAKq+T,wBAAwB5F,QACtC,CAEA,mBAAWljE,GACT,OAAOv1P,KAAKq+T,wBAAwB9oE,eACtC,CAEA,QAAWvlG,GACT,OAAOhwJ,KAAKq+T,wBAAwBruK,IACtC,CAEA,yBAAW2oK,GACT,OAAO34T,KAAKq+T,wBAAwB1F,qBACtC,CAEA,gBAAWR,GACT,OAAOn4T,KAAKq+T,wBAAwBlG,YACtC,CAEA,YAAWr+E,GACT,OAAO95O,KAAKq+T,wBAAwBvkF,QACtC,CAEA,qBAAWqgF,GACT,OAAOn6T,KAAKq+T,wBAAwBlE,iBACtC,CAEA,UAAWtwT,GACT,OAAO7J,KAAKq+T,wBAAwBx0T,MACtC,CAEA,iBAAWuwT,GACT,OAAOp6T,KAAKq+T,wBAAwBjE,aACtC,CAEA,UAAW75P,GACT,OAAOvgE,KAAKq+T,wBAAwB99P,MACtC,CAEa0vF,IAAAA,GAAsB,OAAA7gI,GAAA,uBAC5BpvB,KAAKu+T,iBAEJv+T,KAAKg+T,aAAa,OAAQ,CAAEG,WAAYn+T,KAAKyxM,YAC7CzxM,KAAKo+T,gCAQTtrS,IACA9yB,KAAK66M,mBAAmB7jG,mBACxBh3G,KAAKq+T,wBAAwBlG,aAAaC,oBACzC3B,GAAoBz2T,KAAK66M,iBAEpB76M,KAAKqpC,UAEf,IAEa6mH,KAAAA,GAAuB,OAAA9gI,GAAA,uBAC7BpvB,KAAKu+T,iBAEJv+T,KAAKg+T,aAAa,QAAS,CAAEG,WAAYn+T,KAAKyxM,YAC9CzxM,KAAKo+T,gCACb,GAEa,CAAAlyH,IAAAA,GAAsB,OAAA98K,GAAA,KAC5B,kBAAApvB,KAAKu+T,iBAEJv+T,KAAKg+T,aAAa,OAAQ,CAAEG,WAAYn+T,KAAKyxM,YAC7CzxM,KAAKo+T,gCACb,GAEa,CAAAhD,QAAAA,CAAS9zS,GAA8B,OAAA8H,GAAA,uBAC7CpvB,KAAKu+T,iBAEJv+T,KAAKg+T,aAAa,WAAY,CAAEG,WAAYn+T,KAAKyxM,IAAKpC,MAAA/nL,UACtDtnB,KAAKo+T,gCACb,GAEa,CAAA3C,OAAAA,CAAQn0S,GAA2B,OAAA8H,GAAA,uBACzCpvB,KAAKu+T,iBAEJv+T,KAAKg+T,aAAa,UAAW,CAAEG,WAAYn+T,KAAKyxM,IAAKtwL,KAAAmG,UACrDtnB,KAAKo+T,gCACb,IAEalD,QAAAA,CAAS5zS,GAA8B,OAAA8H,GAAA,uBAC7CpvB,KAAKu+T,iBAEJv+T,KAAKg+T,aAAa,WAAY,CAAEt4R,MAAApe,EAAO62S,WAAYn+T,KAAKyxM,YACxDzxM,KAAKo+T,gCACb,IAEa5C,UAAAA,CAAWl0S,EAAe1qB,GAA4B,OAAAwyB,GAAA,KAC5D,kBAAApvB,KAAKu+T,iBAEJv+T,KAAKg+T,aAAa,aAAc,CAAEG,WAAYn+T,KAAKyxM,IAAK7oI,QAAS,CAACthD,EAAO1qB,WACzEoD,KAAKo+T,gCACb,IAEa1C,eAAAA,CAAgBp0S,GAA2C,OAAA8H,GAAA,uBACtE,IAAKpvB,KAAKu+T,SAAU,OAEpB,IAA+DvvS,EAAA1H,GAAvD+e,iBAAAzpC,EAAkBw7T,kBAAA7pS,GAAqCS,EAAfO,EAAAosS,GAAe3sS,EAAf,CAAxC,mBAAkB,4BAEpBhvB,KAAKg+T,aAAa,kBAAmB,CACzCG,WAAYn+T,KAAKyxM,IACjB0mH,aAAcvlS,GAAAjxB,GAAAA,GAAA,GACT3B,KAAKq+T,wBAAwBlG,cAC7B5oS,GAFS,CAIZ8W,iBAAkBzpC,GAAoBu4B,KACtCijS,kBAAmB,MAAA7pS,GAAAA,YAIjBvuB,KAAKo+T,gCAEPtrS,IAAc9yB,KAAK66M,mBAAmB7jG,oBACpCh3G,KAAKq+T,wBAAwBlG,aAAa+B,WAC5CjmS,GAAqBq6O,QAAQtuQ,KAAK66M,QAAS76M,MAE3Ci0B,GAAqByqQ,UAAU1+R,KAAK66M,SAGlC76M,KAAKq+T,wBAAwBlG,aAAaC,kBAC5C5gS,GAAkB82O,QAAQtuQ,KAAK66M,QAAS76M,OAExCw3B,GAAkBknQ,UAAU1+R,KAAK66M,SAG7B76M,KAAKq+T,wBAAwB/D,iBACzBt6T,KAAKo2T,aAInB,IAEakF,wBAAAA,CAAyBh0S,GAA+C,OAAA8H,GAAA,uBAC9EpvB,KAAKu+T,iBAEJv+T,KAAKg+T,aAAa,2BAA4B,CAAEG,WAAYn+T,KAAKyxM,IAAKknH,sBAAArxS,UACtEtnB,KAAKo+T,gCACb,GAEa,CAAAvC,QAAAA,CAASv0S,GAAmC,OAAA8H,GAAA,uBACvD,IAAKpvB,KAAKu+T,SAAU,OAAO,EAE3B,IAAM3hU,EAASoD,KAAKg+T,aAAa,WAAY,CAAEG,WAAYn+T,KAAKyxM,IAAK+mH,QAAAlxS,IAErE,aAAMtnB,KAAKo+T,gCAEJxhU,CACT,IAEa6xB,IAAAA,CAAKnH,GAA+C,OAAA8H,GAAA,uBAC1DpvB,KAAKu+T,iBAEJv+T,KAAKg+T,aAAa,OAAQ,CAAE1uT,OAAAgY,EAAQ62S,WAAYn+T,KAAKyxM,YACrDzxM,KAAKo+T,gCACb,GAEa,CAAA/C,OAAAA,CAAQ/zS,GAA8B,OAAA8H,GAAA,uBAC5CpvB,KAAKu+T,iBAEJv+T,KAAKg+T,aAAa,UAAW,CAAEG,WAAYn+T,KAAKyxM,IAAKzhD,KAAA1oI,UACrDtnB,KAAKo+T,gCACb,IAEaj8P,MAAAA,GAAwB,OAAA/yC,GAAA,KACnC,sBAAKpvB,KAAKu+T,SAAU,OAEpB,IAAQx4R,OAAAze,EAAQwe,MAAAlpC,GAAU8rI,GACxB1oI,KAAK66M,QACL76M,KAAKq+T,wBAAwBlG,aAAa9xR,kBAAoBlR,YAG1Dn1B,KAAKg+T,aAAa,SAAU,CAAEj4R,OAAAze,EAAQ62S,WAAYn+T,KAAKyxM,IAAK3rK,MAAAlpC,UAC5DoD,KAAKo+T,+BACb,GAEa,CAAAv5P,OAAAA,GAAyB,OAAAz1C,GAAA,KAC/B,kBAAApvB,KAAKu+T,WAEVv+T,KAAKu+T,UAAW,QAEVv+T,KAAKg+T,aAAa,UAAW,CAAEG,WAAYn+T,KAAKyxM,MAEtDzxM,KAAKu7T,gCAEL5nS,EAAgBiqS,eAAeY,4BAA4Bx+T,KAAKyxM,KAChEzxM,KAAKg4T,cAAcjC,0BAEfjjS,IAAc9yB,KAAK66M,mBAAmB7jG,oBACxCx/E,GAAkBknQ,UAAU1+R,KAAK66M,SACjC5mL,GAAqByqQ,UAAU1+R,KAAK66M,UAExC,GAEa,CAAAxxK,MAAAA,GAAwB,OAAAja,GAAA,KAC9B,kBAAApvB,KAAKu+T,iBAEJv+T,KAAKg+T,aAAa,SAAU,CAAEG,WAAYn+T,KAAKyxM,YAC/CzxM,KAAKo+T,gCACb,IAEahI,QAAAA,GAA0B,OAAAhnS,GAAA,uBAChCpvB,KAAKu+T,iBAEJv+T,KAAKg+T,aAAa,WAAY,CAAEG,WAAYn+T,KAAKyxM,YACjDzxM,KAAKo+T,gCACb,IAEarF,kBAAAA,CAAmBzxS,GAAwC,OAAA8H,GAAA,KACjE,kBAAApvB,KAAKu+T,iBAEJv+T,KAAKg+T,aAAa,qBAAsB,CAAEG,WAAYn+T,KAAKyxM,IAAK8jD,gBAAAjuO,UAChEtnB,KAAKo+T,gCACb,IAEaxC,aAAAA,CAAct0S,GAAoC,OAAA8H,GAAA,KACxD,kBAAApvB,KAAKu+T,iBAEJv+T,KAAKg+T,aAAa,gBAAiB,CAAES,YAAAn3S,EAAa62S,WAAYn+T,KAAKyxM,YACnEzxM,KAAKo+T,gCACb,GAEa,CAAAnC,SAAAA,CAAU30S,GAA+B,OAAA8H,GAAA,KAC/C,kBAAApvB,KAAKu+T,iBAEJv+T,KAAKg+T,aAAa,YAAa,CAAEG,WAAYn+T,KAAKyxM,IAAKlxI,OAAAj5C,UACvDtnB,KAAKo+T,gCACb,IAEcA,6BAAAA,GAA+C,OAAAhvS,GAAA,uBAC3D,IAAKpvB,KAAKu+T,SAAU,OAEpB,IAAMj3S,QAAetnB,KAAKg+T,aAAa,4BAA6B,CAAEG,WAAYn+T,KAAKyxM,MAEvFzxM,KAAKq+T,wBAA0B/2S,EAAOR,KACxC,GAEO,CAAAylR,OAAAA,GACL,OAAOvsS,KAAKq+T,wBAAwB9xB,OACtC,CAEa3pB,SAAAA,CAAUt7P,GAA+B,OAAA8H,GAAA,uBAC/CpvB,KAAKu+T,iBAEJv+T,KAAKg+T,aAAa,YAAa,CAAEG,WAAYn+T,KAAKyxM,IAAK5nM,OAAAyd,UACvDtnB,KAAKo+T,gCACb,IAEarC,YAAAA,CAAaz0S,GAAqC,OAAA8H,GAAA,uBAC7D,IAAKpvB,KAAKu+T,SAAU,OAAO,EAE3B,IAAM3hU,QAAeoD,KAAKg+T,aAAa,eAAgB,CAAEG,WAAYn+T,KAAKyxM,IAAKitH,UAAAp3S,IAE/E,aAAMtnB,KAAKo+T,gCAEJxhU,CACT,IAEas/T,WAAAA,CAAY50S,EAAW1qB,EAAW2xB,EAAegB,GAAkC,OAAAH,GAAA,KAC9F,0BAAKpvB,KAAKu+T,UAEHv+T,KAAKg+T,aAAa,cAAe,CAAEr8T,EAAA2lB,EAAGqI,EAAA/yB,EAAGkpC,MAAAvX,EAAOwX,OAAAxW,EAAQ4uS,WAAYn+T,KAAKyxM,KAClF,IAEcusH,YAAAA,CACZ12S,EACA1qB,EACA2xB,GAC6B,OAAAa,GAAA,uBAC7B,IAAMG,EAA4B,CAChClrB,GAAA,qBAAAxH,OAAyB4gU,MACzBt4T,OAAAmiB,EACA/L,OAAA3e,GAGF,OAAAoD,KAAK29T,QAAQv6M,YAAY7zF,EAAYhB,GAAY,IAE1C,IAAIjmB,SAAS,CAAA0mB,EAASjL,KAC3B,IAAMmN,EAAac,IACjB,IAAMN,EAA8BM,EAAMzqB,KAGtCmqB,EAAYrtB,KAAOkrB,EAAWlrB,KAChCrE,KAAK29T,QAAQj2S,oBAAoB,UAAWwJ,GAExCQ,EAAYhjB,MACdqV,EAAO,IAAI5lB,MAAM,4BAAAtB,OAA4ByqB,EAAM,MAAAzqB,OAAK60B,EAAYhjB,SAEpEsgB,EAAQ0C,EAAY10B,QAG1B,EAEAgD,KAAK29T,QAAQ7wT,iBAAiB,UAAWokB,EAAU,GAEvD,IAEOpkB,gBAAAA,CAAsCwa,EAAS1qB,GACpDoD,KAAKg4T,cAAclrT,iBAAiBwa,EAAM1qB,EAC5C,CAEO8qB,mBAAAA,CAAyCJ,EAAS1qB,GACvDoD,KAAKg4T,cAActwS,oBAAoBJ,EAAM1qB,EAC/C,CAEA,iBAAci5T,CAAWvuS,GACvBqM,EAAgBoqS,SAAWz2S,CAC7B,CAEa60S,gBAAAA,CAAiB70S,GAA0C,OAAA8H,GAAA,uBACtE,IAAKpvB,KAAKu+T,SAAU,OAAO,EAE3B,IAAM3hU,QAAeoD,KAAKg+T,aAAa,mBAAoB,CAAEG,WAAYn+T,KAAKyxM,IAAKktH,eAAAr3S,IAEnF,aAAMtnB,KAAKo+T,gCAEJxhU,CACT,IAEamgU,oBAAAA,CAAqBz1S,GAA4C,OAAA8H,GAAA,uBAC5E,IAAKpvB,KAAKu+T,SAAU,OAAO,EAE3B,IAAM3hU,QAAeoD,KAAKg+T,aAAa,uBAAwB,CAAEG,WAAYn+T,KAAKyxM,IAAKmtH,iBAAAt3S,IAEvF,aAAMtnB,KAAKo+T,gCAEJxhU,CACT,GAEa,CAAAw/T,iBAAAA,GAAsC,OAAAhtS,GAAA,uBACjD,IAAKpvB,KAAKu+T,SAAU,OAAO,EAE3Bv+T,KAAKq8T,8BAEL,IAAM/0S,QAAetnB,KAAKg+T,aAAa,oBAAqB,CAAEG,WAAYn+T,KAAKyxM,MAE/E,aAAMzxM,KAAKo+T,gCAEJ92S,CACT,IAEag1S,gBAAAA,GAAqC,OAAAltS,GAAA,uBAChD,QAAKpvB,KAAKu+T,WAEVv+T,KAAKu7T,gCAEEv7T,KAAKg+T,aAAa,mBAAoB,CAAEG,WAAYn+T,KAAKyxM,MAClE,GAEa,CAAAorH,wBAAAA,GAA8C,OAAAztS,GAAA,KACzD,yBAAKpvB,KAAKu+T,SAEHv+T,KAAKg+T,aAAa,2BAA4B,CAAEG,WAAYn+T,KAAKyxM,MAF7C,EAG7B,IAEQ8qH,mBAAAA,CAAoBj1S,GAC1B,IAAM1qB,EAAQoD,KAAK66M,QAA8BvjE,wBAC3C/oH,EAASvuB,KAAK66M,QAAQ/0K,MAAQlpC,EAAKkpC,MACnCvW,EAASvvB,KAAK66M,QAAQ90K,OAASnpC,EAAKmpC,OAEpC/W,EAAmBhvB,KAAKq+T,wBAAwBlG,aAAa9xR,kBAAoBp+B,OAAOo+B,kBAAoB,EAIlH,MAAO,CACL1kC,GAJU2lB,EAAMswH,QAAUh7I,EAAKy3F,MAAQ9lE,EAAUS,EAKjDW,GAJUrI,EAAMuwH,QAAUj7I,EAAK62F,KAAOlkE,EAAUP,EAMpD,CAEQiqS,YAAAA,CAAa3xS,GACnB,IAAQ3lB,EAAA/E,EAAG+yB,EAAApB,GAAMvuB,KAAKu8T,oBAAoBj1S,GAE1CtnB,KAAKg+T,aAAa,qBAAsB,CAAEG,WAAYn+T,KAAKyxM,IAAK9vM,EAAA/E,EAAG+yB,EAAApB,GACrE,CAEQ4qS,cAAAA,CAAe7xS,GACrB,IAAQ3lB,EAAA/E,EAAG+yB,EAAApB,GAAMvuB,KAAKu8T,oBAAoBj1S,GAE1CtnB,KAAKg+T,aAAa,uBAAwB,CAAEG,WAAYn+T,KAAKyxM,IAAK9vM,EAAA/E,EAAG+yB,EAAApB,GACvE,CAEQ8qS,cAAAA,CAAe/xS,GACrB,IAAQ3lB,EAAA/E,EAAG+yB,EAAApB,GAAMvuB,KAAKu8T,oBAAoBj1S,GAE1CtnB,KAAKg+T,aAAa,uBAAwB,CAAEG,WAAYn+T,KAAKyxM,IAAK9vM,EAAA/E,EAAG+yB,EAAApB,GACvE,CAEQgrS,eAAAA,CAAgBjyS,GACtB,IAAQ3lB,EAAA/E,EAAG+yB,EAAApB,GAAMvuB,KAAKu8T,oBAAoBj1S,GAE1CtnB,KAAKg+T,aAAa,wBAAyB,CAAEG,WAAYn+T,KAAKyxM,IAAK9vM,EAAA/E,EAAG+yB,EAAApB,GACxE,CAEQkrS,eAAAA,CAAgBnyS,GACtB,IAAQ3lB,EAAA/E,EAAG+yB,EAAApB,GAAMvuB,KAAKu8T,oBAAoBj1S,GAE1CtnB,KAAKg+T,aAAa,uBAAwB,CAAEG,WAAYn+T,KAAKyxM,IAAK9vM,EAAA/E,EAAG+yB,EAAApB,GACvE,CAEc8tS,2BAAAA,GAA6C,OAAAjtS,GAAA,uBACzD,GAAI0D,IAAc9yB,KAAK66M,mBAAmB7jG,mBAAqBh3G,KAAK07D,SAAU,CAC5E,IAAMp0C,QAAkBtnB,KAAKg+T,aAAa,2BAA4B,CAAEG,WAAYn+T,KAAKyxM,MAErFnqL,EAAUqH,SAAS,cACrB3uB,KAAK66M,QAAQ/tM,iBAAiB,YAAa9M,KAAKg5T,kBAG9C1xS,EAAUqH,SAAS,gBACrB3uB,KAAK66M,QAAQ/tM,iBAAiB,cAAe9M,KAAKk5T,oBAGhD5xS,EAAUqH,SAAS,gBACrB3uB,KAAK66M,QAAQ/tM,iBAAiB,cAAe9M,KAAKo5T,oBAGhD9xS,EAAUqH,SAAS,iBACrB3uB,KAAK66M,QAAQ/tM,iBAAiB,eAAgB9M,KAAKs5T,qBAGjDhyS,EAAUqH,SAAS,gBACrB3uB,KAAK66M,QAAQ/tM,iBAAiB,eAAgB9M,KAAKw5T,mBAEvD,CACF,IAEQ+B,6BAAAA,GACFzoS,IAAc9yB,KAAK66M,mBAAmB7jG,oBACxCh3G,KAAK66M,QAAQnzL,oBAAoB,YAAa1nB,KAAKg5T,kBACnDh5T,KAAK66M,QAAQnzL,oBAAoB,cAAe1nB,KAAKk5T,oBACrDl5T,KAAK66M,QAAQnzL,oBAAoB,cAAe1nB,KAAKo5T,oBACrDp5T,KAAK66M,QAAQnzL,oBAAoB,eAAgB1nB,KAAKs5T,qBACtDt5T,KAAK66M,QAAQnzL,oBAAoB,eAAgB1nB,KAAKw5T,oBAE1D,GAtsBA36S,GADW8U,GACa,iBAAiB,ICvDpC,MAAArb,WAAAA,GACLuG,GAAA,KAAiB,WAAW,IAAIgwB,KAEhChwB,GAAA,KAAiB,sBAAsB,IAAIgwB,IAEpC,CAAAgvR,SAAAA,CAAUv2S,GACf,OAAKtnB,KAAK6+T,SAAS9/S,IAAIuI,IACrBtnB,KAAK6+T,SAAS/2S,IAAIR,EAAU,IAAIk2S,IAG3Bx9T,KAAK6+T,SAASh3S,IAAIP,EAC3B,CAEOw2S,uBAAAA,CAAwBx2S,EAAqB1qB,GAClDoD,KAAK8+T,oBAAoBh3S,IAAIR,EAAa1qB,EAC5C,CAEO4hU,2BAAAA,CAA4Bl3S,GACjCtnB,KAAK8+T,oBAAoB/zR,OAAOzjB,EAClC,CAEOy3S,WAAAA,CAAYz3S,EAAkB1qB,EAA4C2xB,GAC/EvuB,KAAK69T,UAAUv2S,GAAU87F,YAAYxmH,EAAS2xB,GAAY,GAC5D,CAEOywS,eAAAA,CAAgB13S,GACrB,IAAM1qB,EAASoD,KAAK6+T,SAASh3S,IAAIP,GAE7B1qB,IACFA,EAAOkpH,YACP9lH,KAAK6+T,SAAS9zR,OAAOzjB,GAEzB,ID8DAzI,GAxCW8U,GAwCI,WAAmB,IAxC7B,IEVMlzB,GAAqBojC,IAwBf,IAvBjB46R,YAAAjwS,EACAiqS,SAAAzmS,EACAujO,gBAAA3iO,EACAnmB,UAAA+qB,EACAynS,gBAAAttS,EACApqB,KAAAsL,EACAqsT,qBAAAn7S,EACAw8C,OAAAj5C,EACA0oI,KAAAzgI,EACApO,KAAAiO,EACA+vS,YAAA54S,EACA4xS,aAAAlmS,EACA22C,QAAAr6C,EACA8gL,MAAA1/K,EACA+Y,IAAA3lB,EACArR,MAAAkd,EACA8vS,UAAA7sS,EACA2mS,QAAAv4S,EACA04S,sBAAAh0S,EACA+4S,SAAAzoS,KACGj5B,GACL6nC,GAGShX,EAAW8F,IAAgBskM,EAAAA,EAAAA,UAAmB,MAC/CjoM,GAAYgoM,EAAAA,EAAAA,QAAiC,MAC7CpqM,GAAeoqM,EAAAA,EAAAA,QAAiB,MAChC7kM,GAA0B6kM,EAAAA,EAAAA,QAA0CjzM,GAEpEpiB,EAEF,CACF0tM,MAAA1/K,EACAxO,KAAAiO,EACA4gI,KAAAzgI,EACAopS,sBAAAh0S,EACAikD,QAAAr6C,EACAgnO,gBAAA3iO,EACA6lS,SAAAzmS,EACAwmS,QAAAv4S,EACAy9S,SAAAzoS,EACAyT,IAAA3lB,EACAxb,KAAAsL,EACA0tD,OAAAj5C,EACA6wS,aAAAlmS,GAGIpP,GAAYm0M,EAAAA,EAAAA,QAA4Fr1N,GAE9GwwB,EAAwB27C,QAAU/pD,EAClC6I,EAAakhD,QAAUjhD,EACvBhK,EAAUirD,QAAUnsE,GAEpB+0N,EAAAA,EAAAA,YAAU,KACuC,mBAApCvkM,EAAwB27C,SAA0BjhD,GAC3DsF,EAAwB27C,QAAQjhD,EAAU,GAE3C,CAACA,IAEJ,IAAM0I,GAAeihM,EAAAA,EAAAA,cAAa55N,IAGhC,GAFAoyB,EAAU8+C,QAAUlxE,EAEhBA,EAAQ,CACV,IAAMi2B,EAAoBlB,EAAgB,IACrC9O,EAAUirD,QACb8iF,OAAAh0J,IAGF+1B,EAAaE,EACf,MACE,OAAAhG,QAAA,IAAAA,GAAAA,EAAWg4C,UACXlyC,EAAa,KAAK,GAEnB,IAEH,OAAA+jM,EAAAA,EAAAA,YAAW,KAAK,IAAA0oG,EAAAC,EACd,IAAMziU,EAAqBi2B,IAA4B,IAAAysS,EAAAC,EAChDh5S,IAEc,eAAfsM,EAAMjmB,MACK,QADI0yT,EACjB1yS,EAAakhD,eAAA,IAAAwxP,GAAbA,EAAsBrvK,OAGL,eAAfp9H,EAAMjmB,OACc,QADL2yT,EACjB3yS,EAAakhD,eAAS,IAAAyxP,GAAtBA,EAAsBrvK,SAE1B,EAEA,OAAmB,QAAnBkvK,EAAApwS,EAAU8+C,eAAS,IAAAsxP,GAAnBA,EAAmBtyT,iBAAiB,aAAclQ,GACxC,QADyDyiU,EACnErwS,EAAU8+C,eAAA,IAAAuxP,GAAVA,EAAmBvyT,iBAAiB,aAAclQ,GAE3C,KAAM,IAAA4iU,EAAAC,EACD,QAAVD,EAAAxwS,EAAU8+C,eAAA,IAAA0xP,GAAVA,EAAmB93S,oBAAoB,aAAc9qB,GAC3C,QAD4D6iU,EACtEzwS,EAAU8+C,eAAA,IAAA2xP,GAAVA,EAAmB/3S,oBAAoB,aAAc9qB,EAAkB,CAE3E,GAAG,CAAC2pB,KAEJmwM,EAAAA,EAAAA,YAAU,IACD,KACD7pM,IACFA,EAAUg4C,UACVlyC,EAAa,MAEjB,GACC,CAAC9F,KAEJ6pM,EAAAA,EAAAA,YAAU,KAAM,IAAAgpG,EACQ,QAAtBA,EAAA9yS,EAAakhD,eAAS,IAAA4xP,GAAtBA,EAAsBtE,SAAkB,OAATzrS,QAAS,IAATA,EAAAA,EAAS,EAAE,GACzC,CAACA,KAEJ+mM,EAAAA,EAAAA,YAAU,KAAM,IAAAipG,EACQ,QAAtBA,EAAA/yS,EAAakhD,eAAS,IAAA6xP,GAAtBA,EAAsBlE,QAAgB,OAARrsS,QAAQ,IAARA,EAAAA,EAAQ,UAAU,GAC/C,CAACA,KAEJsnM,EAAAA,EAAAA,YAAW,KAAK,IAAAkpG,EACD,QAAbA,EAAAhzS,EAAakhD,eAAA,IAAA8xP,GAAbA,EAAsBvE,QAAQ,OAAA9rS,QAAA,IAAAA,GAAAA,EAAa,GAC1C,CAACA,KAEJmnM,EAAAA,EAAAA,YAAU,KAAM,IAAAmpG,EACD,QAAbA,EAAAjzS,EAAakhD,eAAA,IAAA+xP,GAAbA,EAAsBvE,yBAAyB,OAAA32S,QAAA,IAAAA,GAAAA,EAA6B,GAC3E,CAACA,KAEJ+xM,EAAAA,EAAAA,YAAU,KAAM,IAAAopG,EACc,iBAAjB,OAAAvxS,QAAA,IAAAA,OAAA,EAAAA,EAAU,KAAyC,iBAAfA,EAAQ,KACxC,QAAbuxS,EAAAlzS,EAAakhD,eAAA,IAAAgyP,GAAbA,EAAsBtE,WAAWjtS,EAAQ,GAAIA,EAAQ,IAAE,GAKxD,CAACA,KAEJmoM,EAAAA,EAAAA,YAAU,KAAM,IAAAqpG,EACD,QAAbA,EAAAnzS,EAAakhD,eAAA,IAAAiyP,GAAbA,EAAsBhH,mBAAsC,OAAnBnmS,QAAmB,IAAnBA,EAAAA,EAAmB,GAAG,GAC9D,CAACA,KAEJ8jM,EAAAA,EAAAA,YAAU,KAAM,IAAAspG,EACQ,QAAtBA,EAAApzS,EAAakhD,eAAS,IAAAkyP,GAAtBA,EAAsBtE,gBAAgC,OAAhBzpS,QAAgB,IAAhBA,EAAAA,EAAgB,GAAG,GACxD,CAACnxB,KAAKC,UAAUkxB,MAEnBykM,EAAAA,EAAAA,YAAW,KAAK,IAAAupG,EACM,iBAATptT,GAAqC,iBAATA,GAE1B,QAFmCotT,EAEhDrzS,EAAakhD,eAAA,IAAAmyP,GAAbA,EAAsBxxS,KAAK,CACzBlnB,KAAAsL,KACGgQ,EAAUirD,SACd,GACA,CAACj7D,KAEJ6jN,EAAAA,EAAAA,YAAU,KAAM,IAAAwpG,EACK,iBAARn9S,IAEE,QAFMm9S,EAEnBtzS,EAAakhD,eAAA,IAAAoyP,GAAbA,EAAsBzxS,KAAK,CACzBia,IAAA3lB,KACGF,EAAUirD,UACd,GACA,CAAC/qD,KAEJ2zM,EAAAA,EAAAA,YAAW,KAAK,IAAAypG,EAAAC,EACD,QAAbD,EAAAvzS,EAAakhD,eAAA,IAAAqyP,GAAbA,EAAsBv9C,UAAgB,QAANw9C,EAAApkU,EAAM6N,cAAA,IAAAu2T,EAAAA,EAAU,GAAG,GAClD,CAACpkU,EAAM6N,UAEV6sN,EAAAA,EAAAA,YAAU,KAAM,IAAA2pG,EACQ,QAAtBA,EAAAzzS,EAAakhD,eAAS,IAAAuyP,GAAtBA,EAAsBzE,cAAc,OAAAptS,QAAA,IAAAA,EAAAA,EAAe,GAAG,GACrD,CAACA,KAEJkoM,EAAAA,EAAAA,YAAW,KAAK,IAAA4pG,EACS,iBAAZrgT,IACa,QAAtBqgT,EAAA1zS,EAAakhD,eAAS,IAAAwyP,GAAtBA,EAAsBzE,SAAS57S,GAAO,GAKvC,CAACA,KAEJy2M,EAAAA,EAAAA,YAAU,KAAM,IAAA6pG,EACD,QAAbA,EAAA3zS,EAAakhD,eAAA,IAAAyyP,GAAbA,EAAsBxE,aAA0B,OAAblqS,QAAa,IAAbA,EAAAA,EAAa,GAAG,GAClD,CAACA,KAEJ6kM,EAAAA,EAAAA,YAAU,KAAM,IAAA8pG,EAAAC,EAAAC,EACD,QAAbF,EAAA5zS,EAAakhD,eAAA,IAAA0yP,GAAbA,EAAsBvE,UAAU,CAC9BjzD,MAAe,QAAfy3D,EAAe,OAARn5S,QAAQ,IAARA,OAAQ,EAARA,EAAQ0hP,aAAA,IAAAy3D,EAAAA,EAAS,CAAC,GAAK,IAC9B/xC,IAAa,QAAbgyC,EAAa,OAARp5S,QAAQ,IAARA,OAAQ,EAARA,EAAQonQ,WAAA,IAAAgyC,EAAAA,EAAO,WACpB,GACD,CAAS,OAARp5S,QAAQ,IAARA,OAAQ,EAARA,EAAQ0hP,MAAM,GAAI,OAAA1hP,QAAA,IAAAA,OAAA,EAAAA,EAAQ0hP,MAAM,GAAY,OAAR1hP,QAAQ,IAARA,OAAQ,EAARA,EAAQonQ,OAG9C/pD,EAAAA,EAAAA,KAAC,OACCl4N,UAAW+qB,MACLA,GAAa,CACjB9lB,MAAO,CACLo0B,MAAO,OACPC,OAAQ,OACR+jL,WAAY,KACTl7L,IAIPomD,UAAA2vJ,EAAAA,EAAAA,KAAC,UACC/nF,IAAKrnH,EACL7jB,MAAO,CACLo0B,MAAO,OACPC,OAAQ,WAEN/pC,KAIZ,ECrPM+2B,GAAmBvE,GAA8B,IAAImyS,GAAUnyS,GAExD3P,GAAkB2P,IACtBm2M,EAAAA,EAAAA,KAAClkO,GAAA,IAAuB+tB,EAAOywS,gBAAiBlsS,KCTzD,MAoFA,GApFqB6tS,KAEnB,MAAO1uB,EAAQE,IAAan7E,EAAAA,EAAAA,WAAS,IAErCP,EAAAA,EAAAA,YAAU,KACR07E,GAAU,EAAK,GACd,IA2BH,OACEvqC,EAAAA,EAAAA,MAAA,OAAA7yL,SAAA,EACEgzL,EAAAA,EAAAA,KAAC2iD,GAAa,CAAC7nT,MAAO,KAEtB+kQ,EAAAA,EAAAA,MAACm9C,GAAK,CACJ9S,OAAQA,EACRlgC,QAASA,IAAMogC,GAAU,GACzBrqC,MAAM,UACNhkM,KAAK,KACLkhP,aAAc,CACZ9tS,MAAO,2BACP4lJ,QAAS,EACT1rJ,KAAM,GAER4yS,UAAQ,EAAAjvO,SAAA,EAERgzL,EAAAA,EAAAA,KAACzF,GAAI,CAACx+L,KAAK,KAAIiR,SAAC,qOAMhBgzL,EAAAA,EAAAA,KAACzF,GAAI,CAACx+L,KAAK,KAAKryD,MAAO,CAAEmvT,UAAW,IAAK7rP,SAAC,+KAK1CgzL,EAAAA,EAAAA,KAACzF,GAAI,CAACx+L,KAAK,KAAKryD,MAAO,CAAEmvT,UAAW,IAAK7rP,SAAC,8KAK1C6yL,EAAAA,EAAAA,MAACtF,GAAI,CAACx+L,KAAK,KAAKryD,MAAO,CAAEmvT,UAAW,IAAK7rP,SAAA,CAAC,mHAEY,KACpDgzL,EAAAA,EAAAA,KAAA,KAAG5hO,KAAK,sCAAsC90B,OAAO,SAAS2M,IAAI,sBAAqB+2D,SAAC,sBAI1FgzL,EAAAA,EAAAA,KAAA,OACEt2P,MAAO,CAAEC,QAAS,OAAQmvT,eAAgB,WAAYD,UAAW,IAAK7rP,UAEtEgzL,EAAAA,EAAAA,KAAChB,GAAM,CAAChrC,QAnEO+kG,KACrB3uB,GAAU,GAEV2T,GAAcj+E,KAAK,CACjBigC,MAAO,sBACP7qQ,QAAS,gDACTinB,SAAU,gBACV0lS,UAAW,IACXpjN,OAAQ,KACRtvF,MAAO,yBACP7G,MACE03P,EAAAA,EAAAA,KAACg5D,GAAc,CACbt4R,IAAI,6EACJsnH,MAAI,EACJyoK,UAAQ,EACR/mT,MAAO,CACL0oG,UAAW,iBACXt0E,MAAO,OACPC,OAAQ,WAId,EA6CqCwqM,QAAQ,UAASv7J,SAAC,oBAKnD,GCxEIisP,GAAeC,IAAmB31C,GAC9C,kPCsEF,SAAS41C,GAAkB/5N,EAAwBjqG,GACjD,IAAKA,EACI,OAGT,MAAMoK,EAAyC,CAAC,EA0BzC,OAxBHpK,EAAQikU,cAAgBh6N,EAAIi6N,oBAC9B95T,EAAK,4BAA6B,GAGhCpK,EAAQmkU,WAAal6N,EAAIm6N,iBAC3Bh6T,EAAK,yBAA0B,GAG7BpK,EAAQqkU,SAAWp6N,EAAIo6N,UACpBj6T,EAAA,gBAAkB6/F,EAAIo6N,SAGzBrkU,EAAQskU,kBAAoBr6N,EAAIq6N,mBAClCl6T,EAAK,eAAgB,GAGnBpK,EAAQukU,aAAet6N,EAAIs6N,cACxBn6T,EAAA,aAAe6/F,EAAIs6N,aAGtBvkU,EAAQwkU,cAAgBv6N,EAAIu6N,eAC9Bp6T,EAAK,gBAAiB,GAGjBA,CACT,CAEgB,SAAAq6T,GACdxzT,EACAjR,GAEA,MAAMkT,EAAO,QAAAxT,OAAQuR,EAAQiW,OAAO,GAAGwxC,eAAah5D,OAAGuR,EAAQ9Q,MAAM,IAC/D6nO,EAAY7lL,IAAiB,CAACqiN,EAAQ/kH,KAC1C,MAAM43E,EAAQ0lC,GAAS7pP,EAAM,GAAIsxP,IAC3B,WAAEhH,EAAYluP,UAAAA,EAAA,MAAWiF,EAAA,OAAOwqP,KAAWkC,GAAW5pC,EAEtDptH,EAAM85N,KAGV,OAAAv8F,EAAAA,EAAAA,KAACw8B,GAAA,CACCv5B,UAAWx5N,EACXwuI,SACIukL,GAAkB/5N,EAAKjqG,MACvBiqG,EAAIw6J,UAAUxzP,EAAS,CAAE3B,YAAWkuP,aAAYjpP,QAAOwqP,SAAQ1nC,aAC/D4pC,GACN,IAMG,OAFGj5B,EAAAve,YAAA,iBAAA/pN,OAA+BwT,GACzC80N,EAAUgO,QAAUA,GACbhO,CACT,CAEO,MAAM08F,GAAUD,GAA6B,KAAM,CAAER,cAAc,IAC7DU,GAAUF,GAA6B,KAAM,CAAER,cAAc,IAC7DW,GAAUH,GAA6B,KAAM,CACxDN,WAAW,EACXE,SAAS,EACTC,kBAAkB,IAEPO,GAAaJ,GAAgC,QAAS,CAAED,cAAc,IACtEM,GAAaL,GAAgC,SAC7CM,GAAaN,GAAgC,SAC7CO,GAAeP,GAAkC,UAAW,CAAEF,aAAa,IC5IxE,SAAAU,GAAAv+R,GAAoD,IAAlC,KAAEt8B,GAAgCs8B,EAClE,OAEK+gM,EAAAA,EAAAA,MAAAF,EAAAA,SAAA,CAAA1vJ,SAAA,CAAAztE,EAAK86T,UAAW19F,EAAAA,EAAAA,KAACw9F,GAAc,CAAAntP,SAAAztE,EAAK86T,UAEpC96T,EAAKyjO,OACJrG,EAAAA,EAAAA,KAACq9F,GAAA,CACChtP,UAAC2vJ,EAAAA,EAAAA,KAAAo9F,GAAA,CACE/sP,SAAAztE,EAAKyjO,KAAKvsO,KAAI,CAAC4L,EAAM9N,KACnBooO,EAAAA,EAAAA,KAAAk9F,GAAA,CAAqB7sP,SAAA3qE,GAAR9N,SAMrBgL,EAAKjC,OACJq/N,EAAAA,EAAAA,KAACs9F,GACE,CAAAjtP,SAAAztE,EAAKjC,KAAK7G,KAAK,CAAA6jU,EAAKC,KAClB59F,EAAAA,EAAAA,KAAAo9F,GAAA,CACE/sP,SAAAstP,EAAI7jU,KAAK,CAAA4L,EAAM9N,KACbooO,EAAAA,EAAAA,KAAAm9F,GAAA,CAAqB9sP,SAAR3qE,GAAA9N,MAFJgmU,OASnBh7T,EAAKqwM,OACJ+sB,EAAAA,EAAAA,KAACu9F,GAAA,CACCltP,UAAC2vJ,EAAAA,EAAAA,KAAAo9F,GAAA,CACE/sP,SAAAztE,EAAKqwM,KAAKn5M,KAAI,CAAC4L,EAAM9N,KACnBooO,EAAAA,EAAAA,KAAAk9F,GAAA,CAAqB7sP,SAAA3qE,GAAR9N,WAO5B,CAEA6lU,GAAkBx7G,YAAc,kCCjCnB,MAAC47G,GAAoBC,IAAwBl3C,GACxD,mDCrBK,SAAS4vB,GAAkDr2S,GAC1D,MAAAm2S,GAAcjkF,EAAAA,EAAAA,QAAOlyN,GAMpB,OAJP4xN,EAAAA,EAAAA,YAAU,KACRukF,EAAYntO,QAAUhpE,CAAA,KAGjBgyN,EAAAA,EAAAA,UAAQ,IAAO,mBAAA4rG,EAAA9/R,EAAAljC,UAAA/C,OAAI8jB,EAAS,IAAArkB,MAAAwmC,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAATpiB,EAASoiB,GAAAnjC,UAAAmjC,GAAA,OAAY,QAAZ6/R,EAAAznB,EAAYntO,eAAA,IAAA40P,OAAA,EAAZA,EAAA9iU,KAAAq7S,KAAyBx6R,EAAa,MAC3E,CCRgB,SAAAkiT,GAAkBv0T,EAA6Bw0T,GACvD,MAAAppD,EAAe2hC,GAAeynB,GAEpChtF,GAAoB,KAClB,IAAIitF,EAAM,EACV,GAAIz0T,EAAS,CACL,MAAA+/P,EAAiB,IAAIivB,gBAAe,KACxCx3P,qBAAqBi9R,GACfA,EAAA56T,OAAO09B,sBAAsB6zO,EAAa,IAKlD,OAFArL,EAAeG,QAAQlgQ,GAEhB,KACLnG,OAAO29B,qBAAqBi9R,GAC5B10D,EAAeuwB,UAAUtwR,EAAQ,CACnC,CAGK,GACN,CAACA,EAASorQ,GACf,CCjBO,MAAMspD,IAAS58F,EAAAA,EAAAA,aAAkD,CAAC1R,EAAO53E,KAC9E,MAAM,MAAElrI,KAAU0sP,GAAW5pC,EACvBptH,EAAMq7N,MACL38R,EAAOi9R,IAAY9rG,EAAAA,EAAAA,UAAS,IAC5BlxL,EAAQi9R,IAAa/rG,EAAAA,EAAAA,UAAS,GAC/BgsG,EAAU5iU,QAAQylC,GAASC,GAcjC,OAZkB48R,GAAAv7N,EAAI87N,YAAY,KAAM,IAAAC,EAChC,MAAAv0S,GAAQ,QAAJu0S,EAAA/7N,EAAI87N,kBAAA,IAAAC,OAAA,EAAJA,EAAgBh+G,eAAgB,EAC1C/9G,EAAIg8N,qBAAqBx0S,GACzBo0S,EAAUp0S,EAAE,IAGI+zS,GAAAv7N,EAAIi8N,YAAY,KAAM,IAAAC,EAChC,MAAA/8S,GAAQ,QAAJ+8S,EAAAl8N,EAAIi8N,kBAAA,IAAAC,OAAA,EAAJA,EAAgB3rL,cAAe,EACzCvwC,EAAIm8N,oBAAoBh9S,GACxBw8S,EAASx8S,EAAE,IAGN08S,GAAUt+F,EAAAA,EAAAA,KAAC,MAAK,IAAGy5B,EAAQxhH,MAAUlrI,MAAO,IAAKA,EAAOo0B,QAAOC,YAAe,QAG1Ey9R,IAAmBt9F,EAAAA,EAAAA,aAAkD,CAAC1R,EAAO53E,KACxF,MAAMx1C,EAAMq7N,KACNgB,EAA2BpjU,QAAQ+mG,EAAI87N,YAAc97N,EAAIi8N,YAE/D,MAD+B,WAAbj8N,EAAIx6F,MAAqB62T,GACvB9+F,EAAAA,EAAAA,KAAAm+F,GAAA,IAAWtuG,EAAO53E,QAAe,QCcjD86E,GAA6C,CACjDgsG,gBAAiB,IACjB92T,KAAM,SAGK+2T,IAAiBz9F,EAAAA,EAAAA,aAAgD,CAACy7B,EAAQ/kH,KACrF,MAAM43E,EAAQ0lC,GAAS,iBAAkBxiC,GAAciqC,IACjD,KAAE/0P,EAAM82T,gBAAAA,EAAA,WAAiBE,KAAexlE,GAAW5pC,GAElDqvG,EAAYC,IAAiB7sG,EAAAA,EAAAA,UAAgC,OAC7D1wE,EAAU21K,IAAejlG,EAAAA,EAAAA,UAAgC,OACzDt2K,EAASojR,IAAc9sG,EAAAA,EAAAA,UAAgC,OACvDisG,EAAYc,IAAiB/sG,EAAAA,EAAAA,UAAgC,OAC7DosG,EAAYY,IAAiBhtG,EAAAA,EAAAA,UAAgC,OAC7DitG,EAAaC,IAAkBltG,EAAAA,EAAAA,UAAS,IACxCmtG,EAAcC,IAAmBptG,EAAAA,EAAAA,UAAS,IAC1CqtG,EAAmBC,IAAwBttG,EAAAA,EAAAA,WAAS,IACpDutG,EAAmBC,IAAwBxtG,EAAAA,EAAAA,WAAS,GACrD0zD,EAAUyE,GAAaxyI,GAAMvrB,GAASyyM,EAAczyM,KAGxD,OAAAszG,EAAAA,EAAAA,KAAC69F,GAAA,CACClmU,MAAO,CACLsQ,OACA82T,kBACAG,aACAt9K,WACAm+K,iBAAkBxI,EAClBv7Q,UACAgkR,gBAAiBZ,EACjBb,aACA0B,mBAAoBZ,EACpBM,oBACAO,0BAA2BN,EAC3BlB,aACAyB,mBAAoBb,EACpBO,oBACAO,0BAA2BN,EAC3BlB,oBAAqBY,EACrBf,qBAAsBiB,GAGxBrvP,UAAA2vJ,EAAAA,EAAAA,KAACw8B,GAAA,IACK/C,EACJxhH,IAAK+tI,EACLlqB,OAAQ,CACN,oBAAoC,OAAfmjE,EAAsB,SAAA/mU,OAAWqnU,EAAW,MACjE,qBAAqC,OAAfN,EAAsB,SAAA/mU,OAAWunU,EAAY,UAGzE,IAIJT,GAAe/8G,YAAc,+BCjG7B,MAAMqhD,GAAOA,OAEG,SAAA+8D,GACdlgU,EACA3H,GAEA,MAAMigE,EAA2B,kBAAZjgE,EAAuBA,EAAUA,EAAQigE,MACxD6nQ,EAAoC,kBAAZ9nU,GAA+BA,EAAQ8nU,eAC/DC,EAAiB/pB,GAAer2S,GAChCqgU,GAAmBnuG,EAAAA,EAAAA,QAAO,GAE1BouG,EAAe7mU,OAAO+vH,QAC1BkoG,EAAAA,EAAAA,cACE,WAA4B,QAAA5zL,EAAAljC,UAAA/C,OAAxB8jB,EAAwB,IAAArkB,MAAAwmC,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAxBpiB,EAAwBoiB,GAAAnjC,UAAAmjC,GACnB56B,OAAAN,aAAaw9T,EAAiBr3P,SACrC,MAAMtqE,EAAQA,KACqB,IAA7B2hU,EAAiBr3P,UACnBq3P,EAAiBr3P,QAAU,EAC3Bo3P,KAAkBzkT,GAAI,EAG1B2kT,EAAa5hU,MAAQA,EACrB2hU,EAAiBr3P,QAAU7lE,OAAO1E,WAAWC,EAAO45D,EACtD,GACA,CAAC8nQ,EAAgB9nQ,IAEnB,CAAE55D,MAAOykQ,KAaJ,OAVPvxC,EAAAA,EAAAA,YACE,IAAM,KACGzuN,OAAAN,aAAaw9T,EAAiBr3P,SACjCm3P,GACFG,EAAa5hU,OAAM,GAGvB,CAAC4hU,EAAcH,IAGVG,CACT,CC3CgB,SAAAC,GAAcC,EAAsBC,GAClD,MAAMnnC,EAAQknC,EAAeC,EAC7B,OAAOpgT,OAAO/C,MAAMg8Q,GAAS,EAAIA,CACnC,CCAO,SAASonC,GAAan0F,GAC3B,MAAM+sD,EAAQinC,GAAch0F,EAAM9qF,SAAU8qF,EAAM1wL,SAC5C8kR,EAAmBp0F,EAAMq0F,UAAUC,aAAet0F,EAAMq0F,UAAUE,WAClEC,GAAax0F,EAAMq0F,UAAU3hQ,KAAO0hQ,GAAoBrnC,EACvD,OAAAxzQ,KAAKlqB,IAAImlU,EAAW,GAC7B,CCRgB,SAAAC,GAAYhiT,EAAkCI,GAC5D,OAAQ5nB,IACF,GAAAwnB,EAAM,KAAOA,EAAM,IAAMI,EAAO,KAAOA,EAAO,GAChD,OAAOA,EAAO,GAEV,MAAAk6Q,GAASl6Q,EAAO,GAAKA,EAAO,KAAOJ,EAAM,GAAKA,EAAM,IAC1D,OAAOI,EAAO,GAAKk6Q,GAAS9hS,EAAQwnB,EAAM,GAAG,CAEjD,CCAO,SAASiiT,GACdC,EACA30F,GAEA,IADAl3J,EAAAz6E,UAAA/C,OAAA,QAAA4C,IAAAG,UAAA,GAAAA,UAAA,GAAqB,MAEf,MAAAumU,EAAcT,GAAan0F,GAC3Bo0F,EAAmBp0F,EAAMq0F,UAAUC,aAAet0F,EAAMq0F,UAAUE,WAClEF,EAAYr0F,EAAMq0F,UAAU3hQ,KAAO0hQ,EACnCS,EAAe70F,EAAM1wL,QAAU0wL,EAAM9qF,SACrC4/K,EAAcT,EAAYO,EAE1BG,EAfR,SAAe9pU,EAAAunC,GAAqD,IAArC3iC,EAAKR,GAAgCmjC,EAClE,OAAOjZ,KAAK1pB,IAAIR,EAAKkqB,KAAKlqB,IAAIQ,EAAK5E,GACrC,CAagC05R,CAAMgwC,EADH,QAAR7rP,EAAgB,CAAC,EAAG+rP,GAAgB,EAAgB,EAAfA,EAAmB,IAGjF,OADoBJ,GAAY,CAAC,EAAGI,GAAe,CAAC,EAAGC,GAChD56Q,CAAY66Q,EACrB,CCtBgB,SAAAC,GAAiCL,EAAmBE,GAC3D,OAAAF,EAAY,GAAKA,EAAYE,CACtC,CCFO,SAASI,GAAMhqU,GACpB,OAAOA,EAAQkuB,SAASluB,EAAO,IAAM,CACvC,CCFgB,SAAAiqU,GACdC,EACAC,GAEA,IADA,yBAAEC,GAA2B,GAAKhnU,UAAA/C,OAAA,QAAA4C,IAAAG,UAAA,GAAAA,UAAA,GAAI,CAAC,EAEvC,OAAQ6F,IACN,OAAAihU,QAAA,IAAAA,GAAAA,EAAuBjhU,IAEU,IAA7BmhU,GAAwCnhU,EAA2B67L,kBACrE,OAAAqlI,QAAA,IAAAA,GAAAA,EAAkBlhU,EAAK,CAG7B,CCDa,MAACohU,GAAmBC,IAAuBr7C,GACtD,6CCYWs7C,IAAY3gG,EAAAA,EAAAA,aAA2C,CAAC1R,EAAO0pD,KACpE,YACJ7sC,EAAA,SACAy1F,EAAA,cACAC,EAAA,iBACAC,EAAA,mBACAC,EAAA,sBACAC,EAAA,aACAC,EAAA,cACAC,EAAA,SACAxE,KACGyE,GACD7yG,EACE58M,EAAU6qT,MACTiD,EAAW4B,IAAgBrwG,EAAAA,EAAAA,UAAgC,MAC5DswG,EAAcn4C,GAAalR,GAAe7sJ,GAASi2M,EAAaj2M,KAChEm2M,GAAUxwG,EAAAA,EAAAA,QAAuB,MACjCywG,GAA0BzwG,EAAAA,EAAAA,QAAe,KACzC,SAAEzwE,GAAa3uI,EACfsuT,EAAe70F,EAAM1wL,QAAU0wL,EAAM9qF,SACrCmhL,EAAoBvsB,GAAeisB,GACnCO,EAA4BxsB,GAAe+rB,GAC3C1tD,EAAewrD,GAAqBpC,EAAU,IAE9CgF,EAAoBriU,IACxB,GAAIiiU,EAAQ15P,QAAS,CACnB,MAAMnsE,EAAI4D,EAAMqyI,QAAU4vL,EAAQ15P,QAAQumB,KACpC1kE,EAAIpqB,EAAMsyI,QAAU2vL,EAAQ15P,QAAQ2lB,IAC7B0zO,EAAA,CAAExlU,IAAGguB,KAAG,GAsBvB,OAlBF+mM,EAAAA,EAAAA,YAAU,KACF,MAAAmxG,EAAetiU,IACnB,MAAM6I,EAAU7I,EAAM+L,QACc,OAAXo0T,QAAW,IAAXA,OAAW,EAAXA,EAAW76T,SAASuD,KAE3Cs5T,EAAkBniU,EAAO2gU,EAAY,EAIlC,OADPt7T,SAASkC,iBAAiB,QAAS+6T,EAAa,CAAEx8H,SAAS,IACpD,IAAMzgM,SAAS8c,oBAAoB,QAASmgT,EAAa,CAAEx8H,SAAS,GAAe,GACzF,CAAC9kD,EAAUm/K,EAAWQ,EAAcwB,KAEvChxG,EAAAA,EAAAA,WAAUixG,EAA2B,CAACt2F,EAAOs2F,IAE7ChF,GAAkB+C,EAAWlsD,GACXmpD,GAAA/qT,EAAQ+oC,QAAS64N,IAGjC70C,EAAAA,EAAAA,KAACgiG,GAAA,CACCrqU,MAAO,CACLopU,YACAoB,WACAC,cAAe5rB,GAAe4rB,GAC9BC,iBAAkB7rB,GAAe6rB,GACjCE,sBAAuBS,EACvBV,mBAAoB9rB,GAAe8rB,IAGrCjyP,UAAA2vJ,EAAAA,EAAAA,KAAC,UACK0iG,EACJzqL,IAAK2qL,EACL,0BAAsB,EACtB71T,MAAO,CAAEyS,SAAU,cAAekjT,EAAe31T,OACjDq3R,cAAew9B,GAAqB/xG,EAAMu0E,eAAgBxjS,IACxDA,EAAM0O,iBAGF,GADgB,IAChB1O,EAAMiyI,OAAwB,CAChBjyI,EAAM+L,OACdw2T,kBAAkBviU,EAAMwnN,WACxBy6G,EAAA15P,QAAU43P,EAAWpuL,wBACLmwL,EAAA35P,QAAUljE,SAAStF,KAAKoM,MAAMq2T,iBAC7Cn9T,SAAAtF,KAAKoM,MAAMq2T,iBAAmB,OACvCH,EAAiBriU,EAAK,KAG1ByiU,cAAezB,GAAqB/xG,EAAMwzG,cAAeJ,GACzDK,YAAa1B,GAAqB/xG,EAAMyzG,aAAc1iU,IACpD,MAAM6I,EAAU7I,EAAM+L,OAClBlD,EAAQ85T,kBAAkB3iU,EAAMwnN,aAClCxnN,EAAM0O,iBACE7F,EAAA+5T,sBAAsB5iU,EAAMwnN,WAAS,IAGjDq7G,qBAAsBA,KACXx9T,SAAAtF,KAAKoM,MAAMq2T,iBAAmBN,EAAwB35P,QAC/D05P,EAAQ15P,QAAU,SAGxB,IC5GSu6P,IAAuBniG,EAAAA,EAAAA,aAClC,CAAC1R,EAAO0pD,KACN,MAAM,MAAE7sC,EAAOi3F,cAAAA,EAAA,MAAe52T,KAAU0sP,GAAW5pC,EAC7CptH,EAAMq7N,MACL9pD,EAAe4vD,IAAoBtxG,EAAAA,EAAAA,YACpCr6E,GAAMo6E,EAAAA,EAAAA,QAAuB,MAC7BuwG,EAAcn4C,GAAalR,EAActhI,EAAKx1C,EAAIw9N,oBAStD,OAPFluG,EAAAA,EAAAA,YAAU,KACJ95E,EAAI9uE,SACWy6P,EAAA5rH,iBAAiB//D,EAAI9uE,SAAQ,GAE/C,CAAC8uE,KAGF+nF,EAAAA,EAAAA,KAACkiG,GAAA,CACC,mBAAiB,gBACbzoE,EACJxhH,IAAK2qL,EACLl2F,QACA3/N,MAAO,IACFA,EACH,mBAA6B,GAAH7U,OAAM2oU,GAAan0F,GAAM,OAErD41F,mBAAqBuB,GAAeh0G,EAAMyyG,mBAAmBuB,EAAW7mU,GACxEwlU,aAAeqB,GAAeh0G,EAAM2yG,aAAaqB,EAAW7mU,GAC5DylU,cAAeA,CAAC7hU,EAAO2gU,KACrB,GAAI9+N,EAAIm/C,SAAU,CAChB,MAAMy/K,EAAY5+N,EAAIm/C,SAASz1I,WAAavL,EAAMorN,OAClD6D,EAAM4yG,cAAcpB,GAChBK,GAAiCL,EAAWE,IAC9C3gU,EAAM0O,gBACR,GAGJ2uT,SAAUA,KACJhmL,EAAI9uE,SAAWs5B,EAAIm/C,UAAYoyH,GACnB2vD,EAAA,CACZ3nR,QAASymD,EAAIm/C,SAASo0I,YACtBp0I,SAAUn/C,EAAIm/C,SAAS5O,YACvB+tL,UAAW,CACT3hQ,KAAM64E,EAAI9uE,QAAQ63H,YAClBggI,aAAcW,GAAM3tD,EAAckF,aAClC+nD,WAAYU,GAAM3tD,EAAc8vD,gBAEnC,GAGP,IAKNJ,GAAqBzhH,YAAc,qCCrD5B,MAAM8hH,IAAuBxiG,EAAAA,EAAAA,aAClC,CAAC1R,EAAO0pD,KACN,MAAM,MAAE7sC,EAAOi3F,cAAAA,EAAA,MAAe52T,KAAU0sP,GAAW5pC,EAC7C58M,EAAU6qT,MACT9pD,EAAe4vD,IAAoBtxG,EAAAA,EAAAA,YACpCr6E,GAAMo6E,EAAAA,EAAAA,QAAuB,MAC7BuwG,EAAcn4C,GAAalR,EAActhI,EAAKhlI,EAAQktT,oBAS1D,OAPFpuG,EAAAA,EAAAA,YAAU,KACJ95E,EAAI9uE,SACNy6P,EAAiBtgU,OAAO00M,iBAAiB//D,EAAI9uE,SAAQ,GAEtD,KAGD62J,EAAAA,EAAAA,KAACkiG,GAAA,IACKzoE,EACJ,mBAAiB,WACjBxhH,IAAK2qL,EACLl2F,QACA3/N,MAAO,CACL,oBAA8B,GAAH7U,OAAM2oU,GAAan0F,GAAM,SACjD3/N,GAELu1T,mBAAqBuB,GAAeh0G,EAAMyyG,mBAAmBuB,EAAW74S,GACxEw3S,aAAeqB,GAAeh0G,EAAM2yG,aAAaqB,EAAW74S,GAC5Dy3S,cAAeA,CAAC7hU,EAAO2gU,KACrB,GAAItuT,EAAQ2uI,SAAU,CACpB,MAAMy/K,EAAYpuT,EAAQ2uI,SAAS+2D,UAAY/3M,EAAM6iM,OACrDosB,EAAM4yG,cAAcpB,GAChBK,GAAiCL,EAAWE,IAC9C3gU,EAAM0O,gBACR,GAGJ2uT,SAAUA,KACJhmL,EAAI9uE,SAAWl2D,EAAQ2uI,UAAYoyH,GACvB2vD,EAAA,CACZ3nR,QAAS/oC,EAAQ2uI,SAASq0I,aAC1Br0I,SAAU3uI,EAAQ2uI,SAAS4+D,aAC3BugH,UAAW,CACT3hQ,KAAM64E,EAAI9uE,QAAQ4tM,aAClBiqD,aAAcW,GAAM3tD,EAAcohB,YAClC6rC,WAAYU,GAAM3tD,EAAcgwD,iBAEnC,GAGP,IAKND,GAAqB9hH,YAAc,qCC3C5B,MAAMgiH,IAA6B1iG,EAAAA,EAAAA,aAGxC,CAAC1R,EAAO0pD,KACR,MAAM,YAAEj9J,EAAc,cAAeomN,GAAmB7yG,GAClD,IAAEr6I,GAAQi2M,KACVx4Q,EAAU6qT,KACVoG,GAAW7xG,EAAAA,EAAAA,QAA8B,MACzC8xG,GAAmB9xG,EAAAA,EAAAA,QAAO,IACzBqa,EAAO03F,IAAY9xG,EAAAA,EAAAA,UAAgB,CACxCt2K,QAAS,EACT4lG,SAAU,EACVm/K,UAAW,CAAE3hQ,KAAM,EAAG4hQ,aAAc,EAAGC,WAAY,KAG/CoD,EAAa3D,GAAch0F,EAAM9qF,SAAU8qF,EAAM1wL,SAEjDixP,EAGF,IACCy1B,EACHh2F,QACAi3F,cAAeS,EACfjC,SAAUzmU,QAAQ2oU,EAAa,GAAKA,EAAa,GACjDjC,cAAgBkC,IACdJ,EAAS/6P,QAAUm7P,CAAA,EAErBjC,iBAAkBA,KAChB8B,EAAiBh7P,QAAU,GAE7Bm5P,mBAAqBuB,IACnBM,EAAiBh7P,QAAU06P,CAAA,GAIzBpnF,EAAoBA,CAAConF,EAAoB5pL,ICjD1C,SACL4pL,EACAU,EACA73F,GAEA,IADAl3J,EAAAz6E,UAAA/C,OAAA,QAAA4C,IAAAG,UAAA,GAAAA,UAAA,GAAqB,MAEf,MAAAumU,EAAcT,GAAan0F,GAE3B1rL,EAASujR,GADKjD,EAAc,EAE5BkD,EAAqBlD,EAActgR,EACnCyjR,EAAgB/3F,EAAMq0F,UAAUC,aAAehgR,EAC/C0jR,EAAgBh4F,EAAMq0F,UAAU3hQ,KAAOstK,EAAMq0F,UAAUE,WAAauD,EACpEjD,EAAe70F,EAAM1wL,QAAU0wL,EAAM9qF,SAG3C,OADoBu/K,GAAY,CAACsD,EAAeC,GADpB,QAARlvP,EAAgB,CAAC,EAAG+rP,GAAgB,EAAgB,EAAfA,EAAmB,GAErE36Q,CAAYi9Q,EACrB,CDkCIc,CAA6Bd,EAAYM,EAAiBh7P,QAASujK,EAAOzyF,GAE5E,MAAoB,eAAhB39B,GAEA0jH,EAAAA,EAAAA,KAAC0jG,GAAA,IACKz2B,EACJh1J,IAAKshI,EACLgpD,sBAAuBA,KACjB,GAAAtvT,EAAQ2uI,UAAYsiL,EAAS/6P,QAAS,CAClC,MACAnoB,EAASogR,GADGnuT,EAAQ2uI,SAASz1I,WACgBugO,EAAOl3J,GAC1D0uP,EAAS/6P,QAAQp8D,MAAM0oG,UAAY,eAAAv9G,OAAe8oD,EAAM,eAG5DyhR,cAAgBpB,IACVpuT,EAAQ2uI,WACV3uI,EAAQ2uI,SAASz1I,WAAak1T,EAAA,EAGlCmB,aAAeqB,IACT5wT,EAAQ2uI,WACV3uI,EAAQ2uI,SAASz1I,WAAaswO,EAAkBonF,EAAYruP,GAAG,IAOrD,aAAhB8mC,GAEA0jH,EAAAA,EAAAA,KAAC+jG,GAAA,IACK92B,EACJh1J,IAAKshI,EACLgpD,sBAAuBA,KACjB,GAAAtvT,EAAQ2uI,UAAYsiL,EAAS/6P,QAAS,CAClC,MACAnoB,EAASogR,GADGnuT,EAAQ2uI,SAAS+2D,UACgB+zB,GACtB,IAAzBA,EAAMq0F,UAAU3hQ,KAClB8kQ,EAAS/6P,QAAQp8D,MAAMi5M,YAAY,kBAAmB,KAEtDk+G,EAAS/6P,QAAQp8D,MAAMi5M,YAAY,kBAAmB,KAExDk+G,EAAS/6P,QAAQp8D,MAAM0oG,UAAY,kBAAAv9G,OAAkB8oD,EAAM,YAG/DyhR,cAAgBpB,IACVpuT,EAAQ2uI,WACV3uI,EAAQ2uI,SAAS+2D,UAAY0oH,EAAA,EAGjCmB,aAAeqB,IACT5wT,EAAQ2uI,WACF3uI,EAAA2uI,SAAS+2D,UAAY8jC,EAAkBonF,GAAU,IAO5D,QAGTI,GAA2BhiH,YAAc,2CEvGlC,MAAM2iH,IAA0BrjG,EAAAA,EAAAA,aACrC,CAAC1R,EAAO53E,KACN,MAAMhlI,EAAU6qT,MACV,WAAE+G,KAAenC,GAAmB7yG,GACnCp9D,EAAS03H,IAAc73D,EAAAA,EAAAA,WAAS,GACjCwyG,EAAqC,eAAtBj1G,EAAMvzG,YAErBu4J,EAAewrD,IAAqB,KACxC,GAAIptT,EAAQ2uI,SAAU,CACpB,MAAMmjL,EAAc9xT,EAAQ2uI,SAAS5O,YAAc//H,EAAQ2uI,SAASo0I,YAC9DgvC,EAAc/xT,EAAQ2uI,SAAS4+D,aAAevtM,EAAQ2uI,SAASq0I,aAC1D9L,EAAA26C,EAAeC,EAAcC,EAAW,IAEpD,IAKH,OAHkBhH,GAAA/qT,EAAQ2uI,SAAUizH,GAClBmpD,GAAA/qT,EAAQ+oC,QAAS64N,GAE/BgwD,GAAcpyK,GAEdutE,EAAAA,EAAAA,KAACikG,GAAA,CACC,aAAYxxK,EAAU,UAAY,YAC9BiwK,EACJzqL,QAKC,QAIX2sL,GAAwB3iH,YAAc,wCCrC/B,MAAMgjH,IAA2B1jG,EAAAA,EAAAA,aACtC,CAAC1R,EAAO53E,KACN,MAAM,WAAE4sL,KAAenC,GAAmB7yG,EACpC58M,EAAU6qT,MACTrrK,EAAS03H,IAAc73D,EAAAA,EAAAA,WAAS,GA0BvC,OAxBAP,EAAAA,EAAAA,YAAU,KACF,iBAAEmtG,GAAejsT,EACvB,IAAIiyT,EAAY,EAChB,GAAIhG,EAAY,CACd,MAAMiG,EAAqBA,KACzB7hU,OAAON,aAAakiU,GACpB/6C,GAAW,EAAK,EAEZi7C,EAAqBA,KACzBF,EAAY5hU,OAAO1E,YAAY,IAAKurR,GAAW,IAAQl3Q,EAAQ8rT,gBAAgB,EAKjF,OAHWG,EAAA/2T,iBAAiB,eAAgBg9T,GACjCjG,EAAA/2T,iBAAiB,eAAgBi9T,GAErC,KACL9hU,OAAON,aAAakiU,GACThG,EAAAn8S,oBAAoB,eAAgBoiT,GACpCjG,EAAAn8S,oBAAoB,eAAgBqiT,EAAmB,CACpE,CAGK,GACN,CAACnyT,EAAQisT,WAAYjsT,EAAQ8rT,kBAE5B8F,GAAcpyK,GAEdutE,EAAAA,EAAAA,KAAC4kG,GAAA,CACC,aAAYnyK,EAAU,UAAY,YAC9BiwK,EACJzqL,QAKC,QAIXgtL,GAAyBhjH,YAAc,yCCvChC,MAAMojH,IAA4B9jG,EAAAA,EAAAA,aACvC,CAAC1R,EAAOp6K,KACN,MAAM,WAAEovR,KAAenC,GAAmB7yG,EACpC58M,EAAU6qT,KACVgH,EAAqC,eAAtBj1G,EAAMvzG,aACpBn6F,EAAO80C,IAAYq7J,EAAAA,EAAAA,UAA0D,UAC9EgzG,EAAoBjF,IAAsB,IAAKppQ,EAAS,SAAS,KAiCnE,OA/BJ86J,EAAAA,EAAAA,YAAU,KACR,GAAc,SAAV5vM,EAAkB,CACd,MAAA+iT,EAAY5hU,OAAO1E,YAAY,IAAKq4D,EAAS,WAAWhkD,EAAQ8rT,iBAC/D,UAAMz7T,OAAON,aAAakiU,EAAS,CAGrC,GACN,CAAC/iT,EAAOlP,EAAQ8rT,mBAEnBhtG,EAAAA,EAAAA,YAAU,KACF,eAAEnwE,GAAa3uI,EACfsyT,EAAkBT,EAAe,aAAe,YAEtD,GAAIljL,EAAU,CACR,IAAA4jL,EAAgB5jL,EAAS2jL,GAC7B,MAAMpoB,EAAeA,KACb,MAAAkkB,EAAYz/K,EAAS2jL,GACSC,IAAkBnE,IAEpDpqQ,EAAS,aACSquQ,KAEJE,EAAAnE,CAAA,EAGlB,OADSz/K,EAAAz5I,iBAAiB,SAAUg1S,GAC7B,IAAMv7J,EAAS7+H,oBAAoB,SAAUo6R,EAAY,CAG3D,GACN,CAAClqS,EAAQ2uI,SAAUkjL,EAAcQ,IAEhCT,GAAwB,WAAV1iT,GAEd69M,EAAAA,EAAAA,KAACikG,GAAA,CACC,aAAsB,WAAV9hT,EAAqB,SAAW,aACxCugT,EACJzqL,IAAKxiG,EACL4uP,eAAgBu9B,GAAqB/xG,EAAMw0E,gBAAgB,IAAMptO,EAAS,iBAC1EwuQ,eAAgB7D,GAAqB/xG,EAAM41G,gBAAgB,IAAMxuQ,EAAS,YAKzE,QClDEyuQ,IAAsBnkG,EAAAA,EAAAA,aACjC,CAAC1R,EAAO0pD,KACN,MAAM,WAAEsrD,KAAenC,GAAmB7yG,EACpC58M,EAAU6qT,MACV,0BAAEoC,EAA2BE,0BAAAA,GAA8BntT,EAC3D6xT,EAAqC,eAAtBj1G,EAAMvzG,YAS3B,OAPAy1G,EAAAA,EAAAA,YAAU,KACR+yG,EAAe5E,GAA0B,GAAQE,GAA0B,GACpE,KACL0E,EAAe5E,GAA0B,GAASE,GAA0B,EAAM,IAEnF,CAAC0E,EAAc5E,EAA2BE,IAErB,UAAjBntT,EAAQhL,MAAS+3N,EAAAA,EAAAA,KACrBilG,GAA0B,IAAGvC,EAAgBzqL,IAAKshI,EAAcsrD,eAC9C,WAAjB5xT,EAAQhL,MACV+3N,EAAAA,EAAAA,KAACqlG,GAAA,IAA8B3C,EAAgBzqL,IAAKshI,EAAcsrD,eAC/C,SAAjB5xT,EAAQhL,MACV+3N,EAAAA,EAAAA,KAAC4kG,GAAA,IAA4BlC,EAAgBzqL,IAAKshI,EAAcsrD,eAC7C,WAAjB5xT,EAAQhL,MACT+3N,EAAAA,EAAAA,KAAAikG,GAAA,IAA+BvB,EAAgBzqL,IAAKshI,IACnD,QAIRmsD,GAAoBzjH,YAAc,oCChC3B,MAAM0jH,IAAQpkG,EAAAA,EAAAA,aAAuC,CAAC1R,EAAO0pD,KAClE,MAAM,MAAExsQ,KAAU0sP,GAAW5pC,EACvB+1G,EAAoB9H,KACpB+H,EAAmB5D,MACnB,sBAAEM,GAA0BsD,EAC5BC,EAAcr7C,GAAalR,GAAe7sJ,GAASm5M,EAAiBzD,cAAc11M,KAClFq5M,GAAkC1zG,EAAAA,EAAAA,aAAiC,GACnEizG,EAAoBjF,IAAqB,KACzC0F,EAAgC58P,UAClC48P,EAAgC58P,UAChC48P,EAAgC58P,aAAU,KAE3C,KAsBD,OApBF4oJ,EAAAA,EAAAA,YAAU,KACF,eAAEnwE,GAAagkL,EACrB,GAAIhkL,EAAU,CACZ,MAAMu7J,EAAeA,KAEf,GADcmoB,KACbS,EAAgC58P,QAAS,CACtC,MAAAxuD,EC5BA,SAA0B+xG,GAAuC,IAApB7rG,EAAA9lB,UAAA/C,OAAA,QAAA4C,IAAAG,UAAA,GAAAA,UAAA,GAAU,OACjEirU,EAAe,CAAEt2O,KAAMg9B,EAAKvgH,WAAY2iF,IAAK49B,EAAKisF,WAClDulH,EAAM,EAWH,OAVP,SAAU7yK,IACR,MAAM7rI,EAAW,CAAEkwE,KAAMg9B,EAAKvgH,WAAY2iF,IAAK49B,EAAKisF,WAC9CstH,EAAqBD,EAAat2O,OAASlwE,EAASkwE,KACpDw2O,EAAmBF,EAAal3O,MAAQtvE,EAASsvE,KACnDm3O,GAAsBC,IAChBrlT,IAEKmlT,EAAAxmT,EACT0+S,EAAA56T,OAAO09B,sBAAsBqqH,EAClC,CATH,GAUO,IAAM/nJ,OAAO29B,qBAAqBi9R,EAC3C,CDc2BiI,CAA0BvkL,EAAU2gL,GACrDwD,EAAgC58P,QAAUxuD,EACpB4nT,GAAA,GAK1B,OAFsBA,IACb3gL,EAAAz5I,iBAAiB,SAAUg1S,GAC7B,IAAMv7J,EAAS7+H,oBAAoB,SAAUo6R,EAAY,CAG3D,GACN,CAACyoB,EAAkBhkL,SAAU0jL,EAAmB/C,KAGjDviG,EAAAA,EAAAA,KAAC,OACC,aAAY6lG,EAAiB1D,SAAW,UAAY,YAChD1oE,EACJxhH,IAAK6tL,EACL/4T,MAAO,CACLo0B,MAAO,wBACPC,OAAQ,4BACLr0B,GAELq5T,qBAAsBxE,GAAqB/xG,EAAMu2G,sBAAuBxlU,IACtE,MACMylU,EADQzlU,EAAM+L,OACIgmI,wBAClB31I,EAAI4D,EAAMqyI,QAAUozL,EAAU32O,KAC9B1kE,EAAIpqB,EAAMsyI,QAAUmzL,EAAUv3O,IACpC+2O,EAAiBvD,mBAAmB,CAAEtlU,IAAGguB,KAAI,IAE/Cs4S,YAAa1B,GAAqB/xG,EAAMyzG,YAAauC,EAAiBxD,mBACxE,IAIJsD,GAAM1jH,YAAc,gCAMb,MAAMqkH,IAAkB/kG,EAAAA,EAAAA,aAC7B,CAAC1R,EAAO0pD,KACN,MAAM,WAAEsrD,KAAe0B,GAAe12G,EAChCg2G,EAAmB5D,KAErB,OAAA4C,GAAcgB,EAAiB1D,UACzBniG,EAAAA,EAAAA,KAAA2lG,GAAA,CAAM1tL,IAAKshI,KAAkBgtD,IAGhC,QAIXD,GAAgBrkH,YAAc,gCE3EvB,MAAMukH,IAAqBjlG,EAAAA,EAAAA,aAChC,CAAAriM,EAAiC+4G,KAAQ,IAAxC,SAAE5nE,EAAA,MAAUtjE,KAAU0sP,GAAAv6N,EACrB,MAAMujE,EAAMq7N,KACN93C,EAAUyE,GAAaxyI,EAAKx1C,EAAIs9N,kBAGpC,OAAA//F,EAAAA,EAAAA,KAACw8B,GAAA,IACK/C,EACJxhH,IAAK+tI,EACLj5Q,MAAO,CACLohR,UAAW1rL,EAAIk9N,kBAAoB,SAAW,SAC9CvxC,UAAW3rL,EAAIo9N,kBAAoB,SAAW,YAC3C9yT,GAGLsjE,UAAC2vJ,EAAAA,EAAAA,KAAA,OAAIjzN,MAAO,CAAE2rQ,SAAU,OAAQ1rQ,QAAS,SAAWirI,IAAKx1C,EAAIu9N,gBAC1D3vP,cAEL,IAKNm2P,GAAmBvkH,YAAc,6KCqDjC,MAAM8Q,GAAyC,CAC7CgsG,gBAAiB,IACjB92T,KAAM,QACNg3T,WAAY,MAGRpnE,GACJ,CAAC39O,EAAAglB,KAAA,IAAG,cAAEunS,EAAA,mBAAeC,GAA0BxnS,EAAA,OAC7CrgB,KAAM,CACJ,8BAA+B8pN,EAAI89F,GACnC,oCAAqCC,GAExC,EAGUC,GAAahsR,IAA2B,CAACqiN,EAAQ/kH,KAC5D,MAAM43E,EAAQ0lC,GAAS,aAAcxiC,GAAciqC,IAC7C,WACJhH,EAAAluP,UACAA,EAAA,MACAiF,EAAA,OACAwqP,EAAA,SACAhB,EAAA,cACAkwE,EAAA,KACA7uE,EAAA,KACA3vP,EAAA,gBACA82T,EAAA,cACA6H,EAAA,YACAC,EAAA,uBACAC,EAAA,SACAz2P,EAAA,iBACA02P,EAAA,WACA9H,EAAA,gBACA+H,EAAA,aACAC,EAAA,mBACAP,KACGjtE,GACD5pC,GAEGq3G,EAAkBC,IAAuB70G,EAAAA,EAAAA,WAAS,IAClD80G,EAAsBC,IAA2B/0G,EAAAA,EAAAA,WAAS,IAC1Dg1G,EAAwBC,IAA6Bj1G,EAAAA,EAAAA,WAAS,GAE/D2qC,EAAY1E,GAA6B,CAC7C7sP,KAAM,aACNmkN,QACA2e,QAAA,GACA1mO,YACAiF,QACAipP,aACAuB,SACAhB,WACAqB,OACAC,aAAYA,KAGR2vE,GAAmBn1G,EAAAA,EAAAA,QAAuB,MAC1Co1G,EAAsBrnC,GAAa,CAACymC,EAAaW,IAyBrD,OAvBFz1G,EAAAA,EAAAA,YAAU,KACJ,IAACy1G,EAAiBr+P,QACpB,OAGF,GAAyB,YAArB49P,EACF,OAGF,MAAMt9T,EAAU+9T,EAAiBr+P,QAE3Bu+P,EAAW,IAAIjvC,gBAAe,KAClC,MAAM,aAAExC,EAAA,aAAclf,EAAcif,YAAAA,EAAA,YAAah1F,GAAgBv3L,EACjE49T,EAAwBpxC,EAAelf,GACvCwwD,EAA0BvxC,EAAch1F,EAAY,IAK/C,OAFP0mI,EAAS/9D,QAAQlgQ,GAEV,IAAMi+T,EAASh+D,YAAW,GAChC,CAAC89D,EAAkBT,KAGpB9mG,EAAAA,EAAAA,MAAC++F,GAAA,CACC/2T,KAAe,UAATA,EAAmB,SAAWA,EACpC82T,kBACA9mL,MACAgnL,gBACIhiE,EAAU,WACVxD,EAEJppL,SAAA,EAAA2vJ,EAAAA,EAAAA,KAACwmG,GAAA,IACKI,KACA3pE,EAAU,WAAY,CAAElwP,MAAO,OAAA65T,QAAA,IAAAA,OAAA,EAAAA,EAAe75T,QAClDkrI,IAAKwvL,EACL,0BAA6C,IAArBV,EAA4B,KAAOA,QAAoB,EAC/E,kBAAiB9H,QAAc,EAC/B,yBACuB,YAArB8H,GAAmCO,OAAkC,EAAT,OAE9D,uBACuB,YAArBP,GAAmCK,OAAgC,EAAT,OAE5D3+B,SAAWrgS,IAAM,IAAAu/T,EACf,OAAAf,QAAA,IAAAA,GAAe,QAAfe,EAAAf,EAAen+B,gBAAA,IAAAk/B,GAAfA,EAAA1sU,KAAA2rU,EAA0Bx+T,GACD,OAAA0+T,QAAA,IAAAA,GAAAA,EAAA,CAAE9pU,EAAGoL,EAAE4gN,cAAc78M,WAAY6e,EAAG5iB,EAAE4gN,cAAcrQ,YAC7E,MAAM,UAAEA,EAAA,aAAWs9E,EAAclf,aAAAA,GAAiB3uQ,EAAE4gN,cAChDrQ,GAAas9E,EAAelf,IAAiB,IAC7B,OAAAiwD,QAAA,IAAAA,GAAAA,KAEF,IAAdruH,IACa,OAAAsuH,QAAA,IAAAA,GAAAA,IAAA,EAIlB52P,cAGc,OAAf4uP,GAAsC,MAAfA,KACvBj/F,EAAAA,EAAAA,KAAC0lG,GAAA,IACKzoE,EAAU,aACd3gJ,YAAY,aACZ,cAAsB,UAATr0G,IAAqBq/T,QAA0B,EAC5DzC,YAAU,EACV35D,aAAcA,IAAMi8D,GAAoB,GACxCh8D,aAAcA,IAAMg8D,GAAoB,GAExC92P,UAAC2vJ,EAAAA,EAAAA,KAAAsmG,GAAA,IAAoBrpE,EAAU,cAIlB,OAAfgiE,GAAsC,MAAfA,KACvBj/F,EAAAA,EAAAA,KAAC0lG,GAAA,IACKzoE,EAAU,aACd3gJ,YAAY,WACZ,cAAsB,UAATr0G,IAAqBm/T,QAAwB,EAC1DvC,YAAU,EACV35D,aAAcA,IAAMi8D,GAAoB,GACxCh8D,aAAcA,IAAMg8D,GAAoB,GAExC92P,UAAC2vJ,EAAAA,EAAAA,KAAAsmG,GAAA,IAAoBrpE,EAAU,cAInCj9B,EAAAA,EAAAA,KAAC6+F,GAAA,IACK5hE,EAAU,UACd,eAAciqE,QAAoB,EAClC,cAAsB,UAATj/T,QAAoB,MAErC,IAIJ0+T,GAAW1kH,YAAc,2BAElB,MAAM2lH,GAAqBjtR,IAA2B,CAACk1K,EAAO53E,KAC7D,eACJ5nE,EAAA,WACA2lL,EAAA,OACAuB,EAAA,cACAkvE,EAAA,gBACA1H,EAAA,KACA92T,EAAA,IACAutE,EAAA,iBACAuxP,EAAA,YACAF,EAAA,uBACAC,EAAA,SACAvwE,EAAA,QACA3qB,EAAA,cACAg7F,EAAA,WACA3H,EAAA,MACAlyT,EAAA,KACA6qP,EAAA,gBACAovE,EAAA,aACAC,KACGxtE,GACDlE,GAAS,qBAAsBxiC,GAAclD,GAG/C,OAAAmQ,EAAAA,EAAAA,KAACw8B,GAAK,IAAG/C,EAAQxhH,MAAUlrI,MAAO,CAAC,CAAEC,QAAS,OAAQsiN,SAAU,QAAUviN,GACxEsjE,UAAC2vJ,EAAAA,EAAAA,KAAAw8B,GAAA,CAAIzvP,MAAO,CAAEC,QAAS,OAAQwuQ,cAAe,SAAUr3D,KAAM,GAC5D9zI,UAAA2vJ,EAAAA,EAAAA,KAAC2mG,GAAA,CACC3wE,aACAuB,SACAwnE,kBACA0H,gBACAx+T,OACAutE,MACAuxP,mBACAF,cACAC,yBACAvwE,WACA3qB,UACAg7F,gBACAhvE,OACAqnE,aACA+H,kBACAC,eAEC52P,gBAGP,IAIJs2P,GAAWn4F,QAAUA,GACrBo5F,GAAmB3lH,YAAc,mCACjC2lH,GAAmBp5F,QAAUA,GAC7Bm4F,GAAWkB,SAAWD,GC7PtB,MAAM70G,GAAmD,CACvD9qN,KAAM,cAGF4vP,GAAgE,CAAA39O,EAAAglB,KAAA,IAAG,SAAEw5O,EAAA,KAAUzwQ,GAAYi3B,EAAA,OAC/F4oS,gBAAiB,CACf,oBAAqBn/F,EAAI+vC,GACzB,mBAA6B,WAATzwQ,EAAoB,YAAS,GAEnD,EAEW8/T,GAAuBptR,IAAqC,CAACqiN,EAAQ/kH,KAChF,MAAM43E,EAAQ0lC,GAAS,uBAAwBxiC,GAAciqC,IACvD,WACJhH,EAAAluP,UACAA,EAAA,MACAiF,EAAA,OACAwqP,EAAA,SACAhB,EAAA,KACAqB,EAAA,SACAvnL,EAAA,SACAqoM,EAAA,KACAzwQ,KACGwxP,GACD5pC,EAEEotC,EAAY1E,GAAuC,CACvD7sP,KAAM,uBACN8iO,QAAA,GACA3e,QACA/nN,YACAiF,QACAipP,aACAuB,SACAhB,WACAqB,OACAC,aAAA,GACArB,aAAc,oBAId,OAAAx2B,EAAAA,EAAAA,KAACw8B,GAAA,CACCv5B,UAAoB,eAATh7N,EAAwB0+T,GAAa,SAClC,eAAT1+T,EAAwB,CAAE8+T,iBAAkB,KAAQ,CAAC,EAC1D9uL,SACIglH,EAAU,sBACVxD,EAEJppL,UAAA2vJ,EAAAA,EAAAA,KAAC,MAAK,IAAGi9B,EAAU,wBAA0B5sL,cAC/C,IAIJ03P,GAAqBv5F,QAAUA,GAC/Bu5F,GAAqB9lH,YAAc,qCCsCnC,MAAM8Q,GAAoC,CACxC6pG,gBAAgB,EAChBoL,gBAAiB,GAGbnwE,GACJ,CACEruB,EACAtqM,KAAA,WACE08B,EAAA,YACAmhQ,EAAA,kBACAkL,EAAA,gBACAD,EAAA,YACArhD,EAAA,aACAuhD,EAAA,sBACAC,EAAA,QACAtL,EAAA,iBACAC,EAAA,mBACAsL,EAAApL,aACAA,GAEE99R,EAAA,OACJmpS,MAAO,CACL,iBAAkBzsQ,EAClB,uBAAwBmhQ,EACxB,6BAA8B3/D,GAAW6qE,GACzC,2BAA4B7qE,GAAW4qE,GACvC,uBAAwBrhD,EAAch8C,EAAcg8C,EAAan9C,QAAS,EAC1E,wBACEqzF,GAAWqL,EAAev9F,EAAcu9F,EAAc1+F,QAAS,EACjE,mCACEszF,GAAoBqL,EAChBx9F,EAAcw9F,EAAuB3+F,QACrC,EACN,+BAAgCwzF,EAAer0F,EAAIy/F,QAAsB,GAE5E,EAGUE,GAAQ3tR,IAAsB,CAACqiN,EAAQ/kH,KAClD,MAAM43E,EAAQ0lC,GAAS,QAASxiC,GAAciqC,IACxC,WACJhH,EAAAluP,UACAA,EAAA,MACAiF,EAAA,OACAwqP,EAAA,SACAhB,EAAA,KACAqB,EAAA,kBACAqwE,EAAA,gBACAD,EAAA,YACAjL,EAAA,aACAmL,EAAA,sBACAC,EAAA,QACAtL,EAAA,iBACAC,EAAA,kBACAJ,EAAA,eACAE,EAAA,gBACA2L,EAAA,YACA5hD,EAAA,OACA/qN,EAAA,QACAgwK,EAAA,KACAhpO,EAAA,SACAytE,EAAA,aACA2sP,EAAA,mBACAoL,EAAA,IACAhvE,EAAA,YACAovE,KACG/uE,GACD5pC,EAEEotC,EAAY1E,GAAwB,CACxC7sP,KAAM,QACNmkN,QACA/nN,YACAiF,QACAyhO,QAAA,GACAwnB,aACAuB,SACAhB,WACAC,aAAc,QACdoB,OACAC,aAAYA,KAIZ,OAAA73B,EAAAA,EAAAA,KAACs8F,GAAA,CACC3kU,MAAO,CACLslQ,YACA+/D,eACAH,SAAqB,IAAZA,EAAmB,MAAQA,QAAW,EAC/CC,mBACAJ,oBACAE,iBACAG,YAAaA,GAAe,UAG9B1sP,UAAA2vJ,EAAAA,EAAAA,KAACw8B,GAAA,CACCv5B,UAAU,QACV2I,UACA3zF,MACAmhH,IAAK,CAAC,CAAE,yBAA0BmvE,EAAiB,oBAAqBC,GAAepvE,MACnF6D,EAAU,YACVxD,EAEHppL,SAAAA,KAAeztE,IAAQo9N,EAAAA,EAAAA,KAACy9F,GAAA,CAAkB76T,YAE/C,IAIJ0lU,GAAM95F,QAAUA,GAChB85F,GAAMrmH,YAAc,sBACpBqmH,GAAM11O,GAAKuqO,GACXmL,GAAM7uP,GAAKyjP,GACXoL,GAAM3nS,GAAKy8R,GACXkL,GAAMG,MAAQpL,GACdiL,GAAMI,MAAQpL,GACdgL,GAAMK,MAAQpL,GACd+K,GAAMM,QAAUpL,GAChB8K,GAAMO,gBAAkBd,GACxBO,GAAMQ,aAAerL,GCzPrB,MAiMA,GAjMyB,CACvBsL,OACE7lE,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA9yL,SAAA,EACE6yL,EAAAA,EAAAA,MAAA,KAAA7yL,SAAA,CAAG,yJAIDgzL,EAAAA,EAAAA,KAAA,SAAM,KAACA,EAAAA,EAAAA,KAAA,SAAM,wXAObA,EAAAA,EAAAA,KAAA,SAAM,KAACA,EAAAA,EAAAA,KAAA,SAAM,kLAGbA,EAAAA,EAAAA,KAAA,UACAH,EAAAA,EAAAA,MAAA,MAAA7yL,SAAA,EACEgzL,EAAAA,EAAAA,KAAA,MAAAhzL,SAAI,0CACJgzL,EAAAA,EAAAA,KAAA,MAAAhzL,SAAI,mDAEdgzL,EAAAA,EAAAA,KAAA,SAAM,KAACA,EAAAA,EAAAA,KAAA,SAAM,4JAILA,EAAAA,EAAAA,KAAA,UACAA,EAAAA,EAAAA,KAAA,UACAH,EAAAA,EAAAA,MAAA,QAAMn2P,MAAO,CAAEi8T,eAAgB,aAAc34P,SAAA,CAAC,0BACtBgzL,EAAAA,EAAAA,KAAA,QAAMt2P,MAAO,CAAEyF,MAAO,WAAY69D,SAAC,WAAc,IAAI,2BACpDgzL,EAAAA,EAAAA,KAAA,QAAMt2P,MAAO,CAAEyF,MAAO,WAAY69D,SAAC,aAE5DgzL,EAAAA,EAAAA,KAAA,UACAA,EAAAA,EAAAA,KAAA,SAAM,+KAKRA,EAAAA,EAAAA,KAAA,UACAH,EAAAA,EAAAA,MAAColE,GAAK,CAACxgU,UAAU,cAAauoE,SAAA,EAC5BgzL,EAAAA,EAAAA,KAAA,SAAAhzL,UACE6yL,EAAAA,EAAAA,MAAA,MAAA7yL,SAAA,EACEgzL,EAAAA,EAAAA,KAAA,MAAAhzL,SAAI,aACJgzL,EAAAA,EAAAA,KAAA,MAAAhzL,SAAI,YACJgzL,EAAAA,EAAAA,KAAA,MAAAhzL,SAAI,mBAGR6yL,EAAAA,EAAAA,MAAA,SAAA7yL,SAAA,EACEgzL,EAAAA,EAAAA,KAAA,MAAAhzL,UACEgzL,EAAAA,EAAAA,KAAA,MAAI+jB,QAAS,EAAGr6Q,MAAO,CAAE60F,WAAY,QAASvxB,SAAC,yBAIjD6yL,EAAAA,EAAAA,MAAA,MAAA7yL,SAAA,EACEgzL,EAAAA,EAAAA,KAAA,MAAAhzL,UACEgzL,EAAAA,EAAAA,KAAA,QAAMt2P,MAAO,CAAEi8T,eAAgB,YAAax2T,MAAO,WAAY69D,SAAC,oCAIlEgzL,EAAAA,EAAAA,KAAA,MAAAhzL,SAAI,mHAIJgzL,EAAAA,EAAAA,KAAA,MAAAhzL,SAAI,oCAEN6yL,EAAAA,EAAAA,MAAA,MAAA7yL,SAAA,EACEgzL,EAAAA,EAAAA,KAAA,MAAAhzL,UACEgzL,EAAAA,EAAAA,KAAA,QAAMt2P,MAAO,CAAEi8T,eAAgB,YAAax2T,MAAO,WAAY69D,SAAC,8BAIlEgzL,EAAAA,EAAAA,KAAA,MAAAhzL,SAAI,mHAIJgzL,EAAAA,EAAAA,KAAA,MAAAhzL,SAAI,oCAENgzL,EAAAA,EAAAA,KAAA,MAAAhzL,UACEgzL,EAAAA,EAAAA,KAAA,MAAI+jB,QAAS,EAAGr6Q,MAAO,CAAE60F,WAAY,QAASvxB,SAAC,WAIjD6yL,EAAAA,EAAAA,MAAA,MAAA7yL,SAAA,EACEgzL,EAAAA,EAAAA,KAAA,MAAAhzL,SAAI,cACJ6yL,EAAAA,EAAAA,MAAA,MAAA7yL,SAAA,CAAI,gDAEFgzL,EAAAA,EAAAA,KAAA,KACE5hO,KAAK,yBACL90B,OAAO,SACP2M,IAAI,sBAAqB+2D,SAC1B,WAEG,mBAGNgzL,EAAAA,EAAAA,KAAA,MAAAhzL,SAAI,+BAEN6yL,EAAAA,EAAAA,MAAA,MAAA7yL,SAAA,EACEgzL,EAAAA,EAAAA,KAAA,MAAAhzL,SAAI,eACJgzL,EAAAA,EAAAA,KAAA,MAAAhzL,SAAI,oFAIJgzL,EAAAA,EAAAA,KAAA,MAAAhzL,SAAI,+BAMd44P,UACE/lE,EAAAA,EAAAA,MAAA,OAAA7yL,SAAA,EACE6yL,EAAAA,EAAAA,MAAA,KAAA7yL,SAAA,CAAG,+FAEiBgzL,EAAAA,EAAAA,KAAA,UAClBA,EAAAA,EAAAA,KAAA,KAAAhzL,SAAG,qBACHgzL,EAAAA,EAAAA,KAAA,SAAM,oNAKRA,EAAAA,EAAAA,KAAA,OACEt/N,IAAI,oCACJwmP,IAAI,uBACJx9Q,MAAO,CAAEo0B,MAAO,OAAQC,OAAQ,WAElCiiO,EAAAA,EAAAA,KAAA,UACAA,EAAAA,EAAAA,KAAA,UACAH,EAAAA,EAAAA,MAAA,KAAA7yL,SAAA,EACEgzL,EAAAA,EAAAA,KAAA,KAAAhzL,SAAG,+DACHgzL,EAAAA,EAAAA,KAAA,SAAM,8RAMRA,EAAAA,EAAAA,KAAA,OACEt/N,IAAI,oCACJwmP,IAAI,uBACJx9Q,MAAO,CAAEo0B,MAAO,OAAQC,OAAQ,WAElCiiO,EAAAA,EAAAA,KAAA,UACAA,EAAAA,EAAAA,KAAA,UACAH,EAAAA,EAAAA,MAAA,KAAA7yL,SAAA,EACEgzL,EAAAA,EAAAA,KAAA,KAAAhzL,SAAG,8CACHgzL,EAAAA,EAAAA,KAAA,SAAM,0JAKRA,EAAAA,EAAAA,KAAA,OACEt/N,IAAI,oCACJwmP,IAAI,uBACJx9Q,MAAO,CAAEo0B,MAAO,OAAQC,OAAQ,WAElCiiO,EAAAA,EAAAA,KAAA,OACEt/N,IAAI,oCACJwmP,IAAI,uBACJx9Q,MAAO,CAAEo0B,MAAO,OAAQC,OAAQ,WAElCiiO,EAAAA,EAAAA,KAAA,UACAA,EAAAA,EAAAA,KAAA,UACAH,EAAAA,EAAAA,MAAA,KAAA7yL,SAAA,EACEgzL,EAAAA,EAAAA,KAAA,KAAAhzL,SAAG,mDACHgzL,EAAAA,EAAAA,KAAA,SAAM,0PAMRA,EAAAA,EAAAA,KAAA,OACEt/N,IAAI,oCACJwmP,IAAI,uBACJx9Q,MAAO,CAAEo0B,MAAO,OAAQC,OAAQ,aAItC8nS,SACE7lE,EAAAA,EAAAA,KAAA,OAAAhzL,UACE6yL,EAAAA,EAAAA,MAAA,KAAA7yL,SAAA,CAAG,gCAC6B,KAC9BgzL,EAAAA,EAAAA,KAAA,KACE5hO,KAAK,0PACL90B,OAAO,SACP2M,IAAI,sBAAqB+2D,SAC1B,oBAEG,UClCZ,GArJyB84P,KACvB,MAAO57B,EAAQE,IAAan7E,EAAAA,EAAAA,WAAS,IAC9B82G,EAAcC,IAAmB/2G,EAAAA,EAAAA,UAAc,OAC/Cg3G,EAAYC,IAAiBj3G,EAAAA,EAAAA,UAAS,UACtCk3G,EAAcC,IAAmBn3G,EAAAA,EAAAA,UAAwB,MAE1Do3G,EAAYA,CAAC1tR,EAAc2tR,KAG/B,OAFAN,EAAgBrtR,GAChBytR,EAAgBE,GACRA,GACN,IAAK,QASL,QACEJ,EAAc,eAPhB,IAAK,WACHA,EAAc,cACd,MACF,IAAK,UACHA,EAAc,cAMlB97B,GAAU,EAAK,EAQjB,OACEvqC,EAAAA,EAAAA,MAAA,OAAKp7P,UAAU,oBAAmBuoE,SAAA,EAEhC6yL,EAAAA,EAAAA,MAACH,GAAK,CAACh2P,MAAO,CAAE68T,aAAc,SAAU1N,UAAW,UAAW7rP,SAAA,EAC5DgzL,EAAAA,EAAAA,KAAChB,GAAM,CACLt1P,MAAO,CACLo0B,MAAO,SACPC,OAAQ,SACR5uB,MAAO,QACPo+O,gBACmB,UAAjB44E,EAA2B,UAAY,WAE3CnyG,QAASA,IAAMqyG,EAAUG,GAAiBd,MAAO,SAAS14P,SAC3D,WAGDgzL,EAAAA,EAAAA,KAAChB,GAAM,CACLt1P,MAAO,CACLo0B,MAAO,SACPC,OAAQ,SACR5uB,MAAO,QACPo+O,gBACmB,aAAjB44E,EAA8B,UAAY,WAE9CnyG,QAASA,IAAMqyG,EAAUG,GAAiBZ,SAAU,YAAY54P,SACjE,gBAGDgzL,EAAAA,EAAAA,KAAChB,GAAM,CACLt1P,MAAO,CACLo0B,MAAO,SACPC,OAAQ,SACR5uB,MAAO,QACPo+O,gBACiB,YAAjB44E,EAA6B,UAAY,WAE3CnyG,QAASA,IAAMqyG,EAAUG,GAAiBX,QAAS,WAAW74P,SAC/D,mBAMH6yL,EAAAA,EAAAA,MAACm9C,GAAK,CACJ9S,OAAQA,EACRlgC,QAlDay8D,KACjBr8B,GAAU,GACVg8B,EAAgB,KAAK,EAiDjBrmE,MAAOkmE,EACPlqQ,KAAK,KACLkhP,aAAc,CACZ9tS,MAAO,2BACP4lJ,QAAS,EACT1rJ,KAAM,GAER4yS,UAAQ,EACR/nD,OAAQ,CACNv7M,QAAS,CACPhvC,QAAS,OACTwuQ,cAAe,SACfp6O,OAAQ,QAEVzgC,KAAM,CACJytR,UAAW,OACXjqE,KAAM,EACN6/G,cAAe,IAEjB3zP,SAAA,EAEFgzL,EAAAA,EAAAA,KAACzF,GAAI,CAACx+L,KAAK,KAAKryD,MAAO,CAAEo3M,KAAM,EAAGiqE,UAAW,OAAQ41C,cAAe,KAAM3zP,SAAE+4P,KAE5ElmE,EAAAA,EAAAA,MAACH,GAAK,CACJh2P,MAAO,CACLyS,SAAU,WACVu9E,OAAQ,GACRpN,MAAO,GACPD,KAAM,GACN1iF,QAAS,OACTmvT,eAAgB,YAChB9rP,SAAA,EAEJgzL,EAAAA,EAAAA,KAAChB,GAAM,CACLt1P,MAAO,CACLo0B,MAAO,SACP3uB,MAAO,QACPo+O,gBACmB,UAAjB44E,EAA2B,UAAY,WAE3CnyG,QAASA,IAAMqyG,EAAUG,GAAiBd,MAAO,SAAS14P,SAC3D,WAGDgzL,EAAAA,EAAAA,KAAChB,GAAM,CACLt1P,MAAO,CACLo0B,MAAO,SACP3uB,MAAO,QACPo+O,gBACmB,aAAjB44E,EAA8B,UAAY,WAE9CnyG,QAASA,IAAMqyG,EAAUG,GAAiBZ,SAAU,YAAY54P,SACjE,gBAGDgzL,EAAAA,EAAAA,KAAChB,GAAM,CACLt1P,MAAO,CACLo0B,MAAO,SACP3uB,MAAO,QACPo+O,gBACiB,YAAjB44E,EAA6B,UAAY,WAE3CnyG,QAASA,IAAMqyG,EAAUG,GAAiBX,QAAS,WAAW74P,SAC/D,uBAKC,EC5FV,SAvDA,MACE,cAAO/jE,GACL,MAAO,CACLrE,KAAM,oBACNgD,SAAU,CACR,CACEhD,KAAM,UACNkF,WAAY,CAAEzB,KAAM,oBACpBpB,SAAU,CAAErC,KAAM,QAASsC,YAAa,CAAC,YAAa,YAExD,CACEtC,KAAM,UACNkF,WAAY,CAAEzB,KAAM,aACpBpB,SAAU,CAAErC,KAAM,QAASsC,YAAa,CAAC,YAAa,aAExD,CACEtC,KAAM,UACNkF,WAAY,CAAEzB,KAAM,kBACpBpB,SAAU,CAAErC,KAAM,QAASsC,YAAa,CAAC,YAAa,aAExD,CACEtC,KAAM,UACNkF,WAAY,CAAEzB,KAAM,eACpBpB,SAAU,CAAErC,KAAM,QAASsC,YAAa,CAAC,YAAa,aAExD,CACEtC,KAAM,UACNkF,WAAY,CAAEzB,KAAM,iBACpBpB,SAAU,CAAErC,KAAM,QAASsC,YAAa,CAAC,YAAa,aAExD,CACEtC,KAAM,UACNkF,WAAY,CAAEzB,KAAM,iBACpBpB,SAAU,CAAErC,KAAM,QAASsC,YAAa,CAAC,YAAa,aAExD,CACEtC,KAAM,UACNkF,WAAY,CAAEzB,KAAM,uBACpBpB,SAAU,CAAErC,KAAM,QAASsC,YAAa,CAAC,YAAa,aAExD,CACEtC,KAAM,UACNkF,WAAY,CAAEzB,KAAM,wBACpBpB,SAAU,CAAErC,KAAM,QAASsC,YAAa,CAAC,YAAa,aAExD,CACEtC,KAAM,UACNkF,WAAY,CAAEzB,KAAM,iBACpBpB,SAAU,CAAErC,KAAM,QAASsC,YAAa,CAAC,YAAa,cAI9D,GCeF,GA5DkD20B,IAI3C,IAJ4C,KACjDt8B,EAAI,eACJgoJ,EAAiB,GAAE,cACnBE,EAAgB,IACjB5rH,EACC,OACEmkO,EAAAA,EAAAA,KAAAF,EAAAA,SAAA,CAAA9yL,UAEE6yL,EAAAA,EAAAA,MAAC/+N,GAAM,CACLzkC,GAAG,WACHuI,KAAK,UACLrF,KAAMA,EACN8qI,SAAS,EACTkd,eAAgBA,EAChBE,cAAeA,EAAcz6E,SAAA,EAE7BgzL,EAAAA,EAAAA,KAAC1yI,GAAK,CACJjxH,GAAG,iBACHuI,KAAK,SACLxM,OAAQ,CAAC,MAAO,eAChBqgE,MAAO,CACL,eAAgB,CACd,OACA,CAAC,MAAO,eACR,UACA,GACA,UACA,GACA,WAEF,gBAAiB,CAAC,OAAQ,CAAC,MAAO,eAAgB,GAAI,GAAI,GAAI,GAAI,QAGtEunM,EAAAA,EAAAA,KAAC1yI,GAAK,CACJjxH,GAAG,sBACHuI,KAAK,SACLxM,OAAQ,CAAC,MAAO,eAChBmgE,OAAQ,CACN,aAAc,4BACd,YAAa,CAAC,sBAAuB,yBACrC,YAAa,OAIjBynM,EAAAA,EAAAA,KAAC1yI,GAAK,CACJjxH,GAAG,oBACHuI,KAAK,SACLxM,OAAQ,CAAC,IAAK,CAAC,MAAO,gBACtBqgE,MAAO,CACL,eAAgB,UAChB,gBAAiB,GACjB,sBAAuB,EACvB,sBAAuB,cAI5B,EClBDiuQ,GAAuB1hT,6FAKvB2hT,GAQF,CACFjpU,UAAW,kBACXD,UAAW,mBACXE,KAAM,GACN08C,QAAS,EACTgQ,MAAO,GACP4kF,WAAW,EACX23L,OAAQ,CAAC,oBAAqB,oBAG1BtzP,GAAmC,CACvC,CAAC,oBAAqB,mBACtB,CAAC,mBAAoB,mBA81BvB,GA31ByB+wL,KAAO,IAADwiE,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAC7B,MAAMC,GAASn4G,EAAAA,EAAAA,QAAe,OAEvBo4G,EAAiBC,IACtBp4G,EAAAA,EAAAA,UAAsC,OACjCq4G,EAAaC,IAAkBt4G,EAAAA,EAAAA,WAAkB,IAEjDu4G,EAAaC,IAAkBx4G,EAAAA,EAAAA,UAAc,OAC7Cy4G,EAASC,IAAc14G,EAAAA,EAAAA,UAAc,OACrC24G,EAAaC,IAAkB54G,EAAAA,EAAAA,UAAc,OAC7C64G,EAAcC,IAAmB94G,EAAAA,EAAAA,UAAc,OAC/C+4G,EAAUC,IAAeh5G,EAAAA,EAAAA,WAAS,IAClCi5G,EAAaC,IAAkBl5G,EAAAA,EAAAA,WAAS,IACxCm5G,EAAWC,IAAgBp5G,EAAAA,EAAAA,UAAc03G,GAAahpU,MAEvD2qU,EAAaC,GAAWt/T,WAEvBu/T,EAAkBC,GAAuB99E,EAAAA,YAC9C,CAAC7rO,EAAYuwO,KAAY,IAAWvwO,KAAUuwO,KAC9C,CAAC,GAGGq5E,GAAiBl6G,EAAAA,EAAAA,cAAajxN,IAA+B,IAADorU,EAEhE,MAAMlpU,EAAwB,QAAjBkpU,EAAGprU,EAAMqK,gBAAQ,IAAA+gU,OAAA,EAAdA,EAAiB,GAC7BlpU,GACF8nU,GAAe,GACfF,EAAmB5nU,IAEnB8nU,GAAe,EACjB,GACC,IAUGtmC,GAAkBzyE,EAAAA,EAAAA,cAAajxN,IAA+B,IAADqrU,EACjE,MAAMnyU,EAAoB,QAAjBmyU,EAAGzB,EAAOrhQ,eAAO,IAAA8iQ,OAAA,EAAdA,EAAgBtgE,SAC5B,IAAK7xQ,EACH,OAGeA,EAAI6uJ,sBAAsB/nJ,EAAM0gD,MAAO,CACtDwxB,OAAQ,CAAC,kBAAmB,oBAGjB96E,OAAS,IAEpB8B,EAAIwyJ,YAAYv/I,MAAMm9P,OAAS,UACjC,GACC,KAEHn4C,EAAAA,EAAAA,YAAU,KAAO,IAADm6G,EACd,MAAMpyU,EAAoB,QAAjBoyU,EAAG1B,EAAOrhQ,eAAO,IAAA+iQ,OAAA,EAAdA,EAAgBvgE,SAEtBwgE,EAAqB,SAACryU,EAAS4R,EAAUgK,GAA0B,IAAjB02T,EAAOrxU,UAAA/C,OAAA,QAAA4C,IAAAG,UAAA,GAAAA,UAAA,GAAG,EAChE,OAAO,IAAI4I,SAAQ,CAACC,EAASC,KAC3B,MAAMwoU,EAAeC,IACfxyU,EAAIgmG,SAASp0F,IACjB5R,EAAIg+M,UAAUpiM,GAAK,CAAC3L,EAAWowC,KACzBpwC,EACEuiU,EAAa,GACfxiU,QAAQgY,KAAK,2BAAD5pB,OAA4BwT,EAAI,SAC5C9M,YAAW,IAAMytU,EAAYC,EAAa,IAAI,OAE9CxiU,QAAQC,MAAM,yBAAD7R,OAA0BwT,EAAI,MAAM3B,GACjDlG,EAAOkG,KAINjQ,EAAIgmG,SAASp0F,IAChB5R,EAAIo8I,SAASxqI,EAAMyuC,GAErBv2C,GAAQ,GAAK,GACb,EAEJyoU,EAAYD,EAAQ,GAExB,EAGMG,EAAgB9rF,UACpB,UACQ0rF,EACJryU,EACA,kBACA,0CAEIqyU,EACJryU,EACA,mBACA,oCAEJ,CAAE,MAAOiQ,GACPD,QAAQC,MAAM,oCAAqCA,EACrD,GAKF,OAFG,OAAHjQ,QAAG,IAAHA,GAAAA,EAAK8P,GAAG,OAAQ2iU,GAET,KACF,OAAHzyU,QAAG,IAAHA,GAAAA,EAAKkS,IAAI,OAAQugU,EAAc,CAChC,GACA,CAACd,IAEJ,MAAMe,GAAmB36G,EAAAA,EAAAA,cAAY,KAAO,IAAD46G,EACzC,MAAM3yU,EAAoB,QAAjB2yU,EAAGjC,EAAOrhQ,eAAO,IAAAsjQ,OAAA,EAAdA,EAAgB9gE,SACvB7xQ,IAGLA,EAAIwyJ,YAAYv/I,MAAMm9P,OAAS,GAAE,GAChC,IAEGwiE,GAAY76G,EAAAA,EAAAA,cAAY,KAAO,IAAD86G,EAClC,MAAM7yU,EAAoB,QAAjB6yU,EAAGnC,EAAOrhQ,eAAO,IAAAwjQ,OAAA,EAAdA,EAAgBhhE,SACxB7xQ,GACFA,EAAI+K,MAAM,CACR0I,OAAQy8T,GAAaC,OACrBjpU,KAAMgpU,GAAahpU,KACnB0sD,MAAOs8Q,GAAat8Q,MACpBhQ,QAASssR,GAAatsR,QACtB6tJ,WAAW,GAEf,GACC,IAwDGqhI,EAAkCnsF,UAEtC,MAAM3/I,EAAiB,CAAC,6FAAD,yqBAWvB,IAEE,MAAM+rO,QAAqClpU,QAAQ+sD,IACjDowC,EAAKhnG,KAAK4b,GAAQyvB,MAAMzvB,MAO1B,GAHwBm3T,EAAiBpxU,QACtCqT,IAAcA,EAAS42B,KAEN1tC,OAAS,EAC3B,MAAM,IAAIwB,MAAM,8CAIlB,MAAMszU,QAA4BnpU,QAAQ+sD,IACxCm8Q,EAAiB/yU,KAAKgV,GAAaA,EAAS+2B,UAG9C,IAAIknS,EAA2C,KAE/C,IAEE,MAAMj+T,QAAiBq2B,MAvPG9c,gGAyP1B,IAAKvZ,EAAS42B,GAAI,CAChB,MAAM76B,QAAaiE,EAASjE,OAE5B,MADAf,QAAQC,MAAM,kBAAmBc,GAC3B,IAAIrR,MAAM,8CAADtB,OACiC4W,EAASzM,QAE3D,CAGA0qU,QAAsBj+T,EAAS+2B,OAG/B,MAAMmnS,QAAqB7nS,MApQF9c,mGAsQzB,IAAK2kT,EAAatnS,GAAI,CACpB,MAAMunS,QAAiBD,EAAaniU,OAEpC,MADAf,QAAQC,MAAM,iCAAkCkjU,GAC1C,IAAIzzU,MAAM,yDAADtB,OAC4C80U,EAAa3qU,QAE1E,CAEA,MAEM6qU,EAAW,CACfjlU,KAAM,oBACNgD,gBAJ0B+hU,EAAannS,QAIf/rC,KAAK4L,IAAS,CACpCuC,KAAM,UACNqC,SAAU5E,EAAKynU,cACfhgU,WAAY,CACVigU,UAAW1nU,EAAK0nU,UAChBC,MAAO3nU,EAAK2nU,YAIlBjC,EAAgB8B,EAClB,CAAE,MAAOnjU,GACPD,QAAQC,MACN,sDACAA,EAEJ,CACA,MAAMujU,EAA4D,CAAC,EAC/DP,GAAgBA,EAAa9hU,UAC/B8hU,EAAa9hU,SAASoD,SAASvL,IAC7B,MAAMyqU,EAAMzqU,EAAQqK,WAAWqgU,WAC/BF,EAAmBC,GAAOzqU,CAAO,IAGrC,MAAM2qU,EAA8C,GAC9CC,EAAkB,IAAIhhS,IAEtBihS,EAA2B,CAC/B1lU,KAAM,oBACNgD,SAAU6hU,EAASxjN,SAAS0sG,GACnBA,EAAQ/qN,SAASnR,KAAKgJ,IAC3B,MAAM8qU,EAAa9qU,EAAQqK,WAAWqgU,WAEhCK,EAAkBP,EAAmBM,GAC3C,GAAIC,EAAiB,CAEdH,EAAgBtzT,IAAIwzT,KACvBH,EAAsBvzU,KAAK2zU,GAC3BH,EAAgBnlU,IAAIqlU,IAItB,MAAME,GApIhBC,EAqIYF,EAAgB1gU,WApI5B6gU,EAqIYlrU,EAAQqK,WAnIb,CACLqgU,WAAYO,EAAaP,WACzBS,iBAAkBF,EAAaE,iBAC/BC,kBAAmBH,EAAaG,kBAChCC,WAAYJ,EAAaI,WACzBC,SAAUL,EAAaK,SACvBC,WAAYN,EAAaM,WACzBC,OAAQP,EAAaO,OACrBxqD,YAAaiqD,EAAajqD,YAC1ByqD,SAAUR,EAAaQ,SACvBC,SAAUT,EAAaS,SACvBC,eAAgBV,EAAaW,WAC7BC,eACInuT,OADYwtT,EACLA,EAAcY,UACdb,EAAaY,gBACxBE,cAAed,EAAae,SAC5BC,UAAWhB,EAAaiB,WACxBC,YAAalB,EAAakB,YAC1BC,OAAQnB,EAAamB,OACrBC,OAAQpB,EAAaoB,OACrBC,WAAYrB,EAAaqB,aAkHjB,MAAO,IACFtsU,EACHqK,WAAY,IACP2gU,GAGT,CAhJyBuB,IACjCtB,EACAC,EA+IQ,OAAOlrU,CAAO,OAMpBgoU,EAAe6C,GAEf,MAAM2B,EAAmB,CACvBrnU,KAAM,oBACNgD,SAAUwiU,EAAsB3zU,KAAKgJ,IAAO,CAC1CmF,KAAM,UACNqC,SAAUxH,EAAQqK,WAAW8hU,YAC7B9hU,WAAY,CACVoiU,IAAKzsU,EAAQqK,WAAWqgU,WACxBS,iBAAkBnrU,EAAQqK,WAAW8gU,iBACrCK,OAAQxrU,EAAQqK,WAAWmhU,OAC3BkB,WAAY1sU,EAAQqK,WAAWghU,WAC/BI,SAAUzrU,EAAQqK,WAAWohU,SAC7BC,SAAU1rU,EAAQqK,WAAWqhU,SAC7B7iU,KAAM7I,EAAQqK,WAAW24Q,WAI/BklD,EAAWsE,EACb,CAAE,MAAOvlU,GACPD,QAAQC,MAAM,kDAAmDA,EACnE,GAII0lU,GAAmB59G,EAAAA,EAAAA,cAAY,KAAO,IAAD69G,EACzC,MAAM51U,EAAoB,QAAjB41U,EAAGlF,EAAOrhQ,eAAO,IAAAumQ,OAAA,EAAdA,EAAgB/jE,SAC5B,GAAI7xQ,EAAK,CACP,MAAM61U,EAAS71U,EAAIoH,UACnBwqU,EAAaiE,EACf,IACC,IAEGC,GAAiB/9G,EAAAA,EAAAA,cAAY,KACjC,IAAKk5G,IAAYP,EAAOrhQ,SAAYsiQ,EAAY,IAAMA,EAAY,GAChE,OAEF,MAAM3xU,EAAM0wU,EAAOrhQ,QAAQwiM,SAG3B,IAAIgiC,EAEFA,EADE89B,EAAY,IACI,GACTA,EAAY,IACH,IACTA,EAAY,IACH,GACTA,EAAY,IACH,KAEA,IAKpB,MAAMoE,EAAe9E,EAAQ9/T,SAC1BnR,KAAKgJ,IACJ,MAAO4rE,EAAKzgE,GAAOnL,EAAQwH,SAASC,YAEpC,GACiB,kBAARmkE,GACQ,kBAARzgE,GACPwP,MAAMixD,IACNjxD,MAAMxP,GAMN,OAAO,KAGT,IAAI6hU,EASAC,EAWAC,EAnBJ,IAEEF,EAAah2U,EAAI04E,QAAQ,CAAC9D,EAAKzgE,GACjC,CAAE,MAAOlE,GAEP,OAAO,IACT,CAGA,IAEEgmU,EAAqBD,EAAWvnU,IAC9B,IAAIpD,KAAAA,OAAe,EAAGwoS,GAE1B,CAAE,MAAO5jS,GAEP,OAAO,IACT,CAGA,IAEEimU,EAAmBl2U,EAAI4tG,UAAUqoO,EACnC,CAAE,MAAOhmU,GAEP,OAAO,IACT,CAGA,GAAI0T,MAAMuyT,EAAiBhiU,MAAQyP,MAAMuyT,EAAiB/hU,KAExD,OAAO,KAUT,OALiBgY,KAAKmF,KACpBnF,KAAKyO,IAAIs7S,EAAiBhiU,IAAM0gE,EAAK,GACnCzoD,KAAKyO,IAAIs7S,EAAiB/hU,IAAMA,EAAK,IAHrB,IAQX,KAGF,CACLhG,KAAM,UACNqC,SAAU,CACRrC,KAAM,aACNsC,YAAa,CACX,CAACmkE,EAAKzgE,GACN,CAAC+hU,EAAiBhiU,IAAKgiU,EAAiB/hU,OAG5Cd,WAAY,CACV8gU,iBAAkBnrU,EAAQqK,WAAW8gU,kBAExC,IAEFxyU,QAAQqH,GAA6B,OAAZA,IAE5BooU,EAAe,CACbjjU,KAAM,oBACNgD,SAAU4kU,GACV,GACD,CAAC9E,IA0CJ,OAxCAh5G,EAAAA,EAAAA,YAAU,KACR,GAAIy4G,EAAOrhQ,QAAS,CAClB,MAAMrvE,EAAM0wU,EAAOrhQ,QAAQwiM,SAYrBskE,EAAuBxvF,UAE3BgvF,UACMG,GAAgB,EAYxB,OAPAK,IAGAn2U,EAAI8P,GAAG,OAAQqmU,GACfn2U,EAAI8P,GAAG,OAAQqmU,GAGR,KACLn2U,EAAIkS,IAAI,OAAQikU,GAChBn2U,EAAIkS,IAAI,OAAQikU,EAAqB,CAEzC,IACC,CAACL,KAEJ79G,EAAAA,EAAAA,YAAU,KACR66G,GAAiC,GAChC,KAGDvpE,EAAAA,EAAAA,KAAAF,EAAAA,SAAA,CAAA9yL,UACEgzL,EAAAA,EAAAA,KAAC6Y,GAAgB,CACfpG,aAAc,CAAE56K,SAAU,SAAUD,WAAY,UAChDggL,OAAO,EACPzF,SAAU,EAAEnlM,UAEZ6yL,EAAAA,EAAAA,MAAA,OAAKp7P,UAAU,2BAA0BuoE,SAAA,EACvCgzL,EAAAA,EAAAA,KAAC6mB,GAAM,KACP7mB,EAAAA,EAAAA,KAAC44D,GAAY,KACb54D,EAAAA,EAAAA,KAACyB,GAAW,CAAAz0L,UACV6yL,EAAAA,EAAAA,MAACh5N,GACC,CACA+tG,IAAKuyL,EAEL3gE,iBAAkBmgE,GAClBhgE,kBAAmB+/D,GACnBjgE,SArhBezhP,qDAshBfgvM,QAAS00G,EACT9gE,YAAaq5B,EACbn5B,aAAcqhE,EACd14O,QAAS,GACTq0K,oBAAqB,CACnB,0BACA,wBACA,kBAEA,kBAGF/jG,UAAWztF,GAAOtG,SAAA,EAElBgzL,EAAAA,EAAAA,KAAC2a,GAAe,CACdhU,kBAAmB+/D,GACnBvqT,SAAS,WACTvhB,KAAM,CACJ,oBAAqB,kBAAmB,mBACvC,mBAEH4C,UAAW,CACTC,UAAW,iBACXC,UAAW,qBAGfsiQ,EAAAA,EAAAA,KAAC8lE,GAAgB,KACjB9lE,EAAAA,EAAAA,KAAChlD,GAAiB,CAAC7+L,SAAS,kBAC5B6jP,EAAAA,EAAAA,KAACzoD,GAAiB,CAACp7L,SAAS,kBAC5B6jP,EAAAA,EAAAA,KAACrlD,GAAY,CAACx+L,SAAS,kBACvB6jP,EAAAA,EAAAA,KAAC6sE,GAAW,CAAC3rD,SAAUunD,KACvB5oE,EAAAA,EAAAA,MAAA,OAAKp7P,UAAU,sBAAqBuoE,SAAA,EAClCgzL,EAAAA,EAAAA,KAACktC,GAAO,CACN5nI,MACE4iK,EAAc,eAAiB,cAEjC/rT,SAAS,MACTgxR,WAAS,EAAAngO,UAETgzL,EAAAA,EAAAA,KAAC2tC,GAAU,CACTplE,QAAQ,SACRp5N,MAAM,UACN,aAAW,MACX1K,UAAU,oBACVs3D,KAAK,KACLi4J,QAngBY84G,KAC5B3E,GAAgBvmT,IAAUA,GAAK,EAkgBgBorD,SAE7Bk7P,GAGAloE,EAAAA,EAAAA,KAACwuC,GAAW,CAACV,OAAQ,OAFrB9tC,EAAAA,EAAAA,KAACuuC,GAAc,CAACT,OAAQ,WAM9B9tC,EAAAA,EAAAA,KAACktC,GAAO,CACN5nI,MACE8iK,EAAY,GACR,uCACAJ,EACA,eACA,cAEN7rT,SAAS,MACTgxR,WAAS,EAAAngO,UAETgzL,EAAAA,EAAAA,KAAC2tC,GAAU,CACTplE,QAAQ,SACRp5N,MAAM,UACN,aAAW,MACX1K,UAAU,aACVs3D,KAAK,KACLi4J,QAjiBM+4G,KACtB9E,GAAarmT,IAAUA,GAAK,EAiiBZq+H,SAAUmoL,EAAY,GAAGp7P,SAEvBg7P,GAGAhoE,EAAAA,EAAAA,KAAC0uC,GAAO,CAACZ,OAAQ,OAFjB9tC,EAAAA,EAAAA,KAACyuC,GAAa,CAACX,OAAQ,WAM7B9tC,EAAAA,EAAAA,KAACktC,GAAO,CAAC5nI,MAAM,aAAanpJ,SAAS,MAAMgxR,WAAS,EAAAngO,UAClDgzL,EAAAA,EAAAA,KAAC2tC,GAAU,CACTplE,QAAQ,SACRp5N,MAAM,UACN,aAAW,OACX1K,UAAU,cACVs3D,KAAK,KACLi4J,QAASq1G,EAAUr8P,UAEnBgzL,EAAAA,EAAAA,KAAC2uC,GAAQ,CAACb,OAAQ,aAKvBw5B,GACCtnE,EAAAA,EAAAA,KAAA,SAAOv7P,UAAU,UAASuoE,UACxB6yL,EAAAA,EAAAA,MAAComB,GAAc,CACbC,MAAsB,OAAfkhD,QAAe,IAAfA,GAA2B,QAAZP,EAAfO,EAAiBt9T,kBAAU,IAAA+8T,OAAZ,EAAfA,EAA6B+D,iBACpC7qE,MAAsB,OAAfqnE,QAAe,IAAfA,GAA2B,QAAZN,EAAfM,EAAiBt9T,kBAAU,IAAAg9T,OAAZ,EAAfA,EAA6BoE,SACpClsU,OAAuB,OAAfooU,QAAe,IAAfA,GAA2B,QAAZL,EAAfK,EAAiBt9T,kBAAU,IAAAi9T,OAAZ,EAAfA,EAA6B8D,kBACrC1kD,eAA+B,OAAfihD,QAAe,IAAfA,GAA2B,QAAZJ,EAAfI,EAAiBt9T,kBAAU,IAAAk9T,OAAZ,EAAfA,EAA6BoE,eAAep+P,SAAA,CAE3D,KACD6yL,EAAAA,EAAAA,MAAA,KAAA7yL,SAAA,EACEgzL,EAAAA,EAAAA,KAAA,KAAAhzL,SAAG,mBAAmB,IACN,OAAfo6P,QAAe,IAAfA,GAA2B,QAAZH,EAAfG,EAAiBt9T,kBAAU,IAAAm9T,OAAZ,EAAfA,EAA6B4D,sBAEhChrE,EAAAA,EAAAA,MAAA,KAAA7yL,SAAA,EACEgzL,EAAAA,EAAAA,KAAA,KAAAhzL,SAAG,iBAAiB,IACJ,OAAfo6P,QAAe,IAAfA,GAA2B,QAAZF,EAAfE,EAAiBt9T,kBAAU,IAAAo9T,OAAZ,EAAfA,EAA6BzmD,oBAOlC,MACJ5gB,EAAAA,EAAAA,MAAC/+N,GAAM,CACLzkC,GAAG,gBACHuI,KAAK,UACLrF,KAAMioU,EACNx6P,SAAA,EAEAgzL,EAAAA,EAAAA,KAAC1yI,GAAK,IACA4tJ,GACJ3iN,OAAQ,CAAES,WAAYwvQ,EAAkC,oBAE1DxoE,EAAAA,EAAAA,KAAC1yI,GAAK,IAAK6tJ,MACXnb,EAAAA,EAAAA,KAAC1yI,GAAK,IACA8tJ,GACJ7iN,OAAQ,CAAES,WAAYwvQ,EAAiC,qBAG1DR,GAAYI,GAAa,IAAMA,GAAa,KAC3CvoE,EAAAA,EAAAA,MAAA,OAAA7yL,SAAA,EACE6yL,EAAAA,EAAAA,MAAC/+N,GAAM,CAACzkC,GAAG,WAAWuI,KAAK,UAAUrF,KAAMmoU,EAAQ16P,SAAA,EACjDgzL,EAAAA,EAAAA,KAAC1yI,GAAK,CACJjxH,GAAG,YACHuI,KAAK,SACL2zD,OAAQ,CACN,aAAc,CAAC,MAAO,QACtB,YAAa,CACX,cACA,CAAC,UACD,CAAC,QACD,GACA,GACA,GACA,IACA,GACA,GACA,GACA,KAEF,iBAAkB,aAClB,sBAAsB,EACtBS,WAAYwvQ,EAAkC,iBAEhD/vQ,MAAO,CACL,eAAgB,EAChB,iBAAkB,CAChB,cACA,CAAC,UACD,CAAC,QACD,GACA,CAAC,GAAI,IACL,GACA,CAAC,GAAI,IACL,GACA,CAAC,GAAI,KACL,GACA,CAAC,GAAI,MAEP,wBAAyB,YAE3BrgE,OAAQ,CACN,KACA,mBACA,aACA,kBACA,YACA,aACA,WACA,aACA,WACA,aACA,WACA,aACA,cACA,eAGJ4nQ,EAAAA,EAAAA,KAAC1yI,GAAK,CACJjxH,GAAG,cACHuI,KAAK,SACL2zD,OAAQ,CACN,aAAc,CAAC,MAAO,QACtB,YAAa,CACX,cACA,CAAC,UACD,CAAC,QACD,GACA,GACA,GACA,IACA,GACA,GACA,GACA,KAEF,iBAAkB,aAClB,sBAAsB,EACtBS,WAAYwvQ,EAAiC,gBAE/C/vQ,MAAO,CACL,eAAgB,EAChB,iBAAkB,CAChB,cACA,CAAC,UACD,CAAC,QACD,GACA,CAAC,GAAI,IACL,GACA,CAAC,GAAI,IACL,GACA,CAAC,GAAI,KACL,GACA,CAAC,GAAI,MAEP,wBAAyB,YAE3BrgE,OAAQ,CACN,KACA,mBACA,WACA,YACA,eAILwvU,IACC/nE,EAAAA,EAAAA,MAAC/+N,GAAM,CAACzkC,GAAG,YAAYuI,KAAK,UAAUrF,KAAMqoU,EAAY56P,SAAA,EACtDgzL,EAAAA,EAAAA,KAAC1yI,GAAK,CACJjxH,GAAG,aACHuI,KAAK,OACL2zD,OAAQ,CACN,YAAa,QACb,WAAY,QACZS,WAAYwvQ,EAAkC,iBAEhD/vQ,MAAO,CACL,aAAc,UACd,aAAc,EACd,eAAgB,IAGlB2yM,SAAS,YACThzQ,OAAQ,CACN,KACA,mBACA,aACA,kBACA,YACA,aACA,WACA,aACA,WACA,aACA,WACA,aACA,cACA,eAGJ4nQ,EAAAA,EAAAA,KAAC1yI,GAAK,CACJjxH,GAAG,eACHuI,KAAK,OACL2zD,OAAQ,CACN,YAAa,QACb,WAAY,QACZS,WAAYwvQ,EAAiC,gBAE/C/vQ,MAAO,CACL,aAAc,UACd,aAAc,EACd,eAAgB,IAElB2yM,SAAS,YACThzQ,OAAQ,CACN,KACA,mBACA,WACA,YACA,kBAQX4vU,GAAYI,GAAa,KAAMpoE,EAAAA,EAAAA,KAACgtE,GAAc,CAACztU,KAAMmoU,IAErDQ,IACCroE,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAA9yL,SAAA,EACEgzL,EAAAA,EAAAA,KAACl/N,GAAM,CAACzkC,GAAG,cAAcuI,KAAK,UAAUrF,KAAM+oU,EAAWt7P,UACvDgzL,EAAAA,EAAAA,KAAC1yI,GAAK,CACJjxH,GAAG,mBACHuI,KAAK,SACL2zD,OAAQ,CACN,aAAc,CAAC,MAAO,QACtB,YAAa,GACb,YAAa,CACX,iBACA,yBAEF,cAAe,CAAC,EAAG,GACnB,cAAe,OAEjBE,MAAO,CACL,aAAc,UACd,kBAAmB,UACnB,kBAAmB,QAIzBunM,EAAAA,EAAAA,KAACl/N,GAAM,CACLzkC,GAAG,uBACHuI,KAAK,UACLrF,KAAMuoU,EAAa96P,UAEnBgzL,EAAAA,EAAAA,KAAC1yI,GAAK,CACJjxH,GAAG,iBACHuI,KAAK,OACL6zD,MAAO,CACL,aAAc,UACd,aAAc,EACd,eAAgB,qBAUjC,ECh6BA,SAASw0Q,KAEd,OACEjtE,EAAAA,EAAAA,KAAAF,EAAAA,SAAA,CAAA9yL,UACEgzL,EAAAA,EAAAA,KAACqE,GAAM,KAGb,CCLA,MAAM1qB,I7UkQJhI,G6UlQiC,CACjC,CACEt8O,KAAM,IACN+Q,SAAS45P,EAAAA,EAAAA,KAACitE,GAAO,KAEnB,CACE53U,KAAM,QACN+Q,SAAS45P,EAAAA,EAAAA,KAACuB,GAAQ,M7U8PbvpB,GAAa,CAClB3F,SAAU,MAAA3zO,QAAA,EAAAA,GAAM2zO,SAChBqG,OAAMvI,GAAA,GACD,MAAAzxO,QAAA,EAAAA,GAAMg6O,OAAM,CACfI,oBAAoB,IAEtBjhD,QAAS43C,GAAqB,CAAExvO,OAAQ,MAAAvB,QAAA,EAAAA,GAAMuB,SAC9Cq5O,eAAe,MAAA56O,QAAA,EAAAA,GAAM46O,gBAAiBiW,KACtC5d,6BACAu7F,GACA10F,sBAAuB,MAAA95O,QAAA,EAAAA,GAAM85O,sBAC7Bv4O,OAAQ,MAAAvB,QAAA,EAAAA,GAAMuB,SACb6iP,cAhBW,IACdnR,GACAjzO,G6UxPK,SAASowP,KACd,OAAOkR,EAAAA,EAAAA,KAACxP,GAAc,CAAC7W,OAAQA,IACjC,CCfO,MAAMxT,GAAoB,CAE/B3oK,WAAY,CACV0vO,QAAS,CACPh5C,OAAS/tB,IAAU,CACjB4jE,QAAS,CACPx8C,gBAAiBpnB,EAAMgB,OAAOl5L,KAAK,GACnC9+B,MAAOg3N,EAAMxyL,MACb6qD,SAAU,OACVk3K,aAAc,MACd/sC,OAAQ,kBACR1sN,QAAS,UACT05P,UAAWxvC,EAAM6D,QAAQt+I,IAE3B+rM,MAAO,CACLlqC,gBAAiBpnB,EAAMgB,OAAOl5L,KAAK,SCT9B,SAASk/R,KACtB,OACEntE,EAAAA,EAAAA,KAAA,OAAK3jQ,GAAG,iBAAgB2wE,UACtBgzL,EAAAA,EAAAA,KAAC7xB,EAAe,CAAChI,MAAOA,GAAMn5J,UAC5BgzL,EAAAA,EAAAA,KAAClR,GAAM,OAIf,CCdA,MAYA,GAZyBs+E,IACnBA,GAAeA,aAAuBrwT,UACxC,6BAAqBlW,MAAKg1B,IAAkD,IAAjD,OAAEwxS,EAAM,OAAEC,EAAM,OAAEC,EAAM,OAAEC,EAAM,QAAEC,GAAS5xS,EACpEwxS,EAAOD,GACPE,EAAOF,GACPG,EAAOH,GACPI,EAAOJ,GACPK,EAAQL,EAAY,GAExB,ECLWh9E,EAAAA,WACXxtP,SAASkmJ,eAAe,SAErBxmJ,QACH09P,EAAAA,EAAAA,KAACrV,EAAAA,WAAgB,CAAA39K,UACfgzL,EAAAA,EAAAA,KAACmtE,GAAG,OAORO","sources":["../node_modules/@mapbox/fusspot/lib/index.js","../node_modules/@mapbox/fusspot/node_modules/is-plain-obj/index.js","../node_modules/@mapbox/mapbox-gl-geocoder/lib/events.js","../node_modules/@mapbox/mapbox-gl-geocoder/lib/exceptions.js","../node_modules/@mapbox/mapbox-gl-geocoder/lib/geolocation.js","../node_modules/@mapbox/mapbox-gl-geocoder/lib/index.js","../node_modules/@mapbox/mapbox-gl-geocoder/lib/localization.js","../node_modules/@mapbox/mapbox-gl-geocoder/lib/utils.js","../node_modules/@mapbox/mapbox-sdk/index.js","../node_modules/@mapbox/mapbox-sdk/lib/browser/browser-client.js","../node_modules/@mapbox/mapbox-sdk/lib/browser/browser-layer.js","../node_modules/@mapbox/mapbox-sdk/lib/classes/mapi-client.js","../node_modules/@mapbox/mapbox-sdk/lib/classes/mapi-error.js","../node_modules/@mapbox/mapbox-sdk/lib/classes/mapi-request.js","../node_modules/@mapbox/mapbox-sdk/lib/classes/mapi-response.js","../node_modules/@mapbox/mapbox-sdk/lib/constants.js","../node_modules/@mapbox/mapbox-sdk/lib/helpers/parse-headers.js","../node_modules/@mapbox/mapbox-sdk/lib/helpers/parse-link-header.js","../node_modules/@mapbox/mapbox-sdk/lib/helpers/url-utils.js","../node_modules/@mapbox/mapbox-sdk/node_modules/eventemitter3/index.js","../node_modules/@mapbox/mapbox-sdk/services/geocoding.js","../node_modules/@mapbox/mapbox-sdk/services/service-helpers/create-service-factory.js","../node_modules/@mapbox/mapbox-sdk/services/service-helpers/object-map.js","../node_modules/@mapbox/mapbox-sdk/services/service-helpers/pick.js","../node_modules/@mapbox/mapbox-sdk/services/service-helpers/stringify-booleans.js","../node_modules/@mapbox/mapbox-sdk/services/service-helpers/validator.js","../node_modules/@mapbox/parse-mapbox-token/index.js","../node_modules/base-64/base64.js","../node_modules/events/events.js","../node_modules/fuzzy/lib/fuzzy.js","../node_modules/lodash.debounce/index.js","../node_modules/mapbox-gl/src/util/config.js","../node_modules/mapbox-gl/src/util/mapbox_url.js","../node_modules/mapbox-gl/src/util/live_performance.js","../node_modules/mapbox-gl/node_modules/gl-matrix/cjs/common.js","../node_modules/mapbox-gl/node_modules/gl-matrix/cjs/mat2.js","../node_modules/mapbox-gl/node_modules/gl-matrix/cjs/mat2d.js","../node_modules/mapbox-gl/node_modules/gl-matrix/cjs/mat3.js","../node_modules/mapbox-gl/node_modules/gl-matrix/cjs/mat4.js","../node_modules/mapbox-gl/node_modules/gl-matrix/cjs/vec3.js","../node_modules/mapbox-gl/node_modules/gl-matrix/cjs/vec4.js","../node_modules/mapbox-gl/node_modules/gl-matrix/cjs/quat.js","../node_modules/mapbox-gl/node_modules/gl-matrix/cjs/quat2.js","../node_modules/mapbox-gl/node_modules/gl-matrix/cjs/vec2.js","../node_modules/mapbox-gl/node_modules/gl-matrix/cjs/index.js","../node_modules/mapbox-gl/node_modules/@mapbox/unitbezier/index.js","../node_modules/mapbox-gl/node_modules/@mapbox/point-geometry/index.js","../node_modules/mapbox-gl/src/util/util.js","../node_modules/mapbox-gl/src/util/offscreen_canvas_supported.js","../node_modules/mapbox-gl/src/util/browser.js","../node_modules/mapbox-gl/src/util/url.js","../node_modules/mapbox-gl/src/util/tile_request_cache.js","../node_modules/mapbox-gl/src/util/webp_supported.js","../node_modules/mapbox-gl/src/util/ajax.js","../node_modules/mapbox-gl/src/util/sku_token.js","../node_modules/mapbox-gl/src/util/mapbox.js","../node_modules/mapbox-gl/node_modules/murmurhash-js/murmurhash3_gc.js","../node_modules/mapbox-gl/node_modules/murmurhash-js/murmurhash2_gc.js","../node_modules/mapbox-gl/node_modules/murmurhash-js/index.js","../node_modules/mapbox-gl/src/util/evented.js","../node_modules/mapbox-gl/node_modules/csscolorparser/csscolorparser.js","../node_modules/mapbox-gl/src/style-spec/util/color.js","../node_modules/mapbox-gl/src/style-spec/util/interpolate.js","../node_modules/mapbox-gl/src/style-spec/util/extend.js","../node_modules/mapbox-gl/src/style-spec/expression/parsing_error.js","../node_modules/mapbox-gl/src/style-spec/expression/scope.js","../node_modules/mapbox-gl/src/style-spec/expression/types.js","../node_modules/mapbox-gl/src/style-spec/expression/types/collator.js","../node_modules/mapbox-gl/src/style-spec/expression/types/formatted.js","../node_modules/mapbox-gl/src/style-spec/expression/types/resolved_image.js","../node_modules/mapbox-gl/src/style-spec/expression/values.js","../node_modules/mapbox-gl/src/style-spec/expression/definitions/literal.js","../node_modules/mapbox-gl/src/style-spec/expression/runtime_error.js","../node_modules/mapbox-gl/src/style-spec/expression/definitions/assertion.js","../node_modules/mapbox-gl/src/style-spec/expression/definitions/format.js","../node_modules/mapbox-gl/src/style-spec/expression/definitions/image.js","../node_modules/mapbox-gl/src/style-spec/util/get_type.js","../node_modules/mapbox-gl/src/style-spec/expression/definitions/coercion.js","../node_modules/mapbox-gl/src/style-spec/expression/evaluation_context.js","../node_modules/mapbox-gl/src/style-spec/expression/compound_expression.js","../node_modules/mapbox-gl/src/style-spec/expression/definitions/collator.js","../node_modules/mapbox-gl/node_modules/quickselect/quickselect.js","../node_modules/mapbox-gl/src/style-spec/util/geometry_util.js","../node_modules/mapbox-gl/src/style-spec/expression/definitions/within.js","../node_modules/mapbox-gl/node_modules/cheap-ruler/cheap-ruler.js","../node_modules/mapbox-gl/node_modules/tinyqueue/tinyqueue.js","../node_modules/mapbox-gl/src/style-spec/data/extent.js","../node_modules/mapbox-gl/src/style-spec/expression/definitions/distance.js","../node_modules/mapbox-gl/src/style-spec/expression/definitions/config.js","../node_modules/mapbox-gl/src/style-spec/expression/is_constant.js","../node_modules/mapbox-gl/src/style-spec/expression/definitions/var.js","../node_modules/mapbox-gl/src/style-spec/expression/parsing_context.js","../node_modules/mapbox-gl/src/style-spec/expression/stops.js","../node_modules/mapbox-gl/src/style-spec/expression/definitions/step.js","../node_modules/mapbox-gl/src/style-spec/util/color_spaces.js","../node_modules/mapbox-gl/src/style-spec/expression/definitions/interpolate.js","../node_modules/mapbox-gl/src/style-spec/expression/definitions/coalesce.js","../node_modules/mapbox-gl/src/style-spec/expression/definitions/let.js","../node_modules/mapbox-gl/src/style-spec/expression/definitions/at.js","../node_modules/mapbox-gl/src/style-spec/expression/definitions/in.js","../node_modules/mapbox-gl/src/style-spec/expression/definitions/index_of.js","../node_modules/mapbox-gl/src/style-spec/expression/definitions/match.js","../node_modules/mapbox-gl/src/style-spec/expression/definitions/case.js","../node_modules/mapbox-gl/src/style-spec/expression/definitions/slice.js","../node_modules/mapbox-gl/src/style-spec/expression/definitions/comparison.js","../node_modules/mapbox-gl/src/style-spec/expression/definitions/number_format.js","../node_modules/mapbox-gl/src/style-spec/expression/definitions/length.js","../node_modules/mapbox-gl/src/style-spec/util/random.js","../node_modules/mapbox-gl/src/style-spec/expression/definitions/index.js","../node_modules/mapbox-gl/src/style-spec/util/result.js","../node_modules/mapbox-gl/src/style-spec/util/properties.js","../node_modules/mapbox-gl/src/style-spec/function/index.js","../node_modules/mapbox-gl/src/style-spec/expression/index.js","../node_modules/mapbox-gl/node_modules/grid-index/grid-index.js","../node_modules/mapbox-gl/src/util/web_worker_transfer.js","../node_modules/mapbox-gl/src/util/is_char_in_unicode_block.js","../node_modules/mapbox-gl/src/util/script_detection.js","../node_modules/mapbox-gl/src/source/rtl_text_plugin.js","../node_modules/mapbox-gl/src/style/evaluation_parameters.js","../node_modules/mapbox-gl/src/style/properties.js","../node_modules/mapbox-gl/src/style-spec/util/unbundle_jsonlint.js","../node_modules/mapbox-gl/src/style-spec/feature_filter/index.js","../node_modules/mapbox-gl/src/util/fqid.js","../node_modules/mapbox-gl/src/style/style_layer.js","../node_modules/mapbox-gl/src/util/struct_array.js","../node_modules/mapbox-gl/src/data/array_types.js","../node_modules/mapbox-gl/src/data/bucket/circle_attributes.js","../node_modules/mapbox-gl/src/data/segment.js","../node_modules/mapbox-gl/src/shaders/encode_attribute.js","../node_modules/mapbox-gl/src/data/bucket/pattern_attributes.js","../node_modules/mapbox-gl/src/data/bucket/dash_attributes.js","../node_modules/mapbox-gl/src/data/feature_position_map.js","../node_modules/mapbox-gl/src/render/uniform_binding.js","../node_modules/mapbox-gl/src/data/program_configuration.js","../node_modules/mapbox-gl/src/geo/projection/globe_constants.js","../node_modules/mapbox-gl/src/geo/lng_lat.js","../node_modules/mapbox-gl/node_modules/@mapbox/whoots-js/index.js","../node_modules/mapbox-gl/src/source/tile_id.js","../node_modules/mapbox-gl/src/geo/mercator_coordinate.js","../node_modules/mapbox-gl/src/geo/projection/resample.js","../node_modules/mapbox-gl/src/data/load_geometry.js","../node_modules/mapbox-gl/src/data/evaluation_feature.js","../node_modules/mapbox-gl/src/data/bucket/circle_bucket.js","../node_modules/mapbox-gl/src/util/intersection_tests.js","../node_modules/mapbox-gl/src/style/query_utils.js","../node_modules/mapbox-gl/src/style/style_layer/circle_style_layer_properties.js","../node_modules/mapbox-gl/src/util/primitives.js","../node_modules/mapbox-gl/src/terrain/globe_attributes.js","../node_modules/mapbox-gl/src/data/pos_attributes.js","../node_modules/mapbox-gl/src/geo/projection/globe_util.js","../node_modules/mapbox-gl/src/render/program/circle_program.js","../node_modules/mapbox-gl/src/style/style_layer/circle_style_layer.js","../node_modules/mapbox-gl/src/data/bucket/heatmap_bucket.js","../node_modules/mapbox-gl/src/util/image.js","../node_modules/mapbox-gl/src/style/style_layer/heatmap_style_layer_properties.js","../node_modules/mapbox-gl/src/util/color_ramp.js","../node_modules/mapbox-gl/src/style/style_layer/hillshade_style_layer_properties.js","../node_modules/mapbox-gl/src/data/bucket/fill_attributes.js","../node_modules/mapbox-gl/node_modules/earcut/src/earcut.js","../node_modules/mapbox-gl/src/util/classify_rings.js","../node_modules/mapbox-gl/src/data/bucket/pattern_bucket_features.js","../node_modules/mapbox-gl/src/data/bucket/fill_bucket.js","../node_modules/mapbox-gl/src/style/style_layer/fill_style_layer_properties.js","../node_modules/mapbox-gl/src/data/bucket/fill_extrusion_attributes.js","../node_modules/mapbox-gl/node_modules/@mapbox/vector-tile/lib/vectortilefeature.js","../node_modules/mapbox-gl/node_modules/@mapbox/vector-tile/lib/vectortilelayer.js","../node_modules/mapbox-gl/node_modules/@mapbox/vector-tile/lib/vectortile.js","../node_modules/mapbox-gl/node_modules/@mapbox/vector-tile/index.js","../node_modules/mapbox-gl/src/util/polygon_clipping.js","../node_modules/mapbox-gl/3d-style/source/replacement_source.js","../node_modules/mapbox-gl/src/data/dem_tree.js","../node_modules/mapbox-gl/src/data/dem_data.js","../node_modules/mapbox-gl/src/terrain/elevation.js","../node_modules/mapbox-gl/src/data/bucket/fill_extrusion_bucket.js","../node_modules/mapbox-gl/src/style/style_layer/fill_extrusion_style_layer_properties.js","../node_modules/mapbox-gl/src/style/style_layer/fill_extrusion_style_layer.js","../node_modules/mapbox-gl/src/data/bucket/line_attributes.js","../node_modules/mapbox-gl/src/data/bucket/line_attributes_ext.js","../node_modules/mapbox-gl/src/data/bucket/line_attributes_pattern.js","../node_modules/mapbox-gl/src/render/line_atlas.js","../node_modules/mapbox-gl/src/data/bucket/line_bucket.js","../node_modules/mapbox-gl/src/style/style_layer/line_style_layer_properties.js","../node_modules/mapbox-gl/src/source/pixels_to_tile_units.js","../node_modules/mapbox-gl/src/render/program/line_program.js","../node_modules/mapbox-gl/src/style/style_layer/line_style_layer.js","../node_modules/mapbox-gl/src/data/bucket/symbol_attributes.js","../node_modules/mapbox-gl/src/symbol/one_em.js","../node_modules/mapbox-gl/src/symbol/symbol_size.js","../node_modules/mapbox-gl/src/symbol/transform_text.js","../node_modules/mapbox-gl/src/util/verticalize_punctuation.js","../node_modules/mapbox-gl/node_modules/ieee754/index.js","../node_modules/mapbox-gl/node_modules/pbf/index.js","../node_modules/mapbox-gl/src/style/parse_glyph_pbf.js","../node_modules/mapbox-gl/src/symbol/shaping.js","../node_modules/mapbox-gl/src/symbol/anchor.js","../node_modules/mapbox-gl/src/symbol/check_max_angle.js","../node_modules/mapbox-gl/src/symbol/get_anchors.js","../node_modules/mapbox-gl/src/symbol/clip_line.js","../node_modules/mapbox-gl/node_modules/potpack/index.js","../node_modules/mapbox-gl/src/render/image_atlas.js","../node_modules/mapbox-gl/node_modules/@mapbox/tiny-sdf/index.js","../node_modules/mapbox-gl/src/render/glyph_manager.js","../node_modules/mapbox-gl/src/style/load_glyph_range.js","../node_modules/mapbox-gl/src/symbol/quads.js","../node_modules/mapbox-gl/src/util/find_pole_of_inaccessibility.js","../node_modules/mapbox-gl/src/symbol/symbol_layout.js","../node_modules/mapbox-gl/src/geo/projection/far_z.js","../node_modules/mapbox-gl/src/geo/projection/tile_transform.js","../node_modules/mapbox-gl/src/geo/projection/projection.js","../node_modules/mapbox-gl/src/geo/projection/albers.js","../node_modules/mapbox-gl/src/geo/projection/equal_earth.js","../node_modules/mapbox-gl/src/geo/projection/equirectangular.js","../node_modules/mapbox-gl/src/geo/projection/lambert.js","../node_modules/mapbox-gl/src/geo/projection/mercator.js","../node_modules/mapbox-gl/src/geo/projection/natural_earth.js","../node_modules/mapbox-gl/src/geo/projection/winkel_tripel.js","../node_modules/mapbox-gl/src/geo/projection/cylindrical_equal_area.js","../node_modules/mapbox-gl/src/geo/projection/globe.js","../node_modules/mapbox-gl/src/geo/projection/index.js","../node_modules/mapbox-gl/src/data/bucket/symbol_bucket.js","../node_modules/mapbox-gl/src/symbol/mergelines.js","../node_modules/mapbox-gl/src/style/style_layer/symbol_style_layer_properties.js","../node_modules/mapbox-gl/src/style/format_section_override.js","../node_modules/mapbox-gl/src/style/style_layer/symbol_style_layer.js","../node_modules/mapbox-gl/src/util/resolve_tokens.js","../node_modules/mapbox-gl/src/style/style_layer/background_style_layer_properties.js","../node_modules/mapbox-gl/src/style/style_layer/raster_style_layer_properties.js","../node_modules/mapbox-gl/src/data/bounds_attributes.js","../node_modules/mapbox-gl/src/render/texture.js","../node_modules/mapbox-gl/src/source/image_source.js","../node_modules/mapbox-gl/src/style/style_layer/raster_style_layer.js","../node_modules/mapbox-gl/src/style/style_layer/raster_particle_style_layer_properties.js","../node_modules/mapbox-gl/src/style/style_layer/raster_particle_style_layer.js","../node_modules/mapbox-gl/src/style/style_layer/custom_style_layer.js","../node_modules/mapbox-gl/src/style/style_layer/sky_style_layer_properties.js","../node_modules/mapbox-gl/src/style/style_layer/sky_style_layer.js","../node_modules/mapbox-gl/src/style/style_layer/slot_style_layer_properties.js","../node_modules/mapbox-gl/src/geo/projection/adjustments.js","../node_modules/mapbox-gl/3d-style/util/model_util.js","../node_modules/mapbox-gl/3d-style/data/model_attributes.js","../node_modules/mapbox-gl/src/style-spec/error/validation_error.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_model.js","../node_modules/mapbox-gl/3d-style/data/bucket/model_bucket.js","../node_modules/mapbox-gl/3d-style/style/style_layer/model_style_layer_properties.js","../node_modules/mapbox-gl/3d-style/data/model.js","../node_modules/mapbox-gl/src/util/throttled_invoker.js","../node_modules/mapbox-gl/src/util/scheduler.js","../node_modules/mapbox-gl/src/util/actor.js","../node_modules/mapbox-gl/src/util/dispatcher.js","../node_modules/mapbox-gl/src/util/worker_class.js","../node_modules/mapbox-gl/src/util/web_worker.js","../node_modules/mapbox-gl/src/util/worker_pool.js","../node_modules/mapbox-gl/src/util/global_worker_pool.js","../node_modules/mapbox-gl/3d-style/util/loaders.js","../node_modules/mapbox-gl/3d-style/util/draco_decoder_gltf.js","../node_modules/mapbox-gl/3d-style/util/meshopt_decoder.js","../node_modules/mapbox-gl/src/util/triangle_grid_index.js","../node_modules/mapbox-gl/3d-style/source/model_loader.js","../node_modules/mapbox-gl/src/util/dictionary_coder.js","../node_modules/mapbox-gl/src/util/vectortile_to_geojson.js","../node_modules/mapbox-gl/src/data/feature_index.js","../node_modules/mapbox-gl/3d-style/data/bucket/tiled_3d_model_bucket.js","../node_modules/mapbox-gl/3d-style/style/style_layer/model_style_layer.js","../node_modules/mapbox-gl/src/style/create_style_layer.js","../node_modules/mapbox-gl/src/style/style_layer/heatmap_style_layer.js","../node_modules/mapbox-gl/src/style/style_layer/hillshade_style_layer.js","../node_modules/mapbox-gl/src/style/style_layer/fill_style_layer.js","../node_modules/mapbox-gl/src/style/style_layer/background_style_layer.js","../node_modules/mapbox-gl/src/style/style_layer/slot_style_layer.js","../node_modules/mapbox-gl/src/data/mrt/mrt_pbf_decoder.js","../node_modules/mapbox-gl/node_modules/tiny-lru/dist/tiny-lru.js","../node_modules/mapbox-gl/src/data/mrt/filters/delta.js","../node_modules/mapbox-gl/src/data/mrt/filters/zigzag.js","../node_modules/mapbox-gl/src/data/mrt/filters/bitshuffle.js","../node_modules/mapbox-gl/src/data/mrt/error.js","../node_modules/mapbox-gl/node_modules/fflate/esm/browser.js","../node_modules/mapbox-gl/src/data/mrt/decompress.js","../node_modules/mapbox-gl/src/data/mrt/mrt.js","../node_modules/mapbox-gl/src/data/mrt_data.js","../node_modules/mapbox-gl/node_modules/kdbush/index.js","../node_modules/mapbox-gl/src/source/load_vector_tile.js","../node_modules/mapbox-gl/src/style-spec/util/ref_properties.js","../node_modules/mapbox-gl/src/util/performance.js","../node_modules/mapbox-gl/src/style-spec/group_by_layout.js","../node_modules/mapbox-gl/src/style/style_layer_index.js","../node_modules/mapbox-gl/src/render/glyph_atlas.js","../node_modules/mapbox-gl/src/source/worker_tile.js","../node_modules/mapbox-gl/src/source/vector_tile_worker_source.js","../node_modules/mapbox-gl/src/source/raster_dem_tile_worker_source.js","../node_modules/mapbox-gl/src/source/raster_array_tile_worker_source.js","../node_modules/mapbox-gl/src/source/geojson_wrapper.js","../node_modules/mapbox-gl/node_modules/vt-pbf/lib/geojson_wrapper.js","../node_modules/mapbox-gl/node_modules/vt-pbf/index.js","../node_modules/mapbox-gl/node_modules/supercluster/index.js","../node_modules/mapbox-gl/node_modules/geojson-vt/geojson-vt-dev.js","../node_modules/mapbox-gl/src/source/geojson_worker_source.js","../node_modules/mapbox-gl/3d-style/source/tiled_3d_model_worker_source.js","../node_modules/mapbox-gl/src/source/worker.js","../node_modules/mapbox-gl/src/style-spec/util/deep_equal.js","../node_modules/mapbox-gl/node_modules/@mapbox/mapbox-gl-supported/index.js","../node_modules/mapbox-gl/src/util/dom.js","../node_modules/mapbox-gl/src/style/style_changes.js","../node_modules/mapbox-gl/3d-style/render/model_manager.js","../node_modules/mapbox-gl/src/source/source_state.js","../node_modules/mapbox-gl/src/style/style_image.js","../node_modules/mapbox-gl/src/render/image_manager.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_object.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_array.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_number.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_function.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_expression.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_enum.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_filter.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_property.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_paint_property.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_layout_property.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_layer.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_string.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_source.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_light.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_lights.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_terrain.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_fog.js","../node_modules/mapbox-gl/src/style-spec/validate/validate.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_boolean.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_color.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_formatted.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_image.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_projection.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_import.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_glyphs_url.js","../node_modules/mapbox-gl/src/style-spec/validate/validate_style.js","../node_modules/mapbox-gl/src/style-spec/validate_style.min.js","../node_modules/mapbox-gl/src/style/validate_style.js","../node_modules/mapbox-gl/src/style/light.js","../node_modules/mapbox-gl/src/style/terrain.js","../node_modules/mapbox-gl/src/style/fog_helpers.js","../node_modules/mapbox-gl/src/style/fog.js","../node_modules/mapbox-gl/3d-style/style/lights.js","../node_modules/mapbox-gl/3d-style/style/ambient_light_properties.js","../node_modules/mapbox-gl/3d-style/style/directional_light_properties.js","../node_modules/mapbox-gl/src/style/query_geometry.js","../node_modules/mapbox-gl/src/source/load_tilejson.js","../node_modules/mapbox-gl/src/source/tile_bounds.js","../node_modules/mapbox-gl/src/source/vector_tile_source.js","../node_modules/mapbox-gl/src/source/raster_tile_source.js","../node_modules/mapbox-gl/src/source/raster_array_tile_source.js","../node_modules/mapbox-gl/src/source/tile_mesh.js","../node_modules/mapbox-gl/src/gl/index_buffer.js","../node_modules/mapbox-gl/src/gl/vertex_buffer.js","../node_modules/mapbox-gl/src/gl/value.js","../node_modules/mapbox-gl/src/gl/framebuffer.js","../node_modules/mapbox-gl/src/gl/depth_mode.js","../node_modules/mapbox-gl/src/gl/stencil_mode.js","../node_modules/mapbox-gl/src/gl/color_mode.js","../node_modules/mapbox-gl/src/gl/cull_face_mode.js","../node_modules/mapbox-gl/src/gl/context.js","../node_modules/mapbox-gl/src/data/particle_attributes.js","../node_modules/mapbox-gl/src/render/raster_particle_state.js","../node_modules/mapbox-gl/src/source/tile.js","../node_modules/mapbox-gl/src/data/bucket.js","../node_modules/mapbox-gl/src/source/source.js","../node_modules/mapbox-gl/src/source/raster_dem_tile_source.js","../node_modules/mapbox-gl/src/source/geojson_source.js","../node_modules/mapbox-gl/src/source/video_source.js","../node_modules/mapbox-gl/3d-style/source/model_source.js","../node_modules/mapbox-gl/3d-style/source/tiled_3d_model_source.js","../node_modules/mapbox-gl/src/source/canvas_source.js","../node_modules/mapbox-gl/src/source/custom_source.js","../node_modules/mapbox-gl/src/source/query_features.js","../node_modules/mapbox-gl/src/source/raster_array_tile.js","../node_modules/mapbox-gl/src/source/tile_cache.js","../node_modules/mapbox-gl/src/source/source_cache.js","../node_modules/mapbox-gl/src/source/building_index.js","../node_modules/mapbox-gl/src/style-spec/deref.js","../node_modules/mapbox-gl/src/style-spec/diff.js","../node_modules/mapbox-gl/src/symbol/path_interpolator.js","../node_modules/mapbox-gl/src/symbol/grid_index.js","../node_modules/mapbox-gl/src/symbol/projection.js","../node_modules/mapbox-gl/src/symbol/collision_index.js","../node_modules/mapbox-gl/src/geo/projection/projection_util.js","../node_modules/mapbox-gl/src/symbol/placement.js","../node_modules/mapbox-gl/src/style/pauseable_placement.js","../node_modules/mapbox-gl/src/symbol/cross_tile_symbol_index.js","../node_modules/mapbox-gl/src/geo/edge_insets.js","../node_modules/mapbox-gl/src/ui/free_camera.js","../node_modules/mapbox-gl/src/geo/transform.js","../node_modules/mapbox-gl/3d-style/render/texture_slots.js","../node_modules/mapbox-gl/src/render/cutoff.js","../node_modules/mapbox-gl/3d-style/render/shadow_renderer.js","../node_modules/mapbox-gl/3d-style/render/shadow_uniforms.js","../node_modules/mapbox-gl/3d-style/render/program/ground_shadow_program.js","../node_modules/mapbox-gl/src/style/style.js","../node_modules/mapbox-gl/src/style-spec/empty.js","../node_modules/mapbox-gl/src/style/load_sprite.js","../node_modules/mapbox-gl/src/shaders/shaders.js","../node_modules/mapbox-gl/src/render/vertex_array_object.js","../node_modules/mapbox-gl/src/render/program/hillshade_program.js","../node_modules/mapbox-gl/src/render/draw_hillshade.js","../node_modules/mapbox-gl/src/terrain/terrain_raster_program.js","../node_modules/mapbox-gl/src/terrain/globe_raster_program.js","../node_modules/mapbox-gl/src/terrain/draw_terrain_raster.js","../node_modules/mapbox-gl/src/render/program/clipping_mask_program.js","../node_modules/mapbox-gl/src/render/raster_fade.js","../node_modules/mapbox-gl/src/terrain/terrain.js","../node_modules/mapbox-gl/3d-style/render/lights.js","../node_modules/mapbox-gl/src/render/program.js","../node_modules/mapbox-gl/src/render/fog.js","../node_modules/mapbox-gl/src/render/program/pattern.js","../node_modules/mapbox-gl/src/render/program/fill_extrusion_program.js","../node_modules/mapbox-gl/src/render/program/fill_program.js","../node_modules/mapbox-gl/src/render/program/collision_program.js","../node_modules/mapbox-gl/src/render/program/debug_program.js","../node_modules/mapbox-gl/src/render/program/heatmap_program.js","../node_modules/mapbox-gl/src/render/raster.js","../node_modules/mapbox-gl/src/render/program/raster_program.js","../node_modules/mapbox-gl/src/render/program/raster_particle_program.js","../node_modules/mapbox-gl/src/render/program/symbol_program.js","../node_modules/mapbox-gl/src/render/program/background_program.js","../node_modules/mapbox-gl/3d-style/render/program/model_program.js","../node_modules/mapbox-gl/src/render/program/program_uniforms.js","../node_modules/mapbox-gl/src/render/program/skybox_program.js","../node_modules/mapbox-gl/src/render/program/skybox_capture_program.js","../node_modules/mapbox-gl/src/terrain/stars_program.js","../node_modules/mapbox-gl/src/render/draw_collision_debug.js","../node_modules/mapbox-gl/src/render/draw_symbol.js","../node_modules/mapbox-gl/src/render/draw_fill.js","../node_modules/mapbox-gl/src/render/draw_fill_extrusion.js","../node_modules/mapbox-gl/src/render/draw_raster.js","../node_modules/mapbox-gl/src/render/draw_raster_particle.js","../node_modules/mapbox-gl/src/render/draw_debug.js","../node_modules/mapbox-gl/src/render/skybox_attributes.js","../node_modules/mapbox-gl/src/render/skybox_geometry.js","../node_modules/mapbox-gl/src/render/draw_sky.js","../node_modules/mapbox-gl/src/render/atmosphere_attributes.js","../node_modules/mapbox-gl/src/render/atmosphere_buffer.js","../node_modules/mapbox-gl/src/render/stars_attributes.js","../node_modules/mapbox-gl/src/render/draw_atmosphere.js","../node_modules/mapbox-gl/3d-style/render/draw_model.js","../node_modules/mapbox-gl/src/render/wireframe_cache.js","../node_modules/mapbox-gl/src/render/painter.js","../node_modules/mapbox-gl/src/render/draw_circle.js","../node_modules/mapbox-gl/src/render/draw_heatmap.js","../node_modules/mapbox-gl/src/render/draw_line.js","../node_modules/mapbox-gl/src/render/draw_background.js","../node_modules/mapbox-gl/src/render/draw_custom.js","../node_modules/mapbox-gl/src/util/throttle.js","../node_modules/mapbox-gl/src/ui/hash.js","../node_modules/mapbox-gl/src/ui/handler_inertia.js","../node_modules/mapbox-gl/src/ui/events.js","../node_modules/mapbox-gl/src/ui/handler/map_event.js","../node_modules/mapbox-gl/src/ui/handler/box_zoom.js","../node_modules/mapbox-gl/src/ui/handler/handler_util.js","../node_modules/mapbox-gl/src/ui/handler/tap_recognizer.js","../node_modules/mapbox-gl/src/ui/handler/tap_zoom.js","../node_modules/mapbox-gl/src/ui/handler/mouse.js","../node_modules/mapbox-gl/src/ui/handler/touch_pan.js","../node_modules/mapbox-gl/src/ui/handler/touch_zoom_rotate.js","../node_modules/mapbox-gl/src/ui/handler/keyboard.js","../node_modules/mapbox-gl/src/ui/handler/scroll_zoom.js","../node_modules/mapbox-gl/src/ui/handler/shim/dblclick_zoom.js","../node_modules/mapbox-gl/src/ui/handler/click_zoom.js","../node_modules/mapbox-gl/src/ui/handler/tap_drag_zoom.js","../node_modules/mapbox-gl/src/ui/handler/shim/drag_pan.js","../node_modules/mapbox-gl/src/ui/handler/shim/drag_rotate.js","../node_modules/mapbox-gl/src/ui/handler/shim/touch_zoom_rotate.js","../node_modules/mapbox-gl/src/ui/handler_manager.js","../node_modules/mapbox-gl/src/ui/camera.js","../node_modules/mapbox-gl/src/ui/control/attribution_control.js","../node_modules/mapbox-gl/src/ui/control/logo_control.js","../node_modules/mapbox-gl/src/util/task_queue.js","../node_modules/mapbox-gl/src/util/smart_wrap.js","../node_modules/mapbox-gl/src/ui/anchor.js","../node_modules/mapbox-gl/src/ui/marker.js","../node_modules/mapbox-gl/src/ui/popup.js","../node_modules/mapbox-gl/src/util/eased_variable.js","../node_modules/mapbox-gl/src/tracked-parameters/internal/tracked_parameters_mock.js","../node_modules/mapbox-gl/src/ui/default_locale.js","../node_modules/mapbox-gl/src/ui/map.js","../node_modules/mapbox-gl/src/ui/control/navigation_control.js","../node_modules/mapbox-gl/src/ui/control/geolocate_control.js","../node_modules/mapbox-gl/src/ui/control/scale_control.js","../node_modules/mapbox-gl/src/index.js","../node_modules/mapbox-gl/src/ui/control/fullscreen_control.js","../node_modules/mapbox-gl/rollup/mapboxgl.js","../node_modules/react-dom/cjs/react-dom.production.min.js","../node_modules/react-dom/client.js","../node_modules/react-dom/index.js","../node_modules/react/cjs/react-jsx-runtime.production.min.js","../node_modules/react/cjs/react.production.min.js","../node_modules/react/index.js","../node_modules/react/jsx-runtime.js","../node_modules/scheduler/cjs/scheduler.production.min.js","../node_modules/scheduler/index.js","../node_modules/subtag/subtag.js","../node_modules/suggestions/index.js","../node_modules/suggestions/src/list.js","../node_modules/suggestions/src/suggestions.js","../node_modules/xtend/immutable.js","../node_modules/nanoid/index.browser.js","../webpack/bootstrap","../webpack/runtime/compat get default export","../webpack/runtime/create fake namespace object","../webpack/runtime/define property getters","../webpack/runtime/ensure chunk","../webpack/runtime/get javascript chunk filename","../webpack/runtime/get mini-css chunk filename","../webpack/runtime/global","../webpack/runtime/hasOwnProperty shorthand","../webpack/runtime/load script","../webpack/runtime/make namespace object","../webpack/runtime/node module decorator","../webpack/runtime/publicPath","../webpack/runtime/jsonp chunk loading","../webpack/runtime/nonce","../node_modules/@mantine/core/src/core/MantineProvider/color-scheme-managers/is-mantine-color-scheme.ts","../node_modules/@mantine/core/src/core/MantineProvider/color-scheme-managers/local-storage-manager.ts","../node_modules/@mantine/core/src/core/MantineProvider/Mantine.context.ts","../node_modules/@mantine/core/src/core/utils/keys/keys.ts","../node_modules/@mantine/core/src/core/utils/units-converters/px.ts","../node_modules/@mantine/core/src/core/utils/units-converters/rem.ts","../node_modules/@mantine/core/src/core/MantineProvider/color-functions/to-rgba/to-rgba.ts","../node_modules/@mantine/core/src/core/MantineProvider/color-functions/darken/darken.ts","../node_modules/@mantine/core/src/core/MantineProvider/color-functions/get-primary-shade/get-primary-shade.ts","../node_modules/@mantine/core/src/core/MantineProvider/color-functions/luminance/luminance.ts","../node_modules/@mantine/core/src/core/MantineProvider/color-functions/parse-theme-color/parse-theme-color.ts","../node_modules/@mantine/core/src/core/MantineProvider/color-functions/get-theme-color/get-theme-color.ts","../node_modules/@mantine/core/src/core/MantineProvider/color-functions/get-gradient/get-gradient.ts","../node_modules/@mantine/core/src/core/MantineProvider/color-functions/rgba/rgba.ts","../node_modules/@mantine/core/src/core/MantineProvider/default-theme.ts","../node_modules/@mantine/core/src/core/MantineProvider/default-colors.ts","../node_modules/@mantine/core/src/core/MantineProvider/color-functions/default-variant-colors-resolver/default-variant-colors-resolver.ts","../node_modules/@mantine/core/src/core/utils/deep-merge/deep-merge.ts","../node_modules/@mantine/core/src/core/MantineProvider/merge-mantine-theme/merge-mantine-theme.ts","../node_modules/@mantine/core/src/core/MantineProvider/MantineThemeProvider/MantineThemeProvider.tsx","../node_modules/@mantine/core/src/core/MantineProvider/MantineClasses/MantineClasses.tsx","../node_modules/@mantine/core/src/core/MantineProvider/convert-css-variables/css-variables-object-to-string.ts","../node_modules/@mantine/core/src/core/MantineProvider/convert-css-variables/wrap-with-selector.ts","../node_modules/@mantine/core/src/core/MantineProvider/color-functions/get-contrast-color/get-contrast-color.ts","../node_modules/@mantine/core/src/core/MantineProvider/MantineCssVariables/get-css-color-variables.ts","../node_modules/@mantine/core/src/core/MantineProvider/MantineCssVariables/default-css-variables-resolver.ts","../node_modules/@mantine/core/src/core/MantineProvider/MantineCssVariables/virtual-color/virtual-color.ts","../node_modules/@mantine/core/src/core/MantineProvider/MantineCssVariables/remove-default-variables.ts","../node_modules/@mantine/core/src/core/MantineProvider/MantineCssVariables/MantineCssVariables.tsx","../node_modules/@mantine/core/src/core/MantineProvider/MantineCssVariables/get-merged-variables.ts","../node_modules/@mantine/core/src/core/MantineProvider/convert-css-variables/convert-css-variables.ts","../node_modules/@mantine/hooks/src/use-isomorphic-effect/use-isomorphic-effect.ts","../node_modules/@mantine/core/src/core/MantineProvider/use-mantine-color-scheme/use-provider-color-scheme.ts","../node_modules/@mantine/core/src/core/MantineProvider/MantineProvider.tsx","../node_modules/@mantine/core/src/core/MantineProvider/use-respect-reduce-motion/use-respect-reduce-motion.ts","../node_modules/@mantine/core/src/core/MantineProvider/suppress-nextjs-warning.ts","../node_modules/@remix-run/router/history.ts","../node_modules/@remix-run/router/utils.ts","../node_modules/@remix-run/router/router.ts","../node_modules/react-router/lib/context.ts","../node_modules/react-router/lib/hooks.tsx","../node_modules/react-router/lib/components.tsx","../node_modules/react-router/index.ts","../node_modules/react-router-dom/dom.ts","../node_modules/react-router-dom/index.tsx","../node_modules/@mantine/core/src/core/utils/filter-props/filter-props.ts","../node_modules/@mantine/core/src/core/MantineProvider/use-props/use-props.ts","../node_modules/clsx/dist/clsx.mjs","../node_modules/@mantine/core/src/core/styles-api/use-styles/get-class-name/get-global-class-names/get-global-class-names.ts","../node_modules/@mantine/core/src/core/styles-api/use-styles/get-class-name/resolve-class-names/resolve-class-names.ts","../node_modules/@mantine/core/src/core/styles-api/use-styles/get-class-name/get-resolved-class-names/get-resolved-class-names.ts","../node_modules/@mantine/core/src/core/styles-api/use-styles/get-class-name/get-class-name.ts","../node_modules/@mantine/core/src/core/styles-api/use-styles/get-class-name/get-theme-class-names/get-theme-class-names.ts","../node_modules/@mantine/core/src/core/styles-api/use-styles/get-class-name/get-variant-class-name/get-variant-class-name.ts","../node_modules/@mantine/core/src/core/styles-api/use-styles/get-class-name/get-options-class-names/get-options-class-names.ts","../node_modules/@mantine/core/src/core/styles-api/use-styles/get-class-name/get-root-class-name/get-root-class-name.ts","../node_modules/@mantine/core/src/core/styles-api/use-styles/get-class-name/get-selector-class-name/get-selector-class-name.ts","../node_modules/@mantine/core/src/core/styles-api/use-styles/get-class-name/get-static-class-names/get-static-class-names.ts","../node_modules/@mantine/core/src/core/styles-api/use-styles/get-style/resolve-styles/resolve-styles.ts","../node_modules/@mantine/core/src/core/styles-api/use-styles/get-style/get-theme-styles/get-theme-styles.ts","../node_modules/@mantine/core/src/core/styles-api/use-styles/get-style/resolve-style/resolve-style.ts","../node_modules/@mantine/core/src/core/styles-api/use-styles/get-style/resolve-vars/resolve-vars.ts","../node_modules/@mantine/core/src/core/styles-api/use-styles/get-style/resolve-vars/merge-vars.ts","../node_modules/@mantine/core/src/core/styles-api/use-styles/get-style/get-style.ts","../node_modules/@mantine/core/src/core/styles-api/use-styles/use-transformed-styles.ts","../node_modules/@mantine/core/src/core/styles-api/use-styles/use-styles.ts","../node_modules/@mantine/core/src/core/InlineStyles/css-object-to-string/css-object-to-string.ts","../node_modules/@mantine/core/src/core/utils/camel-to-kebab-case/camel-to-kebab-case.ts","../node_modules/@mantine/core/src/core/InlineStyles/styles-to-string/styles-to-string.ts","../node_modules/@mantine/core/src/core/InlineStyles/InlineStyles.tsx","../node_modules/@mantine/core/src/core/utils/is-number-like/is-number-like.ts","../node_modules/@mantine/core/src/core/Box/get-box-mod/get-box-mod.ts","../node_modules/@mantine/core/src/core/Box/get-box-style/get-box-style.ts","../node_modules/@mantine/core/src/core/Box/style-props/extract-style-props/extract-style-props.ts","../node_modules/@mantine/core/src/core/Box/style-props/style-props-data.ts","../node_modules/@mantine/core/src/core/Box/style-props/resolvers/color-resolver/color-resolver.ts","../node_modules/@mantine/core/src/core/Box/style-props/resolvers/font-family-resolver/font-family-resolver.ts","../node_modules/@mantine/core/src/core/Box/style-props/resolvers/font-size-resolver/font-size-resolver.ts","../node_modules/@mantine/core/src/core/Box/style-props/resolvers/line-height-resolver/line-height-resolver.ts","../node_modules/@mantine/core/src/core/Box/style-props/resolvers/index.ts","../node_modules/@mantine/core/src/core/Box/style-props/resolvers/spacing-resolver/spacing-resolver.ts","../node_modules/@mantine/core/src/core/Box/style-props/resolvers/identity-resolver/identity-resolver.ts","../node_modules/@mantine/core/src/core/Box/style-props/resolvers/size-resolver/size-resolver.ts","../node_modules/@mantine/core/src/core/Box/style-props/resolvers/border-resolver/border-resolver.ts","../node_modules/@mantine/core/src/core/Box/style-props/parse-style-props/sort-media-queries.ts","../node_modules/@mantine/core/src/core/Box/style-props/parse-style-props/parse-style-props.ts","../node_modules/@mantine/core/src/core/Box/use-random-classname/use-random-classname.ts","../node_modules/@mantine/core/src/core/Box/Box.tsx","../node_modules/@mantine/core/src/core/factory/factory.tsx","../node_modules/@mantine/core/src/components/Title/get-title-size.ts","../node_modules/@mantine/core/src/components/Title/Title.tsx","../node_modules/@mantine/core/src/core/utils/get-size/get-size.ts","../node_modules/@mantine/core/src/core/factory/polymorphic-factory.tsx","../node_modules/@mantine/core/src/components/Text/Text.tsx","../node_modules/@mantine/core/src/components/Loader/loaders/Bars.tsx","../node_modules/@mantine/core/src/components/Loader/loaders/Dots.tsx","../node_modules/@mantine/core/src/components/Loader/loaders/Oval.tsx","../node_modules/@mantine/core/src/components/Loader/Loader.tsx","../node_modules/@mantine/core/src/components/Transition/transitions.ts","../node_modules/@mantine/core/src/components/Transition/get-transition-styles/get-transition-styles.ts","../node_modules/@mantine/hooks/src/use-media-query/use-media-query.ts","../node_modules/@mantine/hooks/src/use-reduced-motion/use-reduced-motion.ts","../node_modules/@mantine/hooks/src/use-did-update/use-did-update.ts","../node_modules/@mantine/core/src/components/Transition/use-transition.ts","../node_modules/@mantine/core/src/components/Transition/Transition.tsx","../node_modules/@mantine/core/src/components/UnstyledButton/UnstyledButton.tsx","../node_modules/@mantine/core/src/components/Button/ButtonGroup/ButtonGroup.tsx","../node_modules/@mantine/core/src/components/Button/ButtonGroupSection/ButtonGroupSection.tsx","../node_modules/@mantine/core/src/components/Button/Button.tsx","webpack://copp-dam-ui/./src/components/Welcome/Welcome.module.css?59c6","components/Welcome/Welcome.tsx","../node_modules/@mantine/core/src/core/utils/noop/noop.ts","../node_modules/@mantine/core/src/core/MantineProvider/use-mantine-color-scheme/use-mantine-color-scheme.ts","../node_modules/@mantine/hooks/src/use-color-scheme/use-color-scheme.ts","../node_modules/@mantine/core/src/components/Group/Group.tsx","../node_modules/@mantine/core/src/components/Group/filter-falsy-children/filter-falsy-children.ts","webpack://copp-dam-ui/./src/components/ColorSchemeToggle/ColorSchemeToggle.module.scss?c997","components/ColorSchemeToggle/ColorSchemeToggle.tsx","pages/Home.page.tsx","../node_modules/react-map-gl/src/components/use-map.tsx","../node_modules/react-map-gl/src/utils/deep-equal.ts","../node_modules/react-map-gl/src/utils/transform.ts","../node_modules/react-map-gl/src/utils/style-utils.ts","../node_modules/react-map-gl/src/mapbox/mapbox.ts","../node_modules/react-map-gl/src/mapbox/create-ref.ts","../node_modules/react-map-gl/src/utils/use-isomorphic-layout-effect.ts","../node_modules/react-map-gl/src/utils/set-globals.ts","../node_modules/react-map-gl/src/components/map.tsx","../node_modules/react-map-gl/src/utils/apply-react-style.ts","../node_modules/react-map-gl/src/components/marker.ts","../node_modules/react-map-gl/src/components/popup.ts","../node_modules/react-map-gl/src/components/use-control.ts","../node_modules/react-map-gl/src/components/attribution-control.ts","../node_modules/react-map-gl/src/components/fullscreen-control.tsx","../node_modules/react-map-gl/src/components/geolocate-control.ts","../node_modules/react-map-gl/src/components/navigation-control.ts","../node_modules/react-map-gl/src/components/scale-control.ts","../node_modules/react-map-gl/src/utils/assert.ts","../node_modules/react-map-gl/src/components/layer.ts","../node_modules/react-map-gl/src/components/source.ts","../node_modules/react-map-gl/src/exports-mapbox.ts","../node_modules/notistack/node_modules/clsx/dist/clsx.m.js","../node_modules/goober/dist/goober.modern.js","../node_modules/src/SnackbarContext.ts","../node_modules/src/utils/index.ts","../node_modules/src/transitions/Transition/Transition.tsx","../node_modules/src/transitions/useForkRef.ts","../node_modules/src/transitions/getTransitionProps.ts","../node_modules/src/transitions/utils.ts","../node_modules/src/transitions/createTransition.ts","../node_modules/src/transitions/Slide/Slide.tsx","../node_modules/src/utils/defaultIconVariants.tsx","../node_modules/src/SnackbarProvider/merger.ts","../node_modules/src/utils/styles.ts","../node_modules/src/transitions/Collapse/Collapse.tsx","../node_modules/src/SnackbarItem/utils.ts","../node_modules/src/utils/createChainedFunction.ts","../node_modules/src/utils/useEventCallback.ts","../node_modules/src/SnackbarItem/Snackbar.tsx","../node_modules/src/SnackbarContent/SnackbarContent.tsx","../node_modules/src/ui/MaterialDesignContent/MaterialDesignContent.tsx","../node_modules/src/SnackbarItem/SnackbarItem.tsx","../node_modules/src/SnackbarContainer/SnackbarContainer.tsx","../node_modules/src/SnackbarProvider/SnackbarProvider.tsx","components/Mapbox/GeocoderControl.tsx","components/Mapbox/MapLayers.ts","webpack://copp-dam-ui/./src/components/Mapbox/FilterPanel/FilterPanel.module.scss?b5e5","../node_modules/@mantine/hooks/src/utils/random-id/random-id.ts","../node_modules/@mantine/hooks/src/use-id/use-react-id.ts","../node_modules/@mantine/hooks/src/use-id/use-id.ts","../node_modules/@mantine/core/src/core/MantineProvider/color-functions/get-auto-contrast-value/get-auto-contrast-value.ts","../node_modules/@mantine/core/src/core/utils/create-optional-context/create-optional-context.tsx","../node_modules/@mantine/core/src/components/Input/Input.context.ts","../node_modules/@mantine/core/src/components/CloseButton/CloseIcon.tsx","../node_modules/@mantine/core/src/components/CloseButton/CloseButton.tsx","../node_modules/@mantine/core/src/components/Input/InputClearButton/InputClearButton.tsx","../node_modules/@mantine/core/src/core/styles-api/use-resolved-styles-api/use-resolved-styles-api.ts","../node_modules/@mantine/core/src/components/Input/InputWrapper.context.ts","../node_modules/@mantine/core/src/components/Input/InputDescription/InputDescription.tsx","../node_modules/@mantine/core/src/components/Input/InputError/InputError.tsx","../node_modules/@mantine/core/src/components/Input/InputLabel/InputLabel.tsx","../node_modules/@mantine/core/src/components/Input/InputPlaceholder/InputPlaceholder.tsx","../node_modules/@mantine/core/src/components/Input/InputWrapper/get-input-offsets/get-input-offsets.ts","../node_modules/@mantine/core/src/components/Input/InputWrapper/InputWrapper.tsx","../node_modules/@mantine/core/src/components/Input/Input.tsx","../node_modules/@mantine/core/src/components/InlineInput/InlineInput.tsx","../node_modules/@mantine/hooks/src/use-uncontrolled/use-uncontrolled.ts","../node_modules/@mantine/core/src/components/Checkbox/CheckboxGroup.context.ts","../node_modules/@mantine/core/src/components/Checkbox/CheckboxCard/CheckboxCard.context.ts","../node_modules/@mantine/core/src/components/Checkbox/CheckboxCard/CheckboxCard.tsx","../node_modules/@mantine/core/src/components/InputsGroupFieldset/InputsGroupFieldset.tsx","../node_modules/@mantine/core/src/components/Checkbox/CheckboxGroup/CheckboxGroup.tsx","../node_modules/@mantine/core/src/components/Checkbox/CheckIcon.tsx","../node_modules/@mantine/core/src/components/Checkbox/CheckboxIndicator/CheckboxIndicator.tsx","../node_modules/@mantine/core/src/components/Checkbox/Checkbox.tsx","webpack://copp-dam-ui/./src/components/CustomisedCheckbox/Checkbox.module.scss?3060","components/CustomisedCheckbox/index.tsx","../node_modules/@mantine/core/src/core/utils/create-safe-context/create-safe-context.tsx","../node_modules/@mantine/core/src/components/Grid/Grid.context.ts","../node_modules/@mantine/core/src/core/utils/get-breakpoint-value/get-breakpoint-value.ts","../node_modules/@mantine/core/src/core/utils/get-sorted-breakpoints/get-sorted-breakpoints.ts","../node_modules/@mantine/core/src/core/utils/get-base-value/get-base-value.ts","../node_modules/@mantine/core/src/components/Grid/GridCol/GridColVariables.tsx","../node_modules/@mantine/core/src/components/Grid/GridCol/GridCol.tsx","../node_modules/@mantine/core/src/components/Grid/GridVariables.tsx","../node_modules/@mantine/core/src/components/Grid/Grid.tsx","components/Mapbox/FilterPanel/index.tsx","../node_modules/@mantine/core/src/components/Paper/Paper.tsx","../node_modules/@mantine/core/src/components/Card/Card.context.ts","../node_modules/@mantine/core/src/components/Card/CardSection/CardSection.tsx","../node_modules/@mantine/core/src/components/Card/Card.tsx","../node_modules/@mantine/core/src/components/Badge/Badge.tsx","../node_modules/@mantine/core/src/components/Anchor/Anchor.tsx","components/CustomisedCard/index.tsx","../node_modules/@mantine/core/src/components/Image/Image.tsx","components/Banner/index.tsx","../node_modules/@mantine/hooks/src/use-merged-ref/use-merged-ref.ts","../node_modules/@mantine/core/src/core/utils/is-element/is-element.ts","../node_modules/@mantine/core/src/core/utils/get-default-z-index/get-default-z-index.ts","../node_modules/@mantine/core/src/core/utils/get-ref-prop/get-ref-prop.ts","../node_modules/@mantine/core/src/core/DirectionProvider/DirectionProvider.tsx","../node_modules/@mantine/core/src/components/Floating/get-floating-position/get-floating-position.ts","../node_modules/@mantine/core/src/components/Floating/FloatingArrow/get-arrow-position-styles.ts","../node_modules/@mantine/core/src/components/Floating/FloatingArrow/FloatingArrow.tsx","../node_modules/@mantine/core/src/components/Portal/Portal.tsx","../node_modules/@mantine/core/src/components/Portal/OptionalPortal.tsx","../node_modules/@mantine/core/src/components/Transition/get-transition-props/get-transition-props.ts","../node_modules/@mantine/core/src/core/Box/get-style-object/get-style-object.ts","../node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","../node_modules/@floating-ui/react/dist/floating-ui.react.utils.mjs","../node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","../node_modules/@floating-ui/core/dist/floating-ui.core.mjs","../node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs","../node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.mjs","../node_modules/@floating-ui/react/dist/floating-ui.react.mjs","../node_modules/@mantine/core/src/components/Tooltip/TooltipFloating/TooltipFloating.tsx","../node_modules/@mantine/core/src/components/Tooltip/TooltipFloating/use-floating-tooltip.ts","../node_modules/@mantine/core/src/components/Tooltip/TooltipGroup/TooltipGroup.context.ts","../node_modules/@mantine/core/src/components/Tooltip/TooltipGroup/TooltipGroup.tsx","../node_modules/@mantine/core/src/components/Tooltip/use-tooltip.ts","../node_modules/@mantine/core/src/components/Floating/use-floating-auto-update.ts","../node_modules/@mantine/core/src/components/Tooltip/Tooltip.tsx","../node_modules/@mantine/core/src/components/ActionIcon/ActionIconGroup/ActionIconGroup.tsx","../node_modules/@mantine/core/src/components/ActionIcon/ActionIconGroupSection/ActionIconGroupSection.tsx","../node_modules/@mantine/core/src/components/ActionIcon/ActionIcon.tsx","../node_modules/@tabler/icons-react/src/defaultAttributes.ts","../node_modules/@tabler/icons-react/src/createReactComponent.ts","../node_modules/@tabler/icons-react/src/icons/IconPolygonOff.ts","../node_modules/@tabler/icons-react/src/icons/IconPolygon.ts","../node_modules/@tabler/icons-react/src/icons/IconPinnedOff.ts","../node_modules/@tabler/icons-react/src/icons/IconPin.ts","../node_modules/@tabler/icons-react/src/icons/IconHome.ts","../node_modules/@mantine/core/src/components/ModalBase/ModalBase.context.ts","../node_modules/@mantine/core/src/components/ModalBase/ModalBaseBody.tsx","../node_modules/@mantine/core/src/components/ModalBase/use-modal-body-id.ts","../node_modules/@mantine/core/src/components/Modal/Modal.context.ts","../node_modules/@mantine/core/src/components/Modal/ModalBody.tsx","../node_modules/@mantine/core/src/components/ModalBase/ModalBaseCloseButton.tsx","../node_modules/@mantine/core/src/components/Modal/ModalCloseButton.tsx","../node_modules/@mantine/hooks/src/use-focus-trap/tabbable.ts","../node_modules/@mantine/hooks/src/use-focus-trap/scope-tab.ts","../node_modules/@mantine/core/src/components/VisuallyHidden/VisuallyHidden.tsx","../node_modules/@mantine/core/src/components/FocusTrap/FocusTrap.tsx","../node_modules/@mantine/hooks/src/use-focus-trap/use-focus-trap.ts","../node_modules/@mantine/core/src/components/ModalBase/ModalBaseContent.tsx","../node_modules/@mantine/core/src/components/ModalBase/NativeScrollArea.tsx","../node_modules/@mantine/core/src/components/Modal/ModalContent.tsx","../node_modules/@mantine/core/src/components/ModalBase/ModalBaseHeader.tsx","../node_modules/@mantine/core/src/components/Modal/ModalHeader.tsx","../node_modules/@mantine/core/src/components/Overlay/Overlay.tsx","../node_modules/@mantine/core/src/components/ModalBase/use-modal-transition.ts","../node_modules/@mantine/core/src/components/ModalBase/ModalBaseOverlay.tsx","../node_modules/@mantine/core/src/components/Modal/ModalOverlay.tsx","../node_modules/tslib/tslib.es6.mjs","../node_modules/react-remove-scroll-bar/dist/es2015/constants.js","../node_modules/use-callback-ref/dist/es2015/assignRef.js","../node_modules/use-callback-ref/dist/es2015/useMergeRef.js","../node_modules/use-callback-ref/dist/es2015/useRef.js","../node_modules/use-sidecar/dist/es2015/medium.js","../node_modules/react-remove-scroll/dist/es2015/medium.js","../node_modules/react-remove-scroll/dist/es2015/UI.js","../node_modules/use-sidecar/dist/es2015/exports.js","../node_modules/get-nonce/dist/es2015/index.js","../node_modules/react-style-singleton/dist/es2015/singleton.js","../node_modules/react-style-singleton/dist/es2015/component.js","../node_modules/react-style-singleton/dist/es2015/hook.js","../node_modules/react-remove-scroll-bar/dist/es2015/utils.js","../node_modules/react-remove-scroll-bar/dist/es2015/component.js","../node_modules/react-remove-scroll/dist/es2015/aggresiveCapture.js","../node_modules/react-remove-scroll/dist/es2015/handleScroll.js","../node_modules/react-remove-scroll/dist/es2015/SideEffect.js","../node_modules/react-remove-scroll/dist/es2015/sidecar.js","../node_modules/react-remove-scroll/dist/es2015/Combination.js","../node_modules/@mantine/core/src/components/ModalBase/use-modal.ts","../node_modules/@mantine/core/src/components/ModalBase/use-lock-scroll.ts","../node_modules/@mantine/hooks/src/use-window-event/use-window-event.ts","../node_modules/@mantine/hooks/src/use-focus-return/use-focus-return.ts","../node_modules/@mantine/core/src/components/ModalBase/ModalBase.tsx","../node_modules/@mantine/core/src/components/Modal/ModalRoot.tsx","../node_modules/@mantine/core/src/components/Modal/ModalStack.tsx","../node_modules/@mantine/core/src/components/ModalBase/ModalBaseTitle.tsx","../node_modules/@mantine/core/src/components/ModalBase/use-modal-title-id.ts","../node_modules/@mantine/core/src/components/Modal/ModalTitle.tsx","../node_modules/@mantine/core/src/components/Modal/Modal.tsx","../node_modules/@mantine/notifications/src/notifications.store.ts","../node_modules/@mantine/store/src/store.ts","../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","../node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","../node_modules/react-transition-group/esm/config.js","../node_modules/react-transition-group/esm/TransitionGroupContext.js","../node_modules/react-transition-group/esm/utils/reflow.js","../node_modules/react-transition-group/esm/Transition.js","../node_modules/@babel/runtime/helpers/esm/extends.js","../node_modules/react-transition-group/esm/utils/ChildMapping.js","../node_modules/react-transition-group/esm/TransitionGroup.js","../node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","../node_modules/@mantine/hooks/src/use-force-update/use-force-update.ts","../node_modules/@mantine/notifications/src/get-grouped-notifications/get-grouped-notifications.ts","../node_modules/@mantine/notifications/src/get-notification-state-styles.ts","../node_modules/@mantine/core/src/components/Notification/Notification.tsx","../node_modules/@mantine/notifications/src/NotificationContainer.tsx","../node_modules/@mantine/notifications/src/get-auto-close/get-auto-close.ts","../node_modules/@mantine/notifications/src/Notifications.tsx","../node_modules/@lottiefiles/dotlottie-web/src/animation-frame-manager.ts","../node_modules/@lottiefiles/dotlottie-web/src/constants.ts","../node_modules/@lottiefiles/dotlottie-web/src/core/dotlottie-player.js","../node_modules/@lottiefiles/dotlottie-web/src/core/dotlottie-wasm-loader.ts","../node_modules/@lottiefiles/dotlottie-web/src/event-manager.ts","../node_modules/@lottiefiles/dotlottie-web/src/offscreen-observer.ts","../node_modules/@lottiefiles/dotlottie-web/src/resize-observer.ts","../node_modules/@lottiefiles/dotlottie-web/src/utils.ts","../node_modules/@lottiefiles/dotlottie-web/src/dotlottie.ts","../inline-worker:/home/runner/work/dotlottie-web/dotlottie-web/packages/web/src/worker/dotlottie.worker","../node_modules/@lottiefiles/dotlottie-web/src/worker/dotlottie.ts","../node_modules/@lottiefiles/dotlottie-web/src/worker/worker-manager.ts","../node_modules/@lottiefiles/dotlottie-react/src/base-dotlottie-react.tsx","../node_modules/@lottiefiles/dotlottie-react/src/dotlottie.tsx","components/WelcomeModal/index.tsx","../node_modules/@mantine/core/src/components/Table/Table.context.ts","../node_modules/@mantine/core/src/components/Table/Table.components.tsx","../node_modules/@mantine/core/src/components/Table/TableDataRenderer.tsx","../node_modules/@mantine/core/src/components/ScrollArea/ScrollArea.context.ts","../node_modules/@mantine/hooks/src/use-callback-ref/use-callback-ref.ts","../node_modules/@mantine/core/src/components/ScrollArea/use-resize-observer.ts","../node_modules/@mantine/core/src/components/ScrollArea/ScrollAreaCorner/ScrollAreaCorner.tsx","../node_modules/@mantine/core/src/components/ScrollArea/ScrollAreaRoot/ScrollAreaRoot.tsx","../node_modules/@mantine/hooks/src/use-debounced-callback/use-debounced-callback.ts","../node_modules/@mantine/core/src/components/ScrollArea/utils/get-thumb-ratio.tsx","../node_modules/@mantine/core/src/components/ScrollArea/utils/get-thumb-size.tsx","../node_modules/@mantine/core/src/components/ScrollArea/utils/linear-scale.ts","../node_modules/@mantine/core/src/components/ScrollArea/utils/get-thumb-offset-from-scroll.ts","../node_modules/@mantine/core/src/components/ScrollArea/utils/is-scrolling-within-scrollbar-bounds.ts","../node_modules/@mantine/core/src/components/ScrollArea/utils/to-int.ts","../node_modules/@mantine/core/src/components/ScrollArea/utils/compose-event-handlers.ts","../node_modules/@mantine/core/src/components/ScrollArea/ScrollAreaScrollbar/Scrollbar.context.ts","../node_modules/@mantine/core/src/components/ScrollArea/ScrollAreaScrollbar/Scrollbar.tsx","../node_modules/@mantine/core/src/components/ScrollArea/ScrollAreaScrollbar/ScrollbarX.tsx","../node_modules/@mantine/core/src/components/ScrollArea/ScrollAreaScrollbar/ScrollbarY.tsx","../node_modules/@mantine/core/src/components/ScrollArea/ScrollAreaScrollbar/ScrollAreaScrollbarVisible.tsx","../node_modules/@mantine/core/src/components/ScrollArea/utils/get-scroll-position-from-pointer.ts","../node_modules/@mantine/core/src/components/ScrollArea/ScrollAreaScrollbar/ScrollAreaScrollbarAuto.tsx","../node_modules/@mantine/core/src/components/ScrollArea/ScrollAreaScrollbar/ScrollAreaScrollbarHover.tsx","../node_modules/@mantine/core/src/components/ScrollArea/ScrollAreaScrollbar/ScrollAreaScrollbarScroll.tsx","../node_modules/@mantine/core/src/components/ScrollArea/ScrollAreaScrollbar/ScrollAreaScrollbar.tsx","../node_modules/@mantine/core/src/components/ScrollArea/ScrollAreaThumb/ScrollAreaThumb.tsx","../node_modules/@mantine/core/src/components/ScrollArea/utils/add-unlinked-scroll-listener.tsx","../node_modules/@mantine/core/src/components/ScrollArea/ScrollAreaViewport/ScrollAreaViewport.tsx","../node_modules/@mantine/core/src/components/ScrollArea/ScrollArea.tsx","../node_modules/@mantine/core/src/components/Table/TableScrollContainer.tsx","../node_modules/@mantine/core/src/components/Table/Table.tsx","data/modalContentData.js","components/InformationModal/index.tsx","data/wardLabels.ts","layers/ClusterLayers.tsx","components/Mapbox/Mapbox.tsx","pages/Map.page..tsx","Router.tsx","theme.ts","App.tsx","reportWebVitals.ts","index.tsx"],"sourcesContent":["'use strict';\n/**\n * Validators are functions which assert certain type.\n * They can return a string which can then be used\n * to display a helpful error message.\n * They can also return a function for a custom error message.\n */\nvar isPlainObject = require('is-plain-obj');\nvar xtend = require('xtend');\n\nvar DEFAULT_ERROR_PATH = 'value';\nvar NEWLINE_INDENT = '\\n  ';\n\nvar v = {};\n\n/**\n * Runners\n *\n * Take root validators and run assertion\n */\nv.assert = function(rootValidator, options) {\n  options = options || {};\n  return function(value) {\n    var message = validate(rootValidator, value);\n    // all good\n    if (!message) {\n      return;\n    }\n\n    var errorMessage = processMessage(message, options);\n\n    if (options.apiName) {\n      errorMessage = options.apiName + ': ' + errorMessage;\n    }\n\n    throw new Error(errorMessage);\n  };\n};\n\n/**\n * Higher Order Validators\n *\n * validators which take other validators as input\n * and output a new validator\n */\nv.shape = function shape(validatorObj) {\n  var validators = objectEntries(validatorObj);\n  return function shapeValidator(value) {\n    var validationResult = validate(v.plainObject, value);\n\n    if (validationResult) {\n      return validationResult;\n    }\n\n    var key, validator;\n    var errorMessages = [];\n\n    for (var i = 0; i < validators.length; i++) {\n      key = validators[i].key;\n      validator = validators[i].value;\n      validationResult = validate(validator, value[key]);\n\n      if (validationResult) {\n        // return [key].concat(validationResult);\n        errorMessages.push([key].concat(validationResult));\n      }\n    }\n\n    if (errorMessages.length < 2) {\n      return errorMessages[0];\n    }\n\n    // enumerate all the error messages\n    return function(options) {\n      errorMessages = errorMessages.map(function(message) {\n        var key = message[0];\n        var renderedMessage = processMessage(message, options)\n          .split('\\n')\n          .join(NEWLINE_INDENT); // indents any inner nesting\n        return '- ' + key + ': ' + renderedMessage;\n      });\n\n      var objectId = options.path.join('.');\n      var ofPhrase = objectId === DEFAULT_ERROR_PATH ? '' : ' of ' + objectId;\n\n      return (\n        'The following properties' +\n        ofPhrase +\n        ' have invalid values:' +\n        NEWLINE_INDENT +\n        errorMessages.join(NEWLINE_INDENT)\n      );\n    };\n  };\n};\n\nv.strictShape = function strictShape(validatorObj) {\n  var shapeValidator = v.shape(validatorObj);\n  return function strictShapeValidator(value) {\n    var shapeResult = shapeValidator(value);\n    if (shapeResult) {\n      return shapeResult;\n    }\n\n    var invalidKeys = Object.keys(value).reduce(function(memo, valueKey) {\n      if (validatorObj[valueKey] === undefined) {\n        memo.push(valueKey);\n      }\n      return memo;\n    }, []);\n\n    if (invalidKeys.length !== 0) {\n      return function() {\n        return 'The following keys are invalid: ' + invalidKeys.join(', ');\n      };\n    }\n  };\n};\n\nv.arrayOf = function arrayOf(validator) {\n  return createArrayValidator(validator);\n};\n\nv.tuple = function tuple() {\n  var validators = Array.isArray(arguments[0])\n    ? arguments[0]\n    : Array.prototype.slice.call(arguments);\n  return createArrayValidator(validators);\n};\n\n// Currently array validation fails when the first invalid item is found.\nfunction createArrayValidator(validators) {\n  var validatingTuple = Array.isArray(validators);\n  var getValidator = function(index) {\n    if (validatingTuple) {\n      return validators[index];\n    }\n    return validators;\n  };\n\n  return function arrayValidator(value) {\n    var validationResult = validate(v.plainArray, value);\n    if (validationResult) {\n      return validationResult;\n    }\n\n    if (validatingTuple && value.length !== validators.length) {\n      return 'an array with ' + validators.length + ' items';\n    }\n\n    for (var i = 0; i < value.length; i++) {\n      validationResult = validate(getValidator(i), value[i]);\n      if (validationResult) {\n        return [i].concat(validationResult);\n      }\n    }\n  };\n}\n\nv.required = function required(validator) {\n  function requiredValidator(value) {\n    if (value == null) {\n      return function(options) {\n        return formatErrorMessage(\n          options,\n          isArrayCulprit(options.path)\n            ? 'cannot be undefined/null.'\n            : 'is required.'\n        );\n      };\n    }\n    return validator.apply(this, arguments);\n  }\n  requiredValidator.__required = true;\n\n  return requiredValidator;\n};\n\nv.oneOfType = function oneOfType() {\n  var validators = Array.isArray(arguments[0])\n    ? arguments[0]\n    : Array.prototype.slice.call(arguments);\n  return function oneOfTypeValidator(value) {\n    var messages = validators\n      .map(function(validator) {\n        return validate(validator, value);\n      })\n      .filter(Boolean);\n\n    // If we don't have as many messages as no. of validators,\n    // then at least one validator was ok with the value.\n    if (messages.length !== validators.length) {\n      return;\n    }\n\n    // check primitive type\n    if (\n      messages.every(function(message) {\n        return message.length === 1 && typeof message[0] === 'string';\n      })\n    ) {\n      return orList(\n        messages.map(function(m) {\n          return m[0];\n        })\n      );\n    }\n\n    // Complex oneOfTypes like\n    // `v.oneOftypes(v.shape({name: v.string})`, `v.shape({name: v.number}))`\n    // are complex ¯\\_(ツ)_/¯. For the current scope only returning the longest message.\n    return messages.reduce(function(max, arr) {\n      return arr.length > max.length ? arr : max;\n    });\n  };\n};\n\n/**\n * Meta Validators\n * which take options as argument (not validators)\n * and return a new primitive validator\n */\nv.equal = function equal(compareWith) {\n  return function equalValidator(value) {\n    if (value !== compareWith) {\n      return JSON.stringify(compareWith);\n    }\n  };\n};\n\nv.oneOf = function oneOf() {\n  var options = Array.isArray(arguments[0])\n    ? arguments[0]\n    : Array.prototype.slice.call(arguments);\n  var validators = options.map(function(value) {\n    return v.equal(value);\n  });\n\n  return v.oneOfType.apply(this, validators);\n};\n\nv.range = function range(compareWith) {\n  var min = compareWith[0];\n  var max = compareWith[1];\n  return function rangeValidator(value) {\n    var validationResult = validate(v.number, value);\n\n    if (validationResult || value < min || value > max) {\n      return 'number between ' + min + ' & ' + max + ' (inclusive)';\n    }\n  };\n};\n\n/**\n * Primitive validators\n *\n * simple validators which return a string or undefined\n */\nv.any = function any() {\n  return;\n};\n\nv.boolean = function boolean(value) {\n  if (typeof value !== 'boolean') {\n    return 'boolean';\n  }\n};\n\nv.number = function number(value) {\n  if (typeof value !== 'number') {\n    return 'number';\n  }\n};\n\nv.plainArray = function plainArray(value) {\n  if (!Array.isArray(value)) {\n    return 'array';\n  }\n};\n\nv.plainObject = function plainObject(value) {\n  if (!isPlainObject(value)) {\n    return 'object';\n  }\n};\n\nv.string = function string(value) {\n  if (typeof value !== 'string') {\n    return 'string';\n  }\n};\n\nv.func = function func(value) {\n  if (typeof value !== 'function') {\n    return 'function';\n  }\n};\n\nfunction validate(validator, value) {\n  // assertions are optional by default unless wrapped in v.require\n  if (value == null && !validator.hasOwnProperty('__required')) {\n    return;\n  }\n\n  var result = validator(value);\n\n  if (result) {\n    return Array.isArray(result) ? result : [result];\n  }\n}\n\nfunction processMessage(message, options) {\n  // message array follows the convention\n  // [...path, result]\n  // path is an array of object keys / array indices\n  // result is output of the validator\n  var len = message.length;\n\n  var result = message[len - 1];\n  var path = message.slice(0, len - 1);\n\n  if (path.length === 0) {\n    path = [DEFAULT_ERROR_PATH];\n  }\n  options = xtend(options, { path: path });\n\n  return typeof result === 'function'\n    ? result(options) // allows customization of result\n    : formatErrorMessage(options, prettifyResult(result));\n}\n\nfunction orList(list) {\n  if (list.length < 2) {\n    return list[0];\n  }\n  if (list.length === 2) {\n    return list.join(' or ');\n  }\n  return list.slice(0, -1).join(', ') + ', or ' + list.slice(-1);\n}\n\nfunction prettifyResult(result) {\n  return 'must be ' + addArticle(result) + '.';\n}\n\nfunction addArticle(nounPhrase) {\n  if (/^an? /.test(nounPhrase)) {\n    return nounPhrase;\n  }\n  if (/^[aeiou]/i.test(nounPhrase)) {\n    return 'an ' + nounPhrase;\n  }\n  if (/^[a-z]/i.test(nounPhrase)) {\n    return 'a ' + nounPhrase;\n  }\n  return nounPhrase;\n}\n\nfunction formatErrorMessage(options, prettyResult) {\n  var arrayCulprit = isArrayCulprit(options.path);\n  var output = options.path.join('.') + ' ' + prettyResult;\n  var prepend = arrayCulprit ? 'Item at position ' : '';\n\n  return prepend + output;\n}\n\nfunction isArrayCulprit(path) {\n  return typeof path[path.length - 1] == 'number' || typeof path[0] == 'number';\n}\n\nfunction objectEntries(obj) {\n  return Object.keys(obj || {}).map(function(key) {\n    return { key: key, value: obj[key] };\n  });\n}\n\nv.validate = validate;\nv.processMessage = processMessage;\n\nmodule.exports = v;\n","'use strict';\nvar toString = Object.prototype.toString;\n\nmodule.exports = function (x) {\n\tvar prototype;\n\treturn toString.call(x) === '[object Object]' && (prototype = Object.getPrototypeOf(x), prototype === null || prototype === Object.getPrototypeOf({}));\n};\n","'use strict';\nvar nanoid = require('nanoid').nanoid;\n\n/**\n * Construct a new mapbox event client to send interaction events to the mapbox event service\n * @param {Object} options options with which to create the service\n * @param {String} options.accessToken the mapbox access token to make requests\n * @param {Number} [options.flushInterval=1000] the number of ms after which to flush the event queue\n * @param {Number} [options.maxQueueSize=100] the number of events to queue before flushing\n * @private\n */\nfunction MapboxEventManager(options) {\n  this.origin = options.origin || 'https://api.mapbox.com';\n  this.endpoint = 'events/v2';\n  this.access_token = options.accessToken;\n  this.version = '0.2.0'\n  this.sessionID = this.generateSessionID();\n  this.userAgent = this.getUserAgent();\n\n  this.options = options;\n  this.send = this.send.bind(this);\n\n\n  // parse global options to be sent with each request\n  this.countries = (options.countries) ? options.countries.split(\",\") : null;\n  this.types = (options.types) ? options.types.split(\",\") : null;\n  this.bbox = (options.bbox) ? options.bbox : null;\n  this.language = (options.language) ? options.language.split(\",\") : null;\n  this.limit = (options.limit) ? +options.limit : null;\n  this.locale = navigator.language || null;\n  this.enableEventLogging = this.shouldEnableLogging(options);\n  this.eventQueue = new Array();\n  this.flushInterval = options.flushInterval || 1000;\n  this.maxQueueSize = options.maxQueueSize || 100;\n  this.timer = (this.flushInterval) ? setTimeout(this.flush.bind(this), this.flushInterval) : null;\n  // keep some state to deduplicate requests if necessary\n  this.lastSentInput = \"\";\n  this.lastSentIndex = 0;\n}\n\nMapboxEventManager.prototype = {\n  /**\n     * Send a search.select event to the mapbox events service\n     * This event marks the array index of the item selected by the user out of the array of possible options\n     * @private\n     * @param {Object} selected the geojson feature selected by the user\n     * @param {Object} geocoder a mapbox-gl-geocoder instance\n     * @returns {Promise}\n     */\n  select: function(selected, geocoder){\n    var resultIndex = this.getSelectedIndex(selected, geocoder);\n    var payload = this.getEventPayload('search.select', geocoder);\n    payload.resultIndex = resultIndex;\n    payload.resultPlaceName  = selected.place_name;\n    payload.resultId = selected.id;\n    if ((resultIndex === this.lastSentIndex && payload.queryString === this.lastSentInput) || resultIndex == -1) {\n      // don't log duplicate events if the user re-selected the same feature on the same search\n      return;\n    }\n    this.lastSentIndex = resultIndex;\n    this.lastSentInput = payload.queryString;\n    if (!payload.queryString) return; // will be rejected\n    return this.push(payload)\n  },\n\n  /**\n     * Send a search-start event to the mapbox events service\n     * This turnstile event marks when a user starts a new search\n     * @private\n     * @param {Object} geocoder a mapbox-gl-geocoder instance\n     * @returns {Promise}\n     */\n  start: function(geocoder){\n    var payload = this.getEventPayload('search.start', geocoder);\n    if (!payload.queryString) return; // will be rejected\n    return this.push(payload);\n  },\n\n  /**\n   * Send a search-keyevent event to the mapbox events service\n   * This event records each keypress in sequence\n   * @private\n   * @param {Object} keyEvent the keydown event to log\n   * @param {Object} geocoder a mapbox-gl-geocoder instance\n   * \n   */\n  keyevent: function(keyEvent, geocoder){\n\n    //pass invalid event\n    if (!keyEvent.key) return;\n    // don't send events for keys that don't change the input\n    // TAB, ESC, LEFT, RIGHT, ENTER, UP, DOWN\n    if (keyEvent.metaKey || [9, 27, 37, 39, 13, 38, 40].indexOf(keyEvent.keyCode) !== -1) return;\n    var payload = this.getEventPayload('search.keystroke', geocoder);\n    payload.lastAction = keyEvent.key;\n    if (!payload.queryString) return; // will be rejected\n    return this.push(payload);\n  },\n\n  /**\n   * Send an event to the events service\n   *\n   * The event is skipped if the instance is not enabled to send logging events\n   *\n   * @private\n   * @param {Object} payload the http POST body of the event\n   * @param {Function} [callback] a callback function to invoke when the send has completed\n   * @returns {Promise}\n   */\n  send: function (payload, callback) {\n    if (!this.enableEventLogging) {\n      if (callback) return callback();\n      return;\n    }\n    var options = this.getRequestOptions(payload);\n    this.request(options, function(err){\n      if (err) return this.handleError(err, callback);\n      if (callback) {\n        return callback();\n      }\n    }.bind(this))\n  },\n  /**\n   * Get http request options\n   * @private\n   * @param {*} payload\n   */\n  getRequestOptions: function(payload){\n    if (!Array.isArray(payload)) payload = [payload];\n    var options = {\n      // events must be sent with POST\n      method: \"POST\",\n      host: this.origin,\n      path: this.endpoint +  \"?access_token=\" + this.access_token,\n      headers: {\n        'Content-Type': 'application/json'\n      },\n      body:JSON.stringify(payload) //events are arrays\n    }\n    return options\n  },\n\n  /**\n   * Get the event payload to send to the events service\n   * Most payload properties are shared across all events\n   * @private\n   * @param {String} event the name of the event to send to the events service. Valid options are 'search.start', 'search.select', 'search.feedback'.\n   * @param {Object} geocoder a mapbox-gl-geocoder instance\n   * @returns {Object} an event payload\n   */\n  getEventPayload: function (event, geocoder) {\n    // Handle proximity, whether null, lat/lng coordinate object, or 'ip'\n    var proximity;\n    if (!geocoder.options.proximity) {\n      proximity = null;\n    } else if (typeof geocoder.options.proximity === 'object') {\n      proximity = [geocoder.options.proximity.longitude, geocoder.options.proximity.latitude];\n    } else if (geocoder.options.proximity === 'ip') {\n      proximity = [999,999];  // Alias for 'ip' in event logs\n    } else {\n      proximity = geocoder.options.proximity;\n    }\n\n    var zoom = (geocoder._map) ? geocoder._map.getZoom() : undefined;\n    var payload = {\n      event: event,\n      created: +new Date(),\n      sessionIdentifier: this.sessionID,\n      country: this.countries,\n      userAgent: this.userAgent,\n      language: this.language,\n      bbox: this.bbox,\n      types: this.types,\n      endpoint: 'mapbox.places',\n      autocomplete: geocoder.options.autocomplete,\n      fuzzyMatch: geocoder.options.fuzzyMatch,\n      proximity: proximity,\n      limit: geocoder.options.limit,\n      routing: geocoder.options.routing,\n      worldview: geocoder.options.worldview,\n      mapZoom: zoom,\n      keyboardLocale: this.locale\n    }\n\n    // get the text in the search bar\n    if (event === \"search.select\"){\n      payload.queryString = geocoder.inputString;\n    }else if (event != \"search.select\" && geocoder._inputEl){\n      payload.queryString = geocoder._inputEl.value;\n    }else{\n      payload.queryString = geocoder.inputString;\n    }\n    return payload;\n  },\n\n  /**\n   * Wraps the request function for easier testing\n   * Make an http request and invoke a callback\n   * @private\n   * @param {Object} opts options describing the http request to be made\n   * @param {Function} callback the callback to invoke when the http request is completed\n   */\n  request: function (opts, callback) {\n    var xhttp = new XMLHttpRequest();\n    xhttp.onreadystatechange = function() {\n      if (this.readyState == 4 ) {\n        if (this.status == 204){\n          //success\n          return callback(null);\n        }else {\n          return callback(this.statusText);\n        }\n      }\n    };\n\n    xhttp.open(opts.method, opts.host + '/' + opts.path, true);\n    for (var header in opts.headers){\n      var headerValue = opts.headers[header];\n      xhttp.setRequestHeader(header, headerValue)\n    }\n    xhttp.send(opts.body);\n  },\n\n  /**\n   * Handle an error that occurred while making a request\n   * @param {Object} err an error instance to log\n   * @private\n   */\n  handleError: function (err, callback) {\n    if (callback) return callback(err);\n  },\n\n  /**\n   * Generate a session ID to be returned with all of the searches made by this geocoder instance\n   * ID is random and cannot be tracked across sessions\n   * @private\n   */\n  generateSessionID: function () {\n    return nanoid();\n  },\n\n  /**\n   * Get a user agent string to send with the request to the events service\n   * @private\n   */\n  getUserAgent: function () {\n    return 'mapbox-gl-geocoder.' + this.version + \".\" + navigator.userAgent;\n  },\n\n  /**\n     * Get the 0-based numeric index of the item that the user selected out of the list of options\n     * @private\n     * @param {Object} selected the geojson feature selected by the user\n     * @param {Object} geocoder a Mapbox-GL-Geocoder instance\n     * @returns {Number} the index of the selected result\n     */\n  getSelectedIndex: function(selected, geocoder){\n    if (!geocoder._typeahead) return;\n    var results = geocoder._typeahead.data;\n    var selectedID = selected.id;\n    var resultIDs = results.map(function (feature) {\n      return feature.id;\n    });\n    var selectedIdx = resultIDs.indexOf(selectedID);\n    return selectedIdx;\n  },\n\n  /**\n     * Check whether events should be logged\n     * Clients using a localGeocoder or an origin other than mapbox should not have events logged\n     * @private\n     */\n  shouldEnableLogging: function(options){\n    if (options.enableEventLogging === false) return false;\n    if (options.origin && options.origin !== 'https://api.mapbox.com') return false;\n    // hard to make sense of events when a local instance is suplementing results from origin\n    if (options.localGeocoder) return false;\n    // hard to make sense of events when a custom filter is in use\n    if (options.filter) return false;\n    return true;\n  },\n\n  /**\n   * Flush out the event queue by sending events to the events service\n   * @private\n   */\n  flush: function(){\n    if (this.eventQueue.length > 0){\n      this.send(this.eventQueue);\n      this.eventQueue = new Array();\n    }\n    // //reset the timer\n    if (this.timer)  clearTimeout(this.timer);\n    if (this.flushInterval) this.timer = setTimeout(this.flush.bind(this), this.flushInterval)\n  },\n\n  /**\n   * Push event into the pending queue\n   * @param {Object} evt the event to send to the events service\n   * @param {Boolean} forceFlush indicates that the event queue should be flushed after adding this event regardless of size of the queue\n   * @private\n   */\n  push: function(evt, forceFlush){\n    this.eventQueue.push(evt);\n    if (this.eventQueue.length >= this.maxQueueSize || forceFlush){\n      this.flush();\n    }\n  },\n\n  /**\n   * Flush any remaining events from the queue before it is removed\n   * @private\n   */\n  remove: function(){\n    this.flush();\n  }\n}\n\n\n\nmodule.exports = MapboxEventManager;\n","module.exports = {\n  'fr': {\n    'name': 'France',\n    'bbox': [[-4.59235, 41.380007], [9.560016, 51.148506]]\n  },\n  'us': {\n    'name': 'United States',\n    'bbox': [[-171.791111, 18.91619], [-66.96466, 71.357764]]\n  },\n  'ru': {\n    'name': 'Russia',\n    'bbox': [[19.66064, 41.151416], [190.10042, 81.2504]]\n  },\n  'ca': {\n    'name': 'Canada',\n    'bbox': [[-140.99778, 41.675105], [-52.648099, 83.23324]]\n  }\n};\n","function Geolocation() {}\n\nGeolocation.prototype = {\n\n  isSupport: function() {\n    return Boolean(window.navigator.geolocation);\n  },\n\n  getCurrentPosition: function() {\n    const positionOptions = {\n      enableHighAccuracy: true\n    };\n\n    return new Promise(function(resolve, reject) {\n      window.navigator.geolocation.getCurrentPosition(resolve, reject, positionOptions);\n    });\n  },\n}\n\nmodule.exports = Geolocation;\n","'use strict';\n\nvar Typeahead = require('suggestions');\nvar debounce = require('lodash.debounce');\nvar extend = require('xtend');\nvar EventEmitter = require('events').EventEmitter;\nvar exceptions = require('./exceptions');\nvar MapboxClient = require('@mapbox/mapbox-sdk');\nvar mbxGeocoder = require('@mapbox/mapbox-sdk/services/geocoding');\nvar MapboxEventManager = require('./events');\nvar localization = require('./localization');\nvar subtag = require('subtag');\nvar Geolocation = require('./geolocation');\nvar utils = require('./utils');\n\n\nconst GEOCODE_REQUEST_TYPE = {\n  FORWARD: 0,\n  LOCAL: 1,\n  REVERSE: 2,\n};\n\n/**\n * Don't include this as part of the options object when creating a new MapboxGeocoder instance.\n */\nfunction getFooterNode() {\n  var div = document.createElement('div');\n  div.className = 'mapboxgl-ctrl-geocoder--powered-by';\n  div.innerHTML = '<a href=\"https://www.mapbox.com/search-service\" target=\"_blank\">Powered by Mapbox</a>';\n\n  return div;\n}\n\n/**\n * A geocoder component using the [Mapbox Geocoding API](https://docs.mapbox.com/api/search/#geocoding)\n * @class MapboxGeocoder\n * @param {Object} options\n * @param {String} options.accessToken Required.\n * @param {String} [options.origin=https://api.mapbox.com] Use to set a custom API origin.\n * @param {Object} [options.mapboxgl] A [mapbox-gl](https://github.com/mapbox/mapbox-gl-js) instance to use when creating [Markers](https://docs.mapbox.com/mapbox-gl-js/api/#marker). Required if `options.marker` is `true`.\n * @param {Number} [options.zoom=16] On geocoded result what zoom level should the map animate to when a `bbox` isn't found in the response. If a `bbox` is found the map will fit to the `bbox`.\n * @param {Boolean|Object} [options.flyTo=true] If `false`, animating the map to a selected result is disabled. If `true`, animating the map will use the default animation parameters. If an object, it will be passed as `options` to the map [`flyTo`](https://docs.mapbox.com/mapbox-gl-js/api/#map#flyto) or [`fitBounds`](https://docs.mapbox.com/mapbox-gl-js/api/#map#fitbounds) method providing control over the animation of the transition.\n * @param {String} [options.placeholder=Search] Override the default placeholder attribute value.\n * @param {Object|'ip'} [options.proximity] a geographical point given as an object with `latitude` and `longitude` properties, or the string 'ip' to use a user's IP address location. Search results closer to this point will be given higher priority.\n * @param {Boolean} [options.trackProximity=true] If `true`, the geocoder proximity will dynamically update based on the current map view or user's IP location, depending on zoom level.\n * @param {Boolean} [options.collapsed=false] If `true`, the geocoder control will collapse until hovered or in focus.\n * @param {Boolean} [options.clearAndBlurOnEsc=false] If `true`, the geocoder control will clear it's contents and blur when user presses the escape key.\n * @param {Boolean} [options.clearOnBlur=false] If `true`, the geocoder control will clear its value when the input blurs.\n * @param {Array} [options.bbox] a bounding box argument: this is\n * a bounding box given as an array in the format `[minX, minY, maxX, maxY]`.\n * Search results will be limited to the bounding box.\n * @param {string} [options.countries] a comma separated list of country codes to\n * limit results to specified country or countries.\n * @param {string} [options.types] a comma seperated list of types that filter\n * results to match those specified. See https://docs.mapbox.com/api/search/#data-types\n * for available types.\n * If reverseGeocode is enabled and no type is specified, the type defaults to POIs. Otherwise, if you configure more than one type, the first type will be used.\n * @param {Number} [options.minLength=2] Minimum number of characters to enter before results are shown.\n * @param {Number} [options.limit=5] Maximum number of results to show.\n * @param {string} [options.language] Specify the language to use for response text and query result weighting. Options are IETF language tags comprised of a mandatory ISO 639-1 language code and optionally one or more IETF subtags for country or script. More than one value can also be specified, separated by commas. Defaults to the browser's language settings.\n * @param {Function} [options.filter] A function which accepts a Feature in the [Carmen GeoJSON](https://github.com/mapbox/carmen/blob/master/carmen-geojson.md) format to filter out results from the Geocoding API response before they are included in the suggestions list. Return `true` to keep the item, `false` otherwise.\n * @param {Function} [options.localGeocoder] A function accepting the query string which performs local geocoding to supplement results from the Mapbox Geocoding API. Expected to return an Array of GeoJSON Features in the [Carmen GeoJSON](https://github.com/mapbox/carmen/blob/master/carmen-geojson.md) format.\n * @param {Function} [options.externalGeocoder] A function accepting the query string and current features list which performs geocoding to supplement results from the Mapbox Geocoding API. Expected to return a Promise which resolves to an Array of GeoJSON Features in the [Carmen GeoJSON](https://github.com/mapbox/carmen/blob/master/carmen-geojson.md) format.\n * @param {distance|score} [options.reverseMode=distance] - Set the factors that are used to sort nearby results.\n * @param {boolean} [options.reverseGeocode=false] If `true`, enable reverse geocoding mode. In reverse geocoding, search input is expected to be coordinates in the form `lat, lon`, with suggestions being the reverse geocodes.\n * @param {boolean} [options.flipCoordinates=false] If `true`, search input coordinates for reverse geocoding is expected to be in the form `lon, lat` instead of the default `lat, lon`.\n * @param {Boolean} [options.enableEventLogging=true] Allow Mapbox to collect anonymous usage statistics from the plugin.\n * @param {Boolean|Object} [options.marker=true]  If `true`, a [Marker](https://docs.mapbox.com/mapbox-gl-js/api/#marker) will be added to the map at the location of the user-selected result using a default set of Marker options.  If the value is an object, the marker will be constructed using these options. If `false`, no marker will be added to the map. Requires that `options.mapboxgl` also be set.\n * @param {Function} [options.render] A function that specifies how the results should be rendered in the dropdown menu. This function should accepts a single [Carmen GeoJSON](https://github.com/mapbox/carmen/blob/master/carmen-geojson.md) object as input and return a string. Any HTML in the returned string will be rendered.\n * @param {Function} [options.getItemValue] A function that specifies how the selected result should be rendered in the search bar. This function should accept a single [Carmen GeoJSON](https://github.com/mapbox/carmen/blob/master/carmen-geojson.md) object as input and return a string. HTML tags in the output string will not be rendered. Defaults to `(item) => item.place_name`.\n * @param {String} [options.mode=mapbox.places] A string specifying the geocoding [endpoint](https://docs.mapbox.com/api/search/#endpoints) to query. Options are `mapbox.places` and `mapbox.places-permanent`. The `mapbox.places-permanent` mode requires an enterprise license for permanent geocodes.\n * @param {Boolean} [options.localGeocoderOnly=false] If `true`, indicates that the `localGeocoder` results should be the only ones returned to the user. If `false`, indicates that the `localGeocoder` results should be combined with those from the Mapbox API with the `localGeocoder` results ranked higher.\n * @param {Boolean} [options.autocomplete=true] Specify whether to return autocomplete results or not. When autocomplete is enabled, results will be included that start with the requested string, rather than just responses that match it exactly.\n * @param {Boolean} [options.fuzzyMatch=true] Specify whether the Geocoding API should attempt approximate, as well as exact, matching when performing searches, or whether it should opt out of this behavior and only attempt exact matching.\n * @param {Boolean} [options.routing=false] Specify whether to request additional metadata about the recommended navigation destination corresponding to the feature or not. Only applicable for address features.\n * @param {String} [options.worldview=\"us\"] Filter results to geographic features whose characteristics are defined differently by audiences belonging to various regional, cultural, or political groups.\n * @param {Boolean} [options.enableGeolocation=false] If `true` enable user geolocation feature.\n * @param {('address'|'street'|'place'|'country')} [options.addressAccuracy=\"street\"] The accuracy for the geolocation feature with which we define the address line to fill. The browser API returns the user's position with accuracy, and sometimes we can get the neighbor's address. To prevent receiving an incorrect address, you can reduce the accuracy of the definition.\n * @example\n * var geocoder = new MapboxGeocoder({ accessToken: mapboxgl.accessToken });\n * map.addControl(geocoder);\n * @return {MapboxGeocoder} `this`\n *\n */\n\nfunction MapboxGeocoder(options) {\n  this._eventEmitter = new EventEmitter();\n  this.options = extend({}, this.options, options);\n  this.inputString = '';\n  this.fresh = true;\n  this.lastSelected = null;\n  this.geolocation = new Geolocation();\n}\n\nMapboxGeocoder.prototype = {\n  options: {\n    zoom: 16,\n    flyTo: true,\n    trackProximity: true,\n    minLength: 2,\n    reverseGeocode: false,\n    flipCoordinates: false,\n    limit: 5,\n    origin: 'https://api.mapbox.com',\n    enableEventLogging: true,\n    marker: true,\n    mapboxgl: null,\n    collapsed: false,\n    clearAndBlurOnEsc: false,\n    clearOnBlur: false,\n    enableGeolocation: false,\n    addressAccuracy: 'street',\n    getItemValue: function(item) {\n      return item.place_name\n    },\n    render: function(item) {\n      var placeName = item.place_name.split(',');\n      return '<div class=\"mapboxgl-ctrl-geocoder--suggestion\"><div class=\"mapboxgl-ctrl-geocoder--suggestion-title\">' + placeName[0]+ '</div><div class=\"mapboxgl-ctrl-geocoder--suggestion-address\">' + placeName.splice(1, placeName.length).join(',') + '</div></div>';\n    }\n  },\n\n  /**\n   * Add the geocoder to a container. The container can be either a `mapboxgl.Map`, an `HTMLElement` or a CSS selector string.\n   *\n   * If the container is a [`mapboxgl.Map`](https://docs.mapbox.com/mapbox-gl-js/api/map/), this function will behave identically to [`Map.addControl(geocoder)`](https://docs.mapbox.com/mapbox-gl-js/api/map/#map#addcontrol).\n   * If the container is an instance of [`HTMLElement`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement), then the geocoder will be appended as a child of that [`HTMLElement`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement).\n   * If the container is a [CSS selector string](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors), the geocoder will be appended to the element returned from the query.\n   *\n   * This function will throw an error if the container is none of the above.\n   * It will also throw an error if the referenced HTML element cannot be found in the `document.body`.\n   *\n   * For example, if the HTML body contains the element `<div id='geocoder-container'></div>`, the following script will append the geocoder to `#geocoder-container`:\n   *\n   * ```javascript\n   * var geocoder = new MapboxGeocoder({ accessToken: mapboxgl.accessToken });\n   * geocoder.addTo('#geocoder-container');\n   * ```\n   * @param {String|HTMLElement|mapboxgl.Map} container A reference to the container to which to add the geocoder\n   */\n  addTo: function(container){\n\n    function addToExistingContainer (geocoder, container) {\n      if (!document.body.contains(container)) {\n        throw new Error(\"Element provided to #addTo() exists, but is not in the DOM\")\n      }\n      const el = geocoder.onAdd(); //returns the input elements, which are then added to the requested html container\n      container.appendChild(el);\n    }\n\n    // if the container is a map, add the control like normal\n    if (container._controlContainer){\n      //  it's a mapbox-gl map, add like normal\n      container.addControl(this);\n    }\n    // if the container is an HTMLElement, then set the parent to be that element\n    else if (container instanceof HTMLElement) {\n      addToExistingContainer(this, container);\n    }\n    // if the container is a string, treat it as a CSS query\n    else if (typeof container == 'string'){\n      const parent = document.querySelectorAll(container);\n      if (parent.length === 0){\n        throw new Error(\"Element \", container, \"not found.\")\n      }\n\n      if (parent.length > 1){\n        throw new Error(\"Geocoder can only be added to a single html element\")\n      }\n\n      addToExistingContainer(this, parent[0]);\n    }else{\n      throw new Error(\"Error: addTo must be a mapbox-gl-js map, an html element, or a CSS selector query for a single html element\")\n    }\n  },\n\n  onAdd: function(map) {\n    if (map && typeof map != 'string'){\n      this._map = map;\n    }\n\n    this.setLanguage();\n\n    if (!this.options.localGeocoderOnly){\n      this.geocoderService = mbxGeocoder(\n        MapboxClient({\n          accessToken: this.options.accessToken,\n          origin: this.options.origin\n        })\n      );\n    }\n\n    if (this.options.localGeocoderOnly && !this.options.localGeocoder){\n      throw new Error(\"A localGeocoder function must be specified to use localGeocoderOnly mode\")\n    }\n\n    this.eventManager = new MapboxEventManager(this.options);\n\n    this._onChange = this._onChange.bind(this);\n    this._onKeyDown = this._onKeyDown.bind(this);\n    this._onPaste = this._onPaste.bind(this);\n    this._onBlur = this._onBlur.bind(this);\n    this._showButton = this._showButton.bind(this);\n    this._hideButton = this._hideButton.bind(this);\n    this._onQueryResult = this._onQueryResult.bind(this);\n    this.clear = this.clear.bind(this);\n    this._updateProximity = this._updateProximity.bind(this);\n    this._collapse = this._collapse.bind(this);\n    this._unCollapse = this._unCollapse.bind(this);\n    this._clear = this._clear.bind(this);\n    this._clearOnBlur = this._clearOnBlur.bind(this);\n    this._geolocateUser = this._geolocateUser.bind(this);\n\n    var el = (this.container = document.createElement('div'));\n    el.className = 'mapboxgl-ctrl-geocoder mapboxgl-ctrl';\n\n    var searchIcon = this.createIcon('search', '<path d=\"M7.4 2.5c-2.7 0-4.9 2.2-4.9 4.9s2.2 4.9 4.9 4.9c1 0 1.8-.2 2.5-.8l3.7 3.7c.2.2.4.3.8.3.7 0 1.1-.4 1.1-1.1 0-.3-.1-.5-.3-.8L11.4 10c.4-.8.8-1.6.8-2.5.1-2.8-2.1-5-4.8-5zm0 1.6c1.8 0 3.2 1.4 3.2 3.2s-1.4 3.2-3.2 3.2-3.3-1.3-3.3-3.1 1.4-3.3 3.3-3.3z\"/>')\n\n    this._inputEl = document.createElement('input');\n    this._inputEl.type = 'text';\n    this._inputEl.className = 'mapboxgl-ctrl-geocoder--input';\n\n    this.setPlaceholder();\n\n    if (this.options.collapsed) {\n      this._collapse();\n      this.container.addEventListener('mouseenter', this._unCollapse);\n      this.container.addEventListener('mouseleave', this._collapse);\n      this._inputEl.addEventListener('focus', this._unCollapse);\n    }\n\n    if (this.options.collapsed || this.options.clearOnBlur) {\n      this._inputEl.addEventListener('blur', this._onBlur);\n    }\n\n    this._inputEl.addEventListener('keydown', debounce(this._onKeyDown, 200));\n    this._inputEl.addEventListener('paste', this._onPaste);\n    this._inputEl.addEventListener('change', this._onChange);\n    this.container.addEventListener('mouseenter', this._showButton);\n    this.container.addEventListener('mouseleave', this._hideButton);\n    this._inputEl.addEventListener('keyup', function(e){\n      this.eventManager.keyevent(e, this);\n    }.bind(this));\n\n    var actions = document.createElement('div');\n    actions.classList.add('mapboxgl-ctrl-geocoder--pin-right');\n\n    this._clearEl = document.createElement('button');\n    this._clearEl.setAttribute('aria-label', 'Clear');\n    this._clearEl.addEventListener('click', this.clear);\n    this._clearEl.className = 'mapboxgl-ctrl-geocoder--button';\n\n    var buttonIcon = this.createIcon('close', '<path d=\"M3.8 2.5c-.6 0-1.3.7-1.3 1.3 0 .3.2.7.5.8L7.2 9 3 13.2c-.3.3-.5.7-.5 1 0 .6.7 1.3 1.3 1.3.3 0 .7-.2 1-.5L9 10.8l4.2 4.2c.2.3.7.3 1 .3.6 0 1.3-.7 1.3-1.3 0-.3-.2-.7-.3-1l-4.4-4L15 4.6c.3-.2.5-.5.5-.8 0-.7-.7-1.3-1.3-1.3-.3 0-.7.2-1 .3L9 7.1 4.8 2.8c-.3-.1-.7-.3-1-.3z\"/>')\n    this._clearEl.appendChild(buttonIcon);\n\n    this._loadingEl = this.createIcon('loading', '<path fill=\"#333\" d=\"M4.4 4.4l.8.8c2.1-2.1 5.5-2.1 7.6 0l.8-.8c-2.5-2.5-6.7-2.5-9.2 0z\"/><path opacity=\".1\" d=\"M12.8 12.9c-2.1 2.1-5.5 2.1-7.6 0-2.1-2.1-2.1-5.5 0-7.7l-.8-.8c-2.5 2.5-2.5 6.7 0 9.2s6.6 2.5 9.2 0 2.5-6.6 0-9.2l-.8.8c2.2 2.1 2.2 5.6 0 7.7z\"/>');\n\n    actions.appendChild(this._clearEl);\n    actions.appendChild(this._loadingEl);\n\n    el.appendChild(searchIcon);\n    el.appendChild(this._inputEl);\n    el.appendChild(actions);\n\n    if (this.options.enableGeolocation && this.geolocation.isSupport()) {\n      this._geolocateEl = document.createElement('button');\n      this._geolocateEl.setAttribute('aria-label', 'Geolocate');\n      this._geolocateEl.addEventListener('click', this._geolocateUser);\n      this._geolocateEl.className = 'mapboxgl-ctrl-geocoder--button';\n\n      var geolocateIcon = this.createIcon('geolocate', '<path d=\"M12.999 3.677L2.042 8.269c-.962.403-.747 1.823.29 1.912l5.032.431.431 5.033c.089 1.037 1.509 1.252 1.912.29l4.592-10.957c.345-.822-.477-1.644-1.299-1.299z\" fill=\"#4264fb\"/>');\n      this._geolocateEl.appendChild(geolocateIcon);\n\n      actions.appendChild(this._geolocateEl);\n      this._showGeolocateButton();\n    }\n\n    var typeahead = this._typeahead = new Typeahead(this._inputEl, [], {\n      filter: false,\n      minLength: this.options.minLength,\n      limit: this.options.limit\n    });\n\n    this.setRenderFunction(this.options.render);\n    typeahead.getItemValue = this.options.getItemValue;\n\n    // Add support for footer.\n    var parentDraw = typeahead.list.draw;\n    var footerNode = this._footerNode = getFooterNode();\n    typeahead.list.draw = function() {\n      parentDraw.call(this);\n\n      footerNode.addEventListener('mousedown', function() {\n        this.selectingListItem = true;\n      }.bind(this));\n    \n      footerNode.addEventListener('mouseup', function() {\n        this.selectingListItem = false;\n      }.bind(this));\n\n      this.element.appendChild(footerNode);\n    };\n\n    this.mapMarker = null;\n    this._handleMarker = this._handleMarker.bind(this);\n    if (this._map){\n      if (this.options.trackProximity ) {\n        this._updateProximity();\n        this._map.on('moveend', this._updateProximity);\n      }\n      this._mapboxgl = this.options.mapboxgl;\n      if (!this._mapboxgl && this.options.marker) {\n        // eslint-disable-next-line no-console\n        console.error(\"No mapboxgl detected in options. Map markers are disabled. Please set options.mapboxgl.\");\n        this.options.marker = false;\n      }\n    }\n    return el;\n  },\n\n  _geolocateUser: function () {\n    this._hideGeolocateButton();\n    this._showLoadingIcon();\n\n    this.geolocation.getCurrentPosition().then(function(geolocationPosition) {\n      this._hideLoadingIcon();\n\n      const geojson = {\n        geometry: {\n          type: 'Point',\n          coordinates: [geolocationPosition.coords.longitude, geolocationPosition.coords.latitude]\n        }\n      };\n\n      this._handleMarker(geojson);\n      this._fly(geojson);\n\n      this._typeahead.clear();\n      this._typeahead.selected = true;\n      this.lastSelected = JSON.stringify(geojson);\n      this._showClearButton();\n      this.fresh = false;\n\n      const config = {\n        limit: 1,\n        language: [this.options.language],\n        query: geojson.geometry.coordinates,\n        types: [\"address\"]\n      };\n\n      if (this.options.localGeocoderOnly) {\n        const text = geojson.geometry.coordinates[0] + ',' + geojson.geometry.coordinates[1]\n        this._setInputValue(text);\n\n        this._eventEmitter.emit('result', { result: geojson });\n      } else {\n        this.geocoderService.reverseGeocode(config).send().then(function (resp) {\n          const feature = resp.body.features[0];\n  \n          if (feature) {\n            const locationText = utils.transformFeatureToGeolocationText(feature, this.options.addressAccuracy);\n            this._setInputValue(locationText);\n  \n            feature.user_coordinates = geojson.geometry.coordinates;\n            this._eventEmitter.emit('result', { result: feature });\n          } else {\n            this._eventEmitter.emit('result', { result: { user_coordinates: geojson.geometry.coordinates } });\n          }\n        }.bind(this));\n      }\n    }.bind(this)).catch(function(error) {\n      if (error.code === 1) {\n        this._renderUserDeniedGeolocationError();\n      } else {\n        this._renderLocationError();\n      }\n\n      this._hideLoadingIcon();\n      this._showGeolocateButton();\n      this._hideAttribution();\n    }.bind(this));\n  },\n\n  createIcon: function(name, path) {\n    var icon = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n    icon.setAttribute('class', 'mapboxgl-ctrl-geocoder--icon mapboxgl-ctrl-geocoder--icon-' + name);\n    icon.setAttribute('viewBox', '0 0 18 18');\n    icon.setAttribute('xml:space','preserve');\n    icon.setAttribute('width', 18);\n    icon.setAttribute('height', 18);\n    icon.innerHTML = path;\n    return icon;\n  },\n\n  onRemove: function() {\n    this.container.parentNode.removeChild(this.container);\n\n    if (this.options.trackProximity && this._map) {\n      this._map.off('moveend', this._updateProximity);\n    }\n\n    this._removeMarker();\n\n    this._map = null;\n\n    return this;\n  },\n\n  _setInputValue: function (value) {\n    this._inputEl.value = value;\n  \n    setTimeout(function () {\n      this._inputEl.focus();\n      this._inputEl.scrollLeft = 0;\n      this._inputEl.setSelectionRange(0, 0);\n    }.bind(this), 1);\n  },\n\n  _onPaste: function(e){\n    var value = (e.clipboardData || window.clipboardData).getData('text');\n    if (value.length >= this.options.minLength) {\n      this._geocode(value);\n    }\n  },\n\n  _onKeyDown: function(e) {\n    var ESC_KEY_CODE = 27,\n      TAB_KEY_CODE = 9;\n\n    if (e.keyCode === ESC_KEY_CODE && this.options.clearAndBlurOnEsc) {\n      this._clear(e);\n      return this._inputEl.blur();\n    }\n\n    // if target has shadowRoot, then get the actual active element inside the shadowRoot\n    var target = e.target && e.target.shadowRoot\n      ? e.target.shadowRoot.activeElement\n      : e.target;\n    var value = target ? target.value : '';\n\n    if (!value) {\n      this.fresh = true;\n      // the user has removed all the text\n      if (e.keyCode !== TAB_KEY_CODE) this.clear(e);\n      this._showGeolocateButton();\n      return this._hideClearButton();\n    }\n\n    this._hideGeolocateButton();\n\n    // TAB, ESC, LEFT, RIGHT, ENTER, UP, DOWN\n    if ((e.metaKey || [TAB_KEY_CODE, ESC_KEY_CODE, 37, 39, 13, 38, 40].indexOf(e.keyCode) !== -1))\n      return;\n\n    if (target.value.length >= this.options.minLength) {\n      this._geocode(target.value);\n    }\n  },\n\n  _showButton: function() {\n    if (this._typeahead.selected) this._showClearButton();\n  },\n\n  _hideButton: function() {\n    if (this._typeahead.selected) this._hideClearButton();\n  },\n\n  _showClearButton: function() {\n    this._clearEl.style.display = 'block';\n  },\n\n  _hideClearButton: function() {\n    this._clearEl.style.display = 'none'\n  },\n\n  _showGeolocateButton: function() {\n    if (this._geolocateEl && this.geolocation.isSupport()) {\n      this._geolocateEl.style.display = 'block';\n    }\n  },\n\n  _hideGeolocateButton: function() {\n    if (this._geolocateEl) {\n      this._geolocateEl.style.display = 'none';\n    }\n  },\n\n  _showLoadingIcon: function() {\n    this._loadingEl.style.display = 'block';\n  },\n  \n  _hideLoadingIcon: function() {\n    this._loadingEl.style.display = 'none';\n  },\n\n  _showAttribution: function() {\n    this._footerNode.style.display = 'block'\n  },\n  \n  _hideAttribution: function() {\n    this._footerNode.style.display = 'none'\n  },\n\n  _onBlur: function(e) {\n    if (this.options.clearOnBlur) {\n      this._clearOnBlur(e);\n    }\n    if (this.options.collapsed) {\n      this._collapse();\n    }\n  },\n  _onChange: function() {\n    var selected = this._typeahead.selected;\n    if (selected  && JSON.stringify(selected) !== this.lastSelected) {\n      this._hideClearButton();\n      if (this.options.flyTo) {\n        this._fly(selected);\n      }\n      if (this.options.marker && this._mapboxgl){\n        this._handleMarker(selected);\n      }\n\n      // After selecting a feature, re-focus the textarea and set\n      // cursor at start.\n      this._inputEl.focus();\n      this._inputEl.scrollLeft = 0;\n      this._inputEl.setSelectionRange(0, 0);\n      this.lastSelected = JSON.stringify(selected);\n      this._eventEmitter.emit('result', { result: selected });\n      this.eventManager.select(selected, this);\n    }\n  },\n\n  _fly: function(selected) {\n    var flyOptions;\n    if (selected.properties && exceptions[selected.properties.short_code]) {\n      // Certain geocoder search results return (and therefore zoom to fit)\n      // an unexpectedly large bounding box: for example, both Russia and the\n      // USA span both sides of -180/180, or France includes the island of\n      // Reunion in the Indian Ocean. An incomplete list of these exceptions\n      // at ./exceptions.json provides \"reasonable\" bounding boxes as a\n      // short-term solution; this may be amended as necessary.\n      flyOptions = extend({}, this.options.flyTo);\n      if (this._map){\n        this._map.fitBounds(exceptions[selected.properties.short_code].bbox, flyOptions);\n      }\n    } else if (selected.bbox) {\n      var bbox = selected.bbox;\n      flyOptions = extend({}, this.options.flyTo);\n      if (this._map){\n        this._map.fitBounds([[bbox[0], bbox[1]], [bbox[2], bbox[3]]], flyOptions);\n      }\n    } else {\n      var defaultFlyOptions = {\n        zoom: this.options.zoom\n      }\n      flyOptions = extend({}, defaultFlyOptions, this.options.flyTo);\n      //  ensure that center is not overriden by custom options\n      if (selected.center) {\n        flyOptions.center = selected.center;\n      } else if (selected.geometry && selected.geometry.type && selected.geometry.type === 'Point' && selected.geometry.coordinates) {\n        flyOptions.center = selected.geometry.coordinates;\n      }\n\n      if (this._map){\n        this._map.flyTo(flyOptions);\n      }\n    }\n  },\n\n  _requestType: function(options, search) {\n    var type;\n    if (options.localGeocoderOnly) {\n      type = GEOCODE_REQUEST_TYPE.LOCAL;\n    } else if (options.reverseGeocode && utils.REVERSE_GEOCODE_COORD_RGX.test(search)) {\n      type = GEOCODE_REQUEST_TYPE.REVERSE;\n    } else {\n      type = GEOCODE_REQUEST_TYPE.FORWARD;\n    }\n    return type;\n  },\n\n  _setupConfig: function(requestType, search) {\n    // Possible config properties to pass to client\n    const keys = [\n      'bbox',\n      'limit',\n      'proximity',\n      'countries',\n      'types',\n      'language',\n      'reverseMode',\n      'mode',\n      'autocomplete',\n      'fuzzyMatch',\n      'routing',\n      'worldview'\n    ];\n    const spacesOrCommaRgx = /[\\s,]+/;\n\n    var self = this;\n    var config = keys.reduce(function(config, key) {\n      // don't include undefined/null params, but allow boolean, among other, values\n      if (self.options[key] === undefined || self.options[key] === null) {\n        return config;\n      }\n\n      // countries, types, and language need to be passed in as arrays to client\n      // https://github.com/mapbox/mapbox-sdk-js/blob/master/services/geocoding.js#L38-L47\n      ['countries', 'types', 'language'].indexOf(key) > -1\n        ? (config[key] = self.options[key].split(spacesOrCommaRgx))\n        : (config[key] = self.options[key]);\n\n      const isCoordKey =\n        typeof self.options[key].longitude === 'number' &&\n        typeof self.options[key].latitude  === 'number';\n\n      if (key === 'proximity' && isCoordKey) {\n        const lng = self.options[key].longitude;\n        const lat = self.options[key].latitude;\n\n        config[key] = [lng, lat];\n      }\n\n      return config;\n    }, {});\n\n    switch (requestType) {\n    case GEOCODE_REQUEST_TYPE.REVERSE: {\n      var coords = search.split(spacesOrCommaRgx).map(function(c) {\n        return parseFloat(c, 10);\n      })\n      if (!self.options.flipCoordinates) {\n        coords.reverse();\n      }\n\n      // client only accepts one type for reverseGeocode, so\n      // use first config type if one, if not default to poi\n      config.types ? [config.types[0]] : [\"poi\"];\n      config = extend(config, { query: coords, limit: 1 });\n\n      // Remove config options not supported by the reverseGeocoder\n      ['proximity', 'autocomplete', 'fuzzyMatch', 'bbox'].forEach(function(key) {\n        if (key in config) {\n          delete config[key]\n        }\n      });\n    } break;\n    case GEOCODE_REQUEST_TYPE.FORWARD: {\n      // Ensure that any reverse geocoding looking request is cleaned up\n      // to be processed as only a forward geocoding request by the server.\n      const trimmedSearch = search.trim();\n      const reverseGeocodeCoordRgx = /^(-?\\d{1,3}(\\.\\d{0,256})?)[, ]+(-?\\d{1,3}(\\.\\d{0,256})?)?$/;\n      if (reverseGeocodeCoordRgx.test(trimmedSearch)) {\n        search = search.replace(/,/g, ' ');\n      }\n      config = extend(config, { query: search });\n    } break;\n    }\n\n    return config;\n  },\n\n  _geocode: function(searchInput) {\n    this.inputString = searchInput;\n    this._showLoadingIcon();\n    this._eventEmitter.emit('loading', { query: searchInput });\n\n    const requestType = this._requestType(this.options, searchInput);\n    const config = this._setupConfig(requestType, searchInput);\n\n    var request;\n    switch (requestType) {\n    case GEOCODE_REQUEST_TYPE.LOCAL:\n      request = Promise.resolve();\n      break;\n    case GEOCODE_REQUEST_TYPE.FORWARD:\n      request = this.geocoderService.forwardGeocode(config).send();\n      break;\n    case GEOCODE_REQUEST_TYPE.REVERSE:\n      request = this.geocoderService.reverseGeocode(config).send();\n      break;\n    }\n\n    var localGeocoderRes = this.options.localGeocoder ? this.options.localGeocoder(searchInput) || [] : [];\n    var externalGeocoderRes = [];\n\n    var geocoderError = null;\n    request.catch(function(error) {\n      geocoderError = error;\n    }.bind(this))\n      .then(\n        function(response) {\n          this._hideLoadingIcon();\n\n          var res = {};\n\n          if (!response){\n            res = {\n              type: 'FeatureCollection',\n              features: []\n            }\n          } else if (response.statusCode == '200') {\n            res = response.body;\n            res.request = response.request\n            res.headers = response.headers\n          }\n\n          res.config = config;\n\n          if (this.fresh){\n            this.eventManager.start(this);\n            this.fresh = false;\n          }\n\n          // supplement Mapbox Geocoding API results with locally populated results\n          res.features = res.features\n            ? localGeocoderRes.concat(res.features)\n            : localGeocoderRes;\n\n          if (this.options.externalGeocoder) {\n\n            externalGeocoderRes = this.options.externalGeocoder(searchInput, res.features) || Promise.resolve([]);\n            // supplement Mapbox Geocoding API results with features returned by a promise\n            return externalGeocoderRes.then(function(features) {\n              res.features = res.features ? features.concat(res.features) : features;\n              return res;\n            }, function(){\n              // on error, display the original result\n              return res;\n            });\n          }\n          return res;\n\n        }.bind(this)).then(\n        function(res) {\n          if (geocoderError) {\n            throw geocoderError;\n          }\n\n          // apply results filter if provided\n          if (this.options.filter && res.features.length) {\n            res.features = res.features.filter(this.options.filter);\n          }\n\n          if (res.features.length) {\n            this._showClearButton();\n            this._hideGeolocateButton();\n            this._showAttribution();\n            this._eventEmitter.emit('results', res);\n            this._typeahead.update(res.features);\n          } else {\n            this._hideClearButton();\n            this._hideAttribution();\n            this._typeahead.selected = null;\n            this._renderNoResults();\n            this._eventEmitter.emit('results', res);\n          }\n\n        }.bind(this)\n      ).catch(\n        function(err) {\n          this._hideLoadingIcon();\n          this._hideAttribution();\n\n          // in the event of an error in the Mapbox Geocoding API still display results from the localGeocoder\n          if ((localGeocoderRes.length && this.options.localGeocoder) || (externalGeocoderRes.length && this.options.externalGeocoder) ) {\n            this._showClearButton();\n            this._hideGeolocateButton();\n            this._typeahead.update(localGeocoderRes);\n          } else {\n            this._hideClearButton();\n            this._typeahead.selected = null;\n            this._renderError();\n          }\n\n          this._eventEmitter.emit('results', { features: localGeocoderRes });\n          this._eventEmitter.emit('error', { error: err });\n        }.bind(this)\n      );\n\n    return request;\n  },\n\n  /**\n   * Shared logic for clearing input\n   * @param {Event} [ev] the event that triggered the clear, if available\n   * @private\n   *\n   */\n  _clear: function(ev) {\n    if (ev) ev.preventDefault();\n    this._inputEl.value = '';\n    this._typeahead.selected = null;\n    this._typeahead.clear();\n    this._onChange();\n    this._hideClearButton();\n    this._showGeolocateButton();\n    this._removeMarker();\n    this.lastSelected = null;\n    this._eventEmitter.emit('clear');\n    this.fresh = true;\n  },\n\n  /**\n   * Clear and then focus the input.\n   * @param {Event} [ev] the event that triggered the clear, if available\n   *\n   */\n  clear: function(ev) {\n    this._clear(ev);\n    this._inputEl.focus();\n  },\n\n\n  /**\n   * Clear the input, without refocusing it. Used to implement clearOnBlur\n   * constructor option.\n   * @param {Event} [ev] the blur event\n   * @private\n   */\n  _clearOnBlur: function(ev) {\n    var ctx = this;\n\n    /*\n     * If relatedTarget is not found, assume user targeted the suggestions list.\n     * In that case, do not clear on blur. There are other edge cases where\n     * ev.relatedTarget could be null. Clicking on list always results in null\n     * relatedtarget because of upstream behavior in `suggestions`.\n     *\n     * The ideal solution would be to check if ev.relatedTarget is a child of\n     * the list. See issue #258 for details on why we can't do that yet.\n     */\n    if (ev.relatedTarget) {\n      ctx._clear(ev);\n    }\n  },\n\n  _onQueryResult: function(response) {\n    var results = response.body;\n    if (!results.features.length) return;\n    var result = results.features[0];\n    this._typeahead.selected = result;\n    this._inputEl.value = result.place_name;\n    this._onChange();\n  },\n\n  _updateProximity: function() {\n    // proximity is designed for local scale, if the user is looking at the whole world,\n    // it doesn't make sense to factor in the arbitrary centre of the map\n    if (!this._map || !this.options.trackProximity){\n      return;\n    }\n    if (this._map.getZoom() > 9) {\n      var center = this._map.getCenter().wrap();\n      this.setProximity({ longitude: center.lng, latitude: center.lat }, false);\n    } else {\n      this.setProximity(null, false);\n    }\n  },\n\n  _collapse: function() {\n    // do not collapse if input is in focus\n    if (!this._inputEl.value && this._inputEl !== document.activeElement) this.container.classList.add('mapboxgl-ctrl-geocoder--collapsed');\n  },\n\n  _unCollapse: function() {\n    this.container.classList.remove('mapboxgl-ctrl-geocoder--collapsed');\n  },\n\n  /**\n   * Set & query the input\n   * @param {string} searchInput location name or other search input\n   * @returns {MapboxGeocoder} this\n   */\n  query: function(searchInput) {\n    this._geocode(searchInput).then(this._onQueryResult);\n    return this;\n  },\n\n  _renderError: function(){\n    var errorMessage = \"<div class='mapbox-gl-geocoder--error'>There was an error reaching the server</div>\"\n    this._renderMessage(errorMessage);\n  },\n\n  _renderLocationError: function(){\n    var errorMessage = \"<div class='mapbox-gl-geocoder--error'>A location error has occurred</div>\"\n    this._renderMessage(errorMessage);\n  },\n\n  _renderNoResults: function(){\n    var errorMessage = \"<div class='mapbox-gl-geocoder--error mapbox-gl-geocoder--no-results'>No results found</div>\";\n    this._renderMessage(errorMessage);\n  },\n\n  _renderUserDeniedGeolocationError: function() {\n    var errorMessage = \"<div class='mapbox-gl-geocoder--error'>Geolocation permission denied</div>\"\n    this._renderMessage(errorMessage);\n  },\n\n  _renderMessage: function(msg){\n    this._typeahead.update([]);\n    this._typeahead.selected = null;\n    this._typeahead.clear();\n    this._typeahead.renderError(msg);\n  },\n\n  /**\n   * Get the text to use as the search bar placeholder\n   *\n   * If placeholder is provided in options, then use options.placeholder\n   * Otherwise, if language is provided in options, then use the localized string of the first language if available\n   * Otherwise use the default\n   *\n   * @returns {String} the value to use as the search bar placeholder\n   * @private\n   */\n  _getPlaceholderText: function(){\n    if (this.options.placeholder) return this.options.placeholder;\n    if (this.options.language){\n      var firstLanguage = this.options.language.split(\",\")[0];\n      var language = subtag.language(firstLanguage);\n      var localizedValue = localization.placeholder[language];\n      if (localizedValue)  return localizedValue;\n    }\n    return 'Search';\n  },\n\n  /**\n   * Set input\n   * @param {string} searchInput location name or other search input\n   * @param {boolean} [showSuggestions=false] display suggestion on setInput call\n   * @returns {MapboxGeocoder} this\n   */\n  setInput: function(searchInput, showSuggestions) {\n    if (showSuggestions === undefined) {\n      showSuggestions = false\n    }\n    // Set input value to passed value and clear everything else.\n    this._inputEl.value = searchInput;\n    this._typeahead.selected = null;\n    this._typeahead.clear();\n    if (searchInput.length >= this.options.minLength) {\n      showSuggestions ? this._geocode(searchInput) : this._onChange();\n    }\n    return this;\n  },\n\n  /**\n   * Set proximity\n   * @param {Object|'ip'} proximity The new `options.proximity` value. This is a geographical point given as an object with `latitude` and `longitude` properties or the string 'ip'.\n   * @param {Boolean} disableTrackProximity If true, sets `trackProximity` to false. True by default to prevent `trackProximity` from unintentionally overriding an explicitly set proximity value.\n   * @returns {MapboxGeocoder} this\n   */\n  setProximity: function(proximity, disableTrackProximity = true) {\n    this.options.proximity = proximity;\n    if (disableTrackProximity) {\n      this.options.trackProximity = false;\n    }\n    return this;\n  },\n\n  /**\n   * Get proximity\n   * @returns {Object} The geocoder proximity\n   */\n  getProximity: function() {\n    return this.options.proximity;\n  },\n\n  /**\n   * Set the render function used in the results dropdown\n   * @param {Function} fn The function to use as a render function. This function accepts a single [Carmen GeoJSON](https://github.com/mapbox/carmen/blob/master/carmen-geojson.md) object as input and returns a string.\n   * @returns {MapboxGeocoder} this\n   */\n  setRenderFunction: function(fn){\n    if (fn && typeof(fn) == \"function\"){\n      this._typeahead.render = fn;\n    }\n    return this;\n  },\n\n  /**\n   * Get the function used to render the results dropdown\n   *\n   * @returns {Function} the render function\n   */\n  getRenderFunction: function(){\n    return this._typeahead.render;\n  },\n\n  /**\n   * Get the language to use in UI elements and when making search requests\n   *\n   * Look first at the explicitly set options otherwise use the browser's language settings\n   * @param {String} language Specify the language to use for response text and query result weighting. Options are IETF language tags comprised of a mandatory ISO 639-1 language code and optionally one or more IETF subtags for country or script. More than one value can also be specified, separated by commas.\n   * @returns {MapboxGeocoder} this\n   */\n  setLanguage: function(language){\n    var browserLocale = navigator.language || navigator.userLanguage || navigator.browserLanguage;\n    this.options.language = language || this.options.language || browserLocale;\n    return this;\n  },\n\n  /**\n   * Get the language to use in UI elements and when making search requests\n   * @returns {String} The language(s) used by the plugin, if any\n   */\n  getLanguage: function(){\n    return this.options.language;\n  },\n\n  /**\n   * Get the zoom level the map will move to when there is no bounding box on the selected result\n   * @returns {Number} the map zoom\n   */\n  getZoom: function(){\n    return this.options.zoom;\n  },\n\n  /**\n   * Set the zoom level\n   * @param {Number} zoom The zoom level that the map should animate to when a `bbox` isn't found in the response. If a `bbox` is found the map will fit to the `bbox`.\n   * @returns {MapboxGeocoder} this\n   */\n  setZoom: function(zoom){\n    this.options.zoom = zoom;\n    return this;\n  },\n\n  /**\n   * Get the parameters used to fly to the selected response, if any\n   * @returns {Boolean|Object} The `flyTo` option\n   */\n  getFlyTo: function(){\n    return this.options.flyTo;\n  },\n\n  /**\n   * Set the flyTo options\n   * @param {Boolean|Object} flyTo If false, animating the map to a selected result is disabled. If true, animating the map will use the default animation parameters. If an object, it will be passed as `options` to the map [`flyTo`](https://docs.mapbox.com/mapbox-gl-js/api/#map#flyto) or [`fitBounds`](https://docs.mapbox.com/mapbox-gl-js/api/#map#fitbounds) method providing control over the animation of the transition.\n   */\n  setFlyTo: function(flyTo){\n    this.options.flyTo = flyTo;\n    return this;\n  },\n\n  /**\n   * Get the value of the placeholder string\n   * @returns {String} The input element's placeholder value\n   */\n  getPlaceholder: function(){\n    return this.options.placeholder;\n  },\n\n  /**\n   * Set the value of the input element's placeholder\n   * @param {String} placeholder the text to use as the input element's placeholder\n   * @returns {MapboxGeocoder} this\n   */\n  setPlaceholder: function(placeholder){\n    this.options.placeholder = (placeholder) ? placeholder : this._getPlaceholderText();\n    this._inputEl.placeholder = this.options.placeholder;\n    this._inputEl.setAttribute('aria-label', this.options.placeholder);\n    return this\n  },\n\n  /**\n   * Get the bounding box used by the plugin\n   * @returns {Array<Number>} the bounding box, if any\n   */\n  getBbox: function(){\n    return this.options.bbox;\n  },\n\n  /**\n   * Set the bounding box to limit search results to\n   * @param {Array<Number>} bbox a bounding box given as an array in the format [minX, minY, maxX, maxY].\n   * @returns {MapboxGeocoder} this\n   */\n  setBbox: function(bbox){\n    this.options.bbox = bbox;\n    return this;\n  },\n\n  /**\n   * Get a list of the countries to limit search results to\n   * @returns {String} a comma separated list of countries to limit to, if any\n   */\n  getCountries: function(){\n    return this.options.countries;\n  },\n\n  /**\n   * Set the countries to limit search results to\n   * @param {String} countries a comma separated list of countries to limit to\n   * @returns {MapboxGeocoder} this\n   */\n  setCountries: function(countries){\n    this.options.countries = countries;\n    return this;\n  },\n\n  /**\n   * Get a list of the types to limit search results to\n   * @returns {String} a comma separated list of types to limit to\n   */\n  getTypes: function(){\n    return this.options.types;\n  },\n\n  /**\n   * Set the types to limit search results to\n   * @param {String} countries a comma separated list of types to limit to\n   * @returns {MapboxGeocoder} this\n   */\n  setTypes: function(types){\n    this.options.types = types;\n    return this;\n  },\n\n  /**\n   * Get the minimum number of characters typed to trigger results used in the plugin\n   * @returns {Number} The minimum length in characters before a search is triggered\n   */\n  getMinLength: function(){\n    return this.options.minLength;\n  },\n\n  /**\n   * Set the minimum number of characters typed to trigger results used by the plugin\n   * @param {Number} minLength the minimum length in characters\n   * @returns {MapboxGeocoder} this\n   */\n  setMinLength: function(minLength){\n    this.options.minLength = minLength;\n    if (this._typeahead)  this._typeahead.options.minLength = minLength;\n    return this;\n  },\n\n  /**\n   * Get the limit value for the number of results to display used by the plugin\n   * @returns {Number} The limit value for the number of results to display used by the plugin\n   */\n  getLimit: function(){\n    return this.options.limit;\n  },\n\n  /**\n   * Set the limit value for the number of results to display used by the plugin\n   * @param {Number} limit the number of search results to return\n   * @returns {MapboxGeocoder}\n   */\n  setLimit: function(limit){\n    this.options.limit = limit;\n    if (this._typeahead) this._typeahead.options.limit = limit;\n    return this;\n  },\n\n  /**\n   * Get the filter function used by the plugin\n   * @returns {Function} the filter function\n   */\n  getFilter: function(){\n    return this.options.filter;\n  },\n\n  /**\n   * Set the filter function used by the plugin.\n   * @param {Function} filter A function which accepts a Feature in the [Carmen GeoJSON](https://github.com/mapbox/carmen/blob/master/carmen-geojson.md) format to filter out results from the Geocoding API response before they are included in the suggestions list. Return `true` to keep the item, `false` otherwise.\n   * @returns {MapboxGeocoder} this\n   */\n  setFilter: function(filter){\n    this.options.filter = filter;\n    return this;\n  },\n\n  /**\n   * Set the geocoding endpoint used by the plugin.\n   * @param {Function} origin A function which accepts an HTTPS URL to specify the endpoint to query results from.\n   * @returns {MapboxGeocoder} this\n   */\n  setOrigin: function(origin){\n    this.options.origin = origin;\n    this.geocoderService = mbxGeocoder(\n      MapboxClient({\n        accessToken: this.options.accessToken,\n        origin: this.options.origin\n      })\n    );\n    return this;\n  },\n\n  /**\n   * Get the geocoding endpoint the plugin is currently set to\n   * @returns {Function} the endpoint URL\n   */\n  getOrigin: function(){\n    return this.options.origin;\n  },\n\n  /**\n   * Set the accessToken option used for the geocoding request endpoint.\n   * @param {String} accessToken value\n   * @returns {MapboxGeocoder} this\n   */\n  setAccessToken: function(accessToken){\n    this.options.accessToken = accessToken;\n    this.geocoderService = mbxGeocoder(\n      MapboxClient({\n        accessToken: this.options.accessToken,\n        origin: this.options.origin\n      })\n    );\n    return this;\n  },\n\n  /**\n   * Set the autocomplete option used for geocoding requests\n   * @param {Boolean} value The boolean value to set autocomplete to\n   * @returns\n   */\n  setAutocomplete: function(value){\n    this.options.autocomplete = value;\n    return this;\n  },\n\n  /**\n   * Get the current autocomplete parameter value used for requests\n   * @returns {Boolean} The autocomplete parameter value\n   */\n  getAutocomplete: function(){\n    return this.options.autocomplete\n  },\n\n  /**\n   * Set the fuzzyMatch option used for approximate matching in geocoding requests\n   * @param {Boolean} value The boolean value to set fuzzyMatch to\n   * @returns\n   */\n  setFuzzyMatch: function(value){\n    this.options.fuzzyMatch = value;\n    return this;\n  },\n\n  /**\n   * Get the current fuzzyMatch parameter value used for requests\n   * @returns {Boolean} The fuzzyMatch parameter value\n   */\n  getFuzzyMatch: function(){\n    return this.options.fuzzyMatch\n  },\n\n  /**\n   * Set the routing parameter used to ask for routable point metadata in geocoding requests\n   * @param {Boolean} value The boolean value to set routing to\n   * @returns\n   */\n  setRouting: function(value){\n    this.options.routing = value;\n    return this;\n  },\n\n  /**\n   * Get the current routing parameter value used for requests\n   * @returns {Boolean} The routing parameter value\n   */\n  getRouting: function(){\n    return this.options.routing\n  },\n\n  /**\n   * Set the worldview parameter\n   * @param {String} code The country code representing the worldview (e.g. \"us\" | \"cn\" | \"jp\", \"in\")\n   * @returns\n   */\n  setWorldview: function(code){\n    this.options.worldview = code;\n    return this;\n  },\n\n  /**\n   * Get the current worldview parameter value used for requests\n   * @returns {String} The worldview parameter value\n   */\n  getWorldview: function(){\n    return this.options.worldview\n  },\n\n  /**\n   * Handle the placement of a result marking the selected result\n   * @private\n   * @param {Object} selected the selected geojson feature\n   * @returns {MapboxGeocoder} this\n   */\n  _handleMarker: function(selected){\n    // clean up any old marker that might be present\n    if (!this._map){\n      return;\n    }\n    this._removeMarker();\n    var defaultMarkerOptions = {\n      color: '#4668F2'\n    }\n    var markerOptions = extend({}, defaultMarkerOptions, this.options.marker)\n    this.mapMarker = new this._mapboxgl.Marker(markerOptions);\n    if (selected.center) {\n      this.mapMarker\n        .setLngLat(selected.center)\n        .addTo(this._map);\n    } else if (selected.geometry && selected.geometry.type && selected.geometry.type === 'Point' && selected.geometry.coordinates) {\n      this.mapMarker\n        .setLngLat(selected.geometry.coordinates)\n        .addTo(this._map);\n    }\n    return this;\n  },\n\n  /**\n   * Handle the removal of a result marker\n   * @private\n   */\n  _removeMarker: function(){\n    if (this.mapMarker){\n      this.mapMarker.remove();\n      this.mapMarker = null;\n    }\n  },\n\n  /**\n   * Subscribe to events that happen within the plugin.\n   * @param {String} type name of event. Available events and the data passed into their respective event objects are:\n   *\n   * - __clear__ `Emitted when the input is cleared`\n   * - __loading__ `{ query } Emitted when the geocoder is looking up a query`\n   * - __results__ `{ results } Fired when the geocoder returns a response`\n   * - __result__ `{ result } Fired when input is set`\n   * - __error__ `{ error } Error as string`\n   * @param {Function} fn function that's called when the event is emitted.\n   * @returns {MapboxGeocoder} this;\n   */\n  on: function(type, fn) {\n    this._eventEmitter.on(type, fn);\n    return this;\n  },\n\n  /**\n   * Remove an event\n   * @returns {MapboxGeocoder} this\n   * @param {String} type Event name.\n   * @param {Function} fn Function that should unsubscribe to the event emitted.\n   */\n  off: function(type, fn) {\n    this._eventEmitter.removeListener(type, fn);\n    this.eventManager.remove();\n    return this;\n  }\n};\n\nmodule.exports = MapboxGeocoder;\n","'use strict';\n\n/**\n * Localized values for the placeholder string\n * \n * @private\n */\nvar placeholder = {\n  // list drawn from https://docs.mapbox.com/api/search/#language-coverage\n  'de': 'Suche', // german\n  'it': 'Ricerca', //italian\n  'en': 'Search', // english\n  'nl': 'Zoeken', //dutch\n  'fr': 'Chercher',  //french\n  'ca': 'Cerca', //catalan\n  'he': 'לחפש', //hebrew\n  'ja': 'サーチ',  //japanese\n  'lv': 'Meklēt', //latvian\n  'pt': 'Procurar', //portuguese \n  'sr': 'Претрага', //serbian\n  'zh': '搜索', //chinese-simplified\n  'cs': 'Vyhledávání', //czech\n  'hu': 'Keresés', //hungarian\n  'ka': 'ძიება', // georgian\n  'nb': 'Søke', //norwegian\n  'sk': 'Vyhľadávanie', //slovak\n  'th': 'ค้นหา', //thai\n  'fi': 'Hae',//finnish\n  'is': 'Leita',//icelandic\n  'ko': '수색',//korean\n  'pl':  'Szukaj', //polish\n  'sl': 'Iskanje', //slovenian\n  'fa': 'جستجو',  //persian(aka farsi)\n  'ru': 'Поиск'//russian\n}\n\nmodule.exports = {placeholder: placeholder};\n","/**\n * This function transforms the feature from reverse geocoding to plain text with specified accuracy\n * @param {object} feature \n * @param {string} accuracy \n * @returns \n */\nfunction transformFeatureToGeolocationText(feature, accuracy) {\n  const addrInfo = getAddressInfo(feature);\n\n  const addressAccuracy =  ['address', 'street', 'place', 'country'];\n  var currentAccuracy;\n\n  if (typeof accuracy === 'function') {\n    return accuracy(addrInfo)\n  }\n\n  const accuracyIndex = addressAccuracy.indexOf(accuracy);\n\n  if (accuracyIndex === -1) {\n    currentAccuracy = addressAccuracy;\n  } else {\n    currentAccuracy = addressAccuracy.slice(accuracyIndex);\n  }\n\n  return currentAccuracy.reduce(function(acc, name) {\n    if (!addrInfo[name]) {\n      return acc;\n    }\n\n    if (acc !== '') {\n      acc = acc + ', ';\n    }\n\n    return acc + addrInfo[name];\n  }, '');\n}\n/**\n * This function transforms the feature from reverse geocoding to AddressInfo object\n * @param {object} feature \n * @returns {object}\n */\nfunction getAddressInfo(feature) {\n  const houseNumber = feature.address || '';\n  const street = feature.text || '';\n  const placeName = feature.place_name || '';\n  const address = placeName.split(',')[0];\n\n  const addrInfo = {\n    address: address,\n    houseNumber: houseNumber,\n    street: street,\n    placeName: placeName,\n  }\n\n  feature.context.forEach(function (context) {\n    const layer = context.id.split('.')[0];\n    addrInfo[layer] = context.text;\n  });\n\n  return addrInfo;\n}\n\nconst REVERSE_GEOCODE_COORD_RGX = /^[ ]*(-?\\d{1,3}(\\.\\d{0,256})?)[, ]+(-?\\d{1,3}(\\.\\d{0,256})?)[ ]*$/;\n\nmodule.exports = {\n  transformFeatureToGeolocationText: transformFeatureToGeolocationText,\n  getAddressInfo: getAddressInfo,\n  REVERSE_GEOCODE_COORD_RGX: REVERSE_GEOCODE_COORD_RGX,\n}","'use strict';\n\nvar client = require('./lib/client');\n\nmodule.exports = client;\n","'use strict';\n\nvar browser = require('./browser-layer');\nvar MapiClient = require('../classes/mapi-client');\n\nfunction BrowserClient(options) {\n  MapiClient.call(this, options);\n}\nBrowserClient.prototype = Object.create(MapiClient.prototype);\nBrowserClient.prototype.constructor = BrowserClient;\n\nBrowserClient.prototype.sendRequest = browser.browserSend;\nBrowserClient.prototype.abortRequest = browser.browserAbort;\n\n/**\n * Create a client for the browser.\n *\n * @param {Object} options\n * @param {string} options.accessToken\n * @param {string} [options.origin]\n * @returns {MapiClient}\n */\nfunction createBrowserClient(options) {\n  return new BrowserClient(options);\n}\n\nmodule.exports = createBrowserClient;\n","'use strict';\n\nvar MapiResponse = require('../classes/mapi-response');\nvar MapiError = require('../classes/mapi-error');\nvar constants = require('../constants');\nvar parseHeaders = require('../helpers/parse-headers');\n\n// Keys are request IDs, values are XHRs.\nvar requestsUnderway = {};\n\nfunction browserAbort(request) {\n  var xhr = requestsUnderway[request.id];\n  if (!xhr) return;\n  xhr.abort();\n  delete requestsUnderway[request.id];\n}\n\nfunction createResponse(request, xhr) {\n  return new MapiResponse(request, {\n    body: xhr.response,\n    headers: parseHeaders(xhr.getAllResponseHeaders()),\n    statusCode: xhr.status\n  });\n}\n\nfunction normalizeBrowserProgressEvent(event) {\n  var total = event.total;\n  var transferred = event.loaded;\n  var percent = (100 * transferred) / total;\n  return {\n    total: total,\n    transferred: transferred,\n    percent: percent\n  };\n}\n\nfunction sendRequestXhr(request, xhr) {\n  return new Promise(function(resolve, reject) {\n    xhr.onprogress = function(event) {\n      request.emitter.emit(\n        constants.EVENT_PROGRESS_DOWNLOAD,\n        normalizeBrowserProgressEvent(event)\n      );\n    };\n\n    var file = request.file;\n    if (file) {\n      xhr.upload.onprogress = function(event) {\n        request.emitter.emit(\n          constants.EVENT_PROGRESS_UPLOAD,\n          normalizeBrowserProgressEvent(event)\n        );\n      };\n    }\n\n    xhr.onerror = function(error) {\n      reject(error);\n    };\n\n    xhr.onabort = function() {\n      var mapiError = new MapiError({\n        request: request,\n        type: constants.ERROR_REQUEST_ABORTED\n      });\n      reject(mapiError);\n    };\n\n    xhr.onload = function() {\n      delete requestsUnderway[request.id];\n      if (xhr.status < 200 || xhr.status >= 400) {\n        var mapiError = new MapiError({\n          request: request,\n          body: xhr.response,\n          statusCode: xhr.status\n        });\n        reject(mapiError);\n        return;\n      }\n      resolve(xhr);\n    };\n\n    var body = request.body;\n\n    // matching service needs to send a www-form-urlencoded request\n    if (typeof body === 'string') {\n      xhr.send(body);\n    } else if (body) {\n      xhr.send(JSON.stringify(body));\n    } else if (file) {\n      xhr.send(file);\n    } else {\n      xhr.send();\n    }\n\n    requestsUnderway[request.id] = xhr;\n  }).then(function(xhr) {\n    return createResponse(request, xhr);\n  });\n}\n\n// The accessToken argument gives this function flexibility\n// for Mapbox's internal client.\nfunction createRequestXhr(request, accessToken) {\n  var url = request.url(accessToken);\n  var xhr = new window.XMLHttpRequest();\n  xhr.open(request.method, url);\n  Object.keys(request.headers).forEach(function(key) {\n    xhr.setRequestHeader(key, request.headers[key]);\n  });\n  return xhr;\n}\n\nfunction browserSend(request) {\n  return Promise.resolve().then(function() {\n    var xhr = createRequestXhr(request, request.client.accessToken);\n    return sendRequestXhr(request, xhr);\n  });\n}\n\nmodule.exports = {\n  browserAbort: browserAbort,\n  sendRequestXhr: sendRequestXhr,\n  browserSend: browserSend,\n  createRequestXhr: createRequestXhr\n};\n","'use strict';\n\nvar parseToken = require('@mapbox/parse-mapbox-token');\nvar MapiRequest = require('./mapi-request');\nvar constants = require('../constants');\n\n/**\n * A low-level Mapbox API client. Use it to create service clients\n * that share the same configuration.\n *\n * Services and `MapiRequest`s use the underlying `MapiClient` to\n * determine how to create, send, and abort requests in a way\n * that is appropriate to the configuration and environment\n * (Node or the browser).\n *\n * @class MapiClient\n * @property {string} accessToken - The Mapbox access token assigned\n *   to this client.\n * @property {string} [origin] - The origin\n *   to use for API requests. Defaults to https://api.mapbox.com.\n */\n\nfunction MapiClient(options) {\n  if (!options || !options.accessToken) {\n    throw new Error('Cannot create a client without an access token');\n  }\n  // Try parsing the access token to determine right away if it's valid.\n  parseToken(options.accessToken);\n\n  this.accessToken = options.accessToken;\n  this.origin = options.origin || constants.API_ORIGIN;\n}\n\nMapiClient.prototype.createRequest = function createRequest(requestOptions) {\n  return new MapiRequest(this, requestOptions);\n};\n\nmodule.exports = MapiClient;\n","'use strict';\n\nvar constants = require('../constants');\n\n/**\n * A Mapbox API error.\n *\n * If there's an error during the API transaction,\n * the Promise returned by `MapiRequest`'s [`send`](#send)\n * method should reject with a `MapiError`.\n *\n * @class MapiError\n * @hideconstructor\n * @property {MapiRequest} request - The errored request.\n * @property {string} type - The type of error. Usually this is `'HttpError'`.\n *   If the request was aborted, so the error was\n *   not sent from the server, the type will be\n *   `'RequestAbortedError'`.\n * @property {number} [statusCode] - The numeric status code of\n *   the HTTP response.\n * @property {Object | string} [body] - If the server sent a response body,\n *   this property exposes that response, parsed as JSON if possible.\n * @property {string} [message] - Whatever message could be derived from the\n *   call site and HTTP response.\n *\n * @param {MapiRequest} options.request\n * @param {number} [options.statusCode]\n * @param {string} [options.body]\n * @param {string} [options.message]\n * @param {string} [options.type]\n */\nfunction MapiError(options) {\n  var errorType = options.type || constants.ERROR_HTTP;\n\n  var body;\n  if (options.body) {\n    try {\n      body = JSON.parse(options.body);\n    } catch (e) {\n      body = options.body;\n    }\n  } else {\n    body = null;\n  }\n\n  var message = options.message || null;\n  if (!message) {\n    if (typeof body === 'string') {\n      message = body;\n    } else if (body && typeof body.message === 'string') {\n      message = body.message;\n    } else if (errorType === constants.ERROR_REQUEST_ABORTED) {\n      message = 'Request aborted';\n    }\n  }\n\n  this.message = message;\n  this.type = errorType;\n  this.statusCode = options.statusCode || null;\n  this.request = options.request;\n  this.body = body;\n}\n\nmodule.exports = MapiError;\n","'use strict';\n\nvar parseToken = require('@mapbox/parse-mapbox-token');\nvar xtend = require('xtend');\nvar EventEmitter = require('eventemitter3');\nvar urlUtils = require('../helpers/url-utils');\nvar constants = require('../constants');\n\nvar requestId = 1;\n\n/**\n * A Mapbox API request.\n *\n * Note that creating a `MapiRequest` does *not* send the request automatically.\n * Use the request's `send` method to send it off and get a `Promise`.\n *\n * The `emitter` property is an `EventEmitter` that emits the following events:\n *\n * - `'response'` - Listeners will be called with a `MapiResponse`.\n * - `'error'` - Listeners will be called with a `MapiError`.\n * - `'downloadProgress'` - Listeners will be called with `ProgressEvents`.\n * - `'uploadProgress'` - Listeners will be called with `ProgressEvents`.\n *   Upload events are only available when the request includes a file.\n *\n * @class MapiRequest\n * @property {EventEmitter} emitter - An event emitter. See above.\n * @property {MapiClient} client - This request's `MapiClient`.\n * @property {MapiResponse|null} response - If this request has been sent and received\n *   a response, the response is available on this property.\n * @property {MapiError|Error|null} error - If this request has been sent and\n *   received an error in response, the error is available on this property.\n * @property {boolean} aborted - If the request has been aborted\n *   (via [`abort`](#abort)), this property will be `true`.\n * @property {boolean} sent - If the request has been sent, this property will\n *   be `true`. You cannot send the same request twice, so if you need to create\n *   a new request that is the equivalent of an existing one, use\n *   [`clone`](#clone).\n * @property {string} path - The request's path, including colon-prefixed route\n *   parameters.\n * @property {string} origin - The request's origin.\n * @property {string} method - The request's HTTP method.\n * @property {Object} query - A query object, which will be transformed into\n *   a URL query string.\n * @property {Object} params - A route parameters object, whose values will\n *   be interpolated the path.\n * @property {Object} headers - The request's headers.\n * @property {Object|string|null} body - Data to send with the request.\n *   If the request has a body, it will also be sent with the header\n *   `'Content-Type: application/json'`.\n * @property {Blob|ArrayBuffer|string|ReadStream} file - A file to\n *   send with the request. The browser client accepts Blobs and ArrayBuffers;\n *   the Node client accepts strings (filepaths) and ReadStreams.\n * @property {string} encoding - The encoding of the response.\n * @property {string} sendFileAs - The method to send the `file`. Options are\n *   `data` (x-www-form-urlencoded) or `form` (multipart/form-data).\n */\n\n/**\n * @ignore\n * @param {MapiClient} client\n * @param {Object} options\n * @param {string} options.method\n * @param {string} options.path\n * @param {Object} [options.query={}]\n * @param {Object} [options.params={}]\n * @param {string} [options.origin]\n * @param {Object} [options.headers]\n * @param {Object} [options.body=null]\n * @param {Blob|ArrayBuffer|string|ReadStream} [options.file=null]\n * @param {string} [options.encoding=utf8]\n */\nfunction MapiRequest(client, options) {\n  if (!client) {\n    throw new Error('MapiRequest requires a client');\n  }\n  if (!options || !options.path || !options.method) {\n    throw new Error(\n      'MapiRequest requires an options object with path and method properties'\n    );\n  }\n\n  var defaultHeaders = {};\n  if (options.body) {\n    defaultHeaders['content-type'] = 'application/json';\n  }\n\n  var headersWithDefaults = xtend(defaultHeaders, options.headers);\n\n  // Disallows duplicate header names of mixed case,\n  // e.g. Content-Type and content-type.\n  var headers = Object.keys(headersWithDefaults).reduce(function(memo, name) {\n    memo[name.toLowerCase()] = headersWithDefaults[name];\n    return memo;\n  }, {});\n\n  this.id = requestId++;\n  this._options = options;\n\n  this.emitter = new EventEmitter();\n  this.client = client;\n  this.response = null;\n  this.error = null;\n  this.sent = false;\n  this.aborted = false;\n  this.path = options.path;\n  this.method = options.method;\n  this.origin = options.origin || client.origin;\n  this.query = options.query || {};\n  this.params = options.params || {};\n  this.body = options.body || null;\n  this.file = options.file || null;\n  this.encoding = options.encoding || 'utf8';\n  this.sendFileAs = options.sendFileAs || null;\n  this.headers = headers;\n}\n\n/**\n * Get the URL of the request.\n *\n * @param {string} [accessToken] - By default, the access token of the request's\n *   client is used.\n * @return {string}\n */\nMapiRequest.prototype.url = function url(accessToken) {\n  var url = urlUtils.prependOrigin(this.path, this.origin);\n  url = urlUtils.appendQueryObject(url, this.query);\n  var routeParams = this.params;\n  var actualAccessToken =\n    accessToken == null ? this.client.accessToken : accessToken;\n  if (actualAccessToken) {\n    url = urlUtils.appendQueryParam(url, 'access_token', actualAccessToken);\n    var accessTokenOwnerId = parseToken(actualAccessToken).user;\n    routeParams = xtend({ ownerId: accessTokenOwnerId }, routeParams);\n  }\n  url = urlUtils.interpolateRouteParams(url, routeParams);\n  return url;\n};\n\n/**\n * Send the request. Returns a Promise that resolves with a `MapiResponse`.\n * You probably want to use `response.body`.\n *\n * `send` only retrieves the first page of paginated results. You can get\n * the next page by using the `MapiResponse`'s [`nextPage`](#nextpage)\n * function, or iterate through all pages using [`eachPage`](#eachpage)\n * instead of `send`.\n *\n * @returns {Promise<MapiResponse>}\n */\nMapiRequest.prototype.send = function send() {\n  var self = this;\n\n  if (self.sent) {\n    throw new Error(\n      'This request has already been sent. Check the response and error properties. Create a new request with clone().'\n    );\n  }\n  self.sent = true;\n\n  return self.client.sendRequest(self).then(\n    function(response) {\n      self.response = response;\n      self.emitter.emit(constants.EVENT_RESPONSE, response);\n      return response;\n    },\n    function(error) {\n      self.error = error;\n      self.emitter.emit(constants.EVENT_ERROR, error);\n      throw error;\n    }\n  );\n};\n\n/**\n * Abort the request.\n *\n * Any pending `Promise` returned by [`send`](#send) will be rejected with\n * an error with `type: 'RequestAbortedError'`. If you've created a request\n * that might be aborted, you need to catch and handle such errors.\n *\n * This method will also abort any requests created while fetching subsequent\n * pages via [`eachPage`](#eachpage).\n *\n * If the request has not been sent or has already been aborted, nothing\n * will happen.\n */\nMapiRequest.prototype.abort = function abort() {\n  if (this._nextPageRequest) {\n    this._nextPageRequest.abort();\n    delete this._nextPageRequest;\n  }\n\n  if (this.response || this.error || this.aborted) return;\n\n  this.aborted = true;\n  this.client.abortRequest(this);\n};\n\n/**\n * Invoke a callback for each page of a paginated API response.\n *\n * The callback should have the following signature:\n *\n * ```js\n * (\n *   error: MapiError,\n *   response: MapiResponse,\n *   next: () => void\n * ) => void\n * ```\n *\n * **The next page will not be fetched until you've invoked the\n * `next` callback**, indicating that you're ready for it.\n *\n * @param {Function} callback\n */\nMapiRequest.prototype.eachPage = function eachPage(callback) {\n  var self = this;\n\n  function handleResponse(response) {\n    function getNextPage() {\n      delete self._nextPageRequest;\n      var nextPageRequest = response.nextPage();\n      if (nextPageRequest) {\n        self._nextPageRequest = nextPageRequest;\n        getPage(nextPageRequest);\n      }\n    }\n    callback(null, response, getNextPage);\n  }\n\n  function handleError(error) {\n    callback(error, null, function() {});\n  }\n\n  function getPage(request) {\n    request.send().then(handleResponse, handleError);\n  }\n  getPage(this);\n};\n\n/**\n * Clone this request.\n *\n * Each request can only be sent *once*. So if you'd like to send the\n * same request again, clone it and send away.\n *\n * @returns {MapiRequest} - A new `MapiRequest` configured just like this one.\n */\nMapiRequest.prototype.clone = function clone() {\n  return this._extend();\n};\n\n/**\n * @ignore\n */\nMapiRequest.prototype._extend = function _extend(options) {\n  var extendedOptions = xtend(this._options, options);\n  return new MapiRequest(this.client, extendedOptions);\n};\n\nmodule.exports = MapiRequest;\n","'use strict';\n\nvar parseLinkHeader = require('../helpers/parse-link-header');\n\n/**\n * A Mapbox API response.\n *\n * @class MapiResponse\n * @property {Object} body - The response body, parsed as JSON.\n * @property {string} rawBody - The raw response body.\n * @property {number} statusCode - The response's status code.\n * @property {Object} headers - The parsed response headers.\n * @property {Object} links - The parsed response links.\n * @property {MapiRequest} request - The response's originating `MapiRequest`.\n */\n\n/**\n * @ignore\n * @param {MapiRequest} request\n * @param {Object} responseData\n * @param {Object} responseData.headers\n * @param {string} responseData.body\n * @param {number} responseData.statusCode\n */\nfunction MapiResponse(request, responseData) {\n  this.request = request;\n  this.headers = responseData.headers;\n  this.rawBody = responseData.body;\n  this.statusCode = responseData.statusCode;\n  try {\n    this.body = JSON.parse(responseData.body || '{}');\n  } catch (parseError) {\n    this.body = responseData.body;\n  }\n  this.links = parseLinkHeader(this.headers.link);\n}\n\n/**\n * Check if there is a next page that you can fetch.\n *\n * @returns {boolean}\n */\nMapiResponse.prototype.hasNextPage = function hasNextPage() {\n  return !!this.links.next;\n};\n\n/**\n * Create a request for the next page, if there is one.\n * If there is no next page, returns `null`.\n *\n * @returns {MapiRequest | null}\n */\nMapiResponse.prototype.nextPage = function nextPage() {\n  if (!this.hasNextPage()) return null;\n  return this.request._extend({\n    path: this.links.next.url\n  });\n};\n\nmodule.exports = MapiResponse;\n","'use strict';\n\nmodule.exports = {\n  API_ORIGIN: 'https://api.mapbox.com',\n  EVENT_PROGRESS_DOWNLOAD: 'downloadProgress',\n  EVENT_PROGRESS_UPLOAD: 'uploadProgress',\n  EVENT_ERROR: 'error',\n  EVENT_RESPONSE: 'response',\n  ERROR_HTTP: 'HttpError',\n  ERROR_REQUEST_ABORTED: 'RequestAbortedError'\n};\n","'use strict';\n\nfunction parseSingleHeader(raw) {\n  var boundary = raw.indexOf(':');\n  var name = raw\n    .substring(0, boundary)\n    .trim()\n    .toLowerCase();\n  var value = raw.substring(boundary + 1).trim();\n  return {\n    name: name,\n    value: value\n  };\n}\n\n/**\n * Parse raw headers into an object with lowercase properties.\n * Does not fully parse headings into more complete data structure,\n * as larger libraries might do. Also does not deal with duplicate\n * headers because Node doesn't seem to deal with those well, so\n * we shouldn't let the browser either, for consistency.\n *\n * @param {string} raw\n * @returns {Object}\n */\nfunction parseHeaders(raw) {\n  var headers = {};\n  if (!raw) {\n    return headers;\n  }\n\n  raw\n    .trim()\n    .split(/[\\r|\\n]+/)\n    .forEach(function(rawHeader) {\n      var parsed = parseSingleHeader(rawHeader);\n      headers[parsed.name] = parsed.value;\n    });\n\n  return headers;\n}\n\nmodule.exports = parseHeaders;\n","'use strict';\n\n// Like https://github.com/thlorenz/lib/parse-link-header but without any\n// additional dependencies.\n\nfunction parseParam(param) {\n  var parts = param.match(/\\s*(.+)\\s*=\\s*\"?([^\"]+)\"?/);\n  if (!parts) return null;\n\n  return {\n    key: parts[1],\n    value: parts[2]\n  };\n}\n\nfunction parseLink(link) {\n  var parts = link.match(/<?([^>]*)>(.*)/);\n  if (!parts) return null;\n\n  var linkUrl = parts[1];\n  var linkParams = parts[2].split(';');\n  var rel = null;\n  var parsedLinkParams = linkParams.reduce(function(result, param) {\n    var parsed = parseParam(param);\n    if (!parsed) return result;\n    if (parsed.key === 'rel') {\n      if (!rel) {\n        rel = parsed.value;\n      }\n      return result;\n    }\n    result[parsed.key] = parsed.value;\n    return result;\n  }, {});\n  if (!rel) return null;\n\n  return {\n    url: linkUrl,\n    rel: rel,\n    params: parsedLinkParams\n  };\n}\n\n/**\n * Parse a Link header.\n *\n * @param {string} linkHeader\n * @returns {{\n *   [string]: {\n *     url: string,\n *     params: { [string]: string }\n *   }\n * }}\n */\nfunction parseLinkHeader(linkHeader) {\n  if (!linkHeader) return {};\n\n  return linkHeader.split(/,\\s*</).reduce(function(result, link) {\n    var parsed = parseLink(link);\n    if (!parsed) return result;\n    // rel value can be multiple whitespace-separated rels.\n    var splitRel = parsed.rel.split(/\\s+/);\n    splitRel.forEach(function(rel) {\n      if (!result[rel]) {\n        result[rel] = {\n          url: parsed.url,\n          params: parsed.params\n        };\n      }\n    });\n    return result;\n  }, {});\n}\n\nmodule.exports = parseLinkHeader;\n","'use strict';\n\n// Encode each item of an array individually. The comma\n// delimiters should not themselves be encoded.\nfunction encodeArray(arrayValue) {\n  return arrayValue.map(encodeURIComponent).join(',');\n}\n\nfunction encodeValue(value) {\n  if (Array.isArray(value)) {\n    return encodeArray(value);\n  }\n  return encodeURIComponent(String(value));\n}\n\n/**\n * Append a query parameter to a URL.\n *\n * @param {string} url\n * @param {string} key\n * @param {string|number|boolean|Array<*>>} [value] - Provide an array\n *   if the value is a list and commas between values need to be\n *   preserved, unencoded.\n * @returns {string} - Modified URL.\n */\nfunction appendQueryParam(url, key, value) {\n  if (value === false || value === null) {\n    return url;\n  }\n  var punctuation = /\\?/.test(url) ? '&' : '?';\n  var query = encodeURIComponent(key);\n  if (value !== undefined && value !== '' && value !== true) {\n    query += '=' + encodeValue(value);\n  }\n  return '' + url + punctuation + query;\n}\n\n/**\n * Derive a query string from an object and append it\n * to a URL.\n *\n * @param {string} url\n * @param {Object} [queryObject] - Values should be primitives.\n * @returns {string} - Modified URL.\n */\nfunction appendQueryObject(url, queryObject) {\n  if (!queryObject) {\n    return url;\n  }\n\n  var result = url;\n  Object.keys(queryObject).forEach(function(key) {\n    var value = queryObject[key];\n    if (value === undefined) {\n      return;\n    }\n    if (Array.isArray(value)) {\n      value = value\n        .filter(function(v) {\n          return v !== null && v !== undefined;\n        })\n        .join(',');\n    }\n    result = appendQueryParam(result, key, value);\n  });\n  return result;\n}\n\n/**\n * Prepend an origin to a URL. If the URL already has an\n * origin, do nothing.\n *\n * @param {string} url\n * @param {string} origin\n * @returns {string} - Modified URL.\n */\nfunction prependOrigin(url, origin) {\n  if (!origin) {\n    return url;\n  }\n\n  if (url.slice(0, 4) === 'http') {\n    return url;\n  }\n\n  var delimiter = url[0] === '/' ? '' : '/';\n  return '' + origin.replace(/\\/$/, '') + delimiter + url;\n}\n\n/**\n * Interpolate values into a route with express-style,\n * colon-prefixed route parameters.\n *\n * @param {string} route\n * @param {Object} [params] - Values should be primitives\n *   or arrays of primitives. Provide an array if the value\n *   is a list and commas between values need to be\n *   preserved, unencoded.\n * @returns {string} - Modified URL.\n */\nfunction interpolateRouteParams(route, params) {\n  if (!params) {\n    return route;\n  }\n  return route.replace(/\\/:([a-zA-Z0-9]+)/g, function(_, paramId) {\n    var value = params[paramId];\n    if (value === undefined) {\n      throw new Error('Unspecified route parameter ' + paramId);\n    }\n    var preppedValue = encodeValue(value);\n    return '/' + preppedValue;\n  });\n}\n\nmodule.exports = {\n  appendQueryObject: appendQueryObject,\n  appendQueryParam: appendQueryParam,\n  prependOrigin: prependOrigin,\n  interpolateRouteParams: interpolateRouteParams\n};\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n  , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n  Events.prototype = Object.create(null);\n\n  //\n  // This hack is needed because the `__proto__` property is still inherited in\n  // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n  //\n  if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n  this.fn = fn;\n  this.context = context;\n  this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n  if (typeof fn !== 'function') {\n    throw new TypeError('The listener must be a function');\n  }\n\n  var listener = new EE(fn, context || emitter, once)\n    , evt = prefix ? prefix + event : event;\n\n  if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n  else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n  else emitter._events[evt] = [emitter._events[evt], listener];\n\n  return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n  if (--emitter._eventsCount === 0) emitter._events = new Events();\n  else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n  this._events = new Events();\n  this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n  var names = []\n    , events\n    , name;\n\n  if (this._eventsCount === 0) return names;\n\n  for (name in (events = this._events)) {\n    if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n  }\n\n  if (Object.getOwnPropertySymbols) {\n    return names.concat(Object.getOwnPropertySymbols(events));\n  }\n\n  return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n  var evt = prefix ? prefix + event : event\n    , handlers = this._events[evt];\n\n  if (!handlers) return [];\n  if (handlers.fn) return [handlers.fn];\n\n  for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n    ee[i] = handlers[i].fn;\n  }\n\n  return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n  var evt = prefix ? prefix + event : event\n    , listeners = this._events[evt];\n\n  if (!listeners) return 0;\n  if (listeners.fn) return 1;\n  return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return false;\n\n  var listeners = this._events[evt]\n    , len = arguments.length\n    , args\n    , i;\n\n  if (listeners.fn) {\n    if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n    switch (len) {\n      case 1: return listeners.fn.call(listeners.context), true;\n      case 2: return listeners.fn.call(listeners.context, a1), true;\n      case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n      case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n      case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n      case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n    }\n\n    for (i = 1, args = new Array(len -1); i < len; i++) {\n      args[i - 1] = arguments[i];\n    }\n\n    listeners.fn.apply(listeners.context, args);\n  } else {\n    var length = listeners.length\n      , j;\n\n    for (i = 0; i < length; i++) {\n      if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n      switch (len) {\n        case 1: listeners[i].fn.call(listeners[i].context); break;\n        case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n        case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n        case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n        default:\n          if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n            args[j - 1] = arguments[j];\n          }\n\n          listeners[i].fn.apply(listeners[i].context, args);\n      }\n    }\n  }\n\n  return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n  return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n  return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return this;\n  if (!fn) {\n    clearEvent(this, evt);\n    return this;\n  }\n\n  var listeners = this._events[evt];\n\n  if (listeners.fn) {\n    if (\n      listeners.fn === fn &&\n      (!once || listeners.once) &&\n      (!context || listeners.context === context)\n    ) {\n      clearEvent(this, evt);\n    }\n  } else {\n    for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n      if (\n        listeners[i].fn !== fn ||\n        (once && !listeners[i].once) ||\n        (context && listeners[i].context !== context)\n      ) {\n        events.push(listeners[i]);\n      }\n    }\n\n    //\n    // Reset the array, or remove it completely if we have no more listeners.\n    //\n    if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n    else clearEvent(this, evt);\n  }\n\n  return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n  var evt;\n\n  if (event) {\n    evt = prefix ? prefix + event : event;\n    if (this._events[evt]) clearEvent(this, evt);\n  } else {\n    this._events = new Events();\n    this._eventsCount = 0;\n  }\n\n  return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n  module.exports = EventEmitter;\n}\n","'use strict';\n\nvar xtend = require('xtend');\nvar v = require('./service-helpers/validator');\nvar pick = require('./service-helpers/pick');\nvar stringifyBooleans = require('./service-helpers/stringify-booleans');\nvar createServiceFactory = require('./service-helpers/create-service-factory');\n\n/**\n * Geocoding API service.\n *\n * Learn more about this service and its responses in\n * [the HTTP service documentation](https://docs.mapbox.com/api/search/#geocoding).\n */\nvar Geocoding = {};\n\nvar featureTypes = [\n  'country',\n  'region',\n  'postcode',\n  'district',\n  'place',\n  'locality',\n  'neighborhood',\n  'address',\n  'poi',\n  'poi.landmark'\n];\n\n/**\n * Search for a place.\n *\n * See the [public documentation](https://docs.mapbox.com/api/search/#forward-geocoding).\n *\n * @param {Object} config\n * @param {string} config.query - A place name.\n * @param {'mapbox.places'|'mapbox.places-permanent'} [config.mode=\"mapbox.places\"] - Either `mapbox.places` for ephemeral geocoding, or `mapbox.places-permanent` for storing results and batch geocoding.\n * @param {Array<string>} [config.countries] - Limits results to the specified countries.\n *   Each item in the array should be an [ISO 3166 alpha 2 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n * @param {Coordinates|'ip'} [config.proximity] - Bias local results based on a provided coordinate location or a user's IP address.\n * @param {Array<'country'|'region'|'postcode'|'district'|'place'|'locality'|'neighborhood'|'address'|'poi'|'poi.landmark'>} [config.types] - Filter results by feature types.\n * @param {boolean} [config.autocomplete=true] - Return autocomplete results or not.\n * @param {BoundingBox} [config.bbox] - Limit results to a bounding box.\n * @param {number} [config.limit=5] - Limit the number of results returned.\n * @param {Array<string>} [config.language] - Specify the language to use for response text and, for forward geocoding, query result weighting.\n *  Options are [IETF language tags](https://en.wikipedia.org/wiki/IETF_language_tag) comprised of a mandatory\n *  [ISO 639-1 language code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) and optionally one or more IETF subtags for country or script.\n * @param {boolean} [config.routing=false] - Specify whether to request additional metadata about the recommended navigation destination. Only applicable for address features.\n * @param {boolean} [config.fuzzyMatch=true] - Specify whether the Geocoding API should attempt approximate, as well as exact, matching.\n * @param {String} [config.worldview=\"us\"] - Filter results to geographic features whose characteristics are defined differently by audiences belonging to various regional, cultural, or political groups.\n * @return {MapiRequest}\n *\n * @example\n * geocodingClient.forwardGeocode({\n *   query: 'Paris, France',\n *   limit: 2\n * })\n *   .send()\n *   .then(response => {\n *     const match = response.body;\n *   });\n *\n * @example\n * // geocoding with proximity\n * geocodingClient.forwardGeocode({\n *   query: 'Paris, France',\n *   proximity: [-95.4431142, 33.6875431]\n * })\n *   .send()\n *   .then(response => {\n *     const match = response.body;\n *   });\n *\n * // geocoding with countries\n * geocodingClient.forwardGeocode({\n *   query: 'Paris, France',\n *   countries: ['fr']\n * })\n *   .send()\n *   .then(response => {\n *     const match = response.body;\n *   });\n *\n * // geocoding with bounding box\n * geocodingClient.forwardGeocode({\n *   query: 'Paris, France',\n *   bbox: [2.14, 48.72, 2.55, 48.96]\n * })\n *   .send()\n *   .then(response => {\n *     const match = response.body;\n *   });\n */\nGeocoding.forwardGeocode = function(config) {\n  v.assertShape({\n    query: v.required(v.string),\n    mode: v.oneOf('mapbox.places', 'mapbox.places-permanent'),\n    countries: v.arrayOf(v.string),\n    proximity: v.oneOf(v.coordinates, 'ip'),\n    types: v.arrayOf(v.oneOf(featureTypes)),\n    autocomplete: v.boolean,\n    bbox: v.arrayOf(v.number),\n    limit: v.number,\n    language: v.arrayOf(v.string),\n    routing: v.boolean,\n    fuzzyMatch: v.boolean,\n    worldview: v.string\n  })(config);\n\n  config.mode = config.mode || 'mapbox.places';\n\n  var query = stringifyBooleans(\n    xtend(\n      { country: config.countries },\n      pick(config, [\n        'proximity',\n        'types',\n        'autocomplete',\n        'bbox',\n        'limit',\n        'language',\n        'routing',\n        'fuzzyMatch',\n        'worldview'\n      ])\n    )\n  );\n\n  return this.client.createRequest({\n    method: 'GET',\n    path: '/geocoding/v5/:mode/:query.json',\n    params: pick(config, ['mode', 'query']),\n    query: query\n  });\n};\n\n/**\n * Search for places near coordinates.\n *\n * See the [public documentation](https://docs.mapbox.com/api/search/#reverse-geocoding).\n *\n * @param {Object} config\n * @param {Coordinates} config.query - Coordinates at which features will be searched.\n * @param {'mapbox.places'|'mapbox.places-permanent'} [config.mode=\"mapbox.places\"] - Either `mapbox.places` for ephemeral geocoding, or `mapbox.places-permanent` for storing results and batch geocoding.\n * @param {Array<string>} [config.countries] - Limits results to the specified countries.\n *   Each item in the array should be an [ISO 3166 alpha 2 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n * @param {Array<'country'|'region'|'postcode'|'district'|'place'|'locality'|'neighborhood'|'address'|'poi'|'poi.landmark'>} [config.types] - Filter results by feature types.\n * @param {BoundingBox} [config.bbox] - Limit results to a bounding box.\n * @param {number} [config.limit=1] - Limit the number of results returned. If using this option, you must provide a single item for `types`.\n * @param {Array<string>} [config.language] - Specify the language to use for response text and, for forward geocoding, query result weighting.\n *  Options are [IETF language tags](https://en.wikipedia.org/wiki/IETF_language_tag) comprised of a mandatory\n *  [ISO 639-1 language code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) and optionally one or more IETF subtags for country or script.\n * @param {'distance'|'score'} [config.reverseMode='distance'] - Set the factors that are used to sort nearby results.\n * @param {boolean} [config.routing=false] - Specify whether to request additional metadata about the recommended navigation destination. Only applicable for address features.\n * @param {String} [config.worldview=\"us\"] - Filter results to geographic features whose characteristics are defined differently by audiences belonging to various regional, cultural, or political groups.\n * @return {MapiRequest}\n *\n * @example\n * geocodingClient.reverseGeocode({\n *   query: [-95.4431142, 33.6875431]\n * })\n *   .send()\n *   .then(response => {\n *     // GeoJSON document with geocoding matches\n *     const match = response.body;\n *   });\n */\nGeocoding.reverseGeocode = function(config) {\n  v.assertShape({\n    query: v.required(v.coordinates),\n    mode: v.oneOf('mapbox.places', 'mapbox.places-permanent'),\n    countries: v.arrayOf(v.string),\n    types: v.arrayOf(v.oneOf(featureTypes)),\n    bbox: v.arrayOf(v.number),\n    limit: v.number,\n    language: v.arrayOf(v.string),\n    reverseMode: v.oneOf('distance', 'score'),\n    routing: v.boolean,\n    worldview: v.string\n  })(config);\n\n  config.mode = config.mode || 'mapbox.places';\n\n  var query = stringifyBooleans(\n    xtend(\n      { country: config.countries },\n      pick(config, [\n        'country',\n        'types',\n        'bbox',\n        'limit',\n        'language',\n        'reverseMode',\n        'routing',\n        'worldview'\n      ])\n    )\n  );\n\n  return this.client.createRequest({\n    method: 'GET',\n    path: '/geocoding/v5/:mode/:query.json',\n    params: pick(config, ['mode', 'query']),\n    query: query\n  });\n};\n\nmodule.exports = createServiceFactory(Geocoding);\n","'use strict';\n\nvar MapiClient = require('../../lib/classes/mapi-client');\n// This will create the environment-appropriate client.\nvar createClient = require('../../lib/client');\n\nfunction createServiceFactory(ServicePrototype) {\n  return function(clientOrConfig) {\n    var client;\n    if (MapiClient.prototype.isPrototypeOf(clientOrConfig)) {\n      client = clientOrConfig;\n    } else {\n      client = createClient(clientOrConfig);\n    }\n    var service = Object.create(ServicePrototype);\n    service.client = client;\n    return service;\n  };\n}\n\nmodule.exports = createServiceFactory;\n","'use strict';\n\nfunction objectMap(obj, cb) {\n  return Object.keys(obj).reduce(function(result, key) {\n    result[key] = cb(key, obj[key]);\n    return result;\n  }, {});\n}\n\nmodule.exports = objectMap;\n","'use strict';\n\n/**\n * Create a new object by picking properties off an existing object.\n * The second param can be overloaded as a callback for\n * more fine grained picking of properties.\n * @param {Object} source\n * @param {Array<string>|function(string, Object):boolean} keys\n * @returns {Object}\n */\nfunction pick(source, keys) {\n  var filter = function(key, val) {\n    return keys.indexOf(key) !== -1 && val !== undefined;\n  };\n\n  if (typeof keys === 'function') {\n    filter = keys;\n  }\n\n  return Object.keys(source)\n    .filter(function(key) {\n      return filter(key, source[key]);\n    })\n    .reduce(function(result, key) {\n      result[key] = source[key];\n      return result;\n    }, {});\n}\n\nmodule.exports = pick;\n","'use strict';\n\nvar objectMap = require('./object-map');\n\n/**\n * Stringify all the boolean values in an object, so true becomes \"true\".\n *\n * @param {Object} obj\n * @returns {Object}\n */\nfunction stringifyBoolean(obj) {\n  return objectMap(obj, function(_, value) {\n    return typeof value === 'boolean' ? JSON.stringify(value) : value;\n  });\n}\n\nmodule.exports = stringifyBoolean;\n","'use strict';\n\nvar xtend = require('xtend');\nvar v = require('@mapbox/fusspot');\n\nfunction file(value) {\n  // If we're in a browser so Blob is available, the file must be that.\n  // In Node, however, it could be a filepath or a pipeable (Readable) stream.\n  if (typeof window !== 'undefined') {\n    if (value instanceof global.Blob || value instanceof global.ArrayBuffer) {\n      return;\n    }\n    return 'Blob or ArrayBuffer';\n  }\n  if (typeof value === 'string' || value.pipe !== undefined) {\n    return;\n  }\n  return 'Filename or Readable stream';\n}\n\nfunction assertShape(validatorObj, apiName) {\n  return v.assert(v.strictShape(validatorObj), apiName);\n}\n\nfunction date(value) {\n  var msg = 'date';\n  if (typeof value === 'boolean') {\n    return msg;\n  }\n  try {\n    var date = new Date(value);\n    if (date.getTime && isNaN(date.getTime())) {\n      return msg;\n    }\n  } catch (e) {\n    return msg;\n  }\n}\n\nfunction coordinates(value) {\n  return v.tuple(v.number, v.number)(value);\n}\n\nmodule.exports = xtend(v, {\n  file: file,\n  date: date,\n  coordinates: coordinates,\n  assertShape: assertShape\n});\n","'use strict';\n\nvar base64 = require('base-64');\n\nvar tokenCache = {};\n\nfunction parseToken(token) {\n  if (tokenCache[token]) {\n    return tokenCache[token];\n  }\n\n  var parts = token.split('.');\n  var usage = parts[0];\n  var rawPayload = parts[1];\n  if (!rawPayload) {\n    throw new Error('Invalid token');\n  }\n\n  var parsedPayload = parsePaylod(rawPayload);\n\n  var result = {\n    usage: usage,\n    user: parsedPayload.u\n  };\n  if (has(parsedPayload, 'a')) result.authorization = parsedPayload.a;\n  if (has(parsedPayload, 'exp')) result.expires = parsedPayload.exp * 1000;\n  if (has(parsedPayload, 'iat')) result.created = parsedPayload.iat * 1000;\n  if (has(parsedPayload, 'scopes')) result.scopes = parsedPayload.scopes;\n  if (has(parsedPayload, 'client')) result.client = parsedPayload.client;\n  if (has(parsedPayload, 'll')) result.lastLogin = parsedPayload.ll;\n  if (has(parsedPayload, 'iu')) result.impersonator = parsedPayload.iu;\n\n  tokenCache[token] = result;\n  return result;\n}\n\nfunction parsePaylod(rawPayload) {\n  try {\n    return JSON.parse(base64.decode(rawPayload));\n  } catch (parseError) {\n    throw new Error('Invalid token');\n  }\n}\n\nfunction has(obj, key) {\n  return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nmodule.exports = parseToken;\n","/*! http://mths.be/base64 v0.1.0 by @mathias | MIT license */\n;(function(root) {\n\n\t// Detect free variables `exports`.\n\tvar freeExports = typeof exports == 'object' && exports;\n\n\t// Detect free variable `module`.\n\tvar freeModule = typeof module == 'object' && module &&\n\t\tmodule.exports == freeExports && module;\n\n\t// Detect free variable `global`, from Node.js or Browserified code, and use\n\t// it as `root`.\n\tvar freeGlobal = typeof global == 'object' && global;\n\tif (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {\n\t\troot = freeGlobal;\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\tvar InvalidCharacterError = function(message) {\n\t\tthis.message = message;\n\t};\n\tInvalidCharacterError.prototype = new Error;\n\tInvalidCharacterError.prototype.name = 'InvalidCharacterError';\n\n\tvar error = function(message) {\n\t\t// Note: the error messages used throughout this file match those used by\n\t\t// the native `atob`/`btoa` implementation in Chromium.\n\t\tthrow new InvalidCharacterError(message);\n\t};\n\n\tvar TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\t// http://whatwg.org/html/common-microsyntaxes.html#space-character\n\tvar REGEX_SPACE_CHARACTERS = /[\\t\\n\\f\\r ]/g;\n\n\t// `decode` is designed to be fully compatible with `atob` as described in the\n\t// HTML Standard. http://whatwg.org/html/webappapis.html#dom-windowbase64-atob\n\t// The optimized base64-decoding algorithm used is based on @atk’s excellent\n\t// implementation. https://gist.github.com/atk/1020396\n\tvar decode = function(input) {\n\t\tinput = String(input)\n\t\t\t.replace(REGEX_SPACE_CHARACTERS, '');\n\t\tvar length = input.length;\n\t\tif (length % 4 == 0) {\n\t\t\tinput = input.replace(/==?$/, '');\n\t\t\tlength = input.length;\n\t\t}\n\t\tif (\n\t\t\tlength % 4 == 1 ||\n\t\t\t// http://whatwg.org/C#alphanumeric-ascii-characters\n\t\t\t/[^+a-zA-Z0-9/]/.test(input)\n\t\t) {\n\t\t\terror(\n\t\t\t\t'Invalid character: the string to be decoded is not correctly encoded.'\n\t\t\t);\n\t\t}\n\t\tvar bitCounter = 0;\n\t\tvar bitStorage;\n\t\tvar buffer;\n\t\tvar output = '';\n\t\tvar position = -1;\n\t\twhile (++position < length) {\n\t\t\tbuffer = TABLE.indexOf(input.charAt(position));\n\t\t\tbitStorage = bitCounter % 4 ? bitStorage * 64 + buffer : buffer;\n\t\t\t// Unless this is the first of a group of 4 characters…\n\t\t\tif (bitCounter++ % 4) {\n\t\t\t\t// …convert the first 8 bits to a single ASCII character.\n\t\t\t\toutput += String.fromCharCode(\n\t\t\t\t\t0xFF & bitStorage >> (-2 * bitCounter & 6)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t};\n\n\t// `encode` is designed to be fully compatible with `btoa` as described in the\n\t// HTML Standard: http://whatwg.org/html/webappapis.html#dom-windowbase64-btoa\n\tvar encode = function(input) {\n\t\tinput = String(input);\n\t\tif (/[^\\0-\\xFF]/.test(input)) {\n\t\t\t// Note: no need to special-case astral symbols here, as surrogates are\n\t\t\t// matched, and the input is supposed to only contain ASCII anyway.\n\t\t\terror(\n\t\t\t\t'The string to be encoded contains characters outside of the ' +\n\t\t\t\t'Latin1 range.'\n\t\t\t);\n\t\t}\n\t\tvar padding = input.length % 3;\n\t\tvar output = '';\n\t\tvar position = -1;\n\t\tvar a;\n\t\tvar b;\n\t\tvar c;\n\t\tvar d;\n\t\tvar buffer;\n\t\t// Make sure any padding is handled outside of the loop.\n\t\tvar length = input.length - padding;\n\n\t\twhile (++position < length) {\n\t\t\t// Read three bytes, i.e. 24 bits.\n\t\t\ta = input.charCodeAt(position) << 16;\n\t\t\tb = input.charCodeAt(++position) << 8;\n\t\t\tc = input.charCodeAt(++position);\n\t\t\tbuffer = a + b + c;\n\t\t\t// Turn the 24 bits into four chunks of 6 bits each, and append the\n\t\t\t// matching character for each of them to the output.\n\t\t\toutput += (\n\t\t\t\tTABLE.charAt(buffer >> 18 & 0x3F) +\n\t\t\t\tTABLE.charAt(buffer >> 12 & 0x3F) +\n\t\t\t\tTABLE.charAt(buffer >> 6 & 0x3F) +\n\t\t\t\tTABLE.charAt(buffer & 0x3F)\n\t\t\t);\n\t\t}\n\n\t\tif (padding == 2) {\n\t\t\ta = input.charCodeAt(position) << 8;\n\t\t\tb = input.charCodeAt(++position);\n\t\t\tbuffer = a + b;\n\t\t\toutput += (\n\t\t\t\tTABLE.charAt(buffer >> 10) +\n\t\t\t\tTABLE.charAt((buffer >> 4) & 0x3F) +\n\t\t\t\tTABLE.charAt((buffer << 2) & 0x3F) +\n\t\t\t\t'='\n\t\t\t);\n\t\t} else if (padding == 1) {\n\t\t\tbuffer = input.charCodeAt(position);\n\t\t\toutput += (\n\t\t\t\tTABLE.charAt(buffer >> 2) +\n\t\t\t\tTABLE.charAt((buffer << 4) & 0x3F) +\n\t\t\t\t'=='\n\t\t\t);\n\t\t}\n\n\t\treturn output;\n\t};\n\n\tvar base64 = {\n\t\t'encode': encode,\n\t\t'decode': decode,\n\t\t'version': '0.1.0'\n\t};\n\n\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t// like the following:\n\tif (\n\t\ttypeof define == 'function' &&\n\t\ttypeof define.amd == 'object' &&\n\t\tdefine.amd\n\t) {\n\t\tdefine(function() {\n\t\t\treturn base64;\n\t\t});\n\t}\telse if (freeExports && !freeExports.nodeType) {\n\t\tif (freeModule) { // in Node.js or RingoJS v0.8.0+\n\t\t\tfreeModule.exports = base64;\n\t\t} else { // in Narwhal or RingoJS v0.7.0-\n\t\t\tfor (var key in base64) {\n\t\t\t\tbase64.hasOwnProperty(key) && (freeExports[key] = base64[key]);\n\t\t\t}\n\t\t}\n\t} else { // in Rhino or a web browser\n\t\troot.base64 = base64;\n\t}\n\n}(this));\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n  ? R.apply\n  : function ReflectApply(target, receiver, args) {\n    return Function.prototype.apply.call(target, receiver, args);\n  }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n  ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target)\n      .concat(Object.getOwnPropertySymbols(target));\n  };\n} else {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target);\n  };\n}\n\nfunction ProcessEmitWarning(warning) {\n  if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n  return value !== value;\n}\n\nfunction EventEmitter() {\n  EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n  if (typeof listener !== 'function') {\n    throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n  }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n  enumerable: true,\n  get: function() {\n    return defaultMaxListeners;\n  },\n  set: function(arg) {\n    if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n      throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n    }\n    defaultMaxListeners = arg;\n  }\n});\n\nEventEmitter.init = function() {\n\n  if (this._events === undefined ||\n      this._events === Object.getPrototypeOf(this)._events) {\n    this._events = Object.create(null);\n    this._eventsCount = 0;\n  }\n\n  this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n  if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n    throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n  }\n  this._maxListeners = n;\n  return this;\n};\n\nfunction _getMaxListeners(that) {\n  if (that._maxListeners === undefined)\n    return EventEmitter.defaultMaxListeners;\n  return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n  return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n  var args = [];\n  for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n  var doError = (type === 'error');\n\n  var events = this._events;\n  if (events !== undefined)\n    doError = (doError && events.error === undefined);\n  else if (!doError)\n    return false;\n\n  // If there is no 'error' event listener then throw.\n  if (doError) {\n    var er;\n    if (args.length > 0)\n      er = args[0];\n    if (er instanceof Error) {\n      // Note: The comments on the `throw` lines are intentional, they show\n      // up in Node's output if this results in an unhandled exception.\n      throw er; // Unhandled 'error' event\n    }\n    // At least give some kind of context to the user\n    var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n    err.context = er;\n    throw err; // Unhandled 'error' event\n  }\n\n  var handler = events[type];\n\n  if (handler === undefined)\n    return false;\n\n  if (typeof handler === 'function') {\n    ReflectApply(handler, this, args);\n  } else {\n    var len = handler.length;\n    var listeners = arrayClone(handler, len);\n    for (var i = 0; i < len; ++i)\n      ReflectApply(listeners[i], this, args);\n  }\n\n  return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n  var m;\n  var events;\n  var existing;\n\n  checkListener(listener);\n\n  events = target._events;\n  if (events === undefined) {\n    events = target._events = Object.create(null);\n    target._eventsCount = 0;\n  } else {\n    // To avoid recursion in the case that type === \"newListener\"! Before\n    // adding it to the listeners, first emit \"newListener\".\n    if (events.newListener !== undefined) {\n      target.emit('newListener', type,\n                  listener.listener ? listener.listener : listener);\n\n      // Re-assign `events` because a newListener handler could have caused the\n      // this._events to be assigned to a new object\n      events = target._events;\n    }\n    existing = events[type];\n  }\n\n  if (existing === undefined) {\n    // Optimize the case of one listener. Don't need the extra array object.\n    existing = events[type] = listener;\n    ++target._eventsCount;\n  } else {\n    if (typeof existing === 'function') {\n      // Adding the second element, need to change to array.\n      existing = events[type] =\n        prepend ? [listener, existing] : [existing, listener];\n      // If we've already got an array, just append.\n    } else if (prepend) {\n      existing.unshift(listener);\n    } else {\n      existing.push(listener);\n    }\n\n    // Check for listener leak\n    m = _getMaxListeners(target);\n    if (m > 0 && existing.length > m && !existing.warned) {\n      existing.warned = true;\n      // No error code for this since it is a Warning\n      // eslint-disable-next-line no-restricted-syntax\n      var w = new Error('Possible EventEmitter memory leak detected. ' +\n                          existing.length + ' ' + String(type) + ' listeners ' +\n                          'added. Use emitter.setMaxListeners() to ' +\n                          'increase limit');\n      w.name = 'MaxListenersExceededWarning';\n      w.emitter = target;\n      w.type = type;\n      w.count = existing.length;\n      ProcessEmitWarning(w);\n    }\n  }\n\n  return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n  return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n    function prependListener(type, listener) {\n      return _addListener(this, type, listener, true);\n    };\n\nfunction onceWrapper() {\n  if (!this.fired) {\n    this.target.removeListener(this.type, this.wrapFn);\n    this.fired = true;\n    if (arguments.length === 0)\n      return this.listener.call(this.target);\n    return this.listener.apply(this.target, arguments);\n  }\n}\n\nfunction _onceWrap(target, type, listener) {\n  var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n  var wrapped = onceWrapper.bind(state);\n  wrapped.listener = listener;\n  state.wrapFn = wrapped;\n  return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n  checkListener(listener);\n  this.on(type, _onceWrap(this, type, listener));\n  return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n    function prependOnceListener(type, listener) {\n      checkListener(listener);\n      this.prependListener(type, _onceWrap(this, type, listener));\n      return this;\n    };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n    function removeListener(type, listener) {\n      var list, events, position, i, originalListener;\n\n      checkListener(listener);\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      list = events[type];\n      if (list === undefined)\n        return this;\n\n      if (list === listener || list.listener === listener) {\n        if (--this._eventsCount === 0)\n          this._events = Object.create(null);\n        else {\n          delete events[type];\n          if (events.removeListener)\n            this.emit('removeListener', type, list.listener || listener);\n        }\n      } else if (typeof list !== 'function') {\n        position = -1;\n\n        for (i = list.length - 1; i >= 0; i--) {\n          if (list[i] === listener || list[i].listener === listener) {\n            originalListener = list[i].listener;\n            position = i;\n            break;\n          }\n        }\n\n        if (position < 0)\n          return this;\n\n        if (position === 0)\n          list.shift();\n        else {\n          spliceOne(list, position);\n        }\n\n        if (list.length === 1)\n          events[type] = list[0];\n\n        if (events.removeListener !== undefined)\n          this.emit('removeListener', type, originalListener || listener);\n      }\n\n      return this;\n    };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n    function removeAllListeners(type) {\n      var listeners, events, i;\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      // not listening for removeListener, no need to emit\n      if (events.removeListener === undefined) {\n        if (arguments.length === 0) {\n          this._events = Object.create(null);\n          this._eventsCount = 0;\n        } else if (events[type] !== undefined) {\n          if (--this._eventsCount === 0)\n            this._events = Object.create(null);\n          else\n            delete events[type];\n        }\n        return this;\n      }\n\n      // emit removeListener for all listeners on all events\n      if (arguments.length === 0) {\n        var keys = Object.keys(events);\n        var key;\n        for (i = 0; i < keys.length; ++i) {\n          key = keys[i];\n          if (key === 'removeListener') continue;\n          this.removeAllListeners(key);\n        }\n        this.removeAllListeners('removeListener');\n        this._events = Object.create(null);\n        this._eventsCount = 0;\n        return this;\n      }\n\n      listeners = events[type];\n\n      if (typeof listeners === 'function') {\n        this.removeListener(type, listeners);\n      } else if (listeners !== undefined) {\n        // LIFO order\n        for (i = listeners.length - 1; i >= 0; i--) {\n          this.removeListener(type, listeners[i]);\n        }\n      }\n\n      return this;\n    };\n\nfunction _listeners(target, type, unwrap) {\n  var events = target._events;\n\n  if (events === undefined)\n    return [];\n\n  var evlistener = events[type];\n  if (evlistener === undefined)\n    return [];\n\n  if (typeof evlistener === 'function')\n    return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n  return unwrap ?\n    unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n  return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n  return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  if (typeof emitter.listenerCount === 'function') {\n    return emitter.listenerCount(type);\n  } else {\n    return listenerCount.call(emitter, type);\n  }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n  var events = this._events;\n\n  if (events !== undefined) {\n    var evlistener = events[type];\n\n    if (typeof evlistener === 'function') {\n      return 1;\n    } else if (evlistener !== undefined) {\n      return evlistener.length;\n    }\n  }\n\n  return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n  return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n  var copy = new Array(n);\n  for (var i = 0; i < n; ++i)\n    copy[i] = arr[i];\n  return copy;\n}\n\nfunction spliceOne(list, index) {\n  for (; index + 1 < list.length; index++)\n    list[index] = list[index + 1];\n  list.pop();\n}\n\nfunction unwrapListeners(arr) {\n  var ret = new Array(arr.length);\n  for (var i = 0; i < ret.length; ++i) {\n    ret[i] = arr[i].listener || arr[i];\n  }\n  return ret;\n}\n\nfunction once(emitter, name) {\n  return new Promise(function (resolve, reject) {\n    function errorListener(err) {\n      emitter.removeListener(name, resolver);\n      reject(err);\n    }\n\n    function resolver() {\n      if (typeof emitter.removeListener === 'function') {\n        emitter.removeListener('error', errorListener);\n      }\n      resolve([].slice.call(arguments));\n    };\n\n    eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n    if (name !== 'error') {\n      addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n    }\n  });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n  if (typeof emitter.on === 'function') {\n    eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n  }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n  if (typeof emitter.on === 'function') {\n    if (flags.once) {\n      emitter.once(name, listener);\n    } else {\n      emitter.on(name, listener);\n    }\n  } else if (typeof emitter.addEventListener === 'function') {\n    // EventTarget does not have `error` event semantics like Node\n    // EventEmitters, we do not listen for `error` events here.\n    emitter.addEventListener(name, function wrapListener(arg) {\n      // IE does not have builtin `{ once: true }` support so we\n      // have to do it manually.\n      if (flags.once) {\n        emitter.removeEventListener(name, wrapListener);\n      }\n      listener(arg);\n    });\n  } else {\n    throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n  }\n}\n","/*\n * Fuzzy\n * https://github.com/myork/fuzzy\n *\n * Copyright (c) 2012 Matt York\n * Licensed under the MIT license.\n */\n\n(function() {\n\nvar root = this;\n\nvar fuzzy = {};\n\n// Use in node or in browser\nif (typeof exports !== 'undefined') {\n  module.exports = fuzzy;\n} else {\n  root.fuzzy = fuzzy;\n}\n\n// Return all elements of `array` that have a fuzzy\n// match against `pattern`.\nfuzzy.simpleFilter = function(pattern, array) {\n  return array.filter(function(str) {\n    return fuzzy.test(pattern, str);\n  });\n};\n\n// Does `pattern` fuzzy match `str`?\nfuzzy.test = function(pattern, str) {\n  return fuzzy.match(pattern, str) !== null;\n};\n\n// If `pattern` matches `str`, wrap each matching character\n// in `opts.pre` and `opts.post`. If no match, return null\nfuzzy.match = function(pattern, str, opts) {\n  opts = opts || {};\n  var patternIdx = 0\n    , result = []\n    , len = str.length\n    , totalScore = 0\n    , currScore = 0\n    // prefix\n    , pre = opts.pre || ''\n    // suffix\n    , post = opts.post || ''\n    // String to compare against. This might be a lowercase version of the\n    // raw string\n    , compareString =  opts.caseSensitive && str || str.toLowerCase()\n    , ch;\n\n  pattern = opts.caseSensitive && pattern || pattern.toLowerCase();\n\n  // For each character in the string, either add it to the result\n  // or wrap in template if it's the next string in the pattern\n  for(var idx = 0; idx < len; idx++) {\n    ch = str[idx];\n    if(compareString[idx] === pattern[patternIdx]) {\n      ch = pre + ch + post;\n      patternIdx += 1;\n\n      // consecutive characters should increase the score more than linearly\n      currScore += 1 + currScore;\n    } else {\n      currScore = 0;\n    }\n    totalScore += currScore;\n    result[result.length] = ch;\n  }\n\n  // return rendered string if we have a match for every char\n  if(patternIdx === pattern.length) {\n    // if the string is an exact match with pattern, totalScore should be maxed\n    totalScore = (compareString === pattern) ? Infinity : totalScore;\n    return {rendered: result.join(''), score: totalScore};\n  }\n\n  return null;\n};\n\n// The normal entry point. Filters `arr` for matches against `pattern`.\n// It returns an array with matching values of the type:\n//\n//     [{\n//         string:   '<b>lah' // The rendered string\n//       , index:    2        // The index of the element in `arr`\n//       , original: 'blah'   // The original element in `arr`\n//     }]\n//\n// `opts` is an optional argument bag. Details:\n//\n//    opts = {\n//        // string to put before a matching character\n//        pre:     '<b>'\n//\n//        // string to put after matching character\n//      , post:    '</b>'\n//\n//        // Optional function. Input is an entry in the given arr`,\n//        // output should be the string to test `pattern` against.\n//        // In this example, if `arr = [{crying: 'koala'}]` we would return\n//        // 'koala'.\n//      , extract: function(arg) { return arg.crying; }\n//    }\nfuzzy.filter = function(pattern, arr, opts) {\n  if(!arr || arr.length === 0) {\n    return [];\n  }\n  if (typeof pattern !== 'string') {\n    return arr;\n  }\n  opts = opts || {};\n  return arr\n    .reduce(function(prev, element, idx, arr) {\n      var str = element;\n      if(opts.extract) {\n        str = opts.extract(element);\n      }\n      var rendered = fuzzy.match(pattern, str, opts);\n      if(rendered != null) {\n        prev[prev.length] = {\n            string: rendered.rendered\n          , score: rendered.score\n          , index: idx\n          , original: element\n        };\n      }\n      return prev;\n    }, [])\n\n    // Sort by score. Browsers are inconsistent wrt stable/unstable\n    // sorting, so force stable by using the index in the case of tie.\n    // See http://ofb.net/~sethml/is-sort-stable.html\n    .sort(function(a,b) {\n      var compare = b.score - a.score;\n      if(compare) return compare;\n      return a.index - b.index;\n    });\n};\n\n\n}());\n\n","/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n    nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n *   console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n  return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n *  Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n *  The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n *  Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n *   'leading': true,\n *   'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n  var lastArgs,\n      lastThis,\n      maxWait,\n      result,\n      timerId,\n      lastCallTime,\n      lastInvokeTime = 0,\n      leading = false,\n      maxing = false,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  wait = toNumber(wait) || 0;\n  if (isObject(options)) {\n    leading = !!options.leading;\n    maxing = 'maxWait' in options;\n    maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n\n  function invokeFunc(time) {\n    var args = lastArgs,\n        thisArg = lastThis;\n\n    lastArgs = lastThis = undefined;\n    lastInvokeTime = time;\n    result = func.apply(thisArg, args);\n    return result;\n  }\n\n  function leadingEdge(time) {\n    // Reset any `maxWait` timer.\n    lastInvokeTime = time;\n    // Start the timer for the trailing edge.\n    timerId = setTimeout(timerExpired, wait);\n    // Invoke the leading edge.\n    return leading ? invokeFunc(time) : result;\n  }\n\n  function remainingWait(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime,\n        result = wait - timeSinceLastCall;\n\n    return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n  }\n\n  function shouldInvoke(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime;\n\n    // Either this is the first call, activity has stopped and we're at the\n    // trailing edge, the system time has gone backwards and we're treating\n    // it as the trailing edge, or we've hit the `maxWait` limit.\n    return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n      (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n  }\n\n  function timerExpired() {\n    var time = now();\n    if (shouldInvoke(time)) {\n      return trailingEdge(time);\n    }\n    // Restart the timer.\n    timerId = setTimeout(timerExpired, remainingWait(time));\n  }\n\n  function trailingEdge(time) {\n    timerId = undefined;\n\n    // Only invoke if we have `lastArgs` which means `func` has been\n    // debounced at least once.\n    if (trailing && lastArgs) {\n      return invokeFunc(time);\n    }\n    lastArgs = lastThis = undefined;\n    return result;\n  }\n\n  function cancel() {\n    if (timerId !== undefined) {\n      clearTimeout(timerId);\n    }\n    lastInvokeTime = 0;\n    lastArgs = lastCallTime = lastThis = timerId = undefined;\n  }\n\n  function flush() {\n    return timerId === undefined ? result : trailingEdge(now());\n  }\n\n  function debounced() {\n    var time = now(),\n        isInvoking = shouldInvoke(time);\n\n    lastArgs = arguments;\n    lastThis = this;\n    lastCallTime = time;\n\n    if (isInvoking) {\n      if (timerId === undefined) {\n        return leadingEdge(lastCallTime);\n      }\n      if (maxing) {\n        // Handle invocations in a tight loop.\n        timerId = setTimeout(timerExpired, wait);\n        return invokeFunc(lastCallTime);\n      }\n    }\n    if (timerId === undefined) {\n      timerId = setTimeout(timerExpired, wait);\n    }\n    return result;\n  }\n  debounced.cancel = cancel;\n  debounced.flush = flush;\n  return debounced;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n  if (typeof value == 'number') {\n    return value;\n  }\n  if (isSymbol(value)) {\n    return NAN;\n  }\n  if (isObject(value)) {\n    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n    value = isObject(other) ? (other + '') : other;\n  }\n  if (typeof value != 'string') {\n    return value === 0 ? value : +value;\n  }\n  value = value.replace(reTrim, '');\n  var isBinary = reIsBinary.test(value);\n  return (isBinary || reIsOctal.test(value))\n    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n    : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n","// @flow strict\n\ntype Config = {|\n  API_URL: string,\n  API_URL_REGEX: RegExp,\n  API_TILEJSON_REGEX: RegExp,\n  API_FONTS_REGEX: RegExp,\n  API_SPRITE_REGEX: RegExp,\n  API_STYLE_REGEX: RegExp,\n  API_CDN_URL_REGEX: RegExp,\n  EVENTS_URL: ?string,\n  SESSION_PATH: string,\n  FEEDBACK_URL: string,\n  REQUIRE_ACCESS_TOKEN: boolean,\n  TILE_URL_VERSION: string,\n  RASTER_URL_PREFIX: string,\n  RASTERARRAYS_URL_PREFIX: string,\n  ACCESS_TOKEN: ?string,\n  MAX_PARALLEL_IMAGE_REQUESTS: number,\n  DRACO_URL: string,\n  MESHOPT_URL: string,\n  MESHOPT_SIMD_URL: string,\n  DEFAULT_STYLE: string,\n  GLYPHS_URL: string,\n|};\n\nlet mapboxHTTPURLRegex;\n\nconst config: Config = {\n    API_URL: 'https://api.mapbox.com',\n    get API_URL_REGEX () {\n        if (mapboxHTTPURLRegex == null) {\n            const prodMapboxHTTPURLRegex = /^((https?:)?\\/\\/)?([^\\/]+\\.)?mapbox\\.c(n|om)(\\/|\\?|$)/i;\n            try {\n                mapboxHTTPURLRegex = (process.env.API_URL_REGEX != null) ? new RegExp(process.env.API_URL_REGEX) : prodMapboxHTTPURLRegex;\n            } catch (e) {\n                mapboxHTTPURLRegex = prodMapboxHTTPURLRegex;\n            }\n        }\n\n        return mapboxHTTPURLRegex;\n    },\n    get API_TILEJSON_REGEX() {\n        // https://docs.mapbox.com/api/maps/mapbox-tiling-service/#retrieve-tilejson-metadata\n        return /^((https?:)?\\/\\/)?([^\\/]+\\.)?mapbox\\.c(n|om)(\\/v[0-9]*\\/.*\\.json.*$)/i;\n    },\n    get API_SPRITE_REGEX() {\n        // https://docs.mapbox.com/api/maps/styles/#retrieve-a-sprite-image-or-json\n        return /^((https?:)?\\/\\/)?([^\\/]+\\.)?mapbox\\.c(n|om)(\\/styles\\/v[0-9]*\\/)(.*\\/sprite.*\\..*$)/i;\n    },\n    get API_FONTS_REGEX() {\n        // https://docs.mapbox.com/api/maps/fonts/#retrieve-font-glyph-ranges\n        return /^((https?:)?\\/\\/)?([^\\/]+\\.)?mapbox\\.c(n|om)(\\/fonts\\/v[0-9]*\\/)(.*\\.pbf.*$)/i;\n    },\n    get API_STYLE_REGEX() {\n        // https://docs.mapbox.com/api/maps/styles/#retrieve-a-style\n        return /^((https?:)?\\/\\/)?([^\\/]+\\.)?mapbox\\.c(n|om)(\\/styles\\/v[0-9]*\\/)(.*$)/i;\n    },\n    get API_CDN_URL_REGEX() {\n        return /^((https?:)?\\/\\/)?api\\.mapbox\\.c(n|om)(\\/mapbox-gl-js\\/)(.*$)/i;\n    },\n    get EVENTS_URL() {\n        if (!config.API_URL) { return null; }\n        try {\n            const url = new URL(config.API_URL);\n            if (url.hostname === 'api.mapbox.cn') {\n                return 'https://events.mapbox.cn/events/v2';\n            } else if (url.hostname === 'api.mapbox.com') {\n                return 'https://events.mapbox.com/events/v2';\n            } else {\n                return null;\n            }\n        } catch (e) {\n            return null;\n        }\n    },\n    SESSION_PATH: '/map-sessions/v1',\n    FEEDBACK_URL: 'https://apps.mapbox.com/feedback',\n    TILE_URL_VERSION: 'v4',\n    RASTER_URL_PREFIX: 'raster/v1',\n    RASTERARRAYS_URL_PREFIX: 'rasterarrays/v1',\n    REQUIRE_ACCESS_TOKEN: true,\n    ACCESS_TOKEN: null,\n    DEFAULT_STYLE: 'mapbox://styles/mapbox/standard',\n    MAX_PARALLEL_IMAGE_REQUESTS: 16,\n    DRACO_URL: 'https://api.mapbox.com/mapbox-gl-js/draco_decoder_gltf_v1.5.6.wasm',\n    MESHOPT_URL: 'https://api.mapbox.com/mapbox-gl-js/meshopt_base_v0.20.wasm',\n    MESHOPT_SIMD_URL: 'https://api.mapbox.com/mapbox-gl-js/meshopt_simd_v0.20.wasm',\n    GLYPHS_URL: 'mapbox://fonts/mapbox/{fontstack}/{range}.pbf'\n};\n\nexport default config;\n","// @flow\nimport config from './config.js';\n\nexport function isMapboxHTTPURL(url: string): boolean {\n    return config.API_URL_REGEX.test(url);\n}\n\nexport function isMapboxURL(url: string): boolean {\n    return url.indexOf('mapbox:') === 0;\n}\n\nexport function isMapboxHTTPCDNURL(url: string): boolean {\n    return config.API_CDN_URL_REGEX.test(url);\n}\n\nexport function isMapboxHTTPSpriteURL(url: string): boolean {\n    return config.API_SPRITE_REGEX.test(url);\n}\n\nexport function isMapboxHTTPStyleURL(url: string): boolean {\n    return config.API_STYLE_REGEX.test(url) && !isMapboxHTTPSpriteURL(url);\n}\n\nexport function isMapboxHTTPTileJSONURL(url: string): boolean {\n    return config.API_TILEJSON_REGEX.test(url);\n}\n\nexport function isMapboxHTTPFontsURL(url: string): boolean {\n    return config.API_FONTS_REGEX.test(url);\n}\n\nexport function hasCacheDefeatingSku(url: string): boolean {\n    return url.indexOf('sku=') > 0 && isMapboxHTTPURL(url);\n}\n","// @flow\n\nimport {version as sdkVersion} from '../../package.json';\nimport {\n    isMapboxHTTPFontsURL,\n    isMapboxHTTPTileJSONURL,\n    isMapboxHTTPSpriteURL,\n    isMapboxHTTPStyleURL,\n    isMapboxHTTPCDNURL\n} from './mapbox_url.js';\n\ntype LivePerformanceMetrics = {\n    counters: Array<Object>,\n    metadata: Array<Object>,\n    attributes: Array<Object>\n};\n\nexport type LivePerformanceData = {\n    interactionRange: [number, number],\n    visibilityHidden: number,\n    width: number,\n    height: number,\n    terrainEnabled: boolean,\n    fogEnabled: boolean,\n    projection: string,\n    zoom: number,\n    renderer: ?string,\n    vendor: ?string\n};\n\nexport const PerformanceMarkers = {\n    create: 'create',\n    load: 'load',\n    fullLoad: 'fullLoad'\n};\n\nexport const LivePerformanceUtils = {\n    mark(marker: $Keys<typeof PerformanceMarkers>) {\n        performance.mark(marker);\n    },\n    measure(name: string, begin?: string, end?: string) {\n        performance.measure(name, begin, end);\n    }\n};\n\nfunction categorize(arr: Array<PerformanceResourceTiming>, fn: (entry: PerformanceResourceTiming) => string): {[string]: Array<PerformanceResourceTiming>} {\n    const obj = {};\n    if (arr) {\n        for (const item of arr) {\n            const category = fn(item);\n            if (obj[category] === undefined) {\n                obj[category] = [];\n            }\n            obj[category].push(item);\n        }\n    }\n    return obj;\n}\n\nfunction getCountersPerResourceType(resourceTimers: { [string]: Array<PerformanceResourceTiming> }) {\n    const obj = {};\n    if (resourceTimers) {\n        for (const category in resourceTimers) {\n            if (category !== 'other') {\n                for (const timer of resourceTimers[category]) {\n                    const min = `${category}ResolveRangeMin`;\n                    const max = `${category}ResolveRangeMax`;\n                    const reqCount = `${category}RequestCount`;\n                    const reqCachedCount = `${category}RequestCachedCount`;\n\n                    // Resource -TransferStart and -TransferEnd represent the wall time\n                    // between the start of a request to when the data is available\n                    obj[min] = Math.min(obj[min] || +Infinity, timer.startTime);\n                    obj[max] = Math.max(obj[max] || -Infinity, timer.responseEnd);\n\n                    const increment = (key: string) => {\n                        if (obj[key] === undefined) {\n                            obj[key] = 0;\n                        }\n                        ++obj[key];\n                    };\n\n                    const transferSizeSupported = timer.transferSize !== undefined;\n                    if (transferSizeSupported) {\n                        const resourceFetchedFromCache = (timer.transferSize === 0);\n                        if (resourceFetchedFromCache) {\n                            increment(reqCachedCount);\n                        }\n                    }\n                    increment(reqCount);\n                }\n            }\n        }\n    }\n    return obj;\n}\n\nfunction getResourceCategory(entry: PerformanceResourceTiming): string {\n    const url = entry.name.split('?')[0];\n\n    if (isMapboxHTTPCDNURL(url) && url.includes('mapbox-gl.js')) return 'javascript';\n    if (isMapboxHTTPCDNURL(url) && url.includes('mapbox-gl.css')) return 'css';\n    if (isMapboxHTTPFontsURL(url)) return 'fontRange';\n    if (isMapboxHTTPSpriteURL(url)) return 'sprite';\n    if (isMapboxHTTPStyleURL(url)) return 'style';\n    if (isMapboxHTTPTileJSONURL(url)) return 'tilejson';\n\n    return 'other';\n}\n\nfunction getStyle(resourceTimers: Array<PerformanceResourceTiming>): ?string {\n    if (resourceTimers) {\n        for (const timer of resourceTimers) {\n            const url = timer.name.split('?')[0];\n            if (isMapboxHTTPStyleURL(url)) {\n                const split = url.split('/').slice(-2);\n                if (split.length === 2) {\n                    return `mapbox://styles/${split[0]}/${split[1]}`;\n                }\n            }\n        }\n    }\n}\n\nexport function getLivePerformanceMetrics(data: LivePerformanceData): LivePerformanceMetrics {\n    const resourceTimers = ((performance.getEntriesByType('resource'): any): Array<PerformanceResourceTiming>);\n    const markerTimers = performance.getEntriesByType('mark');\n    const resourcesByType = categorize(resourceTimers, getResourceCategory);\n    const counters = getCountersPerResourceType(resourcesByType);\n    const devicePixelRatio = window.devicePixelRatio;\n    // $FlowFixMe[prop-missing] no connection types in Flow\n    const connection = navigator.connection || navigator.mozConnection || navigator.webkitConnection;\n    const effectiveType = connection ? (connection: any).effectiveType : undefined;\n    const metrics: LivePerformanceMetrics = {counters: [], metadata: [], attributes: []};\n\n    // Please read carefully before adding or modifying the following metrics:\n    // https://github.com/mapbox/gl-js-team/blob/main/docs/live_performance_metrics.md\n    const addMetric = (arr: Array<{| name: string, value: string |}>, name: string, value: ?(number | string)) => {\n        if (value !== undefined && value !== null) {\n            arr.push({name, value: value.toString()});\n        }\n    };\n\n    for (const counter in counters) {\n        addMetric(metrics.counters, counter, counters[counter]);\n    }\n    if (data.interactionRange[0] !== +Infinity && data.interactionRange[1] !== -Infinity) {\n        addMetric(metrics.counters, \"interactionRangeMin\", data.interactionRange[0]);\n        addMetric(metrics.counters, \"interactionRangeMax\", data.interactionRange[1]);\n    }\n    if (markerTimers) {\n        for (const marker of Object.keys(PerformanceMarkers)) {\n            const markerName = PerformanceMarkers[marker];\n            const markerTimer = markerTimers.find((entry) => entry.name === markerName);\n            if (markerTimer) {\n                addMetric(metrics.counters, markerName, markerTimer.startTime);\n            }\n        }\n    }\n    addMetric(metrics.counters, \"visibilityHidden\", data.visibilityHidden);\n\n    addMetric(metrics.attributes, \"style\", getStyle(resourceTimers));\n    addMetric(metrics.attributes, \"terrainEnabled\", data.terrainEnabled ? \"true\" : \"false\");\n    addMetric(metrics.attributes, \"fogEnabled\", data.fogEnabled ? \"true\" : \"false\");\n    addMetric(metrics.attributes, \"projection\", data.projection);\n    addMetric(metrics.attributes, \"zoom\", data.zoom);\n\n    addMetric(metrics.metadata, \"devicePixelRatio\", devicePixelRatio);\n    addMetric(metrics.metadata, \"connectionEffectiveType\", effectiveType);\n    addMetric(metrics.metadata, \"navigatorUserAgent\", navigator.userAgent);\n    addMetric(metrics.metadata, \"screenWidth\", window.screen.width);\n    addMetric(metrics.metadata, \"screenHeight\", window.screen.height);\n    addMetric(metrics.metadata, \"windowWidth\", window.innerWidth);\n    addMetric(metrics.metadata, \"windowHeight\", window.innerHeight);\n    addMetric(metrics.metadata, \"mapWidth\", data.width / devicePixelRatio);\n    addMetric(metrics.metadata, \"mapHeight\", data.height / devicePixelRatio);\n    addMetric(metrics.metadata, \"webglRenderer\", data.renderer);\n    addMetric(metrics.metadata, \"webglVendor\", data.vendor);\n    addMetric(metrics.metadata, \"sdkVersion\", sdkVersion);\n    addMetric(metrics.metadata, \"sdkIdentifier\", \"mapbox-gl-js\");\n\n    return metrics;\n}\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.setMatrixArrayType = setMatrixArrayType;\nexports.toRadian = toRadian;\nexports.equals = equals;\nexports.RANDOM = exports.ARRAY_TYPE = exports.EPSILON = void 0;\n\n/**\n * Common utilities\n * @module glMatrix\n */\n// Configuration Constants\nvar EPSILON = 0.000001;\nexports.EPSILON = EPSILON;\nvar ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\nexports.ARRAY_TYPE = ARRAY_TYPE;\nvar RANDOM = Math.random;\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\n */\n\nexports.RANDOM = RANDOM;\n\nfunction setMatrixArrayType(type) {\n  exports.ARRAY_TYPE = ARRAY_TYPE = type;\n}\n\nvar degree = Math.PI / 180;\n/**\n * Convert Degree To Radian\n *\n * @param {Number} a Angle in Degrees\n */\n\nfunction toRadian(a) {\n  return a * degree;\n}\n/**\n * Tests whether or not the arguments have approximately the same value, within an absolute\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\n * than or equal to 1.0, and a relative tolerance is used for larger values)\n *\n * @param {Number} a The first number to test.\n * @param {Number} b The second number to test.\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\n */\n\n\nfunction equals(a, b) {\n  return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));\n}\n\nif (!Math.hypot) Math.hypot = function () {\n  var y = 0,\n      i = arguments.length;\n\n  while (i--) {\n    y += arguments[i] * arguments[i];\n  }\n\n  return Math.sqrt(y);\n};","\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.create = create;\nexports.clone = clone;\nexports.copy = copy;\nexports.identity = identity;\nexports.fromValues = fromValues;\nexports.set = set;\nexports.transpose = transpose;\nexports.invert = invert;\nexports.adjoint = adjoint;\nexports.determinant = determinant;\nexports.multiply = multiply;\nexports.rotate = rotate;\nexports.scale = scale;\nexports.fromRotation = fromRotation;\nexports.fromScaling = fromScaling;\nexports.str = str;\nexports.frob = frob;\nexports.LDU = LDU;\nexports.add = add;\nexports.subtract = subtract;\nexports.exactEquals = exactEquals;\nexports.equals = equals;\nexports.multiplyScalar = multiplyScalar;\nexports.multiplyScalarAndAdd = multiplyScalarAndAdd;\nexports.sub = exports.mul = void 0;\n\nvar glMatrix = _interopRequireWildcard(require(\"./common.js\"));\n\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== \"function\") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\n\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") { return { \"default\": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj[\"default\"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n/**\n * 2x2 Matrix\n * @module mat2\n */\n\n/**\n * Creates a new identity mat2\n *\n * @returns {mat2} a new 2x2 matrix\n */\nfunction create() {\n  var out = new glMatrix.ARRAY_TYPE(4);\n\n  if (glMatrix.ARRAY_TYPE != Float32Array) {\n    out[1] = 0;\n    out[2] = 0;\n  }\n\n  out[0] = 1;\n  out[3] = 1;\n  return out;\n}\n/**\n * Creates a new mat2 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat2} a matrix to clone\n * @returns {mat2} a new 2x2 matrix\n */\n\n\nfunction clone(a) {\n  var out = new glMatrix.ARRAY_TYPE(4);\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[3];\n  return out;\n}\n/**\n * Copy the values from one mat2 to another\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the source matrix\n * @returns {mat2} out\n */\n\n\nfunction copy(out, a) {\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[3];\n  return out;\n}\n/**\n * Set a mat2 to the identity matrix\n *\n * @param {mat2} out the receiving matrix\n * @returns {mat2} out\n */\n\n\nfunction identity(out) {\n  out[0] = 1;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 1;\n  return out;\n}\n/**\n * Create a new mat2 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m10 Component in column 1, row 0 position (index 2)\n * @param {Number} m11 Component in column 1, row 1 position (index 3)\n * @returns {mat2} out A new 2x2 matrix\n */\n\n\nfunction fromValues(m00, m01, m10, m11) {\n  var out = new glMatrix.ARRAY_TYPE(4);\n  out[0] = m00;\n  out[1] = m01;\n  out[2] = m10;\n  out[3] = m11;\n  return out;\n}\n/**\n * Set the components of a mat2 to the given values\n *\n * @param {mat2} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m10 Component in column 1, row 0 position (index 2)\n * @param {Number} m11 Component in column 1, row 1 position (index 3)\n * @returns {mat2} out\n */\n\n\nfunction set(out, m00, m01, m10, m11) {\n  out[0] = m00;\n  out[1] = m01;\n  out[2] = m10;\n  out[3] = m11;\n  return out;\n}\n/**\n * Transpose the values of a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the source matrix\n * @returns {mat2} out\n */\n\n\nfunction transpose(out, a) {\n  // If we are transposing ourselves we can skip a few steps but have to cache\n  // some values\n  if (out === a) {\n    var a1 = a[1];\n    out[1] = a[2];\n    out[2] = a1;\n  } else {\n    out[0] = a[0];\n    out[1] = a[2];\n    out[2] = a[1];\n    out[3] = a[3];\n  }\n\n  return out;\n}\n/**\n * Inverts a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the source matrix\n * @returns {mat2} out\n */\n\n\nfunction invert(out, a) {\n  var a0 = a[0],\n      a1 = a[1],\n      a2 = a[2],\n      a3 = a[3]; // Calculate the determinant\n\n  var det = a0 * a3 - a2 * a1;\n\n  if (!det) {\n    return null;\n  }\n\n  det = 1.0 / det;\n  out[0] = a3 * det;\n  out[1] = -a1 * det;\n  out[2] = -a2 * det;\n  out[3] = a0 * det;\n  return out;\n}\n/**\n * Calculates the adjugate of a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the source matrix\n * @returns {mat2} out\n */\n\n\nfunction adjoint(out, a) {\n  // Caching this value is nessecary if out == a\n  var a0 = a[0];\n  out[0] = a[3];\n  out[1] = -a[1];\n  out[2] = -a[2];\n  out[3] = a0;\n  return out;\n}\n/**\n * Calculates the determinant of a mat2\n *\n * @param {ReadonlyMat2} a the source matrix\n * @returns {Number} determinant of a\n */\n\n\nfunction determinant(a) {\n  return a[0] * a[3] - a[2] * a[1];\n}\n/**\n * Multiplies two mat2's\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the first operand\n * @param {ReadonlyMat2} b the second operand\n * @returns {mat2} out\n */\n\n\nfunction multiply(out, a, b) {\n  var a0 = a[0],\n      a1 = a[1],\n      a2 = a[2],\n      a3 = a[3];\n  var b0 = b[0],\n      b1 = b[1],\n      b2 = b[2],\n      b3 = b[3];\n  out[0] = a0 * b0 + a2 * b1;\n  out[1] = a1 * b0 + a3 * b1;\n  out[2] = a0 * b2 + a2 * b3;\n  out[3] = a1 * b2 + a3 * b3;\n  return out;\n}\n/**\n * Rotates a mat2 by the given angle\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2} out\n */\n\n\nfunction rotate(out, a, rad) {\n  var a0 = a[0],\n      a1 = a[1],\n      a2 = a[2],\n      a3 = a[3];\n  var s = Math.sin(rad);\n  var c = Math.cos(rad);\n  out[0] = a0 * c + a2 * s;\n  out[1] = a1 * c + a3 * s;\n  out[2] = a0 * -s + a2 * c;\n  out[3] = a1 * -s + a3 * c;\n  return out;\n}\n/**\n * Scales the mat2 by the dimensions in the given vec2\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the matrix to rotate\n * @param {ReadonlyVec2} v the vec2 to scale the matrix by\n * @returns {mat2} out\n **/\n\n\nfunction scale(out, a, v) {\n  var a0 = a[0],\n      a1 = a[1],\n      a2 = a[2],\n      a3 = a[3];\n  var v0 = v[0],\n      v1 = v[1];\n  out[0] = a0 * v0;\n  out[1] = a1 * v0;\n  out[2] = a2 * v1;\n  out[3] = a3 * v1;\n  return out;\n}\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n *     mat2.identity(dest);\n *     mat2.rotate(dest, dest, rad);\n *\n * @param {mat2} out mat2 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2} out\n */\n\n\nfunction fromRotation(out, rad) {\n  var s = Math.sin(rad);\n  var c = Math.cos(rad);\n  out[0] = c;\n  out[1] = s;\n  out[2] = -s;\n  out[3] = c;\n  return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n *     mat2.identity(dest);\n *     mat2.scale(dest, dest, vec);\n *\n * @param {mat2} out mat2 receiving operation result\n * @param {ReadonlyVec2} v Scaling vector\n * @returns {mat2} out\n */\n\n\nfunction fromScaling(out, v) {\n  out[0] = v[0];\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = v[1];\n  return out;\n}\n/**\n * Returns a string representation of a mat2\n *\n * @param {ReadonlyMat2} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\n\nfunction str(a) {\n  return \"mat2(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\n * Returns Frobenius norm of a mat2\n *\n * @param {ReadonlyMat2} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\n\nfunction frob(a) {\n  return Math.hypot(a[0], a[1], a[2], a[3]);\n}\n/**\n * Returns L, D and U matrices (Lower triangular, Diagonal and Upper triangular) by factorizing the input matrix\n * @param {ReadonlyMat2} L the lower triangular matrix\n * @param {ReadonlyMat2} D the diagonal matrix\n * @param {ReadonlyMat2} U the upper triangular matrix\n * @param {ReadonlyMat2} a the input matrix to factorize\n */\n\n\nfunction LDU(L, D, U, a) {\n  L[2] = a[2] / a[0];\n  U[0] = a[0];\n  U[1] = a[1];\n  U[3] = a[3] - L[2] * U[1];\n  return [L, D, U];\n}\n/**\n * Adds two mat2's\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the first operand\n * @param {ReadonlyMat2} b the second operand\n * @returns {mat2} out\n */\n\n\nfunction add(out, a, b) {\n  out[0] = a[0] + b[0];\n  out[1] = a[1] + b[1];\n  out[2] = a[2] + b[2];\n  out[3] = a[3] + b[3];\n  return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the first operand\n * @param {ReadonlyMat2} b the second operand\n * @returns {mat2} out\n */\n\n\nfunction subtract(out, a, b) {\n  out[0] = a[0] - b[0];\n  out[1] = a[1] - b[1];\n  out[2] = a[2] - b[2];\n  out[3] = a[3] - b[3];\n  return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat2} a The first matrix.\n * @param {ReadonlyMat2} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\n\nfunction exactEquals(a, b) {\n  return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat2} a The first matrix.\n * @param {ReadonlyMat2} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\n\nfunction equals(a, b) {\n  var a0 = a[0],\n      a1 = a[1],\n      a2 = a[2],\n      a3 = a[3];\n  var b0 = b[0],\n      b1 = b[1],\n      b2 = b[2],\n      b3 = b[3];\n  return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat2} out\n */\n\n\nfunction multiplyScalar(out, a, b) {\n  out[0] = a[0] * b;\n  out[1] = a[1] * b;\n  out[2] = a[2] * b;\n  out[3] = a[3] * b;\n  return out;\n}\n/**\n * Adds two mat2's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat2} out the receiving vector\n * @param {ReadonlyMat2} a the first operand\n * @param {ReadonlyMat2} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat2} out\n */\n\n\nfunction multiplyScalarAndAdd(out, a, b, scale) {\n  out[0] = a[0] + b[0] * scale;\n  out[1] = a[1] + b[1] * scale;\n  out[2] = a[2] + b[2] * scale;\n  out[3] = a[3] + b[3] * scale;\n  return out;\n}\n/**\n * Alias for {@link mat2.multiply}\n * @function\n */\n\n\nvar mul = multiply;\n/**\n * Alias for {@link mat2.subtract}\n * @function\n */\n\nexports.mul = mul;\nvar sub = subtract;\nexports.sub = sub;","\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.create = create;\nexports.clone = clone;\nexports.copy = copy;\nexports.identity = identity;\nexports.fromValues = fromValues;\nexports.set = set;\nexports.invert = invert;\nexports.determinant = determinant;\nexports.multiply = multiply;\nexports.rotate = rotate;\nexports.scale = scale;\nexports.translate = translate;\nexports.fromRotation = fromRotation;\nexports.fromScaling = fromScaling;\nexports.fromTranslation = fromTranslation;\nexports.str = str;\nexports.frob = frob;\nexports.add = add;\nexports.subtract = subtract;\nexports.multiplyScalar = multiplyScalar;\nexports.multiplyScalarAndAdd = multiplyScalarAndAdd;\nexports.exactEquals = exactEquals;\nexports.equals = equals;\nexports.sub = exports.mul = void 0;\n\nvar glMatrix = _interopRequireWildcard(require(\"./common.js\"));\n\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== \"function\") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\n\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") { return { \"default\": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj[\"default\"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n/**\n * 2x3 Matrix\n * @module mat2d\n * @description\n * A mat2d contains six elements defined as:\n * <pre>\n * [a, b,\n *  c, d,\n *  tx, ty]\n * </pre>\n * This is a short form for the 3x3 matrix:\n * <pre>\n * [a, b, 0,\n *  c, d, 0,\n *  tx, ty, 1]\n * </pre>\n * The last column is ignored so the array is shorter and operations are faster.\n */\n\n/**\n * Creates a new identity mat2d\n *\n * @returns {mat2d} a new 2x3 matrix\n */\nfunction create() {\n  var out = new glMatrix.ARRAY_TYPE(6);\n\n  if (glMatrix.ARRAY_TYPE != Float32Array) {\n    out[1] = 0;\n    out[2] = 0;\n    out[4] = 0;\n    out[5] = 0;\n  }\n\n  out[0] = 1;\n  out[3] = 1;\n  return out;\n}\n/**\n * Creates a new mat2d initialized with values from an existing matrix\n *\n * @param {ReadonlyMat2d} a matrix to clone\n * @returns {mat2d} a new 2x3 matrix\n */\n\n\nfunction clone(a) {\n  var out = new glMatrix.ARRAY_TYPE(6);\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[3];\n  out[4] = a[4];\n  out[5] = a[5];\n  return out;\n}\n/**\n * Copy the values from one mat2d to another\n *\n * @param {mat2d} out the receiving matrix\n * @param {ReadonlyMat2d} a the source matrix\n * @returns {mat2d} out\n */\n\n\nfunction copy(out, a) {\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[3];\n  out[4] = a[4];\n  out[5] = a[5];\n  return out;\n}\n/**\n * Set a mat2d to the identity matrix\n *\n * @param {mat2d} out the receiving matrix\n * @returns {mat2d} out\n */\n\n\nfunction identity(out) {\n  out[0] = 1;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 1;\n  out[4] = 0;\n  out[5] = 0;\n  return out;\n}\n/**\n * Create a new mat2d with the given values\n *\n * @param {Number} a Component A (index 0)\n * @param {Number} b Component B (index 1)\n * @param {Number} c Component C (index 2)\n * @param {Number} d Component D (index 3)\n * @param {Number} tx Component TX (index 4)\n * @param {Number} ty Component TY (index 5)\n * @returns {mat2d} A new mat2d\n */\n\n\nfunction fromValues(a, b, c, d, tx, ty) {\n  var out = new glMatrix.ARRAY_TYPE(6);\n  out[0] = a;\n  out[1] = b;\n  out[2] = c;\n  out[3] = d;\n  out[4] = tx;\n  out[5] = ty;\n  return out;\n}\n/**\n * Set the components of a mat2d to the given values\n *\n * @param {mat2d} out the receiving matrix\n * @param {Number} a Component A (index 0)\n * @param {Number} b Component B (index 1)\n * @param {Number} c Component C (index 2)\n * @param {Number} d Component D (index 3)\n * @param {Number} tx Component TX (index 4)\n * @param {Number} ty Component TY (index 5)\n * @returns {mat2d} out\n */\n\n\nfunction set(out, a, b, c, d, tx, ty) {\n  out[0] = a;\n  out[1] = b;\n  out[2] = c;\n  out[3] = d;\n  out[4] = tx;\n  out[5] = ty;\n  return out;\n}\n/**\n * Inverts a mat2d\n *\n * @param {mat2d} out the receiving matrix\n * @param {ReadonlyMat2d} a the source matrix\n * @returns {mat2d} out\n */\n\n\nfunction invert(out, a) {\n  var aa = a[0],\n      ab = a[1],\n      ac = a[2],\n      ad = a[3];\n  var atx = a[4],\n      aty = a[5];\n  var det = aa * ad - ab * ac;\n\n  if (!det) {\n    return null;\n  }\n\n  det = 1.0 / det;\n  out[0] = ad * det;\n  out[1] = -ab * det;\n  out[2] = -ac * det;\n  out[3] = aa * det;\n  out[4] = (ac * aty - ad * atx) * det;\n  out[5] = (ab * atx - aa * aty) * det;\n  return out;\n}\n/**\n * Calculates the determinant of a mat2d\n *\n * @param {ReadonlyMat2d} a the source matrix\n * @returns {Number} determinant of a\n */\n\n\nfunction determinant(a) {\n  return a[0] * a[3] - a[1] * a[2];\n}\n/**\n * Multiplies two mat2d's\n *\n * @param {mat2d} out the receiving matrix\n * @param {ReadonlyMat2d} a the first operand\n * @param {ReadonlyMat2d} b the second operand\n * @returns {mat2d} out\n */\n\n\nfunction multiply(out, a, b) {\n  var a0 = a[0],\n      a1 = a[1],\n      a2 = a[2],\n      a3 = a[3],\n      a4 = a[4],\n      a5 = a[5];\n  var b0 = b[0],\n      b1 = b[1],\n      b2 = b[2],\n      b3 = b[3],\n      b4 = b[4],\n      b5 = b[5];\n  out[0] = a0 * b0 + a2 * b1;\n  out[1] = a1 * b0 + a3 * b1;\n  out[2] = a0 * b2 + a2 * b3;\n  out[3] = a1 * b2 + a3 * b3;\n  out[4] = a0 * b4 + a2 * b5 + a4;\n  out[5] = a1 * b4 + a3 * b5 + a5;\n  return out;\n}\n/**\n * Rotates a mat2d by the given angle\n *\n * @param {mat2d} out the receiving matrix\n * @param {ReadonlyMat2d} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2d} out\n */\n\n\nfunction rotate(out, a, rad) {\n  var a0 = a[0],\n      a1 = a[1],\n      a2 = a[2],\n      a3 = a[3],\n      a4 = a[4],\n      a5 = a[5];\n  var s = Math.sin(rad);\n  var c = Math.cos(rad);\n  out[0] = a0 * c + a2 * s;\n  out[1] = a1 * c + a3 * s;\n  out[2] = a0 * -s + a2 * c;\n  out[3] = a1 * -s + a3 * c;\n  out[4] = a4;\n  out[5] = a5;\n  return out;\n}\n/**\n * Scales the mat2d by the dimensions in the given vec2\n *\n * @param {mat2d} out the receiving matrix\n * @param {ReadonlyMat2d} a the matrix to translate\n * @param {ReadonlyVec2} v the vec2 to scale the matrix by\n * @returns {mat2d} out\n **/\n\n\nfunction scale(out, a, v) {\n  var a0 = a[0],\n      a1 = a[1],\n      a2 = a[2],\n      a3 = a[3],\n      a4 = a[4],\n      a5 = a[5];\n  var v0 = v[0],\n      v1 = v[1];\n  out[0] = a0 * v0;\n  out[1] = a1 * v0;\n  out[2] = a2 * v1;\n  out[3] = a3 * v1;\n  out[4] = a4;\n  out[5] = a5;\n  return out;\n}\n/**\n * Translates the mat2d by the dimensions in the given vec2\n *\n * @param {mat2d} out the receiving matrix\n * @param {ReadonlyMat2d} a the matrix to translate\n * @param {ReadonlyVec2} v the vec2 to translate the matrix by\n * @returns {mat2d} out\n **/\n\n\nfunction translate(out, a, v) {\n  var a0 = a[0],\n      a1 = a[1],\n      a2 = a[2],\n      a3 = a[3],\n      a4 = a[4],\n      a5 = a[5];\n  var v0 = v[0],\n      v1 = v[1];\n  out[0] = a0;\n  out[1] = a1;\n  out[2] = a2;\n  out[3] = a3;\n  out[4] = a0 * v0 + a2 * v1 + a4;\n  out[5] = a1 * v0 + a3 * v1 + a5;\n  return out;\n}\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n *     mat2d.identity(dest);\n *     mat2d.rotate(dest, dest, rad);\n *\n * @param {mat2d} out mat2d receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2d} out\n */\n\n\nfunction fromRotation(out, rad) {\n  var s = Math.sin(rad),\n      c = Math.cos(rad);\n  out[0] = c;\n  out[1] = s;\n  out[2] = -s;\n  out[3] = c;\n  out[4] = 0;\n  out[5] = 0;\n  return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n *     mat2d.identity(dest);\n *     mat2d.scale(dest, dest, vec);\n *\n * @param {mat2d} out mat2d receiving operation result\n * @param {ReadonlyVec2} v Scaling vector\n * @returns {mat2d} out\n */\n\n\nfunction fromScaling(out, v) {\n  out[0] = v[0];\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = v[1];\n  out[4] = 0;\n  out[5] = 0;\n  return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat2d.identity(dest);\n *     mat2d.translate(dest, dest, vec);\n *\n * @param {mat2d} out mat2d receiving operation result\n * @param {ReadonlyVec2} v Translation vector\n * @returns {mat2d} out\n */\n\n\nfunction fromTranslation(out, v) {\n  out[0] = 1;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 1;\n  out[4] = v[0];\n  out[5] = v[1];\n  return out;\n}\n/**\n * Returns a string representation of a mat2d\n *\n * @param {ReadonlyMat2d} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\n\nfunction str(a) {\n  return \"mat2d(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \")\";\n}\n/**\n * Returns Frobenius norm of a mat2d\n *\n * @param {ReadonlyMat2d} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\n\nfunction frob(a) {\n  return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], 1);\n}\n/**\n * Adds two mat2d's\n *\n * @param {mat2d} out the receiving matrix\n * @param {ReadonlyMat2d} a the first operand\n * @param {ReadonlyMat2d} b the second operand\n * @returns {mat2d} out\n */\n\n\nfunction add(out, a, b) {\n  out[0] = a[0] + b[0];\n  out[1] = a[1] + b[1];\n  out[2] = a[2] + b[2];\n  out[3] = a[3] + b[3];\n  out[4] = a[4] + b[4];\n  out[5] = a[5] + b[5];\n  return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat2d} out the receiving matrix\n * @param {ReadonlyMat2d} a the first operand\n * @param {ReadonlyMat2d} b the second operand\n * @returns {mat2d} out\n */\n\n\nfunction subtract(out, a, b) {\n  out[0] = a[0] - b[0];\n  out[1] = a[1] - b[1];\n  out[2] = a[2] - b[2];\n  out[3] = a[3] - b[3];\n  out[4] = a[4] - b[4];\n  out[5] = a[5] - b[5];\n  return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat2d} out the receiving matrix\n * @param {ReadonlyMat2d} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat2d} out\n */\n\n\nfunction multiplyScalar(out, a, b) {\n  out[0] = a[0] * b;\n  out[1] = a[1] * b;\n  out[2] = a[2] * b;\n  out[3] = a[3] * b;\n  out[4] = a[4] * b;\n  out[5] = a[5] * b;\n  return out;\n}\n/**\n * Adds two mat2d's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat2d} out the receiving vector\n * @param {ReadonlyMat2d} a the first operand\n * @param {ReadonlyMat2d} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat2d} out\n */\n\n\nfunction multiplyScalarAndAdd(out, a, b, scale) {\n  out[0] = a[0] + b[0] * scale;\n  out[1] = a[1] + b[1] * scale;\n  out[2] = a[2] + b[2] * scale;\n  out[3] = a[3] + b[3] * scale;\n  out[4] = a[4] + b[4] * scale;\n  out[5] = a[5] + b[5] * scale;\n  return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat2d} a The first matrix.\n * @param {ReadonlyMat2d} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\n\nfunction exactEquals(a, b) {\n  return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat2d} a The first matrix.\n * @param {ReadonlyMat2d} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\n\nfunction equals(a, b) {\n  var a0 = a[0],\n      a1 = a[1],\n      a2 = a[2],\n      a3 = a[3],\n      a4 = a[4],\n      a5 = a[5];\n  var b0 = b[0],\n      b1 = b[1],\n      b2 = b[2],\n      b3 = b[3],\n      b4 = b[4],\n      b5 = b[5];\n  return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5));\n}\n/**\n * Alias for {@link mat2d.multiply}\n * @function\n */\n\n\nvar mul = multiply;\n/**\n * Alias for {@link mat2d.subtract}\n * @function\n */\n\nexports.mul = mul;\nvar sub = subtract;\nexports.sub = sub;","\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.create = create;\nexports.fromMat4 = fromMat4;\nexports.clone = clone;\nexports.copy = copy;\nexports.fromValues = fromValues;\nexports.set = set;\nexports.identity = identity;\nexports.transpose = transpose;\nexports.invert = invert;\nexports.adjoint = adjoint;\nexports.determinant = determinant;\nexports.multiply = multiply;\nexports.translate = translate;\nexports.rotate = rotate;\nexports.scale = scale;\nexports.fromTranslation = fromTranslation;\nexports.fromRotation = fromRotation;\nexports.fromScaling = fromScaling;\nexports.fromMat2d = fromMat2d;\nexports.fromQuat = fromQuat;\nexports.normalFromMat4 = normalFromMat4;\nexports.projection = projection;\nexports.str = str;\nexports.frob = frob;\nexports.add = add;\nexports.subtract = subtract;\nexports.multiplyScalar = multiplyScalar;\nexports.multiplyScalarAndAdd = multiplyScalarAndAdd;\nexports.exactEquals = exactEquals;\nexports.equals = equals;\nexports.sub = exports.mul = void 0;\n\nvar glMatrix = _interopRequireWildcard(require(\"./common.js\"));\n\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== \"function\") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\n\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") { return { \"default\": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj[\"default\"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n/**\n * 3x3 Matrix\n * @module mat3\n */\n\n/**\n * Creates a new identity mat3\n *\n * @returns {mat3} a new 3x3 matrix\n */\nfunction create() {\n  var out = new glMatrix.ARRAY_TYPE(9);\n\n  if (glMatrix.ARRAY_TYPE != Float32Array) {\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[5] = 0;\n    out[6] = 0;\n    out[7] = 0;\n  }\n\n  out[0] = 1;\n  out[4] = 1;\n  out[8] = 1;\n  return out;\n}\n/**\n * Copies the upper-left 3x3 values into the given mat3.\n *\n * @param {mat3} out the receiving 3x3 matrix\n * @param {ReadonlyMat4} a   the source 4x4 matrix\n * @returns {mat3} out\n */\n\n\nfunction fromMat4(out, a) {\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[4];\n  out[4] = a[5];\n  out[5] = a[6];\n  out[6] = a[8];\n  out[7] = a[9];\n  out[8] = a[10];\n  return out;\n}\n/**\n * Creates a new mat3 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat3} a matrix to clone\n * @returns {mat3} a new 3x3 matrix\n */\n\n\nfunction clone(a) {\n  var out = new glMatrix.ARRAY_TYPE(9);\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[3];\n  out[4] = a[4];\n  out[5] = a[5];\n  out[6] = a[6];\n  out[7] = a[7];\n  out[8] = a[8];\n  return out;\n}\n/**\n * Copy the values from one mat3 to another\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\n\nfunction copy(out, a) {\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[3];\n  out[4] = a[4];\n  out[5] = a[5];\n  out[6] = a[6];\n  out[7] = a[7];\n  out[8] = a[8];\n  return out;\n}\n/**\n * Create a new mat3 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} A new mat3\n */\n\n\nfunction fromValues(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n  var out = new glMatrix.ARRAY_TYPE(9);\n  out[0] = m00;\n  out[1] = m01;\n  out[2] = m02;\n  out[3] = m10;\n  out[4] = m11;\n  out[5] = m12;\n  out[6] = m20;\n  out[7] = m21;\n  out[8] = m22;\n  return out;\n}\n/**\n * Set the components of a mat3 to the given values\n *\n * @param {mat3} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} out\n */\n\n\nfunction set(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n  out[0] = m00;\n  out[1] = m01;\n  out[2] = m02;\n  out[3] = m10;\n  out[4] = m11;\n  out[5] = m12;\n  out[6] = m20;\n  out[7] = m21;\n  out[8] = m22;\n  return out;\n}\n/**\n * Set a mat3 to the identity matrix\n *\n * @param {mat3} out the receiving matrix\n * @returns {mat3} out\n */\n\n\nfunction identity(out) {\n  out[0] = 1;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 1;\n  out[5] = 0;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 1;\n  return out;\n}\n/**\n * Transpose the values of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\n\nfunction transpose(out, a) {\n  // If we are transposing ourselves we can skip a few steps but have to cache some values\n  if (out === a) {\n    var a01 = a[1],\n        a02 = a[2],\n        a12 = a[5];\n    out[1] = a[3];\n    out[2] = a[6];\n    out[3] = a01;\n    out[5] = a[7];\n    out[6] = a02;\n    out[7] = a12;\n  } else {\n    out[0] = a[0];\n    out[1] = a[3];\n    out[2] = a[6];\n    out[3] = a[1];\n    out[4] = a[4];\n    out[5] = a[7];\n    out[6] = a[2];\n    out[7] = a[5];\n    out[8] = a[8];\n  }\n\n  return out;\n}\n/**\n * Inverts a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\n\nfunction invert(out, a) {\n  var a00 = a[0],\n      a01 = a[1],\n      a02 = a[2];\n  var a10 = a[3],\n      a11 = a[4],\n      a12 = a[5];\n  var a20 = a[6],\n      a21 = a[7],\n      a22 = a[8];\n  var b01 = a22 * a11 - a12 * a21;\n  var b11 = -a22 * a10 + a12 * a20;\n  var b21 = a21 * a10 - a11 * a20; // Calculate the determinant\n\n  var det = a00 * b01 + a01 * b11 + a02 * b21;\n\n  if (!det) {\n    return null;\n  }\n\n  det = 1.0 / det;\n  out[0] = b01 * det;\n  out[1] = (-a22 * a01 + a02 * a21) * det;\n  out[2] = (a12 * a01 - a02 * a11) * det;\n  out[3] = b11 * det;\n  out[4] = (a22 * a00 - a02 * a20) * det;\n  out[5] = (-a12 * a00 + a02 * a10) * det;\n  out[6] = b21 * det;\n  out[7] = (-a21 * a00 + a01 * a20) * det;\n  out[8] = (a11 * a00 - a01 * a10) * det;\n  return out;\n}\n/**\n * Calculates the adjugate of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\n\nfunction adjoint(out, a) {\n  var a00 = a[0],\n      a01 = a[1],\n      a02 = a[2];\n  var a10 = a[3],\n      a11 = a[4],\n      a12 = a[5];\n  var a20 = a[6],\n      a21 = a[7],\n      a22 = a[8];\n  out[0] = a11 * a22 - a12 * a21;\n  out[1] = a02 * a21 - a01 * a22;\n  out[2] = a01 * a12 - a02 * a11;\n  out[3] = a12 * a20 - a10 * a22;\n  out[4] = a00 * a22 - a02 * a20;\n  out[5] = a02 * a10 - a00 * a12;\n  out[6] = a10 * a21 - a11 * a20;\n  out[7] = a01 * a20 - a00 * a21;\n  out[8] = a00 * a11 - a01 * a10;\n  return out;\n}\n/**\n * Calculates the determinant of a mat3\n *\n * @param {ReadonlyMat3} a the source matrix\n * @returns {Number} determinant of a\n */\n\n\nfunction determinant(a) {\n  var a00 = a[0],\n      a01 = a[1],\n      a02 = a[2];\n  var a10 = a[3],\n      a11 = a[4],\n      a12 = a[5];\n  var a20 = a[6],\n      a21 = a[7],\n      a22 = a[8];\n  return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);\n}\n/**\n * Multiplies two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\n\nfunction multiply(out, a, b) {\n  var a00 = a[0],\n      a01 = a[1],\n      a02 = a[2];\n  var a10 = a[3],\n      a11 = a[4],\n      a12 = a[5];\n  var a20 = a[6],\n      a21 = a[7],\n      a22 = a[8];\n  var b00 = b[0],\n      b01 = b[1],\n      b02 = b[2];\n  var b10 = b[3],\n      b11 = b[4],\n      b12 = b[5];\n  var b20 = b[6],\n      b21 = b[7],\n      b22 = b[8];\n  out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n  out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n  out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n  out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n  out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n  out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n  out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n  out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n  out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n  return out;\n}\n/**\n * Translate a mat3 by the given vector\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to translate\n * @param {ReadonlyVec2} v vector to translate by\n * @returns {mat3} out\n */\n\n\nfunction translate(out, a, v) {\n  var a00 = a[0],\n      a01 = a[1],\n      a02 = a[2],\n      a10 = a[3],\n      a11 = a[4],\n      a12 = a[5],\n      a20 = a[6],\n      a21 = a[7],\n      a22 = a[8],\n      x = v[0],\n      y = v[1];\n  out[0] = a00;\n  out[1] = a01;\n  out[2] = a02;\n  out[3] = a10;\n  out[4] = a11;\n  out[5] = a12;\n  out[6] = x * a00 + y * a10 + a20;\n  out[7] = x * a01 + y * a11 + a21;\n  out[8] = x * a02 + y * a12 + a22;\n  return out;\n}\n/**\n * Rotates a mat3 by the given angle\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\n\n\nfunction rotate(out, a, rad) {\n  var a00 = a[0],\n      a01 = a[1],\n      a02 = a[2],\n      a10 = a[3],\n      a11 = a[4],\n      a12 = a[5],\n      a20 = a[6],\n      a21 = a[7],\n      a22 = a[8],\n      s = Math.sin(rad),\n      c = Math.cos(rad);\n  out[0] = c * a00 + s * a10;\n  out[1] = c * a01 + s * a11;\n  out[2] = c * a02 + s * a12;\n  out[3] = c * a10 - s * a00;\n  out[4] = c * a11 - s * a01;\n  out[5] = c * a12 - s * a02;\n  out[6] = a20;\n  out[7] = a21;\n  out[8] = a22;\n  return out;\n}\n/**\n * Scales the mat3 by the dimensions in the given vec2\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {ReadonlyVec2} v the vec2 to scale the matrix by\n * @returns {mat3} out\n **/\n\n\nfunction scale(out, a, v) {\n  var x = v[0],\n      y = v[1];\n  out[0] = x * a[0];\n  out[1] = x * a[1];\n  out[2] = x * a[2];\n  out[3] = y * a[3];\n  out[4] = y * a[4];\n  out[5] = y * a[5];\n  out[6] = a[6];\n  out[7] = a[7];\n  out[8] = a[8];\n  return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat3.identity(dest);\n *     mat3.translate(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Translation vector\n * @returns {mat3} out\n */\n\n\nfunction fromTranslation(out, v) {\n  out[0] = 1;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 1;\n  out[5] = 0;\n  out[6] = v[0];\n  out[7] = v[1];\n  out[8] = 1;\n  return out;\n}\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n *     mat3.identity(dest);\n *     mat3.rotate(dest, dest, rad);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\n\n\nfunction fromRotation(out, rad) {\n  var s = Math.sin(rad),\n      c = Math.cos(rad);\n  out[0] = c;\n  out[1] = s;\n  out[2] = 0;\n  out[3] = -s;\n  out[4] = c;\n  out[5] = 0;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 1;\n  return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n *     mat3.identity(dest);\n *     mat3.scale(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Scaling vector\n * @returns {mat3} out\n */\n\n\nfunction fromScaling(out, v) {\n  out[0] = v[0];\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = v[1];\n  out[5] = 0;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 1;\n  return out;\n}\n/**\n * Copies the values from a mat2d into a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat2d} a the matrix to copy\n * @returns {mat3} out\n **/\n\n\nfunction fromMat2d(out, a) {\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = 0;\n  out[3] = a[2];\n  out[4] = a[3];\n  out[5] = 0;\n  out[6] = a[4];\n  out[7] = a[5];\n  out[8] = 1;\n  return out;\n}\n/**\n * Calculates a 3x3 matrix from the given quaternion\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat3} out\n */\n\n\nfunction fromQuat(out, q) {\n  var x = q[0],\n      y = q[1],\n      z = q[2],\n      w = q[3];\n  var x2 = x + x;\n  var y2 = y + y;\n  var z2 = z + z;\n  var xx = x * x2;\n  var yx = y * x2;\n  var yy = y * y2;\n  var zx = z * x2;\n  var zy = z * y2;\n  var zz = z * z2;\n  var wx = w * x2;\n  var wy = w * y2;\n  var wz = w * z2;\n  out[0] = 1 - yy - zz;\n  out[3] = yx - wz;\n  out[6] = zx + wy;\n  out[1] = yx + wz;\n  out[4] = 1 - xx - zz;\n  out[7] = zy - wx;\n  out[2] = zx - wy;\n  out[5] = zy + wx;\n  out[8] = 1 - xx - yy;\n  return out;\n}\n/**\n * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyMat4} a Mat4 to derive the normal matrix from\n *\n * @returns {mat3} out\n */\n\n\nfunction normalFromMat4(out, a) {\n  var a00 = a[0],\n      a01 = a[1],\n      a02 = a[2],\n      a03 = a[3];\n  var a10 = a[4],\n      a11 = a[5],\n      a12 = a[6],\n      a13 = a[7];\n  var a20 = a[8],\n      a21 = a[9],\n      a22 = a[10],\n      a23 = a[11];\n  var a30 = a[12],\n      a31 = a[13],\n      a32 = a[14],\n      a33 = a[15];\n  var b00 = a00 * a11 - a01 * a10;\n  var b01 = a00 * a12 - a02 * a10;\n  var b02 = a00 * a13 - a03 * a10;\n  var b03 = a01 * a12 - a02 * a11;\n  var b04 = a01 * a13 - a03 * a11;\n  var b05 = a02 * a13 - a03 * a12;\n  var b06 = a20 * a31 - a21 * a30;\n  var b07 = a20 * a32 - a22 * a30;\n  var b08 = a20 * a33 - a23 * a30;\n  var b09 = a21 * a32 - a22 * a31;\n  var b10 = a21 * a33 - a23 * a31;\n  var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n  var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n  if (!det) {\n    return null;\n  }\n\n  det = 1.0 / det;\n  out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n  out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n  out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n  out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n  out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n  out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n  out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n  out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n  out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n  return out;\n}\n/**\n * Generates a 2D projection matrix with the given bounds\n *\n * @param {mat3} out mat3 frustum matrix will be written into\n * @param {number} width Width of your gl context\n * @param {number} height Height of gl context\n * @returns {mat3} out\n */\n\n\nfunction projection(out, width, height) {\n  out[0] = 2 / width;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = -2 / height;\n  out[5] = 0;\n  out[6] = -1;\n  out[7] = 1;\n  out[8] = 1;\n  return out;\n}\n/**\n * Returns a string representation of a mat3\n *\n * @param {ReadonlyMat3} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\n\nfunction str(a) {\n  return \"mat3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \")\";\n}\n/**\n * Returns Frobenius norm of a mat3\n *\n * @param {ReadonlyMat3} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\n\nfunction frob(a) {\n  return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);\n}\n/**\n * Adds two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\n\nfunction add(out, a, b) {\n  out[0] = a[0] + b[0];\n  out[1] = a[1] + b[1];\n  out[2] = a[2] + b[2];\n  out[3] = a[3] + b[3];\n  out[4] = a[4] + b[4];\n  out[5] = a[5] + b[5];\n  out[6] = a[6] + b[6];\n  out[7] = a[7] + b[7];\n  out[8] = a[8] + b[8];\n  return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\n\nfunction subtract(out, a, b) {\n  out[0] = a[0] - b[0];\n  out[1] = a[1] - b[1];\n  out[2] = a[2] - b[2];\n  out[3] = a[3] - b[3];\n  out[4] = a[4] - b[4];\n  out[5] = a[5] - b[5];\n  out[6] = a[6] - b[6];\n  out[7] = a[7] - b[7];\n  out[8] = a[8] - b[8];\n  return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat3} out\n */\n\n\nfunction multiplyScalar(out, a, b) {\n  out[0] = a[0] * b;\n  out[1] = a[1] * b;\n  out[2] = a[2] * b;\n  out[3] = a[3] * b;\n  out[4] = a[4] * b;\n  out[5] = a[5] * b;\n  out[6] = a[6] * b;\n  out[7] = a[7] * b;\n  out[8] = a[8] * b;\n  return out;\n}\n/**\n * Adds two mat3's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat3} out the receiving vector\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat3} out\n */\n\n\nfunction multiplyScalarAndAdd(out, a, b, scale) {\n  out[0] = a[0] + b[0] * scale;\n  out[1] = a[1] + b[1] * scale;\n  out[2] = a[2] + b[2] * scale;\n  out[3] = a[3] + b[3] * scale;\n  out[4] = a[4] + b[4] * scale;\n  out[5] = a[5] + b[5] * scale;\n  out[6] = a[6] + b[6] * scale;\n  out[7] = a[7] + b[7] * scale;\n  out[8] = a[8] + b[8] * scale;\n  return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\n\nfunction exactEquals(a, b) {\n  return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\n\nfunction equals(a, b) {\n  var a0 = a[0],\n      a1 = a[1],\n      a2 = a[2],\n      a3 = a[3],\n      a4 = a[4],\n      a5 = a[5],\n      a6 = a[6],\n      a7 = a[7],\n      a8 = a[8];\n  var b0 = b[0],\n      b1 = b[1],\n      b2 = b[2],\n      b3 = b[3],\n      b4 = b[4],\n      b5 = b[5],\n      b6 = b[6],\n      b7 = b[7],\n      b8 = b[8];\n  return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8));\n}\n/**\n * Alias for {@link mat3.multiply}\n * @function\n */\n\n\nvar mul = multiply;\n/**\n * Alias for {@link mat3.subtract}\n * @function\n */\n\nexports.mul = mul;\nvar sub = subtract;\nexports.sub = sub;","\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.create = create;\nexports.clone = clone;\nexports.copy = copy;\nexports.fromValues = fromValues;\nexports.set = set;\nexports.identity = identity;\nexports.transpose = transpose;\nexports.invert = invert;\nexports.adjoint = adjoint;\nexports.determinant = determinant;\nexports.multiply = multiply;\nexports.translate = translate;\nexports.scale = scale;\nexports.rotate = rotate;\nexports.rotateX = rotateX;\nexports.rotateY = rotateY;\nexports.rotateZ = rotateZ;\nexports.fromTranslation = fromTranslation;\nexports.fromScaling = fromScaling;\nexports.fromRotation = fromRotation;\nexports.fromXRotation = fromXRotation;\nexports.fromYRotation = fromYRotation;\nexports.fromZRotation = fromZRotation;\nexports.fromRotationTranslation = fromRotationTranslation;\nexports.fromQuat2 = fromQuat2;\nexports.getTranslation = getTranslation;\nexports.getScaling = getScaling;\nexports.getRotation = getRotation;\nexports.fromRotationTranslationScale = fromRotationTranslationScale;\nexports.fromRotationTranslationScaleOrigin = fromRotationTranslationScaleOrigin;\nexports.fromQuat = fromQuat;\nexports.frustum = frustum;\nexports.perspectiveNO = perspectiveNO;\nexports.perspectiveZO = perspectiveZO;\nexports.perspectiveFromFieldOfView = perspectiveFromFieldOfView;\nexports.orthoNO = orthoNO;\nexports.orthoZO = orthoZO;\nexports.lookAt = lookAt;\nexports.targetTo = targetTo;\nexports.str = str;\nexports.frob = frob;\nexports.add = add;\nexports.subtract = subtract;\nexports.multiplyScalar = multiplyScalar;\nexports.multiplyScalarAndAdd = multiplyScalarAndAdd;\nexports.exactEquals = exactEquals;\nexports.equals = equals;\nexports.sub = exports.mul = exports.ortho = exports.perspective = void 0;\n\nvar glMatrix = _interopRequireWildcard(require(\"./common.js\"));\n\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== \"function\") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\n\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") { return { \"default\": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj[\"default\"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n/**\n * 4x4 Matrix<br>Format: column-major, when typed out it looks like row-major<br>The matrices are being post multiplied.\n * @module mat4\n */\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\nfunction create() {\n  var out = new glMatrix.ARRAY_TYPE(16);\n\n  if (glMatrix.ARRAY_TYPE != Float32Array) {\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n  }\n\n  out[0] = 1;\n  out[5] = 1;\n  out[10] = 1;\n  out[15] = 1;\n  return out;\n}\n/**\n * Creates a new mat4 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat4} a matrix to clone\n * @returns {mat4} a new 4x4 matrix\n */\n\n\nfunction clone(a) {\n  var out = new glMatrix.ARRAY_TYPE(16);\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[3];\n  out[4] = a[4];\n  out[5] = a[5];\n  out[6] = a[6];\n  out[7] = a[7];\n  out[8] = a[8];\n  out[9] = a[9];\n  out[10] = a[10];\n  out[11] = a[11];\n  out[12] = a[12];\n  out[13] = a[13];\n  out[14] = a[14];\n  out[15] = a[15];\n  return out;\n}\n/**\n * Copy the values from one mat4 to another\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\n\nfunction copy(out, a) {\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[3];\n  out[4] = a[4];\n  out[5] = a[5];\n  out[6] = a[6];\n  out[7] = a[7];\n  out[8] = a[8];\n  out[9] = a[9];\n  out[10] = a[10];\n  out[11] = a[11];\n  out[12] = a[12];\n  out[13] = a[13];\n  out[14] = a[14];\n  out[15] = a[15];\n  return out;\n}\n/**\n * Create a new mat4 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} A new mat4\n */\n\n\nfunction fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n  var out = new glMatrix.ARRAY_TYPE(16);\n  out[0] = m00;\n  out[1] = m01;\n  out[2] = m02;\n  out[3] = m03;\n  out[4] = m10;\n  out[5] = m11;\n  out[6] = m12;\n  out[7] = m13;\n  out[8] = m20;\n  out[9] = m21;\n  out[10] = m22;\n  out[11] = m23;\n  out[12] = m30;\n  out[13] = m31;\n  out[14] = m32;\n  out[15] = m33;\n  return out;\n}\n/**\n * Set the components of a mat4 to the given values\n *\n * @param {mat4} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} out\n */\n\n\nfunction set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n  out[0] = m00;\n  out[1] = m01;\n  out[2] = m02;\n  out[3] = m03;\n  out[4] = m10;\n  out[5] = m11;\n  out[6] = m12;\n  out[7] = m13;\n  out[8] = m20;\n  out[9] = m21;\n  out[10] = m22;\n  out[11] = m23;\n  out[12] = m30;\n  out[13] = m31;\n  out[14] = m32;\n  out[15] = m33;\n  return out;\n}\n/**\n * Set a mat4 to the identity matrix\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */\n\n\nfunction identity(out) {\n  out[0] = 1;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = 1;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[10] = 1;\n  out[11] = 0;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = 0;\n  out[15] = 1;\n  return out;\n}\n/**\n * Transpose the values of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\n\nfunction transpose(out, a) {\n  // If we are transposing ourselves we can skip a few steps but have to cache some values\n  if (out === a) {\n    var a01 = a[1],\n        a02 = a[2],\n        a03 = a[3];\n    var a12 = a[6],\n        a13 = a[7];\n    var a23 = a[11];\n    out[1] = a[4];\n    out[2] = a[8];\n    out[3] = a[12];\n    out[4] = a01;\n    out[6] = a[9];\n    out[7] = a[13];\n    out[8] = a02;\n    out[9] = a12;\n    out[11] = a[14];\n    out[12] = a03;\n    out[13] = a13;\n    out[14] = a23;\n  } else {\n    out[0] = a[0];\n    out[1] = a[4];\n    out[2] = a[8];\n    out[3] = a[12];\n    out[4] = a[1];\n    out[5] = a[5];\n    out[6] = a[9];\n    out[7] = a[13];\n    out[8] = a[2];\n    out[9] = a[6];\n    out[10] = a[10];\n    out[11] = a[14];\n    out[12] = a[3];\n    out[13] = a[7];\n    out[14] = a[11];\n    out[15] = a[15];\n  }\n\n  return out;\n}\n/**\n * Inverts a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\n\nfunction invert(out, a) {\n  var a00 = a[0],\n      a01 = a[1],\n      a02 = a[2],\n      a03 = a[3];\n  var a10 = a[4],\n      a11 = a[5],\n      a12 = a[6],\n      a13 = a[7];\n  var a20 = a[8],\n      a21 = a[9],\n      a22 = a[10],\n      a23 = a[11];\n  var a30 = a[12],\n      a31 = a[13],\n      a32 = a[14],\n      a33 = a[15];\n  var b00 = a00 * a11 - a01 * a10;\n  var b01 = a00 * a12 - a02 * a10;\n  var b02 = a00 * a13 - a03 * a10;\n  var b03 = a01 * a12 - a02 * a11;\n  var b04 = a01 * a13 - a03 * a11;\n  var b05 = a02 * a13 - a03 * a12;\n  var b06 = a20 * a31 - a21 * a30;\n  var b07 = a20 * a32 - a22 * a30;\n  var b08 = a20 * a33 - a23 * a30;\n  var b09 = a21 * a32 - a22 * a31;\n  var b10 = a21 * a33 - a23 * a31;\n  var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n  var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n  if (!det) {\n    return null;\n  }\n\n  det = 1.0 / det;\n  out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n  out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n  out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n  out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n  out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n  out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n  out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n  out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n  out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n  out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n  out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n  out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n  out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n  out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n  out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n  out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n  return out;\n}\n/**\n * Calculates the adjugate of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\n\nfunction adjoint(out, a) {\n  var a00 = a[0],\n      a01 = a[1],\n      a02 = a[2],\n      a03 = a[3];\n  var a10 = a[4],\n      a11 = a[5],\n      a12 = a[6],\n      a13 = a[7];\n  var a20 = a[8],\n      a21 = a[9],\n      a22 = a[10],\n      a23 = a[11];\n  var a30 = a[12],\n      a31 = a[13],\n      a32 = a[14],\n      a33 = a[15];\n  out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);\n  out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n  out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);\n  out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n  out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n  out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);\n  out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n  out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);\n  out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);\n  out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n  out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);\n  out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n  out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n  out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);\n  out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n  out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);\n  return out;\n}\n/**\n * Calculates the determinant of a mat4\n *\n * @param {ReadonlyMat4} a the source matrix\n * @returns {Number} determinant of a\n */\n\n\nfunction determinant(a) {\n  var a00 = a[0],\n      a01 = a[1],\n      a02 = a[2],\n      a03 = a[3];\n  var a10 = a[4],\n      a11 = a[5],\n      a12 = a[6],\n      a13 = a[7];\n  var a20 = a[8],\n      a21 = a[9],\n      a22 = a[10],\n      a23 = a[11];\n  var a30 = a[12],\n      a31 = a[13],\n      a32 = a[14],\n      a33 = a[15];\n  var b00 = a00 * a11 - a01 * a10;\n  var b01 = a00 * a12 - a02 * a10;\n  var b02 = a00 * a13 - a03 * a10;\n  var b03 = a01 * a12 - a02 * a11;\n  var b04 = a01 * a13 - a03 * a11;\n  var b05 = a02 * a13 - a03 * a12;\n  var b06 = a20 * a31 - a21 * a30;\n  var b07 = a20 * a32 - a22 * a30;\n  var b08 = a20 * a33 - a23 * a30;\n  var b09 = a21 * a32 - a22 * a31;\n  var b10 = a21 * a33 - a23 * a31;\n  var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n  return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n/**\n * Multiplies two mat4s\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\n\nfunction multiply(out, a, b) {\n  var a00 = a[0],\n      a01 = a[1],\n      a02 = a[2],\n      a03 = a[3];\n  var a10 = a[4],\n      a11 = a[5],\n      a12 = a[6],\n      a13 = a[7];\n  var a20 = a[8],\n      a21 = a[9],\n      a22 = a[10],\n      a23 = a[11];\n  var a30 = a[12],\n      a31 = a[13],\n      a32 = a[14],\n      a33 = a[15]; // Cache only the current line of the second matrix\n\n  var b0 = b[0],\n      b1 = b[1],\n      b2 = b[2],\n      b3 = b[3];\n  out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n  out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n  out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n  out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n  b0 = b[4];\n  b1 = b[5];\n  b2 = b[6];\n  b3 = b[7];\n  out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n  out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n  out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n  out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n  b0 = b[8];\n  b1 = b[9];\n  b2 = b[10];\n  b3 = b[11];\n  out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n  out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n  out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n  out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n  b0 = b[12];\n  b1 = b[13];\n  b2 = b[14];\n  b3 = b[15];\n  out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n  out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n  out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n  out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n  return out;\n}\n/**\n * Translate a mat4 by the given vector\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to translate\n * @param {ReadonlyVec3} v vector to translate by\n * @returns {mat4} out\n */\n\n\nfunction translate(out, a, v) {\n  var x = v[0],\n      y = v[1],\n      z = v[2];\n  var a00, a01, a02, a03;\n  var a10, a11, a12, a13;\n  var a20, a21, a22, a23;\n\n  if (a === out) {\n    out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n    out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n    out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n    out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n  } else {\n    a00 = a[0];\n    a01 = a[1];\n    a02 = a[2];\n    a03 = a[3];\n    a10 = a[4];\n    a11 = a[5];\n    a12 = a[6];\n    a13 = a[7];\n    a20 = a[8];\n    a21 = a[9];\n    a22 = a[10];\n    a23 = a[11];\n    out[0] = a00;\n    out[1] = a01;\n    out[2] = a02;\n    out[3] = a03;\n    out[4] = a10;\n    out[5] = a11;\n    out[6] = a12;\n    out[7] = a13;\n    out[8] = a20;\n    out[9] = a21;\n    out[10] = a22;\n    out[11] = a23;\n    out[12] = a00 * x + a10 * y + a20 * z + a[12];\n    out[13] = a01 * x + a11 * y + a21 * z + a[13];\n    out[14] = a02 * x + a12 * y + a22 * z + a[14];\n    out[15] = a03 * x + a13 * y + a23 * z + a[15];\n  }\n\n  return out;\n}\n/**\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {ReadonlyVec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\n\n\nfunction scale(out, a, v) {\n  var x = v[0],\n      y = v[1],\n      z = v[2];\n  out[0] = a[0] * x;\n  out[1] = a[1] * x;\n  out[2] = a[2] * x;\n  out[3] = a[3] * x;\n  out[4] = a[4] * y;\n  out[5] = a[5] * y;\n  out[6] = a[6] * y;\n  out[7] = a[7] * y;\n  out[8] = a[8] * z;\n  out[9] = a[9] * z;\n  out[10] = a[10] * z;\n  out[11] = a[11] * z;\n  out[12] = a[12];\n  out[13] = a[13];\n  out[14] = a[14];\n  out[15] = a[15];\n  return out;\n}\n/**\n * Rotates a mat4 by the given angle around the given axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\n\n\nfunction rotate(out, a, rad, axis) {\n  var x = axis[0],\n      y = axis[1],\n      z = axis[2];\n  var len = Math.hypot(x, y, z);\n  var s, c, t;\n  var a00, a01, a02, a03;\n  var a10, a11, a12, a13;\n  var a20, a21, a22, a23;\n  var b00, b01, b02;\n  var b10, b11, b12;\n  var b20, b21, b22;\n\n  if (len < glMatrix.EPSILON) {\n    return null;\n  }\n\n  len = 1 / len;\n  x *= len;\n  y *= len;\n  z *= len;\n  s = Math.sin(rad);\n  c = Math.cos(rad);\n  t = 1 - c;\n  a00 = a[0];\n  a01 = a[1];\n  a02 = a[2];\n  a03 = a[3];\n  a10 = a[4];\n  a11 = a[5];\n  a12 = a[6];\n  a13 = a[7];\n  a20 = a[8];\n  a21 = a[9];\n  a22 = a[10];\n  a23 = a[11]; // Construct the elements of the rotation matrix\n\n  b00 = x * x * t + c;\n  b01 = y * x * t + z * s;\n  b02 = z * x * t - y * s;\n  b10 = x * y * t - z * s;\n  b11 = y * y * t + c;\n  b12 = z * y * t + x * s;\n  b20 = x * z * t + y * s;\n  b21 = y * z * t - x * s;\n  b22 = z * z * t + c; // Perform rotation-specific matrix multiplication\n\n  out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n  out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n  out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n  out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n  out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n  out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n  out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n  out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n  out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n  out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n  out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n  out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n  if (a !== out) {\n    // If the source and destination differ, copy the unchanged last row\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n  }\n\n  return out;\n}\n/**\n * Rotates a matrix by the given angle around the X axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\n\nfunction rotateX(out, a, rad) {\n  var s = Math.sin(rad);\n  var c = Math.cos(rad);\n  var a10 = a[4];\n  var a11 = a[5];\n  var a12 = a[6];\n  var a13 = a[7];\n  var a20 = a[8];\n  var a21 = a[9];\n  var a22 = a[10];\n  var a23 = a[11];\n\n  if (a !== out) {\n    // If the source and destination differ, copy the unchanged rows\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n  } // Perform axis-specific matrix multiplication\n\n\n  out[4] = a10 * c + a20 * s;\n  out[5] = a11 * c + a21 * s;\n  out[6] = a12 * c + a22 * s;\n  out[7] = a13 * c + a23 * s;\n  out[8] = a20 * c - a10 * s;\n  out[9] = a21 * c - a11 * s;\n  out[10] = a22 * c - a12 * s;\n  out[11] = a23 * c - a13 * s;\n  return out;\n}\n/**\n * Rotates a matrix by the given angle around the Y axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\n\nfunction rotateY(out, a, rad) {\n  var s = Math.sin(rad);\n  var c = Math.cos(rad);\n  var a00 = a[0];\n  var a01 = a[1];\n  var a02 = a[2];\n  var a03 = a[3];\n  var a20 = a[8];\n  var a21 = a[9];\n  var a22 = a[10];\n  var a23 = a[11];\n\n  if (a !== out) {\n    // If the source and destination differ, copy the unchanged rows\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n  } // Perform axis-specific matrix multiplication\n\n\n  out[0] = a00 * c - a20 * s;\n  out[1] = a01 * c - a21 * s;\n  out[2] = a02 * c - a22 * s;\n  out[3] = a03 * c - a23 * s;\n  out[8] = a00 * s + a20 * c;\n  out[9] = a01 * s + a21 * c;\n  out[10] = a02 * s + a22 * c;\n  out[11] = a03 * s + a23 * c;\n  return out;\n}\n/**\n * Rotates a matrix by the given angle around the Z axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\n\nfunction rotateZ(out, a, rad) {\n  var s = Math.sin(rad);\n  var c = Math.cos(rad);\n  var a00 = a[0];\n  var a01 = a[1];\n  var a02 = a[2];\n  var a03 = a[3];\n  var a10 = a[4];\n  var a11 = a[5];\n  var a12 = a[6];\n  var a13 = a[7];\n\n  if (a !== out) {\n    // If the source and destination differ, copy the unchanged last row\n    out[8] = a[8];\n    out[9] = a[9];\n    out[10] = a[10];\n    out[11] = a[11];\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n  } // Perform axis-specific matrix multiplication\n\n\n  out[0] = a00 * c + a10 * s;\n  out[1] = a01 * c + a11 * s;\n  out[2] = a02 * c + a12 * s;\n  out[3] = a03 * c + a13 * s;\n  out[4] = a10 * c - a00 * s;\n  out[5] = a11 * c - a01 * s;\n  out[6] = a12 * c - a02 * s;\n  out[7] = a13 * c - a03 * s;\n  return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\n\n\nfunction fromTranslation(out, v) {\n  out[0] = 1;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = 1;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[10] = 1;\n  out[11] = 0;\n  out[12] = v[0];\n  out[13] = v[1];\n  out[14] = v[2];\n  out[15] = 1;\n  return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.scale(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Scaling vector\n * @returns {mat4} out\n */\n\n\nfunction fromScaling(out, v) {\n  out[0] = v[0];\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = v[1];\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[10] = v[2];\n  out[11] = 0;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = 0;\n  out[15] = 1;\n  return out;\n}\n/**\n * Creates a matrix from a given angle around a given axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotate(dest, dest, rad, axis);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\n\n\nfunction fromRotation(out, rad, axis) {\n  var x = axis[0],\n      y = axis[1],\n      z = axis[2];\n  var len = Math.hypot(x, y, z);\n  var s, c, t;\n\n  if (len < glMatrix.EPSILON) {\n    return null;\n  }\n\n  len = 1 / len;\n  x *= len;\n  y *= len;\n  z *= len;\n  s = Math.sin(rad);\n  c = Math.cos(rad);\n  t = 1 - c; // Perform rotation-specific matrix multiplication\n\n  out[0] = x * x * t + c;\n  out[1] = y * x * t + z * s;\n  out[2] = z * x * t - y * s;\n  out[3] = 0;\n  out[4] = x * y * t - z * s;\n  out[5] = y * y * t + c;\n  out[6] = z * y * t + x * s;\n  out[7] = 0;\n  out[8] = x * z * t + y * s;\n  out[9] = y * z * t - x * s;\n  out[10] = z * z * t + c;\n  out[11] = 0;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = 0;\n  out[15] = 1;\n  return out;\n}\n/**\n * Creates a matrix from the given angle around the X axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotateX(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\n\nfunction fromXRotation(out, rad) {\n  var s = Math.sin(rad);\n  var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n  out[0] = 1;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = c;\n  out[6] = s;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = -s;\n  out[10] = c;\n  out[11] = 0;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = 0;\n  out[15] = 1;\n  return out;\n}\n/**\n * Creates a matrix from the given angle around the Y axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotateY(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\n\nfunction fromYRotation(out, rad) {\n  var s = Math.sin(rad);\n  var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n  out[0] = c;\n  out[1] = 0;\n  out[2] = -s;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = 1;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = s;\n  out[9] = 0;\n  out[10] = c;\n  out[11] = 0;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = 0;\n  out[15] = 1;\n  return out;\n}\n/**\n * Creates a matrix from the given angle around the Z axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotateZ(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\n\nfunction fromZRotation(out, rad) {\n  var s = Math.sin(rad);\n  var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n  out[0] = c;\n  out[1] = s;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = -s;\n  out[5] = c;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[10] = 1;\n  out[11] = 0;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = 0;\n  out[15] = 1;\n  return out;\n}\n/**\n * Creates a matrix from a quaternion rotation and vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     let quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\n\n\nfunction fromRotationTranslation(out, q, v) {\n  // Quaternion math\n  var x = q[0],\n      y = q[1],\n      z = q[2],\n      w = q[3];\n  var x2 = x + x;\n  var y2 = y + y;\n  var z2 = z + z;\n  var xx = x * x2;\n  var xy = x * y2;\n  var xz = x * z2;\n  var yy = y * y2;\n  var yz = y * z2;\n  var zz = z * z2;\n  var wx = w * x2;\n  var wy = w * y2;\n  var wz = w * z2;\n  out[0] = 1 - (yy + zz);\n  out[1] = xy + wz;\n  out[2] = xz - wy;\n  out[3] = 0;\n  out[4] = xy - wz;\n  out[5] = 1 - (xx + zz);\n  out[6] = yz + wx;\n  out[7] = 0;\n  out[8] = xz + wy;\n  out[9] = yz - wx;\n  out[10] = 1 - (xx + yy);\n  out[11] = 0;\n  out[12] = v[0];\n  out[13] = v[1];\n  out[14] = v[2];\n  out[15] = 1;\n  return out;\n}\n/**\n * Creates a new mat4 from a dual quat.\n *\n * @param {mat4} out Matrix\n * @param {ReadonlyQuat2} a Dual Quaternion\n * @returns {mat4} mat4 receiving operation result\n */\n\n\nfunction fromQuat2(out, a) {\n  var translation = new glMatrix.ARRAY_TYPE(3);\n  var bx = -a[0],\n      by = -a[1],\n      bz = -a[2],\n      bw = a[3],\n      ax = a[4],\n      ay = a[5],\n      az = a[6],\n      aw = a[7];\n  var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense\n\n  if (magnitude > 0) {\n    translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;\n    translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;\n    translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;\n  } else {\n    translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n    translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n    translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n  }\n\n  fromRotationTranslation(out, a, translation);\n  return out;\n}\n/**\n * Returns the translation vector component of a transformation\n *  matrix. If a matrix is built with fromRotationTranslation,\n *  the returned vector will be the same as the translation vector\n *  originally supplied.\n * @param  {vec3} out Vector to receive translation component\n * @param  {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\n\n\nfunction getTranslation(out, mat) {\n  out[0] = mat[12];\n  out[1] = mat[13];\n  out[2] = mat[14];\n  return out;\n}\n/**\n * Returns the scaling factor component of a transformation\n *  matrix. If a matrix is built with fromRotationTranslationScale\n *  with a normalized Quaternion paramter, the returned vector will be\n *  the same as the scaling vector\n *  originally supplied.\n * @param  {vec3} out Vector to receive scaling factor component\n * @param  {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\n\n\nfunction getScaling(out, mat) {\n  var m11 = mat[0];\n  var m12 = mat[1];\n  var m13 = mat[2];\n  var m21 = mat[4];\n  var m22 = mat[5];\n  var m23 = mat[6];\n  var m31 = mat[8];\n  var m32 = mat[9];\n  var m33 = mat[10];\n  out[0] = Math.hypot(m11, m12, m13);\n  out[1] = Math.hypot(m21, m22, m23);\n  out[2] = Math.hypot(m31, m32, m33);\n  return out;\n}\n/**\n * Returns a quaternion representing the rotational component\n *  of a transformation matrix. If a matrix is built with\n *  fromRotationTranslation, the returned quaternion will be the\n *  same as the quaternion originally supplied.\n * @param {quat} out Quaternion to receive the rotation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {quat} out\n */\n\n\nfunction getRotation(out, mat) {\n  var scaling = new glMatrix.ARRAY_TYPE(3);\n  getScaling(scaling, mat);\n  var is1 = 1 / scaling[0];\n  var is2 = 1 / scaling[1];\n  var is3 = 1 / scaling[2];\n  var sm11 = mat[0] * is1;\n  var sm12 = mat[1] * is2;\n  var sm13 = mat[2] * is3;\n  var sm21 = mat[4] * is1;\n  var sm22 = mat[5] * is2;\n  var sm23 = mat[6] * is3;\n  var sm31 = mat[8] * is1;\n  var sm32 = mat[9] * is2;\n  var sm33 = mat[10] * is3;\n  var trace = sm11 + sm22 + sm33;\n  var S = 0;\n\n  if (trace > 0) {\n    S = Math.sqrt(trace + 1.0) * 2;\n    out[3] = 0.25 * S;\n    out[0] = (sm23 - sm32) / S;\n    out[1] = (sm31 - sm13) / S;\n    out[2] = (sm12 - sm21) / S;\n  } else if (sm11 > sm22 && sm11 > sm33) {\n    S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n    out[3] = (sm23 - sm32) / S;\n    out[0] = 0.25 * S;\n    out[1] = (sm12 + sm21) / S;\n    out[2] = (sm31 + sm13) / S;\n  } else if (sm22 > sm33) {\n    S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n    out[3] = (sm31 - sm13) / S;\n    out[0] = (sm12 + sm21) / S;\n    out[1] = 0.25 * S;\n    out[2] = (sm23 + sm32) / S;\n  } else {\n    S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n    out[3] = (sm12 - sm21) / S;\n    out[0] = (sm31 + sm13) / S;\n    out[1] = (sm23 + sm32) / S;\n    out[2] = 0.25 * S;\n  }\n\n  return out;\n}\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     let quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *     mat4.scale(dest, scale)\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @returns {mat4} out\n */\n\n\nfunction fromRotationTranslationScale(out, q, v, s) {\n  // Quaternion math\n  var x = q[0],\n      y = q[1],\n      z = q[2],\n      w = q[3];\n  var x2 = x + x;\n  var y2 = y + y;\n  var z2 = z + z;\n  var xx = x * x2;\n  var xy = x * y2;\n  var xz = x * z2;\n  var yy = y * y2;\n  var yz = y * z2;\n  var zz = z * z2;\n  var wx = w * x2;\n  var wy = w * y2;\n  var wz = w * z2;\n  var sx = s[0];\n  var sy = s[1];\n  var sz = s[2];\n  out[0] = (1 - (yy + zz)) * sx;\n  out[1] = (xy + wz) * sx;\n  out[2] = (xz - wy) * sx;\n  out[3] = 0;\n  out[4] = (xy - wz) * sy;\n  out[5] = (1 - (xx + zz)) * sy;\n  out[6] = (yz + wx) * sy;\n  out[7] = 0;\n  out[8] = (xz + wy) * sz;\n  out[9] = (yz - wx) * sz;\n  out[10] = (1 - (xx + yy)) * sz;\n  out[11] = 0;\n  out[12] = v[0];\n  out[13] = v[1];\n  out[14] = v[2];\n  out[15] = 1;\n  return out;\n}\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     mat4.translate(dest, origin);\n *     let quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *     mat4.scale(dest, scale)\n *     mat4.translate(dest, negativeOrigin);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\n * @returns {mat4} out\n */\n\n\nfunction fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n  // Quaternion math\n  var x = q[0],\n      y = q[1],\n      z = q[2],\n      w = q[3];\n  var x2 = x + x;\n  var y2 = y + y;\n  var z2 = z + z;\n  var xx = x * x2;\n  var xy = x * y2;\n  var xz = x * z2;\n  var yy = y * y2;\n  var yz = y * z2;\n  var zz = z * z2;\n  var wx = w * x2;\n  var wy = w * y2;\n  var wz = w * z2;\n  var sx = s[0];\n  var sy = s[1];\n  var sz = s[2];\n  var ox = o[0];\n  var oy = o[1];\n  var oz = o[2];\n  var out0 = (1 - (yy + zz)) * sx;\n  var out1 = (xy + wz) * sx;\n  var out2 = (xz - wy) * sx;\n  var out4 = (xy - wz) * sy;\n  var out5 = (1 - (xx + zz)) * sy;\n  var out6 = (yz + wx) * sy;\n  var out8 = (xz + wy) * sz;\n  var out9 = (yz - wx) * sz;\n  var out10 = (1 - (xx + yy)) * sz;\n  out[0] = out0;\n  out[1] = out1;\n  out[2] = out2;\n  out[3] = 0;\n  out[4] = out4;\n  out[5] = out5;\n  out[6] = out6;\n  out[7] = 0;\n  out[8] = out8;\n  out[9] = out9;\n  out[10] = out10;\n  out[11] = 0;\n  out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n  out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n  out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n  out[15] = 1;\n  return out;\n}\n/**\n * Calculates a 4x4 matrix from the given quaternion\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat4} out\n */\n\n\nfunction fromQuat(out, q) {\n  var x = q[0],\n      y = q[1],\n      z = q[2],\n      w = q[3];\n  var x2 = x + x;\n  var y2 = y + y;\n  var z2 = z + z;\n  var xx = x * x2;\n  var yx = y * x2;\n  var yy = y * y2;\n  var zx = z * x2;\n  var zy = z * y2;\n  var zz = z * z2;\n  var wx = w * x2;\n  var wy = w * y2;\n  var wz = w * z2;\n  out[0] = 1 - yy - zz;\n  out[1] = yx + wz;\n  out[2] = zx - wy;\n  out[3] = 0;\n  out[4] = yx - wz;\n  out[5] = 1 - xx - zz;\n  out[6] = zy + wx;\n  out[7] = 0;\n  out[8] = zx + wy;\n  out[9] = zy - wx;\n  out[10] = 1 - xx - yy;\n  out[11] = 0;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = 0;\n  out[15] = 1;\n  return out;\n}\n/**\n * Generates a frustum matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Number} left Left bound of the frustum\n * @param {Number} right Right bound of the frustum\n * @param {Number} bottom Bottom bound of the frustum\n * @param {Number} top Top bound of the frustum\n * @param {Number} near Near bound of the frustum\n * @param {Number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\n\nfunction frustum(out, left, right, bottom, top, near, far) {\n  var rl = 1 / (right - left);\n  var tb = 1 / (top - bottom);\n  var nf = 1 / (near - far);\n  out[0] = near * 2 * rl;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = near * 2 * tb;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = (right + left) * rl;\n  out[9] = (top + bottom) * tb;\n  out[10] = (far + near) * nf;\n  out[11] = -1;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = far * near * 2 * nf;\n  out[15] = 0;\n  return out;\n}\n/**\n * Generates a perspective projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\n\n\nfunction perspectiveNO(out, fovy, aspect, near, far) {\n  var f = 1.0 / Math.tan(fovy / 2),\n      nf;\n  out[0] = f / aspect;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = f;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[11] = -1;\n  out[12] = 0;\n  out[13] = 0;\n  out[15] = 0;\n\n  if (far != null && far !== Infinity) {\n    nf = 1 / (near - far);\n    out[10] = (far + near) * nf;\n    out[14] = 2 * far * near * nf;\n  } else {\n    out[10] = -1;\n    out[14] = -2 * near;\n  }\n\n  return out;\n}\n/**\n * Alias for {@link mat4.perspectiveNO}\n * @function\n */\n\n\nvar perspective = perspectiveNO;\n/**\n * Generates a perspective projection matrix suitable for WebGPU with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\n\nexports.perspective = perspective;\n\nfunction perspectiveZO(out, fovy, aspect, near, far) {\n  var f = 1.0 / Math.tan(fovy / 2),\n      nf;\n  out[0] = f / aspect;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = f;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[11] = -1;\n  out[12] = 0;\n  out[13] = 0;\n  out[15] = 0;\n\n  if (far != null && far !== Infinity) {\n    nf = 1 / (near - far);\n    out[10] = far * nf;\n    out[14] = far * near * nf;\n  } else {\n    out[10] = -1;\n    out[14] = -near;\n  }\n\n  return out;\n}\n/**\n * Generates a perspective projection matrix with the given field of view.\n * This is primarily useful for generating projection matrices to be used\n * with the still experiemental WebVR API.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\n\nfunction perspectiveFromFieldOfView(out, fov, near, far) {\n  var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);\n  var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);\n  var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);\n  var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);\n  var xScale = 2.0 / (leftTan + rightTan);\n  var yScale = 2.0 / (upTan + downTan);\n  out[0] = xScale;\n  out[1] = 0.0;\n  out[2] = 0.0;\n  out[3] = 0.0;\n  out[4] = 0.0;\n  out[5] = yScale;\n  out[6] = 0.0;\n  out[7] = 0.0;\n  out[8] = -((leftTan - rightTan) * xScale * 0.5);\n  out[9] = (upTan - downTan) * yScale * 0.5;\n  out[10] = far / (near - far);\n  out[11] = -1.0;\n  out[12] = 0.0;\n  out[13] = 0.0;\n  out[14] = far * near / (near - far);\n  out[15] = 0.0;\n  return out;\n}\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\n\nfunction orthoNO(out, left, right, bottom, top, near, far) {\n  var lr = 1 / (left - right);\n  var bt = 1 / (bottom - top);\n  var nf = 1 / (near - far);\n  out[0] = -2 * lr;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = -2 * bt;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[10] = 2 * nf;\n  out[11] = 0;\n  out[12] = (left + right) * lr;\n  out[13] = (top + bottom) * bt;\n  out[14] = (far + near) * nf;\n  out[15] = 1;\n  return out;\n}\n/**\n * Alias for {@link mat4.orthoNO}\n * @function\n */\n\n\nvar ortho = orthoNO;\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexports.ortho = ortho;\n\nfunction orthoZO(out, left, right, bottom, top, near, far) {\n  var lr = 1 / (left - right);\n  var bt = 1 / (bottom - top);\n  var nf = 1 / (near - far);\n  out[0] = -2 * lr;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = -2 * bt;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[10] = nf;\n  out[11] = 0;\n  out[12] = (left + right) * lr;\n  out[13] = (top + bottom) * bt;\n  out[14] = near * nf;\n  out[15] = 1;\n  return out;\n}\n/**\n * Generates a look-at matrix with the given eye position, focal point, and up axis.\n * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\n\n\nfunction lookAt(out, eye, center, up) {\n  var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n  var eyex = eye[0];\n  var eyey = eye[1];\n  var eyez = eye[2];\n  var upx = up[0];\n  var upy = up[1];\n  var upz = up[2];\n  var centerx = center[0];\n  var centery = center[1];\n  var centerz = center[2];\n\n  if (Math.abs(eyex - centerx) < glMatrix.EPSILON && Math.abs(eyey - centery) < glMatrix.EPSILON && Math.abs(eyez - centerz) < glMatrix.EPSILON) {\n    return identity(out);\n  }\n\n  z0 = eyex - centerx;\n  z1 = eyey - centery;\n  z2 = eyez - centerz;\n  len = 1 / Math.hypot(z0, z1, z2);\n  z0 *= len;\n  z1 *= len;\n  z2 *= len;\n  x0 = upy * z2 - upz * z1;\n  x1 = upz * z0 - upx * z2;\n  x2 = upx * z1 - upy * z0;\n  len = Math.hypot(x0, x1, x2);\n\n  if (!len) {\n    x0 = 0;\n    x1 = 0;\n    x2 = 0;\n  } else {\n    len = 1 / len;\n    x0 *= len;\n    x1 *= len;\n    x2 *= len;\n  }\n\n  y0 = z1 * x2 - z2 * x1;\n  y1 = z2 * x0 - z0 * x2;\n  y2 = z0 * x1 - z1 * x0;\n  len = Math.hypot(y0, y1, y2);\n\n  if (!len) {\n    y0 = 0;\n    y1 = 0;\n    y2 = 0;\n  } else {\n    len = 1 / len;\n    y0 *= len;\n    y1 *= len;\n    y2 *= len;\n  }\n\n  out[0] = x0;\n  out[1] = y0;\n  out[2] = z0;\n  out[3] = 0;\n  out[4] = x1;\n  out[5] = y1;\n  out[6] = z1;\n  out[7] = 0;\n  out[8] = x2;\n  out[9] = y2;\n  out[10] = z2;\n  out[11] = 0;\n  out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n  out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n  out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n  out[15] = 1;\n  return out;\n}\n/**\n * Generates a matrix that makes something look at something else.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\n\n\nfunction targetTo(out, eye, target, up) {\n  var eyex = eye[0],\n      eyey = eye[1],\n      eyez = eye[2],\n      upx = up[0],\n      upy = up[1],\n      upz = up[2];\n  var z0 = eyex - target[0],\n      z1 = eyey - target[1],\n      z2 = eyez - target[2];\n  var len = z0 * z0 + z1 * z1 + z2 * z2;\n\n  if (len > 0) {\n    len = 1 / Math.sqrt(len);\n    z0 *= len;\n    z1 *= len;\n    z2 *= len;\n  }\n\n  var x0 = upy * z2 - upz * z1,\n      x1 = upz * z0 - upx * z2,\n      x2 = upx * z1 - upy * z0;\n  len = x0 * x0 + x1 * x1 + x2 * x2;\n\n  if (len > 0) {\n    len = 1 / Math.sqrt(len);\n    x0 *= len;\n    x1 *= len;\n    x2 *= len;\n  }\n\n  out[0] = x0;\n  out[1] = x1;\n  out[2] = x2;\n  out[3] = 0;\n  out[4] = z1 * x2 - z2 * x1;\n  out[5] = z2 * x0 - z0 * x2;\n  out[6] = z0 * x1 - z1 * x0;\n  out[7] = 0;\n  out[8] = z0;\n  out[9] = z1;\n  out[10] = z2;\n  out[11] = 0;\n  out[12] = eyex;\n  out[13] = eyey;\n  out[14] = eyez;\n  out[15] = 1;\n  return out;\n}\n/**\n * Returns a string representation of a mat4\n *\n * @param {ReadonlyMat4} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\n\nfunction str(a) {\n  return \"mat4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \", \" + a[9] + \", \" + a[10] + \", \" + a[11] + \", \" + a[12] + \", \" + a[13] + \", \" + a[14] + \", \" + a[15] + \")\";\n}\n/**\n * Returns Frobenius norm of a mat4\n *\n * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\n\nfunction frob(a) {\n  return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);\n}\n/**\n * Adds two mat4's\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\n\nfunction add(out, a, b) {\n  out[0] = a[0] + b[0];\n  out[1] = a[1] + b[1];\n  out[2] = a[2] + b[2];\n  out[3] = a[3] + b[3];\n  out[4] = a[4] + b[4];\n  out[5] = a[5] + b[5];\n  out[6] = a[6] + b[6];\n  out[7] = a[7] + b[7];\n  out[8] = a[8] + b[8];\n  out[9] = a[9] + b[9];\n  out[10] = a[10] + b[10];\n  out[11] = a[11] + b[11];\n  out[12] = a[12] + b[12];\n  out[13] = a[13] + b[13];\n  out[14] = a[14] + b[14];\n  out[15] = a[15] + b[15];\n  return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\n\nfunction subtract(out, a, b) {\n  out[0] = a[0] - b[0];\n  out[1] = a[1] - b[1];\n  out[2] = a[2] - b[2];\n  out[3] = a[3] - b[3];\n  out[4] = a[4] - b[4];\n  out[5] = a[5] - b[5];\n  out[6] = a[6] - b[6];\n  out[7] = a[7] - b[7];\n  out[8] = a[8] - b[8];\n  out[9] = a[9] - b[9];\n  out[10] = a[10] - b[10];\n  out[11] = a[11] - b[11];\n  out[12] = a[12] - b[12];\n  out[13] = a[13] - b[13];\n  out[14] = a[14] - b[14];\n  out[15] = a[15] - b[15];\n  return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat4} out\n */\n\n\nfunction multiplyScalar(out, a, b) {\n  out[0] = a[0] * b;\n  out[1] = a[1] * b;\n  out[2] = a[2] * b;\n  out[3] = a[3] * b;\n  out[4] = a[4] * b;\n  out[5] = a[5] * b;\n  out[6] = a[6] * b;\n  out[7] = a[7] * b;\n  out[8] = a[8] * b;\n  out[9] = a[9] * b;\n  out[10] = a[10] * b;\n  out[11] = a[11] * b;\n  out[12] = a[12] * b;\n  out[13] = a[13] * b;\n  out[14] = a[14] * b;\n  out[15] = a[15] * b;\n  return out;\n}\n/**\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat4} out the receiving vector\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat4} out\n */\n\n\nfunction multiplyScalarAndAdd(out, a, b, scale) {\n  out[0] = a[0] + b[0] * scale;\n  out[1] = a[1] + b[1] * scale;\n  out[2] = a[2] + b[2] * scale;\n  out[3] = a[3] + b[3] * scale;\n  out[4] = a[4] + b[4] * scale;\n  out[5] = a[5] + b[5] * scale;\n  out[6] = a[6] + b[6] * scale;\n  out[7] = a[7] + b[7] * scale;\n  out[8] = a[8] + b[8] * scale;\n  out[9] = a[9] + b[9] * scale;\n  out[10] = a[10] + b[10] * scale;\n  out[11] = a[11] + b[11] * scale;\n  out[12] = a[12] + b[12] * scale;\n  out[13] = a[13] + b[13] * scale;\n  out[14] = a[14] + b[14] * scale;\n  out[15] = a[15] + b[15] * scale;\n  return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\n\nfunction exactEquals(a, b) {\n  return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\n\nfunction equals(a, b) {\n  var a0 = a[0],\n      a1 = a[1],\n      a2 = a[2],\n      a3 = a[3];\n  var a4 = a[4],\n      a5 = a[5],\n      a6 = a[6],\n      a7 = a[7];\n  var a8 = a[8],\n      a9 = a[9],\n      a10 = a[10],\n      a11 = a[11];\n  var a12 = a[12],\n      a13 = a[13],\n      a14 = a[14],\n      a15 = a[15];\n  var b0 = b[0],\n      b1 = b[1],\n      b2 = b[2],\n      b3 = b[3];\n  var b4 = b[4],\n      b5 = b[5],\n      b6 = b[6],\n      b7 = b[7];\n  var b8 = b[8],\n      b9 = b[9],\n      b10 = b[10],\n      b11 = b[11];\n  var b12 = b[12],\n      b13 = b[13],\n      b14 = b[14],\n      b15 = b[15];\n  return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15));\n}\n/**\n * Alias for {@link mat4.multiply}\n * @function\n */\n\n\nvar mul = multiply;\n/**\n * Alias for {@link mat4.subtract}\n * @function\n */\n\nexports.mul = mul;\nvar sub = subtract;\nexports.sub = sub;","\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.create = create;\nexports.clone = clone;\nexports.length = length;\nexports.fromValues = fromValues;\nexports.copy = copy;\nexports.set = set;\nexports.add = add;\nexports.subtract = subtract;\nexports.multiply = multiply;\nexports.divide = divide;\nexports.ceil = ceil;\nexports.floor = floor;\nexports.min = min;\nexports.max = max;\nexports.round = round;\nexports.scale = scale;\nexports.scaleAndAdd = scaleAndAdd;\nexports.distance = distance;\nexports.squaredDistance = squaredDistance;\nexports.squaredLength = squaredLength;\nexports.negate = negate;\nexports.inverse = inverse;\nexports.normalize = normalize;\nexports.dot = dot;\nexports.cross = cross;\nexports.lerp = lerp;\nexports.hermite = hermite;\nexports.bezier = bezier;\nexports.random = random;\nexports.transformMat4 = transformMat4;\nexports.transformMat3 = transformMat3;\nexports.transformQuat = transformQuat;\nexports.rotateX = rotateX;\nexports.rotateY = rotateY;\nexports.rotateZ = rotateZ;\nexports.angle = angle;\nexports.zero = zero;\nexports.str = str;\nexports.exactEquals = exactEquals;\nexports.equals = equals;\nexports.forEach = exports.sqrLen = exports.len = exports.sqrDist = exports.dist = exports.div = exports.mul = exports.sub = void 0;\n\nvar glMatrix = _interopRequireWildcard(require(\"./common.js\"));\n\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== \"function\") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\n\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") { return { \"default\": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj[\"default\"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n/**\n * 3 Dimensional Vector\n * @module vec3\n */\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\nfunction create() {\n  var out = new glMatrix.ARRAY_TYPE(3);\n\n  if (glMatrix.ARRAY_TYPE != Float32Array) {\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n  }\n\n  return out;\n}\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {ReadonlyVec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */\n\n\nfunction clone(a) {\n  var out = new glMatrix.ARRAY_TYPE(3);\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  return out;\n}\n/**\n * Calculates the length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate length of\n * @returns {Number} length of a\n */\n\n\nfunction length(a) {\n  var x = a[0];\n  var y = a[1];\n  var z = a[2];\n  return Math.hypot(x, y, z);\n}\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */\n\n\nfunction fromValues(x, y, z) {\n  var out = new glMatrix.ARRAY_TYPE(3);\n  out[0] = x;\n  out[1] = y;\n  out[2] = z;\n  return out;\n}\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the source vector\n * @returns {vec3} out\n */\n\n\nfunction copy(out, a) {\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  return out;\n}\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\n\n\nfunction set(out, x, y, z) {\n  out[0] = x;\n  out[1] = y;\n  out[2] = z;\n  return out;\n}\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\n\nfunction add(out, a, b) {\n  out[0] = a[0] + b[0];\n  out[1] = a[1] + b[1];\n  out[2] = a[2] + b[2];\n  return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\n\nfunction subtract(out, a, b) {\n  out[0] = a[0] - b[0];\n  out[1] = a[1] - b[1];\n  out[2] = a[2] - b[2];\n  return out;\n}\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\n\nfunction multiply(out, a, b) {\n  out[0] = a[0] * b[0];\n  out[1] = a[1] * b[1];\n  out[2] = a[2] * b[2];\n  return out;\n}\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\n\nfunction divide(out, a, b) {\n  out[0] = a[0] / b[0];\n  out[1] = a[1] / b[1];\n  out[2] = a[2] / b[2];\n  return out;\n}\n/**\n * Math.ceil the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to ceil\n * @returns {vec3} out\n */\n\n\nfunction ceil(out, a) {\n  out[0] = Math.ceil(a[0]);\n  out[1] = Math.ceil(a[1]);\n  out[2] = Math.ceil(a[2]);\n  return out;\n}\n/**\n * Math.floor the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to floor\n * @returns {vec3} out\n */\n\n\nfunction floor(out, a) {\n  out[0] = Math.floor(a[0]);\n  out[1] = Math.floor(a[1]);\n  out[2] = Math.floor(a[2]);\n  return out;\n}\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\n\nfunction min(out, a, b) {\n  out[0] = Math.min(a[0], b[0]);\n  out[1] = Math.min(a[1], b[1]);\n  out[2] = Math.min(a[2], b[2]);\n  return out;\n}\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\n\nfunction max(out, a, b) {\n  out[0] = Math.max(a[0], b[0]);\n  out[1] = Math.max(a[1], b[1]);\n  out[2] = Math.max(a[2], b[2]);\n  return out;\n}\n/**\n * Math.round the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to round\n * @returns {vec3} out\n */\n\n\nfunction round(out, a) {\n  out[0] = Math.round(a[0]);\n  out[1] = Math.round(a[1]);\n  out[2] = Math.round(a[2]);\n  return out;\n}\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\n\n\nfunction scale(out, a, b) {\n  out[0] = a[0] * b;\n  out[1] = a[1] * b;\n  out[2] = a[2] * b;\n  return out;\n}\n/**\n * Adds two vec3's after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */\n\n\nfunction scaleAndAdd(out, a, b, scale) {\n  out[0] = a[0] + b[0] * scale;\n  out[1] = a[1] + b[1] * scale;\n  out[2] = a[2] + b[2] * scale;\n  return out;\n}\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} distance between a and b\n */\n\n\nfunction distance(a, b) {\n  var x = b[0] - a[0];\n  var y = b[1] - a[1];\n  var z = b[2] - a[2];\n  return Math.hypot(x, y, z);\n}\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\n\nfunction squaredDistance(a, b) {\n  var x = b[0] - a[0];\n  var y = b[1] - a[1];\n  var z = b[2] - a[2];\n  return x * x + y * y + z * z;\n}\n/**\n * Calculates the squared length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\n\nfunction squaredLength(a) {\n  var x = a[0];\n  var y = a[1];\n  var z = a[2];\n  return x * x + y * y + z * z;\n}\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to negate\n * @returns {vec3} out\n */\n\n\nfunction negate(out, a) {\n  out[0] = -a[0];\n  out[1] = -a[1];\n  out[2] = -a[2];\n  return out;\n}\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to invert\n * @returns {vec3} out\n */\n\n\nfunction inverse(out, a) {\n  out[0] = 1.0 / a[0];\n  out[1] = 1.0 / a[1];\n  out[2] = 1.0 / a[2];\n  return out;\n}\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to normalize\n * @returns {vec3} out\n */\n\n\nfunction normalize(out, a) {\n  var x = a[0];\n  var y = a[1];\n  var z = a[2];\n  var len = x * x + y * y + z * z;\n\n  if (len > 0) {\n    //TODO: evaluate use of glm_invsqrt here?\n    len = 1 / Math.sqrt(len);\n  }\n\n  out[0] = a[0] * len;\n  out[1] = a[1] * len;\n  out[2] = a[2] * len;\n  return out;\n}\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} dot product of a and b\n */\n\n\nfunction dot(a, b) {\n  return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\n\nfunction cross(out, a, b) {\n  var ax = a[0],\n      ay = a[1],\n      az = a[2];\n  var bx = b[0],\n      by = b[1],\n      bz = b[2];\n  out[0] = ay * bz - az * by;\n  out[1] = az * bx - ax * bz;\n  out[2] = ax * by - ay * bx;\n  return out;\n}\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\n\nfunction lerp(out, a, b, t) {\n  var ax = a[0];\n  var ay = a[1];\n  var az = a[2];\n  out[0] = ax + t * (b[0] - ax);\n  out[1] = ay + t * (b[1] - ay);\n  out[2] = az + t * (b[2] - az);\n  return out;\n}\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\n\nfunction hermite(out, a, b, c, d, t) {\n  var factorTimes2 = t * t;\n  var factor1 = factorTimes2 * (2 * t - 3) + 1;\n  var factor2 = factorTimes2 * (t - 2) + t;\n  var factor3 = factorTimes2 * (t - 1);\n  var factor4 = factorTimes2 * (3 - 2 * t);\n  out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n  out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n  out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n  return out;\n}\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\n\nfunction bezier(out, a, b, c, d, t) {\n  var inverseFactor = 1 - t;\n  var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n  var factorTimes2 = t * t;\n  var factor1 = inverseFactorTimesTwo * inverseFactor;\n  var factor2 = 3 * t * inverseFactorTimesTwo;\n  var factor3 = 3 * factorTimes2 * inverseFactor;\n  var factor4 = factorTimes2 * t;\n  out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n  out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n  out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n  return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec3} out\n */\n\n\nfunction random(out, scale) {\n  scale = scale || 1.0;\n  var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n  var z = glMatrix.RANDOM() * 2.0 - 1.0;\n  var zScale = Math.sqrt(1.0 - z * z) * scale;\n  out[0] = Math.cos(r) * zScale;\n  out[1] = Math.sin(r) * zScale;\n  out[2] = z * scale;\n  return out;\n}\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec3} out\n */\n\n\nfunction transformMat4(out, a, m) {\n  var x = a[0],\n      y = a[1],\n      z = a[2];\n  var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n  w = w || 1.0;\n  out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n  out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n  out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n  return out;\n}\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\n\n\nfunction transformMat3(out, a, m) {\n  var x = a[0],\n      y = a[1],\n      z = a[2];\n  out[0] = x * m[0] + y * m[3] + z * m[6];\n  out[1] = x * m[1] + y * m[4] + z * m[7];\n  out[2] = x * m[2] + y * m[5] + z * m[8];\n  return out;\n}\n/**\n * Transforms the vec3 with a quat\n * Can also be used for dual quaternions. (Multiply it with the real part)\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec3} out\n */\n\n\nfunction transformQuat(out, a, q) {\n  // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed\n  var qx = q[0],\n      qy = q[1],\n      qz = q[2],\n      qw = q[3];\n  var x = a[0],\n      y = a[1],\n      z = a[2]; // var qvec = [qx, qy, qz];\n  // var uv = vec3.cross([], qvec, a);\n\n  var uvx = qy * z - qz * y,\n      uvy = qz * x - qx * z,\n      uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv);\n\n  var uuvx = qy * uvz - qz * uvy,\n      uuvy = qz * uvx - qx * uvz,\n      uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w);\n\n  var w2 = qw * 2;\n  uvx *= w2;\n  uvy *= w2;\n  uvz *= w2; // vec3.scale(uuv, uuv, 2);\n\n  uuvx *= 2;\n  uuvy *= 2;\n  uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv));\n\n  out[0] = x + uvx + uuvx;\n  out[1] = y + uvy + uuvy;\n  out[2] = z + uvz + uuvz;\n  return out;\n}\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\n\nfunction rotateX(out, a, b, rad) {\n  var p = [],\n      r = []; //Translate point to the origin\n\n  p[0] = a[0] - b[0];\n  p[1] = a[1] - b[1];\n  p[2] = a[2] - b[2]; //perform rotation\n\n  r[0] = p[0];\n  r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n  r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position\n\n  out[0] = r[0] + b[0];\n  out[1] = r[1] + b[1];\n  out[2] = r[2] + b[2];\n  return out;\n}\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\n\nfunction rotateY(out, a, b, rad) {\n  var p = [],\n      r = []; //Translate point to the origin\n\n  p[0] = a[0] - b[0];\n  p[1] = a[1] - b[1];\n  p[2] = a[2] - b[2]; //perform rotation\n\n  r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n  r[1] = p[1];\n  r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position\n\n  out[0] = r[0] + b[0];\n  out[1] = r[1] + b[1];\n  out[2] = r[2] + b[2];\n  return out;\n}\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\n\nfunction rotateZ(out, a, b, rad) {\n  var p = [],\n      r = []; //Translate point to the origin\n\n  p[0] = a[0] - b[0];\n  p[1] = a[1] - b[1];\n  p[2] = a[2] - b[2]; //perform rotation\n\n  r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n  r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n  r[2] = p[2]; //translate to correct position\n\n  out[0] = r[0] + b[0];\n  out[1] = r[1] + b[1];\n  out[2] = r[2] + b[2];\n  return out;\n}\n/**\n * Get the angle between two 3D vectors\n * @param {ReadonlyVec3} a The first operand\n * @param {ReadonlyVec3} b The second operand\n * @returns {Number} The angle in radians\n */\n\n\nfunction angle(a, b) {\n  var ax = a[0],\n      ay = a[1],\n      az = a[2],\n      bx = b[0],\n      by = b[1],\n      bz = b[2],\n      mag1 = Math.sqrt(ax * ax + ay * ay + az * az),\n      mag2 = Math.sqrt(bx * bx + by * by + bz * bz),\n      mag = mag1 * mag2,\n      cosine = mag && dot(a, b) / mag;\n  return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\n * Set the components of a vec3 to zero\n *\n * @param {vec3} out the receiving vector\n * @returns {vec3} out\n */\n\n\nfunction zero(out) {\n  out[0] = 0.0;\n  out[1] = 0.0;\n  out[2] = 0.0;\n  return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec3} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\n\nfunction str(a) {\n  return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\n\nfunction exactEquals(a, b) {\n  return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\n\nfunction equals(a, b) {\n  var a0 = a[0],\n      a1 = a[1],\n      a2 = a[2];\n  var b0 = b[0],\n      b1 = b[1],\n      b2 = b[2];\n  return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\n/**\n * Alias for {@link vec3.subtract}\n * @function\n */\n\n\nvar sub = subtract;\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\n\nexports.sub = sub;\nvar mul = multiply;\n/**\n * Alias for {@link vec3.divide}\n * @function\n */\n\nexports.mul = mul;\nvar div = divide;\n/**\n * Alias for {@link vec3.distance}\n * @function\n */\n\nexports.div = div;\nvar dist = distance;\n/**\n * Alias for {@link vec3.squaredDistance}\n * @function\n */\n\nexports.dist = dist;\nvar sqrDist = squaredDistance;\n/**\n * Alias for {@link vec3.length}\n * @function\n */\n\nexports.sqrDist = sqrDist;\nvar len = length;\n/**\n * Alias for {@link vec3.squaredLength}\n * @function\n */\n\nexports.len = len;\nvar sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexports.sqrLen = sqrLen;\n\nvar forEach = function () {\n  var vec = create();\n  return function (a, stride, offset, count, fn, arg) {\n    var i, l;\n\n    if (!stride) {\n      stride = 3;\n    }\n\n    if (!offset) {\n      offset = 0;\n    }\n\n    if (count) {\n      l = Math.min(count * stride + offset, a.length);\n    } else {\n      l = a.length;\n    }\n\n    for (i = offset; i < l; i += stride) {\n      vec[0] = a[i];\n      vec[1] = a[i + 1];\n      vec[2] = a[i + 2];\n      fn(vec, vec, arg);\n      a[i] = vec[0];\n      a[i + 1] = vec[1];\n      a[i + 2] = vec[2];\n    }\n\n    return a;\n  };\n}();\n\nexports.forEach = forEach;","\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.create = create;\nexports.clone = clone;\nexports.fromValues = fromValues;\nexports.copy = copy;\nexports.set = set;\nexports.add = add;\nexports.subtract = subtract;\nexports.multiply = multiply;\nexports.divide = divide;\nexports.ceil = ceil;\nexports.floor = floor;\nexports.min = min;\nexports.max = max;\nexports.round = round;\nexports.scale = scale;\nexports.scaleAndAdd = scaleAndAdd;\nexports.distance = distance;\nexports.squaredDistance = squaredDistance;\nexports.length = length;\nexports.squaredLength = squaredLength;\nexports.negate = negate;\nexports.inverse = inverse;\nexports.normalize = normalize;\nexports.dot = dot;\nexports.cross = cross;\nexports.lerp = lerp;\nexports.random = random;\nexports.transformMat4 = transformMat4;\nexports.transformQuat = transformQuat;\nexports.zero = zero;\nexports.str = str;\nexports.exactEquals = exactEquals;\nexports.equals = equals;\nexports.forEach = exports.sqrLen = exports.len = exports.sqrDist = exports.dist = exports.div = exports.mul = exports.sub = void 0;\n\nvar glMatrix = _interopRequireWildcard(require(\"./common.js\"));\n\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== \"function\") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\n\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") { return { \"default\": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj[\"default\"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n/**\n * 4 Dimensional Vector\n * @module vec4\n */\n\n/**\n * Creates a new, empty vec4\n *\n * @returns {vec4} a new 4D vector\n */\nfunction create() {\n  var out = new glMatrix.ARRAY_TYPE(4);\n\n  if (glMatrix.ARRAY_TYPE != Float32Array) {\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n  }\n\n  return out;\n}\n/**\n * Creates a new vec4 initialized with values from an existing vector\n *\n * @param {ReadonlyVec4} a vector to clone\n * @returns {vec4} a new 4D vector\n */\n\n\nfunction clone(a) {\n  var out = new glMatrix.ARRAY_TYPE(4);\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[3];\n  return out;\n}\n/**\n * Creates a new vec4 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} a new 4D vector\n */\n\n\nfunction fromValues(x, y, z, w) {\n  var out = new glMatrix.ARRAY_TYPE(4);\n  out[0] = x;\n  out[1] = y;\n  out[2] = z;\n  out[3] = w;\n  return out;\n}\n/**\n * Copy the values from one vec4 to another\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the source vector\n * @returns {vec4} out\n */\n\n\nfunction copy(out, a) {\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[3];\n  return out;\n}\n/**\n * Set the components of a vec4 to the given values\n *\n * @param {vec4} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} out\n */\n\n\nfunction set(out, x, y, z, w) {\n  out[0] = x;\n  out[1] = y;\n  out[2] = z;\n  out[3] = w;\n  return out;\n}\n/**\n * Adds two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\n\nfunction add(out, a, b) {\n  out[0] = a[0] + b[0];\n  out[1] = a[1] + b[1];\n  out[2] = a[2] + b[2];\n  out[3] = a[3] + b[3];\n  return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\n\nfunction subtract(out, a, b) {\n  out[0] = a[0] - b[0];\n  out[1] = a[1] - b[1];\n  out[2] = a[2] - b[2];\n  out[3] = a[3] - b[3];\n  return out;\n}\n/**\n * Multiplies two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\n\nfunction multiply(out, a, b) {\n  out[0] = a[0] * b[0];\n  out[1] = a[1] * b[1];\n  out[2] = a[2] * b[2];\n  out[3] = a[3] * b[3];\n  return out;\n}\n/**\n * Divides two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\n\nfunction divide(out, a, b) {\n  out[0] = a[0] / b[0];\n  out[1] = a[1] / b[1];\n  out[2] = a[2] / b[2];\n  out[3] = a[3] / b[3];\n  return out;\n}\n/**\n * Math.ceil the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to ceil\n * @returns {vec4} out\n */\n\n\nfunction ceil(out, a) {\n  out[0] = Math.ceil(a[0]);\n  out[1] = Math.ceil(a[1]);\n  out[2] = Math.ceil(a[2]);\n  out[3] = Math.ceil(a[3]);\n  return out;\n}\n/**\n * Math.floor the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to floor\n * @returns {vec4} out\n */\n\n\nfunction floor(out, a) {\n  out[0] = Math.floor(a[0]);\n  out[1] = Math.floor(a[1]);\n  out[2] = Math.floor(a[2]);\n  out[3] = Math.floor(a[3]);\n  return out;\n}\n/**\n * Returns the minimum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\n\nfunction min(out, a, b) {\n  out[0] = Math.min(a[0], b[0]);\n  out[1] = Math.min(a[1], b[1]);\n  out[2] = Math.min(a[2], b[2]);\n  out[3] = Math.min(a[3], b[3]);\n  return out;\n}\n/**\n * Returns the maximum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\n\nfunction max(out, a, b) {\n  out[0] = Math.max(a[0], b[0]);\n  out[1] = Math.max(a[1], b[1]);\n  out[2] = Math.max(a[2], b[2]);\n  out[3] = Math.max(a[3], b[3]);\n  return out;\n}\n/**\n * Math.round the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to round\n * @returns {vec4} out\n */\n\n\nfunction round(out, a) {\n  out[0] = Math.round(a[0]);\n  out[1] = Math.round(a[1]);\n  out[2] = Math.round(a[2]);\n  out[3] = Math.round(a[3]);\n  return out;\n}\n/**\n * Scales a vec4 by a scalar number\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec4} out\n */\n\n\nfunction scale(out, a, b) {\n  out[0] = a[0] * b;\n  out[1] = a[1] * b;\n  out[2] = a[2] * b;\n  out[3] = a[3] * b;\n  return out;\n}\n/**\n * Adds two vec4's after scaling the second operand by a scalar value\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec4} out\n */\n\n\nfunction scaleAndAdd(out, a, b, scale) {\n  out[0] = a[0] + b[0] * scale;\n  out[1] = a[1] + b[1] * scale;\n  out[2] = a[2] + b[2] * scale;\n  out[3] = a[3] + b[3] * scale;\n  return out;\n}\n/**\n * Calculates the euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} distance between a and b\n */\n\n\nfunction distance(a, b) {\n  var x = b[0] - a[0];\n  var y = b[1] - a[1];\n  var z = b[2] - a[2];\n  var w = b[3] - a[3];\n  return Math.hypot(x, y, z, w);\n}\n/**\n * Calculates the squared euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\n\nfunction squaredDistance(a, b) {\n  var x = b[0] - a[0];\n  var y = b[1] - a[1];\n  var z = b[2] - a[2];\n  var w = b[3] - a[3];\n  return x * x + y * y + z * z + w * w;\n}\n/**\n * Calculates the length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate length of\n * @returns {Number} length of a\n */\n\n\nfunction length(a) {\n  var x = a[0];\n  var y = a[1];\n  var z = a[2];\n  var w = a[3];\n  return Math.hypot(x, y, z, w);\n}\n/**\n * Calculates the squared length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\n\nfunction squaredLength(a) {\n  var x = a[0];\n  var y = a[1];\n  var z = a[2];\n  var w = a[3];\n  return x * x + y * y + z * z + w * w;\n}\n/**\n * Negates the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to negate\n * @returns {vec4} out\n */\n\n\nfunction negate(out, a) {\n  out[0] = -a[0];\n  out[1] = -a[1];\n  out[2] = -a[2];\n  out[3] = -a[3];\n  return out;\n}\n/**\n * Returns the inverse of the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to invert\n * @returns {vec4} out\n */\n\n\nfunction inverse(out, a) {\n  out[0] = 1.0 / a[0];\n  out[1] = 1.0 / a[1];\n  out[2] = 1.0 / a[2];\n  out[3] = 1.0 / a[3];\n  return out;\n}\n/**\n * Normalize a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to normalize\n * @returns {vec4} out\n */\n\n\nfunction normalize(out, a) {\n  var x = a[0];\n  var y = a[1];\n  var z = a[2];\n  var w = a[3];\n  var len = x * x + y * y + z * z + w * w;\n\n  if (len > 0) {\n    len = 1 / Math.sqrt(len);\n  }\n\n  out[0] = x * len;\n  out[1] = y * len;\n  out[2] = z * len;\n  out[3] = w * len;\n  return out;\n}\n/**\n * Calculates the dot product of two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} dot product of a and b\n */\n\n\nfunction dot(a, b) {\n  return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\n/**\n * Returns the cross-product of three vectors in a 4-dimensional space\n *\n * @param {ReadonlyVec4} result the receiving vector\n * @param {ReadonlyVec4} U the first vector\n * @param {ReadonlyVec4} V the second vector\n * @param {ReadonlyVec4} W the third vector\n * @returns {vec4} result\n */\n\n\nfunction cross(out, u, v, w) {\n  var A = v[0] * w[1] - v[1] * w[0],\n      B = v[0] * w[2] - v[2] * w[0],\n      C = v[0] * w[3] - v[3] * w[0],\n      D = v[1] * w[2] - v[2] * w[1],\n      E = v[1] * w[3] - v[3] * w[1],\n      F = v[2] * w[3] - v[3] * w[2];\n  var G = u[0];\n  var H = u[1];\n  var I = u[2];\n  var J = u[3];\n  out[0] = H * F - I * E + J * D;\n  out[1] = -(G * F) + I * C - J * B;\n  out[2] = G * E - H * C + J * A;\n  out[3] = -(G * D) + H * B - I * A;\n  return out;\n}\n/**\n * Performs a linear interpolation between two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec4} out\n */\n\n\nfunction lerp(out, a, b, t) {\n  var ax = a[0];\n  var ay = a[1];\n  var az = a[2];\n  var aw = a[3];\n  out[0] = ax + t * (b[0] - ax);\n  out[1] = ay + t * (b[1] - ay);\n  out[2] = az + t * (b[2] - az);\n  out[3] = aw + t * (b[3] - aw);\n  return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec4} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec4} out\n */\n\n\nfunction random(out, scale) {\n  scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a\n  // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.\n  // http://projecteuclid.org/euclid.aoms/1177692644;\n\n  var v1, v2, v3, v4;\n  var s1, s2;\n\n  do {\n    v1 = glMatrix.RANDOM() * 2 - 1;\n    v2 = glMatrix.RANDOM() * 2 - 1;\n    s1 = v1 * v1 + v2 * v2;\n  } while (s1 >= 1);\n\n  do {\n    v3 = glMatrix.RANDOM() * 2 - 1;\n    v4 = glMatrix.RANDOM() * 2 - 1;\n    s2 = v3 * v3 + v4 * v4;\n  } while (s2 >= 1);\n\n  var d = Math.sqrt((1 - s1) / s2);\n  out[0] = scale * v1;\n  out[1] = scale * v2;\n  out[2] = scale * v3 * d;\n  out[3] = scale * v4 * d;\n  return out;\n}\n/**\n * Transforms the vec4 with a mat4.\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec4} out\n */\n\n\nfunction transformMat4(out, a, m) {\n  var x = a[0],\n      y = a[1],\n      z = a[2],\n      w = a[3];\n  out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n  out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n  out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n  out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n  return out;\n}\n/**\n * Transforms the vec4 with a quat\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec4} out\n */\n\n\nfunction transformQuat(out, a, q) {\n  var x = a[0],\n      y = a[1],\n      z = a[2];\n  var qx = q[0],\n      qy = q[1],\n      qz = q[2],\n      qw = q[3]; // calculate quat * vec\n\n  var ix = qw * x + qy * z - qz * y;\n  var iy = qw * y + qz * x - qx * z;\n  var iz = qw * z + qx * y - qy * x;\n  var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat\n\n  out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n  out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n  out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n  out[3] = a[3];\n  return out;\n}\n/**\n * Set the components of a vec4 to zero\n *\n * @param {vec4} out the receiving vector\n * @returns {vec4} out\n */\n\n\nfunction zero(out) {\n  out[0] = 0.0;\n  out[1] = 0.0;\n  out[2] = 0.0;\n  out[3] = 0.0;\n  return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec4} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\n\nfunction str(a) {\n  return \"vec4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\n\nfunction exactEquals(a, b) {\n  return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\n\nfunction equals(a, b) {\n  var a0 = a[0],\n      a1 = a[1],\n      a2 = a[2],\n      a3 = a[3];\n  var b0 = b[0],\n      b1 = b[1],\n      b2 = b[2],\n      b3 = b[3];\n  return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\n}\n/**\n * Alias for {@link vec4.subtract}\n * @function\n */\n\n\nvar sub = subtract;\n/**\n * Alias for {@link vec4.multiply}\n * @function\n */\n\nexports.sub = sub;\nvar mul = multiply;\n/**\n * Alias for {@link vec4.divide}\n * @function\n */\n\nexports.mul = mul;\nvar div = divide;\n/**\n * Alias for {@link vec4.distance}\n * @function\n */\n\nexports.div = div;\nvar dist = distance;\n/**\n * Alias for {@link vec4.squaredDistance}\n * @function\n */\n\nexports.dist = dist;\nvar sqrDist = squaredDistance;\n/**\n * Alias for {@link vec4.length}\n * @function\n */\n\nexports.sqrDist = sqrDist;\nvar len = length;\n/**\n * Alias for {@link vec4.squaredLength}\n * @function\n */\n\nexports.len = len;\nvar sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec4s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexports.sqrLen = sqrLen;\n\nvar forEach = function () {\n  var vec = create();\n  return function (a, stride, offset, count, fn, arg) {\n    var i, l;\n\n    if (!stride) {\n      stride = 4;\n    }\n\n    if (!offset) {\n      offset = 0;\n    }\n\n    if (count) {\n      l = Math.min(count * stride + offset, a.length);\n    } else {\n      l = a.length;\n    }\n\n    for (i = offset; i < l; i += stride) {\n      vec[0] = a[i];\n      vec[1] = a[i + 1];\n      vec[2] = a[i + 2];\n      vec[3] = a[i + 3];\n      fn(vec, vec, arg);\n      a[i] = vec[0];\n      a[i + 1] = vec[1];\n      a[i + 2] = vec[2];\n      a[i + 3] = vec[3];\n    }\n\n    return a;\n  };\n}();\n\nexports.forEach = forEach;","\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.create = create;\nexports.identity = identity;\nexports.setAxisAngle = setAxisAngle;\nexports.getAxisAngle = getAxisAngle;\nexports.getAngle = getAngle;\nexports.multiply = multiply;\nexports.rotateX = rotateX;\nexports.rotateY = rotateY;\nexports.rotateZ = rotateZ;\nexports.calculateW = calculateW;\nexports.exp = exp;\nexports.ln = ln;\nexports.pow = pow;\nexports.slerp = slerp;\nexports.random = random;\nexports.invert = invert;\nexports.conjugate = conjugate;\nexports.fromMat3 = fromMat3;\nexports.fromEuler = fromEuler;\nexports.str = str;\nexports.setAxes = exports.sqlerp = exports.rotationTo = exports.equals = exports.exactEquals = exports.normalize = exports.sqrLen = exports.squaredLength = exports.len = exports.length = exports.lerp = exports.dot = exports.scale = exports.mul = exports.add = exports.set = exports.copy = exports.fromValues = exports.clone = void 0;\n\nvar glMatrix = _interopRequireWildcard(require(\"./common.js\"));\n\nvar mat3 = _interopRequireWildcard(require(\"./mat3.js\"));\n\nvar vec3 = _interopRequireWildcard(require(\"./vec3.js\"));\n\nvar vec4 = _interopRequireWildcard(require(\"./vec4.js\"));\n\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== \"function\") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\n\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") { return { \"default\": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj[\"default\"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n/**\n * Quaternion\n * @module quat\n */\n\n/**\n * Creates a new identity quat\n *\n * @returns {quat} a new quaternion\n */\nfunction create() {\n  var out = new glMatrix.ARRAY_TYPE(4);\n\n  if (glMatrix.ARRAY_TYPE != Float32Array) {\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n  }\n\n  out[3] = 1;\n  return out;\n}\n/**\n * Set a quat to the identity quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\n\n\nfunction identity(out) {\n  out[0] = 0;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 1;\n  return out;\n}\n/**\n * Sets a quat from the given angle and rotation axis,\n * then returns it.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyVec3} axis the axis around which to rotate\n * @param {Number} rad the angle in radians\n * @returns {quat} out\n **/\n\n\nfunction setAxisAngle(out, axis, rad) {\n  rad = rad * 0.5;\n  var s = Math.sin(rad);\n  out[0] = s * axis[0];\n  out[1] = s * axis[1];\n  out[2] = s * axis[2];\n  out[3] = Math.cos(rad);\n  return out;\n}\n/**\n * Gets the rotation axis and angle for a given\n *  quaternion. If a quaternion is created with\n *  setAxisAngle, this method will return the same\n *  values as providied in the original parameter list\n *  OR functionally equivalent values.\n * Example: The quaternion formed by axis [0, 0, 1] and\n *  angle -90 is the same as the quaternion formed by\n *  [0, 0, 1] and 270. This method favors the latter.\n * @param  {vec3} out_axis  Vector receiving the axis of rotation\n * @param  {ReadonlyQuat} q     Quaternion to be decomposed\n * @return {Number}     Angle, in radians, of the rotation\n */\n\n\nfunction getAxisAngle(out_axis, q) {\n  var rad = Math.acos(q[3]) * 2.0;\n  var s = Math.sin(rad / 2.0);\n\n  if (s > glMatrix.EPSILON) {\n    out_axis[0] = q[0] / s;\n    out_axis[1] = q[1] / s;\n    out_axis[2] = q[2] / s;\n  } else {\n    // If s is zero, return any axis (no rotation - axis does not matter)\n    out_axis[0] = 1;\n    out_axis[1] = 0;\n    out_axis[2] = 0;\n  }\n\n  return rad;\n}\n/**\n * Gets the angular distance between two unit quaternions\n *\n * @param  {ReadonlyQuat} a     Origin unit quaternion\n * @param  {ReadonlyQuat} b     Destination unit quaternion\n * @return {Number}     Angle, in radians, between the two quaternions\n */\n\n\nfunction getAngle(a, b) {\n  var dotproduct = dot(a, b);\n  return Math.acos(2 * dotproduct * dotproduct - 1);\n}\n/**\n * Multiplies two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n */\n\n\nfunction multiply(out, a, b) {\n  var ax = a[0],\n      ay = a[1],\n      az = a[2],\n      aw = a[3];\n  var bx = b[0],\n      by = b[1],\n      bz = b[2],\n      bw = b[3];\n  out[0] = ax * bw + aw * bx + ay * bz - az * by;\n  out[1] = ay * bw + aw * by + az * bx - ax * bz;\n  out[2] = az * bw + aw * bz + ax * by - ay * bx;\n  out[3] = aw * bw - ax * bx - ay * by - az * bz;\n  return out;\n}\n/**\n * Rotates a quaternion by the given angle about the X axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\n\nfunction rotateX(out, a, rad) {\n  rad *= 0.5;\n  var ax = a[0],\n      ay = a[1],\n      az = a[2],\n      aw = a[3];\n  var bx = Math.sin(rad),\n      bw = Math.cos(rad);\n  out[0] = ax * bw + aw * bx;\n  out[1] = ay * bw + az * bx;\n  out[2] = az * bw - ay * bx;\n  out[3] = aw * bw - ax * bx;\n  return out;\n}\n/**\n * Rotates a quaternion by the given angle about the Y axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\n\nfunction rotateY(out, a, rad) {\n  rad *= 0.5;\n  var ax = a[0],\n      ay = a[1],\n      az = a[2],\n      aw = a[3];\n  var by = Math.sin(rad),\n      bw = Math.cos(rad);\n  out[0] = ax * bw - az * by;\n  out[1] = ay * bw + aw * by;\n  out[2] = az * bw + ax * by;\n  out[3] = aw * bw - ay * by;\n  return out;\n}\n/**\n * Rotates a quaternion by the given angle about the Z axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\n\nfunction rotateZ(out, a, rad) {\n  rad *= 0.5;\n  var ax = a[0],\n      ay = a[1],\n      az = a[2],\n      aw = a[3];\n  var bz = Math.sin(rad),\n      bw = Math.cos(rad);\n  out[0] = ax * bw + ay * bz;\n  out[1] = ay * bw - ax * bz;\n  out[2] = az * bw + aw * bz;\n  out[3] = aw * bw - az * bz;\n  return out;\n}\n/**\n * Calculates the W component of a quat from the X, Y, and Z components.\n * Assumes that quaternion is 1 unit in length.\n * Any existing W component will be ignored.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate W component of\n * @returns {quat} out\n */\n\n\nfunction calculateW(out, a) {\n  var x = a[0],\n      y = a[1],\n      z = a[2];\n  out[0] = x;\n  out[1] = y;\n  out[2] = z;\n  out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));\n  return out;\n}\n/**\n * Calculate the exponential of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */\n\n\nfunction exp(out, a) {\n  var x = a[0],\n      y = a[1],\n      z = a[2],\n      w = a[3];\n  var r = Math.sqrt(x * x + y * y + z * z);\n  var et = Math.exp(w);\n  var s = r > 0 ? et * Math.sin(r) / r : 0;\n  out[0] = x * s;\n  out[1] = y * s;\n  out[2] = z * s;\n  out[3] = et * Math.cos(r);\n  return out;\n}\n/**\n * Calculate the natural logarithm of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */\n\n\nfunction ln(out, a) {\n  var x = a[0],\n      y = a[1],\n      z = a[2],\n      w = a[3];\n  var r = Math.sqrt(x * x + y * y + z * z);\n  var t = r > 0 ? Math.atan2(r, w) / r : 0;\n  out[0] = x * t;\n  out[1] = y * t;\n  out[2] = z * t;\n  out[3] = 0.5 * Math.log(x * x + y * y + z * z + w * w);\n  return out;\n}\n/**\n * Calculate the scalar power of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @param {Number} b amount to scale the quaternion by\n * @returns {quat} out\n */\n\n\nfunction pow(out, a, b) {\n  ln(out, a);\n  scale(out, out, b);\n  exp(out, out);\n  return out;\n}\n/**\n * Performs a spherical linear interpolation between two quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\n\n\nfunction slerp(out, a, b, t) {\n  // benchmarks:\n  //    http://jsperf.com/quaternion-slerp-implementations\n  var ax = a[0],\n      ay = a[1],\n      az = a[2],\n      aw = a[3];\n  var bx = b[0],\n      by = b[1],\n      bz = b[2],\n      bw = b[3];\n  var omega, cosom, sinom, scale0, scale1; // calc cosine\n\n  cosom = ax * bx + ay * by + az * bz + aw * bw; // adjust signs (if necessary)\n\n  if (cosom < 0.0) {\n    cosom = -cosom;\n    bx = -bx;\n    by = -by;\n    bz = -bz;\n    bw = -bw;\n  } // calculate coefficients\n\n\n  if (1.0 - cosom > glMatrix.EPSILON) {\n    // standard case (slerp)\n    omega = Math.acos(cosom);\n    sinom = Math.sin(omega);\n    scale0 = Math.sin((1.0 - t) * omega) / sinom;\n    scale1 = Math.sin(t * omega) / sinom;\n  } else {\n    // \"from\" and \"to\" quaternions are very close\n    //  ... so we can do a linear interpolation\n    scale0 = 1.0 - t;\n    scale1 = t;\n  } // calculate final values\n\n\n  out[0] = scale0 * ax + scale1 * bx;\n  out[1] = scale0 * ay + scale1 * by;\n  out[2] = scale0 * az + scale1 * bz;\n  out[3] = scale0 * aw + scale1 * bw;\n  return out;\n}\n/**\n * Generates a random unit quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\n\n\nfunction random(out) {\n  // Implementation of http://planning.cs.uiuc.edu/node198.html\n  // TODO: Calling random 3 times is probably not the fastest solution\n  var u1 = glMatrix.RANDOM();\n  var u2 = glMatrix.RANDOM();\n  var u3 = glMatrix.RANDOM();\n  var sqrt1MinusU1 = Math.sqrt(1 - u1);\n  var sqrtU1 = Math.sqrt(u1);\n  out[0] = sqrt1MinusU1 * Math.sin(2.0 * Math.PI * u2);\n  out[1] = sqrt1MinusU1 * Math.cos(2.0 * Math.PI * u2);\n  out[2] = sqrtU1 * Math.sin(2.0 * Math.PI * u3);\n  out[3] = sqrtU1 * Math.cos(2.0 * Math.PI * u3);\n  return out;\n}\n/**\n * Calculates the inverse of a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate inverse of\n * @returns {quat} out\n */\n\n\nfunction invert(out, a) {\n  var a0 = a[0],\n      a1 = a[1],\n      a2 = a[2],\n      a3 = a[3];\n  var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;\n  var invDot = dot ? 1.0 / dot : 0; // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0\n\n  out[0] = -a0 * invDot;\n  out[1] = -a1 * invDot;\n  out[2] = -a2 * invDot;\n  out[3] = a3 * invDot;\n  return out;\n}\n/**\n * Calculates the conjugate of a quat\n * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate conjugate of\n * @returns {quat} out\n */\n\n\nfunction conjugate(out, a) {\n  out[0] = -a[0];\n  out[1] = -a[1];\n  out[2] = -a[2];\n  out[3] = a[3];\n  return out;\n}\n/**\n * Creates a quaternion from the given 3x3 rotation matrix.\n *\n * NOTE: The resultant quaternion is not normalized, so you should be sure\n * to renormalize the quaternion yourself where necessary.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyMat3} m rotation matrix\n * @returns {quat} out\n * @function\n */\n\n\nfunction fromMat3(out, m) {\n  // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n  // article \"Quaternion Calculus and Fast Animation\".\n  var fTrace = m[0] + m[4] + m[8];\n  var fRoot;\n\n  if (fTrace > 0.0) {\n    // |w| > 1/2, may as well choose w > 1/2\n    fRoot = Math.sqrt(fTrace + 1.0); // 2w\n\n    out[3] = 0.5 * fRoot;\n    fRoot = 0.5 / fRoot; // 1/(4w)\n\n    out[0] = (m[5] - m[7]) * fRoot;\n    out[1] = (m[6] - m[2]) * fRoot;\n    out[2] = (m[1] - m[3]) * fRoot;\n  } else {\n    // |w| <= 1/2\n    var i = 0;\n    if (m[4] > m[0]) i = 1;\n    if (m[8] > m[i * 3 + i]) i = 2;\n    var j = (i + 1) % 3;\n    var k = (i + 2) % 3;\n    fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);\n    out[i] = 0.5 * fRoot;\n    fRoot = 0.5 / fRoot;\n    out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;\n    out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;\n    out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;\n  }\n\n  return out;\n}\n/**\n * Creates a quaternion from the given euler angle x, y, z.\n *\n * @param {quat} out the receiving quaternion\n * @param {x} Angle to rotate around X axis in degrees.\n * @param {y} Angle to rotate around Y axis in degrees.\n * @param {z} Angle to rotate around Z axis in degrees.\n * @returns {quat} out\n * @function\n */\n\n\nfunction fromEuler(out, x, y, z) {\n  var halfToRad = 0.5 * Math.PI / 180.0;\n  x *= halfToRad;\n  y *= halfToRad;\n  z *= halfToRad;\n  var sx = Math.sin(x);\n  var cx = Math.cos(x);\n  var sy = Math.sin(y);\n  var cy = Math.cos(y);\n  var sz = Math.sin(z);\n  var cz = Math.cos(z);\n  out[0] = sx * cy * cz - cx * sy * sz;\n  out[1] = cx * sy * cz + sx * cy * sz;\n  out[2] = cx * cy * sz - sx * sy * cz;\n  out[3] = cx * cy * cz + sx * sy * sz;\n  return out;\n}\n/**\n * Returns a string representation of a quatenion\n *\n * @param {ReadonlyQuat} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\n\nfunction str(a) {\n  return \"quat(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\n * Creates a new quat initialized with values from an existing quaternion\n *\n * @param {ReadonlyQuat} a quaternion to clone\n * @returns {quat} a new quaternion\n * @function\n */\n\n\nvar clone = vec4.clone;\n/**\n * Creates a new quat initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} a new quaternion\n * @function\n */\n\nexports.clone = clone;\nvar fromValues = vec4.fromValues;\n/**\n * Copy the values from one quat to another\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the source quaternion\n * @returns {quat} out\n * @function\n */\n\nexports.fromValues = fromValues;\nvar copy = vec4.copy;\n/**\n * Set the components of a quat to the given values\n *\n * @param {quat} out the receiving quaternion\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} out\n * @function\n */\n\nexports.copy = copy;\nvar set = vec4.set;\n/**\n * Adds two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n * @function\n */\n\nexports.set = set;\nvar add = vec4.add;\n/**\n * Alias for {@link quat.multiply}\n * @function\n */\n\nexports.add = add;\nvar mul = multiply;\n/**\n * Scales a quat by a scalar number\n *\n * @param {quat} out the receiving vector\n * @param {ReadonlyQuat} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {quat} out\n * @function\n */\n\nexports.mul = mul;\nvar scale = vec4.scale;\n/**\n * Calculates the dot product of two quat's\n *\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {Number} dot product of a and b\n * @function\n */\n\nexports.scale = scale;\nvar dot = vec4.dot;\n/**\n * Performs a linear interpolation between two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n * @function\n */\n\nexports.dot = dot;\nvar lerp = vec4.lerp;\n/**\n * Calculates the length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexports.lerp = lerp;\nvar length = vec4.length;\n/**\n * Alias for {@link quat.length}\n * @function\n */\n\nexports.length = length;\nvar len = length;\n/**\n * Calculates the squared length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate squared length of\n * @returns {Number} squared length of a\n * @function\n */\n\nexports.len = len;\nvar squaredLength = vec4.squaredLength;\n/**\n * Alias for {@link quat.squaredLength}\n * @function\n */\n\nexports.squaredLength = squaredLength;\nvar sqrLen = squaredLength;\n/**\n * Normalize a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quaternion to normalize\n * @returns {quat} out\n * @function\n */\n\nexports.sqrLen = sqrLen;\nvar normalize = vec4.normalize;\n/**\n * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyQuat} a The first quaternion.\n * @param {ReadonlyQuat} b The second quaternion.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexports.normalize = normalize;\nvar exactEquals = vec4.exactEquals;\n/**\n * Returns whether or not the quaternions have approximately the same elements in the same position.\n *\n * @param {ReadonlyQuat} a The first vector.\n * @param {ReadonlyQuat} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexports.exactEquals = exactEquals;\nvar equals = vec4.equals;\n/**\n * Sets a quaternion to represent the shortest rotation from one\n * vector to another.\n *\n * Both vectors are assumed to be unit length.\n *\n * @param {quat} out the receiving quaternion.\n * @param {ReadonlyVec3} a the initial vector\n * @param {ReadonlyVec3} b the destination vector\n * @returns {quat} out\n */\n\nexports.equals = equals;\n\nvar rotationTo = function () {\n  var tmpvec3 = vec3.create();\n  var xUnitVec3 = vec3.fromValues(1, 0, 0);\n  var yUnitVec3 = vec3.fromValues(0, 1, 0);\n  return function (out, a, b) {\n    var dot = vec3.dot(a, b);\n\n    if (dot < -0.999999) {\n      vec3.cross(tmpvec3, xUnitVec3, a);\n      if (vec3.len(tmpvec3) < 0.000001) vec3.cross(tmpvec3, yUnitVec3, a);\n      vec3.normalize(tmpvec3, tmpvec3);\n      setAxisAngle(out, tmpvec3, Math.PI);\n      return out;\n    } else if (dot > 0.999999) {\n      out[0] = 0;\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 1;\n      return out;\n    } else {\n      vec3.cross(tmpvec3, a, b);\n      out[0] = tmpvec3[0];\n      out[1] = tmpvec3[1];\n      out[2] = tmpvec3[2];\n      out[3] = 1 + dot;\n      return normalize(out, out);\n    }\n  };\n}();\n/**\n * Performs a spherical linear interpolation with two control points\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {ReadonlyQuat} c the third operand\n * @param {ReadonlyQuat} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\n\n\nexports.rotationTo = rotationTo;\n\nvar sqlerp = function () {\n  var temp1 = create();\n  var temp2 = create();\n  return function (out, a, b, c, d, t) {\n    slerp(temp1, a, d, t);\n    slerp(temp2, b, c, t);\n    slerp(out, temp1, temp2, 2 * t * (1 - t));\n    return out;\n  };\n}();\n/**\n * Sets the specified quaternion with values corresponding to the given\n * axes. Each axis is a vec3 and is expected to be unit length and\n * perpendicular to all other specified axes.\n *\n * @param {ReadonlyVec3} view  the vector representing the viewing direction\n * @param {ReadonlyVec3} right the vector representing the local \"right\" direction\n * @param {ReadonlyVec3} up    the vector representing the local \"up\" direction\n * @returns {quat} out\n */\n\n\nexports.sqlerp = sqlerp;\n\nvar setAxes = function () {\n  var matr = mat3.create();\n  return function (out, view, right, up) {\n    matr[0] = right[0];\n    matr[3] = right[1];\n    matr[6] = right[2];\n    matr[1] = up[0];\n    matr[4] = up[1];\n    matr[7] = up[2];\n    matr[2] = -view[0];\n    matr[5] = -view[1];\n    matr[8] = -view[2];\n    return normalize(out, fromMat3(out, matr));\n  };\n}();\n\nexports.setAxes = setAxes;","\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.create = create;\nexports.clone = clone;\nexports.fromValues = fromValues;\nexports.fromRotationTranslationValues = fromRotationTranslationValues;\nexports.fromRotationTranslation = fromRotationTranslation;\nexports.fromTranslation = fromTranslation;\nexports.fromRotation = fromRotation;\nexports.fromMat4 = fromMat4;\nexports.copy = copy;\nexports.identity = identity;\nexports.set = set;\nexports.getDual = getDual;\nexports.setDual = setDual;\nexports.getTranslation = getTranslation;\nexports.translate = translate;\nexports.rotateX = rotateX;\nexports.rotateY = rotateY;\nexports.rotateZ = rotateZ;\nexports.rotateByQuatAppend = rotateByQuatAppend;\nexports.rotateByQuatPrepend = rotateByQuatPrepend;\nexports.rotateAroundAxis = rotateAroundAxis;\nexports.add = add;\nexports.multiply = multiply;\nexports.scale = scale;\nexports.lerp = lerp;\nexports.invert = invert;\nexports.conjugate = conjugate;\nexports.normalize = normalize;\nexports.str = str;\nexports.exactEquals = exactEquals;\nexports.equals = equals;\nexports.sqrLen = exports.squaredLength = exports.len = exports.length = exports.dot = exports.mul = exports.setReal = exports.getReal = void 0;\n\nvar glMatrix = _interopRequireWildcard(require(\"./common.js\"));\n\nvar quat = _interopRequireWildcard(require(\"./quat.js\"));\n\nvar mat4 = _interopRequireWildcard(require(\"./mat4.js\"));\n\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== \"function\") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\n\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") { return { \"default\": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj[\"default\"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n/**\n * Dual Quaternion<br>\n * Format: [real, dual]<br>\n * Quaternion format: XYZW<br>\n * Make sure to have normalized dual quaternions, otherwise the functions may not work as intended.<br>\n * @module quat2\n */\n\n/**\n * Creates a new identity dual quat\n *\n * @returns {quat2} a new dual quaternion [real -> rotation, dual -> translation]\n */\nfunction create() {\n  var dq = new glMatrix.ARRAY_TYPE(8);\n\n  if (glMatrix.ARRAY_TYPE != Float32Array) {\n    dq[0] = 0;\n    dq[1] = 0;\n    dq[2] = 0;\n    dq[4] = 0;\n    dq[5] = 0;\n    dq[6] = 0;\n    dq[7] = 0;\n  }\n\n  dq[3] = 1;\n  return dq;\n}\n/**\n * Creates a new quat initialized with values from an existing quaternion\n *\n * @param {ReadonlyQuat2} a dual quaternion to clone\n * @returns {quat2} new dual quaternion\n * @function\n */\n\n\nfunction clone(a) {\n  var dq = new glMatrix.ARRAY_TYPE(8);\n  dq[0] = a[0];\n  dq[1] = a[1];\n  dq[2] = a[2];\n  dq[3] = a[3];\n  dq[4] = a[4];\n  dq[5] = a[5];\n  dq[6] = a[6];\n  dq[7] = a[7];\n  return dq;\n}\n/**\n * Creates a new dual quat initialized with the given values\n *\n * @param {Number} x1 X component\n * @param {Number} y1 Y component\n * @param {Number} z1 Z component\n * @param {Number} w1 W component\n * @param {Number} x2 X component\n * @param {Number} y2 Y component\n * @param {Number} z2 Z component\n * @param {Number} w2 W component\n * @returns {quat2} new dual quaternion\n * @function\n */\n\n\nfunction fromValues(x1, y1, z1, w1, x2, y2, z2, w2) {\n  var dq = new glMatrix.ARRAY_TYPE(8);\n  dq[0] = x1;\n  dq[1] = y1;\n  dq[2] = z1;\n  dq[3] = w1;\n  dq[4] = x2;\n  dq[5] = y2;\n  dq[6] = z2;\n  dq[7] = w2;\n  return dq;\n}\n/**\n * Creates a new dual quat from the given values (quat and translation)\n *\n * @param {Number} x1 X component\n * @param {Number} y1 Y component\n * @param {Number} z1 Z component\n * @param {Number} w1 W component\n * @param {Number} x2 X component (translation)\n * @param {Number} y2 Y component (translation)\n * @param {Number} z2 Z component (translation)\n * @returns {quat2} new dual quaternion\n * @function\n */\n\n\nfunction fromRotationTranslationValues(x1, y1, z1, w1, x2, y2, z2) {\n  var dq = new glMatrix.ARRAY_TYPE(8);\n  dq[0] = x1;\n  dq[1] = y1;\n  dq[2] = z1;\n  dq[3] = w1;\n  var ax = x2 * 0.5,\n      ay = y2 * 0.5,\n      az = z2 * 0.5;\n  dq[4] = ax * w1 + ay * z1 - az * y1;\n  dq[5] = ay * w1 + az * x1 - ax * z1;\n  dq[6] = az * w1 + ax * y1 - ay * x1;\n  dq[7] = -ax * x1 - ay * y1 - az * z1;\n  return dq;\n}\n/**\n * Creates a dual quat from a quaternion and a translation\n *\n * @param {ReadonlyQuat2} dual quaternion receiving operation result\n * @param {ReadonlyQuat} q a normalized quaternion\n * @param {ReadonlyVec3} t tranlation vector\n * @returns {quat2} dual quaternion receiving operation result\n * @function\n */\n\n\nfunction fromRotationTranslation(out, q, t) {\n  var ax = t[0] * 0.5,\n      ay = t[1] * 0.5,\n      az = t[2] * 0.5,\n      bx = q[0],\n      by = q[1],\n      bz = q[2],\n      bw = q[3];\n  out[0] = bx;\n  out[1] = by;\n  out[2] = bz;\n  out[3] = bw;\n  out[4] = ax * bw + ay * bz - az * by;\n  out[5] = ay * bw + az * bx - ax * bz;\n  out[6] = az * bw + ax * by - ay * bx;\n  out[7] = -ax * bx - ay * by - az * bz;\n  return out;\n}\n/**\n * Creates a dual quat from a translation\n *\n * @param {ReadonlyQuat2} dual quaternion receiving operation result\n * @param {ReadonlyVec3} t translation vector\n * @returns {quat2} dual quaternion receiving operation result\n * @function\n */\n\n\nfunction fromTranslation(out, t) {\n  out[0] = 0;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 1;\n  out[4] = t[0] * 0.5;\n  out[5] = t[1] * 0.5;\n  out[6] = t[2] * 0.5;\n  out[7] = 0;\n  return out;\n}\n/**\n * Creates a dual quat from a quaternion\n *\n * @param {ReadonlyQuat2} dual quaternion receiving operation result\n * @param {ReadonlyQuat} q the quaternion\n * @returns {quat2} dual quaternion receiving operation result\n * @function\n */\n\n\nfunction fromRotation(out, q) {\n  out[0] = q[0];\n  out[1] = q[1];\n  out[2] = q[2];\n  out[3] = q[3];\n  out[4] = 0;\n  out[5] = 0;\n  out[6] = 0;\n  out[7] = 0;\n  return out;\n}\n/**\n * Creates a new dual quat from a matrix (4x4)\n *\n * @param {quat2} out the dual quaternion\n * @param {ReadonlyMat4} a the matrix\n * @returns {quat2} dual quat receiving operation result\n * @function\n */\n\n\nfunction fromMat4(out, a) {\n  //TODO Optimize this\n  var outer = quat.create();\n  mat4.getRotation(outer, a);\n  var t = new glMatrix.ARRAY_TYPE(3);\n  mat4.getTranslation(t, a);\n  fromRotationTranslation(out, outer, t);\n  return out;\n}\n/**\n * Copy the values from one dual quat to another\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the source dual quaternion\n * @returns {quat2} out\n * @function\n */\n\n\nfunction copy(out, a) {\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[3];\n  out[4] = a[4];\n  out[5] = a[5];\n  out[6] = a[6];\n  out[7] = a[7];\n  return out;\n}\n/**\n * Set a dual quat to the identity dual quaternion\n *\n * @param {quat2} out the receiving quaternion\n * @returns {quat2} out\n */\n\n\nfunction identity(out) {\n  out[0] = 0;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 1;\n  out[4] = 0;\n  out[5] = 0;\n  out[6] = 0;\n  out[7] = 0;\n  return out;\n}\n/**\n * Set the components of a dual quat to the given values\n *\n * @param {quat2} out the receiving quaternion\n * @param {Number} x1 X component\n * @param {Number} y1 Y component\n * @param {Number} z1 Z component\n * @param {Number} w1 W component\n * @param {Number} x2 X component\n * @param {Number} y2 Y component\n * @param {Number} z2 Z component\n * @param {Number} w2 W component\n * @returns {quat2} out\n * @function\n */\n\n\nfunction set(out, x1, y1, z1, w1, x2, y2, z2, w2) {\n  out[0] = x1;\n  out[1] = y1;\n  out[2] = z1;\n  out[3] = w1;\n  out[4] = x2;\n  out[5] = y2;\n  out[6] = z2;\n  out[7] = w2;\n  return out;\n}\n/**\n * Gets the real part of a dual quat\n * @param  {quat} out real part\n * @param  {ReadonlyQuat2} a Dual Quaternion\n * @return {quat} real part\n */\n\n\nvar getReal = quat.copy;\n/**\n * Gets the dual part of a dual quat\n * @param  {quat} out dual part\n * @param  {ReadonlyQuat2} a Dual Quaternion\n * @return {quat} dual part\n */\n\nexports.getReal = getReal;\n\nfunction getDual(out, a) {\n  out[0] = a[4];\n  out[1] = a[5];\n  out[2] = a[6];\n  out[3] = a[7];\n  return out;\n}\n/**\n * Set the real component of a dual quat to the given quaternion\n *\n * @param {quat2} out the receiving quaternion\n * @param {ReadonlyQuat} q a quaternion representing the real part\n * @returns {quat2} out\n * @function\n */\n\n\nvar setReal = quat.copy;\n/**\n * Set the dual component of a dual quat to the given quaternion\n *\n * @param {quat2} out the receiving quaternion\n * @param {ReadonlyQuat} q a quaternion representing the dual part\n * @returns {quat2} out\n * @function\n */\n\nexports.setReal = setReal;\n\nfunction setDual(out, q) {\n  out[4] = q[0];\n  out[5] = q[1];\n  out[6] = q[2];\n  out[7] = q[3];\n  return out;\n}\n/**\n * Gets the translation of a normalized dual quat\n * @param  {vec3} out translation\n * @param  {ReadonlyQuat2} a Dual Quaternion to be decomposed\n * @return {vec3} translation\n */\n\n\nfunction getTranslation(out, a) {\n  var ax = a[4],\n      ay = a[5],\n      az = a[6],\n      aw = a[7],\n      bx = -a[0],\n      by = -a[1],\n      bz = -a[2],\n      bw = a[3];\n  out[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n  out[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n  out[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n  return out;\n}\n/**\n * Translates a dual quat by the given vector\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the dual quaternion to translate\n * @param {ReadonlyVec3} v vector to translate by\n * @returns {quat2} out\n */\n\n\nfunction translate(out, a, v) {\n  var ax1 = a[0],\n      ay1 = a[1],\n      az1 = a[2],\n      aw1 = a[3],\n      bx1 = v[0] * 0.5,\n      by1 = v[1] * 0.5,\n      bz1 = v[2] * 0.5,\n      ax2 = a[4],\n      ay2 = a[5],\n      az2 = a[6],\n      aw2 = a[7];\n  out[0] = ax1;\n  out[1] = ay1;\n  out[2] = az1;\n  out[3] = aw1;\n  out[4] = aw1 * bx1 + ay1 * bz1 - az1 * by1 + ax2;\n  out[5] = aw1 * by1 + az1 * bx1 - ax1 * bz1 + ay2;\n  out[6] = aw1 * bz1 + ax1 * by1 - ay1 * bx1 + az2;\n  out[7] = -ax1 * bx1 - ay1 * by1 - az1 * bz1 + aw2;\n  return out;\n}\n/**\n * Rotates a dual quat around the X axis\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the dual quaternion to rotate\n * @param {number} rad how far should the rotation be\n * @returns {quat2} out\n */\n\n\nfunction rotateX(out, a, rad) {\n  var bx = -a[0],\n      by = -a[1],\n      bz = -a[2],\n      bw = a[3],\n      ax = a[4],\n      ay = a[5],\n      az = a[6],\n      aw = a[7],\n      ax1 = ax * bw + aw * bx + ay * bz - az * by,\n      ay1 = ay * bw + aw * by + az * bx - ax * bz,\n      az1 = az * bw + aw * bz + ax * by - ay * bx,\n      aw1 = aw * bw - ax * bx - ay * by - az * bz;\n  quat.rotateX(out, a, rad);\n  bx = out[0];\n  by = out[1];\n  bz = out[2];\n  bw = out[3];\n  out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;\n  out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;\n  out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;\n  out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;\n  return out;\n}\n/**\n * Rotates a dual quat around the Y axis\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the dual quaternion to rotate\n * @param {number} rad how far should the rotation be\n * @returns {quat2} out\n */\n\n\nfunction rotateY(out, a, rad) {\n  var bx = -a[0],\n      by = -a[1],\n      bz = -a[2],\n      bw = a[3],\n      ax = a[4],\n      ay = a[5],\n      az = a[6],\n      aw = a[7],\n      ax1 = ax * bw + aw * bx + ay * bz - az * by,\n      ay1 = ay * bw + aw * by + az * bx - ax * bz,\n      az1 = az * bw + aw * bz + ax * by - ay * bx,\n      aw1 = aw * bw - ax * bx - ay * by - az * bz;\n  quat.rotateY(out, a, rad);\n  bx = out[0];\n  by = out[1];\n  bz = out[2];\n  bw = out[3];\n  out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;\n  out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;\n  out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;\n  out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;\n  return out;\n}\n/**\n * Rotates a dual quat around the Z axis\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the dual quaternion to rotate\n * @param {number} rad how far should the rotation be\n * @returns {quat2} out\n */\n\n\nfunction rotateZ(out, a, rad) {\n  var bx = -a[0],\n      by = -a[1],\n      bz = -a[2],\n      bw = a[3],\n      ax = a[4],\n      ay = a[5],\n      az = a[6],\n      aw = a[7],\n      ax1 = ax * bw + aw * bx + ay * bz - az * by,\n      ay1 = ay * bw + aw * by + az * bx - ax * bz,\n      az1 = az * bw + aw * bz + ax * by - ay * bx,\n      aw1 = aw * bw - ax * bx - ay * by - az * bz;\n  quat.rotateZ(out, a, rad);\n  bx = out[0];\n  by = out[1];\n  bz = out[2];\n  bw = out[3];\n  out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;\n  out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;\n  out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;\n  out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;\n  return out;\n}\n/**\n * Rotates a dual quat by a given quaternion (a * q)\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the dual quaternion to rotate\n * @param {ReadonlyQuat} q quaternion to rotate by\n * @returns {quat2} out\n */\n\n\nfunction rotateByQuatAppend(out, a, q) {\n  var qx = q[0],\n      qy = q[1],\n      qz = q[2],\n      qw = q[3],\n      ax = a[0],\n      ay = a[1],\n      az = a[2],\n      aw = a[3];\n  out[0] = ax * qw + aw * qx + ay * qz - az * qy;\n  out[1] = ay * qw + aw * qy + az * qx - ax * qz;\n  out[2] = az * qw + aw * qz + ax * qy - ay * qx;\n  out[3] = aw * qw - ax * qx - ay * qy - az * qz;\n  ax = a[4];\n  ay = a[5];\n  az = a[6];\n  aw = a[7];\n  out[4] = ax * qw + aw * qx + ay * qz - az * qy;\n  out[5] = ay * qw + aw * qy + az * qx - ax * qz;\n  out[6] = az * qw + aw * qz + ax * qy - ay * qx;\n  out[7] = aw * qw - ax * qx - ay * qy - az * qz;\n  return out;\n}\n/**\n * Rotates a dual quat by a given quaternion (q * a)\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat} q quaternion to rotate by\n * @param {ReadonlyQuat2} a the dual quaternion to rotate\n * @returns {quat2} out\n */\n\n\nfunction rotateByQuatPrepend(out, q, a) {\n  var qx = q[0],\n      qy = q[1],\n      qz = q[2],\n      qw = q[3],\n      bx = a[0],\n      by = a[1],\n      bz = a[2],\n      bw = a[3];\n  out[0] = qx * bw + qw * bx + qy * bz - qz * by;\n  out[1] = qy * bw + qw * by + qz * bx - qx * bz;\n  out[2] = qz * bw + qw * bz + qx * by - qy * bx;\n  out[3] = qw * bw - qx * bx - qy * by - qz * bz;\n  bx = a[4];\n  by = a[5];\n  bz = a[6];\n  bw = a[7];\n  out[4] = qx * bw + qw * bx + qy * bz - qz * by;\n  out[5] = qy * bw + qw * by + qz * bx - qx * bz;\n  out[6] = qz * bw + qw * bz + qx * by - qy * bx;\n  out[7] = qw * bw - qx * bx - qy * by - qz * bz;\n  return out;\n}\n/**\n * Rotates a dual quat around a given axis. Does the normalisation automatically\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the dual quaternion to rotate\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @param {Number} rad how far the rotation should be\n * @returns {quat2} out\n */\n\n\nfunction rotateAroundAxis(out, a, axis, rad) {\n  //Special case for rad = 0\n  if (Math.abs(rad) < glMatrix.EPSILON) {\n    return copy(out, a);\n  }\n\n  var axisLength = Math.hypot(axis[0], axis[1], axis[2]);\n  rad = rad * 0.5;\n  var s = Math.sin(rad);\n  var bx = s * axis[0] / axisLength;\n  var by = s * axis[1] / axisLength;\n  var bz = s * axis[2] / axisLength;\n  var bw = Math.cos(rad);\n  var ax1 = a[0],\n      ay1 = a[1],\n      az1 = a[2],\n      aw1 = a[3];\n  out[0] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;\n  out[1] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;\n  out[2] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;\n  out[3] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;\n  var ax = a[4],\n      ay = a[5],\n      az = a[6],\n      aw = a[7];\n  out[4] = ax * bw + aw * bx + ay * bz - az * by;\n  out[5] = ay * bw + aw * by + az * bx - ax * bz;\n  out[6] = az * bw + aw * bz + ax * by - ay * bx;\n  out[7] = aw * bw - ax * bx - ay * by - az * bz;\n  return out;\n}\n/**\n * Adds two dual quat's\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the first operand\n * @param {ReadonlyQuat2} b the second operand\n * @returns {quat2} out\n * @function\n */\n\n\nfunction add(out, a, b) {\n  out[0] = a[0] + b[0];\n  out[1] = a[1] + b[1];\n  out[2] = a[2] + b[2];\n  out[3] = a[3] + b[3];\n  out[4] = a[4] + b[4];\n  out[5] = a[5] + b[5];\n  out[6] = a[6] + b[6];\n  out[7] = a[7] + b[7];\n  return out;\n}\n/**\n * Multiplies two dual quat's\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the first operand\n * @param {ReadonlyQuat2} b the second operand\n * @returns {quat2} out\n */\n\n\nfunction multiply(out, a, b) {\n  var ax0 = a[0],\n      ay0 = a[1],\n      az0 = a[2],\n      aw0 = a[3],\n      bx1 = b[4],\n      by1 = b[5],\n      bz1 = b[6],\n      bw1 = b[7],\n      ax1 = a[4],\n      ay1 = a[5],\n      az1 = a[6],\n      aw1 = a[7],\n      bx0 = b[0],\n      by0 = b[1],\n      bz0 = b[2],\n      bw0 = b[3];\n  out[0] = ax0 * bw0 + aw0 * bx0 + ay0 * bz0 - az0 * by0;\n  out[1] = ay0 * bw0 + aw0 * by0 + az0 * bx0 - ax0 * bz0;\n  out[2] = az0 * bw0 + aw0 * bz0 + ax0 * by0 - ay0 * bx0;\n  out[3] = aw0 * bw0 - ax0 * bx0 - ay0 * by0 - az0 * bz0;\n  out[4] = ax0 * bw1 + aw0 * bx1 + ay0 * bz1 - az0 * by1 + ax1 * bw0 + aw1 * bx0 + ay1 * bz0 - az1 * by0;\n  out[5] = ay0 * bw1 + aw0 * by1 + az0 * bx1 - ax0 * bz1 + ay1 * bw0 + aw1 * by0 + az1 * bx0 - ax1 * bz0;\n  out[6] = az0 * bw1 + aw0 * bz1 + ax0 * by1 - ay0 * bx1 + az1 * bw0 + aw1 * bz0 + ax1 * by0 - ay1 * bx0;\n  out[7] = aw0 * bw1 - ax0 * bx1 - ay0 * by1 - az0 * bz1 + aw1 * bw0 - ax1 * bx0 - ay1 * by0 - az1 * bz0;\n  return out;\n}\n/**\n * Alias for {@link quat2.multiply}\n * @function\n */\n\n\nvar mul = multiply;\n/**\n * Scales a dual quat by a scalar number\n *\n * @param {quat2} out the receiving dual quat\n * @param {ReadonlyQuat2} a the dual quat to scale\n * @param {Number} b amount to scale the dual quat by\n * @returns {quat2} out\n * @function\n */\n\nexports.mul = mul;\n\nfunction scale(out, a, b) {\n  out[0] = a[0] * b;\n  out[1] = a[1] * b;\n  out[2] = a[2] * b;\n  out[3] = a[3] * b;\n  out[4] = a[4] * b;\n  out[5] = a[5] * b;\n  out[6] = a[6] * b;\n  out[7] = a[7] * b;\n  return out;\n}\n/**\n * Calculates the dot product of two dual quat's (The dot product of the real parts)\n *\n * @param {ReadonlyQuat2} a the first operand\n * @param {ReadonlyQuat2} b the second operand\n * @returns {Number} dot product of a and b\n * @function\n */\n\n\nvar dot = quat.dot;\n/**\n * Performs a linear interpolation between two dual quats's\n * NOTE: The resulting dual quaternions won't always be normalized (The error is most noticeable when t = 0.5)\n *\n * @param {quat2} out the receiving dual quat\n * @param {ReadonlyQuat2} a the first operand\n * @param {ReadonlyQuat2} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat2} out\n */\n\nexports.dot = dot;\n\nfunction lerp(out, a, b, t) {\n  var mt = 1 - t;\n  if (dot(a, b) < 0) t = -t;\n  out[0] = a[0] * mt + b[0] * t;\n  out[1] = a[1] * mt + b[1] * t;\n  out[2] = a[2] * mt + b[2] * t;\n  out[3] = a[3] * mt + b[3] * t;\n  out[4] = a[4] * mt + b[4] * t;\n  out[5] = a[5] * mt + b[5] * t;\n  out[6] = a[6] * mt + b[6] * t;\n  out[7] = a[7] * mt + b[7] * t;\n  return out;\n}\n/**\n * Calculates the inverse of a dual quat. If they are normalized, conjugate is cheaper\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a dual quat to calculate inverse of\n * @returns {quat2} out\n */\n\n\nfunction invert(out, a) {\n  var sqlen = squaredLength(a);\n  out[0] = -a[0] / sqlen;\n  out[1] = -a[1] / sqlen;\n  out[2] = -a[2] / sqlen;\n  out[3] = a[3] / sqlen;\n  out[4] = -a[4] / sqlen;\n  out[5] = -a[5] / sqlen;\n  out[6] = -a[6] / sqlen;\n  out[7] = a[7] / sqlen;\n  return out;\n}\n/**\n * Calculates the conjugate of a dual quat\n * If the dual quaternion is normalized, this function is faster than quat2.inverse and produces the same result.\n *\n * @param {quat2} out the receiving quaternion\n * @param {ReadonlyQuat2} a quat to calculate conjugate of\n * @returns {quat2} out\n */\n\n\nfunction conjugate(out, a) {\n  out[0] = -a[0];\n  out[1] = -a[1];\n  out[2] = -a[2];\n  out[3] = a[3];\n  out[4] = -a[4];\n  out[5] = -a[5];\n  out[6] = -a[6];\n  out[7] = a[7];\n  return out;\n}\n/**\n * Calculates the length of a dual quat\n *\n * @param {ReadonlyQuat2} a dual quat to calculate length of\n * @returns {Number} length of a\n * @function\n */\n\n\nvar length = quat.length;\n/**\n * Alias for {@link quat2.length}\n * @function\n */\n\nexports.length = length;\nvar len = length;\n/**\n * Calculates the squared length of a dual quat\n *\n * @param {ReadonlyQuat2} a dual quat to calculate squared length of\n * @returns {Number} squared length of a\n * @function\n */\n\nexports.len = len;\nvar squaredLength = quat.squaredLength;\n/**\n * Alias for {@link quat2.squaredLength}\n * @function\n */\n\nexports.squaredLength = squaredLength;\nvar sqrLen = squaredLength;\n/**\n * Normalize a dual quat\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a dual quaternion to normalize\n * @returns {quat2} out\n * @function\n */\n\nexports.sqrLen = sqrLen;\n\nfunction normalize(out, a) {\n  var magnitude = squaredLength(a);\n\n  if (magnitude > 0) {\n    magnitude = Math.sqrt(magnitude);\n    var a0 = a[0] / magnitude;\n    var a1 = a[1] / magnitude;\n    var a2 = a[2] / magnitude;\n    var a3 = a[3] / magnitude;\n    var b0 = a[4];\n    var b1 = a[5];\n    var b2 = a[6];\n    var b3 = a[7];\n    var a_dot_b = a0 * b0 + a1 * b1 + a2 * b2 + a3 * b3;\n    out[0] = a0;\n    out[1] = a1;\n    out[2] = a2;\n    out[3] = a3;\n    out[4] = (b0 - a0 * a_dot_b) / magnitude;\n    out[5] = (b1 - a1 * a_dot_b) / magnitude;\n    out[6] = (b2 - a2 * a_dot_b) / magnitude;\n    out[7] = (b3 - a3 * a_dot_b) / magnitude;\n  }\n\n  return out;\n}\n/**\n * Returns a string representation of a dual quatenion\n *\n * @param {ReadonlyQuat2} a dual quaternion to represent as a string\n * @returns {String} string representation of the dual quat\n */\n\n\nfunction str(a) {\n  return \"quat2(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \")\";\n}\n/**\n * Returns whether or not the dual quaternions have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyQuat2} a the first dual quaternion.\n * @param {ReadonlyQuat2} b the second dual quaternion.\n * @returns {Boolean} true if the dual quaternions are equal, false otherwise.\n */\n\n\nfunction exactEquals(a, b) {\n  return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7];\n}\n/**\n * Returns whether or not the dual quaternions have approximately the same elements in the same position.\n *\n * @param {ReadonlyQuat2} a the first dual quat.\n * @param {ReadonlyQuat2} b the second dual quat.\n * @returns {Boolean} true if the dual quats are equal, false otherwise.\n */\n\n\nfunction equals(a, b) {\n  var a0 = a[0],\n      a1 = a[1],\n      a2 = a[2],\n      a3 = a[3],\n      a4 = a[4],\n      a5 = a[5],\n      a6 = a[6],\n      a7 = a[7];\n  var b0 = b[0],\n      b1 = b[1],\n      b2 = b[2],\n      b3 = b[3],\n      b4 = b[4],\n      b5 = b[5],\n      b6 = b[6],\n      b7 = b[7];\n  return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7));\n}","\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.create = create;\nexports.clone = clone;\nexports.fromValues = fromValues;\nexports.copy = copy;\nexports.set = set;\nexports.add = add;\nexports.subtract = subtract;\nexports.multiply = multiply;\nexports.divide = divide;\nexports.ceil = ceil;\nexports.floor = floor;\nexports.min = min;\nexports.max = max;\nexports.round = round;\nexports.scale = scale;\nexports.scaleAndAdd = scaleAndAdd;\nexports.distance = distance;\nexports.squaredDistance = squaredDistance;\nexports.length = length;\nexports.squaredLength = squaredLength;\nexports.negate = negate;\nexports.inverse = inverse;\nexports.normalize = normalize;\nexports.dot = dot;\nexports.cross = cross;\nexports.lerp = lerp;\nexports.random = random;\nexports.transformMat2 = transformMat2;\nexports.transformMat2d = transformMat2d;\nexports.transformMat3 = transformMat3;\nexports.transformMat4 = transformMat4;\nexports.rotate = rotate;\nexports.angle = angle;\nexports.zero = zero;\nexports.str = str;\nexports.exactEquals = exactEquals;\nexports.equals = equals;\nexports.forEach = exports.sqrLen = exports.sqrDist = exports.dist = exports.div = exports.mul = exports.sub = exports.len = void 0;\n\nvar glMatrix = _interopRequireWildcard(require(\"./common.js\"));\n\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== \"function\") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\n\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") { return { \"default\": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj[\"default\"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n/**\n * 2 Dimensional Vector\n * @module vec2\n */\n\n/**\n * Creates a new, empty vec2\n *\n * @returns {vec2} a new 2D vector\n */\nfunction create() {\n  var out = new glMatrix.ARRAY_TYPE(2);\n\n  if (glMatrix.ARRAY_TYPE != Float32Array) {\n    out[0] = 0;\n    out[1] = 0;\n  }\n\n  return out;\n}\n/**\n * Creates a new vec2 initialized with values from an existing vector\n *\n * @param {ReadonlyVec2} a vector to clone\n * @returns {vec2} a new 2D vector\n */\n\n\nfunction clone(a) {\n  var out = new glMatrix.ARRAY_TYPE(2);\n  out[0] = a[0];\n  out[1] = a[1];\n  return out;\n}\n/**\n * Creates a new vec2 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} a new 2D vector\n */\n\n\nfunction fromValues(x, y) {\n  var out = new glMatrix.ARRAY_TYPE(2);\n  out[0] = x;\n  out[1] = y;\n  return out;\n}\n/**\n * Copy the values from one vec2 to another\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the source vector\n * @returns {vec2} out\n */\n\n\nfunction copy(out, a) {\n  out[0] = a[0];\n  out[1] = a[1];\n  return out;\n}\n/**\n * Set the components of a vec2 to the given values\n *\n * @param {vec2} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} out\n */\n\n\nfunction set(out, x, y) {\n  out[0] = x;\n  out[1] = y;\n  return out;\n}\n/**\n * Adds two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\n\nfunction add(out, a, b) {\n  out[0] = a[0] + b[0];\n  out[1] = a[1] + b[1];\n  return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\n\nfunction subtract(out, a, b) {\n  out[0] = a[0] - b[0];\n  out[1] = a[1] - b[1];\n  return out;\n}\n/**\n * Multiplies two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\n\nfunction multiply(out, a, b) {\n  out[0] = a[0] * b[0];\n  out[1] = a[1] * b[1];\n  return out;\n}\n/**\n * Divides two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\n\nfunction divide(out, a, b) {\n  out[0] = a[0] / b[0];\n  out[1] = a[1] / b[1];\n  return out;\n}\n/**\n * Math.ceil the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to ceil\n * @returns {vec2} out\n */\n\n\nfunction ceil(out, a) {\n  out[0] = Math.ceil(a[0]);\n  out[1] = Math.ceil(a[1]);\n  return out;\n}\n/**\n * Math.floor the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to floor\n * @returns {vec2} out\n */\n\n\nfunction floor(out, a) {\n  out[0] = Math.floor(a[0]);\n  out[1] = Math.floor(a[1]);\n  return out;\n}\n/**\n * Returns the minimum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\n\nfunction min(out, a, b) {\n  out[0] = Math.min(a[0], b[0]);\n  out[1] = Math.min(a[1], b[1]);\n  return out;\n}\n/**\n * Returns the maximum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\n\nfunction max(out, a, b) {\n  out[0] = Math.max(a[0], b[0]);\n  out[1] = Math.max(a[1], b[1]);\n  return out;\n}\n/**\n * Math.round the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to round\n * @returns {vec2} out\n */\n\n\nfunction round(out, a) {\n  out[0] = Math.round(a[0]);\n  out[1] = Math.round(a[1]);\n  return out;\n}\n/**\n * Scales a vec2 by a scalar number\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec2} out\n */\n\n\nfunction scale(out, a, b) {\n  out[0] = a[0] * b;\n  out[1] = a[1] * b;\n  return out;\n}\n/**\n * Adds two vec2's after scaling the second operand by a scalar value\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec2} out\n */\n\n\nfunction scaleAndAdd(out, a, b, scale) {\n  out[0] = a[0] + b[0] * scale;\n  out[1] = a[1] + b[1] * scale;\n  return out;\n}\n/**\n * Calculates the euclidian distance between two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} distance between a and b\n */\n\n\nfunction distance(a, b) {\n  var x = b[0] - a[0],\n      y = b[1] - a[1];\n  return Math.hypot(x, y);\n}\n/**\n * Calculates the squared euclidian distance between two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\n\nfunction squaredDistance(a, b) {\n  var x = b[0] - a[0],\n      y = b[1] - a[1];\n  return x * x + y * y;\n}\n/**\n * Calculates the length of a vec2\n *\n * @param {ReadonlyVec2} a vector to calculate length of\n * @returns {Number} length of a\n */\n\n\nfunction length(a) {\n  var x = a[0],\n      y = a[1];\n  return Math.hypot(x, y);\n}\n/**\n * Calculates the squared length of a vec2\n *\n * @param {ReadonlyVec2} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\n\nfunction squaredLength(a) {\n  var x = a[0],\n      y = a[1];\n  return x * x + y * y;\n}\n/**\n * Negates the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to negate\n * @returns {vec2} out\n */\n\n\nfunction negate(out, a) {\n  out[0] = -a[0];\n  out[1] = -a[1];\n  return out;\n}\n/**\n * Returns the inverse of the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to invert\n * @returns {vec2} out\n */\n\n\nfunction inverse(out, a) {\n  out[0] = 1.0 / a[0];\n  out[1] = 1.0 / a[1];\n  return out;\n}\n/**\n * Normalize a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to normalize\n * @returns {vec2} out\n */\n\n\nfunction normalize(out, a) {\n  var x = a[0],\n      y = a[1];\n  var len = x * x + y * y;\n\n  if (len > 0) {\n    //TODO: evaluate use of glm_invsqrt here?\n    len = 1 / Math.sqrt(len);\n  }\n\n  out[0] = a[0] * len;\n  out[1] = a[1] * len;\n  return out;\n}\n/**\n * Calculates the dot product of two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} dot product of a and b\n */\n\n\nfunction dot(a, b) {\n  return a[0] * b[0] + a[1] * b[1];\n}\n/**\n * Computes the cross product of two vec2's\n * Note that the cross product must by definition produce a 3D vector\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec3} out\n */\n\n\nfunction cross(out, a, b) {\n  var z = a[0] * b[1] - a[1] * b[0];\n  out[0] = out[1] = 0;\n  out[2] = z;\n  return out;\n}\n/**\n * Performs a linear interpolation between two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec2} out\n */\n\n\nfunction lerp(out, a, b, t) {\n  var ax = a[0],\n      ay = a[1];\n  out[0] = ax + t * (b[0] - ax);\n  out[1] = ay + t * (b[1] - ay);\n  return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec2} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec2} out\n */\n\n\nfunction random(out, scale) {\n  scale = scale || 1.0;\n  var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n  out[0] = Math.cos(r) * scale;\n  out[1] = Math.sin(r) * scale;\n  return out;\n}\n/**\n * Transforms the vec2 with a mat2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat2} m matrix to transform with\n * @returns {vec2} out\n */\n\n\nfunction transformMat2(out, a, m) {\n  var x = a[0],\n      y = a[1];\n  out[0] = m[0] * x + m[2] * y;\n  out[1] = m[1] * x + m[3] * y;\n  return out;\n}\n/**\n * Transforms the vec2 with a mat2d\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat2d} m matrix to transform with\n * @returns {vec2} out\n */\n\n\nfunction transformMat2d(out, a, m) {\n  var x = a[0],\n      y = a[1];\n  out[0] = m[0] * x + m[2] * y + m[4];\n  out[1] = m[1] * x + m[3] * y + m[5];\n  return out;\n}\n/**\n * Transforms the vec2 with a mat3\n * 3rd vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat3} m matrix to transform with\n * @returns {vec2} out\n */\n\n\nfunction transformMat3(out, a, m) {\n  var x = a[0],\n      y = a[1];\n  out[0] = m[0] * x + m[3] * y + m[6];\n  out[1] = m[1] * x + m[4] * y + m[7];\n  return out;\n}\n/**\n * Transforms the vec2 with a mat4\n * 3rd vector component is implicitly '0'\n * 4th vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec2} out\n */\n\n\nfunction transformMat4(out, a, m) {\n  var x = a[0];\n  var y = a[1];\n  out[0] = m[0] * x + m[4] * y + m[12];\n  out[1] = m[1] * x + m[5] * y + m[13];\n  return out;\n}\n/**\n * Rotate a 2D vector\n * @param {vec2} out The receiving vec2\n * @param {ReadonlyVec2} a The vec2 point to rotate\n * @param {ReadonlyVec2} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec2} out\n */\n\n\nfunction rotate(out, a, b, rad) {\n  //Translate point to the origin\n  var p0 = a[0] - b[0],\n      p1 = a[1] - b[1],\n      sinC = Math.sin(rad),\n      cosC = Math.cos(rad); //perform rotation and translate to correct position\n\n  out[0] = p0 * cosC - p1 * sinC + b[0];\n  out[1] = p0 * sinC + p1 * cosC + b[1];\n  return out;\n}\n/**\n * Get the angle between two 2D vectors\n * @param {ReadonlyVec2} a The first operand\n * @param {ReadonlyVec2} b The second operand\n * @returns {Number} The angle in radians\n */\n\n\nfunction angle(a, b) {\n  var x1 = a[0],\n      y1 = a[1],\n      x2 = b[0],\n      y2 = b[1],\n      // mag is the product of the magnitudes of a and b\n  mag = Math.sqrt(x1 * x1 + y1 * y1) * Math.sqrt(x2 * x2 + y2 * y2),\n      // mag &&.. short circuits if mag == 0\n  cosine = mag && (x1 * x2 + y1 * y2) / mag; // Math.min(Math.max(cosine, -1), 1) clamps the cosine between -1 and 1\n\n  return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\n * Set the components of a vec2 to zero\n *\n * @param {vec2} out the receiving vector\n * @returns {vec2} out\n */\n\n\nfunction zero(out) {\n  out[0] = 0.0;\n  out[1] = 0.0;\n  return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec2} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\n\nfunction str(a) {\n  return \"vec2(\" + a[0] + \", \" + a[1] + \")\";\n}\n/**\n * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec2} a The first vector.\n * @param {ReadonlyVec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\n\nfunction exactEquals(a, b) {\n  return a[0] === b[0] && a[1] === b[1];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec2} a The first vector.\n * @param {ReadonlyVec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\n\nfunction equals(a, b) {\n  var a0 = a[0],\n      a1 = a[1];\n  var b0 = b[0],\n      b1 = b[1];\n  return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1));\n}\n/**\n * Alias for {@link vec2.length}\n * @function\n */\n\n\nvar len = length;\n/**\n * Alias for {@link vec2.subtract}\n * @function\n */\n\nexports.len = len;\nvar sub = subtract;\n/**\n * Alias for {@link vec2.multiply}\n * @function\n */\n\nexports.sub = sub;\nvar mul = multiply;\n/**\n * Alias for {@link vec2.divide}\n * @function\n */\n\nexports.mul = mul;\nvar div = divide;\n/**\n * Alias for {@link vec2.distance}\n * @function\n */\n\nexports.div = div;\nvar dist = distance;\n/**\n * Alias for {@link vec2.squaredDistance}\n * @function\n */\n\nexports.dist = dist;\nvar sqrDist = squaredDistance;\n/**\n * Alias for {@link vec2.squaredLength}\n * @function\n */\n\nexports.sqrDist = sqrDist;\nvar sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec2s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexports.sqrLen = sqrLen;\n\nvar forEach = function () {\n  var vec = create();\n  return function (a, stride, offset, count, fn, arg) {\n    var i, l;\n\n    if (!stride) {\n      stride = 2;\n    }\n\n    if (!offset) {\n      offset = 0;\n    }\n\n    if (count) {\n      l = Math.min(count * stride + offset, a.length);\n    } else {\n      l = a.length;\n    }\n\n    for (i = offset; i < l; i += stride) {\n      vec[0] = a[i];\n      vec[1] = a[i + 1];\n      fn(vec, vec, arg);\n      a[i] = vec[0];\n      a[i + 1] = vec[1];\n    }\n\n    return a;\n  };\n}();\n\nexports.forEach = forEach;","\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.vec4 = exports.vec3 = exports.vec2 = exports.quat2 = exports.quat = exports.mat4 = exports.mat3 = exports.mat2d = exports.mat2 = exports.glMatrix = void 0;\n\nvar glMatrix = _interopRequireWildcard(require(\"./common.js\"));\n\nexports.glMatrix = glMatrix;\n\nvar mat2 = _interopRequireWildcard(require(\"./mat2.js\"));\n\nexports.mat2 = mat2;\n\nvar mat2d = _interopRequireWildcard(require(\"./mat2d.js\"));\n\nexports.mat2d = mat2d;\n\nvar mat3 = _interopRequireWildcard(require(\"./mat3.js\"));\n\nexports.mat3 = mat3;\n\nvar mat4 = _interopRequireWildcard(require(\"./mat4.js\"));\n\nexports.mat4 = mat4;\n\nvar quat = _interopRequireWildcard(require(\"./quat.js\"));\n\nexports.quat = quat;\n\nvar quat2 = _interopRequireWildcard(require(\"./quat2.js\"));\n\nexports.quat2 = quat2;\n\nvar vec2 = _interopRequireWildcard(require(\"./vec2.js\"));\n\nexports.vec2 = vec2;\n\nvar vec3 = _interopRequireWildcard(require(\"./vec3.js\"));\n\nexports.vec3 = vec3;\n\nvar vec4 = _interopRequireWildcard(require(\"./vec4.js\"));\n\nexports.vec4 = vec4;\n\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== \"function\") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\n\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") { return { \"default\": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj[\"default\"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }","'use strict';\n\nmodule.exports = UnitBezier;\n\nfunction UnitBezier(p1x, p1y, p2x, p2y) {\n    // Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1).\n    this.cx = 3.0 * p1x;\n    this.bx = 3.0 * (p2x - p1x) - this.cx;\n    this.ax = 1.0 - this.cx - this.bx;\n\n    this.cy = 3.0 * p1y;\n    this.by = 3.0 * (p2y - p1y) - this.cy;\n    this.ay = 1.0 - this.cy - this.by;\n\n    this.p1x = p1x;\n    this.p1y = p1y;\n    this.p2x = p2x;\n    this.p2y = p2y;\n}\n\nUnitBezier.prototype = {\n    sampleCurveX: function (t) {\n        // `ax t^3 + bx t^2 + cx t' expanded using Horner's rule.\n        return ((this.ax * t + this.bx) * t + this.cx) * t;\n    },\n\n    sampleCurveY: function (t) {\n        return ((this.ay * t + this.by) * t + this.cy) * t;\n    },\n\n    sampleCurveDerivativeX: function (t) {\n        return (3.0 * this.ax * t + 2.0 * this.bx) * t + this.cx;\n    },\n\n    solveCurveX: function (x, epsilon) {\n        if (epsilon === undefined) epsilon = 1e-6;\n\n        if (x < 0.0) return 0.0;\n        if (x > 1.0) return 1.0;\n\n        var t = x;\n\n        // First try a few iterations of Newton's method - normally very fast.\n        for (var i = 0; i < 8; i++) {\n            var x2 = this.sampleCurveX(t) - x;\n            if (Math.abs(x2) < epsilon) return t;\n\n            var d2 = this.sampleCurveDerivativeX(t);\n            if (Math.abs(d2) < 1e-6) break;\n\n            t = t - x2 / d2;\n        }\n\n        // Fall back to the bisection method for reliability.\n        var t0 = 0.0;\n        var t1 = 1.0;\n        t = x;\n\n        for (i = 0; i < 20; i++) {\n            x2 = this.sampleCurveX(t);\n            if (Math.abs(x2 - x) < epsilon) break;\n\n            if (x > x2) {\n                t0 = t;\n            } else {\n                t1 = t;\n            }\n\n            t = (t1 - t0) * 0.5 + t0;\n        }\n\n        return t;\n    },\n\n    solve: function (x, epsilon) {\n        return this.sampleCurveY(this.solveCurveX(x, epsilon));\n    }\n};\n","'use strict';\n\nmodule.exports = Point;\n\n/**\n * A standalone point geometry with useful accessor, comparison, and\n * modification methods.\n *\n * @class Point\n * @param {Number} x the x-coordinate. this could be longitude or screen\n * pixels, or any other sort of unit.\n * @param {Number} y the y-coordinate. this could be latitude or screen\n * pixels, or any other sort of unit.\n * @example\n * var point = new Point(-77, 38);\n */\nfunction Point(x, y) {\n    this.x = x;\n    this.y = y;\n}\n\nPoint.prototype = {\n\n    /**\n     * Clone this point, returning a new point that can be modified\n     * without affecting the old one.\n     * @return {Point} the clone\n     */\n    clone: function() { return new Point(this.x, this.y); },\n\n    /**\n     * Add this point's x & y coordinates to another point,\n     * yielding a new point.\n     * @param {Point} p the other point\n     * @return {Point} output point\n     */\n    add:     function(p) { return this.clone()._add(p); },\n\n    /**\n     * Subtract this point's x & y coordinates to from point,\n     * yielding a new point.\n     * @param {Point} p the other point\n     * @return {Point} output point\n     */\n    sub:     function(p) { return this.clone()._sub(p); },\n\n    /**\n     * Multiply this point's x & y coordinates by point,\n     * yielding a new point.\n     * @param {Point} p the other point\n     * @return {Point} output point\n     */\n    multByPoint:    function(p) { return this.clone()._multByPoint(p); },\n\n    /**\n     * Divide this point's x & y coordinates by point,\n     * yielding a new point.\n     * @param {Point} p the other point\n     * @return {Point} output point\n     */\n    divByPoint:     function(p) { return this.clone()._divByPoint(p); },\n\n    /**\n     * Multiply this point's x & y coordinates by a factor,\n     * yielding a new point.\n     * @param {Point} k factor\n     * @return {Point} output point\n     */\n    mult:    function(k) { return this.clone()._mult(k); },\n\n    /**\n     * Divide this point's x & y coordinates by a factor,\n     * yielding a new point.\n     * @param {Point} k factor\n     * @return {Point} output point\n     */\n    div:     function(k) { return this.clone()._div(k); },\n\n    /**\n     * Rotate this point around the 0, 0 origin by an angle a,\n     * given in radians\n     * @param {Number} a angle to rotate around, in radians\n     * @return {Point} output point\n     */\n    rotate:  function(a) { return this.clone()._rotate(a); },\n\n    /**\n     * Rotate this point around p point by an angle a,\n     * given in radians\n     * @param {Number} a angle to rotate around, in radians\n     * @param {Point} p Point to rotate around\n     * @return {Point} output point\n     */\n    rotateAround:  function(a,p) { return this.clone()._rotateAround(a,p); },\n\n    /**\n     * Multiply this point by a 4x1 transformation matrix\n     * @param {Array<Number>} m transformation matrix\n     * @return {Point} output point\n     */\n    matMult: function(m) { return this.clone()._matMult(m); },\n\n    /**\n     * Calculate this point but as a unit vector from 0, 0, meaning\n     * that the distance from the resulting point to the 0, 0\n     * coordinate will be equal to 1 and the angle from the resulting\n     * point to the 0, 0 coordinate will be the same as before.\n     * @return {Point} unit vector point\n     */\n    unit:    function() { return this.clone()._unit(); },\n\n    /**\n     * Compute a perpendicular point, where the new y coordinate\n     * is the old x coordinate and the new x coordinate is the old y\n     * coordinate multiplied by -1\n     * @return {Point} perpendicular point\n     */\n    perp:    function() { return this.clone()._perp(); },\n\n    /**\n     * Return a version of this point with the x & y coordinates\n     * rounded to integers.\n     * @return {Point} rounded point\n     */\n    round:   function() { return this.clone()._round(); },\n\n    /**\n     * Return the magitude of this point: this is the Euclidean\n     * distance from the 0, 0 coordinate to this point's x and y\n     * coordinates.\n     * @return {Number} magnitude\n     */\n    mag: function() {\n        return Math.sqrt(this.x * this.x + this.y * this.y);\n    },\n\n    /**\n     * Judge whether this point is equal to another point, returning\n     * true or false.\n     * @param {Point} other the other point\n     * @return {boolean} whether the points are equal\n     */\n    equals: function(other) {\n        return this.x === other.x &&\n               this.y === other.y;\n    },\n\n    /**\n     * Calculate the distance from this point to another point\n     * @param {Point} p the other point\n     * @return {Number} distance\n     */\n    dist: function(p) {\n        return Math.sqrt(this.distSqr(p));\n    },\n\n    /**\n     * Calculate the distance from this point to another point,\n     * without the square root step. Useful if you're comparing\n     * relative distances.\n     * @param {Point} p the other point\n     * @return {Number} distance\n     */\n    distSqr: function(p) {\n        var dx = p.x - this.x,\n            dy = p.y - this.y;\n        return dx * dx + dy * dy;\n    },\n\n    /**\n     * Get the angle from the 0, 0 coordinate to this point, in radians\n     * coordinates.\n     * @return {Number} angle\n     */\n    angle: function() {\n        return Math.atan2(this.y, this.x);\n    },\n\n    /**\n     * Get the angle from this point to another point, in radians\n     * @param {Point} b the other point\n     * @return {Number} angle\n     */\n    angleTo: function(b) {\n        return Math.atan2(this.y - b.y, this.x - b.x);\n    },\n\n    /**\n     * Get the angle between this point and another point, in radians\n     * @param {Point} b the other point\n     * @return {Number} angle\n     */\n    angleWith: function(b) {\n        return this.angleWithSep(b.x, b.y);\n    },\n\n    /*\n     * Find the angle of the two vectors, solving the formula for\n     * the cross product a x b = |a||b|sin(θ) for θ.\n     * @param {Number} x the x-coordinate\n     * @param {Number} y the y-coordinate\n     * @return {Number} the angle in radians\n     */\n    angleWithSep: function(x, y) {\n        return Math.atan2(\n            this.x * y - this.y * x,\n            this.x * x + this.y * y);\n    },\n\n    _matMult: function(m) {\n        var x = m[0] * this.x + m[1] * this.y,\n            y = m[2] * this.x + m[3] * this.y;\n        this.x = x;\n        this.y = y;\n        return this;\n    },\n\n    _add: function(p) {\n        this.x += p.x;\n        this.y += p.y;\n        return this;\n    },\n\n    _sub: function(p) {\n        this.x -= p.x;\n        this.y -= p.y;\n        return this;\n    },\n\n    _mult: function(k) {\n        this.x *= k;\n        this.y *= k;\n        return this;\n    },\n\n    _div: function(k) {\n        this.x /= k;\n        this.y /= k;\n        return this;\n    },\n\n    _multByPoint: function(p) {\n        this.x *= p.x;\n        this.y *= p.y;\n        return this;\n    },\n\n    _divByPoint: function(p) {\n        this.x /= p.x;\n        this.y /= p.y;\n        return this;\n    },\n\n    _unit: function() {\n        this._div(this.mag());\n        return this;\n    },\n\n    _perp: function() {\n        var y = this.y;\n        this.y = this.x;\n        this.x = -y;\n        return this;\n    },\n\n    _rotate: function(angle) {\n        var cos = Math.cos(angle),\n            sin = Math.sin(angle),\n            x = cos * this.x - sin * this.y,\n            y = sin * this.x + cos * this.y;\n        this.x = x;\n        this.y = y;\n        return this;\n    },\n\n    _rotateAround: function(angle, p) {\n        var cos = Math.cos(angle),\n            sin = Math.sin(angle),\n            x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y),\n            y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);\n        this.x = x;\n        this.y = y;\n        return this;\n    },\n\n    _round: function() {\n        this.x = Math.round(this.x);\n        this.y = Math.round(this.y);\n        return this;\n    }\n};\n\n/**\n * Construct a point from an array if necessary, otherwise if the input\n * is already a Point, or an unknown type, return it unchanged\n * @param {Array<Number>|Point|*} a any kind of input value\n * @return {Point} constructed point, or passed-through value.\n * @example\n * // this\n * var point = Point.convert([0, 1]);\n * // is equivalent to\n * var point = new Point(0, 1);\n */\nPoint.convert = function (a) {\n    if (a instanceof Point) {\n        return a;\n    }\n    if (Array.isArray(a)) {\n        return new Point(a[0], a[1]);\n    }\n    return a;\n};\n","// @flow\n\nimport {mat4} from 'gl-matrix';\n\nimport UnitBezier from '@mapbox/unitbezier';\n\nimport Point from '@mapbox/point-geometry';\nimport assert from 'assert';\n\nimport type {Callback} from '../types/callback.js';\nimport type {Mat4, Vec4} from 'gl-matrix';\n\nconst DEG_TO_RAD = Math.PI / 180;\nconst RAD_TO_DEG = 180 / Math.PI;\n\n/**\n * Converts an angle in degrees to radians\n * copy all properties from the source objects into the destination.\n * The last source object given overrides properties from previous\n * source objects.\n *\n * @param a angle to convert\n * @returns the angle in radians\n * @private\n */\nexport function degToRad(a: number): number {\n    return a * DEG_TO_RAD;\n}\n\n/**\n * Converts an angle in radians to degrees\n * copy all properties from the source objects into the destination.\n * The last source object given overrides properties from previous\n * source objects.\n *\n * @param a angle to convert\n * @returns the angle in degrees\n * @private\n */\nexport function radToDeg(a: number): number {\n    return a * RAD_TO_DEG;\n}\n\nconst TILE_CORNERS = [[0, 0], [1, 0], [1, 1], [0, 1]];\n\n/**\n * Given a particular bearing, returns the corner of the tile thats farthest\n * along the bearing.\n *\n * @param {number} bearing angle in degrees (-180, 180]\n * @returns {QuadCorner}\n * @private\n */\nexport function furthestTileCorner(bearing: number): [number, number] {\n    const alignedBearing = ((bearing + 45) + 360) % 360;\n    const cornerIdx = Math.round(alignedBearing / 90) % 4;\n    return TILE_CORNERS[cornerIdx];\n}\n\n/**\n * @module util\n * @private\n */\n\n/**\n * Given a value `t` that varies between 0 and 1, return\n * an interpolation function that eases between 0 and 1 in a pleasing\n * cubic in-out fashion.\n *\n * @private\n */\nexport function easeCubicInOut(t: number): number {\n    if (t <= 0) return 0;\n    if (t >= 1) return 1;\n    const t2 = t * t,\n        t3 = t2 * t;\n    return 4 * (t < 0.5 ? t3 : 3 * (t - t2) + t3 - 0.75);\n}\n\n/**\n * Computes an AABB for a set of points.\n *\n * @param {Point[]} points\n * @returns {{ min: Point, max: Point}}\n * @private\n */\nexport function getBounds(points: Point[]): { min: Point, max: Point} {\n    let minX = Infinity;\n    let minY = Infinity;\n    let maxX = -Infinity;\n    let maxY = -Infinity;\n    for (const p of points) {\n        minX = Math.min(minX, p.x);\n        minY = Math.min(minY, p.y);\n        maxX = Math.max(maxX, p.x);\n        maxY = Math.max(maxY, p.y);\n    }\n\n    return {\n        min: new Point(minX, minY),\n        max: new Point(maxX, maxY),\n    };\n}\n\n/**\n * Returns the square of the 2D distance between an AABB defined by min and max and a point.\n * If point is null or undefined, the AABB distance from the origin (0,0) is returned.\n *\n * @param {Array<number>} min The minimum extent of the AABB.\n * @param {Array<number>} max The maximum extent of the AABB.\n * @param {Array<number>} [point] The point to compute the distance from, may be undefined.\n * @returns {number} The square distance from the AABB, 0.0 if the AABB contains the point.\n */\nexport function getAABBPointSquareDist(min: Array<number>, max: Array<number>, point: ?Array<number>): number {\n    let sqDist = 0.0;\n\n    for (let i = 0; i < 2; ++i) {\n        const v = point ? point[i] : 0.0;\n        assert(min[i] < max[i], 'Invalid aabb min and max inputs, min[i] must be < max[i].');\n        if (min[i] > v) sqDist += (min[i] - v) * (min[i] - v);\n        if (max[i] < v) sqDist += (v - max[i]) * (v - max[i]);\n    }\n\n    return sqDist;\n}\n\n/**\n * Converts a AABB into a polygon with clockwise winding order.\n *\n * @param {Point} min The top left point.\n * @param {Point} max The bottom right point.\n * @param {number} [buffer=0] The buffer width.\n * @param {boolean} [close=true] Whether to close the polygon or not.\n * @returns {Point[]} The polygon.\n */\nexport function polygonizeBounds(min: Point, max: Point, buffer: number = 0, close: boolean = true): Point[] {\n    const offset = new Point(buffer, buffer);\n    const minBuf = min.sub(offset);\n    const maxBuf = max.add(offset);\n    const polygon = [minBuf, new Point(maxBuf.x, minBuf.y), maxBuf, new Point(minBuf.x, maxBuf.y)];\n\n    if (close) {\n        polygon.push(minBuf.clone());\n    }\n    return polygon;\n}\n\n/**\n * Takes a convex ring and expands it outward by applying a buffer around it.\n * This function assumes that the ring is in clockwise winding order.\n *\n * @param {Point[]} ring The input ring.\n * @param {number} buffer The buffer width.\n * @returns {Point[]} The expanded ring.\n */\nexport function bufferConvexPolygon(ring: Point[], buffer: number): Point[] {\n    assert(ring.length > 2, 'bufferConvexPolygon requires the ring to have atleast 3 points');\n    const output = [];\n    for (let currIdx = 0; currIdx < ring.length; currIdx++) {\n        const prevIdx = wrap(currIdx - 1, -1, ring.length - 1);\n        const nextIdx = wrap(currIdx + 1, -1, ring.length - 1);\n        const prev = ring[prevIdx];\n        const curr = ring[currIdx];\n        const next = ring[nextIdx];\n        const p1 = prev.sub(curr).unit();\n        const p2 = next.sub(curr).unit();\n        const interiorAngle = p2.angleWithSep(p1.x, p1.y);\n        // Calcuate a vector that points in the direction of the angle bisector between two sides.\n        // Scale it based on a right angled triangle constructed at that corner.\n        const offset = p1.add(p2).unit().mult(-1 * buffer / Math.sin(interiorAngle / 2));\n        output.push(curr.add(offset));\n    }\n    return output;\n}\n\ntype EaseFunction = (t: number) => number;\n\n/**\n * Given given (x, y), (x1, y1) control points for a bezier curve,\n * return a function that interpolates along that curve.\n *\n * @param p1x control point 1 x coordinate\n * @param p1y control point 1 y coordinate\n * @param p2x control point 2 x coordinate\n * @param p2y control point 2 y coordinate\n * @private\n */\nexport function bezier(p1x: number, p1y: number, p2x: number, p2y: number): EaseFunction {\n    const bezier = new UnitBezier(p1x, p1y, p2x, p2y);\n    return function(t: number) {\n        return bezier.solve(t);\n    };\n}\n\n/**\n * A default bezier-curve powered easing function with\n * control points (0.25, 0.1) and (0.25, 1)\n *\n * @private\n */\nexport const ease: EaseFunction = bezier(0.25, 0.1, 0.25, 1);\n\n/**\n * constrain n to the given range via min + max\n *\n * @param n value\n * @param min the minimum value to be returned\n * @param max the maximum value to be returned\n * @returns the clamped value\n * @private\n */\nexport function clamp(n: number, min: number, max: number): number {\n    return Math.min(max, Math.max(min, n));\n}\n\n/**\n * Equivalent to GLSL smoothstep.\n *\n * @param {number} e0 The lower edge of the sigmoid\n * @param {number} e1 The upper edge of the sigmoid\n * @param {number} x the value to be interpolated\n * @returns {number} in the range [0, 1]\n * @private\n */\nexport function smoothstep(e0: number, e1: number, x: number): number {\n    x = clamp((x - e0) / (e1 - e0), 0, 1);\n    return x * x * (3 - 2 * x);\n}\n\n/**\n * constrain n to the given range, excluding the minimum, via modular arithmetic\n *\n * @param n value\n * @param min the minimum value to be returned, exclusive\n * @param max the maximum value to be returned, inclusive\n * @returns constrained number\n * @private\n */\nexport function wrap(n: number, min: number, max: number): number {\n    const d = max - min;\n    const w = ((n - min) % d + d) % d + min;\n    return (w === min) ? max : w;\n}\n\n/**\n * Computes shortest angle in range [-180, 180) between two angles.\n *\n * @param {*} a First angle in degrees\n * @param {*} b Second angle in degrees\n * @returns Shortest angle\n * @private\n */\nexport function shortestAngle(a: number, b: number): number {\n    const diff = (b - a + 180) % 360 - 180;\n    return diff < -180 ? diff + 360 : diff;\n}\n\n/*\n * Call an asynchronous function on an array of arguments,\n * calling `callback` with the completed results of all calls.\n *\n * @param array input to each call of the async function.\n * @param fn an async function with signature (data, callback)\n * @param callback a callback run after all async work is done.\n * called with an array, containing the results of each async call.\n * @private\n */\nexport function asyncAll<Item, Result>(\n    array: Array<Item>,\n    fn: (item: Item, fnCallback: Callback<Result>) => void,\n    callback: Callback<Array<Result>>\n): void {\n    if (!array.length) { return callback(null, []); }\n    let remaining = array.length;\n    const results = new Array(array.length);\n    let error = null;\n    array.forEach((item, i) => {\n        fn(item, (err, result) => {\n            if (err) error = err;\n            results[i] = ((result: any): Result); // https://github.com/facebook/flow/issues/2123\n            if (--remaining === 0) callback(error, results);\n        });\n    });\n}\n\n/*\n * Polyfill for Object.values. Not fully spec compliant, but we don't\n * need it to be.\n *\n * @private\n */\nexport function values<T>(obj: {[key: string]: T}): Array<T> {\n    const result = [];\n    for (const k in obj) {\n        result.push(obj[k]);\n    }\n    return result;\n}\n\n/*\n * Compute the difference between the keys in one object and the keys\n * in another object.\n *\n * @returns keys difference\n * @private\n */\nexport function keysDifference<S, T>(obj: {[key: string]: S}, other: {[key: string]: T}): Array<string> {\n    const difference = [];\n    for (const i in obj) {\n        if (!(i in other)) {\n            difference.push(i);\n        }\n    }\n    return difference;\n}\n\n/**\n * Given a destination object and optionally many source objects,\n * copy all properties from the source objects into the destination.\n * The last source object given overrides properties from previous\n * source objects.\n *\n * @param dest destination object\n * @param sources sources from which properties are pulled\n * @private\n */\nexport function extend(dest: Object, ...sources: Array<?Object>): Object {\n    for (const src of sources) {\n        for (const k in src) {\n            dest[k] = src[k];\n        }\n    }\n    return dest;\n}\n\n/**\n * Given an object and a number of properties as strings, return version\n * of that object with only those properties.\n *\n * @param src the object\n * @param properties an array of property names chosen\n * to appear on the resulting object.\n * @returns object with limited properties.\n * @example\n * var foo = { name: 'Charlie', age: 10 };\n * var justName = pick(foo, ['name']);\n * // justName = { name: 'Charlie' }\n * @private\n */\nexport function pick(src: Object, properties: Array<string>): Object {\n    const result = {};\n    for (let i = 0; i < properties.length; i++) {\n        const k = properties[i];\n        if (k in src) {\n            result[k] = src[k];\n        }\n    }\n    return result;\n}\n\nlet id = 1;\n\n/**\n * Return a unique numeric id, starting at 1 and incrementing with\n * each call.\n *\n * @returns unique numeric id.\n * @private\n */\nexport function uniqueId(): number {\n    return id++;\n}\n\n/**\n * Return a random UUID (v4). Taken from: https://gist.github.com/jed/982883\n * @private\n */\nexport function uuid(): string {\n    function b(a: void) {\n        return a ? (a ^ Math.random() * (16 >> a / 4)).toString(16) :\n        //$FlowFixMe: Flow doesn't like the implied array literal conversion here\n            ([1e7] + -[1e3] + -4e3 + -8e3 + -1e11).replace(/[018]/g, b);\n    }\n    return b();\n}\n\n/**\n * Return whether a given value is a power of two\n * @private\n */\nexport function isPowerOfTwo(value: number): boolean {\n    return (Math.log(value) / Math.LN2) % 1 === 0;\n}\n\n/**\n * Return the next power of two, or the input value if already a power of two\n * @private\n */\nexport function nextPowerOfTwo(value: number): number {\n    if (value <= 1) return 1;\n    return Math.pow(2, Math.ceil(Math.log(value) / Math.LN2));\n}\n\n/**\n * Return the previous power of two, or the input value if already a power of two\n * @private\n */\nexport function prevPowerOfTwo(value: number): number {\n    if (value <= 1) return 1;\n    return Math.pow(2, Math.floor(Math.log(value) / Math.LN2));\n}\n\n/**\n * Validate a string to match UUID(v4) of the\n * form: xxxxxxxx-xxxx-4xxx-[89ab]xxx-xxxxxxxxxxxx\n * @param str string to validate.\n * @private\n */\nexport function validateUuid(str: ?string): boolean {\n    return str ? /^[0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(str) : false;\n}\n\n/**\n * Given an array of member function names as strings, replace all of them\n * with bound versions that will always refer to `context` as `this`. This\n * is useful for classes where otherwise event bindings would reassign\n * `this` to the evented object or some other value: this lets you ensure\n * the `this` value always.\n *\n * @param fns list of member function names\n * @param context the context value\n * @example\n * function MyClass() {\n *   bindAll(['ontimer'], this);\n *   this.name = 'Tom';\n * }\n * MyClass.prototype.ontimer = function() {\n *   alert(this.name);\n * };\n * var myClass = new MyClass();\n * setTimeout(myClass.ontimer, 100);\n * @private\n */\nexport function bindAll(fns: Array<string>, context: Object): void {\n    fns.forEach((fn) => {\n        if (!context[fn]) { return; }\n        context[fn] = context[fn].bind(context);\n    });\n}\n\n/**\n * Determine if a string ends with a particular substring\n *\n * @private\n */\nexport function endsWith(string: string, suffix: string): boolean {\n    return string.indexOf(suffix, string.length - suffix.length) !== -1;\n}\n\n/**\n * Create an object by mapping all the values of an existing object while\n * preserving their keys.\n *\n * @private\n */\n// $FlowFixMe[missing-this-annot]\nexport function mapObject(input: Object, iterator: Function, context?: Object): Object {\n    const output = {};\n    for (const key in input) {\n        output[key] = iterator.call(context || this, input[key], key, input);\n    }\n    return output;\n}\n\n/**\n * Create an object by filtering out values of an existing object.\n *\n * @private\n */\n// $FlowFixMe[missing-this-annot]\nexport function filterObject(input: Object, iterator: Function, context?: Object): Object {\n    const output = {};\n    for (const key in input) {\n        if (iterator.call(context || this, input[key], key, input)) {\n            output[key] = input[key];\n        }\n    }\n    return output;\n}\n\nimport deepEqual from '../style-spec/util/deep_equal.js';\nexport {deepEqual};\n\n/**\n * Deeply clones two objects.\n *\n * @private\n */\nexport function clone<T>(input: T): T {\n    if (Array.isArray(input)) {\n        return ((input.map(clone): any): T);\n    } else if (typeof input === 'object' && input) {\n        return ((mapObject(input, clone): any): T);\n    } else {\n        return input;\n    }\n}\n\n/**\n * Maps a value from a range between [min, max] to the range [outMin, outMax]\n *\n * @private\n */\nexport function mapValue(value: number, min: number, max: number, outMin: number, outMax: number): number {\n    return clamp((value - min) / (max - min) * (outMax - outMin) + outMin, outMin, outMax);\n}\n\n/**\n * Check if two arrays have at least one common element.\n *\n * @private\n */\nexport function arraysIntersect<T>(a: Array<T>, b: Array<T>): boolean {\n    for (let l = 0; l < a.length; l++) {\n        if (b.indexOf(a[l]) >= 0) return true;\n    }\n    return false;\n}\n\n/**\n * Print a warning message to the console and ensure duplicate warning messages\n * are not printed.\n *\n * @private\n */\nconst warnOnceHistory: {[key: string]: boolean} = {};\n\nexport function warnOnce(message: string): void {\n    if (!warnOnceHistory[message]) {\n        // console isn't defined in some WebWorkers, see #2558\n        if (typeof console !== \"undefined\") console.warn(message);\n        warnOnceHistory[message] = true;\n    }\n}\n\n/**\n * Indicates if the provided Points are in a counter clockwise (true) or clockwise (false) order\n *\n * @private\n * @returns true for a counter clockwise set of points\n */\n// http://bryceboe.com/2006/10/23/line-segment-intersection-algorithm/\nexport function isCounterClockwise(a: Point, b: Point, c: Point): boolean {\n    return (c.y - a.y) * (b.x - a.x) > (b.y - a.y) * (c.x - a.x);\n}\n\n/**\n * Returns the signed area for the polygon ring.  Postive areas are exterior rings and\n * have a clockwise winding.  Negative areas are interior rings and have a counter clockwise\n * ordering.\n *\n * @private\n * @param ring Exterior or interior ring\n */\nexport function calculateSignedArea(ring: Array<Point>): number {\n    let sum = 0;\n    for (let i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {\n        p1 = ring[i];\n        p2 = ring[j];\n        sum += (p2.x - p1.x) * (p1.y + p2.y);\n    }\n    return sum;\n}\n\nexport type Position = {\n    x: number,\n    y: number,\n    z: number,\n    azimuthal: number,\n    polar: number,\n};\n\nexport type Direction = {\n    x: number,\n    y: number,\n    z: number\n};\n\n/**\n * Converts spherical coordinates to cartesian position coordinates.\n *\n * @private\n * @param spherical Spherical coordinates, in [radial, azimuthal, polar]\n * @return Position cartesian coordinates\n */\nexport function sphericalPositionToCartesian([r, azimuthal, polar]: [number, number, number]): Position {\n    // We abstract \"north\"/\"up\" (compass-wise) to be 0° when really this is 90° (π/2):\n    // correct for that here\n    const a = degToRad(azimuthal + 90), p = degToRad(polar);\n\n    return {\n        x: r * Math.cos(a) * Math.sin(p),\n        y: r * Math.sin(a) * Math.sin(p),\n        z: r * Math.cos(p),\n        azimuthal, polar\n    };\n}\n\n/**\n * Converts spherical direction to cartesian coordinates.\n *\n * @private\n * @param spherical Spherical direction, in [azimuthal, polar]\n * @return Direction cartesian direction\n */\nexport function sphericalDirectionToCartesian([azimuthal, polar]: [number, number, number]): Direction {\n    const position = sphericalPositionToCartesian([1.0, azimuthal, polar]);\n\n    return {\n        x: position.x,\n        y: position.y,\n        z: position.z\n    };\n}\n\nexport function cartesianPositionToSpherical(x: number, y: number, z: number): [number, number, number] {\n    const radial = Math.sqrt(x * x + y * y + z * z);\n    const polar = radial > 0.0 ? Math.acos(z / radial) * RAD_TO_DEG : 0.0;\n    // Domain error may occur if x && y are both 0.0\n    let azimuthal = (x !== 0.0 || y !== 0.0) ? Math.atan2(-y, -x) * RAD_TO_DEG + 90.0 : 0.0;\n\n    if (azimuthal < 0.0) {\n        azimuthal += 360.0;\n    }\n\n    return [radial, azimuthal, polar];\n}\n\n/* global WorkerGlobalScope */\n/**\n *  Returns true if run in the web-worker context.\n *\n * @private\n * @returns {boolean}\n */\nexport function isWorker(): boolean {\n    return typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' &&\n           self instanceof WorkerGlobalScope;\n}\n\n/**\n * Parses data from 'Cache-Control' headers.\n *\n * @private\n * @param cacheControl Value of 'Cache-Control' header\n * @return object containing parsed header info.\n */\n\nexport function parseCacheControl(cacheControl: string): Object {\n    // Taken from [Wreck](https://github.com/hapijs/wreck)\n    const re = /(?:^|(?:\\s*\\,\\s*))([^\\x00-\\x20\\(\\)<>@\\,;\\:\\\\\"\\/\\[\\]\\?\\=\\{\\}\\x7F]+)(?:\\=(?:([^\\x00-\\x20\\(\\)<>@\\,;\\:\\\\\"\\/\\[\\]\\?\\=\\{\\}\\x7F]+)|(?:\\\"((?:[^\"\\\\]|\\\\.)*)\\\")))?/g;\n\n    const header = {};\n    cacheControl.replace(re, ($0, $1, $2, $3) => {\n        const value = $2 || $3;\n        header[$1] = value ? value.toLowerCase() : true;\n        return '';\n    });\n\n    if (header['max-age']) {\n        const maxAge = parseInt(header['max-age'], 10);\n        if (isNaN(maxAge)) delete header['max-age'];\n        else header['max-age'] = maxAge;\n    }\n\n    return header;\n}\n\nlet _isSafari = null;\n\nexport function _resetSafariCheckForTest() {\n    _isSafari = null;\n}\n\n/**\n * Returns true when run in WebKit derived browsers.\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n *\n * @private\n * @param scope {WindowOrWorkerGlobalScope} Since this function is used both on the main thread and WebWorker context,\n *      let the calling scope pass in the global scope object.\n * @returns {boolean}\n */\nexport function isSafari(scope: any): boolean {\n    if (_isSafari == null) {\n        const userAgent = scope.navigator ? scope.navigator.userAgent : null;\n        _isSafari = !!scope.safari ||\n        !!(userAgent && (/\\b(iPad|iPhone|iPod)\\b/.test(userAgent) || (!!userAgent.match('Safari') && !userAgent.match('Chrome'))));\n    }\n    return _isSafari;\n}\n\nexport function isSafariWithAntialiasingBug(scope: any): ?boolean {\n    const userAgent = scope.navigator ? scope.navigator.userAgent : null;\n    if (!isSafari(scope)) return false;\n    // 15.4 is known to be buggy.\n    // 15.5 may or may not include the fix. Mark it as buggy to be on the safe side.\n    return userAgent && (userAgent.match('Version/15.4') || userAgent.match('Version/15.5') || userAgent.match(/CPU (OS|iPhone OS) (15_4|15_5) like Mac OS X/));\n}\n\nexport function isFullscreen(): boolean {\n    return !!document.fullscreenElement || !!(document: any).webkitFullscreenElement;\n}\n\nexport function storageAvailable(type: string): boolean {\n    try {\n        const storage = self[type];\n        storage.setItem('_mapbox_test_', 1);\n        storage.removeItem('_mapbox_test_');\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\n\n// The following methods are from https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem\n//Unicode compliant base64 encoder for strings\nexport function b64EncodeUnicode(str: string): string {\n    return btoa(\n        encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,\n            (match, p1) => {\n                return String.fromCharCode(Number('0x' + p1)); //eslint-disable-line\n            }\n        )\n    );\n}\n\n// Unicode compliant decoder for base64-encoded strings\nexport function b64DecodeUnicode(str: string): string {\n    return decodeURIComponent(atob(str).split('').map((c) => {\n        return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); //eslint-disable-line\n    }).join(''));\n}\n\nexport function base64DecToArr(sBase64: string): Uint8Array {\n    const str = atob(sBase64);\n    const arr = new Uint8Array(str.length);\n    for (let i = 0; i < str.length; i++) arr[i] = str.codePointAt(i);\n    return arr;\n}\n\nexport function getColumn(matrix: Mat4, col: number): Vec4 {\n    return [matrix[col * 4], matrix[col * 4 + 1], matrix[col * 4 + 2], matrix[col * 4 + 3]];\n}\n\nexport function setColumn(matrix: Mat4, col: number, values: Vec4) {\n    matrix[col * 4 + 0] = values[0];\n    matrix[col * 4 + 1] = values[1];\n    matrix[col * 4 + 2] = values[2];\n    matrix[col * 4 + 3] = values[3];\n}\n\nexport function sRGBToLinearAndScale(v: [number, number, number, number], s: number): [number, number, number] {\n    return [\n        Math.pow(v[0], 2.2) * s,\n        Math.pow(v[1], 2.2) * s,\n        Math.pow(v[2], 2.2) * s\n    ];\n}\n\nexport function linearVec3TosRGB(v: [number, number, number]): [number, number, number] {\n    return [\n        Math.pow(v[0], 1.0 / 2.2),\n        Math.pow(v[1], 1.0 / 2.2),\n        Math.pow(v[2], 1.0 / 2.2)\n    ];\n}\n\nexport function lowerBound(array: number[], startIndex: number, finishIndex: number, target: number): number {\n    while (startIndex < finishIndex) {\n        const middleIndex = (startIndex + finishIndex) >> 1;\n\n        if (array[middleIndex] < target) {\n            startIndex = middleIndex + 1;\n        } else {\n            finishIndex = middleIndex;\n        }\n    }\n\n    return startIndex;\n}\n\nexport function upperBound(array: number[], startIndex: number, finishIndex: number, target: number): number {\n    while (startIndex < finishIndex) {\n        const middleIndex = (startIndex + finishIndex) >> 1;\n\n        if (array[middleIndex] <= target) {\n            startIndex = middleIndex + 1;\n        } else {\n            finishIndex = middleIndex;\n        }\n    }\n\n    return startIndex;\n}\n\nexport function contrastFactor(contrast: number): number {\n    return contrast > 0 ?\n        1 / (1.001 - contrast) :\n        1 + contrast;\n}\n\nexport function saturationFactor(saturation: number): number {\n    return saturation > 0 ?\n        1 - 1 / (1.001 - saturation) :\n        -saturation;\n}\n\n/**\n * Given the inputs creates a matrix that when applied to a color can\n * change its saturation, contrast and brightness levels.\n * This results in the same behaviour that happens in raster.fragment.glsl\n *\n * @param saturation Saturation level ranging from -1 to 1.\n * @param contrast Contrast level ranging from -1 to 1.\n * @param brightnessMin Minimum brightness ranging from 0 to 1.\n * @param brightnessMax Maximum brightness ranging from 0 to 1.\n * @returns Matrix that adjusts saturation, contrast and brightness of a color.\n * @private\n */\nexport function computeColorAdjustmentMatrix(saturation: number, contrast: number, brightnessMin: number, brightnessMax: number): Float32Array {\n    saturation = saturationFactor(saturation);\n    contrast = contrastFactor(contrast);\n\n    const m = mat4.create();\n\n    /*hueAngle *= Math.PI / 180;\n    const s = Math.sin(hueAngle);\n    const c = Math.cos(hueAngle);\n    const x = (2 * c + 1) / 3;\n    const y = (-c - Math.sqrt(3) * s + 1) / 3;\n    const z = (-c + Math.sqrt(3) * s + 1) / 3;\n    const hueMatrix = [\n        x, z, y, 0,\n        y, x, z, 0,\n        z, y, x, 0,\n        0, 0, 0, 1\n    ];*/\n\n    const sa = saturation / 3.0;\n    const sb = 1.0 - 2.0 * sa;\n    const saturationMatrix = [\n        sb,  sa,  sa,  0.0,\n        sa,  sb,  sa,  0.0,\n        sa,  sa,  sb,  0.0,\n        0.0, 0.0, 0.0, 1.0\n    ];\n\n    const cs = 0.5 - 0.5 * contrast;\n    const contrastMatrix = [\n        contrast, 0.0,      0.0,      0.0,\n        0.0,      contrast, 0.0,      0.0,\n        0.0,      0.0,      contrast, 0.0,\n        cs,       cs,       cs,       1.0\n    ];\n\n    const hl = brightnessMax - brightnessMin;\n    const brightnessMatrix = [\n        hl,            0.0,           0.0,           0.0,\n        0.0,           hl,            0.0,           0.0,\n        0.0,           0.0,           hl,            0.0,\n        brightnessMin, brightnessMin, brightnessMin, 1.0\n    ];\n\n    mat4.multiply(m, brightnessMatrix, contrastMatrix);\n    mat4.multiply(m, m, saturationMatrix);\n    // mat4.multiply(m, m, hueMatrix);\n\n    return m;\n}\n","// @flow strict\nlet supportsOffscreenCanvas: ?boolean;\n\nexport default function offscreenCanvasSupported(): boolean {\n    if (supportsOffscreenCanvas == null) {\n        supportsOffscreenCanvas = self.OffscreenCanvas &&\n            new OffscreenCanvas(1, 1).getContext('2d') &&\n            typeof self.createImageBitmap === 'function';\n    }\n\n    return supportsOffscreenCanvas;\n}\n","// @flow strict\nimport assert from 'assert';\nimport offscreenCanvasSupported from './offscreen_canvas_supported.js';\nimport type {Cancelable} from '../types/cancelable.js';\n\nlet linkEl;\n\nlet reducedMotionQuery: MediaQueryList;\n\nlet stubTime: number | void;\n\nlet canvas;\n\nlet hasCanvasFingerprintNoise;\n\n/**\n * @private\n */\nconst exported = {\n    /**\n     * Returns either performance.now() or a value set by setNow.\n     * @returns {number} Time value in milliseconds.\n     */\n    now(): number {\n        if (stubTime !== undefined) {\n            return stubTime;\n        }\n        return performance.now();\n    },\n    setNow(time: number) {\n        stubTime = time;\n    },\n\n    restoreNow() {\n        stubTime = undefined;\n    },\n\n    frame(fn: (paintStartTimestamp: number) => void): Cancelable {\n        const frame = requestAnimationFrame(fn);\n        return {cancel: () => cancelAnimationFrame(frame)};\n    },\n\n    getImageData(img: CanvasImageSource, padding?: number = 0): ImageData {\n        const {width, height} = img;\n\n        if (!canvas) {\n            canvas = document.createElement('canvas');\n        }\n\n        const context = canvas.getContext('2d', {willReadFrequently: true});\n        if (!context) {\n            throw new Error('failed to create canvas 2d context');\n        }\n\n        if (width > canvas.width || height > canvas.height) {\n            canvas.width = width;\n            canvas.height = height;\n        }\n\n        context.clearRect(-padding, -padding, width + 2 * padding, height + 2 * padding);\n        context.drawImage(img, 0, 0, width, height);\n        return context.getImageData(-padding, -padding, width + 2 * padding, height + 2 * padding);\n    },\n\n    resolveURL(path: string): string {\n        if (!linkEl) linkEl = document.createElement('a');\n        linkEl.href = path;\n        return linkEl.href;\n    },\n\n    get devicePixelRatio(): number { return window.devicePixelRatio; },\n    get prefersReducedMotion(): boolean {\n        if (!window.matchMedia) return false;\n        // Lazily initialize media query.\n        if (reducedMotionQuery == null) {\n            reducedMotionQuery = window.matchMedia('(prefers-reduced-motion: reduce)');\n        }\n        return reducedMotionQuery.matches;\n    },\n\n    /**\n     * Returns true if the browser has OffscreenCanvas support and\n     * adds noise to Canvas2D operations used for image decoding to prevent fingerprinting.\n     */\n    hasCanvasFingerprintNoise(): boolean {\n        if (hasCanvasFingerprintNoise !== undefined) {\n            return hasCanvasFingerprintNoise;\n        }\n\n        if (!offscreenCanvasSupported()) {\n            hasCanvasFingerprintNoise = false;\n            return false;\n        }\n\n        assert(self.OffscreenCanvas, 'OffscreenCanvas is not supported');\n\n        const offscreenCanvas = new OffscreenCanvas(255 / 3, 1);\n        // $FlowFixMe[extra-arg] probably fixed in later versions of Flow\n        const offscreenCanvasContext = offscreenCanvas.getContext('2d', {willReadFrequently: true});\n        let inc = 0;\n        // getImageData is lossy with premultiplied alpha.\n        for (let i = 0; i < offscreenCanvas.width; ++i) {\n            offscreenCanvasContext.fillStyle = `rgba(${inc++},${inc++},${inc++}, 255)`;\n            offscreenCanvasContext.fillRect(i, 0, 1, 1);\n        }\n        const readData = offscreenCanvasContext.getImageData(0, 0, offscreenCanvas.width, offscreenCanvas.height);\n        inc = 0;\n        for (let i = 0; i < readData.data.length; ++i) {\n            if (i % 4 !== 3 && inc++ !== readData.data[i]) {\n                hasCanvasFingerprintNoise = true;\n                return true;\n            }\n        }\n        hasCanvasFingerprintNoise = false;\n        return false;\n    }\n};\n\nexport default exported;\n","// @flow\n\nexport function setQueryParameters(url: string, params: {[string]: string}): string {\n    const paramStart = url.indexOf('?');\n    if (paramStart < 0) return `${url}?${new URLSearchParams(params).toString()}`;\n\n    const searchParams = new URLSearchParams(url.slice(paramStart));\n    for (const key in params) {\n        searchParams.set(key, params[key]);\n    }\n\n    return `${url.slice(0, paramStart)}?${searchParams.toString()}`;\n}\n\ntype StripQueryParameters = {\n    persistentParams: string[]\n}\n\nexport function stripQueryParameters(url: string, params?: StripQueryParameters = {persistentParams: []}): string {\n    const paramStart = url.indexOf('?');\n    if (paramStart < 0) return url;\n\n    const nextParams = new URLSearchParams();\n    const searchParams = new URLSearchParams(url.slice(paramStart));\n    for (const param of params.persistentParams) {\n        const value = searchParams.get(param);\n        if (value) nextParams.set(param, value);\n    }\n\n    const nextParamsString = nextParams.toString();\n\n    return `${url.slice(0, paramStart)}${nextParamsString.length > 0 ? `?${nextParamsString}` : ''}`;\n}\n","// @flow\n\nimport {warnOnce, parseCacheControl} from './util.js';\nimport {stripQueryParameters, setQueryParameters} from './url.js';\n\nimport type Dispatcher from './dispatcher.js';\n\nconst CACHE_NAME = 'mapbox-tiles';\nlet cacheLimit = 500; // 50MB / (100KB/tile) ~= 500 tiles\nlet cacheCheckThreshold = 50;\n\nconst MIN_TIME_UNTIL_EXPIRY = 1000 * 60 * 7; // 7 minutes. Skip caching tiles with a short enough max age.\n\nexport type ResponseOptions = {\n    status: number,\n    statusText: string,\n    headers: Headers\n};\n\n// We're using a global shared cache object. Normally, requesting ad-hoc Cache objects is fine, but\n// Safari has a memory leak in which it fails to release memory when requesting keys() from a Cache\n// object. See https://bugs.webkit.org/show_bug.cgi?id=203991 for more information.\nlet sharedCache: ?Promise<Cache>;\n\nfunction getCaches() {\n    try {\n        return caches;\n    } catch (e) {\n        // <iframe sandbox> triggers exceptions when trying to access window.caches\n        // Chrome: DOMException, Safari: SecurityError, Firefox: NS_ERROR_FAILURE\n        // Seems more robust to catch all exceptions instead of trying to match only these.\n    }\n}\n\nfunction cacheOpen() {\n    const caches = getCaches();\n    if (caches && !sharedCache) {\n        sharedCache = caches.open(CACHE_NAME);\n    }\n}\n\n// We're never closing the cache, but our unit tests rely on changing out the global window.caches\n// object, so we have a function specifically for unit tests that allows resetting the shared cache.\nexport function cacheClose() {\n    sharedCache = undefined;\n}\n\nlet responseConstructorSupportsReadableStream;\nfunction prepareBody(response: Response, callback: ((body: ?(Blob | ReadableStream)) => void)) {\n    if (responseConstructorSupportsReadableStream === undefined) {\n        try {\n            new Response(new ReadableStream()); // eslint-disable-line no-undef\n            responseConstructorSupportsReadableStream = true;\n        } catch (e) {\n            // Edge\n            responseConstructorSupportsReadableStream = false;\n        }\n    }\n\n    if (responseConstructorSupportsReadableStream) {\n        callback(response.body);\n    } else {\n        response.blob().then(callback);\n    }\n}\n\nexport function cachePut(request: Request, response: Response, requestTime: number) {\n    cacheOpen();\n    if (!sharedCache) return;\n\n    const cacheControl = parseCacheControl(response.headers.get('Cache-Control') || '');\n    if (cacheControl['no-store']) return;\n\n    const options: ResponseOptions = {\n        status: response.status,\n        statusText: response.statusText,\n        headers: new Headers()\n    };\n\n    response.headers.forEach((v, k) => options.headers.set(k, v));\n\n    if (cacheControl['max-age']) {\n        options.headers.set('Expires', new Date(requestTime + cacheControl['max-age'] * 1000).toUTCString());\n    }\n\n    const expires = options.headers.get('Expires');\n    if (!expires) return;\n\n    const timeUntilExpiry = new Date(expires).getTime() - requestTime;\n    if (timeUntilExpiry < MIN_TIME_UNTIL_EXPIRY) return;\n\n    // preserve `language` and `worldview` params if any\n    let strippedURL = stripQueryParameters(request.url, {persistentParams: ['language', 'worldview']});\n\n    // Handle partial responses by keeping the range header in the query string\n    if (response.status === 206) {\n        const range = request.headers.get('Range');\n        if (!range) return;\n\n        options.status = 200;\n        strippedURL = setQueryParameters(strippedURL, {range});\n    }\n\n    prepareBody(response, body => {\n        // $FlowFixMe[incompatible-call]\n        const clonedResponse = new Response(body, options);\n\n        cacheOpen();\n        if (!sharedCache) return;\n        sharedCache\n            .then(cache => cache.put(strippedURL, clonedResponse))\n            .catch(e => warnOnce(e.message));\n    });\n}\n\nexport function cacheGet(request: Request, callback: (error: ?any, response: ?Response, fresh: ?boolean) => void): void {\n    cacheOpen();\n    if (!sharedCache) return callback(null);\n\n    sharedCache\n        .then(cache => {\n            // preserve `language` and `worldview` params if any\n            let strippedURL = stripQueryParameters(request.url, {persistentParams: ['language', 'worldview']});\n\n            const range = request.headers.get('Range');\n            if (range) strippedURL = setQueryParameters(strippedURL, {range});\n\n            // manually strip URL instead of `ignoreSearch: true` because of a known\n            // performance issue in Chrome https://github.com/mapbox/mapbox-gl-js/issues/8431\n            cache.match(strippedURL)\n                .then(response => {\n                    const fresh = isFresh(response);\n\n                    // Reinsert into cache so that order of keys in the cache is the order of access.\n                    // This line makes the cache a LRU instead of a FIFO cache.\n                    cache.delete(strippedURL);\n                    if (fresh) {\n                        cache.put(strippedURL, response.clone());\n                    }\n\n                    callback(null, response, fresh);\n                })\n                .catch(callback);\n        })\n        .catch(callback);\n}\n\nfunction isFresh(response: Response) {\n    if (!response) return false;\n    const expires = new Date(response.headers.get('Expires') || 0);\n    const cacheControl = parseCacheControl(response.headers.get('Cache-Control') || '');\n    return expires > Date.now() && !cacheControl['no-cache'];\n}\n\n// `Infinity` triggers a cache check after the first tile is loaded\n// so that a check is run at least once on each page load.\nlet globalEntryCounter = Infinity;\n\n// The cache check gets run on a worker. The reason for this is that\n// profiling sometimes shows this as taking up significant time on the\n// thread it gets called from. And sometimes it doesn't. It *may* be\n// fine to run this on the main thread but out of caution this is being\n// dispatched on a worker. This can be investigated further in the future.\nexport function cacheEntryPossiblyAdded(dispatcher: Dispatcher) {\n    globalEntryCounter++;\n    if (globalEntryCounter > cacheCheckThreshold) {\n        dispatcher.getActor().send('enforceCacheSizeLimit', cacheLimit);\n        globalEntryCounter = 0;\n    }\n}\n\n// runs on worker, see above comment\nexport function enforceCacheSizeLimit(limit: number) {\n    cacheOpen();\n    if (!sharedCache) return;\n\n    sharedCache\n        .then(cache => {\n            cache.keys().then(keys => {\n                for (let i = 0; i < keys.length - limit; i++) {\n                    cache.delete(keys[i]);\n                }\n            });\n        });\n}\n\nexport function clearTileCache(callback?: (err: ?Error) => void) {\n    const caches = getCaches();\n    if (!caches) return;\n\n    const promise = caches.delete(CACHE_NAME);\n    if (callback) {\n        promise.catch(callback).then(() => callback());\n    }\n}\n\nexport function setCacheLimits(limit: number, checkThreshold: number) {\n    cacheLimit = limit;\n    cacheCheckThreshold = checkThreshold;\n}\n","// @flow strict\n\nconst exported = {\n    supported: false,\n    testSupport\n};\n\nexport default exported;\n\nlet glForTesting;\nlet webpCheckComplete = false;\nlet webpImgTest;\nlet webpImgTestOnloadComplete = false;\n\n/**\n * @note Expressions test suite run in Node.js and use this file\n */\nconst window = typeof self !== 'undefined' ? self : {};\n\nif (window.document) {\n    webpImgTest = window.document.createElement('img');\n    webpImgTest.onload = function() {\n        if (glForTesting) testWebpTextureUpload(glForTesting);\n        glForTesting = null;\n        webpImgTestOnloadComplete = true;\n    };\n    webpImgTest.onerror = function() {\n        webpCheckComplete = true;\n        glForTesting = null;\n    };\n    webpImgTest.src = 'data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA=';\n}\n\nfunction testSupport(gl: WebGL2RenderingContext) {\n    if (webpCheckComplete || !webpImgTest) return;\n\n    // HTMLImageElement.complete is set when an image is done loading it's source\n    // regardless of whether the load was successful or not.\n    // It's possible for an error to set HTMLImageElement.complete to true which would trigger\n    // testWebpTextureUpload and mistakenly set exported.supported to true in browsers which don't support webp\n    // To avoid this, we set a flag in the image's onload handler and only call testWebpTextureUpload\n    // after a successful image load event.\n    if (webpImgTestOnloadComplete) {\n        testWebpTextureUpload(gl);\n    } else {\n        glForTesting = gl;\n\n    }\n}\n\nfunction testWebpTextureUpload(gl: WebGL2RenderingContext) {\n    // Edge 18 supports WebP but not uploading a WebP image to a gl texture\n    // Test support for this before allowing WebP images.\n    // https://github.com/mapbox/mapbox-gl-js/issues/7671\n    const texture = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n\n    try {\n        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, webpImgTest);\n\n        // The error does not get triggered in Edge if the context is lost\n        if (gl.isContextLost()) return;\n\n        exported.supported = true;\n    } catch (e) {\n        // Catch \"Unspecified Error.\" in Edge 18.\n    }\n\n    gl.deleteTexture(texture);\n\n    webpCheckComplete = true;\n}\n","// @flow\n\nimport {extend, warnOnce, isWorker} from './util.js';\nimport {isMapboxHTTPURL, hasCacheDefeatingSku} from './mapbox_url.js';\nimport config from './config.js';\nimport assert from 'assert';\nimport {cacheGet, cachePut} from './tile_request_cache.js';\nimport webpSupported from './webp_supported.js';\n\nimport type {Callback} from '../types/callback.js';\nimport type {Cancelable} from '../types/cancelable.js';\n\n/**\n * The type of a resource.\n * @private\n * @readonly\n * @enum {string}\n */\nconst ResourceType = {\n    Unknown: 'Unknown',\n    Style: 'Style',\n    Source: 'Source',\n    Tile: 'Tile',\n    Glyphs: 'Glyphs',\n    SpriteImage: 'SpriteImage',\n    SpriteJSON: 'SpriteJSON',\n    Image: 'Image',\n    Model: 'Model'\n};\nexport {ResourceType};\n\nif (typeof Object.freeze == 'function') {\n    Object.freeze(ResourceType);\n}\n\n/**\n * A `RequestParameters` object to be returned from Map.options.transformRequest callbacks.\n * @typedef {Object} RequestParameters\n * @property {string} url The URL to be requested.\n * @property {Object} headers The headers to be sent with the request.\n * @property {string} method Request method `'GET' | 'POST' | 'PUT'`.\n * @property {string} body Request body.\n * @property {string} type Response body type to be returned `'string' | 'json' | 'arrayBuffer'`.\n * @property {string} credentials `'same-origin'|'include'` Use 'include' to send cookies with cross-origin requests.\n * @property {boolean} collectResourceTiming If true, Resource Timing API information will be collected for these transformed requests and returned in a resourceTiming property of relevant data events.\n * @property {string} referrerPolicy A string representing the request's referrerPolicy. For more information and possible values, see the [Referrer-Policy HTTP header page](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy).\n * @example\n * // use transformRequest to modify requests that begin with `http://myHost`\n * const map = new Map({\n *     container: 'map',\n *     style: 'mapbox://styles/mapbox/streets-v11',\n *     transformRequest: (url, resourceType) => {\n *         if (resourceType === 'Source' && url.indexOf('http://myHost') > -1) {\n *             return {\n *                 url: url.replace('http', 'https'),\n *                 headers: {'my-custom-header': true},\n *                 credentials: 'include'  // Include cookies for cross-origin requests\n *             };\n *         }\n *     }\n * });\n *\n */\nexport type RequestParameters = {\n    url: string,\n    headers?: Object,\n    method?: 'GET' | 'POST' | 'PUT',\n    body?: string,\n    type?: 'string' | 'json' | 'arrayBuffer',\n    credentials?: 'same-origin' | 'include',\n    collectResourceTiming?: boolean,\n    referrerPolicy?: ReferrerPolicyType\n}\n\nexport type ResponseCallback<T> = (error: ?Error, data: ?T, cacheControl: ?string, expires: ?string) => void;\n\nexport class AJAXError extends Error {\n    status: number;\n    url: string;\n    constructor(message: string, status: number, url: string) {\n        if (status === 401 && isMapboxHTTPURL(url)) {\n            message += ': you may have provided an invalid Mapbox access token. See https://docs.mapbox.com/api/overview/#access-tokens-and-token-scopes';\n        }\n        super(message);\n        this.status = status;\n        this.url = url;\n    }\n\n    toString(): string {\n        return `${this.name}: ${this.message} (${this.status}): ${this.url}`;\n    }\n}\n\n// Ensure that we're sending the correct referrer from blob URL worker bundles.\n// For files loaded from the local file system, `location.origin` will be set\n// to the string(!) \"null\" (Firefox), or \"file://\" (Chrome, Safari, Edge, IE),\n// and we will set an empty referrer. Otherwise, we're using the document's URL.\nexport const getReferrer: (() => string) = isWorker() ?\n    () => self.worker && self.worker.referrer :\n    () => (location.protocol === 'blob:' ? parent : self).location.href;\n\n// Determines whether a URL is a file:// URL. This is obviously the case if it begins\n// with file://. Relative URLs are also file:// URLs iff the original document was loaded\n// via a file:// URL.\nconst isFileURL = (url: string) => /^file:/.test(url) || (/^file:/.test(getReferrer()) && !/^\\w+:/.test(url));\n\nfunction makeFetchRequest(requestParameters: RequestParameters, callback: ResponseCallback<any>): Cancelable {\n    const controller = new AbortController();\n    const request = new Request(requestParameters.url, {\n        method: requestParameters.method || 'GET',\n        body: requestParameters.body,\n        credentials: requestParameters.credentials,\n        headers: requestParameters.headers,\n        referrer: getReferrer(),\n        referrerPolicy: requestParameters.referrerPolicy,\n        signal: controller.signal\n    });\n    let complete = false;\n    let aborted = false;\n\n    const cacheIgnoringSearch = hasCacheDefeatingSku(request.url);\n\n    if (requestParameters.type === 'json') {\n        request.headers.set('Accept', 'application/json');\n    }\n\n    const validateOrFetch = (err: ?Error, cachedResponse: ?Response, responseIsFresh: ?boolean) => {\n        if (aborted) return;\n\n        if (err) {\n            // Do fetch in case of cache error.\n            // HTTP pages in Edge trigger a security error that can be ignored.\n            if (err.message !== 'SecurityError') {\n                warnOnce(err.toString());\n            }\n        }\n\n        if (cachedResponse && responseIsFresh) {\n            return finishRequest(cachedResponse);\n        }\n\n        if (cachedResponse) {\n            // We can't do revalidation with 'If-None-Match' because then the\n            // request doesn't have simple cors headers.\n        }\n\n        const requestTime = Date.now();\n\n        fetch(request).then(response => {\n            if (response.ok) {\n                const cacheableResponse = cacheIgnoringSearch ? response.clone() : null;\n                return finishRequest(response, cacheableResponse, requestTime);\n            } else {\n                return callback(new AJAXError(response.statusText, response.status, requestParameters.url));\n            }\n        }).catch(error => {\n            if (error.name === 'AbortError') {\n                // silence expected AbortError\n                return;\n            }\n            callback(new Error(`${error.message} ${requestParameters.url}`));\n        });\n    };\n\n    const finishRequest = (response: Response, cacheableResponse: ?Response, requestTime: ?number) => {\n        (\n            requestParameters.type === 'arrayBuffer' ? response.arrayBuffer() :\n            requestParameters.type === 'json' ? response.json() :\n            response.text()\n        ).then(result => {\n            if (aborted) return;\n            if (cacheableResponse && requestTime) {\n                // The response needs to be inserted into the cache after it has completely loaded.\n                // Until it is fully loaded there is a chance it will be aborted. Aborting while\n                // reading the body can cause the cache insertion to error. We could catch this error\n                // in most browsers but in Firefox it seems to sometimes crash the tab. Adding\n                // it to the cache here avoids that error.\n                cachePut(request, cacheableResponse, requestTime);\n            }\n            complete = true;\n            callback(null, result, response.headers.get('Cache-Control'), response.headers.get('Expires'));\n        }).catch(err => {\n            if (!aborted) callback(new Error(err.message));\n        });\n    };\n\n    if (cacheIgnoringSearch) {\n        cacheGet(request, validateOrFetch);\n    } else {\n        validateOrFetch(null, null);\n    }\n\n    return {cancel: () => {\n        aborted = true;\n        if (!complete) controller.abort();\n    }};\n}\n\nfunction makeXMLHttpRequest(requestParameters: RequestParameters, callback: ResponseCallback<any>): Cancelable {\n    const xhr: XMLHttpRequest = new XMLHttpRequest();\n    xhr.open(requestParameters.method || 'GET', requestParameters.url, true);\n    if (requestParameters.type === 'arrayBuffer') {\n        xhr.responseType = 'arraybuffer';\n    }\n    for (const k in requestParameters.headers) {\n        xhr.setRequestHeader(k, requestParameters.headers[k]);\n    }\n    if (requestParameters.type === 'json') {\n        xhr.responseType = 'text';\n        xhr.setRequestHeader('Accept', 'application/json');\n    }\n    xhr.withCredentials = requestParameters.credentials === 'include';\n    xhr.onerror = () => {\n        callback(new Error(xhr.statusText));\n    };\n    xhr.onload = () => {\n        if (((xhr.status >= 200 && xhr.status < 300) || xhr.status === 0) && xhr.response !== null) {\n            let data: mixed = xhr.response;\n            if (requestParameters.type === 'json') {\n                // We're manually parsing JSON here to get better error messages.\n                try {\n                    data = JSON.parse(xhr.response);\n                } catch (err) {\n                    return callback(err);\n                }\n            }\n            callback(null, data, xhr.getResponseHeader('Cache-Control'), xhr.getResponseHeader('Expires'));\n        } else {\n            callback(new AJAXError(xhr.statusText, xhr.status, requestParameters.url));\n        }\n    };\n    xhr.send(requestParameters.body);\n    return {cancel: () => xhr.abort()};\n}\n\nexport const makeRequest = function(requestParameters: RequestParameters, callback: ResponseCallback<any>): Cancelable {\n    // We're trying to use the Fetch API if possible. However, in some situations we can't use it:\n    // - Safari exposes AbortController, but it doesn't work actually abort any requests in\n    //   older versions (see https://bugs.webkit.org/show_bug.cgi?id=174980#c2). In this case,\n    //   we dispatch the request to the main thread so that we can get an accurate referrer header.\n    // - Requests for resources with the file:// URI scheme don't work with the Fetch API either. In\n    //   this case we unconditionally use XHR on the current thread since referrers don't matter.\n    if (!isFileURL(requestParameters.url)) {\n        if (self.fetch && self.Request && self.AbortController && Request.prototype.hasOwnProperty('signal')) {\n            return makeFetchRequest(requestParameters, callback);\n        }\n        if (isWorker() && self.worker && self.worker.actor) {\n            const queueOnMainThread = true;\n            return self.worker.actor.send('getResource', requestParameters, callback, undefined, queueOnMainThread);\n        }\n    }\n    return makeXMLHttpRequest(requestParameters, callback);\n};\n\nexport const getJSON = function(requestParameters: RequestParameters, callback: ResponseCallback<Object>): Cancelable {\n    return makeRequest(extend(requestParameters, {type: 'json'}), callback);\n};\n\nexport const getArrayBuffer = function(requestParameters: RequestParameters, callback: ResponseCallback<ArrayBuffer>): Cancelable {\n    return makeRequest(extend(requestParameters, {type: 'arrayBuffer'}), callback);\n};\n\nexport const postData = function(requestParameters: RequestParameters, callback: ResponseCallback<string>): Cancelable {\n    return makeRequest(extend(requestParameters, {method: 'POST'}), callback);\n};\n\nexport const getData = function(requestParameters: RequestParameters, callback: ResponseCallback<string>): Cancelable {\n    return makeRequest(extend(requestParameters, {method: 'GET'}), callback);\n};\n\nfunction sameOrigin(url: string) {\n    const a: HTMLAnchorElement = document.createElement('a');\n    a.href = url;\n    return a.protocol === location.protocol && a.host === location.host;\n}\n\nconst transparentPngUrl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=';\n\nfunction arrayBufferToImage(data: ArrayBuffer, callback: Callback<HTMLImageElement>) {\n    const img: HTMLImageElement = new Image();\n    img.onload = () => {\n        callback(null, img);\n        URL.revokeObjectURL(img.src);\n        // prevent image dataURI memory leak in Safari;\n        // but don't free the image immediately because it might be uploaded in the next frame\n        // https://github.com/mapbox/mapbox-gl-js/issues/10226\n        img.onload = null;\n        requestAnimationFrame(() => { img.src = transparentPngUrl; });\n    };\n    img.onerror = () => callback(new Error('Could not load image. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.'));\n    const blob: Blob = new Blob([new Uint8Array(data)], {type: 'image/png'});\n    img.src = data.byteLength ? URL.createObjectURL(blob) : transparentPngUrl;\n}\n\nfunction arrayBufferToImageBitmap(data: ArrayBuffer, callback: Callback<ImageBitmap>) {\n    const blob: Blob = new Blob([new Uint8Array(data)], {type: 'image/png'});\n    // $FlowFixMe[cannot-resolve-name] https://github.com/facebook/flow/pull/7483\n    createImageBitmap(blob).then((imgBitmap) => {\n        callback(null, imgBitmap);\n    }).catch((e) => {\n        callback(new Error(`Could not load image because of ${e.message}. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.`));\n    });\n}\n\nlet imageQueue, numImageRequests;\nexport const resetImageRequestQueue = () => {\n    imageQueue = [];\n    numImageRequests = 0;\n};\nresetImageRequestQueue();\n\nexport const getImage = function(requestParameters: RequestParameters, callback: ResponseCallback<HTMLImageElement | ImageBitmap>): Cancelable {\n    if (webpSupported.supported) {\n        if (!requestParameters.headers) {\n            requestParameters.headers = {};\n        }\n        requestParameters.headers.accept = 'image/webp,*/*';\n    }\n\n    // limit concurrent image loads to help with raster sources performance on big screens\n    if (numImageRequests >= config.MAX_PARALLEL_IMAGE_REQUESTS) {\n        const queued = {\n            requestParameters,\n            callback,\n            cancelled: false,\n            // $FlowFixMe[object-this-reference]\n            cancel() { this.cancelled = true; }\n        };\n        imageQueue.push(queued);\n        return queued;\n    }\n    numImageRequests++;\n\n    let advanced = false;\n    const advanceImageRequestQueue = () => {\n        if (advanced) return;\n        advanced = true;\n        numImageRequests--;\n        assert(numImageRequests >= 0);\n        while (imageQueue.length && numImageRequests < config.MAX_PARALLEL_IMAGE_REQUESTS) { // eslint-disable-line\n            const request = imageQueue.shift();\n            const {requestParameters, callback, cancelled} = request;\n            if (!cancelled) {\n                // $FlowFixMe[cannot-write] - Flow can't infer that cancel is a writable property\n                request.cancel = getImage(requestParameters, callback).cancel;\n            }\n        }\n    };\n\n    // request the image with XHR to work around caching issues\n    // see https://github.com/mapbox/mapbox-gl-js/issues/1470\n    const request = getArrayBuffer(requestParameters, (err: ?Error, data: ?ArrayBuffer, cacheControl: ?string, expires: ?string) => {\n\n        advanceImageRequestQueue();\n\n        if (err) {\n            callback(err);\n        } else if (data) {\n            if (self.createImageBitmap) {\n                arrayBufferToImageBitmap(data, (err, imgBitmap) => callback(err, imgBitmap, cacheControl, expires));\n            } else {\n                arrayBufferToImage(data, (err, img) => callback(err, img, cacheControl, expires));\n            }\n        }\n    });\n\n    return {\n        cancel: () => {\n            request.cancel();\n            advanceImageRequestQueue();\n        }\n    };\n};\n\nexport const getVideo = function(urls: Array<string>, callback: Callback<HTMLVideoElement>): Cancelable {\n    const video: HTMLVideoElement = document.createElement('video');\n    video.muted = true;\n    video.onloadstart = function() {\n        callback(null, video);\n    };\n    for (let i = 0; i < urls.length; i++) {\n        const s: HTMLSourceElement = document.createElement('source');\n        if (!sameOrigin(urls[i])) {\n            video.crossOrigin = 'Anonymous';\n        }\n        s.src = urls[i];\n        video.appendChild(s);\n    }\n    return {cancel: () => {}};\n};\n","// @flow\n\n/***** START WARNING REMOVAL OR MODIFICATION OF THE\n* FOLLOWING CODE VIOLATES THE MAPBOX TERMS OF SERVICE  ******\n* The following code is used to access Mapbox's APIs. Removal or modification\n* of this code can result in higher fees and/or\n* termination of your account with Mapbox.\n*\n* Under the Mapbox Terms of Service, you may not use this code to access Mapbox\n* Mapping APIs other than through Mapbox SDKs.\n*\n* The Mapping APIs documentation is available at https://docs.mapbox.com/api/maps/#maps\n* and the Mapbox Terms of Service are available at https://www.mapbox.com/tos/\n******************************************************************************/\n\ntype SkuTokenObject = {|\n    token: string,\n    tokenExpiresAt: number\n|};\n\nconst SKU_ID = '01';\n\nfunction createSkuToken(): SkuTokenObject {\n    // SKU_ID and TOKEN_VERSION are specified by an internal schema and should not change\n    const TOKEN_VERSION = '1';\n    const base62chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n    // sessionRandomizer is a randomized 10-digit base-62 number\n    let sessionRandomizer = '';\n    for (let i = 0; i < 10; i++) {\n        sessionRandomizer += base62chars[Math.floor(Math.random() * 62)];\n    }\n    const expiration = 12 * 60 * 60 * 1000; // 12 hours\n    const token = [TOKEN_VERSION, SKU_ID, sessionRandomizer].join('');\n    const tokenExpiresAt = Date.now() + expiration;\n\n    return {token, tokenExpiresAt};\n}\n\nexport {createSkuToken, SKU_ID};\n\n/***** END WARNING - REMOVAL OR MODIFICATION OF THE\nPRECEDING CODE VIOLATES THE MAPBOX TERMS OF SERVICE  ******/\n","// @flow\n\n/***** START WARNING REMOVAL OR MODIFICATION OF THE\n* FOLLOWING CODE VIOLATES THE MAPBOX TERMS OF SERVICE  ******\n* The following code is used to access Mapbox's APIs. Removal or modification\n* of this code can result in higher fees and/or\n* termination of your account with Mapbox.\n*\n* Under the Mapbox Terms of Service, you may not use this code to access Mapbox\n* Mapping APIs other than through Mapbox SDKs.\n*\n* The Mapping APIs documentation is available at https://docs.mapbox.com/api/maps/#maps\n* and the Mapbox Terms of Service are available at https://www.mapbox.com/tos/\n******************************************************************************/\n\nimport assert from 'assert';\nimport config from './config.js';\nimport webpSupported from './webp_supported.js';\nimport {isMapboxHTTPURL, isMapboxURL} from './mapbox_url.js';\nimport {createSkuToken, SKU_ID} from './sku_token.js';\nimport {version as sdkVersion} from '../../package.json';\nimport {uuid, validateUuid, storageAvailable, b64DecodeUnicode, b64EncodeUnicode, warnOnce, extend} from './util.js';\nimport {postData, ResourceType, getData} from './ajax.js';\nimport {getLivePerformanceMetrics} from '../util/live_performance.js';\n\nimport type {LivePerformanceData} from '../util/live_performance.js';\nimport type {RequestParameters} from './ajax.js';\nimport type {Cancelable} from '../types/cancelable.js';\nimport type {TileJSON} from '../types/tilejson.js';\nimport type {Map as MapboxMap} from \"../ui/map\";\n\ntype ResourceTypeEnum = $Keys<typeof ResourceType>;\nexport type RequestTransformFunction = (url: string, resourceType?: ResourceTypeEnum) => RequestParameters;\n\ntype UrlObject = {|\n    protocol: string,\n    authority: string,\n    path: string,\n    params: Array<string>\n|};\n\ntype EventCallback = (err: ?Error) => void;\n\nexport const AUTH_ERR_MSG: string = 'NO_ACCESS_TOKEN';\n\nexport class RequestManager {\n    _skuToken: string;\n    _skuTokenExpiresAt: number;\n    _transformRequestFn: ?RequestTransformFunction;\n    _customAccessToken: ?string;\n    _silenceAuthErrors: boolean;\n\n    constructor(transformRequestFn?: ?RequestTransformFunction, customAccessToken?: ?string, silenceAuthErrors: ?boolean) {\n        this._transformRequestFn = transformRequestFn;\n        this._customAccessToken = customAccessToken;\n        this._silenceAuthErrors = !!silenceAuthErrors;\n        this._createSkuToken();\n    }\n\n    _createSkuToken() {\n        const skuToken = createSkuToken();\n        this._skuToken = skuToken.token;\n        this._skuTokenExpiresAt = skuToken.tokenExpiresAt;\n    }\n\n    _isSkuTokenExpired(): boolean {\n        return Date.now() > this._skuTokenExpiresAt;\n    }\n\n    transformRequest(url: string, type: ResourceTypeEnum): RequestParameters {\n        if (this._transformRequestFn) {\n            return this._transformRequestFn(url, type) || {url};\n        }\n\n        return {url};\n    }\n\n    normalizeStyleURL(url: string, accessToken?: string): string {\n        if (!isMapboxURL(url)) return url;\n        const urlObject = parseUrl(url);\n        urlObject.params.push(`sdk=js-${sdkVersion}`);\n        urlObject.path = `/styles/v1${urlObject.path}`;\n        return this._makeAPIURL(urlObject, this._customAccessToken || accessToken);\n    }\n\n    normalizeGlyphsURL(url: string, accessToken?: string): string {\n        if (!isMapboxURL(url)) return url;\n        const urlObject = parseUrl(url);\n        urlObject.path = `/fonts/v1${urlObject.path}`;\n        return this._makeAPIURL(urlObject, this._customAccessToken || accessToken);\n    }\n\n    normalizeModelURL(url: string, accessToken?: string): string {\n        if (!isMapboxURL(url)) return url;\n        const urlObject = parseUrl(url);\n        urlObject.path = `/models/v1${urlObject.path}`;\n        return this._makeAPIURL(urlObject, this._customAccessToken || accessToken);\n    }\n\n    normalizeSourceURL(url: string, accessToken?: ?string, language?: ?string, worldview?: ?string): string {\n        if (!isMapboxURL(url)) return url;\n        const urlObject = parseUrl(url);\n        urlObject.path = `/v4/${urlObject.authority}.json`;\n        // TileJSON requests need a secure flag appended to their URLs so\n        // that the server knows to send SSL-ified resource references.\n        urlObject.params.push('secure');\n        if (language) {\n            urlObject.params.push(`language=${language}`);\n        }\n        if (worldview) {\n            urlObject.params.push(`worldview=${worldview}`);\n        }\n\n        return this._makeAPIURL(urlObject, this._customAccessToken || accessToken);\n    }\n\n    normalizeSpriteURL(url: string, format: string, extension: string, accessToken?: string): string {\n        const urlObject = parseUrl(url);\n        if (!isMapboxURL(url)) {\n            urlObject.path += `${format}${extension}`;\n            return formatUrl(urlObject);\n        }\n        urlObject.path = `/styles/v1${urlObject.path}/sprite${format}${extension}`;\n        return this._makeAPIURL(urlObject, this._customAccessToken || accessToken);\n    }\n\n    normalizeTileURL(tileURL: string, use2x?: boolean, rasterTileSize?: number): string {\n        if (this._isSkuTokenExpired()) {\n            this._createSkuToken();\n        }\n\n        if (tileURL && !isMapboxURL(tileURL)) return tileURL;\n\n        const urlObject = parseUrl(tileURL);\n        const imageExtensionRe = /(\\.(png|jpg)\\d*)(?=$)/;\n        const extension = webpSupported.supported ? '.webp' : '$1';\n\n        // The v4 mapbox tile API supports 512x512 image tiles but they must be requested as '@2x' tiles.\n        const use2xAs512 = rasterTileSize && urlObject.authority !== 'raster' && rasterTileSize === 512;\n\n        const suffix = use2x || use2xAs512 ? '@2x' : '';\n        urlObject.path = urlObject.path.replace(imageExtensionRe, `${suffix}${extension}`);\n\n        if (urlObject.authority === 'raster') {\n            urlObject.path = `/${config.RASTER_URL_PREFIX}${urlObject.path}`;\n        } else if (urlObject.authority === 'rasterarrays') {\n            urlObject.path = `/${config.RASTERARRAYS_URL_PREFIX}${urlObject.path}`;\n        } else {\n            const tileURLAPIPrefixRe = /^.+\\/v4\\//;\n            urlObject.path = urlObject.path.replace(tileURLAPIPrefixRe, '/');\n            urlObject.path = `/${config.TILE_URL_VERSION}${urlObject.path}`;\n        }\n\n        const accessToken = this._customAccessToken || getAccessToken(urlObject.params) || config.ACCESS_TOKEN;\n        if (config.REQUIRE_ACCESS_TOKEN && accessToken && this._skuToken) {\n            urlObject.params.push(`sku=${this._skuToken}`);\n        }\n\n        return this._makeAPIURL(urlObject, accessToken);\n    }\n\n    canonicalizeTileURL(url: string, removeAccessToken: boolean): string {\n        // matches any file extension specified by a dot and one or more alphanumeric characters\n        const extensionRe = /\\.[\\w]+$/;\n\n        const urlObject = parseUrl(url);\n        // Make sure that we are dealing with a valid Mapbox tile URL.\n        // Has to begin with /v4/, /raster/v1 or /rasterarrays/v1 with a valid filename + extension\n        if (!urlObject.path.match(/^(\\/v4\\/|\\/(raster|rasterarrays)\\/v1\\/)/) || !urlObject.path.match(extensionRe)) {\n            // Not a proper Mapbox tile URL.\n            return url;\n        }\n        // Reassemble the canonical URL from the parts we've parsed before.\n        let result = \"mapbox://\";\n        if (urlObject.path.match(/^\\/raster\\/v1\\//)) {\n            // If the tile url has /raster/v1/, make the final URL mapbox://raster/....\n            const rasterPrefix = `/${config.RASTER_URL_PREFIX}/`;\n            result += `raster/${urlObject.path.replace(rasterPrefix, '')}`;\n        } else if (urlObject.path.match(/^\\/rasterarrays\\/v1\\//)) {\n            // If the tile url has /rasterarrays/v1/, make the final URL mapbox://rasterarrays/....\n            const rasterPrefix = `/${config.RASTERARRAYS_URL_PREFIX}/`;\n            result += `rasterarrays/${urlObject.path.replace(rasterPrefix, '')}`;\n        } else {\n            const tilesPrefix = `/${config.TILE_URL_VERSION}/`;\n            result += `tiles/${urlObject.path.replace(tilesPrefix, '')}`;\n        }\n\n        // Append the query string, minus the access token parameter.\n        let params = urlObject.params;\n        if (removeAccessToken) {\n            params = params.filter(p => !p.match(/^access_token=/));\n        }\n        if (params.length) result += `?${params.join('&')}`;\n        return result;\n    }\n\n    canonicalizeTileset(tileJSON: TileJSON, sourceURL?: string): Array<string> {\n        const removeAccessToken = sourceURL ? isMapboxURL(sourceURL) : false;\n        const canonical = [];\n        for (const url of tileJSON.tiles || []) {\n            if (isMapboxHTTPURL(url)) {\n                canonical.push(this.canonicalizeTileURL(url, removeAccessToken));\n            } else {\n                canonical.push(url);\n            }\n        }\n        return canonical;\n    }\n\n    _makeAPIURL(urlObject: UrlObject, accessToken: string | null | void): string {\n        const help = 'See https://docs.mapbox.com/api/overview/#access-tokens-and-token-scopes';\n        const apiUrlObject = parseUrl(config.API_URL);\n        urlObject.protocol = apiUrlObject.protocol;\n        urlObject.authority = apiUrlObject.authority;\n\n        if (urlObject.protocol === 'http') {\n            const i = urlObject.params.indexOf('secure');\n            if (i >= 0) urlObject.params.splice(i, 1);\n        }\n\n        if (apiUrlObject.path !== '/') {\n            urlObject.path = `${apiUrlObject.path}${urlObject.path}`;\n        }\n\n        if (!config.REQUIRE_ACCESS_TOKEN) return formatUrl(urlObject);\n\n        accessToken = accessToken || config.ACCESS_TOKEN;\n        if (!this._silenceAuthErrors) {\n            if (!accessToken)\n                throw new Error(`An API access token is required to use Mapbox GL. ${help}`);\n            if (accessToken[0] === 's')\n                throw new Error(`Use a public access token (pk.*) with Mapbox GL, not a secret access token (sk.*). ${help}`);\n        }\n\n        urlObject.params = urlObject.params.filter((d) => d.indexOf('access_token') === -1);\n        urlObject.params.push(`access_token=${accessToken || ''}`);\n        return formatUrl(urlObject);\n    }\n}\n\nfunction getAccessToken(params: Array<string>): string | null {\n    for (const param of params) {\n        const match = param.match(/^access_token=(.*)$/);\n        if (match) {\n            return match[1];\n        }\n    }\n    return null;\n}\n\nconst urlRe = /^(\\w+):\\/\\/([^/?]*)(\\/[^?]+)?\\??(.+)?/;\n\nfunction parseUrl(url: string): UrlObject {\n    const parts = url.match(urlRe);\n    if (!parts) {\n        throw new Error('Unable to parse URL object');\n    }\n    return {\n        protocol: parts[1],\n        authority: parts[2],\n        path: parts[3] || '/',\n        params: parts[4] ? parts[4].split('&') : []\n    };\n}\n\nfunction formatUrl(obj: UrlObject): string {\n    const params = obj.params.length ? `?${obj.params.join('&')}` : '';\n    return `${obj.protocol}://${obj.authority}${obj.path}${params}`;\n}\n\nconst telemEventKey = 'mapbox.eventData';\n\nfunction parseAccessToken(accessToken: ?string) {\n    if (!accessToken) {\n        return null;\n    }\n\n    const parts = accessToken.split('.');\n    if (!parts || parts.length !== 3) {\n        return null;\n    }\n\n    try {\n        const jsonData = JSON.parse(b64DecodeUnicode(parts[1]));\n        return jsonData;\n    } catch (e) {\n        return null;\n    }\n}\n\ntype TelemetryEventType = 'appUserTurnstile' | 'map.load' | 'map.auth' | 'gljs.performance' | 'style.load';\n\nclass TelemetryEvent {\n    eventData: any;\n    anonId: ?string;\n    queue: Array<any>;\n    type: TelemetryEventType;\n    pendingRequest: ?Cancelable;\n    _customAccessToken: ?string;\n\n    constructor(type: TelemetryEventType) {\n        this.type = type;\n        this.anonId = null;\n        this.eventData = {};\n        this.queue = [];\n        this.pendingRequest = null;\n    }\n\n    getStorageKey(domain: ?string): string {\n        const tokenData = parseAccessToken(config.ACCESS_TOKEN);\n        let u = '';\n        if (tokenData && tokenData['u']) {\n            u = b64EncodeUnicode(tokenData['u']);\n        } else {\n            u = config.ACCESS_TOKEN || '';\n        }\n        return domain ?\n            `${telemEventKey}.${domain}:${u}` :\n            `${telemEventKey}:${u}`;\n    }\n\n    fetchEventData() {\n        const isLocalStorageAvailable = storageAvailable('localStorage');\n        const storageKey = this.getStorageKey();\n        const uuidKey = this.getStorageKey('uuid');\n\n        if (isLocalStorageAvailable) {\n            //Retrieve cached data\n            try {\n                const data = localStorage.getItem(storageKey);\n                if (data) {\n                    this.eventData = JSON.parse(data);\n                }\n\n                const uuid = localStorage.getItem(uuidKey);\n                if (uuid) this.anonId = uuid;\n            } catch (e) {\n                warnOnce('Unable to read from LocalStorage');\n            }\n        }\n    }\n\n    saveEventData() {\n        const isLocalStorageAvailable = storageAvailable('localStorage');\n        const storageKey =  this.getStorageKey();\n        const uuidKey = this.getStorageKey('uuid');\n        const anonId = this.anonId;\n        if (isLocalStorageAvailable && anonId) {\n            try {\n                localStorage.setItem(uuidKey, anonId);\n                if (Object.keys(this.eventData).length >= 1) {\n                    localStorage.setItem(storageKey, JSON.stringify(this.eventData));\n                }\n            } catch (e) {\n                warnOnce('Unable to write to LocalStorage');\n            }\n        }\n\n    }\n\n    processRequests(_: ?string) {}\n\n    /*\n    * If any event data should be persisted after the POST request, the callback should modify eventData`\n    * to the values that should be saved. For this reason, the callback should be invoked prior to the call\n    * to TelemetryEvent#saveData\n    */\n    postEvent(timestamp: number, additionalPayload: {[_: string]: any}, callback: EventCallback, customAccessToken?: ?string) {\n        if (!config.EVENTS_URL) return;\n        const eventsUrlObject: UrlObject = parseUrl(config.EVENTS_URL);\n        eventsUrlObject.params.push(`access_token=${customAccessToken || config.ACCESS_TOKEN || ''}`);\n\n        const payload: Object = {\n            event: this.type,\n            created: new Date(timestamp).toISOString()\n        };\n\n        const finalPayload = additionalPayload ? extend(payload, additionalPayload) : payload;\n        const request: RequestParameters = {\n            url: formatUrl(eventsUrlObject),\n            headers: {\n                'Content-Type': 'text/plain' //Skip the pre-flight OPTIONS request\n            },\n            body: JSON.stringify([finalPayload])\n        };\n\n        this.pendingRequest = postData(request, (error) => {\n            this.pendingRequest = null;\n            callback(error);\n            this.saveEventData();\n            this.processRequests(customAccessToken);\n        });\n    }\n\n    queueRequest(event: any, customAccessToken?: ?string) {\n        this.queue.push(event);\n        this.processRequests(customAccessToken);\n    }\n}\n\nexport class PerformanceEvent extends TelemetryEvent {\n    constructor() {\n        super('gljs.performance');\n    }\n\n    postPerformanceEvent(customAccessToken: ?string, performanceData: LivePerformanceData) {\n        if (config.EVENTS_URL) {\n            if (customAccessToken || config.ACCESS_TOKEN) {\n                this.queueRequest({timestamp: Date.now(), performanceData}, customAccessToken);\n            }\n        }\n    }\n\n    processRequests(customAccessToken?: ?string) {\n        if (this.pendingRequest || this.queue.length === 0) {\n            return;\n        }\n\n        const {timestamp, performanceData} = this.queue.shift();\n\n        const additionalPayload = getLivePerformanceMetrics(performanceData);\n\n        // Server will only process string for these entries\n        for (const metadata of additionalPayload.metadata) {\n            assert(typeof metadata.value === 'string');\n        }\n        for (const counter of additionalPayload.counters) {\n            assert(typeof counter.value === 'string');\n        }\n        for (const attribute of additionalPayload.attributes) {\n            assert(typeof attribute.value === 'string');\n        }\n\n        this.postEvent(timestamp, additionalPayload, () => {}, customAccessToken);\n    }\n}\n\nexport class MapLoadEvent extends TelemetryEvent {\n    +success: {[_: number]: boolean};\n    skuToken: string;\n    errorCb: EventCallback;\n\n    constructor() {\n        super('map.load');\n        this.success = {};\n        this.skuToken = '';\n    }\n\n    postMapLoadEvent(mapId: number, skuToken: string, customAccessToken: ?string, callback: EventCallback) {\n        this.skuToken = skuToken;\n        this.errorCb = callback;\n\n        if (config.EVENTS_URL) {\n            if (customAccessToken || config.ACCESS_TOKEN) {\n                this.queueRequest({id: mapId, timestamp: Date.now()}, customAccessToken);\n            } else {\n                this.errorCb(new Error(AUTH_ERR_MSG));\n            }\n        }\n    }\n\n    processRequests(customAccessToken?: ?string) {\n        if (this.pendingRequest || this.queue.length === 0) return;\n        const {id, timestamp} = this.queue.shift();\n\n        // Only one load event should fire per map\n        if (id && this.success[id]) return;\n\n        if (!this.anonId) {\n            this.fetchEventData();\n        }\n\n        if (!validateUuid(this.anonId)) {\n            this.anonId = uuid();\n        }\n\n        const additionalPayload = {\n            sdkIdentifier: 'mapbox-gl-js',\n            sdkVersion,\n            skuId: SKU_ID,\n            skuToken: this.skuToken,\n            userId: this.anonId\n        };\n\n        this.postEvent(timestamp, additionalPayload, (err) => {\n            if (err) {\n                this.errorCb(err);\n            } else {\n                if (id) this.success[id] = true;\n            }\n\n        }, customAccessToken);\n    }\n\n    remove() {\n        // $FlowFixMe[incompatible-type]\n        this.errorCb = null;\n    }\n}\n\ntype StyleLoadEventInput = {\n    map: MapboxMap;\n    style: string;\n    importedStyles: string[];\n}\n\ntype StyleLoadEventPayload = {\n    mapInstanceId: string;\n    eventId: number;\n    style: string;\n    importedStyles?: string[];\n}\n\nexport class StyleLoadEvent extends TelemetryEvent {\n    eventIdPerMapInstanceMap: Map<string, number>;\n    mapInstanceIdMap: WeakMap<MapboxMap, string>;\n\n    constructor() {\n        super('style.load');\n        this.eventIdPerMapInstanceMap = new Map();\n        this.mapInstanceIdMap = new WeakMap();\n    }\n\n    getMapInstanceId(map: MapboxMap): string {\n        let instanceId = this.mapInstanceIdMap.get(map);\n\n        if (!instanceId) {\n            instanceId = uuid();\n            this.mapInstanceIdMap.set(map, instanceId);\n        }\n\n        return instanceId;\n    }\n\n    getEventId(mapInstanceId: string): number {\n        const eventId = this.eventIdPerMapInstanceMap.get(mapInstanceId) || 0;\n        this.eventIdPerMapInstanceMap.set(mapInstanceId, eventId + 1);\n        return eventId;\n    }\n\n    postStyleLoadEvent(customAccessToken: ?string, input: StyleLoadEventInput) {\n        const {\n            map,\n            style,\n            importedStyles,\n        } = input;\n\n        if (!config.EVENTS_URL || !(customAccessToken || config.ACCESS_TOKEN)) {\n            return;\n        }\n\n        const mapInstanceId = this.getMapInstanceId(map);\n        const payload: StyleLoadEventPayload = {\n            mapInstanceId,\n            eventId: this.getEventId(mapInstanceId),\n            style,\n        };\n\n        if (importedStyles.length) {\n            payload.importedStyles = importedStyles;\n        }\n\n        this.queueRequest({\n            timestamp: Date.now(),\n            payload\n        }, customAccessToken);\n    }\n\n    processRequests(customAccessToken?: ?string) {\n        if (this.pendingRequest || this.queue.length === 0) {\n            return;\n        }\n\n        const {timestamp, payload} = this.queue.shift();\n\n        this.postEvent(timestamp, payload, () => {}, customAccessToken);\n    }\n}\n\nexport class MapSessionAPI extends TelemetryEvent {\n    +success: {[_: number]: boolean};\n    skuToken: string;\n    errorCb: EventCallback;\n\n    constructor() {\n        super('map.auth');\n        this.success = {};\n        this.skuToken = '';\n    }\n\n    getSession(timestamp: number, token: string, callback: EventCallback, customAccessToken?: ?string) {\n        if (!config.API_URL || !config.SESSION_PATH) return;\n        const authUrlObject: UrlObject = parseUrl(config.API_URL + config.SESSION_PATH);\n        authUrlObject.params.push(`sku=${token || ''}`);\n        authUrlObject.params.push(`access_token=${customAccessToken || config.ACCESS_TOKEN || ''}`);\n\n        const request: RequestParameters = {\n            url: formatUrl(authUrlObject),\n            headers: {\n                'Content-Type': 'text/plain', //Skip the pre-flight OPTIONS request\n            }\n        };\n\n        this.pendingRequest = getData(request, (error) => {\n            this.pendingRequest = null;\n            callback(error);\n            this.saveEventData();\n            this.processRequests(customAccessToken);\n        });\n    }\n\n    getSessionAPI(mapId: number, skuToken: string, customAccessToken: ?string, callback: EventCallback) {\n        this.skuToken = skuToken;\n        this.errorCb = callback;\n\n        if (config.SESSION_PATH && config.API_URL) {\n            if (customAccessToken || config.ACCESS_TOKEN) {\n                this.queueRequest({id: mapId, timestamp: Date.now()}, customAccessToken);\n            } else {\n                this.errorCb(new Error(AUTH_ERR_MSG));\n            }\n        }\n    }\n\n    processRequests(customAccessToken?: ?string) {\n        if (this.pendingRequest || this.queue.length === 0) return;\n        const {id, timestamp} = this.queue.shift();\n\n        // Only one load event should fire per map\n        if (id && this.success[id]) return;\n\n        this.getSession(timestamp, this.skuToken, (err) => {\n            if (err) {\n                this.errorCb(err);\n            } else {\n                if (id) this.success[id] = true;\n            }\n        }, customAccessToken);\n    }\n\n    remove() {\n        // $FlowFixMe[incompatible-type]\n        this.errorCb = null;\n    }\n}\n\nexport class TurnstileEvent extends TelemetryEvent {\n    constructor(customAccessToken?: ?string) {\n        super('appUserTurnstile');\n        this._customAccessToken = customAccessToken;\n    }\n\n    postTurnstileEvent(tileUrls: Array<string>, customAccessToken?: ?string) {\n        //Enabled only when Mapbox Access Token is set and a source uses\n        // mapbox tiles.\n        if (config.EVENTS_URL &&\n            config.ACCESS_TOKEN &&\n            Array.isArray(tileUrls) &&\n            tileUrls.some(url => isMapboxURL(url) || isMapboxHTTPURL(url))) {\n            this.queueRequest(Date.now(), customAccessToken);\n        }\n    }\n\n    processRequests(customAccessToken?: ?string) {\n        if (this.pendingRequest || this.queue.length === 0) {\n            return;\n        }\n\n        if (!this.anonId || !this.eventData.lastSuccess || !this.eventData.tokenU) {\n            //Retrieve cached data\n            this.fetchEventData();\n        }\n\n        const tokenData = parseAccessToken(config.ACCESS_TOKEN);\n        const tokenU = tokenData ? tokenData['u'] : config.ACCESS_TOKEN;\n        //Reset event data cache if the access token owner changed.\n        let dueForEvent = tokenU !== this.eventData.tokenU;\n\n        if (!validateUuid(this.anonId)) {\n            this.anonId = uuid();\n            dueForEvent = true;\n        }\n\n        const nextUpdate = this.queue.shift();\n        // Record turnstile event once per calendar day.\n        if (this.eventData.lastSuccess) {\n            const lastUpdate = new Date(this.eventData.lastSuccess);\n            const nextDate = new Date(nextUpdate);\n            const daysElapsed = (nextUpdate - this.eventData.lastSuccess) / (24 * 60 * 60 * 1000);\n            dueForEvent = dueForEvent || daysElapsed >= 1 || daysElapsed < -1 || lastUpdate.getDate() !== nextDate.getDate();\n        } else {\n            dueForEvent = true;\n        }\n\n        if (!dueForEvent) {\n            this.processRequests();\n            return;\n        }\n\n        const additionalPayload = {\n            sdkIdentifier: 'mapbox-gl-js',\n            sdkVersion,\n            skuId: SKU_ID,\n            \"enabled.telemetry\": false,\n            userId: this.anonId\n        };\n\n        this.postEvent(nextUpdate, additionalPayload, (err) => {\n            if (!err) {\n                this.eventData.lastSuccess = nextUpdate;\n                this.eventData.tokenU = tokenU;\n            }\n        }, customAccessToken);\n    }\n}\n\nconst turnstileEvent_ = new TurnstileEvent();\n// $FlowFixMe[method-unbinding]\nexport const postTurnstileEvent: (tileUrls: Array<string>, customAccessToken?: ?string) => void = turnstileEvent_.postTurnstileEvent.bind(turnstileEvent_);\n\nexport const mapLoadEvent: MapLoadEvent = new MapLoadEvent();\n// $FlowFixMe[method-unbinding]\nexport const postMapLoadEvent: (number, string, ?string, EventCallback) => void = mapLoadEvent.postMapLoadEvent.bind(mapLoadEvent);\n\nexport const styleLoadEvent: StyleLoadEvent = new StyleLoadEvent();\n// $FlowFixMe[method-unbinding]\nexport const postStyleLoadEvent: (?string, StyleLoadEventInput) => void = styleLoadEvent.postStyleLoadEvent.bind(styleLoadEvent);\n\nexport const performanceEvent_: PerformanceEvent = new PerformanceEvent();\n// $FlowFixMe[method-unbinding]\nexport const postPerformanceEvent: (?string, LivePerformanceData) => void = performanceEvent_.postPerformanceEvent.bind(performanceEvent_);\n\nexport const mapSessionAPI: MapSessionAPI = new MapSessionAPI();\n// $FlowFixMe[method-unbinding]\nexport const getMapSessionAPI: (number, string, ?string, EventCallback) => void = mapSessionAPI.getSessionAPI.bind(mapSessionAPI);\n\nconst authenticatedMaps = new Set();\nexport function storeAuthState(gl: WebGL2RenderingContext, state: boolean) {\n    if (state) {\n        authenticatedMaps.add(gl);\n    } else {\n        authenticatedMaps.delete(gl);\n    }\n}\n\nexport function isMapAuthenticated(gl: WebGL2RenderingContext): boolean {\n    return authenticatedMaps.has(gl);\n}\n\nexport function removeAuthState(gl: WebGL2RenderingContext) {\n    authenticatedMaps.delete(gl);\n}\n\n/***** END WARNING - REMOVAL OR MODIFICATION OF THE\nPRECEDING CODE VIOLATES THE MAPBOX TERMS OF SERVICE  ******/\n","/**\n * JS Implementation of MurmurHash3 (r136) (as of May 20, 2011)\n * \n * @author <a href=\"mailto:gary.court@gmail.com\">Gary Court</a>\n * @see http://github.com/garycourt/murmurhash-js\n * @author <a href=\"mailto:aappleby@gmail.com\">Austin Appleby</a>\n * @see http://sites.google.com/site/murmurhash/\n * \n * @param {string} key ASCII only\n * @param {number} seed Positive integer only\n * @return {number} 32-bit positive integer hash \n */\n\nfunction murmurhash3_32_gc(key, seed) {\n\tvar remainder, bytes, h1, h1b, c1, c1b, c2, c2b, k1, i;\n\t\n\tremainder = key.length & 3; // key.length % 4\n\tbytes = key.length - remainder;\n\th1 = seed;\n\tc1 = 0xcc9e2d51;\n\tc2 = 0x1b873593;\n\ti = 0;\n\t\n\twhile (i < bytes) {\n\t  \tk1 = \n\t  \t  ((key.charCodeAt(i) & 0xff)) |\n\t  \t  ((key.charCodeAt(++i) & 0xff) << 8) |\n\t  \t  ((key.charCodeAt(++i) & 0xff) << 16) |\n\t  \t  ((key.charCodeAt(++i) & 0xff) << 24);\n\t\t++i;\n\t\t\n\t\tk1 = ((((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16))) & 0xffffffff;\n\t\tk1 = (k1 << 15) | (k1 >>> 17);\n\t\tk1 = ((((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16))) & 0xffffffff;\n\n\t\th1 ^= k1;\n        h1 = (h1 << 13) | (h1 >>> 19);\n\t\th1b = ((((h1 & 0xffff) * 5) + ((((h1 >>> 16) * 5) & 0xffff) << 16))) & 0xffffffff;\n\t\th1 = (((h1b & 0xffff) + 0x6b64) + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16));\n\t}\n\t\n\tk1 = 0;\n\t\n\tswitch (remainder) {\n\t\tcase 3: k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16;\n\t\tcase 2: k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8;\n\t\tcase 1: k1 ^= (key.charCodeAt(i) & 0xff);\n\t\t\n\t\tk1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;\n\t\tk1 = (k1 << 15) | (k1 >>> 17);\n\t\tk1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;\n\t\th1 ^= k1;\n\t}\n\t\n\th1 ^= key.length;\n\n\th1 ^= h1 >>> 16;\n\th1 = (((h1 & 0xffff) * 0x85ebca6b) + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff;\n\th1 ^= h1 >>> 13;\n\th1 = ((((h1 & 0xffff) * 0xc2b2ae35) + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff;\n\th1 ^= h1 >>> 16;\n\n\treturn h1 >>> 0;\n}\n\nif(typeof module !== \"undefined\") {\n  module.exports = murmurhash3_32_gc\n}","/**\n * JS Implementation of MurmurHash2\n * \n * @author <a href=\"mailto:gary.court@gmail.com\">Gary Court</a>\n * @see http://github.com/garycourt/murmurhash-js\n * @author <a href=\"mailto:aappleby@gmail.com\">Austin Appleby</a>\n * @see http://sites.google.com/site/murmurhash/\n * \n * @param {string} str ASCII only\n * @param {number} seed Positive integer only\n * @return {number} 32-bit positive integer hash\n */\n\nfunction murmurhash2_32_gc(str, seed) {\n  var\n    l = str.length,\n    h = seed ^ l,\n    i = 0,\n    k;\n  \n  while (l >= 4) {\n  \tk = \n  \t  ((str.charCodeAt(i) & 0xff)) |\n  \t  ((str.charCodeAt(++i) & 0xff) << 8) |\n  \t  ((str.charCodeAt(++i) & 0xff) << 16) |\n  \t  ((str.charCodeAt(++i) & 0xff) << 24);\n    \n    k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));\n    k ^= k >>> 24;\n    k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));\n\n\th = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)) ^ k;\n\n    l -= 4;\n    ++i;\n  }\n  \n  switch (l) {\n  case 3: h ^= (str.charCodeAt(i + 2) & 0xff) << 16;\n  case 2: h ^= (str.charCodeAt(i + 1) & 0xff) << 8;\n  case 1: h ^= (str.charCodeAt(i) & 0xff);\n          h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));\n  }\n\n  h ^= h >>> 13;\n  h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));\n  h ^= h >>> 15;\n\n  return h >>> 0;\n}\n\nif(typeof module !== undefined) {\n  module.exports = murmurhash2_32_gc\n}\n","var murmur3 = require(\"./murmurhash3_gc.js\")\nvar murmur2 = require(\"./murmurhash2_gc.js\")\n\nmodule.exports = murmur3\nmodule.exports.murmur3 = murmur3\nmodule.exports.murmur2 = murmur2\n","// @flow\n\nimport {extend} from './util.js';\nimport type {MapEvent} from '../ui/events.js';\n\nexport type Listener = (Object) => void;\ntype Listeners = {[_: string]: Array<Listener> };\n\nfunction _addEventListener(type: string, listener: Listener, listenerList: Listeners) {\n    const listenerExists = listenerList[type] && listenerList[type].indexOf(listener) !== -1;\n    if (!listenerExists) {\n        listenerList[type] = listenerList[type] || [];\n        listenerList[type].push(listener);\n    }\n}\n\nfunction _removeEventListener(type: string, listener: Listener, listenerList: Listeners) {\n    if (listenerList && listenerList[type]) {\n        const index = listenerList[type].indexOf(listener);\n        if (index !== -1) {\n            listenerList[type].splice(index, 1);\n        }\n    }\n}\n\nexport class Event {\n    +type: string;\n\n    constructor(type: string, data: Object = {}) {\n        extend(this, data);\n        this.type = type;\n    }\n}\n\ninterface ErrorLike {\n    message: string;\n}\n\nexport class ErrorEvent extends Event {\n    error: ErrorLike;\n\n    constructor(error: ErrorLike, data: Object = {}) {\n        super('error', extend({error}, data));\n    }\n}\n\n/**\n * `Evented` mixes methods into other classes for event capabilities.\n *\n * Unless you are developing a plugin you will most likely use these methods through classes like `Map` or `Popup`.\n *\n * For lists of events you can listen for, see API documentation for specific classes: [`Map`](https://docs.mapbox.com/mapbox-gl-js/api/map/#map-events), [`Marker`](https://docs.mapbox.com/mapbox-gl-js/api/map/#map-events), [`Popup`](https://docs.mapbox.com/mapbox-gl-js/api/map/#map-events), and [`GeolocationControl`](https://docs.mapbox.com/mapbox-gl-js/api/map/#map-events).\n *\n * @mixin Evented\n */\nexport class Evented {\n    _listeners: Listeners;\n    _oneTimeListeners: Listeners;\n    _eventedParent: ?Evented;\n    _eventedParentData: ?(Object | () => Object);\n\n    /**\n     * Adds a listener to a specified event type.\n     *\n     * @param {string} type The event type to add a listen for.\n     * @param {Function} listener The function to be called when the event is fired.\n     *   The listener function is called with the data object passed to `fire`,\n     *   extended with `target` and `type` properties.\n     * @returns {Object} Returns itself to allow for method chaining.\n     */\n    on(type: MapEvent, listener: Listener): this {\n        this._listeners = this._listeners || {};\n        _addEventListener(type, listener, this._listeners);\n\n        return this;\n    }\n\n    /**\n     * Removes a previously registered event listener.\n     *\n     * @param {string} type The event type to remove listeners for.\n     * @param {Function} listener The listener function to remove.\n     * @returns {Object} Returns itself to allow for method chaining.\n     */\n    off(type: MapEvent, listener: Listener): this {\n        _removeEventListener(type, listener, this._listeners);\n        _removeEventListener(type, listener, this._oneTimeListeners);\n\n        return this;\n    }\n\n    /**\n     * Adds a listener that will be called only once to a specified event type.\n     *\n     * The listener will be called first time the event fires after the listener is registered.\n     *\n     * @param {string} type The event type to listen for.\n     * @param {Function} listener (Optional) The function to be called when the event is fired once.\n     *   If not provided, returns a Promise that will be resolved when the event is fired once.\n     * @returns {Object} Returns `this` | Promise.\n     */\n    once(type: MapEvent, listener?: Listener): this | Promise<Event> {\n        if (!listener) {\n            return new Promise((resolve) => this.once(type, resolve));\n        }\n\n        this._oneTimeListeners = this._oneTimeListeners || {};\n        _addEventListener(type, listener, this._oneTimeListeners);\n\n        return this;\n    }\n\n    fire(event: Event, properties?: Object): this {\n        // Compatibility with (type: string, properties: Object) signature from previous versions.\n        // See https://github.com/mapbox/mapbox-gl-js/issues/6522,\n        //     https://github.com/mapbox/mapbox-gl-draw/issues/766\n        if (typeof event === 'string') {\n            event = new Event(event, properties || {});\n        }\n\n        const type = event.type;\n\n        if (this.listens(type)) {\n            (event: any).target = this;\n\n            // make sure adding or removing listeners inside other listeners won't cause an infinite loop\n            const listeners = this._listeners && this._listeners[type] ? this._listeners[type].slice() : [];\n\n            for (const listener of listeners) {\n                listener.call(this, event);\n            }\n\n            const oneTimeListeners = this._oneTimeListeners && this._oneTimeListeners[type] ? this._oneTimeListeners[type].slice() : [];\n            for (const listener of oneTimeListeners) {\n                _removeEventListener(type, listener, this._oneTimeListeners);\n                listener.call(this, event);\n            }\n\n            const parent = this._eventedParent;\n            if (parent) {\n                extend(\n                    event,\n                    typeof this._eventedParentData === 'function' ? this._eventedParentData() : this._eventedParentData\n                );\n                parent.fire(event);\n            }\n\n        // To ensure that no error events are dropped, print them to the\n        // console if they have no listeners.\n        } else if (event instanceof ErrorEvent) {\n            console.error(event.error);\n        }\n\n        return this;\n    }\n\n    /**\n     * Returns true if this instance of Evented or any forwarded instances of Evented have a listener for the specified type.\n     *\n     * @param {string} type The event type.\n     * @returns {boolean} Returns `true` if there is at least one registered listener for specified event type, `false` otherwise.\n     * @private\n     */\n    listens(type: string): boolean {\n        return !!(\n            (this._listeners && this._listeners[type] && this._listeners[type].length > 0) ||\n            (this._oneTimeListeners && this._oneTimeListeners[type] && this._oneTimeListeners[type].length > 0) ||\n            (this._eventedParent && this._eventedParent.listens(type))\n        );\n    }\n\n    /**\n     * Bubble all events fired by this instance of Evented to this parent instance of Evented.\n     *\n     * @returns {Object} `this`\n     * @private\n     */\n    setEventedParent(parent: ?Evented, data?: Object | () => Object): this {\n        this._eventedParent = parent;\n        this._eventedParentData = data;\n\n        return this;\n    }\n}\n","// (c) Dean McNamee <dean@gmail.com>, 2012.\n//\n// https://github.com/deanm/css-color-parser-js\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// http://www.w3.org/TR/css3-color/\nvar kCSSColorTable = {\n  \"transparent\": [0,0,0,0], \"aliceblue\": [240,248,255,1],\n  \"antiquewhite\": [250,235,215,1], \"aqua\": [0,255,255,1],\n  \"aquamarine\": [127,255,212,1], \"azure\": [240,255,255,1],\n  \"beige\": [245,245,220,1], \"bisque\": [255,228,196,1],\n  \"black\": [0,0,0,1], \"blanchedalmond\": [255,235,205,1],\n  \"blue\": [0,0,255,1], \"blueviolet\": [138,43,226,1],\n  \"brown\": [165,42,42,1], \"burlywood\": [222,184,135,1],\n  \"cadetblue\": [95,158,160,1], \"chartreuse\": [127,255,0,1],\n  \"chocolate\": [210,105,30,1], \"coral\": [255,127,80,1],\n  \"cornflowerblue\": [100,149,237,1], \"cornsilk\": [255,248,220,1],\n  \"crimson\": [220,20,60,1], \"cyan\": [0,255,255,1],\n  \"darkblue\": [0,0,139,1], \"darkcyan\": [0,139,139,1],\n  \"darkgoldenrod\": [184,134,11,1], \"darkgray\": [169,169,169,1],\n  \"darkgreen\": [0,100,0,1], \"darkgrey\": [169,169,169,1],\n  \"darkkhaki\": [189,183,107,1], \"darkmagenta\": [139,0,139,1],\n  \"darkolivegreen\": [85,107,47,1], \"darkorange\": [255,140,0,1],\n  \"darkorchid\": [153,50,204,1], \"darkred\": [139,0,0,1],\n  \"darksalmon\": [233,150,122,1], \"darkseagreen\": [143,188,143,1],\n  \"darkslateblue\": [72,61,139,1], \"darkslategray\": [47,79,79,1],\n  \"darkslategrey\": [47,79,79,1], \"darkturquoise\": [0,206,209,1],\n  \"darkviolet\": [148,0,211,1], \"deeppink\": [255,20,147,1],\n  \"deepskyblue\": [0,191,255,1], \"dimgray\": [105,105,105,1],\n  \"dimgrey\": [105,105,105,1], \"dodgerblue\": [30,144,255,1],\n  \"firebrick\": [178,34,34,1], \"floralwhite\": [255,250,240,1],\n  \"forestgreen\": [34,139,34,1], \"fuchsia\": [255,0,255,1],\n  \"gainsboro\": [220,220,220,1], \"ghostwhite\": [248,248,255,1],\n  \"gold\": [255,215,0,1], \"goldenrod\": [218,165,32,1],\n  \"gray\": [128,128,128,1], \"green\": [0,128,0,1],\n  \"greenyellow\": [173,255,47,1], \"grey\": [128,128,128,1],\n  \"honeydew\": [240,255,240,1], \"hotpink\": [255,105,180,1],\n  \"indianred\": [205,92,92,1], \"indigo\": [75,0,130,1],\n  \"ivory\": [255,255,240,1], \"khaki\": [240,230,140,1],\n  \"lavender\": [230,230,250,1], \"lavenderblush\": [255,240,245,1],\n  \"lawngreen\": [124,252,0,1], \"lemonchiffon\": [255,250,205,1],\n  \"lightblue\": [173,216,230,1], \"lightcoral\": [240,128,128,1],\n  \"lightcyan\": [224,255,255,1], \"lightgoldenrodyellow\": [250,250,210,1],\n  \"lightgray\": [211,211,211,1], \"lightgreen\": [144,238,144,1],\n  \"lightgrey\": [211,211,211,1], \"lightpink\": [255,182,193,1],\n  \"lightsalmon\": [255,160,122,1], \"lightseagreen\": [32,178,170,1],\n  \"lightskyblue\": [135,206,250,1], \"lightslategray\": [119,136,153,1],\n  \"lightslategrey\": [119,136,153,1], \"lightsteelblue\": [176,196,222,1],\n  \"lightyellow\": [255,255,224,1], \"lime\": [0,255,0,1],\n  \"limegreen\": [50,205,50,1], \"linen\": [250,240,230,1],\n  \"magenta\": [255,0,255,1], \"maroon\": [128,0,0,1],\n  \"mediumaquamarine\": [102,205,170,1], \"mediumblue\": [0,0,205,1],\n  \"mediumorchid\": [186,85,211,1], \"mediumpurple\": [147,112,219,1],\n  \"mediumseagreen\": [60,179,113,1], \"mediumslateblue\": [123,104,238,1],\n  \"mediumspringgreen\": [0,250,154,1], \"mediumturquoise\": [72,209,204,1],\n  \"mediumvioletred\": [199,21,133,1], \"midnightblue\": [25,25,112,1],\n  \"mintcream\": [245,255,250,1], \"mistyrose\": [255,228,225,1],\n  \"moccasin\": [255,228,181,1], \"navajowhite\": [255,222,173,1],\n  \"navy\": [0,0,128,1], \"oldlace\": [253,245,230,1],\n  \"olive\": [128,128,0,1], \"olivedrab\": [107,142,35,1],\n  \"orange\": [255,165,0,1], \"orangered\": [255,69,0,1],\n  \"orchid\": [218,112,214,1], \"palegoldenrod\": [238,232,170,1],\n  \"palegreen\": [152,251,152,1], \"paleturquoise\": [175,238,238,1],\n  \"palevioletred\": [219,112,147,1], \"papayawhip\": [255,239,213,1],\n  \"peachpuff\": [255,218,185,1], \"peru\": [205,133,63,1],\n  \"pink\": [255,192,203,1], \"plum\": [221,160,221,1],\n  \"powderblue\": [176,224,230,1], \"purple\": [128,0,128,1],\n  \"rebeccapurple\": [102,51,153,1],\n  \"red\": [255,0,0,1], \"rosybrown\": [188,143,143,1],\n  \"royalblue\": [65,105,225,1], \"saddlebrown\": [139,69,19,1],\n  \"salmon\": [250,128,114,1], \"sandybrown\": [244,164,96,1],\n  \"seagreen\": [46,139,87,1], \"seashell\": [255,245,238,1],\n  \"sienna\": [160,82,45,1], \"silver\": [192,192,192,1],\n  \"skyblue\": [135,206,235,1], \"slateblue\": [106,90,205,1],\n  \"slategray\": [112,128,144,1], \"slategrey\": [112,128,144,1],\n  \"snow\": [255,250,250,1], \"springgreen\": [0,255,127,1],\n  \"steelblue\": [70,130,180,1], \"tan\": [210,180,140,1],\n  \"teal\": [0,128,128,1], \"thistle\": [216,191,216,1],\n  \"tomato\": [255,99,71,1], \"turquoise\": [64,224,208,1],\n  \"violet\": [238,130,238,1], \"wheat\": [245,222,179,1],\n  \"white\": [255,255,255,1], \"whitesmoke\": [245,245,245,1],\n  \"yellow\": [255,255,0,1], \"yellowgreen\": [154,205,50,1]}\n\nfunction clamp_css_byte(i) {  // Clamp to integer 0 .. 255.\n  i = Math.round(i);  // Seems to be what Chrome does (vs truncation).\n  return i < 0 ? 0 : i > 255 ? 255 : i;\n}\n\nfunction clamp_css_float(f) {  // Clamp to float 0.0 .. 1.0.\n  return f < 0 ? 0 : f > 1 ? 1 : f;\n}\n\nfunction parse_css_int(str) {  // int or percentage.\n  if (str[str.length - 1] === '%')\n    return clamp_css_byte(parseFloat(str) / 100 * 255);\n  return clamp_css_byte(parseInt(str));\n}\n\nfunction parse_css_float(str) {  // float or percentage.\n  if (str[str.length - 1] === '%')\n    return clamp_css_float(parseFloat(str) / 100);\n  return clamp_css_float(parseFloat(str));\n}\n\nfunction css_hue_to_rgb(m1, m2, h) {\n  if (h < 0) h += 1;\n  else if (h > 1) h -= 1;\n\n  if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;\n  if (h * 2 < 1) return m2;\n  if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;\n  return m1;\n}\n\nfunction parseCSSColor(css_str) {\n  // Remove all whitespace, not compliant, but should just be more accepting.\n  var str = css_str.replace(/ /g, '').toLowerCase();\n\n  // Color keywords (and transparent) lookup.\n  if (str in kCSSColorTable) return kCSSColorTable[str].slice();  // dup.\n\n  // #abc and #abc123 syntax.\n  if (str[0] === '#') {\n    if (str.length === 4) {\n      var iv = parseInt(str.substr(1), 16);  // TODO(deanm): Stricter parsing.\n      if (!(iv >= 0 && iv <= 0xfff)) return null;  // Covers NaN.\n      return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8),\n              (iv & 0xf0) | ((iv & 0xf0) >> 4),\n              (iv & 0xf) | ((iv & 0xf) << 4),\n              1];\n    } else if (str.length === 7) {\n      var iv = parseInt(str.substr(1), 16);  // TODO(deanm): Stricter parsing.\n      if (!(iv >= 0 && iv <= 0xffffff)) return null;  // Covers NaN.\n      return [(iv & 0xff0000) >> 16,\n              (iv & 0xff00) >> 8,\n              iv & 0xff,\n              1];\n    }\n\n    return null;\n  }\n\n  var op = str.indexOf('('), ep = str.indexOf(')');\n  if (op !== -1 && ep + 1 === str.length) {\n    var fname = str.substr(0, op);\n    var params = str.substr(op+1, ep-(op+1)).split(',');\n    var alpha = 1;  // To allow case fallthrough.\n    switch (fname) {\n      case 'rgba':\n        if (params.length !== 4) return null;\n        alpha = parse_css_float(params.pop());\n        // Fall through.\n      case 'rgb':\n        if (params.length !== 3) return null;\n        return [parse_css_int(params[0]),\n                parse_css_int(params[1]),\n                parse_css_int(params[2]),\n                alpha];\n      case 'hsla':\n        if (params.length !== 4) return null;\n        alpha = parse_css_float(params.pop());\n        // Fall through.\n      case 'hsl':\n        if (params.length !== 3) return null;\n        var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360;  // 0 .. 1\n        // NOTE(deanm): According to the CSS spec s/l should only be\n        // percentages, but we don't bother and let float or percentage.\n        var s = parse_css_float(params[1]);\n        var l = parse_css_float(params[2]);\n        var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n        var m1 = l * 2 - m2;\n        return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255),\n                clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255),\n                clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255),\n                alpha];\n      default:\n        return null;\n    }\n  }\n\n  return null;\n}\n\ntry { exports.parseCSSColor = parseCSSColor } catch(e) { }\n","// @flow\n\nimport {parseCSSColor} from 'csscolorparser';\n\n/**\n * An RGBA color value. Create instances from color strings using the static\n * method `Color.parse`. The constructor accepts RGB channel values in the range\n * `[0, 1]`, premultiplied by A.\n *\n * @param {number} r The red channel.\n * @param {number} g The green channel.\n * @param {number} b The blue channel.\n * @param {number} a The alpha channel.\n * @private\n */\nclass Color {\n    r: number;\n    g: number;\n    b: number;\n    a: number;\n\n    constructor(r: number, g: number, b: number, a: number = 1) {\n        this.r = r;\n        this.g = g;\n        this.b = b;\n        this.a = a;\n    }\n\n    static black: Color;\n    static white: Color;\n    static transparent: Color;\n    static red: Color;\n    static blue: Color;\n\n    /**\n     * Parses valid CSS color strings and returns a `Color` instance.\n     * @returns A `Color` instance, or `undefined` if the input is not a valid color string.\n     */\n    static parse(input?: string | Color | null): Color | void {\n        if (!input) {\n            return undefined;\n        }\n\n        if (input instanceof Color) {\n            return input;\n        }\n\n        if (typeof input !== 'string') {\n            return undefined;\n        }\n\n        const rgba = parseCSSColor(input);\n        if (!rgba) {\n            return undefined;\n        }\n\n        return new Color(\n            rgba[0] / 255 * rgba[3],\n            rgba[1] / 255 * rgba[3],\n            rgba[2] / 255 * rgba[3],\n            rgba[3]\n        );\n    }\n\n    /**\n     * Returns an RGBA string representing the color value.\n     *\n     * @returns An RGBA string.\n     * @example\n     * var purple = new Color.parse('purple');\n     * purple.toString; // = \"rgba(128,0,128,1)\"\n     * var translucentGreen = new Color.parse('rgba(26, 207, 26, .73)');\n     * translucentGreen.toString(); // = \"rgba(26,207,26,0.73)\"\n     */\n    toString(): string {\n        const [r, g, b, a] = this.toArray();\n        return `rgba(${Math.round(r)},${Math.round(g)},${Math.round(b)},${a})`;\n    }\n\n    /**\n     * Returns an RGBA array of values representing the color, unpremultiplied by A.\n     *\n     * @returns An array of RGBA color values in the range [0, 255].\n     */\n    toArray(): [number, number, number, number] {\n        const {r, g, b, a} = this;\n        return a === 0 ? [0, 0, 0, 0] : [\n            r * 255 / a,\n            g * 255 / a,\n            b * 255 / a,\n            a\n        ];\n    }\n\n    /**\n     * Returns a RGBA array of float values representing the color, unpremultiplied by A.\n     *\n     * @returns An array of RGBA color values in the range [0, 1].\n     */\n    toArray01(): [number, number, number, number] {\n        const {r, g, b, a} = this;\n        return a === 0 ? [0, 0, 0, 0] : [\n            r / a,\n            g / a,\n            b / a,\n            a\n        ];\n    }\n\n    /**\n     * Returns an RGB array of values representing the color, unpremultiplied by A and multiplied by a scalar.\n     *\n     * @param {number} scale A scale to apply to the unpremultiplied-alpha values.\n     * @returns An array of RGB color values in the range [0, 1].\n     */\n    toArray01Scaled(scale: number): [number, number, number] {\n        const {r, g, b, a} = this;\n        return a === 0 ? [0, 0, 0] : [\n            (r / a) * scale,\n            (g / a) * scale,\n            (b / a) * scale\n        ];\n    }\n\n    /**\n     * Returns an RGBA array of values representing the color, premultiplied by A.\n     *\n     * @returns An array of RGBA color values in the range [0, 1].\n     */\n    toArray01PremultipliedAlpha(): [number, number, number, number] {\n        const {r, g, b, a} = this;\n        return [\n            r,\n            g,\n            b,\n            a\n        ];\n    }\n\n    /**\n     * Returns an RGBA array of values representing the color, unpremultiplied by A, and converted to linear color space.\n     * The color is defined by sRGB primaries, but the sRGB transfer function is reversed to obtain linear energy.\n     *\n     * @returns An array of RGBA color values in the range [0, 1].\n     */\n    toArray01Linear(): [number, number, number, number] {\n        const {r, g, b, a} = this;\n        return a === 0 ? [0, 0, 0, 0] : [\n            Math.pow((r / a), 2.2),\n            Math.pow((g / a), 2.2),\n            Math.pow((b / a), 2.2),\n            a\n        ];\n    }\n}\n\nColor.black = new Color(0, 0, 0, 1);\nColor.white = new Color(1, 1, 1, 1);\nColor.transparent = new Color(0, 0, 0, 0);\nColor.red = new Color(1, 0, 0, 1);\nColor.blue = new Color(0, 0, 1, 1);\n\nexport default Color;\n","// @flow\n\nimport Color from './color.js';\n\nexport function number(a: number, b: number, t: number): number {\n    return (a * (1 - t)) + (b * t);\n}\n\nexport function color(from: Color, to: Color, t: number): Color {\n    return new Color(\n        number(from.r, to.r, t),\n        number(from.g, to.g, t),\n        number(from.b, to.b, t),\n        number(from.a, to.a, t)\n    );\n}\n\nexport function array(from: Array<number>, to: Array<number>, t: number): Array<number> {\n    return from.map((d, i) => {\n        return number(d, to[i], t);\n    });\n}\n","// @flow\n\nexport default function (output: any, ...inputs: Array<any>): any {\n    for (const input of inputs) {\n        for (const k in input) {\n            output[k] = input[k];\n        }\n    }\n    return output;\n}\n","// @flow\n\nclass ParsingError extends Error {\n    key: string;\n    message: string;\n    constructor(key: string, message: string) {\n        super(message);\n        this.message = message;\n        this.key = key;\n    }\n}\n\nexport default ParsingError;\n","// @flow\n\nimport type {Expression} from './expression.js';\n\n/**\n * Tracks `let` bindings during expression parsing.\n * @private\n */\nclass Scope {\n    parent: ?Scope;\n    bindings: {[_: string]: Expression};\n    constructor(parent?: Scope, bindings: Array<[string, Expression]> = []) {\n        this.parent = parent;\n        this.bindings = {};\n        for (const [name, expression] of bindings) {\n            this.bindings[name] = expression;\n        }\n    }\n\n    concat(bindings: Array<[string, Expression]>): Scope {\n        return new Scope(this, bindings);\n    }\n\n    get(name: string): Expression {\n        if (this.bindings[name]) { return this.bindings[name]; }\n        if (this.parent) { return this.parent.get(name); }\n        throw new Error(`${name} not found in scope.`);\n    }\n\n    has(name: string): boolean {\n        if (this.bindings[name]) return true;\n        return this.parent ? this.parent.has(name) : false;\n    }\n}\n\nexport default Scope;\n","// @flow\n\nexport type NullTypeT = { kind: 'null' };\nexport type NumberTypeT = { kind: 'number' };\nexport type StringTypeT = { kind: 'string' };\nexport type BooleanTypeT = { kind: 'boolean' };\nexport type ColorTypeT = { kind: 'color' };\nexport type ObjectTypeT = { kind: 'object' };\nexport type ValueTypeT = { kind: 'value' };\nexport type ErrorTypeT = { kind: 'error' };\nexport type CollatorTypeT = { kind: 'collator' };\nexport type FormattedTypeT = { kind: 'formatted' };\nexport type ResolvedImageTypeT = { kind: 'resolvedImage' };\n\nexport type EvaluationKind = 'constant' | 'source' | 'camera' | 'composite';\n\nexport type Type =\n    NullTypeT |\n    NumberTypeT |\n    StringTypeT |\n    BooleanTypeT |\n    ColorTypeT |\n    ObjectTypeT |\n    ValueTypeT |\n    ArrayType | // eslint-disable-line no-use-before-define\n    ErrorTypeT |\n    CollatorTypeT |\n    FormattedTypeT |\n    ResolvedImageTypeT |\n    ArrayType;\n\nexport type ArrayType = {\n    kind: 'array',\n    itemType: Type,\n    N: ?number\n}\n\nexport type NativeType = 'number' | 'string' | 'boolean' | 'null' | 'array' | 'object'\n\nexport const NullType = {kind: 'null'};\nexport const NumberType = {kind: 'number'};\nexport const StringType = {kind: 'string'};\nexport const BooleanType = {kind: 'boolean'};\nexport const ColorType = {kind: 'color'};\nexport const ObjectType = {kind: 'object'};\nexport const ValueType = {kind: 'value'};\nexport const ErrorType = {kind: 'error'};\nexport const CollatorType = {kind: 'collator'};\nexport const FormattedType = {kind: 'formatted'};\nexport const ResolvedImageType = {kind: 'resolvedImage'};\n\nexport function array(itemType: Type, N: ?number): ArrayType {\n    return {\n        kind: 'array',\n        itemType,\n        N\n    };\n}\n\nexport function toString(type: Type): string {\n    if (type.kind === 'array') {\n        const itemType = toString(type.itemType);\n        return typeof type.N === 'number' ?\n            `array<${itemType}, ${type.N}>` :\n            type.itemType.kind === 'value' ? 'array' : `array<${itemType}>`;\n    } else {\n        return type.kind;\n    }\n}\n\nconst valueMemberTypes = [\n    NullType,\n    NumberType,\n    StringType,\n    BooleanType,\n    ColorType,\n    FormattedType,\n    ObjectType,\n    array(ValueType),\n    ResolvedImageType\n];\n\n/**\n * Returns null if `t` is a subtype of `expected`; otherwise returns an\n * error message.\n * @private\n */\nexport function checkSubtype(expected: Type, t: Type): ?string {\n    if (t.kind === 'error') {\n        // Error is a subtype of every type\n        return null;\n    } else if (expected.kind === 'array') {\n        if (t.kind === 'array' &&\n            ((t.N === 0 && t.itemType.kind === 'value') || !checkSubtype(expected.itemType, t.itemType)) &&\n            (typeof expected.N !== 'number' || expected.N === t.N)) {\n            return null;\n        }\n    } else if (expected.kind === t.kind) {\n        return null;\n    } else if (expected.kind === 'value') {\n        for (const memberType of valueMemberTypes) {\n            if (!checkSubtype(memberType, t)) {\n                return null;\n            }\n        }\n    }\n\n    return `Expected ${toString(expected)} but found ${toString(t)} instead.`;\n}\n\nexport function isValidType(provided: Type, allowedTypes: Array<Type>): boolean {\n    return allowedTypes.some(t => t.kind === provided.kind);\n}\n\nexport function isValidNativeType(provided: any, allowedTypes: Array<NativeType>): boolean {\n    return allowedTypes.some(t => {\n        if (t === 'null') {\n            return provided === null;\n        } else if (t === 'array') {\n            return Array.isArray(provided);\n        } else if (t === 'object') {\n            return provided && !Array.isArray(provided) && typeof provided === 'object';\n        } else {\n            return t === typeof provided;\n        }\n    });\n}\n","// @flow\n\nexport default class Collator {\n    locale: string | null;\n    sensitivity: 'base' | 'accent' | 'case' | 'variant';\n    collator: Intl$Collator;\n\n    constructor(caseSensitive: boolean, diacriticSensitive: boolean, locale: string | null) {\n        if (caseSensitive)\n            this.sensitivity = diacriticSensitive ? 'variant' : 'case';\n        else\n            this.sensitivity = diacriticSensitive ? 'accent' : 'base';\n\n        this.locale = locale;\n        this.collator = new Intl.Collator(this.locale ? this.locale : [],\n            {sensitivity: this.sensitivity, usage: 'search'});\n    }\n\n    compare(lhs: string, rhs: string): number {\n        return this.collator.compare(lhs, rhs);\n    }\n\n    resolvedLocale(): string {\n        // We create a Collator without \"usage: search\" because we don't want\n        // the search options encoded in our result (e.g. \"en-u-co-search\")\n        return new Intl.Collator(this.locale ? this.locale : [])\n            .resolvedOptions().locale;\n    }\n}\n","// @flow\nimport type Color from '../../util/color.js';\nimport type ResolvedImage from '../types/resolved_image.js';\n\nexport class FormattedSection {\n    text: string;\n    image: ResolvedImage | null;\n    scale: number | null;\n    fontStack: string | null;\n    textColor: Color | null;\n\n    constructor(text: string, image: ResolvedImage | null, scale: number | null, fontStack: string | null, textColor: Color | null) {\n        // combine characters so that diacritic marks are not separate code points\n        this.text = text.normalize ? text.normalize() : text;\n        this.image = image;\n        this.scale = scale;\n        this.fontStack = fontStack;\n        this.textColor = textColor;\n    }\n}\n\nexport default class Formatted {\n    sections: Array<FormattedSection>;\n\n    constructor(sections: Array<FormattedSection>) {\n        this.sections = sections;\n    }\n\n    static fromString(unformatted: string): Formatted {\n        return new Formatted([new FormattedSection(unformatted, null, null, null, null)]);\n    }\n\n    isEmpty(): boolean {\n        if (this.sections.length === 0) return true;\n        return !this.sections.some(section => section.text.length !== 0 ||\n                                             (section.image && section.image.namePrimary.length !== 0));\n    }\n\n    static factory(text: Formatted | string): Formatted {\n        if (text instanceof Formatted) {\n            return text;\n        } else {\n            return Formatted.fromString(text);\n        }\n    }\n\n    toString(): string {\n        if (this.sections.length === 0) return '';\n        return this.sections.map(section => section.text).join('');\n    }\n\n    serialize(): Array<mixed> {\n        const serialized: Array<mixed> = [\"format\"];\n        for (const section of this.sections) {\n            if (section.image) {\n                serialized.push([\"image\", section.image.namePrimary]);\n                continue;\n            }\n            serialized.push(section.text);\n            const options: { [key: string]: mixed } = {};\n            if (section.fontStack) {\n                options[\"text-font\"] = [\"literal\", section.fontStack.split(',')];\n            }\n            if (section.scale) {\n                options[\"font-scale\"] = section.scale;\n            }\n            if (section.textColor) {\n                options[\"text-color\"] = ([\"rgba\"]: Array<mixed>).concat(section.textColor.toArray());\n            }\n            serialized.push(options);\n        }\n        return serialized;\n    }\n}\n","// @flow\n\nexport type ResolvedImageOptions = {\n    namePrimary: string,\n    nameSecondary: ?string,\n    available: boolean\n};\n\nexport default class ResolvedImage {\n    namePrimary: string;\n    nameSecondary: ?string;\n    available: boolean;\n\n    constructor(options: ResolvedImageOptions) {\n        this.namePrimary = options.namePrimary;\n        if (options.nameSecondary) {\n            this.nameSecondary = options.nameSecondary;\n        }\n        this.available = options.available;\n    }\n\n    toString(): string {\n        if (this.nameSecondary) {\n            return `[${this.namePrimary},${this.nameSecondary}]`;\n        }\n        return this.namePrimary;\n    }\n\n    static fromString(namePrimary: string, nameSecondary: ?string): ResolvedImage | null {\n        if (!namePrimary) return null; // treat empty values as no image\n        return new ResolvedImage({namePrimary, nameSecondary, available: false});\n    }\n\n    serialize(): Array<string> {\n        if (this.nameSecondary) {\n            return [\"image\", this.namePrimary, this.nameSecondary];\n        }\n        return [\"image\", this.namePrimary];\n    }\n}\n","// @flow\n\nimport assert from 'assert';\n\nimport Color from '../util/color.js';\nimport Collator from './types/collator.js';\nimport Formatted from './types/formatted.js';\nimport ResolvedImage from './types/resolved_image.js';\nimport {NullType, NumberType, StringType, BooleanType, ColorType, ObjectType, ValueType, CollatorType, FormattedType, ResolvedImageType, array} from './types.js';\n\nimport type {Type} from './types.js';\n\nexport function validateRGBA(r: mixed, g: mixed, b: mixed, a?: mixed): string | null {\n    if (!(\n        typeof r === 'number' && r >= 0 && r <= 255 &&\n        typeof g === 'number' && g >= 0 && g <= 255 &&\n        typeof b === 'number' && b >= 0 && b <= 255\n    )) {\n        const value = typeof a === 'number' ? [r, g, b, a] : [r, g, b];\n        return `Invalid rgba value [${value.join(', ')}]: 'r', 'g', and 'b' must be between 0 and 255.`;\n    }\n\n    if (!(\n        typeof a === 'undefined' || (typeof a === 'number' && a >= 0 && a <= 1)\n    )) {\n        return `Invalid rgba value [${[r, g, b, a].join(', ')}]: 'a' must be between 0 and 1.`;\n    }\n\n    return null;\n}\n\nexport function validateHSLA(h: mixed, s: mixed, l: mixed, a?: mixed): string | null {\n    if (!(\n        typeof h === 'number' && h >= 0 && h <= 360\n    )) {\n        const value = typeof a === 'number' ? [h, s, l, a] : [h, s, l];\n        return `Invalid hsla value [${value.join(', ')}]: 'h' must be between 0 and 360.`;\n    }\n\n    if (!(\n        typeof s === 'number' && s >= 0 && s <= 100 &&\n        typeof l === 'number' && l >= 0 && l <= 100\n    )) {\n        const value = typeof a === 'number' ? [h, s, l, a] : [h, s, l];\n        return `Invalid hsla value [${value.join(', ')}]: 's', and 'l' must be between 0 and 100.`;\n    }\n\n    if (!(\n        typeof a === 'undefined' || (typeof a === 'number' && a >= 0 && a <= 1)\n    )) {\n        return `Invalid hsla value [${[h, s, l, a].join(', ')}]: 'a' must be between 0 and 1.`;\n    }\n\n    return null;\n}\n\nexport type Value = null | string | boolean | number | Color | Collator | Formatted | ResolvedImage | $ReadOnlyArray<Value> | { +[string]: Value }\n\nexport function isValue(mixed: mixed): boolean {\n    if (mixed === null) {\n        return true;\n    } else if (typeof mixed === 'string') {\n        return true;\n    } else if (typeof mixed === 'boolean') {\n        return true;\n    } else if (typeof mixed === 'number') {\n        return true;\n    } else if (mixed instanceof Color) {\n        return true;\n    } else if (mixed instanceof Collator) {\n        return true;\n    } else if (mixed instanceof Formatted) {\n        return true;\n    } else if (mixed instanceof ResolvedImage) {\n        return true;\n    } else if (Array.isArray(mixed)) {\n        for (const item of mixed) {\n            if (!isValue(item)) {\n                return false;\n            }\n        }\n        return true;\n    } else if (typeof mixed === 'object') {\n        for (const key in mixed) {\n            if (!isValue(mixed[key])) {\n                return false;\n            }\n        }\n        return true;\n    } else {\n        return false;\n    }\n}\n\nexport function typeOf(value: Value): Type {\n    if (value === null) {\n        return NullType;\n    } else if (typeof value === 'string') {\n        return StringType;\n    } else if (typeof value === 'boolean') {\n        return BooleanType;\n    } else if (typeof value === 'number') {\n        return NumberType;\n    } else if (value instanceof Color) {\n        return ColorType;\n    } else if (value instanceof Collator) {\n        return CollatorType;\n    } else if (value instanceof Formatted) {\n        return FormattedType;\n    } else if (value instanceof ResolvedImage) {\n        return ResolvedImageType;\n    } else if (Array.isArray(value)) {\n        const length = value.length;\n        let itemType: Type | typeof undefined;\n\n        for (const item of value) {\n            const t = typeOf(item);\n            if (!itemType) {\n                itemType = t;\n            } else if (itemType === t) {\n                continue;\n            } else {\n                itemType = ValueType;\n                break;\n            }\n        }\n\n        return array(itemType || ValueType, length);\n    } else {\n        assert(typeof value === 'object');\n        return ObjectType;\n    }\n}\n\nexport function toString(value: Value): string {\n    const type = typeof value;\n    if (value === null) {\n        return '';\n    } else if (type === 'string' || type === 'number' || type === 'boolean') {\n        return String(value);\n    } else if (value instanceof Color || value instanceof Formatted || value instanceof ResolvedImage) {\n        return value.toString();\n    } else {\n        return JSON.stringify(value);\n    }\n}\n\nexport {Color, Collator};\n","// @flow\n\nimport assert from 'assert';\nimport {isValue, typeOf, Color} from '../values.js';\nimport Formatted from '../types/formatted.js';\n\nimport type {Type} from '../types.js';\nimport type {Value}  from '../values.js';\nimport type {Expression, SerializedExpression} from '../expression.js';\nimport type ParsingContext from '../parsing_context.js';\n\nclass Literal implements Expression {\n    type: Type;\n    value: Value;\n\n    constructor(type: Type, value: Value) {\n        this.type = type;\n        this.value = value;\n    }\n\n    static parse(args: $ReadOnlyArray<mixed>, context: ParsingContext): void | Literal {\n        if (args.length !== 2)\n            return context.error(`'literal' expression requires exactly one argument, but found ${args.length - 1} instead.`);\n\n        if (!isValue(args[1]))\n            return context.error(`invalid value`);\n\n        const value = (args[1]: any);\n        let type = typeOf(value);\n\n        // special case: infer the item type if possible for zero-length arrays\n        const expected = context.expectedType;\n        if (\n            type.kind === 'array' &&\n            type.N === 0 &&\n            expected &&\n            expected.kind === 'array' &&\n            (typeof expected.N !== 'number' || expected.N === 0)\n        ) {\n            type = expected;\n        }\n\n        return new Literal(type, value);\n    }\n\n    evaluate(): Value {\n        return this.value;\n    }\n\n    eachChild() {}\n\n    outputDefined(): boolean {\n        return true;\n    }\n\n    serialize(): SerializedExpression {\n        if (this.type.kind === 'array' || this.type.kind === 'object') {\n            return [\"literal\", this.value];\n        } else if (this.value instanceof Color) {\n            // Constant-folding can generate Literal expressions that you\n            // couldn't actually generate with a \"literal\" expression,\n            // so we have to implement an equivalent serialization here\n            return [\"rgba\"].concat(this.value.toArray());\n        } else if (this.value instanceof Formatted) {\n            // Same as Color\n            return this.value.serialize();\n        } else {\n            assert(this.value === null ||\n                typeof this.value === 'string' ||\n                typeof this.value === 'number' ||\n                typeof this.value === 'boolean');\n            return (this.value: any);\n        }\n    }\n}\n\nexport default Literal;\n","// @flow\n\nclass RuntimeError {\n    name: string;\n    message: string;\n\n    constructor(message: string) {\n        this.name = 'ExpressionEvaluationError';\n        this.message = message;\n    }\n\n    toJSON(): string {\n        return this.message;\n    }\n}\n\nexport default RuntimeError;\n","// @flow\n\nimport assert from 'assert';\n\nimport {\n    ObjectType,\n    ValueType,\n    StringType,\n    NumberType,\n    BooleanType,\n    checkSubtype,\n    toString,\n    array\n} from '../types.js';\nimport RuntimeError from '../runtime_error.js';\nimport {typeOf} from '../values.js';\n\nimport type {Expression, SerializedExpression} from '../expression.js';\nimport type ParsingContext from '../parsing_context.js';\nimport type EvaluationContext from '../evaluation_context.js';\nimport type {Type} from '../types.js';\n\nconst types = {\n    string: StringType,\n    number: NumberType,\n    boolean: BooleanType,\n    object: ObjectType\n};\n\nclass Assertion implements Expression {\n    type: Type;\n    args: Array<Expression>;\n\n    constructor(type: Type, args: Array<Expression>) {\n        this.type = type;\n        this.args = args;\n    }\n\n    static parse(args: $ReadOnlyArray<mixed>, context: ParsingContext): ?Expression {\n        if (args.length < 2)\n            return context.error(`Expected at least one argument.`);\n\n        let i = 1;\n        let type;\n\n        const name: string = (args[0]: any);\n        if (name === 'array') {\n            let itemType;\n            if (args.length > 2) {\n                const type = args[1];\n                if (typeof type !== 'string' || !(type in types) || type === 'object')\n                    return context.error('The item type argument of \"array\" must be one of string, number, boolean', 1);\n                itemType = types[type];\n                i++;\n            } else {\n                itemType = ValueType;\n            }\n\n            let N: ?number;\n            if (args.length > 3) {\n                if (args[2] !== null &&\n                    (typeof args[2] !== 'number' ||\n                        args[2] < 0 ||\n                        args[2] !== Math.floor(args[2]))\n                ) {\n                    return context.error('The length argument to \"array\" must be a positive integer literal', 2);\n                }\n                N = ((args[2]: any): number);\n                i++;\n            }\n\n            type = array(itemType, N);\n        } else {\n            assert(types[name], name);\n            type = types[name];\n        }\n\n        const parsed = [];\n        for (; i < args.length; i++) {\n            const input = context.parse(args[i], i, ValueType);\n            if (!input) return null;\n            parsed.push(input);\n        }\n\n        return new Assertion(type, parsed);\n    }\n\n    evaluate(ctx: EvaluationContext): any | null {\n        for (let i = 0; i < this.args.length; i++) {\n            const value = this.args[i].evaluate(ctx);\n            const error = checkSubtype(this.type, typeOf(value));\n            if (!error) {\n                return value;\n            } else if (i === this.args.length - 1) {\n                throw new RuntimeError(`Expected value to be of type ${toString(this.type)}, but found ${toString(typeOf(value))} instead.`);\n            }\n        }\n\n        assert(false);\n        return null;\n    }\n\n    eachChild(fn: (_: Expression) => void) {\n        this.args.forEach(fn);\n    }\n\n    outputDefined(): boolean {\n        return this.args.every(arg => arg.outputDefined());\n    }\n\n    serialize(): SerializedExpression {\n        const type = this.type;\n        const serialized = [type.kind];\n        if (type.kind === 'array') {\n            const itemType = type.itemType;\n            if (itemType.kind === 'string' ||\n                itemType.kind === 'number' ||\n                itemType.kind === 'boolean') {\n                serialized.push(itemType.kind);\n                const N = type.N;\n                if (typeof N === 'number' || this.args.length > 1) {\n                    serialized.push(N);\n                }\n            }\n        }\n        return serialized.concat(this.args.map(arg => arg.serialize()));\n    }\n}\n\nexport default Assertion;\n","// @flow\n\nimport {NumberType, ValueType, FormattedType, array, StringType, ColorType, ResolvedImageType} from '../types.js';\nimport Formatted, {FormattedSection} from '../types/formatted.js';\nimport {toString, typeOf} from '../values.js';\n\nimport type {Expression, SerializedExpression} from '../expression.js';\nimport type EvaluationContext from '../evaluation_context.js';\nimport type ParsingContext from '../parsing_context.js';\nimport type {Type} from '../types.js';\n\nexport type FormattedSectionExpression = {\n    // Content of a section may be Image expression or other\n    // type of expression that is coercable to 'string'.\n    content: Expression,\n    scale: Expression | null;\n    font: Expression | null;\n    textColor: Expression | null;\n}\n\nexport default class FormatExpression implements Expression {\n    type: Type;\n    sections: Array<FormattedSectionExpression>;\n\n    constructor(sections: Array<FormattedSectionExpression>) {\n        this.type = FormattedType;\n        this.sections = sections;\n    }\n\n    static parse(args: $ReadOnlyArray<mixed>, context: ParsingContext): ?Expression {\n        if (args.length < 2) {\n            return context.error(`Expected at least one argument.`);\n        }\n\n        const firstArg = args[1];\n        if (!Array.isArray(firstArg) && typeof firstArg === 'object')  {\n            return context.error(`First argument must be an image or text section.`);\n        }\n\n        const sections: Array<FormattedSectionExpression> = [];\n        let nextTokenMayBeObject = false;\n        for (let i = 1; i <= args.length - 1; ++i) {\n            const arg = (args[i]: any);\n\n            if (nextTokenMayBeObject && typeof arg === \"object\" && !Array.isArray(arg)) {\n                nextTokenMayBeObject = false;\n\n                let scale = null;\n                if (arg['font-scale']) {\n                    scale = context.parse(arg['font-scale'], 1, NumberType);\n                    if (!scale) return null;\n                }\n\n                let font = null;\n                if (arg['text-font']) {\n                    font = context.parse(arg['text-font'], 1, array(StringType));\n                    if (!font) return null;\n                }\n\n                let textColor = null;\n                if (arg['text-color']) {\n                    textColor = context.parse(arg['text-color'], 1, ColorType);\n                    if (!textColor) return null;\n                }\n\n                const lastExpression = sections[sections.length - 1];\n                lastExpression.scale = scale;\n                lastExpression.font = font;\n                lastExpression.textColor = textColor;\n            } else {\n                const content = context.parse(args[i], 1, ValueType);\n                if (!content) return null;\n\n                const kind = content.type.kind;\n                if (kind !== 'string' && kind !== 'value' && kind !== 'null' && kind !== 'resolvedImage')\n                    return context.error(`Formatted text type must be 'string', 'value', 'image' or 'null'.`);\n\n                nextTokenMayBeObject = true;\n                sections.push({content, scale: null, font: null, textColor: null});\n            }\n        }\n\n        return new FormatExpression(sections);\n    }\n\n    evaluate(ctx: EvaluationContext): Formatted {\n        const evaluateSection = (section: FormattedSectionExpression) => {\n            const evaluatedContent = section.content.evaluate(ctx);\n            if (typeOf(evaluatedContent) === ResolvedImageType) {\n                return new FormattedSection('', evaluatedContent, null, null, null);\n            }\n\n            return new FormattedSection(\n                    toString(evaluatedContent),\n                    null,\n                    section.scale ? section.scale.evaluate(ctx) : null,\n                    section.font ? section.font.evaluate(ctx).join(',') : null,\n                    section.textColor ? section.textColor.evaluate(ctx) : null\n            );\n        };\n\n        return new Formatted(this.sections.map(evaluateSection));\n    }\n\n    eachChild(fn: (_: Expression) => void) {\n        for (const section of this.sections) {\n            fn(section.content);\n            if (section.scale) {\n                fn(section.scale);\n            }\n            if (section.font) {\n                fn(section.font);\n            }\n            if (section.textColor) {\n                fn(section.textColor);\n            }\n        }\n    }\n\n    outputDefined(): boolean {\n        // Technically the combinatoric set of all children\n        // Usually, this.text will be undefined anyway\n        return false;\n    }\n\n    serialize(): SerializedExpression {\n        const serialized = [\"format\"];\n        for (const section of this.sections) {\n            serialized.push(section.content.serialize());\n            const options = {};\n            if (section.scale) {\n                options['font-scale'] = section.scale.serialize();\n            }\n            if (section.font) {\n                options['text-font'] = section.font.serialize();\n            }\n            if (section.textColor) {\n                options['text-color'] = section.textColor.serialize();\n            }\n            serialized.push(options);\n        }\n        return serialized;\n    }\n}\n","// @flow\n\nimport {ResolvedImageType, StringType} from '../types.js';\nimport ResolvedImage from '../types/resolved_image.js';\n\nimport type {Expression, SerializedExpression} from '../expression.js';\nimport type EvaluationContext from '../evaluation_context.js';\nimport type ParsingContext from '../parsing_context.js';\nimport type {Type} from '../types.js';\n\nexport default class ImageExpression implements Expression {\n    type: Type;\n    inputPrimary: Expression;\n    inputSecondary: ?Expression;\n\n    constructor(inputPrimary: Expression, inputSecondary: ?Expression) {\n        this.type = ResolvedImageType;\n        this.inputPrimary = inputPrimary;\n        this.inputSecondary = inputSecondary;\n    }\n\n    static parse(args: $ReadOnlyArray<mixed>, context: ParsingContext): ?Expression {\n        if (args.length < 2) {\n            return context.error(`Expected two or more arguments.`);\n        }\n\n        const namePrimary = context.parse(args[1], 1, StringType);\n        if (!namePrimary) return context.error(`No image name provided.`);\n\n        if (args.length === 2) {\n            return new ImageExpression(namePrimary);\n        }\n\n        const nameSecondary = context.parse(args[2], 1, StringType);\n        if (!nameSecondary) return context.error(`Secondary image variant is not a string.`);\n\n        return new ImageExpression(namePrimary, nameSecondary);\n    }\n\n    evaluate(ctx: EvaluationContext): null | ResolvedImage {\n        const value = ResolvedImage.fromString(this.inputPrimary.evaluate(ctx), this.inputSecondary ? this.inputSecondary.evaluate(ctx) : undefined);\n        if (value && ctx.availableImages) {\n            value.available = ctx.availableImages.indexOf(value.namePrimary) > -1;\n            // If there's a secondary variant, only mark it available if both are present\n            if (value.nameSecondary && value.available && ctx.availableImages) {\n                value.available = ctx.availableImages.indexOf(value.nameSecondary) > -1;\n            }\n        }\n\n        return value;\n    }\n\n    eachChild(fn: (_: Expression) => void) {\n        fn(this.inputPrimary);\n        if (this.inputSecondary) {\n            fn(this.inputSecondary);\n        }\n    }\n\n    outputDefined(): boolean {\n        // The output of image is determined by the list of available images in the evaluation context\n        return false;\n    }\n\n    serialize(): SerializedExpression {\n        if (this.inputSecondary) {\n            // $FlowIgnore\n            return [\"image\", this.inputPrimary.serialize(), this.inputSecondary.serialize()];\n        }\n        return [\"image\", this.inputPrimary.serialize()];\n    }\n}\n","// @flow\n\nexport default function getType(val: mixed): string {\n    if (val instanceof Number) {\n        return 'number';\n    } else if (val instanceof String) {\n        return 'string';\n    } else if (val instanceof Boolean) {\n        return 'boolean';\n    } else if (Array.isArray(val)) {\n        return 'array';\n    } else if (val === null) {\n        return 'null';\n    } else {\n        return typeof val;\n    }\n}\n","// @flow\n\nimport assert from 'assert';\n\nimport {BooleanType, ColorType, NumberType, StringType, ValueType, array, NullType} from '../types.js';\nimport {Color, isValue, toString as valueToString, typeOf, validateRGBA} from '../values.js';\nimport RuntimeError from '../runtime_error.js';\nimport Formatted from '../types/formatted.js';\nimport FormatExpression from '../definitions/format.js';\nimport ImageExpression from '../definitions/image.js';\nimport ResolvedImage from '../types/resolved_image.js';\n\nimport type {Expression, SerializedExpression} from '../expression.js';\nimport type ParsingContext from '../parsing_context.js';\nimport type EvaluationContext from '../evaluation_context.js';\nimport type {Type, ArrayType} from '../types.js';\nimport getType from '../../util/get_type.js';\n\nconst types = {\n    'to-boolean': BooleanType,\n    'to-color': ColorType,\n    'to-number': NumberType,\n    'to-string': StringType\n};\n\n/**\n * Special form for error-coalescing coercion expressions \"to-number\",\n * \"to-color\".  Since these coercions can fail at runtime, they accept multiple\n * arguments, only evaluating one at a time until one succeeds.\n *\n * @private\n */\nclass Coercion implements Expression {\n    type: Type | ArrayType;\n    args: Array<Expression>;\n\n    constructor(type: Type, args: Array<Expression>) {\n        this.type = type;\n        this.args = args;\n    }\n\n    static parse(args: $ReadOnlyArray<mixed>, context: ParsingContext): ?Expression {\n        if (args.length < 2)\n            return context.error(`Expected at least one argument.`);\n\n        const name: string = (args[0]: any);\n        const parsed = [];\n        let type: Type | ArrayType = NullType;\n        if (name === 'to-array') {\n            if (!Array.isArray(args[1])) {\n                return null;\n            }\n            const arrayLength = args[1].length;\n            if (context.expectedType) {\n                if (context.expectedType.kind === 'array') {\n                    type = array(context.expectedType.itemType, arrayLength);\n                } else {\n                    return context.error(`Expected ${context.expectedType.kind} but found array.`);\n                }\n            } else if (arrayLength > 0 && isValue(args[1][0])) {\n                const value = (args[1][0]: any);\n                type = array(typeOf(value), arrayLength);\n            } else {\n                return null;\n            }\n            for (let i = 0; i < arrayLength; i++) {\n                // $FlowIgnore\n                const member = args[1][i];\n                let parsedMember;\n                if (getType(member) === 'array') {\n                    parsedMember = context.parse(member, undefined, type.itemType);\n                } else {\n                    const memberType = getType(member);\n                    if (memberType !== type.itemType.kind) {\n                        return context.error(`Expected ${type.itemType.kind} but found ${memberType}.`);\n                    }\n                    parsedMember = context.registry['literal'].parse(['literal', member === undefined ? null : member], context);\n                }\n                if (!parsedMember) return null;\n                parsed.push(parsedMember);\n            }\n        } else {\n            assert(types[name], name);\n\n            if ((name === 'to-boolean' || name === 'to-string') && args.length !== 2)\n                return context.error(`Expected one argument.`);\n\n            type = types[name];\n\n            for (let i = 1; i < args.length; i++) {\n                const input = context.parse(args[i], i, ValueType);\n                if (!input) return null;\n                parsed.push(input);\n            }\n        }\n\n        return new Coercion(type, parsed);\n    }\n\n    evaluate(ctx: EvaluationContext): any {\n        if (this.type.kind === 'boolean') {\n            return Boolean(this.args[0].evaluate(ctx));\n        } else if (this.type.kind === 'color') {\n            let input;\n            let error;\n            for (const arg of this.args) {\n                input = arg.evaluate(ctx);\n                error = null;\n                if (input instanceof Color) {\n                    return input;\n                } else if (typeof input === 'string') {\n                    const c = ctx.parseColor(input);\n                    if (c) return c;\n                } else if (Array.isArray(input)) {\n                    if (input.length < 3 || input.length > 4) {\n                        error = `Invalid rbga value ${JSON.stringify(input)}: expected an array containing either three or four numeric values.`;\n                    } else {\n                        error = validateRGBA(input[0], input[1], input[2], input[3]);\n                    }\n                    if (!error) {\n                        return new Color((input[0]: any) / 255, (input[1]: any) / 255, (input[2]: any) / 255, (input[3]: any));\n                    }\n                }\n            }\n            throw new RuntimeError(error || `Could not parse color from value '${typeof input === 'string' ? input : String(JSON.stringify(input))}'`);\n        } else if (this.type.kind === 'number') {\n            let value = null;\n            for (const arg of this.args) {\n                value = arg.evaluate(ctx);\n                if (value === null) return 0;\n                const num = Number(value);\n                if (isNaN(num)) continue;\n                return num;\n            }\n            throw new RuntimeError(`Could not convert ${JSON.stringify(value)} to number.`);\n        } else if (this.type.kind === 'formatted') {\n            // There is no explicit 'to-formatted' but this coercion can be implicitly\n            // created by properties that expect the 'formatted' type.\n            return Formatted.fromString(valueToString(this.args[0].evaluate(ctx)));\n        } else if (this.type.kind === 'resolvedImage') {\n            return ResolvedImage.fromString(valueToString(this.args[0].evaluate(ctx)));\n        } else if (this.type.kind === 'array') {\n            return this.args.map(arg => { return arg.evaluate(ctx); });\n        } else {\n            return valueToString(this.args[0].evaluate(ctx));\n        }\n    }\n\n    eachChild(fn: (_: Expression) => void) {\n        this.args.forEach(fn);\n    }\n\n    outputDefined(): boolean {\n        return this.args.every(arg => arg.outputDefined());\n    }\n\n    serialize(): SerializedExpression {\n        if (this.type.kind === 'formatted') {\n            return new FormatExpression([{content: this.args[0], scale: null, font: null, textColor: null}]).serialize();\n        }\n\n        if (this.type.kind === 'resolvedImage') {\n            return new ImageExpression(this.args[0]).serialize();\n        }\n\n        const serialized: Array<mixed> = this.type.kind === 'array' ? [] : [`to-${this.type.kind}`];\n        this.eachChild(child => { serialized.push(child.serialize()); });\n        return serialized;\n    }\n}\n\nexport default Coercion;\n","// @flow\n\nimport {Color} from './values.js';\n\nimport type Point from '@mapbox/point-geometry';\nimport type {FormattedSection} from './types/formatted.js';\nimport type {GlobalProperties, Feature, FeatureState} from './index.js';\nimport type {CanonicalTileID} from '../../source/tile_id.js';\nimport type {FeatureDistanceData} from '../feature_filter/index.js';\nimport type {ConfigOptions, ConfigOptionValue} from '../../style/properties.js';\n\nconst geometryTypes = ['Unknown', 'Point', 'LineString', 'Polygon'];\n\nclass EvaluationContext {\n    globals: GlobalProperties;\n    feature: ?Feature;\n    featureState: ?FeatureState;\n    formattedSection: ?FormattedSection;\n    availableImages: ?Array<string>;\n    canonical: null | CanonicalTileID;\n    featureTileCoord: ?Point;\n    featureDistanceData: ?FeatureDistanceData;\n    scope: ?string;\n    options: ?ConfigOptions;\n\n    _parseColorCache: {[_: string]: ?Color};\n\n    constructor(scope: ?string, options: ?ConfigOptions) {\n        this.globals = (null: any);\n        this.feature = null;\n        this.featureState = null;\n        this.formattedSection = null;\n        this._parseColorCache = {};\n        this.availableImages = null;\n        this.canonical = null;\n        this.featureTileCoord = null;\n        this.featureDistanceData = null;\n        this.scope = scope;\n        this.options = options;\n    }\n\n    id(): number | null {\n        return this.feature && this.feature.id !== undefined ? this.feature.id : null;\n    }\n\n    geometryType(): null | string {\n        return this.feature ? typeof this.feature.type === 'number' ? geometryTypes[this.feature.type] : this.feature.type : null;\n    }\n\n    geometry(): ?Array<Array<Point>> {\n        return this.feature && 'geometry' in this.feature ? this.feature.geometry : null;\n    }\n\n    canonicalID(): null | CanonicalTileID {\n        return this.canonical;\n    }\n\n    properties(): {[string]: any} {\n        return (this.feature && this.feature.properties) || {};\n    }\n\n    measureLight(_: string): number {\n        return this.globals.brightness || 0;\n    }\n\n    distanceFromCenter(): number {\n        if (this.featureTileCoord && this.featureDistanceData) {\n\n            const c = this.featureDistanceData.center;\n            const scale = this.featureDistanceData.scale;\n            const {x, y} = this.featureTileCoord;\n\n            // Calculate the distance vector `d` (left handed)\n            const dX = x * scale - c[0];\n            const dY = y * scale - c[1];\n\n            // The bearing vector `b` (left handed)\n            const bX = this.featureDistanceData.bearing[0];\n            const bY = this.featureDistanceData.bearing[1];\n\n            // Distance is calculated as `dot(d, v)`\n            const dist = (bX * dX + bY * dY);\n            return dist;\n        }\n\n        return 0;\n    }\n\n    parseColor(input: string): ?Color {\n        let cached = this._parseColorCache[input];\n        if (!cached) {\n            cached = this._parseColorCache[input] = Color.parse(input);\n        }\n        return cached;\n    }\n\n    getConfig(id: string): ?ConfigOptionValue {\n        return this.options ? this.options.get(id) : null;\n    }\n}\n\nexport default EvaluationContext;\n","// @flow\n\nimport {toString} from './types.js';\n\nimport ParsingContext from './parsing_context.js';\nimport EvaluationContext from './evaluation_context.js';\nimport assert from 'assert';\n\nimport type {Expression, ExpressionRegistry} from './expression.js';\nimport type {Type} from './types.js';\nimport type {Value} from './values.js';\n\nexport type Varargs = {| type: Type |};\ntype Signature = Array<Type> | Varargs;\ntype Evaluate = (EvaluationContext, Array<Expression>) => Value;\ntype Definition = [Type, Signature, Evaluate] |\n    {|type: Type, overloads: Array<[Signature, Evaluate]>|};\n\nclass CompoundExpression implements Expression {\n    name: string;\n    type: Type;\n    _evaluate: Evaluate;\n    args: Array<Expression>;\n    _overloadIndex: number;\n\n    static definitions: {[_: string]: Definition };\n\n    constructor(name: string, type: Type, evaluate: Evaluate, args: Array<Expression>, overloadIndex: number) {\n        this.name = name;\n        this.type = type;\n        this._evaluate = evaluate;\n        this.args = args;\n        this._overloadIndex = overloadIndex;\n    }\n\n    evaluate(ctx: EvaluationContext): Value {\n        if (!this._evaluate) { // restore evaluate function after transfer between threads\n            const definition = CompoundExpression.definitions[this.name];\n            this._evaluate = Array.isArray(definition) ? definition[2] : definition.overloads[this._overloadIndex][1];\n        }\n        return this._evaluate(ctx, this.args);\n    }\n\n    eachChild(fn: (_: Expression) => void) {\n        this.args.forEach(fn);\n    }\n\n    outputDefined(): boolean {\n        return false;\n    }\n\n    serialize(): Array<mixed> {\n        return [this.name].concat(this.args.map(arg => arg.serialize()));\n    }\n\n    static parse(args: $ReadOnlyArray<mixed>, context: ParsingContext): ?Expression {\n        const op: string = (args[0]: any);\n        const definition = CompoundExpression.definitions[op];\n        if (!definition) {\n            return context.error(`Unknown expression \"${op}\". If you wanted a literal array, use [\"literal\", [...]].`, 0);\n        }\n\n        // Now check argument types against each signature\n        const type = Array.isArray(definition) ?\n            definition[0] : definition.type;\n\n        const availableOverloads = Array.isArray(definition) ?\n            [[definition[1], definition[2]]] :\n            definition.overloads;\n\n        const overloadParams = [];\n\n        let signatureContext: ParsingContext = (null: any);\n\n        let overloadIndex = -1;\n\n        for (const [params, evaluate] of availableOverloads) {\n            if (Array.isArray(params) && params.length !== args.length - 1) continue; // param count doesn't match\n\n            overloadParams.push(params);\n            overloadIndex++;\n\n            // Use a fresh context for each attempted signature so that, if\n            // we eventually succeed, we haven't polluted `context.errors`.\n            signatureContext = new ParsingContext(context.registry, context.path, null, context.scope, undefined, context._scope, context.options);\n\n            // First parse all the args, potentially coercing to the\n            // types expected by this overload.\n            const parsedArgs: Array<Expression> = [];\n            let argParseFailed = false;\n            for (let i = 1; i < args.length; i++) {\n                const arg = args[i];\n                const expectedType = Array.isArray(params) ?\n                    params[i - 1] :\n                    params.type;\n\n                const parsed = signatureContext.parse(arg, 1 + parsedArgs.length, expectedType);\n                if (!parsed) {\n                    argParseFailed = true;\n                    break;\n                }\n                parsedArgs.push(parsed);\n            }\n            if (argParseFailed) {\n                // Couldn't coerce args of this overload to expected type, move\n                // on to next one.\n                continue;\n            }\n\n            if (Array.isArray(params)) {\n                if (params.length !== parsedArgs.length) {\n                    signatureContext.error(`Expected ${params.length} arguments, but found ${parsedArgs.length} instead.`);\n                    continue;\n                }\n            }\n\n            for (let i = 0; i < parsedArgs.length; i++) {\n                const expected = Array.isArray(params) ? params[i] : params.type;\n                const arg = parsedArgs[i];\n                signatureContext.concat(i + 1).checkSubtype(expected, arg.type);\n            }\n\n            if (signatureContext.errors.length === 0) {\n                return new CompoundExpression(op, type, evaluate, parsedArgs, overloadIndex);\n            }\n        }\n\n        assert(!signatureContext || signatureContext.errors.length > 0);\n\n        if (overloadParams.length === 1) {\n            context.errors.push(...signatureContext.errors);\n        } else {\n            const expected = overloadParams.length ? overloadParams : availableOverloads.map(([params]) => params);\n            const signatures = expected.map(stringifySignature).join(' | ');\n\n            const actualTypes = [];\n            // For error message, re-parse arguments without trying to\n            // apply any coercions\n            for (let i = 1; i < args.length; i++) {\n                const parsed = context.parse(args[i], 1 + actualTypes.length);\n                if (!parsed) return null;\n                actualTypes.push(toString(parsed.type));\n            }\n            context.error(`Expected arguments of type ${signatures}, but found (${actualTypes.join(', ')}) instead.`);\n        }\n\n        return null;\n    }\n\n    static register(\n        registry: ExpressionRegistry,\n        definitions: {[_: string]: Definition }\n    ) {\n        assert(!CompoundExpression.definitions);\n        CompoundExpression.definitions = definitions;\n        for (const name in definitions) {\n            // $FlowFixMe[method-unbinding]\n            registry[name] = CompoundExpression;\n        }\n    }\n}\n\nfunction stringifySignature(signature: Signature): string {\n    if (Array.isArray(signature)) {\n        return `(${signature.map(toString).join(', ')})`;\n    } else {\n        return `(${toString(signature.type)}...)`;\n    }\n}\n\nexport default CompoundExpression;\n","// @flow\n\nimport {StringType, BooleanType, CollatorType} from '../types.js';\nimport Collator from '../types/collator.js';\n\nimport type {Expression, SerializedExpression} from '../expression.js';\nimport type EvaluationContext from '../evaluation_context.js';\nimport type ParsingContext from '../parsing_context.js';\nimport type {Type} from '../types.js';\n\nexport default class CollatorExpression implements Expression {\n    type: Type;\n    caseSensitive: Expression;\n    diacriticSensitive: Expression;\n    locale: Expression | null;\n\n    constructor(caseSensitive: Expression, diacriticSensitive: Expression, locale: Expression | null) {\n        this.type = CollatorType;\n        this.locale = locale;\n        this.caseSensitive = caseSensitive;\n        this.diacriticSensitive = diacriticSensitive;\n    }\n\n    static parse(args: $ReadOnlyArray<mixed>, context: ParsingContext): ?Expression {\n        if (args.length !== 2)\n            return context.error(`Expected one argument.`);\n\n        const options = (args[1]: any);\n        if (typeof options !== \"object\" || Array.isArray(options))\n            return context.error(`Collator options argument must be an object.`);\n\n        const caseSensitive = context.parse(\n            options['case-sensitive'] === undefined ? false : options['case-sensitive'], 1, BooleanType);\n        if (!caseSensitive) return null;\n\n        const diacriticSensitive = context.parse(\n            options['diacritic-sensitive'] === undefined ? false : options['diacritic-sensitive'], 1, BooleanType);\n        if (!diacriticSensitive) return null;\n\n        let locale = null;\n        if (options['locale']) {\n            locale = context.parse(options['locale'], 1, StringType);\n            if (!locale) return null;\n        }\n\n        return new CollatorExpression(caseSensitive, diacriticSensitive, locale);\n    }\n\n    evaluate(ctx: EvaluationContext): Collator {\n        return new Collator(this.caseSensitive.evaluate(ctx), this.diacriticSensitive.evaluate(ctx), this.locale ? this.locale.evaluate(ctx) : null);\n    }\n\n    eachChild(fn: (_: Expression) => void) {\n        fn(this.caseSensitive);\n        fn(this.diacriticSensitive);\n        if (this.locale) {\n            fn(this.locale);\n        }\n    }\n\n    outputDefined(): boolean {\n        // Technically the set of possible outputs is the combinatoric set of Collators produced\n        // by all possible outputs of locale/caseSensitive/diacriticSensitive\n        // But for the primary use of Collators in comparison operators, we ignore the Collator's\n        // possible outputs anyway, so we can get away with leaving this false for now.\n        return false;\n    }\n\n    serialize(): SerializedExpression {\n        const options = {};\n        options['case-sensitive'] = this.caseSensitive.serialize();\n        options['diacritic-sensitive'] = this.diacriticSensitive.serialize();\n        if (this.locale) {\n            options['locale'] = this.locale.serialize();\n        }\n        return [\"collator\", options];\n    }\n}\n","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.quickselect = factory());\n}(this, (function () { 'use strict';\n\nfunction quickselect(arr, k, left, right, compare) {\n    quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);\n}\n\nfunction quickselectStep(arr, k, left, right, compare) {\n\n    while (right > left) {\n        if (right - left > 600) {\n            var n = right - left + 1;\n            var m = k - left + 1;\n            var z = Math.log(n);\n            var s = 0.5 * Math.exp(2 * z / 3);\n            var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);\n            var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));\n            var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));\n            quickselectStep(arr, k, newLeft, newRight, compare);\n        }\n\n        var t = arr[k];\n        var i = left;\n        var j = right;\n\n        swap(arr, left, k);\n        if (compare(arr[right], t) > 0) swap(arr, left, right);\n\n        while (i < j) {\n            swap(arr, i, j);\n            i++;\n            j--;\n            while (compare(arr[i], t) < 0) i++;\n            while (compare(arr[j], t) > 0) j--;\n        }\n\n        if (compare(arr[left], t) === 0) swap(arr, left, j);\n        else {\n            j++;\n            swap(arr, j, right);\n        }\n\n        if (j <= k) left = j + 1;\n        if (k <= j) right = j - 1;\n    }\n}\n\nfunction swap(arr, i, j) {\n    var tmp = arr[i];\n    arr[i] = arr[j];\n    arr[j] = tmp;\n}\n\nfunction defaultCompare(a, b) {\n    return a < b ? -1 : a > b ? 1 : 0;\n}\n\nreturn quickselect;\n\n})));\n","// @flow\nimport type Point from '@mapbox/point-geometry';\nimport quickselect from 'quickselect';\n\ntype GeoJSONPosition = [number, number] | [number, number, number];\n\n// minX, minY, maxX, maxY\nexport type BBox = [number, number, number, number];\n\n/**\n * Returns the signed area for the polygon ring.  Postive areas are exterior rings and\n * have a clockwise winding.  Negative areas are interior rings and have a counter clockwise\n * ordering.\n */\nfunction calculateSignedArea(ring: Array<Point>): number {\n    let sum = 0;\n    for (let i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {\n        p1 = ring[i];\n        p2 = ring[j];\n        sum += (p2.x - p1.x) * (p1.y + p2.y);\n    }\n    return sum;\n}\n\nfunction compareAreas(a: {area: number}, b: {area: number}) {\n    return b.area - a.area;\n}\n\n// classifies an array of rings into polygons with outer rings and holes\nexport function classifyRings(rings: Array<Array<Point>>, maxRings: number): Array<Array<Array<Point>>> {\n    const len = rings.length;\n\n    if (len <= 1) return [rings];\n\n    const polygons = [];\n    let polygon,\n        ccw;\n\n    for (let i = 0; i < len; i++) {\n        const area = calculateSignedArea(rings[i]);\n        if (area === 0) continue;\n\n        (rings[i]: any).area = Math.abs(area);\n\n        if (ccw === undefined) ccw = area < 0;\n\n        if (ccw === area < 0) {\n            if (polygon) polygons.push(polygon);\n            polygon = [rings[i]];\n\n        } else {\n            (polygon: any).push(rings[i]);\n        }\n    }\n    if (polygon) polygons.push(polygon);\n\n    // Earcut performance degrades with the # of rings in a polygon. For this\n    // reason, we limit strip out all but the `maxRings` largest rings.\n    if (maxRings > 1) {\n        for (let j = 0; j < polygons.length; j++) {\n            if (polygons[j].length <= maxRings) continue;\n            quickselect(polygons[j], maxRings, 1, polygons[j].length - 1, compareAreas);\n            polygons[j] = polygons[j].slice(0, maxRings);\n        }\n    }\n\n    return polygons;\n}\n\nexport function updateBBox(bbox: BBox, coord: GeoJSONPosition) {\n    bbox[0] = Math.min(bbox[0], coord[0]);\n    bbox[1] = Math.min(bbox[1], coord[1]);\n    bbox[2] = Math.max(bbox[2], coord[0]);\n    bbox[3] = Math.max(bbox[3], coord[1]);\n}\n\nexport function boxWithinBox(bbox1: BBox, bbox2: BBox): boolean {\n    if (bbox1[0] <= bbox2[0]) return false;\n    if (bbox1[2] >= bbox2[2]) return false;\n    if (bbox1[1] <= bbox2[1]) return false;\n    if (bbox1[3] >= bbox2[3]) return false;\n    return true;\n}\n\nfunction onBoundary(p: GeoJSONPosition, p1: GeoJSONPosition, p2: GeoJSONPosition) {\n    const x1 = p[0] - p1[0];\n    const y1 = p[1] - p1[1];\n    const x2 = p[0] - p2[0];\n    const y2 = p[1] - p2[1];\n    return (x1 * y2 - x2 * y1 === 0) && (x1 * x2 <= 0) && (y1 * y2 <= 0);\n}\n\nfunction rayIntersect(p: GeoJSONPosition, p1: GeoJSONPosition, p2: GeoJSONPosition) {\n    return ((p1[1] > p[1]) !== (p2[1] > p[1])) && (p[0] < (p2[0] - p1[0]) * (p[1] - p1[1]) / (p2[1] - p1[1]) + p1[0]);\n}\n\n// ray casting algorithm for detecting if point is in polygon\nexport function pointWithinPolygon(point: GeoJSONPosition, rings: Array<Array<GeoJSONPosition>>, trueOnBoundary: boolean = false): boolean {\n    let inside = false;\n    for (let i = 0, len = rings.length; i < len; i++) {\n        const ring = rings[i];\n        for (let j = 0, len2 = ring.length, k = len2 - 1; j < len2; k = j++) {\n            const q1 = ring[k];\n            const q2 = ring[j];\n            if (onBoundary(point, q1, q2)) return trueOnBoundary;\n            if (rayIntersect(point, q1, q2)) inside = !inside;\n        }\n    }\n    return inside;\n}\n\nfunction perp(v1: GeoJSONPosition, v2: GeoJSONPosition) {\n    return v1[0] * v2[1] - v1[1] * v2[0];\n}\n\n// check if p1 and p2 are in different sides of line segment q1->q2\nfunction twoSided(p1: GeoJSONPosition, p2: GeoJSONPosition, q1: GeoJSONPosition, q2: GeoJSONPosition) {\n    // q1->p1 (x1, y1), q1->p2 (x2, y2), q1->q2 (x3, y3)\n    const x1 = p1[0] - q1[0];\n    const y1 = p1[1] - q1[1];\n    const x2 = p2[0] - q1[0];\n    const y2 = p2[1] - q1[1];\n    const x3 = q2[0] - q1[0];\n    const y3 = q2[1] - q1[1];\n    const det1 = x1 * y3 - x3 * y1;\n    const det2 = x2 * y3 - x3 * y2;\n    if ((det1 > 0 && det2 < 0) || (det1 < 0 && det2 > 0)) return true;\n    return false;\n}\n// a, b are end points for line segment1, c and d are end points for line segment2\nexport function segmentIntersectSegment(a: GeoJSONPosition, b: GeoJSONPosition, c: GeoJSONPosition, d: GeoJSONPosition): boolean {\n    // check if two segments are parallel or not\n    // precondition is end point a, b is inside polygon, if line a->b is\n    // parallel to polygon edge c->d, then a->b won't intersect with c->d\n    const vectorP = [b[0] - a[0], b[1] - a[1]];\n    const vectorQ = [d[0] - c[0], d[1] - c[1]];\n    if (perp(vectorQ, vectorP) === 0) return false;\n\n    // If lines are intersecting with each other, the relative location should be:\n    // a and b lie in different sides of segment c->d\n    // c and d lie in different sides of segment a->b\n    if (twoSided(a, b, c, d) && twoSided(c, d, a, b)) return true;\n    return false;\n}\n\n","// @flow\n\nimport {isValue} from '../values.js';\nimport type {Type} from '../types.js';\nimport {BooleanType} from '../types.js';\nimport type {Expression, SerializedExpression} from '../expression.js';\nimport type ParsingContext from '../parsing_context.js';\nimport type EvaluationContext from '../evaluation_context.js';\nimport type Point from '@mapbox/point-geometry';\nimport type {GeoJSON, GeoJSONPosition, GeoJSONPolygon, GeoJSONMultiPolygon} from '@mapbox/geojson-types';\nimport type {CanonicalTileID} from '../../../source/tile_id.js';\nimport {updateBBox, boxWithinBox, pointWithinPolygon, segmentIntersectSegment} from '../../util/geometry_util.js';\nimport type {BBox} from '../../util/geometry_util.js';\n\ntype GeoJSONPolygons =| GeoJSONPolygon | GeoJSONMultiPolygon;\n\nconst EXTENT = 8192;\n\nfunction mercatorXfromLng(lng: number) {\n    return (180 + lng) / 360;\n}\n\nfunction mercatorYfromLat(lat: number) {\n    return (180 - (180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360)))) / 360;\n}\n\nfunction getTileCoordinates(p: GeoJSONPosition, canonical: CanonicalTileID) {\n    const x = mercatorXfromLng(p[0]);\n    const y = mercatorYfromLat(p[1]);\n    const tilesAtZoom = Math.pow(2, canonical.z);\n    return [Math.round(x * tilesAtZoom * EXTENT), Math.round(y * tilesAtZoom * EXTENT)];\n}\n\nfunction pointWithinPolygons(point: GeoJSONPosition, polygons: Array<Array<Array<GeoJSONPosition>>>) {\n    for (let i = 0; i < polygons.length; i++) {\n        if (pointWithinPolygon(point, polygons[i])) return true;\n    }\n    return false;\n}\n\nfunction lineIntersectPolygon(p1: GeoJSONPosition, p2: GeoJSONPosition, polygon: Array<Array<GeoJSONPosition>>) {\n    for (const ring of polygon) {\n        // loop through every edge of the ring\n        for (let j = 0, len = ring.length, k = len - 1; j < len; k = j++) {\n            const q1 = ring[k];\n            const q2 = ring[j];\n            if (segmentIntersectSegment(p1, p2, q1, q2)) {\n                return true;\n            }\n        }\n    }\n    return false;\n}\n\nfunction lineStringWithinPolygon(line: Array<GeoJSONPosition>, polygon: Array<Array<GeoJSONPosition>>) {\n    // First, check if geometry points of line segments are all inside polygon\n    for (let i = 0; i < line.length; ++i) {\n        if (!pointWithinPolygon(line[i], polygon)) {\n            return false;\n        }\n    }\n\n    // Second, check if there is line segment intersecting polygon edge\n    for (let i = 0; i < line.length - 1; ++i) {\n        if (lineIntersectPolygon(line[i], line[i + 1], polygon)) {\n            return false;\n        }\n    }\n    return true;\n}\n\nfunction lineStringWithinPolygons(line: Array<GeoJSONPosition>, polygons: Array<Array<Array<GeoJSONPosition>>>) {\n    for (let i = 0; i < polygons.length; i++) {\n        if (lineStringWithinPolygon(line, polygons[i])) return true;\n    }\n    return false;\n}\n\nfunction getTilePolygon(coordinates: Array<Array<GeoJSONPosition>>, bbox: BBox, canonical: CanonicalTileID) {\n    const polygon = [];\n    for (let i = 0; i < coordinates.length; i++) {\n        const ring = [];\n        for (let j = 0; j < coordinates[i].length; j++) {\n            const coord = getTileCoordinates(coordinates[i][j], canonical);\n            updateBBox(bbox, coord);\n            ring.push(coord);\n        }\n        polygon.push(ring);\n    }\n    return polygon;\n}\n\nfunction getTilePolygons(coordinates: Array<Array<Array<GeoJSONPosition>>>, bbox: BBox, canonical: CanonicalTileID) {\n    const polygons = [];\n    for (let i = 0; i < coordinates.length; i++) {\n        const polygon = getTilePolygon(coordinates[i], bbox, canonical);\n        polygons.push(polygon);\n    }\n    return polygons;\n}\n\nfunction updatePoint(p: GeoJSONPosition, bbox: BBox, polyBBox: Array<number>, worldSize: number) {\n    if (p[0] < polyBBox[0] || p[0] > polyBBox[2]) {\n        const halfWorldSize = worldSize * 0.5;\n        let shift = (p[0] - polyBBox[0] > halfWorldSize) ? -worldSize : (polyBBox[0] - p[0] > halfWorldSize) ? worldSize : 0;\n        if (shift === 0) {\n            shift = (p[0] - polyBBox[2] > halfWorldSize) ? -worldSize : (polyBBox[2] - p[0] > halfWorldSize) ? worldSize : 0;\n        }\n        p[0] += shift;\n    }\n    updateBBox(bbox, p);\n}\n\nfunction resetBBox(bbox: BBox) {\n    bbox[0] = bbox[1] = Infinity;\n    bbox[2] = bbox[3] = -Infinity;\n}\n\nfunction getTilePoints(geometry: ?Array<Array<Point>>, pointBBox: BBox, polyBBox: Array<number>, canonical: CanonicalTileID) {\n    const worldSize = Math.pow(2, canonical.z) * EXTENT;\n    const shifts = [canonical.x * EXTENT, canonical.y * EXTENT];\n    const tilePoints = [];\n    if (!geometry) return tilePoints;\n    for (const points of geometry) {\n        for (const point of points) {\n            const p = [point.x + shifts[0], point.y + shifts[1]];\n            updatePoint(p, pointBBox, polyBBox, worldSize);\n            tilePoints.push(p);\n        }\n    }\n    return tilePoints;\n}\n\nfunction getTileLines(geometry: ?Array<Array<Point>>, lineBBox: BBox, polyBBox: Array<number>, canonical: CanonicalTileID) {\n    const worldSize = Math.pow(2, canonical.z) * EXTENT;\n    const shifts = [canonical.x * EXTENT, canonical.y * EXTENT];\n    const tileLines: Array<Array<GeoJSONPosition>> = [];\n    if (!geometry) return tileLines;\n    for (const line of geometry) {\n        const tileLine = [];\n        for (const point of line) {\n            const p: GeoJSONPosition = [point.x + shifts[0], point.y + shifts[1]];\n            updateBBox(lineBBox, p);\n            tileLine.push(p);\n        }\n        tileLines.push(tileLine);\n    }\n    if (lineBBox[2] - lineBBox[0] <= worldSize / 2) {\n        resetBBox(lineBBox);\n        for (const line of tileLines) {\n            for (const p of line) {\n                updatePoint(p, lineBBox, polyBBox, worldSize);\n            }\n        }\n    }\n    return tileLines;\n}\n\nfunction pointsWithinPolygons(ctx: EvaluationContext, polygonGeometry: GeoJSONPolygons) {\n    const pointBBox = [Infinity, Infinity, -Infinity, -Infinity];\n    const polyBBox = [Infinity, Infinity, -Infinity, -Infinity];\n\n    const canonical = ctx.canonicalID();\n    if (!canonical) {\n        return false;\n    }\n\n    if (polygonGeometry.type === 'Polygon') {\n        const tilePolygon = getTilePolygon(polygonGeometry.coordinates, polyBBox, canonical);\n        const tilePoints = getTilePoints(ctx.geometry(), pointBBox, polyBBox, canonical);\n        if (!boxWithinBox(pointBBox, polyBBox)) return false;\n\n        for (const point of tilePoints) {\n            if (!pointWithinPolygon(point, tilePolygon)) return false;\n        }\n    }\n    if (polygonGeometry.type === 'MultiPolygon') {\n        const tilePolygons = getTilePolygons(polygonGeometry.coordinates, polyBBox, canonical);\n        const tilePoints = getTilePoints(ctx.geometry(), pointBBox, polyBBox, canonical);\n        if (!boxWithinBox(pointBBox, polyBBox)) return false;\n\n        for (const point of tilePoints) {\n            if (!pointWithinPolygons(point, tilePolygons)) return false;\n        }\n    }\n\n    return true;\n}\n\nfunction linesWithinPolygons(ctx: EvaluationContext, polygonGeometry: GeoJSONPolygons) {\n    const lineBBox = [Infinity, Infinity, -Infinity, -Infinity];\n    const polyBBox = [Infinity, Infinity, -Infinity, -Infinity];\n\n    const canonical = ctx.canonicalID();\n    if (!canonical) {\n        return false;\n    }\n\n    if (polygonGeometry.type === 'Polygon') {\n        const tilePolygon = getTilePolygon(polygonGeometry.coordinates, polyBBox, canonical);\n        const tileLines = getTileLines(ctx.geometry(), lineBBox, polyBBox, canonical);\n        if (!boxWithinBox(lineBBox, polyBBox)) return false;\n\n        for (const line of tileLines) {\n            if (!lineStringWithinPolygon(line, tilePolygon)) return false;\n        }\n    }\n    if (polygonGeometry.type === 'MultiPolygon') {\n        const tilePolygons = getTilePolygons(polygonGeometry.coordinates, polyBBox, canonical);\n        const tileLines = getTileLines(ctx.geometry(), lineBBox, polyBBox, canonical);\n        if (!boxWithinBox(lineBBox, polyBBox)) return false;\n\n        for (const line of tileLines) {\n            if (!lineStringWithinPolygons(line, tilePolygons)) return false;\n        }\n    }\n    return true;\n}\n\nclass Within implements Expression {\n    type: Type;\n    geojson: GeoJSON\n    geometries: GeoJSONPolygons;\n\n    constructor(geojson: GeoJSON, geometries: GeoJSONPolygons) {\n        this.type = BooleanType;\n        this.geojson = geojson;\n        this.geometries = geometries;\n    }\n\n    static parse(args: $ReadOnlyArray<mixed>, context: ParsingContext): ?Within {\n        if (args.length !== 2)\n            return context.error(`'within' expression requires exactly one argument, but found ${args.length - 1} instead.`);\n        if (isValue(args[1])) {\n            const geojson = (args[1]: Object);\n            if (geojson.type === 'FeatureCollection') {\n                for (let i = 0; i < geojson.features.length; ++i) {\n                    const type = geojson.features[i].geometry.type;\n                    if (type === 'Polygon' || type === 'MultiPolygon') {\n                        return new Within(geojson, geojson.features[i].geometry);\n                    }\n                }\n            } else if (geojson.type === 'Feature') {\n                const type = geojson.geometry.type;\n                if (type === 'Polygon' || type === 'MultiPolygon') {\n                    return new Within(geojson, geojson.geometry);\n                }\n            } else if (geojson.type  === 'Polygon' || geojson.type === 'MultiPolygon') {\n                return new Within(geojson, geojson);\n            }\n        }\n        return context.error(`'within' expression requires valid geojson object that contains polygon geometry type.`);\n    }\n\n    evaluate(ctx: EvaluationContext): boolean {\n        if (ctx.geometry() != null && ctx.canonicalID() != null) {\n            if (ctx.geometryType() === 'Point') {\n                return pointsWithinPolygons(ctx, this.geometries);\n            } else if (ctx.geometryType() === 'LineString') {\n                return linesWithinPolygons(ctx, this.geometries);\n            }\n        }\n        return false;\n    }\n\n    eachChild() {}\n\n    outputDefined(): boolean {\n        return true;\n    }\n\n    serialize(): SerializedExpression {\n        return [\"within\", this.geojson];\n    }\n\n}\n\nexport default Within;\n","(function (global, factory) {\ntypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\ntypeof define === 'function' && define.amd ? define(factory) :\n(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.CheapRuler = factory());\n})(this, (function () { 'use strict';\n\nvar factors = {\n    kilometers: 1,\n    miles: 1000 / 1609.344,\n    nauticalmiles: 1000 / 1852,\n    meters: 1000,\n    metres: 1000,\n    yards: 1000 / 0.9144,\n    feet: 1000 / 0.3048,\n    inches: 1000 / 0.0254\n};\n\n// Values that define WGS84 ellipsoid model of the Earth\nvar RE = 6378.137; // equatorial radius\nvar FE = 1 / 298.257223563; // flattening\n\nvar E2 = FE * (2 - FE);\nvar RAD = Math.PI / 180;\n\n/**\n * A collection of very fast approximations to common geodesic measurements. Useful for performance-sensitive code that measures things on a city scale.\n *\n * @param {number} lat latitude\n * @param {string} [units='kilometers']\n * @returns {CheapRuler}\n * @example\n * const ruler = cheapRuler(35.05, 'miles');\n * //=ruler\n */\nvar CheapRuler = function CheapRuler(lat, units) {\n    if (lat === undefined) { throw new Error('No latitude given.'); }\n    if (units && !factors[units]) { throw new Error((\"Unknown unit \" + units + \". Use one of: \" + (Object.keys(factors).join(', ')))); }\n\n    // Curvature formulas from https://en.wikipedia.org/wiki/Earth_radius#Meridional\n    var m = RAD * RE * (units ? factors[units] : 1);\n    var coslat = Math.cos(lat * RAD);\n    var w2 = 1 / (1 - E2 * (1 - coslat * coslat));\n    var w = Math.sqrt(w2);\n\n    // multipliers for converting longitude and latitude degrees into distance\n    this.kx = m * w * coslat;    // based on normal radius of curvature\n    this.ky = m * w * w2 * (1 - E2); // based on meridonal radius of curvature\n};\n\nvar staticAccessors = { units: { configurable: true } };\n\n/**\n * Given two points of the form [longitude, latitude], returns the distance.\n *\n * @param {Array<number>} a point [longitude, latitude]\n * @param {Array<number>} b point [longitude, latitude]\n * @returns {number} distance\n * @example\n * const distance = ruler.distance([30.5, 50.5], [30.51, 50.49]);\n * //=distance\n */\nCheapRuler.fromTile = function fromTile (y, z, units) {\n    var n = Math.PI * (1 - 2 * (y + 0.5) / Math.pow(2, z));\n    var lat = Math.atan(0.5 * (Math.exp(n) - Math.exp(-n))) / RAD;\n    return new CheapRuler(lat, units);\n};\n\n/**\n * Multipliers for converting between units.\n *\n * @example\n * // convert 50 meters to yards\n * 50 * CheapRuler.units.yards / CheapRuler.units.meters;\n */\nstaticAccessors.units.get = function () {\n    return factors;\n};\n\nCheapRuler.prototype.distance = function distance (a, b) {\n    var dx = wrap(a[0] - b[0]) * this.kx;\n    var dy = (a[1] - b[1]) * this.ky;\n    return Math.sqrt(dx * dx + dy * dy);\n};\n\n/**\n * Returns the bearing between two points in angles.\n *\n * @param {Array<number>} a point [longitude, latitude]\n * @param {Array<number>} b point [longitude, latitude]\n * @returns {number} bearing\n * @example\n * const bearing = ruler.bearing([30.5, 50.5], [30.51, 50.49]);\n * //=bearing\n */\nCheapRuler.prototype.bearing = function bearing (a, b) {\n    var dx = wrap(b[0] - a[0]) * this.kx;\n    var dy = (b[1] - a[1]) * this.ky;\n    return Math.atan2(dx, dy) / RAD;\n};\n\n/**\n * Returns a new point given distance and bearing from the starting point.\n *\n * @param {Array<number>} p point [longitude, latitude]\n * @param {number} dist distance\n * @param {number} bearing\n * @returns {Array<number>} point [longitude, latitude]\n * @example\n * const point = ruler.destination([30.5, 50.5], 0.1, 90);\n * //=point\n */\nCheapRuler.prototype.destination = function destination (p, dist, bearing) {\n    var a = bearing * RAD;\n    return this.offset(p,\n        Math.sin(a) * dist,\n        Math.cos(a) * dist);\n};\n\n/**\n * Returns a new point given easting and northing offsets (in ruler units) from the starting point.\n *\n * @param {Array<number>} p point [longitude, latitude]\n * @param {number} dx easting\n * @param {number} dy northing\n * @returns {Array<number>} point [longitude, latitude]\n * @example\n * const point = ruler.offset([30.5, 50.5], 10, 10);\n * //=point\n */\nCheapRuler.prototype.offset = function offset (p, dx, dy) {\n    return [\n        p[0] + dx / this.kx,\n        p[1] + dy / this.ky\n    ];\n};\n\n/**\n * Given a line (an array of points), returns the total line distance.\n *\n * @param {Array<Array<number>>} points [longitude, latitude]\n * @returns {number} total line distance\n * @example\n * const length = ruler.lineDistance([\n * [-67.031, 50.458], [-67.031, 50.534],\n * [-66.929, 50.534], [-66.929, 50.458]\n * ]);\n * //=length\n */\nCheapRuler.prototype.lineDistance = function lineDistance (points) {\n    var total = 0;\n    for (var i = 0; i < points.length - 1; i++) {\n        total += this.distance(points[i], points[i + 1]);\n    }\n    return total;\n};\n\n/**\n * Given a polygon (an array of rings, where each ring is an array of points), returns the area.\n *\n * @param {Array<Array<Array<number>>>} polygon\n * @returns {number} area value in the specified units (square kilometers by default)\n * @example\n * const area = ruler.area([[\n * [-67.031, 50.458], [-67.031, 50.534], [-66.929, 50.534],\n * [-66.929, 50.458], [-67.031, 50.458]\n * ]]);\n * //=area\n */\nCheapRuler.prototype.area = function area (polygon) {\n    var sum = 0;\n\n    for (var i = 0; i < polygon.length; i++) {\n        var ring = polygon[i];\n\n        for (var j = 0, len = ring.length, k = len - 1; j < len; k = j++) {\n            sum += wrap(ring[j][0] - ring[k][0]) * (ring[j][1] + ring[k][1]) * (i ? -1 : 1);\n        }\n    }\n\n    return (Math.abs(sum) / 2) * this.kx * this.ky;\n};\n\n/**\n * Returns the point at a specified distance along the line.\n *\n * @param {Array<Array<number>>} line\n * @param {number} dist distance\n * @returns {Array<number>} point [longitude, latitude]\n * @example\n * const point = ruler.along(line, 2.5);\n * //=point\n */\nCheapRuler.prototype.along = function along (line, dist) {\n    var sum = 0;\n\n    if (dist <= 0) { return line[0]; }\n\n    for (var i = 0; i < line.length - 1; i++) {\n        var p0 = line[i];\n        var p1 = line[i + 1];\n        var d = this.distance(p0, p1);\n        sum += d;\n        if (sum > dist) { return interpolate(p0, p1, (dist - (sum - d)) / d); }\n    }\n\n    return line[line.length - 1];\n};\n\n/**\n * Returns the distance from a point `p` to a line segment `a` to `b`.\n *\n * @pointToSegmentDistance\n * @param {Array<number>} p point [longitude, latitude]\n * @param {Array<number>} p1 segment point 1 [longitude, latitude]\n * @param {Array<number>} p2 segment point 2 [longitude, latitude]\n * @returns {number} distance\n * @example\n * const distance = ruler.pointToSegmentDistance([-67.04, 50.5], [-67.05, 50.57], [-67.03, 50.54]);\n * //=distance\n */\nCheapRuler.prototype.pointToSegmentDistance = function pointToSegmentDistance (p, a, b) {\n    var x = a[0];\n        var y = a[1];\n    var dx = wrap(b[0] - x) * this.kx;\n    var dy = (b[1] - y) * this.ky;\n    var t = 0;\n\n    if (dx !== 0 || dy !== 0) {\n        t = (wrap(p[0] - x) * this.kx * dx + (p[1] - y) * this.ky * dy) / (dx * dx + dy * dy);\n\n        if (t > 1) {\n            x = b[0];\n            y = b[1];\n\n        } else if (t > 0) {\n            x += (dx / this.kx) * t;\n            y += (dy / this.ky) * t;\n        }\n    }\n\n    dx = wrap(p[0] - x) * this.kx;\n    dy = (p[1] - y) * this.ky;\n\n    return Math.sqrt(dx * dx + dy * dy);\n};\n\n/**\n * Returns an object of the form {point, index, t}, where point is closest point on the line\n * from the given point, index is the start index of the segment with the closest point,\n * and t is a parameter from 0 to 1 that indicates where the closest point is on that segment.\n *\n * @param {Array<Array<number>>} line\n * @param {Array<number>} p point [longitude, latitude]\n * @returns {Object} {point, index, t}\n * @example\n * const point = ruler.pointOnLine(line, [-67.04, 50.5]).point;\n * //=point\n */\nCheapRuler.prototype.pointOnLine = function pointOnLine (line, p) {\n    var minDist = Infinity;\n    var minX, minY, minI, minT;\n\n    for (var i = 0; i < line.length - 1; i++) {\n\n        var x = line[i][0];\n        var y = line[i][1];\n        var dx = wrap(line[i + 1][0] - x) * this.kx;\n        var dy = (line[i + 1][1] - y) * this.ky;\n        var t = 0;\n\n        if (dx !== 0 || dy !== 0) {\n            t = (wrap(p[0] - x) * this.kx * dx + (p[1] - y) * this.ky * dy) / (dx * dx + dy * dy);\n\n            if (t > 1) {\n                x = line[i + 1][0];\n                y = line[i + 1][1];\n\n            } else if (t > 0) {\n                x += (dx / this.kx) * t;\n                y += (dy / this.ky) * t;\n            }\n        }\n\n        dx = wrap(p[0] - x) * this.kx;\n        dy = (p[1] - y) * this.ky;\n\n        var sqDist = dx * dx + dy * dy;\n        if (sqDist < minDist) {\n            minDist = sqDist;\n            minX = x;\n            minY = y;\n            minI = i;\n            minT = t;\n        }\n    }\n\n    return {\n        point: [minX, minY],\n        index: minI,\n        t: Math.max(0, Math.min(1, minT))\n    };\n};\n\n/**\n * Returns a part of the given line between the start and the stop points (or their closest points on the line).\n *\n * @param {Array<number>} start point [longitude, latitude]\n * @param {Array<number>} stop point [longitude, latitude]\n * @param {Array<Array<number>>} line\n * @returns {Array<Array<number>>} line part of a line\n * @example\n * const line2 = ruler.lineSlice([-67.04, 50.5], [-67.05, 50.56], line1);\n * //=line2\n */\nCheapRuler.prototype.lineSlice = function lineSlice (start, stop, line) {\n    var p1 = this.pointOnLine(line, start);\n    var p2 = this.pointOnLine(line, stop);\n\n    if (p1.index > p2.index || (p1.index === p2.index && p1.t > p2.t)) {\n        var tmp = p1;\n        p1 = p2;\n        p2 = tmp;\n    }\n\n    var slice = [p1.point];\n\n    var l = p1.index + 1;\n    var r = p2.index;\n\n    if (!equals(line[l], slice[0]) && l <= r)\n        { slice.push(line[l]); }\n\n    for (var i = l + 1; i <= r; i++) {\n        slice.push(line[i]);\n    }\n\n    if (!equals(line[r], p2.point))\n        { slice.push(p2.point); }\n\n    return slice;\n};\n\n/**\n * Returns a part of the given line between the start and the stop points indicated by distance along the line.\n *\n * @param {number} start distance\n * @param {number} stop distance\n * @param {Array<Array<number>>} line\n * @returns {Array<Array<number>>} line part of a line\n * @example\n * const line2 = ruler.lineSliceAlong(10, 20, line1);\n * //=line2\n */\nCheapRuler.prototype.lineSliceAlong = function lineSliceAlong (start, stop, line) {\n    var sum = 0;\n    var slice = [];\n\n    for (var i = 0; i < line.length - 1; i++) {\n        var p0 = line[i];\n        var p1 = line[i + 1];\n        var d = this.distance(p0, p1);\n\n        sum += d;\n\n        if (sum > start && slice.length === 0) {\n            slice.push(interpolate(p0, p1, (start - (sum - d)) / d));\n        }\n\n        if (sum >= stop) {\n            slice.push(interpolate(p0, p1, (stop - (sum - d)) / d));\n            return slice;\n        }\n\n        if (sum > start) { slice.push(p1); }\n    }\n\n    return slice;\n};\n\n/**\n * Given a point, returns a bounding box object ([w, s, e, n]) created from the given point buffered by a given distance.\n *\n * @param {Array<number>} p point [longitude, latitude]\n * @param {number} buffer\n * @returns {Array<number>} box object ([w, s, e, n])\n * @example\n * const bbox = ruler.bufferPoint([30.5, 50.5], 0.01);\n * //=bbox\n */\nCheapRuler.prototype.bufferPoint = function bufferPoint (p, buffer) {\n    var v = buffer / this.ky;\n    var h = buffer / this.kx;\n    return [\n        p[0] - h,\n        p[1] - v,\n        p[0] + h,\n        p[1] + v\n    ];\n};\n\n/**\n * Given a bounding box, returns the box buffered by a given distance.\n *\n * @param {Array<number>} box object ([w, s, e, n])\n * @param {number} buffer\n * @returns {Array<number>} box object ([w, s, e, n])\n * @example\n * const bbox = ruler.bufferBBox([30.5, 50.5, 31, 51], 0.2);\n * //=bbox\n */\nCheapRuler.prototype.bufferBBox = function bufferBBox (bbox, buffer) {\n    var v = buffer / this.ky;\n    var h = buffer / this.kx;\n    return [\n        bbox[0] - h,\n        bbox[1] - v,\n        bbox[2] + h,\n        bbox[3] + v\n    ];\n};\n\n/**\n * Returns true if the given point is inside in the given bounding box, otherwise false.\n *\n * @param {Array<number>} p point [longitude, latitude]\n * @param {Array<number>} box object ([w, s, e, n])\n * @returns {boolean}\n * @example\n * const inside = ruler.insideBBox([30.5, 50.5], [30, 50, 31, 51]);\n * //=inside\n */\nCheapRuler.prototype.insideBBox = function insideBBox (p, bbox) {\n    return wrap(p[0] - bbox[0]) >= 0 &&\n           wrap(p[0] - bbox[2]) <= 0 &&\n           p[1] >= bbox[1] &&\n           p[1] <= bbox[3];\n};\n\nObject.defineProperties( CheapRuler, staticAccessors );\n\nfunction equals(a, b) {\n    return a[0] === b[0] && a[1] === b[1];\n}\n\nfunction interpolate(a, b, t) {\n    var dx = wrap(b[0] - a[0]);\n    var dy = b[1] - a[1];\n    return [\n        a[0] + dx * t,\n        a[1] + dy * t\n    ];\n}\n\n// normalize a degree value into [-180..180] range\nfunction wrap(deg) {\n    while (deg < -180) { deg += 360; }\n    while (deg > 180) { deg -= 360; }\n    return deg;\n}\n\nreturn CheapRuler;\n\n}));\n","(function (global, factory) {\ntypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\ntypeof define === 'function' && define.amd ? define(factory) :\n(global = global || self, global.TinyQueue = factory());\n}(this, function () { 'use strict';\n\nvar TinyQueue = function TinyQueue(data, compare) {\n    if ( data === void 0 ) data = [];\n    if ( compare === void 0 ) compare = defaultCompare;\n\n    this.data = data;\n    this.length = this.data.length;\n    this.compare = compare;\n\n    if (this.length > 0) {\n        for (var i = (this.length >> 1) - 1; i >= 0; i--) { this._down(i); }\n    }\n};\n\nTinyQueue.prototype.push = function push (item) {\n    this.data.push(item);\n    this.length++;\n    this._up(this.length - 1);\n};\n\nTinyQueue.prototype.pop = function pop () {\n    if (this.length === 0) { return undefined; }\n\n    var top = this.data[0];\n    var bottom = this.data.pop();\n    this.length--;\n\n    if (this.length > 0) {\n        this.data[0] = bottom;\n        this._down(0);\n    }\n\n    return top;\n};\n\nTinyQueue.prototype.peek = function peek () {\n    return this.data[0];\n};\n\nTinyQueue.prototype._up = function _up (pos) {\n    var ref = this;\n        var data = ref.data;\n        var compare = ref.compare;\n    var item = data[pos];\n\n    while (pos > 0) {\n        var parent = (pos - 1) >> 1;\n        var current = data[parent];\n        if (compare(item, current) >= 0) { break; }\n        data[pos] = current;\n        pos = parent;\n    }\n\n    data[pos] = item;\n};\n\nTinyQueue.prototype._down = function _down (pos) {\n    var ref = this;\n        var data = ref.data;\n        var compare = ref.compare;\n    var halfLength = this.length >> 1;\n    var item = data[pos];\n\n    while (pos < halfLength) {\n        var left = (pos << 1) + 1;\n        var best = data[left];\n        var right = left + 1;\n\n        if (right < this.length && compare(data[right], best) < 0) {\n            left = right;\n            best = data[right];\n        }\n        if (compare(best, item) >= 0) { break; }\n\n        data[pos] = best;\n        pos = left;\n    }\n\n    data[pos] = item;\n};\n\nfunction defaultCompare(a, b) {\n    return a < b ? -1 : a > b ? 1 : 0;\n}\n\nreturn TinyQueue;\n\n}));\n","// @flow\n\n/**\n * The maximum value of a coordinate in the internal tile coordinate system. Coordinates of\n * all source features normalized to this extent upon load.\n *\n * The value is a consequence of the following:\n *\n * * Vertex buffer store positions as signed 16 bit integers.\n * * One bit is lost for signedness to support tile buffers.\n * * One bit is lost because the line vertex buffer used to pack 1 bit of other data into the int.\n * * One bit is lost to support features extending past the extent on the right edge of the tile.\n * * This leaves us with 2^13 = 8192\n *\n * @private\n * @readonly\n */\nexport default 8192;\n","// @flow\n\nimport {isValue} from \"../values.js\";\nimport type {Type} from \"../types.js\";\nimport {NumberType} from \"../types.js\";\nimport type {Expression} from \"../expression.js\";\nimport type ParsingContext from \"../parsing_context.js\";\nimport type EvaluationContext from \"../evaluation_context.js\";\nimport type {\n    GeoJSON,\n    GeoJSONPosition,\n    GeoJSONPoint,\n    GeoJSONMultiPoint,\n    GeoJSONLineString,\n    GeoJSONMultiLineString,\n    GeoJSONPolygon,\n    GeoJSONMultiPolygon\n} from \"@mapbox/geojson-types\";\nimport type {CanonicalTileID} from '../../../source/tile_id.js';\nimport {classifyRings, updateBBox, boxWithinBox, pointWithinPolygon, segmentIntersectSegment} from '../../util/geometry_util.js';\nimport type {BBox} from '../../util/geometry_util.js';\nimport CheapRuler from \"cheap-ruler\";\nimport Point from \"@mapbox/point-geometry\";\nimport TinyQueue from \"tinyqueue\";\nimport EXTENT from \"../../data/extent.js\";\n\ntype DistanceGeometry =\n    | GeoJSONPoint\n    | GeoJSONMultiPoint\n    | GeoJSONLineString\n    | GeoJSONMultiLineString\n    | GeoJSONPolygon\n    | GeoJSONMultiPolygon;\n\n// Inclusive index range for multipoint or linestring container\ntype IndexRange = [number, number];\ntype DistPair = { dist: number, range1: IndexRange, range2: IndexRange };\nfunction compareMax(a: DistPair, b: DistPair) {\n    return b.dist - a.dist;\n}\n\nconst MIN_POINT_SIZE = 100;\nconst MIN_LINE_POINT_SIZE = 50;\n\nfunction isDefaultBBOX(bbox: BBox) {\n    const defualtBBox = [Infinity, Infinity, -Infinity, -Infinity];\n    if (defualtBBox.length !== bbox.length) {\n        return false;\n    }\n    for (let i = 0; i < defualtBBox.length; i++) {\n        if (defualtBBox[i] !== bbox[i]) {\n            return false;\n        }\n    }\n    return true;\n}\n\nfunction getRangeSize(range: IndexRange) {\n    return range[1] - range[0] + 1;\n}\n\nfunction isRangeSafe(range: IndexRange, threshold: number) {\n    const ret = range[1] >= range[0] && range[1] < threshold;\n    if (!ret) {\n        console.warn(\"Distance Expression: Index is out of range\");\n    }\n    return ret;\n}\n\n// Split the point set(points or linestring) into two halves, using IndexRange to do in-place splitting.\n// If geometry is a line, the last point(here is the second index) of range1 needs to be included as the first point(here is the first index) of range2.\n// If geometry are points, just split the points equally(if possible) into two new point sets(here are two index ranges).\nfunction splitRange(range: IndexRange, isLine: boolean) {\n    if (range[0] > range[1]) return [null, null];\n    const size = getRangeSize(range);\n    if (isLine) {\n        if (size === 2) {\n            return [range, null];\n        }\n        const size1 = Math.floor(size / 2);\n        const range1: IndexRange = [range[0], range[0] + size1];\n        const range2: IndexRange = [range[0] + size1, range[1]];\n        return [range1, range2];\n    } else {\n        if (size === 1) {\n            return [range, null];\n        }\n        const size1 = Math.floor(size / 2) - 1;\n        const range1: IndexRange = [range[0], range[0] + size1];\n        const range2: IndexRange = [range[0] + size1 + 1, range[1]];\n        return [range1, range2];\n    }\n}\n\nfunction getBBox(pointSets: Array<GeoJSONPosition>, range: IndexRange) {\n    const bbox = [Infinity, Infinity, -Infinity, -Infinity];\n    if (!isRangeSafe(range, pointSets.length)) return bbox;\n    for (let i = range[0]; i <= range[1]; ++i) {\n        updateBBox(bbox, pointSets[i]);\n    }\n    return bbox;\n}\n\nfunction getPolygonBBox(polygon: Array<Array<GeoJSONPosition>>) {\n    const bbox = [Infinity, Infinity, -Infinity, -Infinity];\n    for (let i = 0; i < polygon.length; ++i) {\n        for (let j = 0; j < polygon[i].length; ++j) {\n            updateBBox(bbox, polygon[i][j]);\n        }\n    }\n    return bbox;\n}\n\n// Calculate the distance between two bounding boxes.\n// Calculate the delta in x and y direction, and use two fake points {0.0, 0.0} and {dx, dy} to calculate the distance.\n// Distance will be 0.0 if bounding box are overlapping.\nfunction bboxToBBoxDistance(bbox1: BBox, bbox2: BBox, ruler: CheapRuler) {\n    if (isDefaultBBOX(bbox1) || isDefaultBBOX(bbox2)) {\n        return NaN;\n    }\n    let dx = 0.0;\n    let dy = 0.0;\n    // bbox1 in left side\n    if (bbox1[2] < bbox2[0]) {\n        dx = bbox2[0] - bbox1[2];\n    }\n    // bbox1 in right side\n    if (bbox1[0] > bbox2[2]) {\n        dx = bbox1[0] - bbox2[2];\n    }\n    // bbox1 in above side\n    if (bbox1[1] > bbox2[3]) {\n        dy = bbox1[1] - bbox2[3];\n    }\n    // bbox1 in down side\n    if (bbox1[3] < bbox2[1]) {\n        dy = bbox2[1] - bbox1[3];\n    }\n    return ruler.distance([0.0, 0.0], [dx, dy]);\n}\n\nfunction lngFromMercatorX(x: number): number {\n    return x * 360 - 180;\n}\n\nfunction latFromMercatorY(y: number): number {\n    const y2 = 180 - y * 360;\n    return 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90;\n}\n\nfunction getLngLatPoint(coord: Point, canonical: CanonicalTileID) {\n    const tilesAtZoom = Math.pow(2, canonical.z);\n    const x = (coord.x / EXTENT + canonical.x) / tilesAtZoom;\n    const y = (coord.y / EXTENT + canonical.y) / tilesAtZoom;\n    return [lngFromMercatorX(x), latFromMercatorY(y)];\n}\n\nfunction getLngLatPoints(coordinates: Array<Point>, canonical: CanonicalTileID) {\n    const coords = [];\n    for (let i = 0; i < coordinates.length; ++i) {\n        coords.push(getLngLatPoint(coordinates[i], canonical));\n    }\n    return coords;\n}\n\nfunction pointToLineDistance(point: GeoJSONPosition, line: Array<GeoJSONPosition>, ruler: CheapRuler) {\n    const nearestPoint = ruler.pointOnLine(line, point).point;\n    return ruler.distance(point, nearestPoint);\n}\n\nfunction pointsToLineDistance(points: Array<GeoJSONPosition>, rangeA: IndexRange, line: Array<GeoJSONPosition>, rangeB: IndexRange, ruler: CheapRuler) {\n    const subLine = line.slice(rangeB[0], rangeB[1] + 1);\n    let dist = Infinity;\n    for (let i = rangeA[0]; i <= rangeA[1]; ++i) {\n        if ((dist = Math.min(dist, pointToLineDistance(points[i], subLine, ruler))) === 0.0) return 0.0;\n    }\n    return dist;\n}\n\n// precondition is two segments are not intersecting with each other\nfunction segmentToSegmentDistance(p1: GeoJSONPosition, p2: GeoJSONPosition, q1: GeoJSONPosition, q2: GeoJSONPosition, ruler: CheapRuler) {\n    const dist1 = Math.min(\n        ruler.pointToSegmentDistance(p1, q1, q2),\n        ruler.pointToSegmentDistance(p2, q1, q2)\n    );\n    const dist2 = Math.min(\n        ruler.pointToSegmentDistance(q1, p1, p2),\n        ruler.pointToSegmentDistance(q2, p1, p2)\n    );\n\n    return Math.min(dist1, dist2);\n}\n\nfunction lineToLineDistance(line1: Array<GeoJSONPosition>, range1: IndexRange, line2: Array<GeoJSONPosition>, range2: IndexRange, ruler: CheapRuler) {\n    if (!isRangeSafe(range1, line1.length) || !isRangeSafe(range2, line2.length)) {\n        return NaN;\n    }\n    let dist = Infinity;\n    for (let i = range1[0]; i < range1[1]; ++i) {\n        for (let j = range2[0]; j < range2[1]; ++j) {\n            if (segmentIntersectSegment(line1[i], line1[i + 1], line2[j], line2[j + 1])) return 0.0;\n            dist = Math.min(dist, segmentToSegmentDistance(line1[i], line1[i + 1], line2[j], line2[j + 1], ruler));\n        }\n    }\n    return dist;\n}\n\nfunction pointsToPointsDistance(pointSet1: Array<GeoJSONPosition>, range1: IndexRange, pointSet2: Array<GeoJSONPosition>, range2: IndexRange, ruler: CheapRuler) {\n    if (!isRangeSafe(range1, pointSet1.length) || !isRangeSafe(range2, pointSet2.length)) {\n        return NaN;\n    }\n    let dist = Infinity;\n    for (let i = range1[0]; i <= range1[1]; ++i) {\n        for (let j = range2[0]; j <= range2[1]; ++j) {\n            if ((dist = Math.min(dist, ruler.distance(pointSet1[i], pointSet2[j]))) === 0.0) return dist;\n        }\n    }\n    return dist;\n}\n\nfunction pointToPolygonDistance(point: GeoJSONPosition, polygon: Array<Array<GeoJSONPosition>>, ruler: CheapRuler) {\n    if (pointWithinPolygon(point, polygon, true /*trueOnBoundary*/)) return 0.0;\n    let dist = Infinity;\n    for (const ring of polygon) {\n        const ringLen = ring.length;\n        if (ringLen < 2) {\n            console.warn(\"Distance Expression: Invalid polygon!\");\n            return NaN;\n        }\n        if (ring[0] !== ring[ringLen - 1]) {\n            if ((dist = Math.min(dist, ruler.pointToSegmentDistance(point, ring[ringLen - 1], ring[0]))) === 0.0) return dist;\n        }\n        if ((dist = Math.min(dist, pointToLineDistance(point, ring, ruler))) === 0.0) return dist;\n    }\n    return dist;\n}\n\nfunction lineToPolygonDistance(line: Array<GeoJSONPosition>, range: IndexRange, polygon: Array<Array<GeoJSONPosition>>, ruler: CheapRuler) {\n    if (!isRangeSafe(range, line.length)) {\n        return NaN;\n    }\n    for (let i = range[0]; i <= range[1]; ++i) {\n        if (pointWithinPolygon(line[i], polygon, true /*trueOnBoundary*/)) return 0.0;\n    }\n    let dist = Infinity;\n    for (let i = range[0]; i < range[1]; ++i) {\n        for (const ring of polygon) {\n            for (let j = 0, len = ring.length, k = len - 1; j < len; k = j++) {\n                if (segmentIntersectSegment(line[i], line[i + 1], ring[k], ring[j])) return 0.0;\n                dist = Math.min(dist, segmentToSegmentDistance(line[i], line[i + 1], ring[k], ring[j], ruler));\n            }\n        }\n    }\n    return dist;\n}\n\nfunction polygonIntersect(polygon1: Array<Array<GeoJSONPosition>>, polygon2: Array<Array<GeoJSONPosition>>) {\n    for (const ring of polygon1) {\n        for (let i = 0; i <= ring.length - 1; ++i) {\n            if (pointWithinPolygon(ring[i], polygon2, true /*trueOnBoundary*/)) return true;\n        }\n    }\n    return false;\n}\n\nfunction polygonToPolygonDistance(polygon1: Array<Array<GeoJSONPosition>>, polygon2: Array<Array<GeoJSONPosition>>, ruler: CheapRuler, currentMiniDist: number = Infinity) {\n    const bbox1 = getPolygonBBox(polygon1);\n    const bbox2 = getPolygonBBox(polygon2);\n    if (currentMiniDist !== Infinity && bboxToBBoxDistance(bbox1, bbox2, ruler) >= currentMiniDist) {\n        return currentMiniDist;\n    }\n    if (boxWithinBox(bbox1, bbox2)) {\n        if (polygonIntersect(polygon1, polygon2)) return 0.0;\n    } else if (polygonIntersect(polygon2, polygon1)) {\n        return 0.0;\n    }\n    let dist = currentMiniDist;\n    for (const ring1 of polygon1) {\n        for (let i = 0, len1 = ring1.length, l = len1 - 1; i < len1; l = i++) {\n            for (const ring2 of polygon2) {\n                for (let j = 0, len2 = ring2.length, k = len2 - 1; j < len2; k = j++) {\n                    if (segmentIntersectSegment(ring1[l], ring1[i], ring2[k], ring2[j])) return 0.0;\n                    dist = Math.min(dist, segmentToSegmentDistance(ring1[l], ring1[i], ring2[k], ring2[j], ruler));\n                }\n            }\n        }\n    }\n    return dist;\n}\n\nfunction updateQueue(distQueue: any, miniDist: number, ruler: CheapRuler, pointSet1: Array<GeoJSONPosition>, pointSet2: Array<GeoJSONPosition>, r1: IndexRange | null, r2: IndexRange | null) {\n    if (r1 === null || r2 === null) return;\n    const tempDist = bboxToBBoxDistance(getBBox(pointSet1, r1), getBBox(pointSet2, r2), ruler);\n    // Insert new pair to the queue if the bbox distance is less than miniDist, the pair with biggest distance will be at the top\n    if (tempDist < miniDist) distQueue.push({dist: tempDist, range1: r1, range2: r2});\n}\n\n// Divide and conquer, the time complexity is O(n*lgn), faster than Brute force O(n*n)\n// Most of the time, use index for in-place processing.\nfunction pointSetToPolygonDistance(pointSets: Array<GeoJSONPosition>, isLine: boolean, polygon: Array<Array<GeoJSONPosition>>, ruler: CheapRuler, currentMiniDist: number = Infinity) {\n    let miniDist = Math.min(ruler.distance(pointSets[0], polygon[0][0]), currentMiniDist);\n    if (miniDist === 0.0) return miniDist;\n    const initialDistPair: DistPair = {\n        dist: 0,\n        range1: [0, pointSets.length - 1],\n        range2: [0, 0]\n    };\n    const distQueue = new TinyQueue<DistPair>([initialDistPair], compareMax);\n\n    const setThreshold = isLine ? MIN_LINE_POINT_SIZE : MIN_POINT_SIZE;\n    const polyBBox = getPolygonBBox(polygon);\n\n    while (distQueue.length) {\n        const distPair = distQueue.pop();\n        if (distPair.dist >= miniDist) continue;\n        const range = distPair.range1;\n        // In case the set size are relatively small, we could use brute-force directly\n        if (getRangeSize(range) <= setThreshold) {\n            if (!isRangeSafe(range, pointSets.length)) return NaN;\n            if (isLine) {\n                const tempDist = lineToPolygonDistance(pointSets, range, polygon, ruler);\n                if ((miniDist = Math.min(miniDist, tempDist)) === 0.0) return miniDist;\n            } else {\n                for (let i = range[0]; i <= range[1]; ++i) {\n                    const tempDist = pointToPolygonDistance(pointSets[i], polygon, ruler);\n                    if ((miniDist = Math.min(miniDist, tempDist)) === 0.0) return miniDist;\n                }\n            }\n        } else {\n            const newRanges = splitRange(range, isLine);\n            if (newRanges[0] !== null) {\n                const tempDist = bboxToBBoxDistance(getBBox(pointSets, newRanges[0]), polyBBox, ruler);\n                if (tempDist < miniDist) distQueue.push({dist: tempDist, range1: newRanges[0], range2: [0, 0]});\n            }\n            if (newRanges[1] !== null) {\n                const tempDist = bboxToBBoxDistance(getBBox(pointSets, newRanges[1]), polyBBox, ruler);\n                if (tempDist < miniDist) distQueue.push({dist: tempDist, range1: newRanges[1], range2: [0, 0]});\n            }\n        }\n    }\n    return miniDist;\n}\n\nfunction pointSetsDistance(pointSet1: Array<GeoJSONPosition>, isLine1: boolean, pointSet2: Array<GeoJSONPosition>, isLine2: boolean, ruler: CheapRuler, currentMiniDist: number = Infinity) {\n    let miniDist = Math.min(currentMiniDist, ruler.distance(pointSet1[0], pointSet2[0]));\n    if (miniDist === 0.0) return miniDist;\n    const initialDistPair: DistPair = {\n        dist: 0,\n        range1: [0, pointSet1.length - 1],\n        range2: [0, pointSet2.length - 1]\n    };\n    const distQueue = new TinyQueue<DistPair>([initialDistPair], compareMax);\n\n    const set1Threshold = isLine1 ? MIN_LINE_POINT_SIZE : MIN_POINT_SIZE;\n    const set2Threshold = isLine2 ? MIN_LINE_POINT_SIZE : MIN_POINT_SIZE;\n\n    while (distQueue.length) {\n        const distPair = distQueue.pop();\n        if (distPair.dist >= miniDist) continue;\n        const rangeA = distPair.range1;\n        const rangeB = distPair.range2;\n        // In case the set size are relatively small, we could use brute-force directly\n        if (getRangeSize(rangeA) <= set1Threshold && getRangeSize(rangeB) <= set2Threshold) {\n            if (!isRangeSafe(rangeA, pointSet1.length) || !isRangeSafe(rangeB, pointSet2.length)) {\n                return NaN;\n            }\n            if (isLine1 && isLine2) {\n                miniDist = Math.min(miniDist, lineToLineDistance(pointSet1, rangeA, pointSet2, rangeB, ruler));\n            } else if (!isLine1 && !isLine2) {\n                miniDist = Math.min(miniDist, pointsToPointsDistance(pointSet1, rangeA, pointSet2, rangeB, ruler));\n            } else if (isLine1 && !isLine2) {\n                miniDist = Math.min(miniDist, pointsToLineDistance(pointSet2, rangeB, pointSet1, rangeA, ruler));\n            } else if (!isLine1 && isLine2) {\n                miniDist = Math.min(miniDist, pointsToLineDistance(pointSet1, rangeA, pointSet2, rangeB, ruler));\n            }\n            if (miniDist === 0.0) return miniDist;\n        } else {\n            const newRangesA = splitRange(rangeA, isLine1);\n            const newRangesB = splitRange(rangeB, isLine2);\n            updateQueue(distQueue, miniDist, ruler, pointSet1, pointSet2, newRangesA[0], newRangesB[0]);\n            updateQueue(distQueue, miniDist, ruler, pointSet1, pointSet2, newRangesA[0], newRangesB[1]);\n            updateQueue(distQueue, miniDist, ruler, pointSet1, pointSet2, newRangesA[1], newRangesB[0]);\n            updateQueue(distQueue, miniDist, ruler, pointSet1, pointSet2, newRangesA[1], newRangesB[1]);\n        }\n    }\n    return miniDist;\n}\n\nfunction pointSetToLinesDistance(pointSet: Array<GeoJSONPosition>, isLine: boolean, lines: Array<Array<GeoJSONPosition>>, ruler: CheapRuler, currentMiniDist: number = Infinity) {\n    let dist = currentMiniDist;\n    const bbox1 = getBBox(pointSet, [0, pointSet.length - 1]);\n    for (const line of lines) {\n        if (dist !== Infinity && bboxToBBoxDistance(bbox1, getBBox(line, [0, line.length - 1]), ruler) >= dist) continue;\n        dist = Math.min(dist, pointSetsDistance(pointSet, isLine, line, true /*isLine*/, ruler, dist));\n        if (dist === 0.0) return dist;\n    }\n    return dist;\n}\n\nfunction pointSetToPolygonsDistance(points: Array<GeoJSONPosition>, isLine: boolean, polygons: Array<Array<Array<GeoJSONPosition>>>, ruler: CheapRuler, currentMiniDist: number = Infinity) {\n    let dist = currentMiniDist;\n    const bbox1 = getBBox(points, [0, points.length - 1]);\n    for (const polygon of polygons) {\n        if (dist !== Infinity && bboxToBBoxDistance(bbox1, getPolygonBBox(polygon), ruler) >= dist) continue;\n        const tempDist = pointSetToPolygonDistance(points, isLine, polygon, ruler, dist);\n        if (isNaN(tempDist)) return tempDist;\n        if ((dist = Math.min(dist, tempDist)) === 0.0) return dist;\n    }\n    return dist;\n}\n\nfunction polygonsToPolygonsDistance(polygons1: Array<Array<Array<GeoJSONPosition>>>, polygons2: Array<Array<Array<GeoJSONPosition>>>, ruler: CheapRuler) {\n    let dist = Infinity;\n    for (const polygon1 of polygons1) {\n        for (const polygon2 of polygons2) {\n            const tempDist = polygonToPolygonDistance(polygon1, polygon2, ruler, dist);\n            if (isNaN(tempDist)) return tempDist;\n            if ((dist = Math.min(dist, tempDist)) === 0.0) return dist;\n        }\n    }\n    return dist;\n}\n\nfunction pointsToGeometryDistance(originGeometry: Array<Array<Point>>, canonical: CanonicalTileID, geometry: DistanceGeometry) {\n    const lngLatPoints = [];\n    for (const points of originGeometry) {\n        for (const point of points) {\n            lngLatPoints.push(getLngLatPoint(point, canonical));\n        }\n    }\n    const ruler = new CheapRuler(lngLatPoints[0][1], 'meters');\n    if (geometry.type === 'Point' || geometry.type === 'MultiPoint' || geometry.type === 'LineString') {\n        return pointSetsDistance(lngLatPoints, false /*isLine*/,\n            geometry.type === \"Point\" ? [geometry.coordinates] : geometry.coordinates,\n            geometry.type === 'LineString' /*isLine*/, ruler);\n    }\n    if (geometry.type === 'MultiLineString') {\n        return pointSetToLinesDistance(lngLatPoints, false /*isLine*/,  geometry.coordinates, ruler);\n    }\n    if (geometry.type === 'Polygon' || geometry.type === 'MultiPolygon') {\n        return pointSetToPolygonsDistance(lngLatPoints, false /*isLine*/,\n            geometry.type === \"Polygon\" ? [geometry.coordinates] : geometry.coordinates, ruler);\n    }\n    return null;\n}\n\nfunction linesToGeometryDistance(originGeometry: Array<Array<Point>>, canonical: CanonicalTileID, geometry: DistanceGeometry) {\n    const lngLatLines = [];\n    for (const line of originGeometry) {\n        const lngLatLine = [];\n        for (const point of line) {\n            lngLatLine.push(getLngLatPoint(point, canonical));\n        }\n        lngLatLines.push(lngLatLine);\n    }\n    const ruler = new CheapRuler(lngLatLines[0][0][1], 'meters');\n    if (geometry.type === 'Point' || geometry.type === 'MultiPoint' || geometry.type === 'LineString') {\n        return pointSetToLinesDistance(\n            geometry.type === \"Point\" ? [geometry.coordinates] : geometry.coordinates,\n            geometry.type === 'LineString' /*isLine*/, lngLatLines, ruler);\n    }\n    if (geometry.type === 'MultiLineString') {\n        let dist = Infinity;\n        for (let i = 0; i < geometry.coordinates.length; i++) {\n            const tempDist = pointSetToLinesDistance(geometry.coordinates[i], true /*isLine*/, lngLatLines, ruler, dist);\n            if (isNaN(tempDist)) return tempDist;\n            if ((dist = Math.min(dist, tempDist)) === 0.0) return dist;\n        }\n        return dist;\n    }\n    if (geometry.type === 'Polygon' || geometry.type === 'MultiPolygon') {\n        let dist = Infinity;\n        for (let i = 0; i < lngLatLines.length; i++) {\n            const tempDist = pointSetToPolygonsDistance(lngLatLines[i], true /*isLine*/,\n                geometry.type === \"Polygon\" ? [geometry.coordinates] : geometry.coordinates,\n                ruler, dist);\n            if (isNaN(tempDist)) return tempDist;\n            if ((dist = Math.min(dist, tempDist)) === 0.0) return dist;\n        }\n        return dist;\n    }\n    return null;\n}\n\nfunction polygonsToGeometryDistance(originGeometry: Array<Array<Point>>, canonical: CanonicalTileID, geometry: DistanceGeometry) {\n    const lngLatPolygons = [];\n    for (const polygon of classifyRings(originGeometry, 0)) {\n        const lngLatPolygon = [];\n        for (let i = 0; i < polygon.length; ++i) {\n            lngLatPolygon.push(getLngLatPoints(polygon[i], canonical));\n        }\n        lngLatPolygons.push(lngLatPolygon);\n    }\n    const ruler = new CheapRuler(lngLatPolygons[0][0][0][1], 'meters');\n    if (geometry.type === 'Point' || geometry.type === 'MultiPoint' || geometry.type === 'LineString') {\n        return pointSetToPolygonsDistance(\n            geometry.type === \"Point\" ? [geometry.coordinates] : geometry.coordinates,\n            geometry.type === 'LineString' /*isLine*/, lngLatPolygons, ruler);\n    }\n    if (geometry.type === 'MultiLineString') {\n        let dist = Infinity;\n        for (let i = 0; i < geometry.coordinates.length; i++) {\n            const tempDist = pointSetToPolygonsDistance(geometry.coordinates[i], true /*isLine*/, lngLatPolygons, ruler, dist);\n            if (isNaN(tempDist)) return tempDist;\n            if ((dist = Math.min(dist, tempDist)) === 0.0) return dist;\n        }\n        return dist;\n    }\n    if (geometry.type === 'Polygon' || geometry.type === 'MultiPolygon') {\n        return polygonsToPolygonsDistance(\n            geometry.type === \"Polygon\" ? [geometry.coordinates] : geometry.coordinates,\n            lngLatPolygons, ruler);\n    }\n    return null;\n}\n\nfunction isTypeValid(type: string) {\n    return (\n        type === \"Point\" ||\n        type === \"MultiPoint\" ||\n        type === \"LineString\" ||\n        type === \"MultiLineString\" ||\n        type === \"Polygon\" ||\n        type === \"MultiPolygon\"\n    );\n}\nclass Distance implements Expression {\n    type: Type;\n    geojson: GeoJSON;\n    geometries: DistanceGeometry;\n\n    constructor(geojson: GeoJSON, geometries: DistanceGeometry) {\n        this.type = NumberType;\n        this.geojson = geojson;\n        this.geometries = geometries;\n    }\n\n    static parse(args: $ReadOnlyArray<mixed>, context: ParsingContext): ?Distance {\n        if (args.length !== 2) {\n            return context.error(\n                `'distance' expression requires either one argument, but found ' ${args.length -\n                    1} instead.`\n            );\n        }\n        if (isValue(args[1])) {\n            const geojson = (args[1]: Object);\n            if (geojson.type === 'FeatureCollection') {\n                for (let i = 0; i < geojson.features.length; ++i) {\n                    if (isTypeValid(geojson.features[i].geometry.type)) {\n                        return new Distance(geojson, geojson.features[i].geometry);\n                    }\n                }\n            } else if (geojson.type === 'Feature') {\n                if (isTypeValid(geojson.geometry.type)) {\n                    return new Distance(geojson, geojson.geometry);\n                }\n            } else if (isTypeValid(geojson.type)) {\n                return new Distance(geojson, geojson);\n            }\n        }\n        return context.error(\n            \"'distance' expression needs to be an array with format [\\'Distance\\', GeoJSONObj].\"\n        );\n    }\n\n    evaluate(ctx: EvaluationContext): number | null {\n        const geometry = ctx.geometry();\n        const canonical = ctx.canonicalID();\n        if (geometry != null && canonical != null) {\n            if (ctx.geometryType() === 'Point') {\n                return pointsToGeometryDistance(geometry, canonical, this.geometries);\n            }\n            if (ctx.geometryType() === 'LineString') {\n                return linesToGeometryDistance(geometry, canonical, this.geometries);\n            }\n            if (ctx.geometryType() === 'Polygon') {\n                return polygonsToGeometryDistance(geometry, canonical, this.geometries);\n            }\n            console.warn(\"Distance Expression: currently only evaluates valid Point/LineString/Polygon geometries.\");\n        } else {\n            console.warn(\"Distance Expression: requirs valid feature and canonical information.\");\n        }\n        return null;\n    }\n\n    eachChild() {}\n\n    outputDefined(): boolean {\n        return true;\n    }\n\n    serialize(): Array<mixed> {\n        return ['distance', this.geojson];\n    }\n}\n\nexport default Distance;\n","// @flow\n\nimport {\n    type Type,\n    ValueType\n} from '../types.js';\nimport {Color, typeOf, toString as valueToString} from '../values.js';\nimport Formatted from '../types/formatted.js';\nimport ResolvedImage from '../types/resolved_image.js';\nimport Literal from './literal.js';\n\nimport type {Expression, SerializedExpression} from '../expression.js';\nimport type ParsingContext from '../parsing_context.js';\nimport type EvaluationContext from '../evaluation_context.js';\n\nfunction coerceValue(type: string, value: any): any {\n    switch (type) {\n    case 'string': return valueToString(value);\n    case 'number': return +value;\n    case 'boolean': return !!value;\n    case 'color': return Color.parse(value);\n    case 'formatted': {\n        return Formatted.fromString(valueToString(value));\n    }\n    case 'resolvedImage': {\n        return ResolvedImage.fromString(valueToString(value));\n    }\n    }\n    return value;\n}\n\nfunction clampToAllowedNumber(value: number, min: number | void, max: number | void, step: number | void): number {\n    if (step !== undefined) {\n        value = step * Math.round(value / step);\n    }\n    if (min !== undefined && value < min) {\n        value = min;\n    }\n    if (max !== undefined && value > max) {\n        value = max;\n    }\n    return value;\n}\n\nclass Config implements Expression {\n    type: Type;\n    key: string;\n    scope: ?string;\n\n    constructor(type: Type, key: string, scope?: string) {\n        this.type = type;\n        this.key = key;\n        this.scope = scope;\n    }\n\n    static parse(args: $ReadOnlyArray<mixed>, context: ParsingContext): ?Config {\n        let type = context.expectedType;\n        if (type === null || type === undefined) {\n            type = ValueType;\n        }\n        if (args.length < 2 || args.length > 3) {\n            return context.error(`Invalid number of arguments for 'config' expression.`);\n        }\n\n        const configKey = context.parse(args[1], 1);\n        if (!(configKey instanceof Literal)) {\n            return context.error(`Key name of 'config' expression must be a string literal.`);\n        }\n\n        if (args.length >= 3) {\n            const configScope = context.parse(args[2], 2);\n            if (!(configScope instanceof Literal)) {\n                return context.error(`Scope of 'config' expression must be a string literal.`);\n            }\n            return new Config(type, valueToString(configKey.value), valueToString(configScope.value));\n        }\n\n        return new Config(type, valueToString(configKey.value));\n    }\n\n    evaluate(ctx: EvaluationContext): any {\n        const FQIDSeparator = '\\u001F';\n        const configKey = [this.key, this.scope, ctx.scope].filter(Boolean).join(FQIDSeparator);\n\n        const config = ctx.getConfig(configKey);\n        if (!config) return null;\n\n        const {type, value, values, minValue, maxValue, stepValue} = config;\n\n        const defaultValue = config.default.evaluate(ctx);\n\n        let result = defaultValue;\n        if (value) {\n            // temporarily override scope to parent to evaluate config expressions passed from the parent\n            const originalScope = ctx.scope;\n            ctx.scope = (originalScope || '').split(FQIDSeparator).slice(1).join(FQIDSeparator);\n            result = value.evaluate(ctx);\n            ctx.scope = originalScope;\n        }\n        if (type) {\n            result = coerceValue(type, result);\n        }\n\n        if (result !== undefined && (minValue !== undefined || maxValue !== undefined || stepValue !== undefined)) {\n            if (typeof result === 'number') {\n                result = clampToAllowedNumber(result, minValue, maxValue, stepValue);\n            } else if (Array.isArray(result)) {\n                result = result.map((item) => typeof item === 'number' ? clampToAllowedNumber(item, minValue, maxValue, stepValue) : item);\n            }\n        }\n\n        if (value !== undefined && result !== undefined && values && !values.includes(result)) {\n            // The result is not among the allowed values. Instead, use the default value from the option.\n            result = defaultValue;\n            if (type) {\n                result = coerceValue(type, result);\n            }\n        }\n\n        if ((type && type !== this.type) || (result !== undefined && typeOf(result) !== this.type)) {\n            result = coerceValue(this.type.kind, result);\n        }\n\n        return result;\n    }\n\n    eachChild() { }\n\n    outputDefined(): boolean {\n        return false;\n    }\n\n    serialize(): SerializedExpression {\n        const res = [\"config\", this.key];\n        if (this.scope) {\n            res.concat(this.key);\n        }\n        return res;\n    }\n}\n\nexport default Config;\n","// @flow\n\nimport CompoundExpression from './compound_expression.js';\nimport Within from './definitions/within.js';\nimport Distance from './definitions/distance.js';\nimport Config from './definitions/config.js';\nimport type {Expression} from './expression.js';\n\nfunction isFeatureConstant(e: Expression): boolean {\n    if (e instanceof CompoundExpression) {\n        if (e.name === 'get' && e.args.length === 1) {\n            return false;\n        } else if (e.name === 'feature-state') {\n            return false;\n        } else if (e.name === 'has' && e.args.length === 1) {\n            return false;\n        } else if (\n            e.name === 'properties' ||\n            e.name === 'geometry-type' ||\n            e.name === 'id'\n        ) {\n            return false;\n        } else if (/^filter-/.test(e.name)) {\n            return false;\n        }\n    }\n\n    if (e instanceof Within) {\n        return false;\n    }\n\n    if (e instanceof Distance) {\n        return false;\n    }\n\n    let result = true;\n    e.eachChild(arg => {\n        if (result && !isFeatureConstant(arg)) { result = false; }\n    });\n    return result;\n}\n\nfunction isStateConstant(e: Expression): boolean {\n    if (e instanceof CompoundExpression) {\n        if (e.name === 'feature-state') {\n            return false;\n        }\n    }\n    let result = true;\n    e.eachChild(arg => {\n        if (result && !isStateConstant(arg)) { result = false; }\n    });\n    return result;\n}\n\nfunction isConfigConstant(e: Expression): boolean {\n    if (e instanceof Config) {\n        return false;\n    }\n\n    let result = true;\n    e.eachChild(arg => {\n        if (result && !isConfigConstant(arg)) { result = false; }\n    });\n    return result;\n}\n\nfunction isGlobalPropertyConstant(e: Expression, properties: Array<string>): boolean {\n    if (e instanceof CompoundExpression && properties.indexOf(e.name) >= 0) { return false; }\n    let result = true;\n    e.eachChild((arg) => {\n        if (result && !isGlobalPropertyConstant(arg, properties)) { result = false; }\n    });\n    return result;\n}\n\nexport {isFeatureConstant, isGlobalPropertyConstant, isStateConstant, isConfigConstant};\n","// @flow\n\nimport type {Type} from '../types.js';\nimport type {Expression} from '../expression.js';\nimport type ParsingContext from '../parsing_context.js';\nimport type EvaluationContext  from '../evaluation_context.js';\n\nclass Var implements Expression {\n    type: Type;\n    name: string;\n    boundExpression: Expression;\n\n    constructor(name: string, boundExpression: Expression) {\n        this.type = boundExpression.type;\n        this.name = name;\n        this.boundExpression = boundExpression;\n    }\n\n    static parse(args: $ReadOnlyArray<mixed>, context: ParsingContext): void | Var {\n        if (args.length !== 2 || typeof args[1] !== 'string')\n            return context.error(`'var' expression requires exactly one string literal argument.`);\n\n        const name = args[1];\n        if (!context.scope.has(name)) {\n            return context.error(`Unknown variable \"${name}\". Make sure \"${name}\" has been bound in an enclosing \"let\" expression before using it.`, 1);\n        }\n\n        return new Var(name, context.scope.get(name));\n    }\n\n    evaluate(ctx: EvaluationContext): any {\n        return this.boundExpression.evaluate(ctx);\n    }\n\n    eachChild() {}\n\n    outputDefined(): boolean {\n        return false;\n    }\n\n    serialize(): Array<string> {\n        return [\"var\", this.name];\n    }\n}\n\nexport default Var;\n","// @flow\n\nimport Scope from './scope.js';\nimport {checkSubtype} from './types.js';\nimport ParsingError from './parsing_error.js';\nimport Literal from './definitions/literal.js';\nimport Assertion from './definitions/assertion.js';\nimport Coercion from './definitions/coercion.js';\nimport EvaluationContext from './evaluation_context.js';\nimport CompoundExpression from './compound_expression.js';\nimport CollatorExpression from './definitions/collator.js';\nimport Within from './definitions/within.js';\nimport Distance from './definitions/distance.js';\nimport Config from './definitions/config.js';\nimport {isGlobalPropertyConstant, isFeatureConstant} from './is_constant.js';\nimport Var from './definitions/var.js';\n\nimport type {Expression, ExpressionRegistry} from './expression.js';\nimport type {Type} from './types.js';\nimport type {ConfigOptions} from '../../style/properties.js';\n\n/**\n * State associated parsing at a given point in an expression tree.\n * @private\n */\nclass ParsingContext {\n    registry: ExpressionRegistry;\n    path: Array<number>;\n    key: string;\n    scope: Scope;\n    errors: Array<ParsingError>;\n    _scope: ?string;\n    options: ?ConfigOptions;\n\n    // The expected type of this expression. Provided only to allow Expression\n    // implementations to infer argument types: Expression#parse() need not\n    // check that the output type of the parsed expression matches\n    // `expectedType`.\n    expectedType: ?Type;\n\n    constructor(\n        registry: ExpressionRegistry,\n        path: Array<number> = [],\n        expectedType: ?Type,\n        scope: Scope = new Scope(),\n        errors: Array<ParsingError> = [],\n        _scope: ?string,\n        options?: ?ConfigOptions\n    ) {\n        this.registry = registry;\n        this.path = path;\n        this.key = path.map(part => `[${part}]`).join('');\n        this.scope = scope;\n        this.errors = errors;\n        this.expectedType = expectedType;\n        this._scope = _scope;\n        this.options = options;\n    }\n\n    /**\n     * @param expr the JSON expression to parse\n     * @param index the optional argument index if this expression is an argument of a parent expression that's being parsed\n     * @param options\n     * @param options.omitTypeAnnotations set true to omit inferred type annotations.  Caller beware: with this option set, the parsed expression's type will NOT satisfy `expectedType` if it would normally be wrapped in an inferred annotation.\n     * @private\n     */\n    parse(\n        expr: mixed,\n        index?: number,\n        expectedType?: ?Type,\n        bindings?: Array<[string, Expression]>,\n        options: {typeAnnotation?: 'assert' | 'coerce' | 'omit'} = {}\n    ): ?Expression {\n        if (index || expectedType) {\n            return this.concat(index, expectedType, bindings)._parse(expr, options);\n        }\n        return this._parse(expr, options);\n    }\n\n    _parse(expr: mixed, options: {typeAnnotation?: 'assert' | 'coerce' | 'omit'}): ?Expression {\n        if (expr === null || typeof expr === 'string' || typeof expr === 'boolean' || typeof expr === 'number') {\n            expr = ['literal', expr];\n        }\n\n        function annotate(parsed: Expression, type: Type, typeAnnotation: 'assert' | 'coerce' | 'omit') {\n            if (typeAnnotation === 'assert') {\n                return new Assertion(type, [parsed]);\n            } else if (typeAnnotation === 'coerce') {\n                return new Coercion(type, [parsed]);\n            } else {\n                return parsed;\n            }\n        }\n\n        if (Array.isArray(expr)) {\n            if (expr.length === 0) {\n                return this.error(`Expected an array with at least one element. If you wanted a literal array, use [\"literal\", []].`);\n            }\n\n            const Expr = typeof expr[0] === 'string' ? this.registry[expr[0]] : undefined;\n            if (Expr) {\n                let parsed = Expr.parse(expr, this);\n                if (!parsed) return null;\n\n                if (this.expectedType) {\n                    const expected = this.expectedType;\n                    const actual = parsed.type;\n\n                    // When we expect a number, string, boolean, or array but have a value, wrap it in an assertion.\n                    // When we expect a color or formatted string, but have a string or value, wrap it in a coercion.\n                    // Otherwise, we do static type-checking.\n                    //\n                    // These behaviors are overridable for:\n                    //   * The \"coalesce\" operator, which needs to omit type annotations.\n                    //   * String-valued properties (e.g. `text-field`), where coercion is more convenient than assertion.\n                    //\n                    if ((expected.kind === 'string' || expected.kind === 'number' || expected.kind === 'boolean' || expected.kind === 'object' || expected.kind === 'array') && actual.kind === 'value') {\n                        parsed = annotate(parsed, expected, options.typeAnnotation || 'assert');\n                    } else if ((expected.kind === 'color' || expected.kind === 'formatted' || expected.kind === 'resolvedImage') && (actual.kind === 'value' || actual.kind === 'string')) {\n                        parsed = annotate(parsed, expected, options.typeAnnotation || 'coerce');\n                    } else if (this.checkSubtype(expected, actual)) {\n                        return null;\n                    }\n                }\n\n                // If an expression's arguments are all literals, we can evaluate\n                // it immediately and replace it with a literal value in the\n                // parsed/compiled result. Expressions that expect an image should\n                // not be resolved here so we can later get the available images.\n                if (!(parsed instanceof Literal) && (parsed.type.kind !== 'resolvedImage') && isConstant(parsed)) {\n                    const ec = new EvaluationContext(this._scope, this.options);\n                    try {\n                        parsed = new Literal(parsed.type, parsed.evaluate(ec));\n                    } catch (e) {\n                        this.error(e.message);\n                        return null;\n                    }\n                }\n\n                return parsed;\n            }\n\n            // Try to parse as array\n            return Coercion.parse(['to-array', expr], this);\n        } else if (typeof expr === 'undefined') {\n            return this.error(`'undefined' value invalid. Use null instead.`);\n        } else if (typeof expr === 'object') {\n            return this.error(`Bare objects invalid. Use [\"literal\", {...}] instead.`);\n        } else {\n            return this.error(`Expected an array, but found ${typeof expr} instead.`);\n        }\n    }\n\n    /**\n     * Returns a copy of this context suitable for parsing the subexpression at\n     * index `index`, optionally appending to 'let' binding map.\n     *\n     * Note that `errors` property, intended for collecting errors while\n     * parsing, is copied by reference rather than cloned.\n     * @private\n     */\n    concat(index: ?number, expectedType?: ?Type, bindings?: Array<[string, Expression]>): ParsingContext {\n        const path = typeof index === 'number' ? this.path.concat(index) : this.path;\n        const scope = bindings ? this.scope.concat(bindings) : this.scope;\n        return new ParsingContext(\n            this.registry,\n            path,\n            expectedType || null,\n            scope,\n            this.errors,\n            this._scope,\n            this.options\n        );\n    }\n\n    /**\n     * Push a parsing (or type checking) error into the `this.errors`\n     * @param error The message\n     * @param keys Optionally specify the source of the error at a child\n     * of the current expression at `this.key`.\n     * @private\n     */\n    error(error: string, ...keys: Array<number>) {\n        const key = `${this.key}${keys.map(k => `[${k}]`).join('')}`;\n        this.errors.push(new ParsingError(key, error));\n    }\n\n    /**\n     * Returns null if `t` is a subtype of `expected`; otherwise returns an\n     * error message and also pushes it to `this.errors`.\n     */\n    checkSubtype(expected: Type, t: Type): ?string {\n        const error = checkSubtype(expected, t);\n        if (error) this.error(error);\n        return error;\n    }\n}\n\nexport default ParsingContext;\n\nfunction isConstant(expression: Expression) {\n    if (expression instanceof Var) {\n        return isConstant(expression.boundExpression);\n    } else if (expression instanceof CompoundExpression && expression.name === 'error') {\n        return false;\n    } else if (expression instanceof CollatorExpression) {\n        // Although the results of a Collator expression with fixed arguments\n        // generally shouldn't change between executions, we can't serialize them\n        // as constant expressions because results change based on environment.\n        return false;\n    } else if (expression instanceof Within) {\n        return false;\n    } else if (expression instanceof Distance) {\n        return false;\n    } else if (expression instanceof Config) {\n        return false;\n    }\n\n    const isTypeAnnotation = expression instanceof Coercion ||\n        expression instanceof Assertion;\n\n    let childrenConstant = true;\n    expression.eachChild(child => {\n        // We can _almost_ assume that if `expressions` children are constant,\n        // they would already have been evaluated to Literal values when they\n        // were parsed.  Type annotations are the exception, because they might\n        // have been inferred and added after a child was parsed.\n\n        // So we recurse into isConstant() for the children of type annotations,\n        // but otherwise simply check whether they are Literals.\n        if (isTypeAnnotation) {\n            childrenConstant = childrenConstant && isConstant(child);\n        } else {\n            childrenConstant = childrenConstant && child instanceof Literal;\n        }\n    });\n    if (!childrenConstant) {\n        return false;\n    }\n\n    return isFeatureConstant(expression) &&\n        isGlobalPropertyConstant(expression, ['zoom', 'heatmap-density', 'line-progress', 'raster-value', 'sky-radial-progress', 'accumulated', 'is-supported-script', 'pitch', 'distance-from-center', 'measure-light', 'raster-particle-speed']);\n}\n","// @flow\n\nimport RuntimeError from './runtime_error.js';\n\nimport type {Expression} from './expression.js';\n\nexport type Stops = Array<[number, Expression]>;\n\n/**\n * Returns the index of the last stop <= input, or 0 if it doesn't exist.\n * @private\n */\nexport function findStopLessThanOrEqualTo(stops: Array<number>, input: number): number {\n    const lastIndex = stops.length - 1;\n    let lowerIndex = 0;\n    let upperIndex = lastIndex;\n    let currentIndex = 0;\n    let currentValue, nextValue;\n\n    while (lowerIndex <= upperIndex) {\n        currentIndex = Math.floor((lowerIndex + upperIndex) / 2);\n        currentValue = stops[currentIndex];\n        nextValue = stops[currentIndex + 1];\n\n        if (currentValue <= input) {\n            if (currentIndex === lastIndex || input < nextValue) { // Search complete\n                return currentIndex;\n            }\n\n            lowerIndex = currentIndex + 1;\n        } else if (currentValue > input) {\n            upperIndex = currentIndex - 1;\n        } else {\n            throw new RuntimeError('Input is not a number.');\n        }\n    }\n\n    return 0;\n}\n","// @flow\n\nimport {NumberType} from '../types.js';\n\nimport {findStopLessThanOrEqualTo} from '../stops.js';\n\nimport type {Stops} from '../stops.js';\nimport type {Expression, SerializedExpression} from '../expression.js';\nimport type ParsingContext from '../parsing_context.js';\nimport type EvaluationContext from '../evaluation_context.js';\nimport type {Type} from '../types.js';\n\nclass Step implements Expression {\n    type: Type;\n\n    input: Expression;\n    labels: Array<number>;\n    outputs: Array<Expression>;\n\n    constructor(type: Type, input: Expression, stops: Stops) {\n        this.type = type;\n        this.input = input;\n\n        this.labels = [];\n        this.outputs = [];\n        for (const [label, expression] of stops) {\n            this.labels.push(label);\n            this.outputs.push(expression);\n        }\n    }\n\n    static parse(args: $ReadOnlyArray<mixed>, context: ParsingContext): ?Step {\n        if (args.length - 1 < 4) {\n            return context.error(`Expected at least 4 arguments, but found only ${args.length - 1}.`);\n        }\n\n        if ((args.length - 1) % 2 !== 0) {\n            return context.error(`Expected an even number of arguments.`);\n        }\n\n        const input = context.parse(args[1], 1, NumberType);\n        if (!input) return null;\n\n        const stops: Stops = [];\n\n        let outputType: Type = (null: any);\n        if (context.expectedType && context.expectedType.kind !== 'value') {\n            outputType = context.expectedType;\n        }\n\n        for (let i = 1; i < args.length; i += 2) {\n            const label = i === 1 ? -Infinity : args[i];\n            const value = args[i + 1];\n\n            const labelKey = i;\n            const valueKey = i + 1;\n\n            if (typeof label !== 'number') {\n                return context.error('Input/output pairs for \"step\" expressions must be defined using literal numeric values (not computed expressions) for the input values.', labelKey);\n            }\n\n            if (stops.length && stops[stops.length - 1][0] >= label) {\n                return context.error('Input/output pairs for \"step\" expressions must be arranged with input values in strictly ascending order.', labelKey);\n            }\n\n            const parsed = context.parse(value, valueKey, outputType);\n            if (!parsed) return null;\n            outputType = outputType || parsed.type;\n            stops.push([label, parsed]);\n        }\n\n        return new Step(outputType, input, stops);\n    }\n\n    evaluate(ctx: EvaluationContext): any {\n        const labels = this.labels;\n        const outputs = this.outputs;\n\n        if (labels.length === 1) {\n            return outputs[0].evaluate(ctx);\n        }\n\n        const value = ((this.input.evaluate(ctx): any): number);\n        if (value <= labels[0]) {\n            return outputs[0].evaluate(ctx);\n        }\n\n        const stopCount = labels.length;\n        if (value >= labels[stopCount - 1]) {\n            return outputs[stopCount - 1].evaluate(ctx);\n        }\n\n        const index = findStopLessThanOrEqualTo(labels, value);\n        return outputs[index].evaluate(ctx);\n    }\n\n    eachChild(fn: (_: Expression) => void) {\n        fn(this.input);\n        for (const expression of this.outputs) {\n            fn(expression);\n        }\n    }\n\n    outputDefined(): boolean {\n        return this.outputs.every(out => out.outputDefined());\n    }\n\n    serialize(): SerializedExpression {\n        const serialized = [\"step\", this.input.serialize()];\n        for (let i = 0; i < this.labels.length; i++) {\n            if (i > 0) {\n                serialized.push(this.labels[i]);\n            }\n            serialized.push(this.outputs[i].serialize());\n        }\n        return serialized;\n    }\n}\n\nexport default Step;\n","// @flow\n\nimport Color from './color.js';\n\nimport {number as interpolateNumber} from './interpolate.js';\n\ntype LABColor = {\n    l: number,\n    a: number,\n    b: number,\n    alpha: number\n};\n\ntype HCLColor = {\n    h: number,\n    c: number,\n    l: number,\n    alpha: number\n};\n\n// Constants\nconst Xn = 0.950470, // D65 standard referent\n    Yn = 1,\n    Zn = 1.088830,\n    t0 = 4 / 29,\n    t1 = 6 / 29,\n    t2 = 3 * t1 * t1,\n    t3 = t1 * t1 * t1,\n    deg2rad = Math.PI / 180,\n    rad2deg = 180 / Math.PI;\n\n// Utilities\nfunction xyz2lab(t: number) {\n    return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n}\n\nfunction lab2xyz(t: number) {\n    return t > t1 ? t * t * t : t2 * (t - t0);\n}\n\nfunction xyz2rgb(x: number) {\n    return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n}\n\nfunction rgb2xyz(x: number) {\n    x /= 255;\n    return x <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n}\n\n// LAB\nfunction rgbToLab(rgbColor: Color): LABColor {\n    const b = rgb2xyz(rgbColor.r),\n        a = rgb2xyz(rgbColor.g),\n        l = rgb2xyz(rgbColor.b),\n        x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn),\n        y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn),\n        z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn);\n\n    return {\n        l: 116 * y - 16,\n        a: 500 * (x - y),\n        b: 200 * (y - z),\n        alpha: rgbColor.a\n    };\n}\n\nfunction labToRgb(labColor: LABColor): Color {\n    let y = (labColor.l + 16) / 116,\n        x = isNaN(labColor.a) ? y : y + labColor.a / 500,\n        z = isNaN(labColor.b) ? y : y - labColor.b / 200;\n    y = Yn * lab2xyz(y);\n    x = Xn * lab2xyz(x);\n    z = Zn * lab2xyz(z);\n    return new Color(\n        xyz2rgb(3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB\n        xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z),\n        xyz2rgb(0.0556434 * x - 0.2040259 * y + 1.0572252 * z),\n        labColor.alpha\n    );\n}\n\nfunction interpolateLab(from: LABColor, to: LABColor, t: number): LABColor {\n    return {\n        l: interpolateNumber(from.l, to.l, t),\n        a: interpolateNumber(from.a, to.a, t),\n        b: interpolateNumber(from.b, to.b, t),\n        alpha: interpolateNumber(from.alpha, to.alpha, t)\n    };\n}\n\n// HCL\nfunction rgbToHcl(rgbColor: Color): HCLColor {\n    const {l, a, b} = rgbToLab(rgbColor);\n    const h = Math.atan2(b, a) * rad2deg;\n    return {\n        h: h < 0 ? h + 360 : h,\n        c: Math.sqrt(a * a + b * b),\n        l,\n        alpha: rgbColor.a\n    };\n}\n\nfunction hclToRgb(hclColor: HCLColor): Color {\n    const h = hclColor.h * deg2rad,\n        c = hclColor.c,\n        l = hclColor.l;\n    return labToRgb({\n        l,\n        a: Math.cos(h) * c,\n        b: Math.sin(h) * c,\n        alpha: hclColor.alpha\n    });\n}\n\nfunction interpolateHue(a: number, b: number, t: number) {\n    const d = b - a;\n    return a + t * (d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d);\n}\n\nfunction interpolateHcl(from: HCLColor, to: HCLColor, t: number): HCLColor {\n    return {\n        h: interpolateHue(from.h, to.h, t),\n        c: interpolateNumber(from.c, to.c, t),\n        l: interpolateNumber(from.l, to.l, t),\n        alpha: interpolateNumber(from.alpha, to.alpha, t)\n    };\n}\n\nexport const lab = {\n    forward: rgbToLab,\n    reverse: labToRgb,\n    interpolate: interpolateLab\n};\n\nexport const hcl = {\n    forward: rgbToHcl,\n    reverse: hclToRgb,\n    interpolate: interpolateHcl\n};\n","// @flow\n\nimport UnitBezier from '@mapbox/unitbezier';\n\nimport * as interpolate from '../../util/interpolate.js';\nimport {toString, NumberType, ColorType} from '../types.js';\nimport {findStopLessThanOrEqualTo} from '../stops.js';\nimport {hcl, lab} from '../../util/color_spaces.js';\nimport Color from '../../util/color.js';\n\nimport type {Stops} from '../stops.js';\nimport type {Expression, SerializedExpression} from '../expression.js';\nimport type ParsingContext from '../parsing_context.js';\nimport type EvaluationContext from '../evaluation_context.js';\nimport type {Type} from '../types.js';\n\nexport type InterpolationType =\n    { name: 'linear' } |\n    { name: 'exponential', base: number } |\n    { name: 'cubic-bezier', controlPoints: [number, number, number, number] };\n\nclass Interpolate implements Expression {\n    type: Type;\n\n    operator: 'interpolate' | 'interpolate-hcl' | 'interpolate-lab';\n    interpolation: InterpolationType;\n    input: Expression;\n    labels: Array<number>;\n    outputs: Array<Expression>;\n\n    constructor(type: Type, operator: 'interpolate' | 'interpolate-hcl' | 'interpolate-lab', interpolation: InterpolationType, input: Expression, stops: Stops) {\n        this.type = type;\n        this.operator = operator;\n        this.interpolation = interpolation;\n        this.input = input;\n\n        this.labels = [];\n        this.outputs = [];\n        for (const [label, expression] of stops) {\n            this.labels.push(label);\n            this.outputs.push(expression);\n        }\n    }\n\n    static interpolationFactor(interpolation: InterpolationType, input: number, lower: number, upper: number): number {\n        let t = 0;\n        if (interpolation.name === 'exponential') {\n            t = exponentialInterpolation(input, interpolation.base, lower, upper);\n        } else if (interpolation.name === 'linear') {\n            t = exponentialInterpolation(input, 1, lower, upper);\n        } else if (interpolation.name === 'cubic-bezier') {\n            const c = interpolation.controlPoints;\n            const ub = new UnitBezier(c[0], c[1], c[2], c[3]);\n            t = ub.solve(exponentialInterpolation(input, 1, lower, upper));\n        }\n        return t;\n    }\n\n    static parse(args: $ReadOnlyArray<mixed>, context: ParsingContext): ?Interpolate {\n        let [operator, interpolation, input, ...rest] = args;\n\n        if (!Array.isArray(interpolation) || interpolation.length === 0) {\n            return context.error(`Expected an interpolation type expression.`, 1);\n        }\n\n        if (interpolation[0] === 'linear') {\n            interpolation = {name: 'linear'};\n        } else if (interpolation[0] === 'exponential') {\n            const base = interpolation[1];\n            if (typeof base !== 'number')\n                return context.error(`Exponential interpolation requires a numeric base.`, 1, 1);\n            interpolation = {\n                name: 'exponential',\n                base\n            };\n        } else if (interpolation[0] === 'cubic-bezier') {\n            const controlPoints = interpolation.slice(1);\n            if (\n                controlPoints.length !== 4 ||\n                controlPoints.some(t => typeof t !== 'number' || t < 0 || t > 1)\n            ) {\n                return context.error('Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.', 1);\n            }\n\n            interpolation = {\n                name: 'cubic-bezier',\n                controlPoints: (controlPoints: any)\n            };\n        } else {\n            return context.error(`Unknown interpolation type ${String(interpolation[0])}`, 1, 0);\n        }\n\n        if (args.length - 1 < 4) {\n            return context.error(`Expected at least 4 arguments, but found only ${args.length - 1}.`);\n        }\n\n        if ((args.length - 1) % 2 !== 0) {\n            return context.error(`Expected an even number of arguments.`);\n        }\n\n        input = context.parse(input, 2, NumberType);\n        if (!input) return null;\n\n        const stops: Stops = [];\n\n        let outputType: Type = (null: any);\n        if (operator === 'interpolate-hcl' || operator === 'interpolate-lab') {\n            outputType = ColorType;\n        } else if (context.expectedType && context.expectedType.kind !== 'value') {\n            outputType = context.expectedType;\n        }\n\n        for (let i = 0; i < rest.length; i += 2) {\n            const label = rest[i];\n            const value = rest[i + 1];\n\n            const labelKey = i + 3;\n            const valueKey = i + 4;\n\n            if (typeof label !== 'number') {\n                return context.error('Input/output pairs for \"interpolate\" expressions must be defined using literal numeric values (not computed expressions) for the input values.', labelKey);\n            }\n\n            if (stops.length && stops[stops.length - 1][0] >= label) {\n                return context.error('Input/output pairs for \"interpolate\" expressions must be arranged with input values in strictly ascending order.', labelKey);\n            }\n\n            const parsed = context.parse(value, valueKey, outputType);\n            if (!parsed) return null;\n            outputType = outputType || parsed.type;\n            stops.push([label, parsed]);\n        }\n\n        if (outputType.kind !== 'number' &&\n            outputType.kind !== 'color' &&\n            !(\n                outputType.kind === 'array' &&\n                outputType.itemType.kind === 'number' &&\n                typeof outputType.N === 'number'\n            )\n        ) {\n            return context.error(`Type ${toString(outputType)} is not interpolatable.`);\n        }\n\n        return new Interpolate(outputType, (operator: any), interpolation, input, stops);\n    }\n\n    evaluate(ctx: EvaluationContext): Color {\n        const labels = this.labels;\n        const outputs = this.outputs;\n\n        if (labels.length === 1) {\n            return outputs[0].evaluate(ctx);\n        }\n\n        const value = ((this.input.evaluate(ctx): any): number);\n        if (value <= labels[0]) {\n            return outputs[0].evaluate(ctx);\n        }\n\n        const stopCount = labels.length;\n        if (value >= labels[stopCount - 1]) {\n            return outputs[stopCount - 1].evaluate(ctx);\n        }\n\n        const index = findStopLessThanOrEqualTo(labels, value);\n        const lower = labels[index];\n        const upper = labels[index + 1];\n        const t = Interpolate.interpolationFactor(this.interpolation, value, lower, upper);\n\n        const outputLower = outputs[index].evaluate(ctx);\n        const outputUpper = outputs[index + 1].evaluate(ctx);\n\n        if (this.operator === 'interpolate') {\n            return (interpolate[this.type.kind.toLowerCase()]: any)(outputLower, outputUpper, t); // eslint-disable-line import/namespace\n        } else if (this.operator === 'interpolate-hcl') {\n            return hcl.reverse(hcl.interpolate(hcl.forward(outputLower), hcl.forward(outputUpper), t));\n        } else {\n            return lab.reverse(lab.interpolate(lab.forward(outputLower), lab.forward(outputUpper), t));\n        }\n    }\n\n    eachChild(fn: (_: Expression) => void) {\n        fn(this.input);\n        for (const expression of this.outputs) {\n            fn(expression);\n        }\n    }\n\n    outputDefined(): boolean {\n        return this.outputs.every(out => out.outputDefined());\n    }\n\n    serialize(): SerializedExpression {\n        let interpolation;\n        if (this.interpolation.name === 'linear') {\n            interpolation = [\"linear\"];\n        } else if (this.interpolation.name === 'exponential') {\n            if  (this.interpolation.base === 1) {\n                interpolation = [\"linear\"];\n            } else {\n                interpolation = [\"exponential\", this.interpolation.base];\n            }\n        } else {\n            interpolation = [\"cubic-bezier\" ].concat(this.interpolation.controlPoints);\n        }\n\n        const serialized = [this.operator, interpolation, this.input.serialize()];\n\n        for (let i = 0; i < this.labels.length; i++) {\n            serialized.push(\n                this.labels[i],\n                this.outputs[i].serialize()\n            );\n        }\n        return serialized;\n    }\n}\n\n/**\n * Returns a ratio that can be used to interpolate between exponential function\n * stops.\n * How it works: Two consecutive stop values define a (scaled and shifted) exponential function `f(x) = a * base^x + b`, where `base` is the user-specified base,\n * and `a` and `b` are constants affording sufficient degrees of freedom to fit\n * the function to the given stops.\n *\n * Here's a bit of algebra that lets us compute `f(x)` directly from the stop\n * values without explicitly solving for `a` and `b`:\n *\n * First stop value: `f(x0) = y0 = a * base^x0 + b`\n * Second stop value: `f(x1) = y1 = a * base^x1 + b`\n * => `y1 - y0 = a(base^x1 - base^x0)`\n * => `a = (y1 - y0)/(base^x1 - base^x0)`\n *\n * Desired value: `f(x) = y = a * base^x + b`\n * => `f(x) = y0 + a * (base^x - base^x0)`\n *\n * From the above, we can replace the `a` in `a * (base^x - base^x0)` and do a\n * little algebra:\n * ```\n * a * (base^x - base^x0) = (y1 - y0)/(base^x1 - base^x0) * (base^x - base^x0)\n *                     = (y1 - y0) * (base^x - base^x0) / (base^x1 - base^x0)\n * ```\n *\n * If we let `(base^x - base^x0) / (base^x1 base^x0)`, then we have\n * `f(x) = y0 + (y1 - y0) * ratio`.  In other words, `ratio` may be treated as\n * an interpolation factor between the two stops' output values.\n *\n * (Note: a slightly different form for `ratio`,\n * `(base^(x-x0) - 1) / (base^(x1-x0) - 1) `, is equivalent, but requires fewer\n * expensive `Math.pow()` operations.)\n *\n * @private\n*/\nfunction exponentialInterpolation(input: number, base: number, lowerValue: number, upperValue: number) {\n    const difference = upperValue - lowerValue;\n    const progress = input - lowerValue;\n\n    if (difference === 0) {\n        return 0;\n    } else if (base === 1) {\n        return progress / difference;\n    } else {\n        return (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1);\n    }\n}\n\nexport default Interpolate;\n","// @flow\n\nimport assert from 'assert';\n\nimport {checkSubtype, ValueType} from '../types.js';\nimport ResolvedImage from '../types/resolved_image.js';\n\nimport type {Expression, SerializedExpression} from '../expression.js';\nimport type ParsingContext from '../parsing_context.js';\nimport type EvaluationContext from '../evaluation_context.js';\nimport type {Type} from '../types.js';\n\nclass Coalesce implements Expression {\n    type: Type;\n    args: Array<Expression>;\n\n    constructor(type: Type, args: Array<Expression>) {\n        this.type = type;\n        this.args = args;\n    }\n\n    static parse(args: $ReadOnlyArray<mixed>, context: ParsingContext): ?Coalesce {\n        if (args.length < 2) {\n            return context.error(\"Expectected at least one argument.\");\n        }\n        let outputType: Type = (null: any);\n        const expectedType = context.expectedType;\n        if (expectedType && expectedType.kind !== 'value') {\n            outputType = expectedType;\n        }\n        const parsedArgs = [];\n\n        for (const arg of args.slice(1)) {\n            const parsed = context.parse(arg, 1 + parsedArgs.length, outputType, undefined, {typeAnnotation: 'omit'});\n            if (!parsed) return null;\n            outputType = outputType || parsed.type;\n            parsedArgs.push(parsed);\n        }\n        assert(outputType);\n\n        // Above, we parse arguments without inferred type annotation so that\n        // they don't produce a runtime error for `null` input, which would\n        // preempt the desired null-coalescing behavior.\n        // Thus, if any of our arguments would have needed an annotation, we\n        // need to wrap the enclosing coalesce expression with it instead.\n        const needsAnnotation = expectedType &&\n            parsedArgs.some(arg => checkSubtype(expectedType, arg.type));\n\n        return needsAnnotation ?\n            new Coalesce(ValueType, parsedArgs) :\n            new Coalesce((outputType: any), parsedArgs);\n    }\n\n    evaluate(ctx: EvaluationContext): any | null {\n        let result = null;\n        let argCount = 0;\n        let firstImage;\n        for (const arg of this.args) {\n            argCount++;\n            result = arg.evaluate(ctx);\n            // we need to keep track of the first requested image in a coalesce statement\n            // if coalesce can't find a valid image, we return the first image so styleimagemissing can fire\n            if (result && result instanceof ResolvedImage && !result.available) {\n                // set to first image\n                if (!firstImage) {\n                    firstImage = result;\n                }\n                result = null;\n                // if we reach the end, return the first image\n                if (argCount === this.args.length) {\n                    return firstImage;\n                }\n            }\n\n            if (result !== null) break;\n        }\n        return result;\n    }\n\n    eachChild(fn: (_: Expression) => void) {\n        this.args.forEach(fn);\n    }\n\n    outputDefined(): boolean {\n        return this.args.every(arg => arg.outputDefined());\n    }\n\n    serialize(): SerializedExpression {\n        const serialized = [\"coalesce\"];\n        this.eachChild(child => { serialized.push(child.serialize()); });\n        return serialized;\n    }\n}\n\nexport default Coalesce;\n","// @flow\n\nimport type {Type} from '../types.js';\nimport type {Expression, SerializedExpression} from '../expression.js';\nimport type ParsingContext from '../parsing_context.js';\nimport type EvaluationContext  from '../evaluation_context.js';\n\nclass Let implements Expression {\n    type: Type;\n    bindings: Array<[string, Expression]>;\n    result: Expression;\n\n    constructor(bindings: Array<[string, Expression]>, result: Expression) {\n        this.type = result.type;\n        this.bindings = [].concat(bindings);\n        this.result = result;\n    }\n\n    evaluate(ctx: EvaluationContext): any {\n        return this.result.evaluate(ctx);\n    }\n\n    eachChild(fn: (_: Expression) => void) {\n        for (const binding of this.bindings) {\n            fn(binding[1]);\n        }\n        fn(this.result);\n    }\n\n    static parse(args: $ReadOnlyArray<mixed>, context: ParsingContext): ?Let {\n        if (args.length < 4)\n            return context.error(`Expected at least 3 arguments, but found ${args.length - 1} instead.`);\n\n        const bindings: Array<[string, Expression]> = [];\n        for (let i = 1; i < args.length - 1; i += 2) {\n            const name = args[i];\n\n            if (typeof name !== 'string') {\n                return context.error(`Expected string, but found ${typeof name} instead.`, i);\n            }\n\n            if (/[^a-zA-Z0-9_]/.test(name)) {\n                return context.error(`Variable names must contain only alphanumeric characters or '_'.`, i);\n            }\n\n            const value = context.parse(args[i + 1], i + 1);\n            if (!value) return null;\n\n            bindings.push([name, value]);\n        }\n\n        const result = context.parse(args[args.length - 1], args.length - 1, context.expectedType, bindings);\n        if (!result) return null;\n\n        return new Let(bindings, result);\n    }\n\n    outputDefined(): boolean {\n        return this.result.outputDefined();\n    }\n\n    serialize(): SerializedExpression {\n        const serialized = [\"let\"];\n        for (const [name, expr] of this.bindings) {\n            serialized.push(name, expr.serialize());\n        }\n        serialized.push(this.result.serialize());\n        return serialized;\n    }\n}\n\nexport default Let;\n","// @flow\n\nimport {array, ValueType, NumberType} from '../types.js';\n\nimport RuntimeError from '../runtime_error.js';\n\nimport type {Expression, SerializedExpression} from '../expression.js';\nimport type ParsingContext from '../parsing_context.js';\nimport type EvaluationContext from '../evaluation_context.js';\nimport type {Type, ArrayType} from '../types.js';\nimport type {Value} from '../values.js';\n\nclass At implements Expression {\n    type: Type;\n    index: Expression;\n    input: Expression;\n\n    constructor(type: Type, index: Expression, input: Expression) {\n        this.type = type;\n        this.index = index;\n        this.input = input;\n    }\n\n    static parse(args: $ReadOnlyArray<mixed>, context: ParsingContext): ?At {\n        if (args.length !== 3)\n            return context.error(`Expected 2 arguments, but found ${args.length - 1} instead.`);\n\n        const index = context.parse(args[1], 1, NumberType);\n        const input = context.parse(args[2], 2, array(context.expectedType || ValueType));\n\n        if (!index || !input) return null;\n\n        const t: ArrayType = (input.type: any);\n        return new At(t.itemType, index, input);\n    }\n\n    evaluate(ctx: EvaluationContext): Value {\n        const index = ((this.index.evaluate(ctx): any): number);\n        const array = ((this.input.evaluate(ctx): any): Array<Value>);\n\n        if (index < 0) {\n            throw new RuntimeError(`Array index out of bounds: ${index} < 0.`);\n        }\n\n        if (index >= array.length) {\n            throw new RuntimeError(`Array index out of bounds: ${index} > ${array.length - 1}.`);\n        }\n\n        if (index !== Math.floor(index)) {\n            throw new RuntimeError(`Array index must be an integer, but found ${index} instead.`);\n        }\n\n        return array[index];\n    }\n\n    eachChild(fn: (_: Expression) => void) {\n        fn(this.index);\n        fn(this.input);\n    }\n\n    outputDefined(): boolean {\n        return false;\n    }\n\n    serialize(): SerializedExpression {\n        return [\"at\", this.index.serialize(), this.input.serialize()];\n    }\n}\n\nexport default At;\n","// @flow\n\nimport {BooleanType, StringType, ValueType, NullType, toString, NumberType, isValidType, isValidNativeType} from '../types.js';\nimport RuntimeError from '../runtime_error.js';\nimport {typeOf} from '../values.js';\n\nimport type {Expression, SerializedExpression} from '../expression.js';\nimport type ParsingContext from '../parsing_context.js';\nimport type EvaluationContext from '../evaluation_context.js';\nimport type {Type} from '../types.js';\n\nclass In implements Expression {\n    type: Type;\n    needle: Expression;\n    haystack: Expression;\n\n    constructor(needle: Expression, haystack: Expression) {\n        this.type = BooleanType;\n        this.needle = needle;\n        this.haystack = haystack;\n    }\n\n    static parse(args: $ReadOnlyArray<mixed>, context: ParsingContext): ?In {\n        if (args.length !== 3) {\n            return context.error(`Expected 2 arguments, but found ${args.length - 1} instead.`);\n        }\n\n        const needle = context.parse(args[1], 1, ValueType);\n\n        const haystack = context.parse(args[2], 2, ValueType);\n\n        if (!needle || !haystack) return null;\n\n        if (!isValidType(needle.type, [BooleanType, StringType, NumberType, NullType, ValueType])) {\n            return context.error(`Expected first argument to be of type boolean, string, number or null, but found ${toString(needle.type)} instead`);\n        }\n\n        return new In(needle, haystack);\n    }\n\n    evaluate(ctx: EvaluationContext): boolean {\n        const needle = (this.needle.evaluate(ctx): any);\n        const haystack = (this.haystack.evaluate(ctx): any);\n\n        if (haystack == null) return false;\n\n        if (!isValidNativeType(needle, ['boolean', 'string', 'number', 'null'])) {\n            throw new RuntimeError(`Expected first argument to be of type boolean, string, number or null, but found ${toString(typeOf(needle))} instead.`);\n        }\n\n        if (!isValidNativeType(haystack, ['string', 'array'])) {\n            throw new RuntimeError(`Expected second argument to be of type array or string, but found ${toString(typeOf(haystack))} instead.`);\n        }\n\n        return haystack.indexOf(needle) >= 0;\n    }\n\n    eachChild(fn: (_: Expression) => void) {\n        fn(this.needle);\n        fn(this.haystack);\n    }\n\n    outputDefined(): boolean {\n        return true;\n    }\n\n    serialize(): SerializedExpression {\n        return [\"in\", this.needle.serialize(), this.haystack.serialize()];\n    }\n}\n\nexport default In;\n","// @flow\n\nimport {BooleanType, StringType, ValueType, NullType, toString, NumberType, isValidType, isValidNativeType} from '../types.js';\nimport RuntimeError from '../runtime_error.js';\nimport {typeOf} from '../values.js';\n\nimport type {Expression, SerializedExpression} from '../expression.js';\nimport type ParsingContext from '../parsing_context.js';\nimport type EvaluationContext from '../evaluation_context.js';\nimport type {Type} from '../types.js';\n\nclass IndexOf implements Expression {\n    type: Type;\n    needle: Expression;\n    haystack: Expression;\n    fromIndex: ?Expression;\n\n    constructor(needle: Expression, haystack: Expression, fromIndex?: Expression) {\n        this.type = NumberType;\n        this.needle = needle;\n        this.haystack = haystack;\n        this.fromIndex = fromIndex;\n    }\n\n    static parse(args: $ReadOnlyArray<mixed>, context: ParsingContext): ?IndexOf {\n        if (args.length <= 2 ||  args.length >= 5) {\n            return context.error(`Expected 3 or 4 arguments, but found ${args.length - 1} instead.`);\n        }\n\n        const needle = context.parse(args[1], 1, ValueType);\n\n        const haystack = context.parse(args[2], 2, ValueType);\n\n        if (!needle || !haystack) return null;\n        if (!isValidType(needle.type, [BooleanType, StringType, NumberType, NullType, ValueType])) {\n            return context.error(`Expected first argument to be of type boolean, string, number or null, but found ${toString(needle.type)} instead`);\n        }\n\n        if (args.length === 4) {\n            const fromIndex = context.parse(args[3], 3, NumberType);\n            if (!fromIndex) return null;\n            return new IndexOf(needle, haystack, fromIndex);\n        } else {\n            return new IndexOf(needle, haystack);\n        }\n    }\n\n    evaluate(ctx: EvaluationContext): any {\n        const needle = (this.needle.evaluate(ctx): any);\n        const haystack = (this.haystack.evaluate(ctx): any);\n\n        if (!isValidNativeType(needle, ['boolean', 'string', 'number', 'null'])) {\n            throw new RuntimeError(`Expected first argument to be of type boolean, string, number or null, but found ${toString(typeOf(needle))} instead.`);\n        }\n\n        if (!isValidNativeType(haystack, ['string', 'array'])) {\n            throw new RuntimeError(`Expected second argument to be of type array or string, but found ${toString(typeOf(haystack))} instead.`);\n        }\n\n        if (this.fromIndex) {\n            const fromIndex = (this.fromIndex.evaluate(ctx): number);\n            return haystack.indexOf(needle, fromIndex);\n        }\n\n        return haystack.indexOf(needle);\n    }\n\n    eachChild(fn: (_: Expression) => void) {\n        fn(this.needle);\n        fn(this.haystack);\n        if (this.fromIndex) {\n            fn(this.fromIndex);\n        }\n    }\n\n    outputDefined(): boolean {\n        return false;\n    }\n\n    serialize(): SerializedExpression {\n        if (this.fromIndex != null && this.fromIndex !== undefined) {\n            const fromIndex = this.fromIndex.serialize();\n            return [\"index-of\", this.needle.serialize(), this.haystack.serialize(), fromIndex];\n        }\n        return [\"index-of\", this.needle.serialize(), this.haystack.serialize()];\n    }\n}\n\nexport default IndexOf;\n","// @flow\n\nimport assert from 'assert';\n\nimport {typeOf} from '../values.js';\nimport {ValueType, type Type} from '../types.js';\n\nimport type {Expression, SerializedExpression} from '../expression.js';\nimport type ParsingContext from '../parsing_context.js';\nimport type EvaluationContext from '../evaluation_context.js';\n\n// Map input label values to output expression index\ntype Cases = {[number | string]: number};\n\nclass Match implements Expression {\n    type: Type;\n    inputType: Type;\n\n    input: Expression;\n    cases: Cases;\n    outputs: Array<Expression>;\n    otherwise: Expression;\n\n    constructor(inputType: Type, outputType: Type, input: Expression, cases: Cases, outputs: Array<Expression>, otherwise: Expression) {\n        this.inputType = inputType;\n        this.type = outputType;\n        this.input = input;\n        this.cases = cases;\n        this.outputs = outputs;\n        this.otherwise = otherwise;\n    }\n\n    static parse(args: $ReadOnlyArray<mixed>, context: ParsingContext): ?Match {\n        if (args.length < 5)\n            return context.error(`Expected at least 4 arguments, but found only ${args.length - 1}.`);\n        if (args.length % 2 !== 1)\n            return context.error(`Expected an even number of arguments.`);\n\n        let inputType;\n        let outputType: ?Type;\n        if (context.expectedType && context.expectedType.kind !== 'value') {\n            outputType = context.expectedType;\n        }\n        const cases = {};\n        const outputs = [];\n        for (let i = 2; i < args.length - 1; i += 2) {\n            let labels = args[i];\n            const value = args[i + 1];\n\n            if (!Array.isArray(labels)) {\n                labels = [labels];\n            }\n\n            const labelContext = context.concat(i);\n            if (labels.length === 0) {\n                return labelContext.error('Expected at least one branch label.');\n            }\n\n            for (const label of labels) {\n                if (typeof label !== 'number' && typeof label !== 'string') {\n                    return labelContext.error(`Branch labels must be numbers or strings.`);\n                } else if (typeof label === 'number' && Math.abs(label) > Number.MAX_SAFE_INTEGER) {\n                    return labelContext.error(`Branch labels must be integers no larger than ${Number.MAX_SAFE_INTEGER}.`);\n\n                } else if (typeof label === 'number' && Math.floor(label) !== label) {\n                    return labelContext.error(`Numeric branch labels must be integer values.`);\n\n                } else if (!inputType) {\n                    inputType = typeOf(label);\n                } else if (labelContext.checkSubtype(inputType, typeOf(label))) {\n                    return null;\n                }\n\n                if (typeof cases[String(label)] !== 'undefined') {\n                    return labelContext.error('Branch labels must be unique.');\n                }\n\n                cases[String(label)] = outputs.length;\n            }\n\n            const result = context.parse(value, i, outputType);\n            if (!result) return null;\n            outputType = outputType || result.type;\n            outputs.push(result);\n        }\n\n        const input = context.parse(args[1], 1, ValueType);\n        if (!input) return null;\n\n        const otherwise = context.parse(args[args.length - 1], args.length - 1, outputType);\n        if (!otherwise) return null;\n\n        assert(inputType && outputType);\n\n        if (input.type.kind !== 'value' && context.concat(1).checkSubtype((inputType: any), input.type)) {\n            return null;\n        }\n\n        return new Match((inputType: any), (outputType: any), input, cases, outputs, otherwise);\n    }\n\n    evaluate(ctx: EvaluationContext): any {\n        const input = (this.input.evaluate(ctx): any);\n        const output = (typeOf(input) === this.inputType && this.outputs[this.cases[input]]) || this.otherwise;\n        return output.evaluate(ctx);\n    }\n\n    eachChild(fn: (_: Expression) => void) {\n        fn(this.input);\n        this.outputs.forEach(fn);\n        fn(this.otherwise);\n    }\n\n    outputDefined(): boolean {\n        return this.outputs.every(out => out.outputDefined()) && this.otherwise.outputDefined();\n    }\n\n    serialize(): SerializedExpression {\n        const serialized = [\"match\", this.input.serialize()];\n\n        // Sort so serialization has an arbitrary defined order, even though\n        // branch order doesn't affect evaluation\n        const sortedLabels = Object.keys(this.cases).sort();\n\n        // Group branches by unique match expression to support condensed\n        // serializations of the form [case1, case2, ...] -> matchExpression\n        const groupedByOutput: Array<[number, Array<number | string>]> = [];\n        const outputLookup: {[index: number]: number} = {}; // lookup index into groupedByOutput for a given output expression\n        for (const label of sortedLabels) {\n            const outputIndex = outputLookup[this.cases[label]];\n            if (outputIndex === undefined) {\n                // First time seeing this output, add it to the end of the grouped list\n                outputLookup[this.cases[label]] = groupedByOutput.length;\n                groupedByOutput.push([this.cases[label], [label]]);\n            } else {\n                // We've seen this expression before, add the label to that output's group\n                groupedByOutput[outputIndex][1].push(label);\n            }\n        }\n\n        const coerceLabel = (label: number | string) => this.inputType.kind === 'number' ? Number(label) : label;\n\n        for (const [outputIndex, labels] of groupedByOutput) {\n            if (labels.length === 1) {\n                // Only a single label matches this output expression\n                serialized.push(coerceLabel(labels[0]));\n            } else {\n                // Array of literal labels pointing to this output expression\n                serialized.push(labels.map(coerceLabel));\n            }\n            serialized.push(this.outputs[outputIndex].serialize());\n        }\n        serialized.push(this.otherwise.serialize());\n        return serialized;\n    }\n}\n\nexport default Match;\n","// @flow\n\nimport assert from 'assert';\n\nimport {BooleanType} from '../types.js';\n\nimport type {Expression, SerializedExpression} from '../expression.js';\nimport type ParsingContext from '../parsing_context.js';\nimport type EvaluationContext from '../evaluation_context.js';\nimport type {Type} from '../types.js';\n\ntype Branches = Array<[Expression, Expression]>;\n\nclass Case implements Expression {\n    type: Type;\n\n    branches: Branches;\n    otherwise: Expression;\n\n    constructor(type: Type, branches: Branches, otherwise: Expression) {\n        this.type = type;\n        this.branches = branches;\n        this.otherwise = otherwise;\n    }\n\n    static parse(args: $ReadOnlyArray<mixed>, context: ParsingContext): ?Case {\n        if (args.length < 4)\n            return context.error(`Expected at least 3 arguments, but found only ${args.length - 1}.`);\n        if (args.length % 2 !== 0)\n            return context.error(`Expected an odd number of arguments.`);\n\n        let outputType: ?Type;\n        if (context.expectedType && context.expectedType.kind !== 'value') {\n            outputType = context.expectedType;\n        }\n\n        const branches = [];\n        for (let i = 1; i < args.length - 1; i += 2) {\n            const test = context.parse(args[i], i, BooleanType);\n            if (!test) return null;\n\n            const result = context.parse(args[i + 1], i + 1, outputType);\n            if (!result) return null;\n\n            branches.push([test, result]);\n\n            outputType = outputType || result.type;\n        }\n\n        const otherwise = context.parse(args[args.length - 1], args.length - 1, outputType);\n        if (!otherwise) return null;\n\n        assert(outputType);\n        return new Case((outputType: any), branches, otherwise);\n    }\n\n    evaluate(ctx: EvaluationContext): any {\n        for (const [test, expression] of this.branches) {\n            if (test.evaluate(ctx)) {\n                return expression.evaluate(ctx);\n            }\n        }\n        return this.otherwise.evaluate(ctx);\n    }\n\n    eachChild(fn: (_: Expression) => void) {\n        for (const [test, expression] of this.branches) {\n            fn(test);\n            fn(expression);\n        }\n        fn(this.otherwise);\n    }\n\n    outputDefined(): boolean {\n        return this.branches.every(([_, out]) => out.outputDefined()) && this.otherwise.outputDefined();\n    }\n\n    serialize(): SerializedExpression {\n        const serialized = [\"case\"];\n        this.eachChild(child => { serialized.push(child.serialize()); });\n        return serialized;\n    }\n}\n\nexport default Case;\n","// @flow\n\nimport {ValueType, NumberType, StringType, array, toString, isValidType, isValidNativeType} from '../types.js';\nimport RuntimeError from '../runtime_error.js';\nimport {typeOf} from '../values.js';\n\nimport type {Expression, SerializedExpression} from '../expression.js';\nimport type ParsingContext from '../parsing_context.js';\nimport type EvaluationContext from '../evaluation_context.js';\nimport type {Type} from '../types.js';\n\nclass Slice implements Expression {\n    type: Type;\n    input: Expression;\n    beginIndex: Expression;\n    endIndex: ?Expression;\n\n    constructor(type: Type, input: Expression, beginIndex: Expression, endIndex?: Expression) {\n        this.type = type;\n        this.input = input;\n        this.beginIndex = beginIndex;\n        this.endIndex = endIndex;\n\n    }\n\n    static parse(args: $ReadOnlyArray<mixed>, context: ParsingContext): ?Slice {\n        if (args.length <= 2 ||  args.length >= 5) {\n            return context.error(`Expected 3 or 4 arguments, but found ${args.length - 1} instead.`);\n        }\n\n        const input = context.parse(args[1], 1, ValueType);\n        const beginIndex = context.parse(args[2], 2, NumberType);\n\n        if (!input || !beginIndex) return null;\n\n        if (!isValidType(input.type, [array(ValueType), StringType, ValueType])) {\n            return context.error(`Expected first argument to be of type array or string, but found ${toString(input.type)} instead`);\n        }\n\n        if (args.length === 4) {\n            const endIndex = context.parse(args[3], 3, NumberType);\n            if (!endIndex) return null;\n            return new Slice(input.type, input, beginIndex, endIndex);\n        } else {\n            return new Slice(input.type, input, beginIndex);\n        }\n    }\n\n    evaluate(ctx: EvaluationContext): any {\n        const input = (this.input.evaluate(ctx): any);\n        const beginIndex = (this.beginIndex.evaluate(ctx): number);\n\n        if (!isValidNativeType(input, ['string', 'array'])) {\n            throw new RuntimeError(`Expected first argument to be of type array or string, but found ${toString(typeOf(input))} instead.`);\n        }\n\n        if (this.endIndex) {\n            const endIndex = (this.endIndex.evaluate(ctx): number);\n            return input.slice(beginIndex, endIndex);\n        }\n\n        return input.slice(beginIndex);\n    }\n\n    eachChild(fn: (_: Expression) => void) {\n        fn(this.input);\n        fn(this.beginIndex);\n        if (this.endIndex) {\n            fn(this.endIndex);\n        }\n    }\n\n    outputDefined(): boolean {\n        return false;\n    }\n\n    serialize(): SerializedExpression {\n        if (this.endIndex != null && this.endIndex !== undefined) {\n            const endIndex = this.endIndex.serialize();\n            return [\"slice\", this.input.serialize(), this.beginIndex.serialize(), endIndex];\n        }\n        return [\"slice\", this.input.serialize(), this.beginIndex.serialize()];\n    }\n}\n\nexport default Slice;\n","// @flow\n\nimport {toString, ValueType, BooleanType, CollatorType} from '../types.js';\nimport Assertion from './assertion.js';\nimport {typeOf} from '../values.js';\nimport RuntimeError from '../runtime_error.js';\n\nimport type {Expression, SerializedExpression, ExpressionRegistration} from '../expression.js';\nimport type EvaluationContext from '../evaluation_context.js';\nimport type ParsingContext from '../parsing_context.js';\nimport type {Type} from '../types.js';\n\ntype ComparisonOperator = '==' | '!=' | '<' | '>' | '<=' | '>=' ;\n\nfunction isComparableType(op: ComparisonOperator, type: Type) {\n    if (op === '==' || op === '!=') {\n        // equality operator\n        return type.kind === 'boolean' ||\n            type.kind === 'string' ||\n            type.kind === 'number' ||\n            type.kind === 'null' ||\n            type.kind === 'value';\n    } else {\n        // ordering operator\n        return type.kind === 'string' ||\n            type.kind === 'number' ||\n            type.kind === 'value';\n    }\n}\n\nfunction eq(ctx: EvaluationContext, a: any, b: any): boolean { return a === b; }\nfunction neq(ctx: EvaluationContext, a: any, b: any): boolean { return a !== b; }\nfunction lt(ctx: EvaluationContext, a: any, b: any): boolean { return a < b; }\nfunction gt(ctx: EvaluationContext, a: any, b: any): boolean { return a > b; }\nfunction lteq(ctx: EvaluationContext, a: any, b: any): boolean { return a <= b; }\nfunction gteq(ctx: EvaluationContext, a: any, b: any): boolean { return a >= b; }\n\nfunction eqCollate(ctx: EvaluationContext, a: any, b: any, c: any): boolean { return c.compare(a, b) === 0; }\nfunction neqCollate(ctx: EvaluationContext, a: any, b: any, c: any): boolean { return !eqCollate(ctx, a, b, c); }\nfunction ltCollate(ctx: EvaluationContext, a: any, b: any, c: any): boolean { return c.compare(a, b) < 0; }\nfunction gtCollate(ctx: EvaluationContext, a: any, b: any, c: any): boolean { return c.compare(a, b) > 0; }\nfunction lteqCollate(ctx: EvaluationContext, a: any, b: any, c: any): boolean { return c.compare(a, b) <= 0; }\nfunction gteqCollate(ctx: EvaluationContext, a: any, b: any, c: any): boolean { return c.compare(a, b) >= 0; }\n\n/**\n * Special form for comparison operators, implementing the signatures:\n * - (T, T, ?Collator) => boolean\n * - (T, value, ?Collator) => boolean\n * - (value, T, ?Collator) => boolean\n *\n * For inequalities, T must be either value, string, or number. For ==/!=, it\n * can also be boolean or null.\n *\n * Equality semantics are equivalent to Javascript's strict equality (===/!==)\n * -- i.e., when the arguments' types don't match, == evaluates to false, != to\n * true.\n *\n * When types don't match in an ordering comparison, a runtime error is thrown.\n *\n * @private\n */\nfunction makeComparison(op: ComparisonOperator, compareBasic: (EvaluationContext, any, any) => boolean, compareWithCollator: (EvaluationContext, any, any, any) => boolean): ExpressionRegistration {\n    const isOrderComparison = op !== '==' && op !== '!=';\n\n    // $FlowFixMe[method-unbinding]\n    return class Comparison implements Expression {\n        type: Type;\n        lhs: Expression;\n        rhs: Expression;\n        collator: ?Expression;\n        hasUntypedArgument: boolean;\n\n        constructor(lhs: Expression, rhs: Expression, collator: ?Expression) {\n            this.type = BooleanType;\n            this.lhs = lhs;\n            this.rhs = rhs;\n            this.collator = collator;\n            this.hasUntypedArgument = lhs.type.kind === 'value' || rhs.type.kind === 'value';\n        }\n\n        // $FlowFixMe[method-unbinding]\n        static parse(args: $ReadOnlyArray<mixed>, context: ParsingContext): ?Expression {\n            if (args.length !== 3 && args.length !== 4)\n                return context.error(`Expected two or three arguments.`);\n\n            const op: ComparisonOperator = (args[0]: any);\n\n            let lhs = context.parse(args[1], 1, ValueType);\n            if (!lhs) return null;\n            if (!isComparableType(op, lhs.type)) {\n                return context.concat(1).error(`\"${op}\" comparisons are not supported for type '${toString(lhs.type)}'.`);\n            }\n            let rhs = context.parse(args[2], 2, ValueType);\n            if (!rhs) return null;\n            if (!isComparableType(op, rhs.type)) {\n                return context.concat(2).error(`\"${op}\" comparisons are not supported for type '${toString(rhs.type)}'.`);\n            }\n\n            if (\n                lhs.type.kind !== rhs.type.kind &&\n                lhs.type.kind !== 'value' &&\n                rhs.type.kind !== 'value'\n            ) {\n                return context.error(`Cannot compare types '${toString(lhs.type)}' and '${toString(rhs.type)}'.`);\n            }\n\n            if (isOrderComparison) {\n                // typing rules specific to less/greater than operators\n                if (lhs.type.kind === 'value' && rhs.type.kind !== 'value') {\n                    // (value, T)\n                    lhs = new Assertion(rhs.type, [lhs]);\n                } else if (lhs.type.kind !== 'value' && rhs.type.kind === 'value') {\n                    // (T, value)\n                    rhs = new Assertion(lhs.type, [rhs]);\n                }\n            }\n\n            let collator = null;\n            if (args.length === 4) {\n                if (\n                    lhs.type.kind !== 'string' &&\n                    rhs.type.kind !== 'string' &&\n                    lhs.type.kind !== 'value' &&\n                    rhs.type.kind !== 'value'\n                ) {\n                    return context.error(`Cannot use collator to compare non-string types.`);\n                }\n                collator = context.parse(args[3], 3, CollatorType);\n                if (!collator) return null;\n            }\n\n            return new Comparison(lhs, rhs, collator);\n        }\n\n        evaluate(ctx: EvaluationContext): boolean {\n            const lhs = this.lhs.evaluate(ctx);\n            const rhs = this.rhs.evaluate(ctx);\n\n            if (isOrderComparison && this.hasUntypedArgument) {\n                const lt = typeOf(lhs);\n                const rt = typeOf(rhs);\n                // check that type is string or number, and equal\n                if (lt.kind !== rt.kind || !(lt.kind === 'string' || lt.kind === 'number')) {\n                    throw new RuntimeError(`Expected arguments for \"${op}\" to be (string, string) or (number, number), but found (${lt.kind}, ${rt.kind}) instead.`);\n                }\n            }\n\n            if (this.collator && !isOrderComparison && this.hasUntypedArgument) {\n                const lt = typeOf(lhs);\n                const rt = typeOf(rhs);\n                if (lt.kind !== 'string' || rt.kind !== 'string') {\n                    return compareBasic(ctx, lhs, rhs);\n                }\n            }\n\n            return this.collator ?\n                compareWithCollator(ctx, lhs, rhs, this.collator.evaluate(ctx)) :\n                compareBasic(ctx, lhs, rhs);\n        }\n\n        eachChild(fn: (_: Expression) => void) {\n            fn(this.lhs);\n            fn(this.rhs);\n            if (this.collator) {\n                fn(this.collator);\n            }\n        }\n\n        outputDefined(): boolean {\n            return true;\n        }\n\n        serialize(): SerializedExpression {\n            const serialized = [op];\n            this.eachChild(child => { serialized.push(child.serialize()); });\n            return serialized;\n        }\n    };\n}\n\nexport const Equals: $Call<typeof makeComparison, '==', typeof eq, typeof eqCollate> = makeComparison('==', eq, eqCollate);\nexport const NotEquals: $Call<typeof makeComparison, '!=', typeof neq, typeof neqCollate> = makeComparison('!=', neq, neqCollate);\nexport const LessThan: $Call<typeof makeComparison, '<', typeof lt, typeof ltCollate> = makeComparison('<', lt, ltCollate);\nexport const GreaterThan: $Call<typeof makeComparison, '>', typeof gt, typeof gtCollate> = makeComparison('>', gt, gtCollate);\nexport const LessThanOrEqual: $Call<typeof makeComparison, '<=', typeof lteq, typeof lteqCollate> = makeComparison('<=', lteq, lteqCollate);\nexport const GreaterThanOrEqual: $Call<typeof makeComparison, '>=', typeof gteq, typeof gteqCollate> = makeComparison('>=', gteq, gteqCollate);\n","// @flow\n\nimport {StringType, NumberType} from '../types.js';\n\nimport type {Expression, SerializedExpression} from '../expression.js';\nimport type EvaluationContext from '../evaluation_context.js';\nimport type ParsingContext from '../parsing_context.js';\nimport type {Type} from '../types.js';\n\nexport default class NumberFormat implements Expression {\n    type: Type;\n    number: Expression;\n    locale: Expression | null;   // BCP 47 language tag\n    currency: Expression | null; // ISO 4217 currency code, required if style=currency\n    unit: Expression | null;     // Simple units sanctioned for use in ECMAScript, required if style=unit. https://tc39.es/proposal-unified-intl-numberformat/section6/locales-currencies-tz_proposed_out.html#sec-issanctionedsimpleunitidentifier\n    minFractionDigits: Expression | null; // Default 0\n    maxFractionDigits: Expression | null; // Default 3\n\n    constructor(number: Expression,\n                locale: Expression | null,\n                currency: Expression | null,\n                unit: Expression | null,\n                minFractionDigits: Expression | null,\n                maxFractionDigits: Expression | null) {\n        this.type = StringType;\n        this.number = number;\n        this.locale = locale;\n        this.currency = currency;\n        this.unit = unit;\n        this.minFractionDigits = minFractionDigits;\n        this.maxFractionDigits = maxFractionDigits;\n    }\n\n    static parse(args: $ReadOnlyArray<mixed>, context: ParsingContext): ?Expression {\n        if (args.length !== 3)\n            return context.error(`Expected two arguments.`);\n\n        const number = context.parse(args[1], 1, NumberType);\n        if (!number) return null;\n\n        const options = (args[2]: any);\n        if (typeof options !== \"object\" || Array.isArray(options))\n            return context.error(`NumberFormat options argument must be an object.`);\n\n        let locale = null;\n        if (options['locale']) {\n            locale = context.parse(options['locale'], 1, StringType);\n            if (!locale) return null;\n        }\n\n        let currency = null;\n        if (options['currency']) {\n            currency = context.parse(options['currency'], 1, StringType);\n            if (!currency) return null;\n        }\n\n        let unit = null;\n        if (options['unit']) {\n            unit = context.parse(options['unit'], 1, StringType);\n            if (!unit) return null;\n        }\n\n        let minFractionDigits = null;\n        if (options['min-fraction-digits']) {\n            minFractionDigits = context.parse(options['min-fraction-digits'], 1, NumberType);\n            if (!minFractionDigits) return null;\n        }\n\n        let maxFractionDigits = null;\n        if (options['max-fraction-digits']) {\n            maxFractionDigits = context.parse(options['max-fraction-digits'], 1, NumberType);\n            if (!maxFractionDigits) return null;\n        }\n\n        return new NumberFormat(number, locale, currency, unit, minFractionDigits, maxFractionDigits);\n    }\n\n    evaluate(ctx: EvaluationContext): string {\n        return new Intl.NumberFormat(this.locale ? this.locale.evaluate(ctx) : [],\n            {\n                style:\n                    (this.currency && \"currency\") ||\n                    (this.unit && \"unit\") ||\n                    \"decimal\",\n                currency: this.currency ? this.currency.evaluate(ctx) : undefined,\n                unit: this.unit ? this.unit.evaluate(ctx) : undefined,\n                minimumFractionDigits: this.minFractionDigits ? this.minFractionDigits.evaluate(ctx) : undefined,\n                maximumFractionDigits: this.maxFractionDigits ? this.maxFractionDigits.evaluate(ctx) : undefined,\n            }).format(this.number.evaluate(ctx));\n    }\n\n    eachChild(fn: (_: Expression) => void) {\n        fn(this.number);\n        if (this.locale) {\n            fn(this.locale);\n        }\n        if (this.currency) {\n            fn(this.currency);\n        }\n        if (this.unit) {\n            fn(this.unit);\n        }\n        if (this.minFractionDigits) {\n            fn(this.minFractionDigits);\n        }\n        if (this.maxFractionDigits) {\n            fn(this.maxFractionDigits);\n        }\n    }\n\n    outputDefined(): boolean {\n        return false;\n    }\n\n    serialize(): SerializedExpression {\n        const options = {};\n        if (this.locale) {\n            options['locale'] = this.locale.serialize();\n        }\n        if (this.currency) {\n            options['currency'] = this.currency.serialize();\n        }\n        if (this.unit) {\n            options['unit'] = this.unit.serialize();\n        }\n        if (this.minFractionDigits) {\n            options['min-fraction-digits'] = this.minFractionDigits.serialize();\n        }\n        if (this.maxFractionDigits) {\n            options['max-fraction-digits'] = this.maxFractionDigits.serialize();\n        }\n        return [\"number-format\", this.number.serialize(), options];\n    }\n}\n","// @flow\n\nimport {NumberType, toString} from '../types.js';\n\nimport {typeOf} from '../values.js';\nimport RuntimeError from '../runtime_error.js';\n\nimport type {Expression, SerializedExpression} from '../expression.js';\nimport type ParsingContext from '../parsing_context.js';\nimport type EvaluationContext from '../evaluation_context.js';\nimport type {Type} from '../types.js';\n\nclass Length implements Expression {\n    type: Type;\n    input: Expression;\n\n    constructor(input: Expression) {\n        this.type = NumberType;\n        this.input = input;\n    }\n\n    static parse(args: $ReadOnlyArray<mixed>, context: ParsingContext): ?Length {\n        if (args.length !== 2)\n            return context.error(`Expected 1 argument, but found ${args.length - 1} instead.`);\n\n        const input = context.parse(args[1], 1);\n        if (!input) return null;\n\n        if (input.type.kind !== 'array' && input.type.kind !== 'string' && input.type.kind !== 'value')\n            return context.error(`Expected argument of type string or array, but found ${toString(input.type)} instead.`);\n\n        return new Length(input);\n    }\n\n    evaluate(ctx: EvaluationContext): any | number {\n        const input = this.input.evaluate(ctx);\n        if (typeof input === 'string') {\n            return input.length;\n        } else if (Array.isArray(input)) {\n            return input.length;\n        } else {\n            throw new RuntimeError(`Expected value to be of type string or array, but found ${toString(typeOf(input))} instead.`);\n        }\n    }\n\n    eachChild(fn: (_: Expression) => void) {\n        fn(this.input);\n    }\n\n    outputDefined(): boolean {\n        return false;\n    }\n\n    serialize(): SerializedExpression {\n        const serialized = [\"length\"];\n        this.eachChild(child => { serialized.push(child.serialize()); });\n        return serialized;\n    }\n}\n\nexport default Length;\n","// @flow\n\n// Seeded pseudo random generator function\nexport function mulberry32(a: number): () => number {\n    return function () {\n        a |= 0;\n        a = (a + 0x6d2b79f5) | 0;\n        let t = Math.imul(a ^ (a >>> 15), 1 | a);\n        t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n        return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n    };\n}\n","// @flow\n\nimport {\n    type Type,\n    NumberType,\n    StringType,\n    BooleanType,\n    ColorType,\n    ObjectType,\n    ValueType,\n    ErrorType,\n    CollatorType,\n    array,\n    toString as typeToString\n} from '../types.js';\n\nimport {typeOf, Color, validateRGBA, validateHSLA, toString as valueToString} from '../values.js';\nimport CompoundExpression from '../compound_expression.js';\nimport RuntimeError from '../runtime_error.js';\nimport Let from './let.js';\nimport Var from './var.js';\nimport Literal from './literal.js';\nimport Assertion from './assertion.js';\nimport Coercion from './coercion.js';\nimport At from './at.js';\nimport In from './in.js';\nimport IndexOf from './index_of.js';\nimport Match from './match.js';\nimport Case from './case.js';\nimport Slice from './slice.js';\nimport Step from './step.js';\nimport Interpolate from './interpolate.js';\nimport Coalesce from './coalesce.js';\nimport {\n    Equals,\n    NotEquals,\n    LessThan,\n    GreaterThan,\n    LessThanOrEqual,\n    GreaterThanOrEqual\n} from './comparison.js';\nimport CollatorExpression from './collator.js';\nimport NumberFormat from './number_format.js';\nimport FormatExpression from './format.js';\nimport ImageExpression from './image.js';\nimport Length from './length.js';\nimport Within from './within.js';\nimport Config from './config.js';\nimport Distance from './distance.js';\nimport {mulberry32} from '../../util/random.js';\n\nimport type EvaluationContext from '../evaluation_context.js';\nimport type {Varargs} from '../compound_expression.js';\nimport type {Expression, ExpressionRegistry} from '../expression.js';\n\nconst expressions: ExpressionRegistry = {\n    // special forms\n    '==': Equals,\n    '!=': NotEquals,\n    '>': GreaterThan,\n    '<': LessThan,\n    '>=': GreaterThanOrEqual,\n    '<=': LessThanOrEqual,\n    // $FlowFixMe[method-unbinding]\n    'array': Assertion,\n    // $FlowFixMe[method-unbinding]\n    'at': At,\n    'boolean': Assertion,\n    // $FlowFixMe[method-unbinding]\n    'case': Case,\n    // $FlowFixMe[method-unbinding]\n    'coalesce': Coalesce,\n    // $FlowFixMe[method-unbinding]\n    'collator': CollatorExpression,\n    // $FlowFixMe[method-unbinding]\n    'format': FormatExpression,\n    // $FlowFixMe[method-unbinding]\n    'image': ImageExpression,\n    // $FlowFixMe[method-unbinding]\n    'in': In,\n    // $FlowFixMe[method-unbinding]\n    'index-of': IndexOf,\n    // $FlowFixMe[method-unbinding]\n    'interpolate': Interpolate,\n    'interpolate-hcl': Interpolate,\n    'interpolate-lab': Interpolate,\n    // $FlowFixMe[method-unbinding]\n    'length': Length,\n    // $FlowFixMe[method-unbinding]\n    'let': Let,\n    // $FlowFixMe[method-unbinding]\n    'literal': Literal,\n    // $FlowFixMe[method-unbinding]\n    'match': Match,\n    'number': Assertion,\n    // $FlowFixMe[method-unbinding]\n    'number-format': NumberFormat,\n    'object': Assertion,\n    // $FlowFixMe[method-unbinding]\n    'slice': Slice,\n    // $FlowFixMe[method-unbinding]\n    'step': Step,\n    'string': Assertion,\n    // $FlowFixMe[method-unbinding]\n    'to-boolean': Coercion,\n    'to-color': Coercion,\n    'to-number': Coercion,\n    'to-string': Coercion,\n    // $FlowFixMe[method-unbinding]\n    'var': Var,\n    // $FlowFixMe[method-unbinding]\n    'within': Within,\n    // $FlowFixMe[method-unbinding]\n    'distance': Distance,\n    // $FlowFixMe[method-unbinding]\n    'config': Config\n};\n\nfunction rgba(ctx: EvaluationContext, [r, g, b, a]: Array<Expression>) {\n    r = r.evaluate(ctx);\n    g = g.evaluate(ctx);\n    b = b.evaluate(ctx);\n    const alpha = a ? a.evaluate(ctx) : 1;\n    const error = validateRGBA(r, g, b, alpha);\n    if (error) throw new RuntimeError(error);\n    return new Color(r / 255 * alpha, g / 255 * alpha, b / 255 * alpha, alpha);\n}\n\nfunction hsla(ctx: EvaluationContext, [h, s, l, a]: Array<Expression>) {\n    h = h.evaluate(ctx);\n    s = s.evaluate(ctx);\n    l = l.evaluate(ctx);\n    const alpha = a ? a.evaluate(ctx) : 1;\n    const error = validateHSLA(h, s, l, alpha);\n    if (error) throw new RuntimeError(error);\n    const colorFunction = `hsla(${h}, ${s}%, ${l}%, ${alpha})`;\n    const color = Color.parse(colorFunction);\n    if (!color) throw new RuntimeError(`Failed to parse HSLA color: ${colorFunction}`);\n    return color;\n}\n\nfunction has(key: string, obj: {[string]: any}): boolean {\n    return key in obj;\n}\n\nfunction get(key: string, obj: {[string]: any}) {\n    const v = obj[key];\n    return typeof v === 'undefined' ? null : v;\n}\n\nfunction binarySearch(v: any, a: {[number]: any}, i: number, j: number) {\n    while (i <= j) {\n        const m = (i + j) >> 1;\n        if (a[m] === v)\n            return true;\n        if (a[m] > v)\n            j = m - 1;\n        else\n            i = m + 1;\n    }\n    return false;\n}\n\nfunction varargs(type: Type): Varargs {\n    return {type};\n}\n\nfunction hashString(str: string) {\n    let hash = 0;\n    if (str.length === 0) {\n        return hash;\n    }\n    for (let i = 0; i < str.length; i++) {\n        const char = str.charCodeAt(i);\n        hash = ((hash << 5) - hash) + char;\n        hash = hash & hash;\n    }\n    return hash;\n}\n\nCompoundExpression.register(expressions, {\n    'error': [\n        ErrorType,\n        [StringType],\n        (ctx, [v]) => { throw new RuntimeError(v.evaluate(ctx)); }\n    ],\n    'typeof': [\n        StringType,\n        [ValueType],\n        (ctx, [v]) => typeToString(typeOf(v.evaluate(ctx)))\n    ],\n    'to-rgba': [\n        array(NumberType, 4),\n        [ColorType],\n        (ctx, [v]) => {\n            return v.evaluate(ctx).toArray();\n        }\n    ],\n    'rgb': [\n        ColorType,\n        [NumberType, NumberType, NumberType],\n        rgba\n    ],\n    'rgba': [\n        ColorType,\n        [NumberType, NumberType, NumberType, NumberType],\n        rgba\n    ],\n    'hsl': [\n        ColorType,\n        [NumberType, NumberType, NumberType],\n        hsla\n    ],\n    'hsla': [\n        ColorType,\n        [NumberType, NumberType, NumberType, NumberType],\n        hsla\n    ],\n    'has': {\n        type: BooleanType,\n        overloads: [\n            [\n                [StringType],\n                (ctx, [key]) => has(key.evaluate(ctx), ctx.properties())\n            ], [\n                [StringType, ObjectType],\n                (ctx, [key, obj]) => has(key.evaluate(ctx), obj.evaluate(ctx))\n            ]\n        ]\n    },\n    'get': {\n        type: ValueType,\n        overloads: [\n            [\n                [StringType],\n                (ctx, [key]) => get(key.evaluate(ctx), ctx.properties())\n            ], [\n                [StringType, ObjectType],\n                (ctx, [key, obj]) => get(key.evaluate(ctx), obj.evaluate(ctx))\n            ]\n        ]\n    },\n    'feature-state': [\n        ValueType,\n        [StringType],\n        (ctx, [key]) => get(key.evaluate(ctx), ctx.featureState || {})\n    ],\n    'properties': [\n        ObjectType,\n        [],\n        (ctx) => ctx.properties()\n    ],\n    'geometry-type': [\n        StringType,\n        [],\n        (ctx) => ctx.geometryType()\n    ],\n    'id': [\n        ValueType,\n        [],\n        (ctx) => ctx.id()\n    ],\n    'zoom': [\n        NumberType,\n        [],\n        (ctx) => ctx.globals.zoom\n    ],\n    'pitch': [\n        NumberType,\n        [],\n        (ctx) => ctx.globals.pitch || 0\n    ],\n    'distance-from-center': [\n        NumberType,\n        [],\n        (ctx) => ctx.distanceFromCenter()\n    ],\n    'measure-light': [\n        NumberType,\n        [StringType],\n        (ctx, [s]) => ctx.measureLight(s.evaluate(ctx))\n    ],\n    'heatmap-density': [\n        NumberType,\n        [],\n        (ctx) => ctx.globals.heatmapDensity || 0\n    ],\n    'line-progress': [\n        NumberType,\n        [],\n        (ctx) => ctx.globals.lineProgress || 0\n    ],\n    'raster-value': [\n        NumberType,\n        [],\n        (ctx) => ctx.globals.rasterValue || 0\n    ],\n    'raster-particle-speed': [\n        NumberType,\n        [],\n        (ctx) => ctx.globals.rasterParticleSpeed || 0\n    ],\n    'sky-radial-progress': [\n        NumberType,\n        [],\n        (ctx) => ctx.globals.skyRadialProgress || 0\n    ],\n    'accumulated': [\n        ValueType,\n        [],\n        (ctx) => ctx.globals.accumulated === undefined ? null : ctx.globals.accumulated\n    ],\n    '+': [\n        NumberType,\n        varargs(NumberType),\n        (ctx, args) => {\n            let result = 0;\n            for (const arg of args) {\n                result += arg.evaluate(ctx);\n            }\n            return result;\n        }\n    ],\n    '*': [\n        NumberType,\n        varargs(NumberType),\n        (ctx, args) => {\n            let result = 1;\n            for (const arg of args) {\n                result *= arg.evaluate(ctx);\n            }\n            return result;\n        }\n    ],\n    '-': {\n        type: NumberType,\n        overloads: [\n            [\n                [NumberType, NumberType],\n                (ctx, [a, b]) => a.evaluate(ctx) - b.evaluate(ctx)\n            ], [\n                [NumberType],\n                (ctx, [a]) => -a.evaluate(ctx)\n            ]\n        ]\n    },\n    '/': [\n        NumberType,\n        [NumberType, NumberType],\n        (ctx, [a, b]) => a.evaluate(ctx) / b.evaluate(ctx)\n    ],\n    '%': [\n        NumberType,\n        [NumberType, NumberType],\n        (ctx, [a, b]) => a.evaluate(ctx) % b.evaluate(ctx)\n    ],\n    'ln2': [\n        NumberType,\n        [],\n        () => Math.LN2\n    ],\n    'pi': [\n        NumberType,\n        [],\n        () => Math.PI\n    ],\n    'e': [\n        NumberType,\n        [],\n        () => Math.E\n    ],\n    '^': [\n        NumberType,\n        [NumberType, NumberType],\n        (ctx, [b, e]) => Math.pow(b.evaluate(ctx), e.evaluate(ctx))\n    ],\n    'sqrt': [\n        NumberType,\n        [NumberType],\n        (ctx, [x]) => Math.sqrt(x.evaluate(ctx))\n    ],\n    'log10': [\n        NumberType,\n        [NumberType],\n        (ctx, [n]) => Math.log(n.evaluate(ctx)) / Math.LN10\n    ],\n    'ln': [\n        NumberType,\n        [NumberType],\n        (ctx, [n]) => Math.log(n.evaluate(ctx))\n    ],\n    'log2': [\n        NumberType,\n        [NumberType],\n        (ctx, [n]) => Math.log(n.evaluate(ctx)) / Math.LN2\n    ],\n    'sin': [\n        NumberType,\n        [NumberType],\n        (ctx, [n]) => Math.sin(n.evaluate(ctx))\n    ],\n    'cos': [\n        NumberType,\n        [NumberType],\n        (ctx, [n]) => Math.cos(n.evaluate(ctx))\n    ],\n    'tan': [\n        NumberType,\n        [NumberType],\n        (ctx, [n]) => Math.tan(n.evaluate(ctx))\n    ],\n    'asin': [\n        NumberType,\n        [NumberType],\n        (ctx, [n]) => Math.asin(n.evaluate(ctx))\n    ],\n    'acos': [\n        NumberType,\n        [NumberType],\n        (ctx, [n]) => Math.acos(n.evaluate(ctx))\n    ],\n    'atan': [\n        NumberType,\n        [NumberType],\n        (ctx, [n]) => Math.atan(n.evaluate(ctx))\n    ],\n    'min': [\n        NumberType,\n        varargs(NumberType),\n        (ctx, args) => Math.min(...args.map(arg => arg.evaluate(ctx)))\n    ],\n    'max': [\n        NumberType,\n        varargs(NumberType),\n        (ctx, args) => Math.max(...args.map(arg => arg.evaluate(ctx)))\n    ],\n    'abs': [\n        NumberType,\n        [NumberType],\n        (ctx, [n]) => Math.abs(n.evaluate(ctx))\n    ],\n    'round': [\n        NumberType,\n        [NumberType],\n        (ctx, [n]) => {\n            const v = n.evaluate(ctx);\n            // Javascript's Math.round() rounds towards +Infinity for halfway\n            // values, even when they're negative. It's more common to round\n            // away from 0 (e.g., this is what python and C++ do)\n            return v < 0 ? -Math.round(-v) : Math.round(v);\n        }\n    ],\n    'floor': [\n        NumberType,\n        [NumberType],\n        (ctx, [n]) => Math.floor(n.evaluate(ctx))\n    ],\n    'ceil': [\n        NumberType,\n        [NumberType],\n        (ctx, [n]) => Math.ceil(n.evaluate(ctx))\n    ],\n    'filter-==': [\n        BooleanType,\n        [StringType, ValueType],\n        (ctx, [k, v]) => ctx.properties()[(k: any).value] === (v: any).value\n    ],\n    'filter-id-==': [\n        BooleanType,\n        [ValueType],\n        (ctx, [v]) => ctx.id() === (v: any).value\n    ],\n    'filter-type-==': [\n        BooleanType,\n        [StringType],\n        (ctx, [v]) => ctx.geometryType() === (v: any).value\n    ],\n    'filter-<': [\n        BooleanType,\n        [StringType, ValueType],\n        (ctx, [k, v]) => {\n            const a = ctx.properties()[(k: any).value];\n            const b = (v: any).value;\n            return typeof a === typeof b && a < b;\n        }\n    ],\n    'filter-id-<': [\n        BooleanType,\n        [ValueType],\n        (ctx, [v]) => {\n            const a = ctx.id();\n            const b = (v: any).value;\n            return typeof a === typeof b && a < b;\n        }\n    ],\n    'filter->': [\n        BooleanType,\n        [StringType, ValueType],\n        (ctx, [k, v]) => {\n            const a = ctx.properties()[(k: any).value];\n            const b = (v: any).value;\n            return typeof a === typeof b && a > b;\n        }\n    ],\n    'filter-id->': [\n        BooleanType,\n        [ValueType],\n        (ctx, [v]) => {\n            const a = ctx.id();\n            const b = (v: any).value;\n            return typeof a === typeof b && a > b;\n        }\n    ],\n    'filter-<=': [\n        BooleanType,\n        [StringType, ValueType],\n        (ctx, [k, v]) => {\n            const a = ctx.properties()[(k: any).value];\n            const b = (v: any).value;\n            return typeof a === typeof b && a <= b;\n        }\n    ],\n    'filter-id-<=': [\n        BooleanType,\n        [ValueType],\n        (ctx, [v]) => {\n            const a = ctx.id();\n            const b = (v: any).value;\n            return typeof a === typeof b && a <= b;\n        }\n    ],\n    'filter->=': [\n        BooleanType,\n        [StringType, ValueType],\n        (ctx, [k, v]) => {\n            const a = ctx.properties()[(k: any).value];\n            const b = (v: any).value;\n            return typeof a === typeof b && a >= b;\n        }\n    ],\n    'filter-id->=': [\n        BooleanType,\n        [ValueType],\n        (ctx, [v]) => {\n            const a = ctx.id();\n            const b = (v: any).value;\n            return typeof a === typeof b && a >= b;\n        }\n    ],\n    'filter-has': [\n        BooleanType,\n        [ValueType],\n        (ctx, [k]) => (k: any).value in ctx.properties()\n    ],\n    'filter-has-id': [\n        BooleanType,\n        [],\n        (ctx) => (ctx.id() !== null && ctx.id() !== undefined)\n    ],\n    'filter-type-in': [\n        BooleanType,\n        [array(StringType)],\n        (ctx, [v]) => (v: any).value.indexOf(ctx.geometryType()) >= 0\n    ],\n    'filter-id-in': [\n        BooleanType,\n        [array(ValueType)],\n        (ctx, [v]) => (v: any).value.indexOf(ctx.id()) >= 0\n    ],\n    'filter-in-small': [\n        BooleanType,\n        [StringType, array(ValueType)],\n        // assumes v is an array literal\n        (ctx, [k, v]) => (v: any).value.indexOf(ctx.properties()[(k: any).value]) >= 0\n    ],\n    'filter-in-large': [\n        BooleanType,\n        [StringType, array(ValueType)],\n        // assumes v is a array literal with values sorted in ascending order and of a single type\n        (ctx, [k, v]) => binarySearch(ctx.properties()[(k: any).value], (v: any).value, 0, (v: any).value.length - 1)\n    ],\n    'all': {\n        type: BooleanType,\n        overloads: [\n            [\n                [BooleanType, BooleanType],\n                (ctx, [a, b]) => a.evaluate(ctx) && b.evaluate(ctx)\n            ],\n            [\n                varargs(BooleanType),\n                (ctx, args) => {\n                    for (const arg of args) {\n                        if (!arg.evaluate(ctx))\n                            return false;\n                    }\n                    return true;\n                }\n            ]\n        ]\n    },\n    'any': {\n        type: BooleanType,\n        overloads: [\n            [\n                [BooleanType, BooleanType],\n                (ctx, [a, b]) => a.evaluate(ctx) || b.evaluate(ctx)\n            ],\n            [\n                varargs(BooleanType),\n                (ctx, args) => {\n                    for (const arg of args) {\n                        if (arg.evaluate(ctx))\n                            return true;\n                    }\n                    return false;\n                }\n            ]\n        ]\n    },\n    '!': [\n        BooleanType,\n        [BooleanType],\n        (ctx, [b]) => !b.evaluate(ctx)\n    ],\n    'is-supported-script': [\n        BooleanType,\n        [StringType],\n        // At parse time this will always return true, so we need to exclude this expression with isGlobalPropertyConstant\n        (ctx, [s]) => {\n            const isSupportedScript = ctx.globals && ctx.globals.isSupportedScript;\n            if (isSupportedScript) {\n                return isSupportedScript(s.evaluate(ctx));\n            }\n            return true;\n        }\n    ],\n    'upcase': [\n        StringType,\n        [StringType],\n        (ctx, [s]) => s.evaluate(ctx).toUpperCase()\n    ],\n    'downcase': [\n        StringType,\n        [StringType],\n        (ctx, [s]) => s.evaluate(ctx).toLowerCase()\n    ],\n    'concat': [\n        StringType,\n        varargs(ValueType),\n        (ctx, args) => args.map(arg => valueToString(arg.evaluate(ctx))).join('')\n    ],\n    'resolved-locale': [\n        StringType,\n        [CollatorType],\n        (ctx, [collator]) => collator.evaluate(ctx).resolvedLocale()\n    ],\n    'random': [\n        NumberType,\n        [NumberType, NumberType, ValueType],\n        (ctx, args) => {\n            const [min, max, seed] = args.map(arg => arg.evaluate(ctx));\n            if (min > max) {\n                return min;\n            }\n            if (min === max) {\n                return min;\n            }\n            let seedVal;\n            if (typeof seed === 'string') {\n                seedVal = hashString(seed);\n            } else if (typeof seed === 'number') {\n                seedVal = seed;\n            } else {\n                throw new RuntimeError(`Invalid seed input: ${seed}`);\n            }\n            const random = mulberry32(seedVal)();\n            return min + random * (max - min);\n        }\n    ],\n});\n\nexport default expressions;\n","// @flow\n\n/**\n * A type used for returning and propagating errors. The first element of the union\n * represents success and contains a value, and the second represents an error and\n * contains an error value.\n * @private\n */\nexport type Result<T, E> =\n    | {| result: 'success', value: T |}\n    | {| result: 'error', value: E |};\n\nexport function success<T, E>(value: T): Result<T, E> {\n    return {result: 'success', value};\n}\n\nexport function error<T, E>(value: E): Result<T, E> {\n    return {result: 'error', value};\n}\n","// @flow\n\nimport type {ExpressionSpecification, StylePropertySpecification} from '../style-spec.js';\n\ntype ExpressionParameter = ExpressionSpecification['parameters'][number];\n\nfunction expressionHasParameter(expression: ?ExpressionSpecification, parameter: ExpressionParameter): boolean {\n    return !!expression && !!expression.parameters && expression.parameters.indexOf(parameter) > -1;\n}\n\nexport function supportsPropertyExpression(spec: StylePropertySpecification): boolean {\n    return spec['property-type'] === 'data-driven';\n}\n\nexport function supportsLightExpression(spec: StylePropertySpecification): boolean {\n    return expressionHasParameter(spec.expression, 'measure-light');\n}\n\nexport function supportsZoomExpression(spec: StylePropertySpecification): boolean {\n    return expressionHasParameter(spec.expression, 'zoom');\n}\n\nexport function supportsInterpolation(spec: StylePropertySpecification): boolean {\n    return !!spec.expression && spec.expression.interpolated;\n}\n","// @noflow\n\nimport * as colorSpaces from '../util/color_spaces.js';\nimport Color from '../util/color.js';\nimport extend from '../util/extend.js';\nimport getType from '../util/get_type.js';\nimport * as interpolate from '../util/interpolate.js';\nimport Interpolate from '../expression/definitions/interpolate.js';\nimport Formatted from '../expression/types/formatted.js';\nimport ResolvedImage from '../expression/types/resolved_image.js';\nimport {supportsInterpolation} from '../util/properties.js';\nimport {findStopLessThanOrEqualTo} from '../expression/stops.js';\n\nexport function isFunction(value) {\n    return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction identityFunction(x) {\n    return x;\n}\n\nexport function createFunction(parameters, propertySpec) {\n    const isColor = propertySpec.type === 'color';\n    const zoomAndFeatureDependent = parameters.stops && typeof parameters.stops[0][0] === 'object';\n    const featureDependent = zoomAndFeatureDependent || parameters.property !== undefined;\n    const zoomDependent = zoomAndFeatureDependent || !featureDependent;\n    const type = parameters.type || (supportsInterpolation(propertySpec) ? 'exponential' : 'interval');\n\n    if (isColor) {\n        parameters = extend({}, parameters);\n\n        if (parameters.stops) {\n            parameters.stops = parameters.stops.map((stop) => {\n                return [stop[0], Color.parse(stop[1])];\n            });\n        }\n\n        if (parameters.default) {\n            parameters.default = Color.parse(parameters.default);\n        } else {\n            parameters.default = Color.parse(propertySpec.default);\n        }\n    }\n\n    if (parameters.colorSpace && parameters.colorSpace !== 'rgb' && !colorSpaces[parameters.colorSpace]) { // eslint-disable-line import/namespace\n        throw new Error(`Unknown color space: ${parameters.colorSpace}`);\n    }\n\n    let innerFun;\n    let hashedStops;\n    let categoricalKeyType;\n    if (type === 'exponential') {\n        innerFun = evaluateExponentialFunction;\n    } else if (type === 'interval') {\n        innerFun = evaluateIntervalFunction;\n    } else if (type === 'categorical') {\n        innerFun = evaluateCategoricalFunction;\n\n        // For categorical functions, generate an Object as a hashmap of the stops for fast searching\n        hashedStops = Object.create(null);\n        for (const stop of parameters.stops) {\n            hashedStops[stop[0]] = stop[1];\n        }\n\n        // Infer key type based on first stop key-- used to encforce strict type checking later\n        categoricalKeyType = typeof parameters.stops[0][0];\n\n    } else if (type === 'identity') {\n        innerFun = evaluateIdentityFunction;\n    } else {\n        throw new Error(`Unknown function type \"${type}\"`);\n    }\n\n    if (zoomAndFeatureDependent) {\n        const featureFunctions = {};\n        const zoomStops = [];\n        for (let s = 0; s < parameters.stops.length; s++) {\n            const stop = parameters.stops[s];\n            const zoom = stop[0].zoom;\n            if (featureFunctions[zoom] === undefined) {\n                featureFunctions[zoom] = {\n                    zoom,\n                    type: parameters.type,\n                    property: parameters.property,\n                    default: parameters.default,\n                    stops: []\n                };\n                zoomStops.push(zoom);\n            }\n            featureFunctions[zoom].stops.push([stop[0].value, stop[1]]);\n        }\n\n        const featureFunctionStops = [];\n        for (const z of zoomStops) {\n            featureFunctionStops.push([featureFunctions[z].zoom, createFunction(featureFunctions[z], propertySpec)]);\n        }\n\n        const interpolationType = {name: 'linear'};\n        return {\n            kind: 'composite',\n            interpolationType,\n            interpolationFactor: Interpolate.interpolationFactor.bind(undefined, interpolationType),\n            zoomStops: featureFunctionStops.map(s => s[0]),\n            evaluate({zoom}, properties) {\n                return evaluateExponentialFunction({\n                    stops: featureFunctionStops,\n                    base: parameters.base\n                }, propertySpec, zoom).evaluate(zoom, properties);\n            }\n        };\n    } else if (zoomDependent) {\n        const interpolationType = type === 'exponential' ?\n            {name: 'exponential', base: parameters.base !== undefined ? parameters.base : 1} : null;\n        return {\n            kind: 'camera',\n            interpolationType,\n            interpolationFactor: Interpolate.interpolationFactor.bind(undefined, interpolationType),\n            zoomStops: parameters.stops.map(s => s[0]),\n            evaluate: ({zoom}) => innerFun(parameters, propertySpec, zoom, hashedStops, categoricalKeyType)\n        };\n    } else {\n        return {\n            kind: 'source',\n            evaluate(_, feature) {\n                const value = feature && feature.properties ? feature.properties[parameters.property] : undefined;\n                if (value === undefined) {\n                    return coalesce(parameters.default, propertySpec.default);\n                }\n                return innerFun(parameters, propertySpec, value, hashedStops, categoricalKeyType);\n            }\n        };\n    }\n}\n\nfunction coalesce(a, b, c) {\n    if (a !== undefined) return a;\n    if (b !== undefined) return b;\n    if (c !== undefined) return c;\n}\n\nfunction evaluateCategoricalFunction(parameters, propertySpec, input, hashedStops, keyType) {\n    const evaluated = typeof input === keyType ? hashedStops[input] : undefined; // Enforce strict typing on input\n    return coalesce(evaluated, parameters.default, propertySpec.default);\n}\n\nfunction evaluateIntervalFunction(parameters, propertySpec, input) {\n    // Edge cases\n    if (getType(input) !== 'number') return coalesce(parameters.default, propertySpec.default);\n    const n = parameters.stops.length;\n    if (n === 1) return parameters.stops[0][1];\n    if (input <= parameters.stops[0][0]) return parameters.stops[0][1];\n    if (input >= parameters.stops[n - 1][0]) return parameters.stops[n - 1][1];\n\n    const index = findStopLessThanOrEqualTo(parameters.stops.map((stop) => stop[0]), input);\n\n    return parameters.stops[index][1];\n}\n\nfunction evaluateExponentialFunction(parameters, propertySpec, input) {\n    const base = parameters.base !== undefined ? parameters.base : 1;\n\n    // Edge cases\n    if (getType(input) !== 'number') return coalesce(parameters.default, propertySpec.default);\n    const n = parameters.stops.length;\n    if (n === 1) return parameters.stops[0][1];\n    if (input <= parameters.stops[0][0]) return parameters.stops[0][1];\n    if (input >= parameters.stops[n - 1][0]) return parameters.stops[n - 1][1];\n\n    const index = findStopLessThanOrEqualTo(parameters.stops.map((stop) => stop[0]), input);\n    const t = interpolationFactor(\n        input, base,\n        parameters.stops[index][0],\n        parameters.stops[index + 1][0]);\n\n    const outputLower = parameters.stops[index][1];\n    const outputUpper = parameters.stops[index + 1][1];\n    let interp = interpolate[propertySpec.type] || identityFunction; // eslint-disable-line import/namespace\n\n    if (parameters.colorSpace && parameters.colorSpace !== 'rgb') {\n        const colorspace = colorSpaces[parameters.colorSpace]; // eslint-disable-line import/namespace\n        interp = (a, b) => colorspace.reverse(colorspace.interpolate(colorspace.forward(a), colorspace.forward(b), t));\n    }\n\n    if (typeof outputLower.evaluate === 'function') {\n        return {\n            evaluate(...args) {\n                const evaluatedLower = outputLower.evaluate.apply(undefined, args);\n                const evaluatedUpper = outputUpper.evaluate.apply(undefined, args);\n                // Special case for fill-outline-color, which has no spec default.\n                if (evaluatedLower === undefined || evaluatedUpper === undefined) {\n                    return undefined;\n                }\n                return interp(evaluatedLower, evaluatedUpper, t);\n            }\n        };\n    }\n\n    return interp(outputLower, outputUpper, t);\n}\n\nfunction evaluateIdentityFunction(parameters, propertySpec, input) {\n    if (propertySpec.type === 'color') {\n        input = Color.parse(input);\n    } else if (propertySpec.type === 'formatted') {\n        input = Formatted.fromString(input.toString());\n    } else if (propertySpec.type === 'resolvedImage') {\n        input = ResolvedImage.fromString(input.toString());\n    } else if (getType(input) !== propertySpec.type && (propertySpec.type !== 'enum' || !propertySpec.values[input])) {\n        input = undefined;\n    }\n    return coalesce(input, parameters.default, propertySpec.default);\n}\n\n/**\n * Returns a ratio that can be used to interpolate between exponential function\n * stops.\n *\n * How it works:\n * Two consecutive stop values define a (scaled and shifted) exponential\n * function `f(x) = a * base^x + b`, where `base` is the user-specified base,\n * and `a` and `b` are constants affording sufficient degrees of freedom to fit\n * the function to the given stops.\n *\n * Here's a bit of algebra that lets us compute `f(x)` directly from the stop\n * values without explicitly solving for `a` and `b`:\n *\n * First stop value: `f(x0) = y0 = a * base^x0 + b`\n * Second stop value: `f(x1) = y1 = a * base^x1 + b`\n * => `y1 - y0 = a(base^x1 - base^x0)`\n * => `a = (y1 - y0)/(base^x1 - base^x0)`\n *\n * Desired value: `f(x) = y = a * base^x + b`\n * => `f(x) = y0 + a * (base^x - base^x0)`\n *\n * From the above, we can replace the `a` in `a * (base^x - base^x0)` and do a\n * little algebra:\n * ```\n * a * (base^x - base^x0) = (y1 - y0)/(base^x1 - base^x0) * (base^x - base^x0)\n *                     = (y1 - y0) * (base^x - base^x0) / (base^x1 - base^x0)\n * ```\n *\n * If we let `(base^x - base^x0) / (base^x1 base^x0)`, then we have\n * `f(x) = y0 + (y1 - y0) * ratio`.  In other words, `ratio` may be treated as\n * an interpolation factor between the two stops' output values.\n *\n * (Note: a slightly different form for `ratio`,\n * `(base^(x-x0) - 1) / (base^(x1-x0) - 1) `, is equivalent, but requires fewer\n * expensive `Math.pow()` operations.)\n *\n * @private\n */\nfunction interpolationFactor(input, base, lowerValue, upperValue) {\n    const difference = upperValue - lowerValue;\n    const progress = input - lowerValue;\n\n    if (difference === 0) {\n        return 0;\n    } else if (base === 1) {\n        return progress / difference;\n    } else {\n        return (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1);\n    }\n}\n","// @flow\n\nimport assert from 'assert';\n\nimport extend from '../util/extend.js';\nimport ParsingError from './parsing_error.js';\nimport ParsingContext from './parsing_context.js';\nimport EvaluationContext from './evaluation_context.js';\nimport CompoundExpression from './compound_expression.js';\nimport Step from './definitions/step.js';\nimport Interpolate from './definitions/interpolate.js';\nimport Coalesce from './definitions/coalesce.js';\nimport Let from './definitions/let.js';\nimport definitions from './definitions/index.js';\nimport * as isConstant from './is_constant.js';\nimport RuntimeError from './runtime_error.js';\nimport {success, error} from '../util/result.js';\nimport {\n    supportsPropertyExpression,\n    supportsZoomExpression,\n    supportsLightExpression,\n    supportsInterpolation\n} from '../util/properties.js';\n\nimport type {Type, EvaluationKind} from './types.js';\nimport type {Value} from './values.js';\nimport type {Expression} from './expression.js';\nimport type {StylePropertySpecification} from '../style-spec.js';\nimport type {Result} from '../util/result.js';\nimport type {InterpolationType} from './definitions/interpolate.js';\nimport type {PropertyValueSpecification} from '../types.js';\nimport type {FormattedSection} from './types/formatted.js';\nimport type Point from '@mapbox/point-geometry';\nimport type {CanonicalTileID} from '../../source/tile_id.js';\nimport type {FeatureDistanceData} from '../feature_filter/index.js';\nimport type {ConfigOptions} from '../../style/properties.js';\n\nexport interface Feature {\n    +type: 1 | 2 | 3 | 'Unknown' | 'Point' | 'LineString' | 'Polygon';\n    +id?: number | null;\n    +properties: {[_: string]: any};\n    +patterns?: {[_: string]: string};\n    +geometry?: Array<Array<Point>>;\n}\n\nexport type FeatureState = {[_: string]: any};\n\nexport interface GlobalProperties {\n    zoom: number,\n    pitch?: number,\n    heatmapDensity?: number,\n    lineProgress?: number,\n    rasterValue?: number,\n    rasterParticleSpeed?: number,\n    skyRadialProgress?: number,\n    +isSupportedScript?: (_: string) => boolean,\n    accumulated?: Value,\n    brightness?: number\n}\n\nexport class StyleExpression {\n    expression: Expression;\n\n    _evaluator: EvaluationContext;\n    _defaultValue: Value;\n    _warningHistory: {[key: string]: boolean};\n    _enumValues: ?{[_: string]: any};\n\n    constructor(expression: Expression, propertySpec: ?StylePropertySpecification, scope?: ?string, options?: ?ConfigOptions) {\n        this.expression = expression;\n        this._warningHistory = {};\n        this._evaluator = new EvaluationContext(scope, options);\n        this._defaultValue = propertySpec ? getDefaultValue(propertySpec) : null;\n        this._enumValues = propertySpec && propertySpec.type === 'enum' ? propertySpec.values : null;\n    }\n\n    evaluateWithoutErrorHandling(globals: GlobalProperties, feature?: Feature, featureState?: FeatureState, canonical?: CanonicalTileID, availableImages?: Array<string>, formattedSection?: FormattedSection, featureTileCoord?: Point, featureDistanceData?: FeatureDistanceData): any {\n        this._evaluator.globals = globals;\n        this._evaluator.feature = feature;\n        this._evaluator.featureState = featureState;\n        this._evaluator.canonical = canonical || null;\n        this._evaluator.availableImages = availableImages || null;\n        this._evaluator.formattedSection = formattedSection;\n        this._evaluator.featureTileCoord = featureTileCoord || null;\n        this._evaluator.featureDistanceData = featureDistanceData || null;\n\n        return this.expression.evaluate(this._evaluator);\n    }\n\n    evaluate(globals: GlobalProperties, feature?: Feature, featureState?: FeatureState, canonical?: CanonicalTileID, availableImages?: Array<string>, formattedSection?: FormattedSection, featureTileCoord?: Point, featureDistanceData?: FeatureDistanceData): any {\n        this._evaluator.globals = globals;\n        this._evaluator.feature = feature || null;\n        this._evaluator.featureState = featureState || null;\n        this._evaluator.canonical = canonical || null;\n        this._evaluator.availableImages = availableImages || null;\n        this._evaluator.formattedSection = formattedSection || null;\n        this._evaluator.featureTileCoord = featureTileCoord || null;\n        this._evaluator.featureDistanceData = featureDistanceData || null;\n\n        try {\n            const val = this.expression.evaluate(this._evaluator);\n            // eslint-disable-next-line no-self-compare\n            if (val === null || val === undefined || (typeof val === 'number' && val !== val)) {\n                return this._defaultValue;\n            }\n            if (this._enumValues && !(val in this._enumValues)) {\n                throw new RuntimeError(`Expected value to be one of ${Object.keys(this._enumValues).map(v => JSON.stringify(v)).join(', ')}, but found ${JSON.stringify(val)} instead.`);\n            }\n            return val;\n        } catch (e) {\n            if (!this._warningHistory[e.message]) {\n                this._warningHistory[e.message] = true;\n                if (typeof console !== 'undefined') {\n                    console.warn(e.message);\n                }\n            }\n            return this._defaultValue;\n        }\n    }\n}\n\nexport function isExpression(expression: mixed): boolean {\n    return Array.isArray(expression) && expression.length > 0 &&\n        typeof expression[0] === 'string' && expression[0] in definitions;\n}\n\n/**\n * Parse and typecheck the given style spec JSON expression.  If\n * options.defaultValue is provided, then the resulting StyleExpression's\n * `evaluate()` method will handle errors by logging a warning (once per\n * message) and returning the default value.  Otherwise, it will throw\n * evaluation errors.\n *\n * @private\n */\nexport function createExpression(expression: mixed, propertySpec: ?StylePropertySpecification, scope?: ?string, options?: ?ConfigOptions): Result<StyleExpression, Array<ParsingError>> {\n    const parser = new ParsingContext(definitions, [], propertySpec ? getExpectedType(propertySpec) : undefined, undefined, undefined, scope, options);\n\n    // For string-valued properties, coerce to string at the top level rather than asserting.\n    const parsed = parser.parse(expression, undefined, undefined, undefined,\n        propertySpec && propertySpec.type === 'string' ? {typeAnnotation: 'coerce'} : undefined);\n\n    if (!parsed) {\n        assert(parser.errors.length > 0);\n        return error(parser.errors);\n    }\n\n    return success(new StyleExpression(parsed, propertySpec, scope, options));\n}\n\nexport class ZoomConstantExpression<Kind: EvaluationKind> {\n    kind: Kind;\n    isStateDependent: boolean;\n    isConfigDependent: boolean;\n    _styleExpression: StyleExpression;\n    isLightConstant: ?boolean;\n\n    constructor(kind: Kind, expression: StyleExpression, isLightConstant: ?boolean) {\n        this.kind = kind;\n        this._styleExpression = expression;\n        this.isLightConstant = isLightConstant;\n        this.isStateDependent = kind !== ('constant': EvaluationKind) && !isConstant.isStateConstant(expression.expression);\n        this.isConfigDependent = !isConstant.isConfigConstant(expression.expression);\n    }\n\n    evaluateWithoutErrorHandling(globals: GlobalProperties, feature?: Feature, featureState?: FeatureState, canonical?: CanonicalTileID, availableImages?: Array<string>, formattedSection?: FormattedSection): any {\n        return this._styleExpression.evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection);\n    }\n\n    evaluate(globals: GlobalProperties, feature?: Feature, featureState?: FeatureState, canonical?: CanonicalTileID, availableImages?: Array<string>, formattedSection?: FormattedSection): any {\n        return this._styleExpression.evaluate(globals, feature, featureState, canonical, availableImages, formattedSection);\n    }\n}\n\nexport class ZoomDependentExpression<Kind: EvaluationKind> {\n    kind: Kind;\n    zoomStops: Array<number>;\n    isStateDependent: boolean;\n    isLightConstant: ?boolean;\n    isConfigDependent: boolean;\n\n    _styleExpression: StyleExpression;\n    interpolationType: ?InterpolationType;\n\n    constructor(kind: Kind, expression: StyleExpression, zoomStops: Array<number>, interpolationType?: InterpolationType, isLightConstant: ?boolean) {\n        this.kind = kind;\n        this.zoomStops = zoomStops;\n        this._styleExpression = expression;\n        this.isStateDependent = kind !== ('camera': EvaluationKind) && !isConstant.isStateConstant(expression.expression);\n        this.isLightConstant = isLightConstant;\n        this.isConfigDependent = !isConstant.isConfigConstant(expression.expression);\n        this.interpolationType = interpolationType;\n    }\n\n    evaluateWithoutErrorHandling(globals: GlobalProperties, feature?: Feature, featureState?: FeatureState, canonical?: CanonicalTileID, availableImages?: Array<string>, formattedSection?: FormattedSection): any {\n        return this._styleExpression.evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection);\n    }\n\n    evaluate(globals: GlobalProperties, feature?: Feature, featureState?: FeatureState, canonical?: CanonicalTileID, availableImages?: Array<string>, formattedSection?: FormattedSection): any {\n        return this._styleExpression.evaluate(globals, feature, featureState, canonical, availableImages, formattedSection);\n    }\n\n    interpolationFactor(input: number, lower: number, upper: number): number {\n        if (this.interpolationType) {\n            return Interpolate.interpolationFactor(this.interpolationType, input, lower, upper);\n        } else {\n            return 0;\n        }\n    }\n}\n\nexport type ConstantExpression = interface {\n    kind: 'constant',\n    isConfigDependent: boolean,\n    +evaluate: (globals: GlobalProperties, feature?: Feature, featureState?: FeatureState, canonical?: CanonicalTileID, availableImages?: Array<string>) => any,\n}\n\nexport type SourceExpression = interface {\n    kind: 'source',\n    isStateDependent: boolean,\n    isLightConstant: ?boolean;\n    isConfigDependent: boolean,\n    +evaluate: (globals: GlobalProperties, feature?: Feature, featureState?: FeatureState, canonical?: CanonicalTileID, availableImages?: Array<string>, formattedSection?: FormattedSection) => any,\n};\n\nexport type CameraExpression = interface {\n    kind: 'camera',\n    isStateDependent: boolean,\n    isConfigDependent: boolean,\n    +evaluate: (globals: GlobalProperties, feature?: Feature, featureState?: FeatureState, canonical?: CanonicalTileID, availableImages?: Array<string>) => any,\n    +interpolationFactor: (input: number, lower: number, upper: number) => number,\n    zoomStops: Array<number>,\n    interpolationType: ?InterpolationType\n};\n\nexport interface CompositeExpression {\n    kind: 'composite';\n    isStateDependent: boolean;\n    isLightConstant: ?boolean;\n    isConfigDependent: boolean;\n    +evaluate: (globals: GlobalProperties, feature?: Feature, featureState?: FeatureState, canonical?: CanonicalTileID, availableImages?: Array<string>, formattedSection?: FormattedSection) => any;\n    +interpolationFactor: (input: number, lower: number, upper: number) => number;\n    zoomStops: Array<number>;\n    interpolationType: ?InterpolationType;\n}\n\nexport type StylePropertyExpression =\n    | ConstantExpression\n    | SourceExpression\n    | CameraExpression\n    | CompositeExpression;\n\nexport function createPropertyExpression(expression: mixed, propertySpec: StylePropertySpecification, scope?: ?string, options?: ?ConfigOptions): Result<StylePropertyExpression, Array<ParsingError>> {\n    expression = createExpression(expression, propertySpec, scope, options);\n    if (expression.result === 'error') {\n        return expression;\n    }\n\n    const parsed = expression.value.expression;\n\n    const isFeatureConstant = isConstant.isFeatureConstant(parsed);\n    if (!isFeatureConstant && !supportsPropertyExpression(propertySpec)) {\n        return error([new ParsingError('', 'data expressions not supported')]);\n    }\n\n    const isZoomConstant = isConstant.isGlobalPropertyConstant(parsed, ['zoom', 'pitch', 'distance-from-center']);\n    if (!isZoomConstant && !supportsZoomExpression(propertySpec)) {\n        return error([new ParsingError('', 'zoom expressions not supported')]);\n    }\n\n    const isLightConstant = isConstant.isGlobalPropertyConstant(parsed, ['measure-light']);\n    if (!isLightConstant && !supportsLightExpression(propertySpec)) {\n        return error([new ParsingError('', 'measure-light expression not supported')]);\n    }\n\n    const canRelaxZoomRestriction = propertySpec.expression && propertySpec.expression.relaxZoomRestriction;\n    const zoomCurve = findZoomCurve(parsed);\n    if (!zoomCurve && !isZoomConstant && !canRelaxZoomRestriction) {\n        return error([new ParsingError('', '\"zoom\" expression may only be used as input to a top-level \"step\" or \"interpolate\" expression, or in the properties of atmosphere.')]);\n    } else if (zoomCurve instanceof ParsingError) {\n        return error([zoomCurve]);\n    } else if (zoomCurve instanceof Interpolate && !supportsInterpolation(propertySpec)) {\n        return error([new ParsingError('', '\"interpolate\" expressions cannot be used with this property')]);\n    }\n\n    if (!zoomCurve) {\n        return success(isFeatureConstant ?\n            // $FlowFixMe[method-unbinding]\n            (new ZoomConstantExpression('constant', expression.value, isLightConstant): ConstantExpression) :\n            // $FlowFixMe[method-unbinding]\n            (new ZoomConstantExpression('source', expression.value, isLightConstant): SourceExpression));\n    }\n\n    const interpolationType = zoomCurve instanceof Interpolate ? zoomCurve.interpolation : undefined;\n\n    return success(isFeatureConstant ?\n        // $FlowFixMe[method-unbinding]\n        (new ZoomDependentExpression('camera', expression.value, zoomCurve.labels, interpolationType, isLightConstant): CameraExpression) :\n        // $FlowFixMe[method-unbinding]\n        (new ZoomDependentExpression('composite', expression.value, zoomCurve.labels, interpolationType, isLightConstant): CompositeExpression));\n}\n\nimport {isFunction, createFunction} from '../function/index.js';\nimport {Color} from './values.js';\n\n// serialization wrapper for old-style stop functions normalized to the\n// expression interface\nexport class StylePropertyFunction<T> {\n    _parameters: PropertyValueSpecification<T>;\n    _specification: StylePropertySpecification;\n\n    kind: EvaluationKind;\n    evaluate: (globals: GlobalProperties, feature?: Feature) => any;\n    interpolationFactor: ?(input: number, lower: number, upper: number) => number;\n    zoomStops: ?Array<number>;\n\n    constructor(parameters: PropertyValueSpecification<T>, specification: StylePropertySpecification) {\n        this._parameters = parameters;\n        this._specification = specification;\n        extend(this, createFunction(this._parameters, this._specification));\n    }\n\n    static deserialize(serialized: {_parameters: PropertyValueSpecification<T>, _specification: StylePropertySpecification}): StylePropertyFunction<T> {\n        return new StylePropertyFunction(serialized._parameters, serialized._specification);\n    }\n\n    static serialize(input: StylePropertyFunction<T>): {_parameters: PropertyValueSpecification<T>, _specification: StylePropertySpecification} {\n        return {\n            _parameters: input._parameters,\n            _specification: input._specification\n        };\n    }\n}\n\nexport function normalizePropertyExpression<T>(value: PropertyValueSpecification<T>, specification: StylePropertySpecification, scope?: ?string, options?: ?ConfigOptions): StylePropertyExpression {\n    if (isFunction(value)) {\n        return (new StylePropertyFunction(value, specification): any);\n\n    } else if (isExpression(value) || (Array.isArray(value) && value.length > 0)) {\n        const expression = createPropertyExpression(value, specification, scope, options);\n        if (expression.result === 'error') {\n            // this should have been caught in validation\n            throw new Error(expression.value.map(err => `${err.key}: ${err.message}`).join(', '));\n        }\n        return expression.value;\n\n    } else {\n        let constant: any = value;\n        if (typeof value === 'string' && specification.type === 'color') {\n            constant = Color.parse(value);\n        }\n        return {\n            kind: 'constant',\n            isConfigDependent: false,\n            evaluate: () => constant\n        };\n    }\n}\n\n// Zoom-dependent expressions may only use [\"zoom\"] as the input to a top-level \"step\" or \"interpolate\"\n// expression (collectively referred to as a \"curve\"). The curve may be wrapped in one or more \"let\" or\n// \"coalesce\" expressions.\nfunction findZoomCurve(expression: Expression): Step | Interpolate | ParsingError | null {\n    let result = null;\n    if (expression instanceof Let) {\n        result = findZoomCurve(expression.result);\n\n    } else if (expression instanceof Coalesce) {\n        for (const arg of expression.args) {\n            result = findZoomCurve(arg);\n            if (result) {\n                break;\n            }\n        }\n\n    } else if ((expression instanceof Step || expression instanceof Interpolate) &&\n        expression.input instanceof CompoundExpression &&\n        expression.input.name === 'zoom') {\n\n        result = expression;\n    }\n\n    if (result instanceof ParsingError) {\n        return result;\n    }\n\n    expression.eachChild((child) => {\n        const childResult = findZoomCurve(child);\n        if (childResult instanceof ParsingError) {\n            result = childResult;\n        } else if (result && childResult && result !== childResult) {\n            result = new ParsingError('', 'Only one zoom-based \"step\" or \"interpolate\" subexpression may be used in an expression.');\n        }\n    });\n\n    return result;\n}\n\nimport {ColorType, StringType, NumberType, BooleanType, ValueType, FormattedType, ResolvedImageType, array} from './types.js';\n\nfunction getExpectedType(spec: StylePropertySpecification): Type {\n    const types = {\n        color: ColorType,\n        string: StringType,\n        number: NumberType,\n        enum: StringType,\n        boolean: BooleanType,\n        formatted: FormattedType,\n        resolvedImage: ResolvedImageType\n    };\n\n    if (spec.type === 'array') {\n        return array(types[spec.value] || ValueType, spec.length);\n    }\n\n    return types[spec.type];\n}\n\nfunction getDefaultValue(spec: StylePropertySpecification): Value {\n    if (spec.type === 'color' && (isFunction(spec.default) || Array.isArray(spec.default))) {\n        // Special case for heatmap-color: it uses the 'default:' to define a\n        // default color ramp, but createExpression expects a simple value to fall\n        // back to in case of runtime errors\n        return new Color(0, 0, 0, 0);\n    } else if (spec.type === 'color') {\n        return Color.parse(spec.default) || null;\n    } else if (spec.default === undefined) {\n        return null;\n    } else {\n        return spec.default;\n    }\n}\n","'use strict';\n\nmodule.exports = GridIndex;\n\nvar NUM_PARAMS = 3;\n\nfunction GridIndex(extent, n, padding) {\n    var cells = this.cells = [];\n\n    if (extent instanceof ArrayBuffer) {\n        this.arrayBuffer = extent;\n        var array = new Int32Array(this.arrayBuffer);\n        extent = array[0];\n        n = array[1];\n        padding = array[2];\n\n        this.d = n + 2 * padding;\n        for (var k = 0; k < this.d * this.d; k++) {\n            var start = array[NUM_PARAMS + k];\n            var end = array[NUM_PARAMS + k + 1];\n            cells.push(start === end ?\n                    null :\n                    array.subarray(start, end));\n        }\n        var keysOffset = array[NUM_PARAMS + cells.length];\n        var bboxesOffset = array[NUM_PARAMS + cells.length + 1];\n        this.keys = array.subarray(keysOffset, bboxesOffset);\n        this.bboxes = array.subarray(bboxesOffset);\n\n        this.insert = this._insertReadonly;\n\n    } else {\n        this.d = n + 2 * padding;\n        for (var i = 0; i < this.d * this.d; i++) {\n            cells.push([]);\n        }\n        this.keys = [];\n        this.bboxes = [];\n    }\n\n    this.n = n;\n    this.extent = extent;\n    this.padding = padding;\n    this.scale = n / extent;\n    this.uid = 0;\n\n    var p = (padding / n) * extent;\n    this.min = -p;\n    this.max = extent + p;\n}\n\n\nGridIndex.prototype.insert = function(key, x1, y1, x2, y2) {\n    this._forEachCell(x1, y1, x2, y2, this._insertCell, this.uid++);\n    this.keys.push(key);\n    this.bboxes.push(x1);\n    this.bboxes.push(y1);\n    this.bboxes.push(x2);\n    this.bboxes.push(y2);\n};\n\nGridIndex.prototype._insertReadonly = function() {\n    throw 'Cannot insert into a GridIndex created from an ArrayBuffer.';\n};\n\nGridIndex.prototype._insertCell = function(x1, y1, x2, y2, cellIndex, uid) {\n    this.cells[cellIndex].push(uid);\n};\n\nGridIndex.prototype.query = function(x1, y1, x2, y2, intersectionTest) {\n    var min = this.min;\n    var max = this.max;\n    if (x1 <= min && y1 <= min && max <= x2 && max <= y2 && !intersectionTest) {\n        // We use `Array#slice` because `this.keys` may be a `Int32Array` and\n        // some browsers (Safari and IE) do not support `TypedArray#slice`\n        // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/slice#Browser_compatibility\n        return Array.prototype.slice.call(this.keys);\n\n    } else {\n        var result = [];\n        var seenUids = {};\n        this._forEachCell(x1, y1, x2, y2, this._queryCell, result, seenUids, intersectionTest);\n        return result;\n    }\n};\n\nGridIndex.prototype._queryCell = function(x1, y1, x2, y2, cellIndex, result, seenUids, intersectionTest) {\n    var cell = this.cells[cellIndex];\n    if (cell !== null) {\n        var keys = this.keys;\n        var bboxes = this.bboxes;\n        for (var u = 0; u < cell.length; u++) {\n            var uid = cell[u];\n            if (seenUids[uid] === undefined) {\n                var offset = uid * 4;\n                if (intersectionTest ?\n                    intersectionTest(bboxes[offset + 0], bboxes[offset + 1], bboxes[offset + 2], bboxes[offset + 3]) :\n                    ((x1 <= bboxes[offset + 2]) &&\n                    (y1 <= bboxes[offset + 3]) &&\n                    (x2 >= bboxes[offset + 0]) &&\n                    (y2 >= bboxes[offset + 1]))) {\n                    seenUids[uid] = true;\n                    result.push(keys[uid]);\n                } else {\n                    seenUids[uid] = false;\n                }\n            }\n        }\n    }\n};\n\nGridIndex.prototype._forEachCell = function(x1, y1, x2, y2, fn, arg1, arg2, intersectionTest) {\n    var cx1 = this._convertToCellCoord(x1);\n    var cy1 = this._convertToCellCoord(y1);\n    var cx2 = this._convertToCellCoord(x2);\n    var cy2 = this._convertToCellCoord(y2);\n    for (var x = cx1; x <= cx2; x++) {\n        for (var y = cy1; y <= cy2; y++) {\n            var cellIndex = this.d * y + x;\n            if (intersectionTest && !intersectionTest(\n                        this._convertFromCellCoord(x),\n                        this._convertFromCellCoord(y),\n                        this._convertFromCellCoord(x + 1),\n                        this._convertFromCellCoord(y + 1))) continue;\n            if (fn.call(this, x1, y1, x2, y2, cellIndex, arg1, arg2, intersectionTest)) return;\n        }\n    }\n};\n\nGridIndex.prototype._convertFromCellCoord = function(x) {\n    return (x - this.padding) / this.scale;\n};\n\nGridIndex.prototype._convertToCellCoord = function(x) {\n    return Math.max(0, Math.min(this.d - 1, Math.floor(x * this.scale) + this.padding));\n};\n\nGridIndex.prototype.toArrayBuffer = function() {\n    if (this.arrayBuffer) return this.arrayBuffer;\n\n    var cells = this.cells;\n\n    var metadataLength = NUM_PARAMS + this.cells.length + 1 + 1;\n    var totalCellLength = 0;\n    for (var i = 0; i < this.cells.length; i++) {\n        totalCellLength += this.cells[i].length;\n    }\n\n    var array = new Int32Array(metadataLength + totalCellLength + this.keys.length + this.bboxes.length);\n    array[0] = this.extent;\n    array[1] = this.n;\n    array[2] = this.padding;\n\n    var offset = metadataLength;\n    for (var k = 0; k < cells.length; k++) {\n        var cell = cells[k];\n        array[NUM_PARAMS + k] = offset;\n        array.set(cell, offset);\n        offset += cell.length;\n    }\n\n    array[NUM_PARAMS + cells.length] = offset;\n    array.set(this.keys, offset);\n    offset += this.keys.length;\n\n    array[NUM_PARAMS + cells.length + 1] = offset;\n    array.set(this.bboxes, offset);\n    offset += this.bboxes.length;\n\n    return array.buffer;\n};\n","// @flow\n\nimport assert from 'assert';\n\nimport Grid from 'grid-index';\nimport Color from '../style-spec/util/color.js';\nimport {StylePropertyFunction, StyleExpression, ZoomDependentExpression, ZoomConstantExpression} from '../style-spec/expression/index.js';\nimport CompoundExpression from '../style-spec/expression/compound_expression.js';\nimport expressions from '../style-spec/expression/definitions/index.js';\nimport ResolvedImage from '../style-spec/expression/types/resolved_image.js';\nimport {AJAXError} from './ajax.js';\n\nimport type {Class} from '../types/class.js';\nimport type {GridIndex} from '../types/grid-index.js';\nimport type {Transferable} from '../types/transferable.js';\nimport Formatted, {FormattedSection} from '../style-spec/expression/types/formatted.js';\n\ntype SerializedObject = interface { [_: string]: Serialized };\nexport type Serialized =\n    | null\n    | void\n    | boolean\n    | number\n    | string\n    | Boolean\n    | Number\n    | String\n    | Date\n    | RegExp\n    | ArrayBuffer\n    | $ArrayBufferView\n    | ImageData\n    | Array<Serialized>\n    | SerializedObject;\n\ntype Registry = {\n    [_: string]: {\n        klass: Class<any>,\n        omit: $ReadOnlyArray<string>\n    }\n};\n\ntype RegisterOptions<T> = {\n    omit?: $ReadOnlyArray<$Keys<T>>\n}\n\nconst registry: Registry = {};\n\n/**\n * Register the given class as serializable.\n *\n * @param options\n * @param options.omit List of properties to omit from serialization (e.g., cached/computed properties)\n *\n * @private\n */\nexport function register<T: any>(klass: Class<T>, name: string, options: RegisterOptions<T> = {}) {\n    assert(name, 'Can\\'t register a class without a name.');\n    assert(!registry[name], `${name} is already registered.`);\n    Object.defineProperty(klass, '_classRegistryKey', {\n        value: name,\n        writeable: false\n    });\n    registry[name] = {\n        klass,\n        omit: options.omit || []\n    };\n}\n\nregister(Object, 'Object');\n\ntype SerializedGrid = { buffer: ArrayBuffer };\n\nGrid.serialize = function serialize(grid: GridIndex, transferables?: Set<Transferable>): SerializedGrid {\n    const buffer = grid.toArrayBuffer();\n    if (transferables) {\n        transferables.add(buffer);\n    }\n    return {buffer};\n};\n\nGrid.deserialize = function deserialize(serialized: SerializedGrid): GridIndex {\n    return new Grid(serialized.buffer);\n};\n\nObject.defineProperty(Grid, 'name', {value: 'Grid'});\n\nregister(Grid, 'Grid');\n\nregister(Color, 'Color');\nregister(Error, 'Error');\nregister(Formatted, 'Formatted');\nregister(FormattedSection, 'FormattedSection');\nregister(AJAXError, 'AJAXError');\nregister(ResolvedImage, 'ResolvedImage');\nregister(StylePropertyFunction, 'StylePropertyFunction');\nregister(StyleExpression, 'StyleExpression', {omit: ['_evaluator']});\n\nregister(ZoomDependentExpression, 'ZoomDependentExpression');\nregister(ZoomConstantExpression, 'ZoomConstantExpression');\nregister(CompoundExpression, 'CompoundExpression', {omit: ['_evaluate']});\nfor (const name in expressions) {\n    if (!registry[(expressions[name]: any)._classRegistryKey]) register(expressions[name], `Expression${name}`);\n}\n\nfunction isArrayBuffer(val: any): boolean {\n    return val && typeof ArrayBuffer !== 'undefined' &&\n           (val instanceof ArrayBuffer || (val.constructor && val.constructor.name === 'ArrayBuffer'));\n}\n\nfunction isImageBitmap(val: any): boolean {\n    return self.ImageBitmap && val instanceof ImageBitmap;\n}\n\n/**\n * Serialize the given object for transfer to or from a web worker.\n *\n * For non-builtin types, recursively serialize each property (possibly\n * omitting certain properties - see register()), and package the result along\n * with the constructor's `name` so that the appropriate constructor can be\n * looked up in `deserialize()`.\n *\n * If a `transferables` set is provided, add any transferable objects (i.e.,\n * any ArrayBuffers or ArrayBuffer views) to the list. (If a copy is needed,\n * this should happen in the client code, before using serialize().)\n *\n * @private\n */\nexport function serialize(input: mixed, transferables: ?Set<Transferable>): Serialized {\n    if (input === null ||\n        input === undefined ||\n        typeof input === 'boolean' ||\n        typeof input === 'number' ||\n        typeof input === 'string' ||\n        input instanceof Boolean ||\n        input instanceof Number ||\n        input instanceof String ||\n        input instanceof Date ||\n        input instanceof RegExp) {\n        return input;\n    }\n\n    if (isArrayBuffer(input) || isImageBitmap(input)) {\n        if (transferables) {\n            transferables.add(((input: any): ArrayBuffer));\n        }\n        return (input: any);\n    }\n\n    if (ArrayBuffer.isView(input)) {\n        const view: $ArrayBufferView = (input: any);\n        if (transferables) {\n            transferables.add(view.buffer);\n        }\n        return view;\n    }\n\n    if (input instanceof ImageData) {\n        if (transferables) {\n            transferables.add(input.data.buffer);\n        }\n        return input;\n    }\n\n    if (Array.isArray(input)) {\n        const serialized: Array<Serialized> = [];\n        for (const item of input) {\n            serialized.push(serialize(item, transferables));\n        }\n        return serialized;\n    }\n\n    if (input instanceof Map) {\n        const properties = {'$name': 'Map'};\n        for (const [key, value] of input.entries()) {\n            properties[key] = serialize(value);\n        }\n        return properties;\n    }\n\n    if (typeof input === 'object') {\n        const klass = (input.constructor: any);\n        const name = klass._classRegistryKey;\n        if (!name) {\n            throw new Error(`can't serialize object of unregistered class ${name}`);\n        }\n        assert(registry[name]);\n\n        const properties: SerializedObject = klass.serialize ?\n            // (Temporary workaround) allow a class to provide static\n            // `serialize()` and `deserialize()` methods to bypass the generic\n            // approach.\n            // This temporary workaround lets us use the generic serialization\n            // approach for objects whose members include instances of dynamic\n            // StructArray types. Once we refactor StructArray to be static,\n            // we can remove this complexity.\n            (klass.serialize(input, transferables): SerializedObject) : {};\n\n        if (!klass.serialize) {\n            for (const key in input) {\n                // any cast due to https://github.com/facebook/flow/issues/5393\n                if (!(input: any).hasOwnProperty(key)) continue;\n                if (registry[name].omit.indexOf(key) >= 0) continue;\n                const property = (input: any)[key];\n                properties[key] = serialize(property, transferables);\n            }\n            if (input instanceof Error) {\n                properties['message'] = input.message;\n            }\n        } else {\n            // make sure statically serialized object survives transfer of $name property\n            assert(!transferables || !transferables.has((properties: any)));\n        }\n\n        if (properties['$name']) {\n            throw new Error('$name property is reserved for worker serialization logic.');\n        }\n        if (name !== 'Object') {\n            properties['$name'] = name;\n        }\n\n        return properties;\n    }\n\n    throw new Error(`can't serialize object of type ${typeof input}`);\n}\n\nexport function deserialize(input: Serialized): mixed {\n    if (input === null ||\n        input === undefined ||\n        typeof input === 'boolean' ||\n        typeof input === 'number' ||\n        typeof input === 'string' ||\n        input instanceof Boolean ||\n        input instanceof Number ||\n        input instanceof String ||\n        input instanceof Date ||\n        input instanceof RegExp ||\n        isArrayBuffer(input) ||\n        isImageBitmap(input) ||\n        ArrayBuffer.isView(input) ||\n        input instanceof ImageData) {\n        return input;\n    }\n\n    if (Array.isArray(input)) {\n        return input.map(deserialize);\n    }\n\n    if (typeof input === 'object') {\n        const name = (input: any).$name || 'Object';\n\n        if (name === 'Map') {\n            const map = new Map();\n            for (const key of Object.keys(input)) {\n                // $FlowFixMe[incompatible-type]\n                if (key === '$name') continue;\n                const value = (input: SerializedObject)[key];\n                map.set(key, deserialize(value));\n            }\n            return map;\n        }\n\n        const {klass} = registry[name];\n        if (!klass) {\n            throw new Error(`can't deserialize unregistered class ${name}`);\n        }\n\n        if (klass.deserialize) {\n            return (klass.deserialize: typeof deserialize)(input);\n        }\n\n        const result: {[_: string]: any} = Object.create(klass.prototype);\n\n        for (const key of Object.keys(input)) {\n            // $FlowFixMe[incompatible-type]\n            if (key === '$name') continue;\n            const value = (input: SerializedObject)[key];\n            result[key] = deserialize(value);\n        }\n\n        return result;\n    }\n\n    throw new Error(`can't deserialize object of type ${typeof input}`);\n}\n","// @flow\n\n// The following table comes from <http://www.unicode.org/Public/12.0.0/ucd/Blocks.txt>.\n// Keep it synchronized with <http://www.unicode.org/Public/UCD/latest/ucd/Blocks.txt>.\n\ntype UnicodeBlockLookup = {[key: string]: (char: number) => boolean};\n\nconst unicodeBlockLookup: UnicodeBlockLookup = {\n    // 'Basic Latin': (char) => char >= 0x0000 && char <= 0x007F,\n    'Latin-1 Supplement': (char) => char >= 0x0080 && char <= 0x00FF,\n    // 'Latin Extended-A': (char) => char >= 0x0100 && char <= 0x017F,\n    // 'Latin Extended-B': (char) => char >= 0x0180 && char <= 0x024F,\n    // 'IPA Extensions': (char) => char >= 0x0250 && char <= 0x02AF,\n    // 'Spacing Modifier Letters': (char) => char >= 0x02B0 && char <= 0x02FF,\n    // 'Combining Diacritical Marks': (char) => char >= 0x0300 && char <= 0x036F,\n    // 'Greek and Coptic': (char) => char >= 0x0370 && char <= 0x03FF,\n    // 'Cyrillic': (char) => char >= 0x0400 && char <= 0x04FF,\n    // 'Cyrillic Supplement': (char) => char >= 0x0500 && char <= 0x052F,\n    // 'Armenian': (char) => char >= 0x0530 && char <= 0x058F,\n    //'Hebrew': (char) => char >= 0x0590 && char <= 0x05FF,\n    'Arabic': (char) => char >= 0x0600 && char <= 0x06FF,\n    //'Syriac': (char) => char >= 0x0700 && char <= 0x074F,\n    'Arabic Supplement': (char) => char >= 0x0750 && char <= 0x077F,\n    // 'Thaana': (char) => char >= 0x0780 && char <= 0x07BF,\n    // 'NKo': (char) => char >= 0x07C0 && char <= 0x07FF,\n    // 'Samaritan': (char) => char >= 0x0800 && char <= 0x083F,\n    // 'Mandaic': (char) => char >= 0x0840 && char <= 0x085F,\n    // 'Syriac Supplement': (char) => char >= 0x0860 && char <= 0x086F,\n    'Arabic Extended-A': (char) => char >= 0x08A0 && char <= 0x08FF,\n    // 'Devanagari': (char) => char >= 0x0900 && char <= 0x097F,\n    // 'Bengali': (char) => char >= 0x0980 && char <= 0x09FF,\n    // 'Gurmukhi': (char) => char >= 0x0A00 && char <= 0x0A7F,\n    // 'Gujarati': (char) => char >= 0x0A80 && char <= 0x0AFF,\n    // 'Oriya': (char) => char >= 0x0B00 && char <= 0x0B7F,\n    // 'Tamil': (char) => char >= 0x0B80 && char <= 0x0BFF,\n    // 'Telugu': (char) => char >= 0x0C00 && char <= 0x0C7F,\n    // 'Kannada': (char) => char >= 0x0C80 && char <= 0x0CFF,\n    // 'Malayalam': (char) => char >= 0x0D00 && char <= 0x0D7F,\n    // 'Sinhala': (char) => char >= 0x0D80 && char <= 0x0DFF,\n    // 'Thai': (char) => char >= 0x0E00 && char <= 0x0E7F,\n    // 'Lao': (char) => char >= 0x0E80 && char <= 0x0EFF,\n    // 'Tibetan': (char) => char >= 0x0F00 && char <= 0x0FFF,\n    // 'Myanmar': (char) => char >= 0x1000 && char <= 0x109F,\n    // 'Georgian': (char) => char >= 0x10A0 && char <= 0x10FF,\n    'Hangul Jamo': (char) => char >= 0x1100 && char <= 0x11FF,\n    // 'Ethiopic': (char) => char >= 0x1200 && char <= 0x137F,\n    // 'Ethiopic Supplement': (char) => char >= 0x1380 && char <= 0x139F,\n    // 'Cherokee': (char) => char >= 0x13A0 && char <= 0x13FF,\n    'Unified Canadian Aboriginal Syllabics': (char) => char >= 0x1400 && char <= 0x167F,\n    // 'Ogham': (char) => char >= 0x1680 && char <= 0x169F,\n    // 'Runic': (char) => char >= 0x16A0 && char <= 0x16FF,\n    // 'Tagalog': (char) => char >= 0x1700 && char <= 0x171F,\n    // 'Hanunoo': (char) => char >= 0x1720 && char <= 0x173F,\n    // 'Buhid': (char) => char >= 0x1740 && char <= 0x175F,\n    // 'Tagbanwa': (char) => char >= 0x1760 && char <= 0x177F,\n    'Khmer': (char) => char >= 0x1780 && char <= 0x17FF,\n    // 'Mongolian': (char) => char >= 0x1800 && char <= 0x18AF,\n    'Unified Canadian Aboriginal Syllabics Extended': (char) => char >= 0x18B0 && char <= 0x18FF,\n    // 'Limbu': (char) => char >= 0x1900 && char <= 0x194F,\n    // 'Tai Le': (char) => char >= 0x1950 && char <= 0x197F,\n    // 'New Tai Lue': (char) => char >= 0x1980 && char <= 0x19DF,\n    // 'Khmer Symbols': (char) => char >= 0x19E0 && char <= 0x19FF,\n    // 'Buginese': (char) => char >= 0x1A00 && char <= 0x1A1F,\n    // 'Tai Tham': (char) => char >= 0x1A20 && char <= 0x1AAF,\n    // 'Combining Diacritical Marks Extended': (char) => char >= 0x1AB0 && char <= 0x1AFF,\n    // 'Balinese': (char) => char >= 0x1B00 && char <= 0x1B7F,\n    // 'Sundanese': (char) => char >= 0x1B80 && char <= 0x1BBF,\n    // 'Batak': (char) => char >= 0x1BC0 && char <= 0x1BFF,\n    // 'Lepcha': (char) => char >= 0x1C00 && char <= 0x1C4F,\n    // 'Ol Chiki': (char) => char >= 0x1C50 && char <= 0x1C7F,\n    // 'Cyrillic Extended-C': (char) => char >= 0x1C80 && char <= 0x1C8F,\n    // 'Georgian Extended': (char) => char >= 0x1C90 && char <= 0x1CBF,\n    // 'Sundanese Supplement': (char) => char >= 0x1CC0 && char <= 0x1CCF,\n    // 'Vedic Extensions': (char) => char >= 0x1CD0 && char <= 0x1CFF,\n    // 'Phonetic Extensions': (char) => char >= 0x1D00 && char <= 0x1D7F,\n    // 'Phonetic Extensions Supplement': (char) => char >= 0x1D80 && char <= 0x1DBF,\n    // 'Combining Diacritical Marks Supplement': (char) => char >= 0x1DC0 && char <= 0x1DFF,\n    // 'Latin Extended Additional': (char) => char >= 0x1E00 && char <= 0x1EFF,\n    // 'Greek Extended': (char) => char >= 0x1F00 && char <= 0x1FFF,\n    'General Punctuation': (char) => char >= 0x2000 && char <= 0x206F,\n    // 'Superscripts and Subscripts': (char) => char >= 0x2070 && char <= 0x209F,\n    // 'Currency Symbols': (char) => char >= 0x20A0 && char <= 0x20CF,\n    // 'Combining Diacritical Marks for Symbols': (char) => char >= 0x20D0 && char <= 0x20FF,\n    'Letterlike Symbols': (char) => char >= 0x2100 && char <= 0x214F,\n    'Number Forms': (char) => char >= 0x2150 && char <= 0x218F,\n    // 'Arrows': (char) => char >= 0x2190 && char <= 0x21FF,\n    // 'Mathematical Operators': (char) => char >= 0x2200 && char <= 0x22FF,\n    'Miscellaneous Technical': (char) => char >= 0x2300 && char <= 0x23FF,\n    'Control Pictures': (char) => char >= 0x2400 && char <= 0x243F,\n    'Optical Character Recognition': (char) => char >= 0x2440 && char <= 0x245F,\n    'Enclosed Alphanumerics': (char) => char >= 0x2460 && char <= 0x24FF,\n    // 'Box Drawing': (char) => char >= 0x2500 && char <= 0x257F,\n    // 'Block Elements': (char) => char >= 0x2580 && char <= 0x259F,\n    'Geometric Shapes': (char) => char >= 0x25A0 && char <= 0x25FF,\n    'Miscellaneous Symbols': (char) => char >= 0x2600 && char <= 0x26FF,\n    // 'Dingbats': (char) => char >= 0x2700 && char <= 0x27BF,\n    // 'Miscellaneous Mathematical Symbols-A': (char) => char >= 0x27C0 && char <= 0x27EF,\n    // 'Supplemental Arrows-A': (char) => char >= 0x27F0 && char <= 0x27FF,\n    // 'Braille Patterns': (char) => char >= 0x2800 && char <= 0x28FF,\n    // 'Supplemental Arrows-B': (char) => char >= 0x2900 && char <= 0x297F,\n    // 'Miscellaneous Mathematical Symbols-B': (char) => char >= 0x2980 && char <= 0x29FF,\n    // 'Supplemental Mathematical Operators': (char) => char >= 0x2A00 && char <= 0x2AFF,\n    'Miscellaneous Symbols and Arrows': (char) => char >= 0x2B00 && char <= 0x2BFF,\n    // 'Glagolitic': (char) => char >= 0x2C00 && char <= 0x2C5F,\n    // 'Latin Extended-C': (char) => char >= 0x2C60 && char <= 0x2C7F,\n    // 'Coptic': (char) => char >= 0x2C80 && char <= 0x2CFF,\n    // 'Georgian Supplement': (char) => char >= 0x2D00 && char <= 0x2D2F,\n    // 'Tifinagh': (char) => char >= 0x2D30 && char <= 0x2D7F,\n    // 'Ethiopic Extended': (char) => char >= 0x2D80 && char <= 0x2DDF,\n    // 'Cyrillic Extended-A': (char) => char >= 0x2DE0 && char <= 0x2DFF,\n    // 'Supplemental Punctuation': (char) => char >= 0x2E00 && char <= 0x2E7F,\n    'CJK Radicals Supplement': (char) => char >= 0x2E80 && char <= 0x2EFF,\n    'Kangxi Radicals': (char) => char >= 0x2F00 && char <= 0x2FDF,\n    'Ideographic Description Characters': (char) => char >= 0x2FF0 && char <= 0x2FFF,\n    'CJK Symbols and Punctuation': (char) => char >= 0x3000 && char <= 0x303F,\n    'Hiragana': (char) => char >= 0x3040 && char <= 0x309F,\n    'Katakana': (char) => char >= 0x30A0 && char <= 0x30FF,\n    'Bopomofo': (char) => char >= 0x3100 && char <= 0x312F,\n    'Hangul Compatibility Jamo': (char) => char >= 0x3130 && char <= 0x318F,\n    'Kanbun': (char) => char >= 0x3190 && char <= 0x319F,\n    'Bopomofo Extended': (char) => char >= 0x31A0 && char <= 0x31BF,\n    'CJK Strokes': (char) => char >= 0x31C0 && char <= 0x31EF,\n    'Katakana Phonetic Extensions': (char) => char >= 0x31F0 && char <= 0x31FF,\n    'Enclosed CJK Letters and Months': (char) => char >= 0x3200 && char <= 0x32FF,\n    'CJK Compatibility': (char) => char >= 0x3300 && char <= 0x33FF,\n    'CJK Unified Ideographs Extension A': (char) => char >= 0x3400 && char <= 0x4DBF,\n    'Yijing Hexagram Symbols': (char) => char >= 0x4DC0 && char <= 0x4DFF,\n    'CJK Unified Ideographs': (char) => char >= 0x4E00 && char <= 0x9FFF,\n    'Yi Syllables': (char) => char >= 0xA000 && char <= 0xA48F,\n    'Yi Radicals': (char) => char >= 0xA490 && char <= 0xA4CF,\n    // 'Lisu': (char) => char >= 0xA4D0 && char <= 0xA4FF,\n    // 'Vai': (char) => char >= 0xA500 && char <= 0xA63F,\n    // 'Cyrillic Extended-B': (char) => char >= 0xA640 && char <= 0xA69F,\n    // 'Bamum': (char) => char >= 0xA6A0 && char <= 0xA6FF,\n    // 'Modifier Tone Letters': (char) => char >= 0xA700 && char <= 0xA71F,\n    // 'Latin Extended-D': (char) => char >= 0xA720 && char <= 0xA7FF,\n    // 'Syloti Nagri': (char) => char >= 0xA800 && char <= 0xA82F,\n    // 'Common Indic Number Forms': (char) => char >= 0xA830 && char <= 0xA83F,\n    // 'Phags-pa': (char) => char >= 0xA840 && char <= 0xA87F,\n    // 'Saurashtra': (char) => char >= 0xA880 && char <= 0xA8DF,\n    // 'Devanagari Extended': (char) => char >= 0xA8E0 && char <= 0xA8FF,\n    // 'Kayah Li': (char) => char >= 0xA900 && char <= 0xA92F,\n    // 'Rejang': (char) => char >= 0xA930 && char <= 0xA95F,\n    'Hangul Jamo Extended-A': (char) => char >= 0xA960 && char <= 0xA97F,\n    // 'Javanese': (char) => char >= 0xA980 && char <= 0xA9DF,\n    // 'Myanmar Extended-B': (char) => char >= 0xA9E0 && char <= 0xA9FF,\n    // 'Cham': (char) => char >= 0xAA00 && char <= 0xAA5F,\n    // 'Myanmar Extended-A': (char) => char >= 0xAA60 && char <= 0xAA7F,\n    // 'Tai Viet': (char) => char >= 0xAA80 && char <= 0xAADF,\n    // 'Meetei Mayek Extensions': (char) => char >= 0xAAE0 && char <= 0xAAFF,\n    // 'Ethiopic Extended-A': (char) => char >= 0xAB00 && char <= 0xAB2F,\n    // 'Latin Extended-E': (char) => char >= 0xAB30 && char <= 0xAB6F,\n    // 'Cherokee Supplement': (char) => char >= 0xAB70 && char <= 0xABBF,\n    // 'Meetei Mayek': (char) => char >= 0xABC0 && char <= 0xABFF,\n    'Hangul Syllables': (char) => char >= 0xAC00 && char <= 0xD7AF,\n    'Hangul Jamo Extended-B': (char) => char >= 0xD7B0 && char <= 0xD7FF,\n    // 'High Surrogates': (char) => char >= 0xD800 && char <= 0xDB7F,\n    // 'High Private Use Surrogates': (char) => char >= 0xDB80 && char <= 0xDBFF,\n    // 'Low Surrogates': (char) => char >= 0xDC00 && char <= 0xDFFF,\n    'Private Use Area': (char) => char >= 0xE000 && char <= 0xF8FF,\n    'CJK Compatibility Ideographs': (char) => char >= 0xF900 && char <= 0xFAFF,\n    // 'Alphabetic Presentation Forms': (char) => char >= 0xFB00 && char <= 0xFB4F,\n    'Arabic Presentation Forms-A': (char) => char >= 0xFB50 && char <= 0xFDFF,\n    // 'Variation Selectors': (char) => char >= 0xFE00 && char <= 0xFE0F,\n    'Vertical Forms': (char) => char >= 0xFE10 && char <= 0xFE1F,\n    // 'Combining Half Marks': (char) => char >= 0xFE20 && char <= 0xFE2F,\n    'CJK Compatibility Forms': (char) => char >= 0xFE30 && char <= 0xFE4F,\n    'Small Form Variants': (char) => char >= 0xFE50 && char <= 0xFE6F,\n    'Arabic Presentation Forms-B': (char) => char >= 0xFE70 && char <= 0xFEFF,\n    'Halfwidth and Fullwidth Forms': (char) => char >= 0xFF00 && char <= 0xFFEF,\n    // 'Specials': (char) => char >= 0xFFF0 && char <= 0xFFFF,\n    // 'Linear B Syllabary': (char) => char >= 0x10000 && char <= 0x1007F,\n    // 'Linear B Ideograms': (char) => char >= 0x10080 && char <= 0x100FF,\n    // 'Aegean Numbers': (char) => char >= 0x10100 && char <= 0x1013F,\n    // 'Ancient Greek Numbers': (char) => char >= 0x10140 && char <= 0x1018F,\n    // 'Ancient Symbols': (char) => char >= 0x10190 && char <= 0x101CF,\n    // 'Phaistos Disc': (char) => char >= 0x101D0 && char <= 0x101FF,\n    // 'Lycian': (char) => char >= 0x10280 && char <= 0x1029F,\n    // 'Carian': (char) => char >= 0x102A0 && char <= 0x102DF,\n    // 'Coptic Epact Numbers': (char) => char >= 0x102E0 && char <= 0x102FF,\n    // 'Old Italic': (char) => char >= 0x10300 && char <= 0x1032F,\n    // 'Gothic': (char) => char >= 0x10330 && char <= 0x1034F,\n    // 'Old Permic': (char) => char >= 0x10350 && char <= 0x1037F,\n    // 'Ugaritic': (char) => char >= 0x10380 && char <= 0x1039F,\n    // 'Old Persian': (char) => char >= 0x103A0 && char <= 0x103DF,\n    // 'Deseret': (char) => char >= 0x10400 && char <= 0x1044F,\n    // 'Shavian': (char) => char >= 0x10450 && char <= 0x1047F,\n    // 'Osmanya': (char) => char >= 0x10480 && char <= 0x104AF,\n    // 'Osage': (char) => char >= 0x104B0 && char <= 0x104FF,\n    // 'Elbasan': (char) => char >= 0x10500 && char <= 0x1052F,\n    // 'Caucasian Albanian': (char) => char >= 0x10530 && char <= 0x1056F,\n    // 'Linear A': (char) => char >= 0x10600 && char <= 0x1077F,\n    // 'Cypriot Syllabary': (char) => char >= 0x10800 && char <= 0x1083F,\n    // 'Imperial Aramaic': (char) => char >= 0x10840 && char <= 0x1085F,\n    // 'Palmyrene': (char) => char >= 0x10860 && char <= 0x1087F,\n    // 'Nabataean': (char) => char >= 0x10880 && char <= 0x108AF,\n    // 'Hatran': (char) => char >= 0x108E0 && char <= 0x108FF,\n    // 'Phoenician': (char) => char >= 0x10900 && char <= 0x1091F,\n    // 'Lydian': (char) => char >= 0x10920 && char <= 0x1093F,\n    // 'Meroitic Hieroglyphs': (char) => char >= 0x10980 && char <= 0x1099F,\n    // 'Meroitic Cursive': (char) => char >= 0x109A0 && char <= 0x109FF,\n    // 'Kharoshthi': (char) => char >= 0x10A00 && char <= 0x10A5F,\n    // 'Old South Arabian': (char) => char >= 0x10A60 && char <= 0x10A7F,\n    // 'Old North Arabian': (char) => char >= 0x10A80 && char <= 0x10A9F,\n    // 'Manichaean': (char) => char >= 0x10AC0 && char <= 0x10AFF,\n    // 'Avestan': (char) => char >= 0x10B00 && char <= 0x10B3F,\n    // 'Inscriptional Parthian': (char) => char >= 0x10B40 && char <= 0x10B5F,\n    // 'Inscriptional Pahlavi': (char) => char >= 0x10B60 && char <= 0x10B7F,\n    // 'Psalter Pahlavi': (char) => char >= 0x10B80 && char <= 0x10BAF,\n    // 'Old Turkic': (char) => char >= 0x10C00 && char <= 0x10C4F,\n    // 'Old Hungarian': (char) => char >= 0x10C80 && char <= 0x10CFF,\n    // 'Hanifi Rohingya': (char) => char >= 0x10D00 && char <= 0x10D3F,\n    // 'Rumi Numeral Symbols': (char) => char >= 0x10E60 && char <= 0x10E7F,\n    // 'Old Sogdian': (char) => char >= 0x10F00 && char <= 0x10F2F,\n    // 'Sogdian': (char) => char >= 0x10F30 && char <= 0x10F6F,\n    // 'Elymaic': (char) => char >= 0x10FE0 && char <= 0x10FFF,\n    // 'Brahmi': (char) => char >= 0x11000 && char <= 0x1107F,\n    // 'Kaithi': (char) => char >= 0x11080 && char <= 0x110CF,\n    // 'Sora Sompeng': (char) => char >= 0x110D0 && char <= 0x110FF,\n    // 'Chakma': (char) => char >= 0x11100 && char <= 0x1114F,\n    // 'Mahajani': (char) => char >= 0x11150 && char <= 0x1117F,\n    // 'Sharada': (char) => char >= 0x11180 && char <= 0x111DF,\n    // 'Sinhala Archaic Numbers': (char) => char >= 0x111E0 && char <= 0x111FF,\n    // 'Khojki': (char) => char >= 0x11200 && char <= 0x1124F,\n    // 'Multani': (char) => char >= 0x11280 && char <= 0x112AF,\n    // 'Khudawadi': (char) => char >= 0x112B0 && char <= 0x112FF,\n    // 'Grantha': (char) => char >= 0x11300 && char <= 0x1137F,\n    // 'Newa': (char) => char >= 0x11400 && char <= 0x1147F,\n    // 'Tirhuta': (char) => char >= 0x11480 && char <= 0x114DF,\n    // 'Siddham': (char) => char >= 0x11580 && char <= 0x115FF,\n    // 'Modi': (char) => char >= 0x11600 && char <= 0x1165F,\n    // 'Mongolian Supplement': (char) => char >= 0x11660 && char <= 0x1167F,\n    // 'Takri': (char) => char >= 0x11680 && char <= 0x116CF,\n    // 'Ahom': (char) => char >= 0x11700 && char <= 0x1173F,\n    // 'Dogra': (char) => char >= 0x11800 && char <= 0x1184F,\n    // 'Warang Citi': (char) => char >= 0x118A0 && char <= 0x118FF,\n    // 'Nandinagari': (char) => char >= 0x119A0 && char <= 0x119FF,\n    // 'Zanabazar Square': (char) => char >= 0x11A00 && char <= 0x11A4F,\n    // 'Soyombo': (char) => char >= 0x11A50 && char <= 0x11AAF,\n    // 'Pau Cin Hau': (char) => char >= 0x11AC0 && char <= 0x11AFF,\n    // 'Bhaiksuki': (char) => char >= 0x11C00 && char <= 0x11C6F,\n    // 'Marchen': (char) => char >= 0x11C70 && char <= 0x11CBF,\n    // 'Masaram Gondi': (char) => char >= 0x11D00 && char <= 0x11D5F,\n    // 'Gunjala Gondi': (char) => char >= 0x11D60 && char <= 0x11DAF,\n    // 'Makasar': (char) => char >= 0x11EE0 && char <= 0x11EFF,\n    // 'Tamil Supplement': (char) => char >= 0x11FC0 && char <= 0x11FFF,\n    // 'Cuneiform': (char) => char >= 0x12000 && char <= 0x123FF,\n    // 'Cuneiform Numbers and Punctuation': (char) => char >= 0x12400 && char <= 0x1247F,\n    // 'Early Dynastic Cuneiform': (char) => char >= 0x12480 && char <= 0x1254F,\n    // 'Egyptian Hieroglyphs': (char) => char >= 0x13000 && char <= 0x1342F,\n    // 'Egyptian Hieroglyph Format Controls': (char) => char >= 0x13430 && char <= 0x1343F,\n    // 'Anatolian Hieroglyphs': (char) => char >= 0x14400 && char <= 0x1467F,\n    // 'Bamum Supplement': (char) => char >= 0x16800 && char <= 0x16A3F,\n    // 'Mro': (char) => char >= 0x16A40 && char <= 0x16A6F,\n    // 'Bassa Vah': (char) => char >= 0x16AD0 && char <= 0x16AFF,\n    // 'Pahawh Hmong': (char) => char >= 0x16B00 && char <= 0x16B8F,\n    // 'Medefaidrin': (char) => char >= 0x16E40 && char <= 0x16E9F,\n    // 'Miao': (char) => char >= 0x16F00 && char <= 0x16F9F,\n    // 'Ideographic Symbols and Punctuation': (char) => char >= 0x16FE0 && char <= 0x16FFF,\n    // 'Tangut': (char) => char >= 0x17000 && char <= 0x187FF,\n    // 'Tangut Components': (char) => char >= 0x18800 && char <= 0x18AFF,\n    // 'Kana Supplement': (char) => char >= 0x1B000 && char <= 0x1B0FF,\n    // 'Kana Extended-A': (char) => char >= 0x1B100 && char <= 0x1B12F,\n    // 'Small Kana Extension': (char) => char >= 0x1B130 && char <= 0x1B16F,\n    // 'Nushu': (char) => char >= 0x1B170 && char <= 0x1B2FF,\n    // 'Duployan': (char) => char >= 0x1BC00 && char <= 0x1BC9F,\n    // 'Shorthand Format Controls': (char) => char >= 0x1BCA0 && char <= 0x1BCAF,\n    // 'Byzantine Musical Symbols': (char) => char >= 0x1D000 && char <= 0x1D0FF,\n    // 'Musical Symbols': (char) => char >= 0x1D100 && char <= 0x1D1FF,\n    // 'Ancient Greek Musical Notation': (char) => char >= 0x1D200 && char <= 0x1D24F,\n    // 'Mayan Numerals': (char) => char >= 0x1D2E0 && char <= 0x1D2FF,\n    // 'Tai Xuan Jing Symbols': (char) => char >= 0x1D300 && char <= 0x1D35F,\n    // 'Counting Rod Numerals': (char) => char >= 0x1D360 && char <= 0x1D37F,\n    // 'Mathematical Alphanumeric Symbols': (char) => char >= 0x1D400 && char <= 0x1D7FF,\n    // 'Sutton SignWriting': (char) => char >= 0x1D800 && char <= 0x1DAAF,\n    // 'Glagolitic Supplement': (char) => char >= 0x1E000 && char <= 0x1E02F,\n    // 'Nyiakeng Puachue Hmong': (char) => char >= 0x1E100 && char <= 0x1E14F,\n    // 'Wancho': (char) => char >= 0x1E2C0 && char <= 0x1E2FF,\n    // 'Mende Kikakui': (char) => char >= 0x1E800 && char <= 0x1E8DF,\n    // 'Adlam': (char) => char >= 0x1E900 && char <= 0x1E95F,\n    // 'Indic Siyaq Numbers': (char) => char >= 0x1EC70 && char <= 0x1ECBF,\n    // 'Ottoman Siyaq Numbers': (char) => char >= 0x1ED00 && char <= 0x1ED4F,\n    // 'Arabic Mathematical Alphabetic Symbols': (char) => char >= 0x1EE00 && char <= 0x1EEFF,\n    // 'Mahjong Tiles': (char) => char >= 0x1F000 && char <= 0x1F02F,\n    // 'Domino Tiles': (char) => char >= 0x1F030 && char <= 0x1F09F,\n    // 'Playing Cards': (char) => char >= 0x1F0A0 && char <= 0x1F0FF,\n    // 'Enclosed Alphanumeric Supplement': (char) => char >= 0x1F100 && char <= 0x1F1FF,\n    // 'Enclosed Ideographic Supplement': (char) => char >= 0x1F200 && char <= 0x1F2FF,\n    // 'Miscellaneous Symbols and Pictographs': (char) => char >= 0x1F300 && char <= 0x1F5FF,\n    // 'Emoticons': (char) => char >= 0x1F600 && char <= 0x1F64F,\n    // 'Ornamental Dingbats': (char) => char >= 0x1F650 && char <= 0x1F67F,\n    // 'Transport and Map Symbols': (char) => char >= 0x1F680 && char <= 0x1F6FF,\n    // 'Alchemical Symbols': (char) => char >= 0x1F700 && char <= 0x1F77F,\n    // 'Geometric Shapes Extended': (char) => char >= 0x1F780 && char <= 0x1F7FF,\n    // 'Supplemental Arrows-C': (char) => char >= 0x1F800 && char <= 0x1F8FF,\n    // 'Supplemental Symbols and Pictographs': (char) => char >= 0x1F900 && char <= 0x1F9FF,\n    // 'Chess Symbols': (char) => char >= 0x1FA00 && char <= 0x1FA6F,\n    // 'Symbols and Pictographs Extended-A': (char) => char >= 0x1FA70 && char <= 0x1FAFF,\n    'CJK Unified Ideographs Extension B': (char) => char >= 0x20000 && char <= 0x2A6DF,\n    // 'CJK Unified Ideographs Extension C': (char) => char >= 0x2A700 && char <= 0x2B73F,\n    // 'CJK Unified Ideographs Extension D': (char) => char >= 0x2B740 && char <= 0x2B81F,\n    // 'CJK Unified Ideographs Extension E': (char) => char >= 0x2B820 && char <= 0x2CEAF,\n    // 'CJK Unified Ideographs Extension F': (char) => char >= 0x2CEB0 && char <= 0x2EBEF,\n    // 'CJK Compatibility Ideographs Supplement': (char) => char >= 0x2F800 && char <= 0x2FA1F,\n    // 'Tags': (char) => char >= 0xE0000 && char <= 0xE007F,\n    // 'Variation Selectors Supplement': (char) => char >= 0xE0100 && char <= 0xE01EF,\n    // 'Supplementary Private Use Area-A': (char) => char >= 0xF0000 && char <= 0xFFFFF,\n    // 'Supplementary Private Use Area-B': (char) => char >= 0x100000 && char <= 0x10FFFF,\n};\n\nexport default unicodeBlockLookup;\n","// @flow\n\n/* eslint-disable new-cap */\n\nimport isChar from './is_char_in_unicode_block.js';\n\nexport function allowsIdeographicBreaking(chars: string): boolean {\n    for (const char of chars) {\n        if (!charAllowsIdeographicBreaking(char.charCodeAt(0))) return false;\n    }\n    return true;\n}\n\nexport function allowsVerticalWritingMode(chars: string): boolean {\n    for (const char of chars) {\n        if (charHasUprightVerticalOrientation(char.charCodeAt(0))) return true;\n    }\n    return false;\n}\n\nexport function allowsLetterSpacing(chars: string): boolean {\n    for (const char of chars) {\n        if (!charAllowsLetterSpacing(char.charCodeAt(0))) return false;\n    }\n    return true;\n}\n\nexport function charAllowsLetterSpacing(char: number): boolean {\n    if (isChar['Arabic'](char)) return false;\n    if (isChar['Arabic Supplement'](char)) return false;\n    if (isChar['Arabic Extended-A'](char)) return false;\n    if (isChar['Arabic Presentation Forms-A'](char)) return false;\n    if (isChar['Arabic Presentation Forms-B'](char)) return false;\n\n    return true;\n}\n\nexport function charAllowsIdeographicBreaking(char: number): boolean {\n    // Return early for characters outside all ideographic ranges.\n    if (char < 0x2E80) return false;\n\n    if (isChar['Bopomofo Extended'](char)) return true;\n    if (isChar['Bopomofo'](char)) return true;\n    if (isChar['CJK Compatibility Forms'](char)) return true;\n    if (isChar['CJK Compatibility Ideographs'](char)) return true;\n    if (isChar['CJK Compatibility'](char)) return true;\n    if (isChar['CJK Radicals Supplement'](char)) return true;\n    if (isChar['CJK Strokes'](char)) return true;\n    if (isChar['CJK Symbols and Punctuation'](char)) return true;\n    if (isChar['CJK Unified Ideographs Extension A'](char)) return true;\n    if (isChar['CJK Unified Ideographs'](char)) return true;\n    if (isChar['Enclosed CJK Letters and Months'](char)) return true;\n    if (isChar['Halfwidth and Fullwidth Forms'](char)) return true;\n    if (isChar['Hiragana'](char)) return true;\n    if (isChar['Ideographic Description Characters'](char)) return true;\n    if (isChar['Kangxi Radicals'](char)) return true;\n    if (isChar['Katakana Phonetic Extensions'](char)) return true;\n    if (isChar['Katakana'](char)) return true;\n    if (isChar['Vertical Forms'](char)) return true;\n    if (isChar['Yi Radicals'](char)) return true;\n    if (isChar['Yi Syllables'](char)) return true;\n\n    return false;\n}\n\n// The following logic comes from\n// <http://www.unicode.org/Public/12.0.0/ucd/VerticalOrientation.txt>.\n// Keep it synchronized with\n// <http://www.unicode.org/Public/UCD/latest/ucd/VerticalOrientation.txt>.\n// The data file denotes with “U” or “Tu” any codepoint that may be drawn\n// upright in vertical text but does not distinguish between upright and\n// “neutral” characters.\n\n// Blocks in the Unicode supplementary planes are excluded from this module due\n// to <https://github.com/mapbox/mapbox-gl/issues/29>.\n\n/**\n * Returns true if the given Unicode codepoint identifies a character with\n * upright orientation.\n *\n * A character has upright orientation if it is drawn upright (unrotated)\n * whether the line is oriented horizontally or vertically, even if both\n * adjacent characters can be rotated. For example, a Chinese character is\n * always drawn upright. An uprightly oriented character causes an adjacent\n * “neutral” character to be drawn upright as well.\n * @private\n */\nexport function charHasUprightVerticalOrientation(char: number): boolean {\n    if (char === 0x02EA /* modifier letter yin departing tone mark */ ||\n        char === 0x02EB /* modifier letter yang departing tone mark */) {\n        return true;\n    }\n\n    // Return early for characters outside all ranges whose characters remain\n    // upright in vertical writing mode.\n    if (char < 0x1100) return false;\n\n    if (isChar['Bopomofo Extended'](char)) return true;\n    if (isChar['Bopomofo'](char)) return true;\n    if (isChar['CJK Compatibility Forms'](char)) {\n        if (!((char >= 0xFE49 /* dashed overline */ && char <= 0xFE4F) /* wavy low line */)) {\n            return true;\n        }\n    }\n    if (isChar['CJK Compatibility Ideographs'](char)) return true;\n    if (isChar['CJK Compatibility'](char)) return true;\n    if (isChar['CJK Radicals Supplement'](char)) return true;\n    if (isChar['CJK Strokes'](char)) return true;\n    if (isChar['CJK Symbols and Punctuation'](char)) {\n        if (!((char >= 0x3008 /* left angle bracket */ && char <= 0x3011) /* right black lenticular bracket */) &&\n            !((char >= 0x3014 /* left tortoise shell bracket */ && char <= 0x301F) /* low double prime quotation mark */) &&\n            char !== 0x3030 /* wavy dash */) {\n            return true;\n        }\n    }\n    if (isChar['CJK Unified Ideographs Extension A'](char)) return true;\n    if (isChar['CJK Unified Ideographs'](char)) return true;\n    if (isChar['Enclosed CJK Letters and Months'](char)) return true;\n    if (isChar['Hangul Compatibility Jamo'](char)) return true;\n    if (isChar['Hangul Jamo Extended-A'](char)) return true;\n    if (isChar['Hangul Jamo Extended-B'](char)) return true;\n    if (isChar['Hangul Jamo'](char)) return true;\n    if (isChar['Hangul Syllables'](char)) return true;\n    if (isChar['Hiragana'](char)) return true;\n    if (isChar['Ideographic Description Characters'](char)) return true;\n    if (isChar['Kanbun'](char)) return true;\n    if (isChar['Kangxi Radicals'](char)) return true;\n    if (isChar['Katakana Phonetic Extensions'](char)) return true;\n    if (isChar['Katakana'](char)) {\n        if (char !== 0x30FC /* katakana-hiragana prolonged sound mark */) {\n            return true;\n        }\n    }\n    if (isChar['Halfwidth and Fullwidth Forms'](char)) {\n        if (char !== 0xFF08 /* fullwidth left parenthesis */ &&\n            char !== 0xFF09 /* fullwidth right parenthesis */ &&\n            char !== 0xFF0D /* fullwidth hyphen-minus */ &&\n            !((char >= 0xFF1A /* fullwidth colon */ && char <= 0xFF1E) /* fullwidth greater-than sign */) &&\n            char !== 0xFF3B /* fullwidth left square bracket */ &&\n            char !== 0xFF3D /* fullwidth right square bracket */ &&\n            char !== 0xFF3F /* fullwidth low line */ &&\n            !(char >= 0xFF5B /* fullwidth left curly bracket */ && char <= 0xFFDF) &&\n            char !== 0xFFE3 /* fullwidth macron */ &&\n            !(char >= 0xFFE8 /* halfwidth forms light vertical */ && char <= 0xFFEF)) {\n            return true;\n        }\n    }\n    if (isChar['Small Form Variants'](char)) {\n        if (!((char >= 0xFE58 /* small em dash */ && char <= 0xFE5E) /* small right tortoise shell bracket */) &&\n            !((char >= 0xFE63 /* small hyphen-minus */ && char <= 0xFE66) /* small equals sign */)) {\n            return true;\n        }\n    }\n    if (isChar['Unified Canadian Aboriginal Syllabics'](char)) return true;\n    if (isChar['Unified Canadian Aboriginal Syllabics Extended'](char)) return true;\n    if (isChar['Vertical Forms'](char)) return true;\n    if (isChar['Yijing Hexagram Symbols'](char)) return true;\n    if (isChar['Yi Syllables'](char)) return true;\n    if (isChar['Yi Radicals'](char)) return true;\n\n    return false;\n}\n\n/**\n * Returns true if the given Unicode codepoint identifies a character with\n * neutral orientation.\n *\n * A character has neutral orientation if it may be drawn rotated or unrotated\n * when the line is oriented vertically, depending on the orientation of the\n * adjacent characters. For example, along a verticlly oriented line, the vulgar\n * fraction ½ is drawn upright among Chinese characters but rotated among Latin\n * letters. A neutrally oriented character does not influence whether an\n * adjacent character is drawn upright or rotated.\n * @private\n */\nexport function charHasNeutralVerticalOrientation(char: number): boolean {\n    if (isChar['Latin-1 Supplement'](char)) {\n        if (char === 0x00A7 /* section sign */ ||\n            char === 0x00A9 /* copyright sign */ ||\n            char === 0x00AE /* registered sign */ ||\n            char === 0x00B1 /* plus-minus sign */ ||\n            char === 0x00BC /* vulgar fraction one quarter */ ||\n            char === 0x00BD /* vulgar fraction one half */ ||\n            char === 0x00BE /* vulgar fraction three quarters */ ||\n            char === 0x00D7 /* multiplication sign */ ||\n            char === 0x00F7 /* division sign */) {\n            return true;\n        }\n    }\n    if (isChar['General Punctuation'](char)) {\n        if (char === 0x2016 /* double vertical line */ ||\n            char === 0x2020 /* dagger */ ||\n            char === 0x2021 /* double dagger */ ||\n            char === 0x2030 /* per mille sign */ ||\n            char === 0x2031 /* per ten thousand sign */ ||\n            char === 0x203B /* reference mark */ ||\n            char === 0x203C /* double exclamation mark */ ||\n            char === 0x2042 /* asterism */ ||\n            char === 0x2047 /* double question mark */ ||\n            char === 0x2048 /* question exclamation mark */ ||\n            char === 0x2049 /* exclamation question mark */ ||\n            char === 0x2051 /* two asterisks aligned vertically */) {\n            return true;\n        }\n    }\n    if (isChar['Letterlike Symbols'](char)) return true;\n    if (isChar['Number Forms'](char)) return true;\n    if (isChar['Miscellaneous Technical'](char)) {\n        if ((char >= 0x2300 /* diameter sign */ && char <= 0x2307 /* wavy line */) ||\n            (char >= 0x230C /* bottom right crop */ && char <= 0x231F /* bottom right corner */) ||\n            (char >= 0x2324 /* up arrowhead between two horizontal bars */ && char <= 0x2328 /* keyboard */) ||\n            char === 0x232B /* erase to the left */ ||\n            (char >= 0x237D /* shouldered open box */ && char <= 0x239A /* clear screen symbol */) ||\n            (char >= 0x23BE /* dentistry symbol light vertical and top right */ && char <= 0x23CD /* square foot */) ||\n            char === 0x23CF /* eject symbol */ ||\n            (char >= 0x23D1 /* metrical breve */ && char <= 0x23DB /* fuse */) ||\n            (char >= 0x23E2 /* white trapezium */ && char <= 0x23FF)) {\n            return true;\n        }\n    }\n    if (isChar['Control Pictures'](char) && char !== 0x2423 /* open box */) return true;\n    if (isChar['Optical Character Recognition'](char)) return true;\n    if (isChar['Enclosed Alphanumerics'](char)) return true;\n    if (isChar['Geometric Shapes'](char)) return true;\n    if (isChar['Miscellaneous Symbols'](char)) {\n        if (!((char >= 0x261A /* black left pointing index */ && char <= 0x261F) /* white down pointing index */)) {\n            return true;\n        }\n    }\n    if (isChar['Miscellaneous Symbols and Arrows'](char)) {\n        if ((char >= 0x2B12 /* square with top half black */ && char <= 0x2B2F /* white vertical ellipse */) ||\n            (char >= 0x2B50 /* white medium star */ && char <= 0x2B59 /* heavy circled saltire */) ||\n            (char >= 0x2BB8 /* upwards white arrow from bar with horizontal bar */ && char <= 0x2BEB)) {\n            return true;\n        }\n    }\n    if (isChar['CJK Symbols and Punctuation'](char)) return true;\n    if (isChar['Katakana'](char)) return true;\n    if (isChar['Private Use Area'](char)) return true;\n    if (isChar['CJK Compatibility Forms'](char)) return true;\n    if (isChar['Small Form Variants'](char)) return true;\n    if (isChar['Halfwidth and Fullwidth Forms'](char)) return true;\n\n    if (char === 0x221E /* infinity */ ||\n        char === 0x2234 /* therefore */ ||\n        char === 0x2235 /* because */ ||\n        (char >= 0x2700 /* black safety scissors */ && char <= 0x2767 /* rotated floral heart bullet */) ||\n        (char >= 0x2776 /* dingbat negative circled digit one */ && char <= 0x2793 /* dingbat negative circled sans-serif number ten */) ||\n        char === 0xFFFC /* object replacement character */ ||\n        char === 0xFFFD /* replacement character */) {\n        return true;\n    }\n\n    return false;\n}\n\n/**\n * Returns true if the given Unicode codepoint identifies a character with\n * rotated orientation.\n *\n * A character has rotated orientation if it is drawn rotated when the line is\n * oriented vertically, even if both adjacent characters are upright. For\n * example, a Latin letter is drawn rotated along a vertical line. A rotated\n * character causes an adjacent “neutral” character to be drawn rotated as well.\n * @private\n */\nexport function charHasRotatedVerticalOrientation(char: number): boolean {\n    return !(charHasUprightVerticalOrientation(char) ||\n             charHasNeutralVerticalOrientation(char));\n}\n\nexport function charInComplexShapingScript(char: number): boolean {\n    return isChar['Arabic'](char) ||\n           isChar['Arabic Supplement'](char) ||\n           isChar['Arabic Extended-A'](char) ||\n           isChar['Arabic Presentation Forms-A'](char) ||\n           isChar['Arabic Presentation Forms-B'](char);\n}\n\nexport function charInRTLScript(char: number): boolean {\n    // Main blocks for Hebrew, Arabic, Thaana and other RTL scripts\n    return (char >= 0x0590 && char <= 0x08FF) ||\n        isChar['Arabic Presentation Forms-A'](char) ||\n        isChar['Arabic Presentation Forms-B'](char);\n}\n\nexport function charInSupportedScript(char: number, canRenderRTL: boolean): boolean {\n    // This is a rough heuristic: whether we \"can render\" a script\n    // actually depends on the properties of the font being used\n    // and whether differences from the ideal rendering are considered\n    // semantically significant.\n\n    // Even in Latin script, we \"can't render\" combinations such as the fi\n    // ligature, but we don't consider that semantically significant.\n    if (!canRenderRTL && charInRTLScript(char)) {\n        return false;\n    }\n    if ((char >= 0x0900 && char <= 0x0DFF) ||\n        // Main blocks for Indic scripts and Sinhala\n        (char >= 0x0F00 && char <= 0x109F) ||\n        // Main blocks for Tibetan and Myanmar\n        isChar['Khmer'](char)) {\n        // These blocks cover common scripts that require\n        // complex text shaping, based on unicode script metadata:\n        // http://www.unicode.org/repos/cldr/trunk/common/properties/scriptMetadata.txt\n        // where \"Web Rank <= 32\" \"Shaping Required = YES\"\n        return false;\n    }\n    return true;\n}\n\nexport function stringContainsRTLText(chars: string): boolean {\n    for (const char of chars) {\n        if (charInRTLScript(char.charCodeAt(0))) {\n            return true;\n        }\n    }\n    return false;\n}\n\nexport function isStringInSupportedScript(chars: string, canRenderRTL: boolean): boolean {\n    for (const char of chars) {\n        if (!charInSupportedScript(char.charCodeAt(0), canRenderRTL)) {\n            return false;\n        }\n    }\n    return true;\n}\n","// @flow\n\nimport {Event, Evented} from '../util/evented.js';\nimport {getArrayBuffer} from '../util/ajax.js';\nimport browser from '../util/browser.js';\nimport assert from 'assert';\nimport {isWorker} from '../util/util.js';\nimport type {Callback} from '../types/callback.js';\n\nconst status = {\n    unavailable: 'unavailable', // Not loaded\n    deferred: 'deferred', // The plugin URL has been specified, but loading has been deferred\n    loading: 'loading', // request in-flight\n    loaded: 'loaded',\n    error: 'error'\n};\n\nexport type PluginStatus = $Values<typeof status>\n\nexport type PluginState = {\n    pluginStatus: PluginStatus;\n    pluginURL: ?string\n};\n\ntype PluginStateSyncCallback = (state: PluginState) => void;\nlet _completionCallback = null;\n\n//Variables defining the current state of the plugin\nlet pluginStatus: PluginStatus = status.unavailable;\nlet pluginURL: ?string = null;\n\nexport const triggerPluginCompletionEvent = function(error: ?Error) {\n    // NetworkError's are not correctly reflected by the plugin status which prevents reloading plugin\n    if (error && typeof error === 'string' && error.indexOf('NetworkError') > -1) {\n        pluginStatus = status.error;\n    }\n\n    if (_completionCallback) {\n        _completionCallback(error);\n    }\n};\n\nfunction sendPluginStateToWorker() {\n    evented.fire(new Event('pluginStateChange', {pluginStatus, pluginURL}));\n}\n\nexport const evented: Evented = new Evented();\n\nexport const getRTLTextPluginStatus = function (): PluginStatus {\n    return pluginStatus;\n};\n\nexport const registerForPluginStateChange = function(callback: PluginStateSyncCallback): PluginStateSyncCallback {\n    // Do an initial sync of the state\n    callback({pluginStatus, pluginURL});\n    // Listen for all future state changes\n    evented.on('pluginStateChange', callback);\n    return callback;\n};\n\nexport const clearRTLTextPlugin = function() {\n    pluginStatus = status.unavailable;\n    pluginURL = null;\n};\n\nexport const setRTLTextPlugin = function(url: string, callback: ?Callback<{err: ?Error}>, deferred: boolean = false) {\n    if (pluginStatus === status.deferred || pluginStatus === status.loading || pluginStatus === status.loaded) {\n        throw new Error('setRTLTextPlugin cannot be called multiple times.');\n    }\n    pluginURL = browser.resolveURL(url);\n    pluginStatus = status.deferred;\n    _completionCallback = callback;\n    sendPluginStateToWorker();\n\n    //Start downloading the plugin immediately if not intending to lazy-load\n    if (!deferred) {\n        downloadRTLTextPlugin();\n    }\n};\n\nexport const downloadRTLTextPlugin = function() {\n    if (pluginStatus !== status.deferred || !pluginURL) {\n        throw new Error('rtl-text-plugin cannot be downloaded unless a pluginURL is specified');\n    }\n    pluginStatus = status.loading;\n    sendPluginStateToWorker();\n    if (pluginURL) {\n        getArrayBuffer({url: pluginURL}, (error) => {\n            if (error) {\n                triggerPluginCompletionEvent(error);\n            } else {\n                pluginStatus = status.loaded;\n                sendPluginStateToWorker();\n            }\n        });\n    }\n};\n\nexport const plugin: {\n    applyArabicShaping: ?Function,\n    processBidirectionalText: ?(string, Array<number>) => Array<string>,\n    processStyledBidirectionalText: ?(string, Array<number>, Array<number>) => Array<[string, Array<number>]>,\n    isLoaded: () => boolean,\n    isLoading: () => boolean,\n    setState: (state: PluginState) => void,\n    isParsed: () => boolean,\n    getPluginURL: () => ?string\n} = {\n    applyArabicShaping: null,\n    processBidirectionalText: null,\n    processStyledBidirectionalText: null,\n    isLoaded() {\n        return pluginStatus === status.loaded || // Main Thread: loaded if the completion callback returned successfully\n            plugin.applyArabicShaping != null; // Web-worker: loaded if the plugin functions have been compiled\n    },\n    isLoading() { // Main Thread Only: query the loading status, this function does not return the correct value in the worker context.\n        return pluginStatus === status.loading;\n    },\n    setState(state: PluginState) { // Worker thread only: this tells the worker threads that the plugin is available on the Main thread\n        assert(isWorker(), 'Cannot set the state of the rtl-text-plugin when not in the web-worker context');\n\n        pluginStatus = state.pluginStatus;\n        pluginURL = state.pluginURL;\n    },\n    isParsed(): boolean {\n        assert(isWorker(), 'rtl-text-plugin is only parsed on the worker-threads');\n\n        return plugin.applyArabicShaping != null &&\n            plugin.processBidirectionalText != null &&\n            plugin.processStyledBidirectionalText != null;\n    },\n    getPluginURL(): ?string {\n        assert(isWorker(), 'rtl-text-plugin url can only be queried from the worker threads');\n        return pluginURL;\n    }\n};\n\nexport const lazyLoadRTLTextPlugin = function() {\n    if (!plugin.isLoading() &&\n        !plugin.isLoaded() &&\n        getRTLTextPluginStatus() === 'deferred'\n    ) {\n        downloadRTLTextPlugin();\n    }\n};\n","// @flow\n\nimport {isStringInSupportedScript} from '../util/script_detection.js';\nimport {plugin as rtlTextPlugin} from '../source/rtl_text_plugin.js';\n\nimport type {TransitionSpecification} from '../style-spec/types.js';\n\nclass EvaluationParameters {\n    zoom: number;\n    pitch: number | void;\n    now: number;\n    fadeDuration: number;\n    transition: TransitionSpecification;\n    brightness: number | void;\n\n    // \"options\" may also be another EvaluationParameters to copy\n    constructor(zoom: number, options?: any) {\n        this.zoom = zoom;\n\n        if (options) {\n            this.now = options.now;\n            this.fadeDuration = options.fadeDuration;\n            this.transition = options.transition;\n            this.pitch = options.pitch;\n            this.brightness = options.brightness;\n        } else {\n            this.now = 0;\n            this.fadeDuration = 0;\n            this.transition = {};\n            this.pitch = 0;\n            this.brightness = 0;\n        }\n    }\n\n    isSupportedScript(str: string): boolean {\n        return isStringInSupportedScript(str, rtlTextPlugin.isLoaded());\n    }\n}\n\nexport default EvaluationParameters;\n","// @flow\n\nimport assert from 'assert';\nimport type {Direction, Position} from '../util/util.js';\nimport {clone, extend, endsWith, easeCubicInOut, sphericalDirectionToCartesian, sphericalPositionToCartesian} from '../util/util.js';\nimport * as interpolate from '../style-spec/util/interpolate.js';\nimport {number as interpolateValue} from '../style-spec/util/interpolate.js';\nimport {normalizePropertyExpression} from '../style-spec/expression/index.js';\nimport Color from '../style-spec/util/color.js';\nimport {register} from '../util/web_worker_transfer.js';\nimport EvaluationParameters from './evaluation_parameters.js';\nimport type {CanonicalTileID} from '../source/tile_id.js';\nimport type {StylePropertySpecification} from '../style-spec/style-spec.js';\nimport type {\n    TransitionSpecification,\n    PropertyValueSpecification\n} from '../style-spec/types.js';\n\nimport type {\n    Feature,\n    FeatureState,\n    StylePropertyExpression,\n    SourceExpression,\n    CompositeExpression\n} from '../style-spec/expression/index.js';\nimport type {Expression} from '../style-spec/expression/expression.js';\nimport type {ObjMap} from '../types/obj-map.js';\n\ntype TimePoint = number;\n\n/**\n * Implements a number of classes that define state and behavior for paint and layout properties, most\n * importantly their respective evaluation chains:\n *\n *       Transitionable paint property value\n *     → Transitioning paint property value\n *     → Possibly evaluated paint property value\n *     → Fully evaluated paint property value\n *\n *       Layout property value\n *     → Possibly evaluated layout property value\n *     → Fully evaluated layout property value\n *\n * @module\n * @private\n */\n\n/**\n *  Implementations of the `Property` interface:\n *\n *  * Hold metadata about a property that's independent of any specific value: stuff like the type of the value,\n *    the default value, etc. This comes from the style specification JSON.\n *  * Define behavior that needs to be polymorphic across different properties: \"possibly evaluating\"\n *    an input value (see below), and interpolating between two possibly-evaluted values.\n *\n *  The type `T` is the fully-evaluated value type (e.g. `number`, `string`, `Color`).\n *  The type `R` is the intermediate \"possibly evaluated\" value type. See below.\n *\n *  There are two main implementations of the interface -- one for properties that allow data-driven values,\n *  and one for properties that don't. There are a few \"special case\" implementations as well:\n *  one for `heatmap-color` and `line-gradient`, and one for `light-position`.\n *\n * @private\n */\nexport interface Property<T, R> {\n    specification: StylePropertySpecification;\n    possiblyEvaluate(value: PropertyValue<T, R>, parameters: EvaluationParameters, canonical?: CanonicalTileID, availableImages?: Array<string>): R;\n    interpolate(a: R, b: R, t: number): R;\n}\n\nexport type ConfigOptionValue = {\n    default: Expression;\n    value?: Expression;\n    values?: Array<mixed>;\n    minValue?: number;\n    maxValue?: number;\n    stepValue?: number;\n    type?: 'string' | 'number' | 'boolean' | 'color';\n};\nexport type ConfigOptions = Map<string, ConfigOptionValue>;\n\n/**\n *  `PropertyValue` represents the value part of a property key-value unit. It's used to represent both\n *  paint and layout property values, and regardless of whether or not their property supports data-driven\n *  expressions.\n *\n *  `PropertyValue` stores the raw input value as seen in a style or a runtime styling API call, i.e. one of the\n *  following:\n *\n *    * A constant value of the type appropriate for the property\n *    * A function which produces a value of that type (but functions are quasi-deprecated in favor of expressions)\n *    * An expression which produces a value of that type\n *    * \"undefined\"/\"not present\", in which case the property is assumed to take on its default value.\n *\n *  In addition to storing the original input value, `PropertyValue` also stores a normalized representation,\n *  effectively treating functions as if they are expressions, and constant or default values as if they are\n *  (constant) expressions.\n *\n *  @private\n */\nexport class PropertyValue<T, R> {\n    property: Property<T, R>;\n    value: PropertyValueSpecification<T> | void;\n    expression: StylePropertyExpression;\n\n    constructor(property: Property<T, R>, value: PropertyValueSpecification<T> | void, scope?: ?string, options?: ?ConfigOptions) {\n        this.property = property;\n        this.value = value;\n        this.expression = normalizePropertyExpression(value === undefined ? property.specification.default : value, property.specification, scope, options);\n    }\n\n    isDataDriven(): boolean {\n        return this.expression.kind === 'source' || this.expression.kind === 'composite';\n    }\n\n    possiblyEvaluate(parameters: EvaluationParameters, canonical?: CanonicalTileID, availableImages?: Array<string>): R {\n        return this.property.possiblyEvaluate(this, parameters, canonical, availableImages);\n    }\n}\n\n// ------- Transitionable -------\n\nexport type TransitionParameters = interface {\n    now: TimePoint,\n    transition: TransitionSpecification,\n};\n\n/**\n * Paint properties are _transitionable_: they can change in a fluid manner, interpolating or cross-fading between\n * old and new value. The duration of the transition, and the delay before it begins, is configurable.\n *\n * `TransitionablePropertyValue` is a compositional class that stores both the property value and that transition\n * configuration.\n *\n * A `TransitionablePropertyValue` can calculate the next step in the evaluation chain for paint property values:\n * `TransitioningPropertyValue`.\n *\n * @private\n */\nclass TransitionablePropertyValue<T, R> {\n    property: Property<T, R>;\n    value: PropertyValue<T, R>;\n    transition: TransitionSpecification | void;\n\n    constructor(property: Property<T, R>, scope?: ?string, options?: ?ConfigOptions) {\n        this.property = property;\n        this.value = new PropertyValue(property, undefined, scope, options);\n    }\n\n    transitioned(parameters: TransitionParameters,\n                 prior: TransitioningPropertyValue<T, R>): TransitioningPropertyValue<T, R> {\n        return new TransitioningPropertyValue(this.property, this.value, prior, // eslint-disable-line no-use-before-define\n            extend({}, parameters.transition, this.transition), parameters.now);\n    }\n\n    untransitioned(): TransitioningPropertyValue<T, R> {\n        return new TransitioningPropertyValue(this.property, this.value, null, {}, 0); // eslint-disable-line no-use-before-define\n    }\n}\n\n/**\n * A helper type: given an object type `Properties` whose values are each of type `Property<T, R>`, it calculates\n * an object type with the same keys and values of type `TransitionablePropertyValue<T, R>`.\n *\n * @private\n */\ntype TransitionablePropertyValues<Props: {[string]: any}>\n    = $Exact<ObjMap<Props, <T, R>(p: Property<T, R>) => TransitionablePropertyValue<T, R>>>\n\n/**\n * `Transitionable` stores a map of all (property name, `TransitionablePropertyValue`) pairs for paint properties of a\n * given layer type. It can calculate the `TransitioningPropertyValue`s for all of them at once, producing a\n * `Transitioning` instance for the same set of properties.\n *\n * @private\n */\nexport class Transitionable<Props: {[string]: any}> {\n    _properties: Properties<Props>;\n    _values: TransitionablePropertyValues<Props>;\n    _scope: ?string;\n    _options: ?ConfigOptions;\n    isConfigDependent: boolean;\n\n    constructor(properties: Properties<Props>, scope?: ?string, options?: ?ConfigOptions) {\n        this._properties = properties;\n        this._values = (Object.create(properties.defaultTransitionablePropertyValues): any);\n        this._scope = scope;\n        this._options = options;\n        this.isConfigDependent = false;\n    }\n\n    getValue<S: string, T: any>(name: S): PropertyValueSpecification<T> | void {\n        // $FlowFixMe[incompatible-return]\n        return clone(this._values[name].value.value);\n    }\n\n    setValue<S: string, T>(name: S, value: PropertyValueSpecification<T> | void) {\n        if (!this._values.hasOwnProperty(name)) {\n            this._values[name] = new TransitionablePropertyValue(this._values[name].property, this._scope, this._options);\n        }\n        // Note that we do not _remove_ an own property in the case where a value is being reset\n        // to the default: the transition might still be non-default.\n        this._values[name].value = new PropertyValue(this._values[name].property, value === null ? undefined : clone(value), this._scope, this._options);\n        this.isConfigDependent = this.isConfigDependent || this._values[name].value.expression.isConfigDependent;\n    }\n\n    setTransitionOrValue<P: {[string]: any} | void>(properties: ?P, options?: ?ConfigOptions) {\n        if (options) this._options = options;\n\n        const specProperties = this._properties.properties;\n        if (properties) {\n            for (const name in properties) {\n                const value = properties[name];\n                if (endsWith(name, '-transition')) {\n                    const propName = name.slice(0, -'-transition'.length);\n                    if (specProperties[propName]) {\n                        this.setTransition(propName, value);\n                    }\n                } else if (specProperties[name]) { // skip unrecognized properties\n                    this.setValue(name, value);\n                }\n            }\n        }\n    }\n\n    getTransition<S: string>(name: S): TransitionSpecification | void {\n        return clone(this._values[name].transition);\n    }\n\n    setTransition<S: string>(name: S, value: TransitionSpecification | void) {\n        if (!this._values.hasOwnProperty(name)) {\n            this._values[name] = new TransitionablePropertyValue(this._values[name].property);\n        }\n        this._values[name].transition = clone(value) || undefined;\n    }\n\n    serialize(): PropertyValueSpecifications<Props> {\n        const result: Object = {};\n        for (const property of Object.keys(this._values)) {\n            const value = this.getValue(property);\n            if (value !== undefined) {\n                result[property] = value;\n            }\n\n            const transition = this.getTransition(property);\n            if (transition !== undefined) {\n                result[`${property}-transition`] = transition;\n            }\n        }\n        return result;\n    }\n\n    transitioned(parameters: TransitionParameters, prior: Transitioning<Props>): Transitioning<Props> {\n        const result = new Transitioning(this._properties); // eslint-disable-line no-use-before-define\n        for (const property of Object.keys(this._values)) {\n            result._values[property] = this._values[property].transitioned(parameters, prior._values[property]);\n        }\n        return result;\n    }\n\n    untransitioned(): Transitioning<Props> {\n        const result = new Transitioning(this._properties); // eslint-disable-line no-use-before-define\n        for (const property of Object.keys(this._values)) {\n            result._values[property] = this._values[property].untransitioned();\n        }\n        return result;\n    }\n}\n\n// ------- Transitioning -------\n\n/**\n * `TransitioningPropertyValue` implements the first of two intermediate steps in the evaluation chain of a paint\n * property value. In this step, transitions between old and new values are handled: as long as the transition is in\n * progress, `TransitioningPropertyValue` maintains a reference to the prior value, and interpolates between it and\n * the new value based on the current time and the configured transition duration and delay. The product is the next\n * step in the evaluation chain: the \"possibly evaluated\" result type `R`. See below for more on this concept.\n *\n * @private\n */\nclass TransitioningPropertyValue<T, R> {\n    property: Property<T, R>;\n    value: PropertyValue<T, R>;\n    prior: ?TransitioningPropertyValue<T, R>;\n    begin: TimePoint;\n    end: TimePoint;\n\n    constructor(property: Property<T, R>,\n                value: PropertyValue<T, R>,\n                prior: ?TransitioningPropertyValue<T, R>,\n                transition: TransitionSpecification,\n                now: TimePoint) {\n        const delay = transition.delay || 0;\n        const duration = transition.duration || 0;\n        now = now || 0;\n        this.property = property;\n        this.value = value;\n        this.begin = now + delay;\n        this.end = this.begin + duration;\n        if (property.specification.transition && (transition.delay || transition.duration)) {\n            this.prior = prior;\n        }\n    }\n\n    possiblyEvaluate(parameters: EvaluationParameters, canonical: CanonicalTileID | void, availableImages: Array<string> | void): R {\n        const now = parameters.now || 0;\n        const finalValue = this.value.possiblyEvaluate(parameters, canonical, availableImages);\n        const prior = this.prior;\n        if (!prior) {\n            // No prior value.\n            return finalValue;\n        } else if (now > this.end) {\n            // Transition from prior value is now complete.\n            this.prior = null;\n            return finalValue;\n        } else if (this.value.isDataDriven()) {\n            // Transitions to data-driven properties are not supported.\n            // We snap immediately to the data-driven value so that, when we perform layout,\n            // we see the data-driven function and can use it to populate vertex buffers.\n            this.prior = null;\n            return finalValue;\n        } else if (now < this.begin) {\n            // Transition hasn't started yet.\n            return prior.possiblyEvaluate(parameters, canonical, availableImages);\n        } else {\n            // Interpolate between recursively-calculated prior value and final.\n            const t = (now - this.begin) / (this.end - this.begin);\n            return this.property.interpolate(prior.possiblyEvaluate(parameters, canonical, availableImages), finalValue, easeCubicInOut(t));\n        }\n    }\n}\n\n/**\n * A helper type: given an object type `Properties` whose values are each of type `Property<T, R>`, it calculates\n * an object type with the same keys and values of type `TransitioningPropertyValue<T, R>`.\n *\n * @private\n */\ntype TransitioningPropertyValues<Props: {[string]: any}>\n    = $Exact<ObjMap<Props, <T, R>(p: Property<T, R>) => TransitioningPropertyValue<T, R>>>\n\n/**\n * `Transitioning` stores a map of all (property name, `TransitioningPropertyValue`) pairs for paint properties of a\n * given layer type. It can calculate the possibly-evaluated values for all of them at once, producing a\n * `PossiblyEvaluated` instance for the same set of properties.\n *\n * @private\n */\nexport class Transitioning<Props: {[string]: any}> {\n    _properties: Properties<Props>;\n    _values: TransitioningPropertyValues<Props>;\n\n    constructor(properties: Properties<Props>) {\n        this._properties = properties;\n        this._values = (Object.create(properties.defaultTransitioningPropertyValues): any);\n    }\n\n    possiblyEvaluate(parameters: EvaluationParameters, canonical?: CanonicalTileID, availableImages?: Array<string>): PossiblyEvaluated<Props> {\n        const result = new PossiblyEvaluated(this._properties); // eslint-disable-line no-use-before-define\n        for (const property of Object.keys(this._values)) {\n            result._values[property] = this._values[property].possiblyEvaluate(parameters, canonical, availableImages);\n        }\n        return result;\n    }\n\n    hasTransition(): boolean {\n        for (const property of Object.keys(this._values)) {\n            if (this._values[property].prior) {\n                return true;\n            }\n        }\n        return false;\n    }\n}\n\n// ------- Layout -------\n\n/**\n * A helper type: given an object type `Properties` whose values are each of type `Property<T, R>`, it calculates\n * an object type with the same keys and values of type `PropertyValue<T, R>`.\n *\n * @private\n */\ntype PropertyValues<Props: {[string]: any}>\n    = $Exact<ObjMap<Props, <T, R>(p: Property<T, R>) => PropertyValue<T, R>>>\n\n/**\n * A helper type: given an object type `Properties` whose values are each of type `Property<T, R>`, it calculates\n * an object type with the same keys and values of type `PropertyValueSpecification<T>`.\n *\n * @private\n */\ntype PropertyValueSpecifications<Props: {[string]: any}>\n    = $Exact<ObjMap<Props, <T, R>(p: Property<T, R>) => PropertyValueSpecification<T>>>\n\n/**\n * Because layout properties are not transitionable, they have a simpler representation and evaluation chain than\n * paint properties: `PropertyValue`s are possibly evaluated, producing possibly evaluated values, which are then\n * fully evaluated.\n *\n * `Layout` stores a map of all (property name, `PropertyValue`) pairs for layout properties of a\n * given layer type. It can calculate the possibly-evaluated values for all of them at once, producing a\n * `PossiblyEvaluated` instance for the same set of properties.\n *\n * @private\n */\nexport class Layout<Props: {[string]: any}> {\n    _properties: Properties<Props>;\n    _values: PropertyValues<Props>;\n    _scope: string;\n    _options: ?ConfigOptions;\n    isConfigDependent: boolean;\n\n    constructor(properties: Properties<Props>, scope: string, options?: ?ConfigOptions) {\n        this._properties = properties;\n        this._values = (Object.create(properties.defaultPropertyValues): any);\n        this._scope = scope;\n        this._options = options;\n        this.isConfigDependent = false;\n    }\n\n    getValue<S: string, T>(name: S): PropertyValueSpecification<T> | void {\n        return clone(this._values[name].value);\n    }\n\n    setValue<S: string>(name: S, value: any) {\n        this._values[name] = new PropertyValue(this._values[name].property, value === null ? undefined : clone(value), this._scope, this._options);\n        this.isConfigDependent = this.isConfigDependent || this._values[name].expression.isConfigDependent;\n    }\n\n    serialize(): PropertyValueSpecifications<Props> {\n        const result: any = {};\n        for (const property of Object.keys(this._values)) {\n            const value = this.getValue(property);\n            if (value !== undefined) {\n                result[property] = value;\n            }\n        }\n        return result;\n    }\n\n    possiblyEvaluate(parameters: EvaluationParameters, canonical?: CanonicalTileID, availableImages?: Array<string>): PossiblyEvaluated<Props> {\n        const result = new PossiblyEvaluated(this._properties); // eslint-disable-line no-use-before-define\n        for (const property of Object.keys(this._values)) {\n            result._values[property] = this._values[property].possiblyEvaluate(parameters, canonical, availableImages);\n        }\n        return result;\n    }\n}\n\n// ------- PossiblyEvaluated -------\n\n/**\n * \"Possibly evaluated value\" is an intermediate stage in the evaluation chain for both paint and layout property\n * values. The purpose of this stage is to optimize away unnecessary recalculations for data-driven properties. Code\n * which uses data-driven property values must assume that the value is dependent on feature data, and request that it\n * be evaluated for each feature. But when that property value is in fact a constant or camera function, the calculation\n * will not actually depend on the feature, and we can benefit from returning the prior result of having done the\n * evaluation once, ahead of time, in an intermediate step whose inputs are just the value and \"global\" parameters\n * such as current zoom level.\n *\n * `PossiblyEvaluatedValue` represents the three possible outcomes of this step: if the input value was a constant or\n * camera expression, then the \"possibly evaluated\" result is a constant value. Otherwise, the input value was either\n * a source or composite expression, and we must defer final evaluation until supplied a feature. We separate\n * the source and composite cases because they are handled differently when generating GL attributes, buffers, and\n * uniforms.\n *\n * Note that `PossiblyEvaluatedValue` (and `PossiblyEvaluatedPropertyValue`, below) are _not_ used for properties that\n * do not allow data-driven values. For such properties, we know that the \"possibly evaluated\" result is always a constant\n * scalar value. See below.\n *\n * @private\n */\nexport type PossiblyEvaluatedValue<T> =\n    | {kind: 'constant', value: T}\n    | SourceExpression\n    | CompositeExpression;\n\n/**\n * `PossiblyEvaluatedPropertyValue` is used for data-driven paint and layout property values. It holds a\n * `PossiblyEvaluatedValue` and the `GlobalProperties` that were used to generate it. You're not allowed to supply\n * a different set of `GlobalProperties` when performing the final evaluation because they would be ignored in the\n * case where the input value was a constant or camera function.\n *\n * @private\n */\nexport class PossiblyEvaluatedPropertyValue<T> {\n    property: DataDrivenProperty<T>;\n    value: PossiblyEvaluatedValue<T>;\n    parameters: EvaluationParameters;\n\n    constructor(property: DataDrivenProperty<T>, value: PossiblyEvaluatedValue<T>, parameters: EvaluationParameters) {\n        this.property = property;\n        this.value = value;\n        this.parameters = parameters;\n    }\n\n    isConstant(): boolean {\n        return this.value.kind === 'constant';\n    }\n\n    constantOr(value: T): T {\n        if (this.value.kind === 'constant') {\n            return this.value.value;\n        } else {\n            return value;\n        }\n    }\n\n    evaluate(feature: Feature, featureState: FeatureState, canonical?: CanonicalTileID, availableImages?: Array<string>): T {\n        return this.property.evaluate(this.value, this.parameters, feature, featureState, canonical, availableImages);\n    }\n}\n\n/**\n * A helper type: given an object type `Properties` whose values are each of type `Property<T, R>`, it calculates\n * an object type with the same keys, and values of type `R`.\n *\n * For properties that don't allow data-driven values, `R` is a scalar type such as `number`, `string`, or `Color`.\n * For data-driven properties, it is `PossiblyEvaluatedPropertyValue`. Critically, the type definitions are set up\n * in a way that allows flow to know which of these two cases applies for any given property name, and if you attempt\n * to use a `PossiblyEvaluatedPropertyValue` as if it was a scalar, or vice versa, you will get a type error. (However,\n * there's at least one case in which flow fails to produce a type error that you should be aware of: in a context such\n * as `layer.paint.get('foo-opacity') === 0`, if `foo-opacity` is data-driven, than the left-hand side is of type\n * `PossiblyEvaluatedPropertyValue<number>`, but flow will not complain about comparing this to a number using `===`.\n * See https://github.com/facebook/flow/issues/2359.)\n *\n * @private\n */\ntype PossiblyEvaluatedPropertyValues<Props: {[string]: any}>\n    = $Exact<ObjMap<Props, <T, R>(p: Property<T, R>) => R>>\n\n/**\n * `PossiblyEvaluated` stores a map of all (property name, `R`) pairs for paint or layout properties of a\n * given layer type.\n * @private\n */\nexport class PossiblyEvaluated<Props: {[string]: any}> {\n    _properties: Properties<Props>;\n    _values: PossiblyEvaluatedPropertyValues<Props>;\n\n    constructor(properties: Properties<Props>) {\n        this._properties = properties;\n        this._values = (Object.create(properties.defaultPossiblyEvaluatedValues): any);\n    }\n\n    get<S: string>(name: S): $ElementType<PossiblyEvaluatedPropertyValues<Props>, S> {\n        return this._values[name];\n    }\n}\n\n/**\n * An implementation of `Property` for properties that do not permit data-driven (source or composite) expressions.\n * This restriction allows us to declare statically that the result of possibly evaluating this kind of property\n * is in fact always the scalar type `T`, and can be used without further evaluating the value on a per-feature basis.\n *\n * @private\n */\nexport class DataConstantProperty<T> implements Property<T, T> {\n    specification: StylePropertySpecification;\n\n    constructor(specification: StylePropertySpecification) {\n        this.specification = specification;\n    }\n\n    possiblyEvaluate(value: PropertyValue<T, T>, parameters: EvaluationParameters): T {\n        assert(!value.isDataDriven());\n        // $FlowFixMe[method-unbinding]\n        return value.expression.evaluate(parameters);\n    }\n\n    interpolate(a: T, b: T, t: number): T {\n        const interp: ?(a: T, b: T, t: number) => T = (interpolate: any)[this.specification.type];\n        if (interp) {\n            return interp(a, b, t);\n        } else {\n            return a;\n        }\n    }\n}\n\n/**\n * An implementation of `Property` for properties that permit data-driven (source or composite) expressions.\n * The result of possibly evaluating this kind of property is `PossiblyEvaluatedPropertyValue<T>`; obtaining\n * a scalar value `T` requires further evaluation on a per-feature basis.\n *\n * @private\n */\nexport class DataDrivenProperty<T> implements Property<T, PossiblyEvaluatedPropertyValue<T>> {\n    specification: StylePropertySpecification;\n    overrides: ?{[string]: any};\n    useIntegerZoom: ?boolean;\n\n    constructor(specification: StylePropertySpecification, overrides?: {[string]: any}) {\n        this.specification = specification;\n        this.overrides = overrides;\n    }\n\n    possiblyEvaluate(value: PropertyValue<T, PossiblyEvaluatedPropertyValue<T>>, parameters: EvaluationParameters, canonical?: CanonicalTileID, availableImages?: Array<string>): PossiblyEvaluatedPropertyValue<T> {\n        if (value.expression.kind === 'constant' || value.expression.kind === 'camera') {\n            // $FlowFixMe[method-unbinding]\n            return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: value.expression.evaluate(parameters, (null: any), {}, canonical, availableImages)}, parameters);\n        } else {\n            return new PossiblyEvaluatedPropertyValue(this, value.expression, parameters);\n        }\n    }\n\n    interpolate(a: PossiblyEvaluatedPropertyValue<T>,\n                b: PossiblyEvaluatedPropertyValue<T>,\n                t: number): PossiblyEvaluatedPropertyValue<T> {\n        // If either possibly-evaluated value is non-constant, give up: we aren't able to interpolate data-driven values.\n        if (a.value.kind !== 'constant' || b.value.kind !== 'constant') {\n            return a;\n        }\n\n        // Special case hack solely for fill-outline-color. The undefined value is subsequently handled in\n        // FillStyleLayer#recalculate, which sets fill-outline-color to the fill-color value if the former\n        // is a PossiblyEvaluatedPropertyValue containing a constant undefined value. In addition to the\n        // return value here, the other source of a PossiblyEvaluatedPropertyValue containing a constant\n        // undefined value is the \"default value\" for fill-outline-color held in\n        // `Properties#defaultPossiblyEvaluatedValues`, which serves as the prototype of\n        // `PossiblyEvaluated#_values`.\n        if (a.value.value === undefined || b.value.value === undefined) {\n            return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: (undefined: any)}, a.parameters);\n        }\n\n        const interp: ?(a: T, b: T, t: number) => T = (interpolate: any)[this.specification.type];\n        if (interp) {\n            return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: interp(a.value.value, b.value.value, t)}, a.parameters);\n        } else {\n            return a;\n        }\n    }\n\n    evaluate(value: PossiblyEvaluatedValue<T>, parameters: EvaluationParameters, feature: Feature, featureState: FeatureState, canonical?: CanonicalTileID, availableImages?: Array<string>): T {\n        if (value.kind === 'constant') {\n            return value.value;\n        } else {\n            // $FlowFixMe[method-unbinding]\n            return value.evaluate(parameters, feature, featureState, canonical, availableImages);\n        }\n    }\n}\n\n/**\n * An implementation of `Property` for `heatmap-color` and `line-gradient`. Interpolation is a no-op, and\n * evaluation returns a boolean value in order to indicate its presence, but the real\n * evaluation happens in StyleLayer classes.\n *\n * @private\n */\nexport class ColorRampProperty implements Property<Color, boolean> {\n    specification: StylePropertySpecification;\n\n    constructor(specification: StylePropertySpecification) {\n        this.specification = specification;\n    }\n\n    possiblyEvaluate(value: PropertyValue<Color, boolean>, parameters: EvaluationParameters, canonical?: CanonicalTileID, availableImages?: Array<string>): boolean {\n        // $FlowFixMe[method-unbinding]\n        return !!value.expression.evaluate(parameters, (null: any), {}, canonical, availableImages);\n    }\n\n    interpolate(): boolean { return false; }\n}\n\nexport class DirectionProperty implements Property<[number, number], Direction> {\n    specification: StylePropertySpecification;\n\n    constructor(specification: StylePropertySpecification) {\n        this.specification = specification;\n    }\n\n    possiblyEvaluate(value: PropertyValue<[number, number], Direction>, parameters: EvaluationParameters): Direction {\n        // $FlowFixMe[method-unbinding]\n        return sphericalDirectionToCartesian(value.expression.evaluate(parameters));\n    }\n\n    interpolate(a: Direction, b: Direction, t: number): Direction {\n        return {\n            x: interpolateValue(a.x, b.x, t),\n            y: interpolateValue(a.y, b.y, t),\n            z: interpolateValue(a.z, b.z, t)\n        };\n    }\n}\n\nexport class PositionProperty implements Property<[number, number, number], Position> {\n    specification: StylePropertySpecification;\n\n    constructor(specification: StylePropertySpecification) {\n        this.specification = specification;\n    }\n\n    possiblyEvaluate(value: PropertyValue<[number, number, number], Position>, parameters: EvaluationParameters): Position {\n        // $FlowFixMe[method-unbinding]\n        return sphericalPositionToCartesian(value.expression.evaluate(parameters));\n    }\n\n    interpolate(a: Position, b: Position, t: number): Position {\n        return {\n            x: interpolateValue(a.x, b.x, t),\n            y: interpolateValue(a.y, b.y, t),\n            z: interpolateValue(a.z, b.z, t),\n            azimuthal: interpolateValue(a.azimuthal, b.azimuthal, t),\n            polar: interpolateValue(a.polar, b.polar, t),\n        };\n    }\n}\n\n/**\n * `Properties` holds objects containing default values for the layout or paint property set of a given\n * layer type. These objects are immutable, and they are used as the prototypes for the `_values` members of\n * `Transitionable`, `Transitioning`, `Layout`, and `PossiblyEvaluated`. This allows these classes to avoid\n * doing work in the common case where a property has no explicit value set and should be considered to take\n * on the default value: using `for (const property of Object.keys(this._values))`, they can iterate over\n * only the _own_ properties of `_values`, skipping repeated calculation of transitions and possible/final\n * evaluations for defaults, the result of which will always be the same.\n *\n * @private\n */\nexport class Properties<Props: {[string]: any}> {\n    properties: Props;\n    defaultPropertyValues: PropertyValues<Props>;\n    defaultTransitionablePropertyValues: TransitionablePropertyValues<Props>;\n    defaultTransitioningPropertyValues: TransitioningPropertyValues<Props>;\n    defaultPossiblyEvaluatedValues: PossiblyEvaluatedPropertyValues<Props>;\n    overridableProperties: Array<string>;\n\n    constructor(properties: Props) {\n        this.properties = properties;\n        this.defaultPropertyValues = ({}: any);\n        this.defaultTransitionablePropertyValues = ({}: any);\n        this.defaultTransitioningPropertyValues = ({}: any);\n        this.defaultPossiblyEvaluatedValues = ({}: any);\n        this.overridableProperties = ([]: any);\n\n        const defaultParameters = new EvaluationParameters(0, {});\n        for (const property in properties) {\n            const prop = properties[property];\n            if (prop.specification.overridable) {\n                this.overridableProperties.push(property);\n            }\n            const defaultPropertyValue = this.defaultPropertyValues[property] =\n                new PropertyValue(prop, undefined);\n            const defaultTransitionablePropertyValue = this.defaultTransitionablePropertyValues[property] =\n                new TransitionablePropertyValue(prop);\n            this.defaultTransitioningPropertyValues[property] =\n                defaultTransitionablePropertyValue.untransitioned();\n            this.defaultPossiblyEvaluatedValues[property] =\n                defaultPropertyValue.possiblyEvaluate(defaultParameters);\n        }\n    }\n}\n\nregister(DataDrivenProperty, 'DataDrivenProperty');\nregister(DataConstantProperty, 'DataConstantProperty');\nregister(ColorRampProperty, 'ColorRampProperty');\n","// @flow\n\n// Turn jsonlint-lines-primitives objects into primitive objects\nexport function unbundle(value: mixed): mixed {\n    if (value instanceof Number || value instanceof String || value instanceof Boolean) {\n        return value.valueOf();\n    } else {\n        return value;\n    }\n}\n\nexport function deepUnbundle(value: mixed): mixed {\n    if (Array.isArray(value)) {\n        return value.map(deepUnbundle);\n    } else if (value instanceof Object && !(value instanceof Number || value instanceof String || value instanceof Boolean)) {\n        const unbundledValue: { [key: string]: mixed } = {};\n        for (const key in value) {\n            unbundledValue[key] = deepUnbundle(value[key]);\n        }\n        return unbundledValue;\n    }\n\n    return unbundle(value);\n}\n","// @flow\n\nimport {createExpression} from '../expression/index.js';\nimport {isFeatureConstant} from '../expression/is_constant.js';\nimport {deepUnbundle} from '../util/unbundle_jsonlint.js';\nimport latest from '../reference/latest.js';\nimport type {GlobalProperties, Feature} from '../expression/index.js';\nimport type {CanonicalTileID} from '../../source/tile_id.js';\nimport type Point from '@mapbox/point-geometry';\n\nexport type FeatureDistanceData = {bearing: [number, number], center: [number, number], scale: number};\nexport type FilterExpression = (globalProperties: GlobalProperties, feature: Feature, canonical?: CanonicalTileID, featureTileCoord?: Point, featureDistanceData?: FeatureDistanceData) => boolean;\nexport type FeatureFilter = {filter: FilterExpression, dynamicFilter?: FilterExpression, needGeometry: boolean, needFeature: boolean};\n\nexport default createFilter;\nexport {isExpressionFilter, isDynamicFilter, extractStaticFilter};\n\nfunction isExpressionFilter(filter: any): boolean {\n    if (filter === true || filter === false) {\n        return true;\n    }\n\n    if (!Array.isArray(filter) || filter.length === 0) {\n        return false;\n    }\n    switch (filter[0]) {\n    case 'has':\n        return filter.length >= 2 && filter[1] !== '$id' && filter[1] !== '$type';\n\n    case 'in':\n        return filter.length >= 3 && (typeof filter[1] !== 'string' || Array.isArray(filter[2]));\n\n    case '!in':\n    case '!has':\n    case 'none':\n        return false;\n\n    case '==':\n    case '!=':\n    case '>':\n    case '>=':\n    case '<':\n    case '<=':\n        return filter.length !== 3 || (Array.isArray(filter[1]) || Array.isArray(filter[2]));\n\n    case 'any':\n    case 'all':\n        for (const f of filter.slice(1)) {\n            if (!isExpressionFilter(f) && typeof f !== 'boolean') {\n                return false;\n            }\n        }\n        return true;\n\n    default:\n        return true;\n    }\n}\n\n/**\n * Given a filter expressed as nested arrays, return a new function\n * that evaluates whether a given feature (with a .properties or .tags property)\n * passes its test.\n *\n * @private\n * @param {Array} filter mapbox gl filter\n * @param {string} layerType the type of the layer this filter will be applied to.\n * @returns {Function} filter-evaluating function\n */\nfunction createFilter(filter: any, layerType?: string = 'fill'): FeatureFilter {\n    if (filter === null || filter === undefined) {\n        return {filter: () => true, needGeometry: false, needFeature: false};\n    }\n\n    if (!isExpressionFilter(filter)) {\n        // $FlowFixMe[incompatible-call]\n        filter = convertFilter(filter);\n    }\n    const filterExp = ((filter: any): string[] | string | boolean);\n\n    let staticFilter = true;\n    try {\n        staticFilter = extractStaticFilter(filterExp);\n    } catch (e) {\n        console.warn(\n`Failed to extract static filter. Filter will continue working, but at higher memory usage and slower framerate.\nThis is most likely a bug, please report this via https://github.com/mapbox/mapbox-gl-js/issues/new?assignees=&labels=&template=Bug_report.md\nand paste the contents of this message in the report.\nThank you!\nFilter Expression:\n${JSON.stringify(filterExp, null, 2)}\n        `);\n    }\n\n    // Compile the static component of the filter\n    const filterSpec = latest[`filter_${layerType}`];\n    const compiledStaticFilter = createExpression(staticFilter, filterSpec);\n\n    let filterFunc = null;\n    if (compiledStaticFilter.result === 'error') {\n        throw new Error(compiledStaticFilter.value.map(err => `${err.key}: ${err.message}`).join(', '));\n    } else {\n        filterFunc = (globalProperties: GlobalProperties, feature: Feature, canonical?: CanonicalTileID) => compiledStaticFilter.value.evaluate(globalProperties, feature, {}, canonical);\n    }\n\n    // If the static component is not equal to the entire filter then we have a dynamic component\n    // Compile the dynamic component separately\n    let dynamicFilterFunc = null;\n    let needFeature = null;\n    if (staticFilter !== filterExp) {\n        const compiledDynamicFilter = createExpression(filterExp, filterSpec);\n\n        if (compiledDynamicFilter.result === 'error') {\n            throw new Error(compiledDynamicFilter.value.map(err => `${err.key}: ${err.message}`).join(', '));\n        } else {\n            dynamicFilterFunc = (globalProperties: GlobalProperties, feature: Feature, canonical?: CanonicalTileID, featureTileCoord?: Point, featureDistanceData?: FeatureDistanceData) => compiledDynamicFilter.value.evaluate(globalProperties, feature, {}, canonical, undefined, undefined, featureTileCoord, featureDistanceData);\n            needFeature = !isFeatureConstant(compiledDynamicFilter.value.expression);\n        }\n    }\n\n    filterFunc = ((filterFunc: any): FilterExpression);\n    const needGeometry = geometryNeeded(staticFilter);\n\n    return {\n        filter: filterFunc,\n        dynamicFilter: dynamicFilterFunc ? dynamicFilterFunc : undefined,\n        needGeometry,\n        needFeature: !!needFeature\n    };\n}\n\nfunction extractStaticFilter(filter: any): any {\n    if (!isDynamicFilter(filter)) {\n        return filter;\n    }\n\n    // Shallow copy so we can replace expressions in-place\n    let result = deepUnbundle(filter);\n\n    // 1. Union branches\n    unionDynamicBranches(result);\n\n    // 2. Collapse dynamic conditions to  `true`\n    result = collapseDynamicBooleanExpressions(result);\n\n    return result;\n}\n\nfunction collapseDynamicBooleanExpressions(expression: any): any {\n    if (!Array.isArray(expression)) {\n        return expression;\n    }\n\n    const collapsed = collapsedExpression(expression);\n    if (collapsed === true) {\n        return collapsed;\n    } else {\n        return collapsed.map((subExpression) => collapseDynamicBooleanExpressions(subExpression));\n    }\n}\n\n/**\n * Traverses the expression and replaces all instances of branching on a\n * `dynamic` conditional (such as `['pitch']` or `['distance-from-center']`)\n * into an `any` expression.\n * This ensures that all possible outcomes of a `dynamic` branch are considered\n * when evaluating the expression upfront during filtering.\n *\n * @param {Array<any>} filter the filter expression mutated in-place.\n */\nfunction unionDynamicBranches(filter: any) {\n    let isBranchingDynamically = false;\n    const branches = [];\n\n    if (filter[0] === 'case') {\n        for (let i = 1; i < filter.length - 1; i += 2) {\n            isBranchingDynamically = isBranchingDynamically || isDynamicFilter(filter[i]);\n            branches.push(filter[i + 1]);\n        }\n\n        branches.push(filter[filter.length - 1]);\n    } else if (filter[0] === 'match') {\n        isBranchingDynamically = isBranchingDynamically || isDynamicFilter(filter[1]);\n\n        for (let i = 2; i < filter.length - 1; i += 2) {\n            branches.push(filter[i + 1]);\n        }\n        branches.push(filter[filter.length - 1]);\n    } else if (filter[0] === 'step') {\n        isBranchingDynamically = isBranchingDynamically || isDynamicFilter(filter[1]);\n\n        for (let i = 1; i < filter.length - 1; i += 2) {\n            branches.push(filter[i + 1]);\n        }\n    }\n\n    if (isBranchingDynamically) {\n        filter.length = 0;\n        filter.push('any', ...branches);\n    }\n\n    // traverse and recurse into children\n    for (let i = 1; i < filter.length; i++) {\n        unionDynamicBranches(filter[i]);\n    }\n}\n\nfunction isDynamicFilter(filter: any): boolean {\n    // Base Cases\n    if (!Array.isArray(filter)) {\n        return false;\n    }\n    if (isRootExpressionDynamic(filter[0])) {\n        return true;\n    }\n\n    for (let i = 1; i < filter.length; i++) {\n        const child = filter[i];\n        if (isDynamicFilter(child)) {\n            return true;\n        }\n    }\n\n    return false;\n}\n\nfunction isRootExpressionDynamic(expression: string): boolean {\n    return expression === 'pitch' ||\n        expression === 'distance-from-center';\n}\n\nconst dynamicConditionExpressions = new Set([\n    'in',\n    '==',\n    '!=',\n    '>',\n    '>=',\n    '<',\n    '<=',\n    'to-boolean'\n]);\n\nfunction collapsedExpression(expression: any): any {\n    if (dynamicConditionExpressions.has(expression[0])) {\n\n        for (let i = 1; i < expression.length; i++) {\n            const param = expression[i];\n            if (isDynamicFilter(param)) {\n                return true;\n            }\n        }\n    }\n    return expression;\n}\n\n// Comparison function to sort numbers and strings\nfunction compare(a: number, b: number) {\n    return a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction geometryNeeded(filter: Array<any> | boolean) {\n    if (!Array.isArray(filter)) return false;\n    if (filter[0] === 'within' || filter[0] === 'distance') return true;\n    for (let index = 1; index < filter.length; index++) {\n        if (geometryNeeded(filter[index])) return true;\n    }\n    return false;\n}\n\nfunction convertFilter(filter: ?Array<any>): mixed {\n    if (!filter) return true;\n    const op = filter[0];\n    if (filter.length <= 1) return (op !== 'any');\n    const converted =\n        op === '==' ? convertComparisonOp(filter[1], filter[2], '==') :\n        op === '!=' ? convertNegation(convertComparisonOp(filter[1], filter[2], '==')) :\n        op === '<' ||\n        op === '>' ||\n        op === '<=' ||\n        op === '>=' ? convertComparisonOp(filter[1], filter[2], op) :\n        op === 'any' ? convertDisjunctionOp(filter.slice(1)) :\n        op === 'all' ? ['all'].concat(filter.slice(1).map(convertFilter)) :\n        op === 'none' ? ['all'].concat(filter.slice(1).map(convertFilter).map(convertNegation)) :\n        op === 'in' ? convertInOp(filter[1], filter.slice(2)) :\n        op === '!in' ? convertNegation(convertInOp(filter[1], filter.slice(2))) :\n        op === 'has' ? convertHasOp(filter[1]) :\n        op === '!has' ? convertNegation(convertHasOp(filter[1])) :\n        true;\n    return converted;\n}\n\nfunction convertComparisonOp(property: string, value: any, op: string) {\n    switch (property) {\n    case '$type':\n        return [`filter-type-${op}`, value];\n    case '$id':\n        return [`filter-id-${op}`, value];\n    default:\n        return [`filter-${op}`, property, value];\n    }\n}\n\nfunction convertDisjunctionOp(filters: Array<Array<any>>) {\n    return ['any'].concat(filters.map(convertFilter));\n}\n\nfunction convertInOp(property: string, values: Array<any>) {\n    if (values.length === 0) { return false; }\n    switch (property) {\n    case '$type':\n        return [`filter-type-in`, ['literal', values]];\n    case '$id':\n        return [`filter-id-in`, ['literal', values]];\n    default:\n        if (values.length > 200 && !values.some(v => typeof v !== typeof values[0])) {\n            return ['filter-in-large', property, ['literal', values.sort(compare)]];\n        } else {\n            return ['filter-in-small', property, ['literal', values]];\n        }\n    }\n}\n\nfunction convertHasOp(property: string) {\n    switch (property) {\n    case '$type':\n        return true;\n    case '$id':\n        return [`filter-has-id`];\n    default:\n        return [`filter-has`, property];\n    }\n}\n\nfunction convertNegation(filter: mixed) {\n    return ['!', filter];\n}\n","// @flow\n\nconst FQIDSeparator = '\\u001F';\n\nexport function isFQID(id: string): boolean {\n    return id.indexOf(FQIDSeparator) >= 0;\n}\n\nexport function makeFQID(id: string, scope: ?string): string {\n    if (!scope) return id;\n    return `${id}${FQIDSeparator}${scope}`;\n}\n\nexport function getNameFromFQID(fqid: string): string {\n    const sep = fqid.indexOf(FQIDSeparator);\n    return sep >= 0 ? fqid.slice(0, sep) : fqid;\n}\n\nexport function getScopeFromFQID(fqid: string): string {\n    const sep = fqid.indexOf(FQIDSeparator);\n    return sep >= 0 ? fqid.slice(sep + 1) : '';\n}\n","// @flow\n\nimport {endsWith, filterObject} from '../util/util.js';\n\nimport {Evented} from '../util/evented.js';\nimport {Layout, Transitionable, Transitioning, Properties, PossiblyEvaluated, PossiblyEvaluatedPropertyValue} from './properties.js';\nimport {supportsPropertyExpression} from '../style-spec/util/properties.js';\nimport featureFilter from '../style-spec/feature_filter/index.js';\nimport {makeFQID} from '../util/fqid.js';\n\nimport type {FeatureState} from '../style-spec/expression/index.js';\nimport type {Bucket} from '../data/bucket.js';\nimport type Point from '@mapbox/point-geometry';\nimport type {FeatureFilter, FilterExpression} from '../style-spec/feature_filter/index.js';\nimport type {TransitionParameters, PropertyValue, ConfigOptions} from './properties.js';\nimport type EvaluationParameters from './evaluation_parameters.js';\nimport type Transform from '../geo/transform.js';\nimport type {\n    LayerSpecification,\n    FilterSpecification,\n    TransitionSpecification,\n    PropertyValueSpecification\n} from '../style-spec/types.js';\nimport type {CustomLayerInterface} from './style_layer/custom_style_layer.js';\nimport type {Map as MapboxMap} from '../ui/map.js';\nimport type {TilespaceQueryGeometry} from './query_geometry.js';\nimport type {DEMSampler} from '../terrain/elevation.js';\nimport type {IVectorTileFeature} from '@mapbox/vector-tile';\nimport type {CreateProgramParams} from \"../render/painter.js\";\nimport type SourceCache from '../source/source_cache.js';\nimport type Painter from '../render/painter.js';\nimport type {QueryFeature} from '../util/vectortile_to_geojson.js';\n\nconst TRANSITION_SUFFIX = '-transition';\n\ntype LayerRenderingStats = {\n    numRenderedVerticesInTransparentPass: number;\n    numRenderedVerticesInShadowPass: number;\n};\n\n// Symbols are draped only on native and for certain cases only\nconst drapedLayers = new Set(['fill', 'line', 'background', 'hillshade', 'raster']);\n\nclass StyleLayer extends Evented {\n    id: string;\n    fqid: string;\n    scope: string;\n    metadata: mixed;\n    type: string;\n    source: string;\n    sourceLayer: ?string;\n    slot: ?string;\n    minzoom: ?number;\n    maxzoom: ?number;\n    filter: FilterSpecification | void;\n    visibility: 'visible' | 'none' | void;\n    isConfigDependent: boolean;\n\n    _unevaluatedLayout: Layout<any>;\n    +layout: mixed;\n\n    _transitionablePaint: Transitionable<any>;\n    _transitioningPaint: Transitioning<any>;\n    +paint: mixed;\n\n    _featureFilter: FeatureFilter;\n    _filterCompiled: boolean;\n\n    options: ?ConfigOptions;\n    _stats: ?LayerRenderingStats;\n\n    constructor(layer: LayerSpecification | CustomLayerInterface, properties: $ReadOnly<{layout?: Properties<*>, paint?: Properties<*>}>, scope: string, options?: ?ConfigOptions) {\n        super();\n\n        this.id = layer.id;\n        this.fqid = makeFQID(this.id, scope);\n        this.type = layer.type;\n        this.scope = scope;\n        this.options = options;\n\n        this._featureFilter = {filter: () => true, needGeometry: false, needFeature: false};\n        this._filterCompiled = false;\n        this.isConfigDependent = false;\n\n        if (layer.type === 'custom') return;\n\n        layer = ((layer: any): LayerSpecification);\n\n        this.metadata = layer.metadata;\n        this.minzoom = layer.minzoom;\n        this.maxzoom = layer.maxzoom;\n\n        if (layer.type !== 'background' && layer.type !== 'sky' && layer.type !== 'slot') {\n            this.source = layer.source;\n            this.sourceLayer = layer['source-layer'];\n            this.filter = layer.filter;\n        }\n\n        if (layer.slot) this.slot = layer.slot;\n\n        if (properties.layout) {\n            this._unevaluatedLayout = new Layout(properties.layout, this.scope, options);\n            this.isConfigDependent = this.isConfigDependent || this._unevaluatedLayout.isConfigDependent;\n        }\n\n        if (properties.paint) {\n            this._transitionablePaint = new Transitionable(properties.paint, this.scope, options);\n\n            for (const property in layer.paint) {\n                this.setPaintProperty(property, layer.paint[property]);\n            }\n            for (const property in layer.layout) {\n                this.setLayoutProperty(property, layer.layout[property]);\n            }\n            this.isConfigDependent = this.isConfigDependent || this._transitionablePaint.isConfigDependent;\n\n            this._transitioningPaint = this._transitionablePaint.untransitioned();\n            //$FlowFixMe\n            this.paint = new PossiblyEvaluated(properties.paint);\n        }\n    }\n\n    // No-op in the StyleLayer class, must be implemented by each concrete StyleLayer\n    onAdd(_map: MapboxMap): void {}\n\n    // No-op in the StyleLayer class, must be implemented by each concrete StyleLayer\n    onRemove(_map: MapboxMap): void {}\n\n    isDraped(_sourceCache?: SourceCache | void): boolean {\n        return drapedLayers.has(this.type);\n    }\n\n    getLayoutProperty(name: string): PropertyValueSpecification<mixed> {\n        if (name === 'visibility') {\n            return this.visibility;\n        }\n\n        return this._unevaluatedLayout.getValue(name);\n    }\n\n    setLayoutProperty(name: string, value: any) {\n        if (this.type === 'custom' && name === 'visibility') {\n            this.visibility = value;\n            return;\n        }\n\n        const layout = this._unevaluatedLayout;\n        const specProps = layout._properties.properties;\n        if (!specProps[name]) return; // skip unrecognized properties\n\n        layout.setValue(name, value);\n        this.isConfigDependent = this.isConfigDependent || layout.isConfigDependent;\n\n        if (name === 'visibility') {\n            this.possiblyEvaluateVisibility();\n        }\n    }\n\n    possiblyEvaluateVisibility() {\n        this.visibility = this._unevaluatedLayout._values.visibility.possiblyEvaluate({zoom: 0});\n    }\n\n    getPaintProperty(name: string): void | TransitionSpecification | PropertyValueSpecification<mixed> {\n        if (endsWith(name, TRANSITION_SUFFIX)) {\n            return this._transitionablePaint.getTransition(name.slice(0, -TRANSITION_SUFFIX.length));\n        } else {\n            return this._transitionablePaint.getValue(name);\n        }\n    }\n\n    setPaintProperty(name: string, value: mixed): boolean {\n        const paint = this._transitionablePaint;\n        const specProps = paint._properties.properties;\n\n        if (endsWith(name, TRANSITION_SUFFIX)) {\n            const propName = name.slice(0, -TRANSITION_SUFFIX.length);\n            if (specProps[propName]) { // skip unrecognized properties\n                paint.setTransition(propName, (value: any) || undefined);\n            }\n            return false;\n\n        }\n\n        if (!specProps[name]) return false; // skip unrecognized properties\n\n        const transitionable = paint._values[name];\n        const wasDataDriven = transitionable.value.isDataDriven();\n        const oldValue = transitionable.value;\n\n        paint.setValue(name, value);\n        this.isConfigDependent = this.isConfigDependent || paint.isConfigDependent;\n        this._handleSpecialPaintPropertyUpdate(name);\n\n        const newValue = paint._values[name].value;\n        const isDataDriven = newValue.isDataDriven();\n        const isPattern = endsWith(name, 'pattern') || name === 'line-dasharray';\n\n        // if a pattern value is changed, we need to make sure the new icons get added to each tile's iconAtlas\n        // so a call to _updateLayer is necessary, and we return true from this function so it gets called in\n        // Style#setPaintProperty\n        return isDataDriven || wasDataDriven || isPattern || this._handleOverridablePaintPropertyUpdate(name, oldValue, newValue);\n    }\n\n    _handleSpecialPaintPropertyUpdate(_: string) {\n        // No-op; can be overridden by derived classes.\n    }\n\n    getProgramIds(): string[] | null {\n        // No-op; can be overridden by derived classes.\n        return null;\n    }\n\n    // eslint-disable-next-line no-unused-vars\n    getDefaultProgramParams(name: string, zoom: number): CreateProgramParams | null {\n        // No-op; can be overridden by derived classes.\n        return null;\n    }\n\n    // eslint-disable-next-line no-unused-vars\n    _handleOverridablePaintPropertyUpdate<T, R>(name: string, oldValue: PropertyValue<T, R>, newValue: PropertyValue<T, R>): boolean {\n        // No-op; can be overridden by derived classes.\n        return false;\n    }\n\n    isHidden(zoom: number): boolean {\n        if (this.minzoom && zoom < this.minzoom) return true;\n        if (this.maxzoom && zoom >= this.maxzoom) return true;\n        return this.visibility === 'none';\n    }\n\n    updateTransitions(parameters: TransitionParameters) {\n        this._transitioningPaint = this._transitionablePaint.transitioned(parameters, this._transitioningPaint);\n    }\n\n    hasTransition(): boolean {\n        return this._transitioningPaint.hasTransition();\n    }\n\n    recalculate(parameters: EvaluationParameters, availableImages: Array<string>) {\n        if (this._unevaluatedLayout) {\n            (this: any).layout = this._unevaluatedLayout.possiblyEvaluate(parameters, undefined, availableImages);\n        }\n\n        (this: any).paint = this._transitioningPaint.possiblyEvaluate(parameters, undefined, availableImages);\n    }\n\n    serialize(): LayerSpecification {\n        const output = {\n            'id': this.id,\n            'type': this.type,\n            'slot': this.slot,\n            'source': this.source,\n            'source-layer': this.sourceLayer,\n            'metadata': this.metadata,\n            'minzoom': this.minzoom,\n            'maxzoom': this.maxzoom,\n            'filter': this.filter,\n            'layout': this._unevaluatedLayout && this._unevaluatedLayout.serialize(),\n            'paint': this._transitionablePaint && this._transitionablePaint.serialize()\n        };\n\n        return filterObject(output, (value, key) => {\n            return value !== undefined &&\n                !(key === 'layout' && !Object.keys(value).length) &&\n                !(key === 'paint' && !Object.keys(value).length);\n        });\n    }\n\n    is3D(): boolean {\n        return false;\n    }\n\n    isSky(): boolean {\n        return false;\n    }\n\n    isTileClipped(): boolean {\n        return false;\n    }\n\n    hasOffscreenPass(): boolean {\n        return false;\n    }\n\n    hasShadowPass(): boolean {\n        return false;\n    }\n\n    canCastShadows(): boolean {\n        return false;\n    }\n\n    hasLightBeamPass(): boolean {\n        return false;\n    }\n\n    cutoffRange(): number {\n        return 0.0;\n    }\n\n    tileCoverLift(): number {\n        return 0.0;\n    }\n\n    resize() {\n        // noop\n    }\n\n    isStateDependent(): boolean {\n        for (const property in (this: any).paint._values) {\n            const value = (this: any).paint.get(property);\n            if (!(value instanceof PossiblyEvaluatedPropertyValue) || !supportsPropertyExpression(value.property.specification)) {\n                continue;\n            }\n\n            if ((value.value.kind === 'source' || value.value.kind === 'composite') &&\n                value.value.isStateDependent) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    compileFilter() {\n        if (!this._filterCompiled) {\n            this._featureFilter = featureFilter(this.filter);\n            this._filterCompiled = true;\n        }\n    }\n\n    invalidateCompiledFilter() {\n        this._filterCompiled = false;\n    }\n\n    dynamicFilter(): ?FilterExpression {\n        return this._featureFilter.dynamicFilter;\n    }\n\n    dynamicFilterNeedsFeature(): boolean {\n        return this._featureFilter.needFeature;\n    }\n\n    getLayerRenderingStats(): ?LayerRenderingStats {\n        return this._stats;\n    }\n\n    resetLayerRenderingStats(painter: Painter) {\n        if (this._stats) {\n            if (painter.renderPass === 'shadow') {\n                this._stats.numRenderedVerticesInShadowPass = 0;\n            } else {\n                this._stats.numRenderedVerticesInTransparentPass = 0;\n            }\n        }\n    }\n\n    // $FlowFixMe[incompatible-return] - No-op in the StyleLayer class, must be implemented by each concrete StyleLayer\n    queryRadius(_bucket: Bucket): number {}\n\n    queryIntersectsFeature(\n        _queryGeometry: TilespaceQueryGeometry,\n        _feature: IVectorTileFeature,\n        _featureState: FeatureState,\n        _geometry: Array<Array<Point>>,\n        _zoom: number,\n        _transform: Transform,\n        _pixelPosMatrix: Float32Array,\n        _elevationHelper: ?DEMSampler,\n        _layoutVertexArrayOffset: number\n    // $FlowFixMe[incompatible-return] - No-op in the StyleLayer class, must be implemented by each concrete StyleLayer\n    ): boolean | number {}\n\n    queryIntersectsMatchingFeature(\n        _queryGeometry: TilespaceQueryGeometry,\n        _featureIndex: number,\n        _filter: FeatureFilter,\n        _transform: Transform\n    // $FlowFixMe[incompatible-return] - No-op in the StyleLayer class, must be implemented by each concrete StyleLayer\n    ): {queryFeature: ?QueryFeature, intersectionZ: number} {}\n}\n\nexport default StyleLayer;\n","// @flow\n\n// Note: all \"sizes\" are measured in bytes\n\nimport assert from 'assert';\n\nimport type {Transferable} from '../types/transferable.js';\n\nconst viewTypes = {\n    'Int8': Int8Array,\n    'Uint8': Uint8Array,\n    'Int16': Int16Array,\n    'Uint16': Uint16Array,\n    'Int32': Int32Array,\n    'Uint32': Uint32Array,\n    'Float32': Float32Array\n};\n\nexport type ViewType = $Keys<typeof viewTypes>;\n\n/**\n * @private\n */\nclass Struct {\n    // When reading the ArrayBuffer as an array of different data types, arrays have different length\n    // depending on data type size. So to acess the same position,\n    // we need to read different indexes depending on array data size.\n    // _pos1 is the index reading an array with 1 byte data,\n    // _pos2 is reading 2 byte data, and so forth.\n    _pos1: number;\n    _pos2: number;\n    _pos4: number;\n    _pos8: number;\n    +_structArray: StructArray;\n\n    // The following properties are defined on the prototype of sub classes.\n    size: number;\n\n    /**\n     * @param {StructArray} structArray The StructArray the struct is stored in\n     * @param {number} index The index of the struct in the StructArray.\n     * @private\n     */\n    constructor(structArray: StructArray, index: number) {\n        (this: any)._structArray = structArray;\n        this._pos1 = index * this.size;\n        this._pos2 = this._pos1 / 2;\n        this._pos4 = this._pos1 / 4;\n        this._pos8 = this._pos1 / 8;\n    }\n}\n\nconst DEFAULT_CAPACITY = 128;\nconst RESIZE_MULTIPLIER = 5;\n\nexport type StructArrayMember = {\n    name: string,\n    type: ViewType,\n    components: number,\n    offset: number\n};\n\nexport type StructArrayLayout = {\n    members: Array<StructArrayMember>,\n    size: number,\n    alignment: ?number\n}\n\nexport interface IStructArrayLayout {\n    _refreshViews(): void;\n    emplace(...args: number[]): number;\n    emplaceBack(...args: number[]): number;\n}\n\nexport type SerializedStructArray = {\n    length: number,\n    arrayBuffer: ArrayBuffer\n};\n\n/**\n * `StructArray` provides an abstraction over `ArrayBuffer` and `TypedArray`\n * making it behave like an array of typed structs.\n *\n * Conceptually, a StructArray is comprised of elements, i.e., instances of its\n * associated struct type. Each particular struct type, together with an\n * alignment size, determines the memory layout of a StructArray whose elements\n * are of that type.  Thus, for each such layout that we need, we have\n * a corrseponding StructArrayLayout class, inheriting from StructArray and\n * implementing `emplaceBack()` and `_refreshViews()`.\n *\n * In some cases, where we need to access particular elements of a StructArray,\n * we implement a more specific subclass that inherits from one of the\n * StructArrayLayouts and adds a `get(i): T` accessor that returns a structured\n * object whose properties are proxies into the underlying memory space for the\n * i-th element.  This affords the convience of working with (seemingly) plain\n * Javascript objects without the overhead of serializing/deserializing them\n * into ArrayBuffers for efficient web worker transfer.\n *\n * @private\n */\nclass StructArray implements IStructArrayLayout {\n    capacity: number;\n    length: number;\n    isTransferred: boolean;\n    arrayBuffer: ArrayBuffer;\n    int8: Int8Array;\n    uint8: Uint8Array;\n    int16: Int16Array;\n    uint16: Uint16Array;\n    int32: Int32Array;\n    uint32: Uint32Array;\n    float32: Float32Array;\n\n    // The following properties are defined on the prototype.\n    members: Array<StructArrayMember>;\n    bytesPerElement: number;\n\n    constructor() {\n        this.isTransferred = false;\n        this.capacity = -1;\n        this.resize(0);\n    }\n\n    /**\n     * Serialize a StructArray instance.  Serializes both the raw data and the\n     * metadata needed to reconstruct the StructArray base class during\n     * deserialization.\n     * @private\n     */\n    static serialize(array: StructArray, transferables?: Set<Transferable>): SerializedStructArray {\n        assert(!array.isTransferred);\n\n        array._trim();\n\n        if (transferables) {\n            array.isTransferred = true;\n            transferables.add(array.arrayBuffer);\n        }\n\n        return {\n            length: array.length,\n            arrayBuffer: array.arrayBuffer,\n        };\n    }\n\n    static deserialize(input: SerializedStructArray): StructArray {\n        // $FlowFixMe not-an-object - newer Flow doesn't understand this pattern, silence for now\n        const structArray: {[_: string]: any} = Object.create(this.prototype);\n        structArray.arrayBuffer = input.arrayBuffer;\n        structArray.length = input.length;\n        structArray.capacity = input.arrayBuffer.byteLength / structArray.bytesPerElement;\n        structArray._refreshViews();\n        return ((structArray: any): StructArray);\n    }\n\n    /**\n     * Resize the array to discard unused capacity.\n     */\n    _trim() {\n        if (this.length !== this.capacity) {\n            this.capacity = this.length;\n            this.arrayBuffer = this.arrayBuffer.slice(0, this.length * this.bytesPerElement);\n            this._refreshViews();\n        }\n    }\n\n    /**\n     * Resets the the length of the array to 0 without de-allocating capacity.\n     */\n    clear() {\n        this.length = 0;\n    }\n\n    /**\n     * Resize the array.\n     * If `n` is greater than the current length then additional elements with undefined values are added.\n     * If `n` is less than the current length then the array will be reduced to the first `n` elements.\n     * @param {number} n The new size of the array.\n     */\n    resize(n: number) {\n        assert(!this.isTransferred);\n        this.reserve(n);\n        this.length = n;\n    }\n\n    /**\n     * Indicate a planned increase in size, so that any necessary allocation may\n     * be done once, ahead of time.\n     * @param {number} n The expected size of the array.\n     */\n    reserve(n: number) {\n        if (n > this.capacity) {\n            this.capacity = Math.max(n, Math.floor(this.capacity * RESIZE_MULTIPLIER), DEFAULT_CAPACITY);\n            this.arrayBuffer = new ArrayBuffer(this.capacity * this.bytesPerElement);\n\n            const oldUint8Array = this.uint8;\n            this._refreshViews();\n            if (oldUint8Array) this.uint8.set(oldUint8Array);\n        }\n    }\n\n    /**\n     * Create TypedArray views for the current ArrayBuffer.\n     */\n    _refreshViews(): void {\n        throw new Error('StructArray#_refreshViews() must be implemented by each concrete StructArray layout');\n    }\n\n    emplace(..._: number[]): number {\n        throw new Error('StructArray#emplace() must be implemented by each concrete StructArray layout');\n    }\n\n    emplaceBack(..._: number[]): number {\n        throw new Error('StructArray#emplaceBack() must be implemented by each concrete StructArray layout');\n    }\n\n    destroy() {\n        // $FlowFixMe\n        this.int8 = this.uint8 = this.int16 = this.uint16 = this.int32 = this.uint32 = this.float32 = null;\n        this.arrayBuffer = (null: any);\n    }\n}\n\n/**\n * Given a list of member fields, create a full StructArrayLayout, in\n * particular calculating the correct byte offset for each field.  This data\n * is used at build time to generate StructArrayLayout_*#emplaceBack() and\n * other accessors, and at runtime for binding vertex buffer attributes.\n *\n * @private\n */\nfunction createLayout(\n    members: Array<{ name: string, type: ViewType, +components?: number, }>,\n    alignment: number = 1\n): StructArrayLayout {\n\n    let offset = 0;\n    let maxSize = 0;\n    const layoutMembers = members.map((member) => {\n        assert(member.name.length);\n        const typeSize = sizeOf(member.type);\n        const memberOffset = offset = align(offset, Math.max(alignment, typeSize));\n        const components = member.components || 1;\n\n        maxSize = Math.max(maxSize, typeSize);\n        offset += typeSize * components;\n\n        return {\n            name: member.name,\n            type: member.type,\n            components,\n            offset: memberOffset,\n        };\n    });\n\n    const size = align(offset, Math.max(maxSize, alignment));\n\n    return {\n        members: layoutMembers,\n        size,\n        alignment\n    };\n}\n\nfunction sizeOf(type: ViewType): number {\n    return viewTypes[type].BYTES_PER_ELEMENT;\n}\n\nfunction align(offset: number, size: number): number {\n    return Math.ceil(offset / size) * size;\n}\n\nexport {StructArray, Struct, viewTypes, createLayout};\n","// This file is generated. Edit build/generate-struct-arrays.js, then run `npm run codegen`.\n/* eslint-disable camelcase */\n// @flow\n\nimport assert from 'assert';\nimport {Struct, StructArray} from '../util/struct_array.js';\nimport {register} from '../util/web_worker_transfer.js';\nimport type {IStructArrayLayout} from '../util/struct_array.js';\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Int16[2]\n *\n * @private\n */\nclass StructArrayLayout2i4 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    int16: Int16Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.int16 = new Int16Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1);\n    }\n\n    emplace(i: number, v0: number, v1: number): number {\n        const o2 = i * 2;\n        this.int16[o2 + 0] = v0;\n        this.int16[o2 + 1] = v1;\n        return i;\n    }\n}\n\nStructArrayLayout2i4.prototype.bytesPerElement = 4;\nregister(StructArrayLayout2i4, 'StructArrayLayout2i4');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Int16[3]\n *\n * @private\n */\nclass StructArrayLayout3i6 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    int16: Int16Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.int16 = new Int16Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number, v2: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1, v2);\n    }\n\n    emplace(i: number, v0: number, v1: number, v2: number): number {\n        const o2 = i * 3;\n        this.int16[o2 + 0] = v0;\n        this.int16[o2 + 1] = v1;\n        this.int16[o2 + 2] = v2;\n        return i;\n    }\n}\n\nStructArrayLayout3i6.prototype.bytesPerElement = 6;\nregister(StructArrayLayout3i6, 'StructArrayLayout3i6');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Int16[4]\n *\n * @private\n */\nclass StructArrayLayout4i8 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    int16: Int16Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.int16 = new Int16Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number, v2: number, v3: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1, v2, v3);\n    }\n\n    emplace(i: number, v0: number, v1: number, v2: number, v3: number): number {\n        const o2 = i * 4;\n        this.int16[o2 + 0] = v0;\n        this.int16[o2 + 1] = v1;\n        this.int16[o2 + 2] = v2;\n        this.int16[o2 + 3] = v3;\n        return i;\n    }\n}\n\nStructArrayLayout4i8.prototype.bytesPerElement = 8;\nregister(StructArrayLayout4i8, 'StructArrayLayout4i8');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Int16[5]\n *\n * @private\n */\nclass StructArrayLayout5i10 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    int16: Int16Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.int16 = new Int16Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number, v2: number, v3: number, v4: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1, v2, v3, v4);\n    }\n\n    emplace(i: number, v0: number, v1: number, v2: number, v3: number, v4: number): number {\n        const o2 = i * 5;\n        this.int16[o2 + 0] = v0;\n        this.int16[o2 + 1] = v1;\n        this.int16[o2 + 2] = v2;\n        this.int16[o2 + 3] = v3;\n        this.int16[o2 + 4] = v4;\n        return i;\n    }\n}\n\nStructArrayLayout5i10.prototype.bytesPerElement = 10;\nregister(StructArrayLayout5i10, 'StructArrayLayout5i10');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Int16[2]\n * [4]: Uint8[4]\n * [8]: Float32[1]\n *\n * @private\n */\nclass StructArrayLayout2i4ub1f12 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    int16: Int16Array;\n    float32: Float32Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.int16 = new Int16Array(this.arrayBuffer);\n        this.float32 = new Float32Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number, v2: number, v3: number, v4: number, v5: number, v6: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1, v2, v3, v4, v5, v6);\n    }\n\n    emplace(i: number, v0: number, v1: number, v2: number, v3: number, v4: number, v5: number, v6: number): number {\n        const o2 = i * 6;\n        const o1 = i * 12;\n        const o4 = i * 3;\n        this.int16[o2 + 0] = v0;\n        this.int16[o2 + 1] = v1;\n        this.uint8[o1 + 4] = v2;\n        this.uint8[o1 + 5] = v3;\n        this.uint8[o1 + 6] = v4;\n        this.uint8[o1 + 7] = v5;\n        this.float32[o4 + 2] = v6;\n        return i;\n    }\n}\n\nStructArrayLayout2i4ub1f12.prototype.bytesPerElement = 12;\nregister(StructArrayLayout2i4ub1f12, 'StructArrayLayout2i4ub1f12');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Float32[4]\n *\n * @private\n */\nclass StructArrayLayout4f16 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    float32: Float32Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.float32 = new Float32Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number, v2: number, v3: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1, v2, v3);\n    }\n\n    emplace(i: number, v0: number, v1: number, v2: number, v3: number): number {\n        const o4 = i * 4;\n        this.float32[o4 + 0] = v0;\n        this.float32[o4 + 1] = v1;\n        this.float32[o4 + 2] = v2;\n        this.float32[o4 + 3] = v3;\n        return i;\n    }\n}\n\nStructArrayLayout4f16.prototype.bytesPerElement = 16;\nregister(StructArrayLayout4f16, 'StructArrayLayout4f16');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Float32[2]\n *\n * @private\n */\nclass StructArrayLayout2f8 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    float32: Float32Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.float32 = new Float32Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1);\n    }\n\n    emplace(i: number, v0: number, v1: number): number {\n        const o4 = i * 2;\n        this.float32[o4 + 0] = v0;\n        this.float32[o4 + 1] = v1;\n        return i;\n    }\n}\n\nStructArrayLayout2f8.prototype.bytesPerElement = 8;\nregister(StructArrayLayout2f8, 'StructArrayLayout2f8');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Uint16[4]\n * [8]: Float32[1]\n *\n * @private\n */\nclass StructArrayLayout4ui1f12 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    uint16: Uint16Array;\n    float32: Float32Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.uint16 = new Uint16Array(this.arrayBuffer);\n        this.float32 = new Float32Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number, v2: number, v3: number, v4: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1, v2, v3, v4);\n    }\n\n    emplace(i: number, v0: number, v1: number, v2: number, v3: number, v4: number): number {\n        const o2 = i * 6;\n        const o4 = i * 3;\n        this.uint16[o2 + 0] = v0;\n        this.uint16[o2 + 1] = v1;\n        this.uint16[o2 + 2] = v2;\n        this.uint16[o2 + 3] = v3;\n        this.float32[o4 + 2] = v4;\n        return i;\n    }\n}\n\nStructArrayLayout4ui1f12.prototype.bytesPerElement = 12;\nregister(StructArrayLayout4ui1f12, 'StructArrayLayout4ui1f12');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Uint16[4]\n *\n * @private\n */\nclass StructArrayLayout4ui8 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    uint16: Uint16Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.uint16 = new Uint16Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number, v2: number, v3: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1, v2, v3);\n    }\n\n    emplace(i: number, v0: number, v1: number, v2: number, v3: number): number {\n        const o2 = i * 4;\n        this.uint16[o2 + 0] = v0;\n        this.uint16[o2 + 1] = v1;\n        this.uint16[o2 + 2] = v2;\n        this.uint16[o2 + 3] = v3;\n        return i;\n    }\n}\n\nStructArrayLayout4ui8.prototype.bytesPerElement = 8;\nregister(StructArrayLayout4ui8, 'StructArrayLayout4ui8');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Int16[6]\n *\n * @private\n */\nclass StructArrayLayout6i12 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    int16: Int16Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.int16 = new Int16Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number, v2: number, v3: number, v4: number, v5: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1, v2, v3, v4, v5);\n    }\n\n    emplace(i: number, v0: number, v1: number, v2: number, v3: number, v4: number, v5: number): number {\n        const o2 = i * 6;\n        this.int16[o2 + 0] = v0;\n        this.int16[o2 + 1] = v1;\n        this.int16[o2 + 2] = v2;\n        this.int16[o2 + 3] = v3;\n        this.int16[o2 + 4] = v4;\n        this.int16[o2 + 5] = v5;\n        return i;\n    }\n}\n\nStructArrayLayout6i12.prototype.bytesPerElement = 12;\nregister(StructArrayLayout6i12, 'StructArrayLayout6i12');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Int16[4]\n * [8]: Uint16[4]\n * [16]: Int16[4]\n *\n * @private\n */\nclass StructArrayLayout4i4ui4i24 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    int16: Int16Array;\n    uint16: Uint16Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.int16 = new Int16Array(this.arrayBuffer);\n        this.uint16 = new Uint16Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number, v2: number, v3: number, v4: number, v5: number, v6: number, v7: number, v8: number, v9: number, v10: number, v11: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);\n    }\n\n    emplace(i: number, v0: number, v1: number, v2: number, v3: number, v4: number, v5: number, v6: number, v7: number, v8: number, v9: number, v10: number, v11: number): number {\n        const o2 = i * 12;\n        this.int16[o2 + 0] = v0;\n        this.int16[o2 + 1] = v1;\n        this.int16[o2 + 2] = v2;\n        this.int16[o2 + 3] = v3;\n        this.uint16[o2 + 4] = v4;\n        this.uint16[o2 + 5] = v5;\n        this.uint16[o2 + 6] = v6;\n        this.uint16[o2 + 7] = v7;\n        this.int16[o2 + 8] = v8;\n        this.int16[o2 + 9] = v9;\n        this.int16[o2 + 10] = v10;\n        this.int16[o2 + 11] = v11;\n        return i;\n    }\n}\n\nStructArrayLayout4i4ui4i24.prototype.bytesPerElement = 24;\nregister(StructArrayLayout4i4ui4i24, 'StructArrayLayout4i4ui4i24');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Int16[3]\n * [8]: Float32[3]\n *\n * @private\n */\nclass StructArrayLayout3i3f20 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    int16: Int16Array;\n    float32: Float32Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.int16 = new Int16Array(this.arrayBuffer);\n        this.float32 = new Float32Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number, v2: number, v3: number, v4: number, v5: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1, v2, v3, v4, v5);\n    }\n\n    emplace(i: number, v0: number, v1: number, v2: number, v3: number, v4: number, v5: number): number {\n        const o2 = i * 10;\n        const o4 = i * 5;\n        this.int16[o2 + 0] = v0;\n        this.int16[o2 + 1] = v1;\n        this.int16[o2 + 2] = v2;\n        this.float32[o4 + 2] = v3;\n        this.float32[o4 + 3] = v4;\n        this.float32[o4 + 4] = v5;\n        return i;\n    }\n}\n\nStructArrayLayout3i3f20.prototype.bytesPerElement = 20;\nregister(StructArrayLayout3i3f20, 'StructArrayLayout3i3f20');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Uint32[1]\n *\n * @private\n */\nclass StructArrayLayout1ul4 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    uint32: Uint32Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.uint32 = new Uint32Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0);\n    }\n\n    emplace(i: number, v0: number): number {\n        const o4 = i * 1;\n        this.uint32[o4 + 0] = v0;\n        return i;\n    }\n}\n\nStructArrayLayout1ul4.prototype.bytesPerElement = 4;\nregister(StructArrayLayout1ul4, 'StructArrayLayout1ul4');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Uint16[2]\n *\n * @private\n */\nclass StructArrayLayout2ui4 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    uint16: Uint16Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.uint16 = new Uint16Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1);\n    }\n\n    emplace(i: number, v0: number, v1: number): number {\n        const o2 = i * 2;\n        this.uint16[o2 + 0] = v0;\n        this.uint16[o2 + 1] = v1;\n        return i;\n    }\n}\n\nStructArrayLayout2ui4.prototype.bytesPerElement = 4;\nregister(StructArrayLayout2ui4, 'StructArrayLayout2ui4');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Int16[5]\n * [12]: Float32[4]\n * [28]: Int16[1]\n * [32]: Uint32[1]\n * [36]: Uint16[2]\n *\n * @private\n */\nclass StructArrayLayout5i4f1i1ul2ui40 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    int16: Int16Array;\n    float32: Float32Array;\n    uint32: Uint32Array;\n    uint16: Uint16Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.int16 = new Int16Array(this.arrayBuffer);\n        this.float32 = new Float32Array(this.arrayBuffer);\n        this.uint32 = new Uint32Array(this.arrayBuffer);\n        this.uint16 = new Uint16Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number, v2: number, v3: number, v4: number, v5: number, v6: number, v7: number, v8: number, v9: number, v10: number, v11: number, v12: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);\n    }\n\n    emplace(i: number, v0: number, v1: number, v2: number, v3: number, v4: number, v5: number, v6: number, v7: number, v8: number, v9: number, v10: number, v11: number, v12: number): number {\n        const o2 = i * 20;\n        const o4 = i * 10;\n        this.int16[o2 + 0] = v0;\n        this.int16[o2 + 1] = v1;\n        this.int16[o2 + 2] = v2;\n        this.int16[o2 + 3] = v3;\n        this.int16[o2 + 4] = v4;\n        this.float32[o4 + 3] = v5;\n        this.float32[o4 + 4] = v6;\n        this.float32[o4 + 5] = v7;\n        this.float32[o4 + 6] = v8;\n        this.int16[o2 + 14] = v9;\n        this.uint32[o4 + 8] = v10;\n        this.uint16[o2 + 18] = v11;\n        this.uint16[o2 + 19] = v12;\n        return i;\n    }\n}\n\nStructArrayLayout5i4f1i1ul2ui40.prototype.bytesPerElement = 40;\nregister(StructArrayLayout5i4f1i1ul2ui40, 'StructArrayLayout5i4f1i1ul2ui40');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Int16[3]\n * [8]: Int16[2]\n * [12]: Int16[2]\n *\n * @private\n */\nclass StructArrayLayout3i2i2i16 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    int16: Int16Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.int16 = new Int16Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number, v2: number, v3: number, v4: number, v5: number, v6: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1, v2, v3, v4, v5, v6);\n    }\n\n    emplace(i: number, v0: number, v1: number, v2: number, v3: number, v4: number, v5: number, v6: number): number {\n        const o2 = i * 8;\n        this.int16[o2 + 0] = v0;\n        this.int16[o2 + 1] = v1;\n        this.int16[o2 + 2] = v2;\n        this.int16[o2 + 4] = v3;\n        this.int16[o2 + 5] = v4;\n        this.int16[o2 + 6] = v5;\n        this.int16[o2 + 7] = v6;\n        return i;\n    }\n}\n\nStructArrayLayout3i2i2i16.prototype.bytesPerElement = 16;\nregister(StructArrayLayout3i2i2i16, 'StructArrayLayout3i2i2i16');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Float32[2]\n * [8]: Float32[1]\n * [12]: Int16[2]\n *\n * @private\n */\nclass StructArrayLayout2f1f2i16 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    float32: Float32Array;\n    int16: Int16Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.float32 = new Float32Array(this.arrayBuffer);\n        this.int16 = new Int16Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number, v2: number, v3: number, v4: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1, v2, v3, v4);\n    }\n\n    emplace(i: number, v0: number, v1: number, v2: number, v3: number, v4: number): number {\n        const o4 = i * 4;\n        const o2 = i * 8;\n        this.float32[o4 + 0] = v0;\n        this.float32[o4 + 1] = v1;\n        this.float32[o4 + 2] = v2;\n        this.int16[o2 + 6] = v3;\n        this.int16[o2 + 7] = v4;\n        return i;\n    }\n}\n\nStructArrayLayout2f1f2i16.prototype.bytesPerElement = 16;\nregister(StructArrayLayout2f1f2i16, 'StructArrayLayout2f1f2i16');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Uint8[2]\n * [4]: Float32[2]\n *\n * @private\n */\nclass StructArrayLayout2ub2f12 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    float32: Float32Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.float32 = new Float32Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number, v2: number, v3: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1, v2, v3);\n    }\n\n    emplace(i: number, v0: number, v1: number, v2: number, v3: number): number {\n        const o1 = i * 12;\n        const o4 = i * 3;\n        this.uint8[o1 + 0] = v0;\n        this.uint8[o1 + 1] = v1;\n        this.float32[o4 + 1] = v2;\n        this.float32[o4 + 2] = v3;\n        return i;\n    }\n}\n\nStructArrayLayout2ub2f12.prototype.bytesPerElement = 12;\nregister(StructArrayLayout2ub2f12, 'StructArrayLayout2ub2f12');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Uint16[3]\n *\n * @private\n */\nclass StructArrayLayout3ui6 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    uint16: Uint16Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.uint16 = new Uint16Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number, v2: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1, v2);\n    }\n\n    emplace(i: number, v0: number, v1: number, v2: number): number {\n        const o2 = i * 3;\n        this.uint16[o2 + 0] = v0;\n        this.uint16[o2 + 1] = v1;\n        this.uint16[o2 + 2] = v2;\n        return i;\n    }\n}\n\nStructArrayLayout3ui6.prototype.bytesPerElement = 6;\nregister(StructArrayLayout3ui6, 'StructArrayLayout3ui6');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Int16[3]\n * [8]: Float32[2]\n * [16]: Uint16[2]\n * [20]: Uint32[3]\n * [32]: Uint16[3]\n * [40]: Float32[2]\n * [48]: Uint8[3]\n * [52]: Uint32[1]\n * [56]: Int16[1]\n * [58]: Uint8[1]\n *\n * @private\n */\nclass StructArrayLayout3i2f2ui3ul3ui2f3ub1ul1i1ub60 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    int16: Int16Array;\n    float32: Float32Array;\n    uint16: Uint16Array;\n    uint32: Uint32Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.int16 = new Int16Array(this.arrayBuffer);\n        this.float32 = new Float32Array(this.arrayBuffer);\n        this.uint16 = new Uint16Array(this.arrayBuffer);\n        this.uint32 = new Uint32Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number, v2: number, v3: number, v4: number, v5: number, v6: number, v7: number, v8: number, v9: number, v10: number, v11: number, v12: number, v13: number, v14: number, v15: number, v16: number, v17: number, v18: number, v19: number, v20: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);\n    }\n\n    emplace(i: number, v0: number, v1: number, v2: number, v3: number, v4: number, v5: number, v6: number, v7: number, v8: number, v9: number, v10: number, v11: number, v12: number, v13: number, v14: number, v15: number, v16: number, v17: number, v18: number, v19: number, v20: number): number {\n        const o2 = i * 30;\n        const o4 = i * 15;\n        const o1 = i * 60;\n        this.int16[o2 + 0] = v0;\n        this.int16[o2 + 1] = v1;\n        this.int16[o2 + 2] = v2;\n        this.float32[o4 + 2] = v3;\n        this.float32[o4 + 3] = v4;\n        this.uint16[o2 + 8] = v5;\n        this.uint16[o2 + 9] = v6;\n        this.uint32[o4 + 5] = v7;\n        this.uint32[o4 + 6] = v8;\n        this.uint32[o4 + 7] = v9;\n        this.uint16[o2 + 16] = v10;\n        this.uint16[o2 + 17] = v11;\n        this.uint16[o2 + 18] = v12;\n        this.float32[o4 + 10] = v13;\n        this.float32[o4 + 11] = v14;\n        this.uint8[o1 + 48] = v15;\n        this.uint8[o1 + 49] = v16;\n        this.uint8[o1 + 50] = v17;\n        this.uint32[o4 + 13] = v18;\n        this.int16[o2 + 28] = v19;\n        this.uint8[o1 + 58] = v20;\n        return i;\n    }\n}\n\nStructArrayLayout3i2f2ui3ul3ui2f3ub1ul1i1ub60.prototype.bytesPerElement = 60;\nregister(StructArrayLayout3i2f2ui3ul3ui2f3ub1ul1i1ub60, 'StructArrayLayout3i2f2ui3ul3ui2f3ub1ul1i1ub60');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Float32[2]\n * [8]: Int16[9]\n * [26]: Uint16[15]\n * [56]: Uint32[1]\n * [60]: Float32[4]\n * [76]: Uint8[1]\n *\n * @private\n */\nclass StructArrayLayout2f9i15ui1ul4f1ub80 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    float32: Float32Array;\n    int16: Int16Array;\n    uint16: Uint16Array;\n    uint32: Uint32Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.float32 = new Float32Array(this.arrayBuffer);\n        this.int16 = new Int16Array(this.arrayBuffer);\n        this.uint16 = new Uint16Array(this.arrayBuffer);\n        this.uint32 = new Uint32Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number, v2: number, v3: number, v4: number, v5: number, v6: number, v7: number, v8: number, v9: number, v10: number, v11: number, v12: number, v13: number, v14: number, v15: number, v16: number, v17: number, v18: number, v19: number, v20: number, v21: number, v22: number, v23: number, v24: number, v25: number, v26: number, v27: number, v28: number, v29: number, v30: number, v31: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31);\n    }\n\n    emplace(i: number, v0: number, v1: number, v2: number, v3: number, v4: number, v5: number, v6: number, v7: number, v8: number, v9: number, v10: number, v11: number, v12: number, v13: number, v14: number, v15: number, v16: number, v17: number, v18: number, v19: number, v20: number, v21: number, v22: number, v23: number, v24: number, v25: number, v26: number, v27: number, v28: number, v29: number, v30: number, v31: number): number {\n        const o4 = i * 20;\n        const o2 = i * 40;\n        const o1 = i * 80;\n        this.float32[o4 + 0] = v0;\n        this.float32[o4 + 1] = v1;\n        this.int16[o2 + 4] = v2;\n        this.int16[o2 + 5] = v3;\n        this.int16[o2 + 6] = v4;\n        this.int16[o2 + 7] = v5;\n        this.int16[o2 + 8] = v6;\n        this.int16[o2 + 9] = v7;\n        this.int16[o2 + 10] = v8;\n        this.int16[o2 + 11] = v9;\n        this.int16[o2 + 12] = v10;\n        this.uint16[o2 + 13] = v11;\n        this.uint16[o2 + 14] = v12;\n        this.uint16[o2 + 15] = v13;\n        this.uint16[o2 + 16] = v14;\n        this.uint16[o2 + 17] = v15;\n        this.uint16[o2 + 18] = v16;\n        this.uint16[o2 + 19] = v17;\n        this.uint16[o2 + 20] = v18;\n        this.uint16[o2 + 21] = v19;\n        this.uint16[o2 + 22] = v20;\n        this.uint16[o2 + 23] = v21;\n        this.uint16[o2 + 24] = v22;\n        this.uint16[o2 + 25] = v23;\n        this.uint16[o2 + 26] = v24;\n        this.uint16[o2 + 27] = v25;\n        this.uint32[o4 + 14] = v26;\n        this.float32[o4 + 15] = v27;\n        this.float32[o4 + 16] = v28;\n        this.float32[o4 + 17] = v29;\n        this.float32[o4 + 18] = v30;\n        this.uint8[o1 + 76] = v31;\n        return i;\n    }\n}\n\nStructArrayLayout2f9i15ui1ul4f1ub80.prototype.bytesPerElement = 80;\nregister(StructArrayLayout2f9i15ui1ul4f1ub80, 'StructArrayLayout2f9i15ui1ul4f1ub80');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Float32[1]\n *\n * @private\n */\nclass StructArrayLayout1f4 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    float32: Float32Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.float32 = new Float32Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0);\n    }\n\n    emplace(i: number, v0: number): number {\n        const o4 = i * 1;\n        this.float32[o4 + 0] = v0;\n        return i;\n    }\n}\n\nStructArrayLayout1f4.prototype.bytesPerElement = 4;\nregister(StructArrayLayout1f4, 'StructArrayLayout1f4');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Float32[5]\n *\n * @private\n */\nclass StructArrayLayout5f20 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    float32: Float32Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.float32 = new Float32Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number, v2: number, v3: number, v4: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1, v2, v3, v4);\n    }\n\n    emplace(i: number, v0: number, v1: number, v2: number, v3: number, v4: number): number {\n        const o4 = i * 5;\n        this.float32[o4 + 0] = v0;\n        this.float32[o4 + 1] = v1;\n        this.float32[o4 + 2] = v2;\n        this.float32[o4 + 3] = v3;\n        this.float32[o4 + 4] = v4;\n        return i;\n    }\n}\n\nStructArrayLayout5f20.prototype.bytesPerElement = 20;\nregister(StructArrayLayout5f20, 'StructArrayLayout5f20');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Float32[7]\n *\n * @private\n */\nclass StructArrayLayout7f28 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    float32: Float32Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.float32 = new Float32Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number, v2: number, v3: number, v4: number, v5: number, v6: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1, v2, v3, v4, v5, v6);\n    }\n\n    emplace(i: number, v0: number, v1: number, v2: number, v3: number, v4: number, v5: number, v6: number): number {\n        const o4 = i * 7;\n        this.float32[o4 + 0] = v0;\n        this.float32[o4 + 1] = v1;\n        this.float32[o4 + 2] = v2;\n        this.float32[o4 + 3] = v3;\n        this.float32[o4 + 4] = v4;\n        this.float32[o4 + 5] = v5;\n        this.float32[o4 + 6] = v6;\n        return i;\n    }\n}\n\nStructArrayLayout7f28.prototype.bytesPerElement = 28;\nregister(StructArrayLayout7f28, 'StructArrayLayout7f28');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Uint32[1]\n * [4]: Uint16[3]\n *\n * @private\n */\nclass StructArrayLayout1ul3ui12 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    uint32: Uint32Array;\n    uint16: Uint16Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.uint32 = new Uint32Array(this.arrayBuffer);\n        this.uint16 = new Uint16Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number, v2: number, v3: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1, v2, v3);\n    }\n\n    emplace(i: number, v0: number, v1: number, v2: number, v3: number): number {\n        const o4 = i * 3;\n        const o2 = i * 6;\n        this.uint32[o4 + 0] = v0;\n        this.uint16[o2 + 2] = v1;\n        this.uint16[o2 + 3] = v2;\n        this.uint16[o2 + 4] = v3;\n        return i;\n    }\n}\n\nStructArrayLayout1ul3ui12.prototype.bytesPerElement = 12;\nregister(StructArrayLayout1ul3ui12, 'StructArrayLayout1ul3ui12');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Uint16[1]\n *\n * @private\n */\nclass StructArrayLayout1ui2 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    uint16: Uint16Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.uint16 = new Uint16Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0);\n    }\n\n    emplace(i: number, v0: number): number {\n        const o2 = i * 1;\n        this.uint16[o2 + 0] = v0;\n        return i;\n    }\n}\n\nStructArrayLayout1ui2.prototype.bytesPerElement = 2;\nregister(StructArrayLayout1ui2, 'StructArrayLayout1ui2');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Float32[3]\n *\n * @private\n */\nclass StructArrayLayout3f12 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    float32: Float32Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.float32 = new Float32Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number, v2: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1, v2);\n    }\n\n    emplace(i: number, v0: number, v1: number, v2: number): number {\n        const o4 = i * 3;\n        this.float32[o4 + 0] = v0;\n        this.float32[o4 + 1] = v1;\n        this.float32[o4 + 2] = v2;\n        return i;\n    }\n}\n\nStructArrayLayout3f12.prototype.bytesPerElement = 12;\nregister(StructArrayLayout3f12, 'StructArrayLayout3f12');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Float32[16]\n *\n * @private\n */\nclass StructArrayLayout16f64 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    float32: Float32Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.float32 = new Float32Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number, v2: number, v3: number, v4: number, v5: number, v6: number, v7: number, v8: number, v9: number, v10: number, v11: number, v12: number, v13: number, v14: number, v15: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15);\n    }\n\n    emplace(i: number, v0: number, v1: number, v2: number, v3: number, v4: number, v5: number, v6: number, v7: number, v8: number, v9: number, v10: number, v11: number, v12: number, v13: number, v14: number, v15: number): number {\n        const o4 = i * 16;\n        this.float32[o4 + 0] = v0;\n        this.float32[o4 + 1] = v1;\n        this.float32[o4 + 2] = v2;\n        this.float32[o4 + 3] = v3;\n        this.float32[o4 + 4] = v4;\n        this.float32[o4 + 5] = v5;\n        this.float32[o4 + 6] = v6;\n        this.float32[o4 + 7] = v7;\n        this.float32[o4 + 8] = v8;\n        this.float32[o4 + 9] = v9;\n        this.float32[o4 + 10] = v10;\n        this.float32[o4 + 11] = v11;\n        this.float32[o4 + 12] = v12;\n        this.float32[o4 + 13] = v13;\n        this.float32[o4 + 14] = v14;\n        this.float32[o4 + 15] = v15;\n        return i;\n    }\n}\n\nStructArrayLayout16f64.prototype.bytesPerElement = 64;\nregister(StructArrayLayout16f64, 'StructArrayLayout16f64');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Uint16[4]\n * [8]: Float32[3]\n *\n * @private\n */\nclass StructArrayLayout4ui3f20 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    uint16: Uint16Array;\n    float32: Float32Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.uint16 = new Uint16Array(this.arrayBuffer);\n        this.float32 = new Float32Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number, v1: number, v2: number, v3: number, v4: number, v5: number, v6: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0, v1, v2, v3, v4, v5, v6);\n    }\n\n    emplace(i: number, v0: number, v1: number, v2: number, v3: number, v4: number, v5: number, v6: number): number {\n        const o2 = i * 10;\n        const o4 = i * 5;\n        this.uint16[o2 + 0] = v0;\n        this.uint16[o2 + 1] = v1;\n        this.uint16[o2 + 2] = v2;\n        this.uint16[o2 + 3] = v3;\n        this.float32[o4 + 2] = v4;\n        this.float32[o4 + 3] = v5;\n        this.float32[o4 + 4] = v6;\n        return i;\n    }\n}\n\nStructArrayLayout4ui3f20.prototype.bytesPerElement = 20;\nregister(StructArrayLayout4ui3f20, 'StructArrayLayout4ui3f20');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Int16[1]\n *\n * @private\n */\nclass StructArrayLayout1i2 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n    int16: Int16Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n        this.int16 = new Int16Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0);\n    }\n\n    emplace(i: number, v0: number): number {\n        const o2 = i * 1;\n        this.int16[o2 + 0] = v0;\n        return i;\n    }\n}\n\nStructArrayLayout1i2.prototype.bytesPerElement = 2;\nregister(StructArrayLayout1i2, 'StructArrayLayout1i2');\n\n/**\n * Implementation of the StructArray layout:\n * [0]: Uint8[1]\n *\n * @private\n */\nclass StructArrayLayout1ub1 extends StructArray implements IStructArrayLayout {\n    uint8: Uint8Array;\n\n    _refreshViews() {\n        this.uint8 = new Uint8Array(this.arrayBuffer);\n    }\n\n    emplaceBack(v0: number): number {\n        const i = this.length;\n        this.resize(i + 1);\n        return this.emplace(i, v0);\n    }\n\n    emplace(i: number, v0: number): number {\n        const o1 = i * 1;\n        this.uint8[o1 + 0] = v0;\n        return i;\n    }\n}\n\nStructArrayLayout1ub1.prototype.bytesPerElement = 1;\nregister(StructArrayLayout1ub1, 'StructArrayLayout1ub1');\n\nclass CollisionBoxStruct extends Struct {\n    _structArray: CollisionBoxArray;\n    get projectedAnchorX(): number { return this._structArray.int16[this._pos2 + 0]; }\n    get projectedAnchorY(): number { return this._structArray.int16[this._pos2 + 1]; }\n    get projectedAnchorZ(): number { return this._structArray.int16[this._pos2 + 2]; }\n    get tileAnchorX(): number { return this._structArray.int16[this._pos2 + 3]; }\n    get tileAnchorY(): number { return this._structArray.int16[this._pos2 + 4]; }\n    get x1(): number { return this._structArray.float32[this._pos4 + 3]; }\n    get y1(): number { return this._structArray.float32[this._pos4 + 4]; }\n    get x2(): number { return this._structArray.float32[this._pos4 + 5]; }\n    get y2(): number { return this._structArray.float32[this._pos4 + 6]; }\n    get padding(): number { return this._structArray.int16[this._pos2 + 14]; }\n    get featureIndex(): number { return this._structArray.uint32[this._pos4 + 8]; }\n    get sourceLayerIndex(): number { return this._structArray.uint16[this._pos2 + 18]; }\n    get bucketIndex(): number { return this._structArray.uint16[this._pos2 + 19]; }\n}\n\nCollisionBoxStruct.prototype.size = 40;\n\nexport type CollisionBox = CollisionBoxStruct;\n\n/**\n * @private\n */\nexport class CollisionBoxArray extends StructArrayLayout5i4f1i1ul2ui40 {\n    /**\n     * Return the CollisionBoxStruct at the given location in the array.\n     * @param {number} index The index of the element.\n     * @private\n     */\n    get(index: number): CollisionBoxStruct {\n        assert(!this.isTransferred);\n        assert(index >= 0);\n        assert(index < this.length);\n        return new CollisionBoxStruct(this, index);\n    }\n}\n\nregister(CollisionBoxArray, 'CollisionBoxArray');\n\nclass PlacedSymbolStruct extends Struct {\n    _structArray: PlacedSymbolArray;\n    get projectedAnchorX(): number { return this._structArray.int16[this._pos2 + 0]; }\n    get projectedAnchorY(): number { return this._structArray.int16[this._pos2 + 1]; }\n    get projectedAnchorZ(): number { return this._structArray.int16[this._pos2 + 2]; }\n    get tileAnchorX(): number { return this._structArray.float32[this._pos4 + 2]; }\n    get tileAnchorY(): number { return this._structArray.float32[this._pos4 + 3]; }\n    get glyphStartIndex(): number { return this._structArray.uint16[this._pos2 + 8]; }\n    get numGlyphs(): number { return this._structArray.uint16[this._pos2 + 9]; }\n    get vertexStartIndex(): number { return this._structArray.uint32[this._pos4 + 5]; }\n    get lineStartIndex(): number { return this._structArray.uint32[this._pos4 + 6]; }\n    get lineLength(): number { return this._structArray.uint32[this._pos4 + 7]; }\n    get segment(): number { return this._structArray.uint16[this._pos2 + 16]; }\n    get lowerSize(): number { return this._structArray.uint16[this._pos2 + 17]; }\n    get upperSize(): number { return this._structArray.uint16[this._pos2 + 18]; }\n    get lineOffsetX(): number { return this._structArray.float32[this._pos4 + 10]; }\n    get lineOffsetY(): number { return this._structArray.float32[this._pos4 + 11]; }\n    get writingMode(): number { return this._structArray.uint8[this._pos1 + 48]; }\n    get placedOrientation(): number { return this._structArray.uint8[this._pos1 + 49]; }\n    set placedOrientation(x: number) { this._structArray.uint8[this._pos1 + 49] = x; }\n    get hidden(): number { return this._structArray.uint8[this._pos1 + 50]; }\n    set hidden(x: number) { this._structArray.uint8[this._pos1 + 50] = x; }\n    get crossTileID(): number { return this._structArray.uint32[this._pos4 + 13]; }\n    set crossTileID(x: number) { this._structArray.uint32[this._pos4 + 13] = x; }\n    get associatedIconIndex(): number { return this._structArray.int16[this._pos2 + 28]; }\n    get flipState(): number { return this._structArray.uint8[this._pos1 + 58]; }\n    set flipState(x: number) { this._structArray.uint8[this._pos1 + 58] = x; }\n}\n\nPlacedSymbolStruct.prototype.size = 60;\n\nexport type PlacedSymbol = PlacedSymbolStruct;\n\n/**\n * @private\n */\nexport class PlacedSymbolArray extends StructArrayLayout3i2f2ui3ul3ui2f3ub1ul1i1ub60 {\n    /**\n     * Return the PlacedSymbolStruct at the given location in the array.\n     * @param {number} index The index of the element.\n     * @private\n     */\n    get(index: number): PlacedSymbolStruct {\n        assert(!this.isTransferred);\n        assert(index >= 0);\n        assert(index < this.length);\n        return new PlacedSymbolStruct(this, index);\n    }\n}\n\nregister(PlacedSymbolArray, 'PlacedSymbolArray');\n\nclass SymbolInstanceStruct extends Struct {\n    _structArray: SymbolInstanceArray;\n    get tileAnchorX(): number { return this._structArray.float32[this._pos4 + 0]; }\n    get tileAnchorY(): number { return this._structArray.float32[this._pos4 + 1]; }\n    get projectedAnchorX(): number { return this._structArray.int16[this._pos2 + 4]; }\n    get projectedAnchorY(): number { return this._structArray.int16[this._pos2 + 5]; }\n    get projectedAnchorZ(): number { return this._structArray.int16[this._pos2 + 6]; }\n    get rightJustifiedTextSymbolIndex(): number { return this._structArray.int16[this._pos2 + 7]; }\n    get centerJustifiedTextSymbolIndex(): number { return this._structArray.int16[this._pos2 + 8]; }\n    get leftJustifiedTextSymbolIndex(): number { return this._structArray.int16[this._pos2 + 9]; }\n    get verticalPlacedTextSymbolIndex(): number { return this._structArray.int16[this._pos2 + 10]; }\n    get placedIconSymbolIndex(): number { return this._structArray.int16[this._pos2 + 11]; }\n    get verticalPlacedIconSymbolIndex(): number { return this._structArray.int16[this._pos2 + 12]; }\n    get key(): number { return this._structArray.uint16[this._pos2 + 13]; }\n    get textBoxStartIndex(): number { return this._structArray.uint16[this._pos2 + 14]; }\n    get textBoxEndIndex(): number { return this._structArray.uint16[this._pos2 + 15]; }\n    get verticalTextBoxStartIndex(): number { return this._structArray.uint16[this._pos2 + 16]; }\n    get verticalTextBoxEndIndex(): number { return this._structArray.uint16[this._pos2 + 17]; }\n    get iconBoxStartIndex(): number { return this._structArray.uint16[this._pos2 + 18]; }\n    get iconBoxEndIndex(): number { return this._structArray.uint16[this._pos2 + 19]; }\n    get verticalIconBoxStartIndex(): number { return this._structArray.uint16[this._pos2 + 20]; }\n    get verticalIconBoxEndIndex(): number { return this._structArray.uint16[this._pos2 + 21]; }\n    get featureIndex(): number { return this._structArray.uint16[this._pos2 + 22]; }\n    get numHorizontalGlyphVertices(): number { return this._structArray.uint16[this._pos2 + 23]; }\n    get numVerticalGlyphVertices(): number { return this._structArray.uint16[this._pos2 + 24]; }\n    get numIconVertices(): number { return this._structArray.uint16[this._pos2 + 25]; }\n    get numVerticalIconVertices(): number { return this._structArray.uint16[this._pos2 + 26]; }\n    get useRuntimeCollisionCircles(): number { return this._structArray.uint16[this._pos2 + 27]; }\n    get crossTileID(): number { return this._structArray.uint32[this._pos4 + 14]; }\n    set crossTileID(x: number) { this._structArray.uint32[this._pos4 + 14] = x; }\n    get textOffset0(): number { return this._structArray.float32[this._pos4 + 15]; }\n    get textOffset1(): number { return this._structArray.float32[this._pos4 + 16]; }\n    get collisionCircleDiameter(): number { return this._structArray.float32[this._pos4 + 17]; }\n    get zOffset(): number { return this._structArray.float32[this._pos4 + 18]; }\n    set zOffset(x: number) { this._structArray.float32[this._pos4 + 18] = x; }\n    get hasIconTextFit(): number { return this._structArray.uint8[this._pos1 + 76]; }\n}\n\nSymbolInstanceStruct.prototype.size = 80;\n\nexport type SymbolInstance = SymbolInstanceStruct;\n\n/**\n * @private\n */\nexport class SymbolInstanceArray extends StructArrayLayout2f9i15ui1ul4f1ub80 {\n    /**\n     * Return the SymbolInstanceStruct at the given location in the array.\n     * @param {number} index The index of the element.\n     * @private\n     */\n    get(index: number): SymbolInstanceStruct {\n        assert(!this.isTransferred);\n        assert(index >= 0);\n        assert(index < this.length);\n        return new SymbolInstanceStruct(this, index);\n    }\n}\n\nregister(SymbolInstanceArray, 'SymbolInstanceArray');\n\n/**\n * @private\n */\nexport class GlyphOffsetArray extends StructArrayLayout1f4 {\n    getoffsetX(index: number): number { return this.float32[index * 1 + 0]; }\n}\n\nregister(GlyphOffsetArray, 'GlyphOffsetArray');\n\n/**\n * @private\n */\nexport class SymbolLineVertexArray extends StructArrayLayout2i4 {\n    getx(index: number): number { return this.int16[index * 2 + 0]; }\n    gety(index: number): number { return this.int16[index * 2 + 1]; }\n}\n\nregister(SymbolLineVertexArray, 'SymbolLineVertexArray');\n\nclass FeatureIndexStruct extends Struct {\n    _structArray: FeatureIndexArray;\n    get featureIndex(): number { return this._structArray.uint32[this._pos4 + 0]; }\n    get sourceLayerIndex(): number { return this._structArray.uint16[this._pos2 + 2]; }\n    get bucketIndex(): number { return this._structArray.uint16[this._pos2 + 3]; }\n    get layoutVertexArrayOffset(): number { return this._structArray.uint16[this._pos2 + 4]; }\n}\n\nFeatureIndexStruct.prototype.size = 12;\n\nexport type FeatureIndex = FeatureIndexStruct;\n\n/**\n * @private\n */\nexport class FeatureIndexArray extends StructArrayLayout1ul3ui12 {\n    /**\n     * Return the FeatureIndexStruct at the given location in the array.\n     * @param {number} index The index of the element.\n     * @private\n     */\n    get(index: number): FeatureIndexStruct {\n        assert(!this.isTransferred);\n        assert(index >= 0);\n        assert(index < this.length);\n        return new FeatureIndexStruct(this, index);\n    }\n}\n\nregister(FeatureIndexArray, 'FeatureIndexArray');\n\n/**\n * @private\n */\nexport class FillExtrusionCentroidArray extends StructArrayLayout2ui4 {\n    geta_centroid_pos0(index: number): number { return this.uint16[index * 2 + 0]; }\n    geta_centroid_pos1(index: number): number { return this.uint16[index * 2 + 1]; }\n}\n\nregister(FillExtrusionCentroidArray, 'FillExtrusionCentroidArray');\n\nexport {\n    StructArrayLayout2i4,\n    StructArrayLayout3i6,\n    StructArrayLayout4i8,\n    StructArrayLayout5i10,\n    StructArrayLayout2i4ub1f12,\n    StructArrayLayout4f16,\n    StructArrayLayout2f8,\n    StructArrayLayout4ui1f12,\n    StructArrayLayout4ui8,\n    StructArrayLayout6i12,\n    StructArrayLayout4i4ui4i24,\n    StructArrayLayout3i3f20,\n    StructArrayLayout1ul4,\n    StructArrayLayout2ui4,\n    StructArrayLayout5i4f1i1ul2ui40,\n    StructArrayLayout3i2i2i16,\n    StructArrayLayout2f1f2i16,\n    StructArrayLayout2ub2f12,\n    StructArrayLayout3ui6,\n    StructArrayLayout3i2f2ui3ul3ui2f3ub1ul1i1ub60,\n    StructArrayLayout2f9i15ui1ul4f1ub80,\n    StructArrayLayout1f4,\n    StructArrayLayout5f20,\n    StructArrayLayout7f28,\n    StructArrayLayout1ul3ui12,\n    StructArrayLayout1ui2,\n    StructArrayLayout3f12,\n    StructArrayLayout16f64,\n    StructArrayLayout4ui3f20,\n    StructArrayLayout1i2,\n    StructArrayLayout1ub1,\n    StructArrayLayout2i4 as PosArray,\n    StructArrayLayout3i6 as PosGlobeExtArray,\n    StructArrayLayout4i8 as RasterBoundsArray,\n    StructArrayLayout2i4 as CircleLayoutArray,\n    StructArrayLayout2i4 as FillLayoutArray,\n    StructArrayLayout4i8 as FillExtrusionLayoutArray,\n    StructArrayLayout5i10 as FillExtrusionGroundLayoutArray,\n    StructArrayLayout2i4 as HeatmapLayoutArray,\n    StructArrayLayout2i4ub1f12 as LineLayoutArray,\n    StructArrayLayout4f16 as LineExtLayoutArray,\n    StructArrayLayout2f8 as LinePatternLayoutArray,\n    StructArrayLayout4ui1f12 as PatternLayoutArray,\n    StructArrayLayout4ui8 as DashLayoutArray,\n    StructArrayLayout6i12 as FillExtrusionExtArray,\n    StructArrayLayout4i4ui4i24 as SymbolLayoutArray,\n    StructArrayLayout3i3f20 as SymbolGlobeExtArray,\n    StructArrayLayout4f16 as SymbolDynamicLayoutArray,\n    StructArrayLayout1ul4 as SymbolOpacityArray,\n    StructArrayLayout2ui4 as SymbolIconTransitioningArray,\n    StructArrayLayout3i2i2i16 as CollisionBoxLayoutArray,\n    StructArrayLayout2f1f2i16 as CollisionCircleLayoutArray,\n    StructArrayLayout2ub2f12 as CollisionVertexArray,\n    StructArrayLayout4f16 as CollisionVertexExtArray,\n    StructArrayLayout3ui6 as QuadTriangleArray,\n    StructArrayLayout1f4 as ZOffsetVertexArray,\n    StructArrayLayout5f20 as GlobeVertexArray,\n    StructArrayLayout5f20 as AtmosphereVertexArray,\n    StructArrayLayout7f28 as StarsVertexArray,\n    StructArrayLayout3ui6 as TriangleIndexArray,\n    StructArrayLayout2ui4 as LineIndexArray,\n    StructArrayLayout1ui2 as LineStripIndexArray,\n    StructArrayLayout3f12 as SkyboxVertexArray,\n    StructArrayLayout4i8 as TileBoundsArray,\n    StructArrayLayout3f12 as ModelLayoutArray,\n    StructArrayLayout3f12 as Color3fLayoutArray,\n    StructArrayLayout4f16 as Color4fLayoutArray,\n    StructArrayLayout2f8 as TexcoordLayoutArray,\n    StructArrayLayout3f12 as NormalLayoutArray,\n    StructArrayLayout16f64 as InstanceVertexArray,\n    StructArrayLayout4ui3f20 as FeatureVertexArray,\n    StructArrayLayout1i2 as ParticleIndexLayoutArray,\n    StructArrayLayout1ub1 as FillExtrusionHiddenByLandmarkArray,\n    StructArrayLayout6i12 as CircleGlobeExtArray\n};\n","// @flow\nimport {createLayout} from '../../util/struct_array.js';\n\nimport type {StructArrayLayout} from '../../util/struct_array.js';\n\nexport const circleAttributes: StructArrayLayout = createLayout([\n    {name: 'a_pos', components: 2, type: 'Int16'}\n], 4);\n\nexport const circleGlobeAttributesExt: StructArrayLayout = createLayout([\n    {name: 'a_pos_3', components: 3, type: 'Int16'},\n    {name: 'a_pos_normal_3', components: 3, type: 'Int16'}\n]);\n\nexport const {members, size, alignment} = circleAttributes;\n","// @flow\n\nimport {warnOnce} from '../util/util.js';\n\nimport {register} from '../util/web_worker_transfer.js';\n\nimport type VertexArrayObject from '../render/vertex_array_object.js';\nimport type {StructArray} from '../util/struct_array.js';\n\nexport type Segment = {\n    sortKey: number | void,\n    vertexOffset: number,\n    primitiveOffset: number,\n    vertexLength: number,\n    primitiveLength: number,\n    vaos: {[_: string]: VertexArrayObject}\n}\n\nclass SegmentVector {\n    static MAX_VERTEX_ARRAY_LENGTH: number;\n    segments: Array<Segment>;\n\n    constructor(segments?: Array<Segment> = []) {\n        this.segments = segments;\n    }\n\n    _prepareSegment(numVertices: number, vertexArrayLength: number, indexArrayLength: number, sortKey?: number): Segment {\n        let segment: Segment = this.segments[this.segments.length - 1];\n        if (numVertices > SegmentVector.MAX_VERTEX_ARRAY_LENGTH) warnOnce(`Max vertices per segment is ${SegmentVector.MAX_VERTEX_ARRAY_LENGTH}: bucket requested ${numVertices}`);\n        if (!segment || segment.vertexLength + numVertices > SegmentVector.MAX_VERTEX_ARRAY_LENGTH || segment.sortKey !== sortKey) {\n            segment = ({\n                vertexOffset: vertexArrayLength,\n                primitiveOffset: indexArrayLength,\n                vertexLength: 0,\n                primitiveLength: 0\n            }: any);\n            if (sortKey !== undefined) segment.sortKey = sortKey;\n            this.segments.push(segment);\n        }\n        return segment;\n    }\n\n    prepareSegment(numVertices: number, layoutVertexArray: StructArray, indexArray: StructArray, sortKey?: number): Segment {\n        return this._prepareSegment(numVertices, layoutVertexArray.length, indexArray.length, sortKey);\n    }\n\n    get(): Array<Segment> {\n        return this.segments;\n    }\n\n    destroy() {\n        for (const segment of this.segments) {\n            for (const k in segment.vaos) {\n                segment.vaos[k].destroy();\n            }\n        }\n    }\n\n    static simpleSegment(vertexOffset: number, primitiveOffset: number, vertexLength: number, primitiveLength: number): SegmentVector {\n        return new SegmentVector([{\n            vertexOffset,\n            primitiveOffset,\n            vertexLength,\n            primitiveLength,\n            vaos: {},\n            sortKey: 0\n        }]);\n    }\n}\n\n/*\n * The maximum size of a vertex array. This limit is imposed by WebGL's 16 bit\n * addressing of vertex buffers.\n * @private\n * @readonly\n */\nSegmentVector.MAX_VERTEX_ARRAY_LENGTH = Math.pow(2, 16) - 1;\n\nregister(SegmentVector, 'SegmentVector');\nexport default SegmentVector;\n","// @flow\n\nimport {clamp} from '../util/util.js';\n\n/**\n * Packs two numbers, interpreted as 8-bit unsigned integers, into a single\n * float.  Unpack them in the shader using the `unpack_float()` function,\n * defined in _prelude.vertex.glsl\n *\n * @private\n */\nexport function packUint8ToFloat(a: number, b: number): number {\n    // coerce a and b to 8-bit ints\n    a = clamp(Math.floor(a), 0, 255);\n    b = clamp(Math.floor(b), 0, 255);\n    return 256 * a + b;\n}\n","// @flow\nimport {createLayout} from '../../util/struct_array.js';\n\nimport type {StructArrayLayout} from '../../util/struct_array.js';\n\nconst patternAttributes: StructArrayLayout = createLayout([\n    // [tl.x, tl.y, br.x, br.y]\n    {name: 'a_pattern', components: 4, type: 'Uint16'},\n    {name: 'a_pixel_ratio', components: 1, type: 'Float32'}\n]);\n\nexport default patternAttributes;\n","// @flow\nimport {createLayout} from '../../util/struct_array.js';\n\nimport type {StructArrayLayout} from '../../util/struct_array.js';\n\nconst dashAttributes: StructArrayLayout = createLayout([\n    {name: 'a_dash', components: 4, type: 'Uint16'} // [x, y, width, unused]\n]);\n\nexport default dashAttributes;\n","// @flow\n\nimport murmur3 from 'murmurhash-js';\nimport {register} from '../util/web_worker_transfer.js';\nimport assert from 'assert';\n\ntype SerializedFeaturePositionMap = {\n    ids: Float64Array;\n    positions: Uint32Array;\n};\n\n// A transferable data structure that maps feature ids to their indices and buffer offsets\nexport default class FeaturePositionMap {\n    ids: Array<number>;\n    uniqueIds: Array<number>;\n    positions: Array<number>;\n    indexed: boolean;\n\n    constructor() {\n        this.ids = [];\n        this.uniqueIds = [];\n        this.positions = [];\n        this.indexed = false;\n    }\n\n    add(id: mixed, index: number, start: number, end: number) {\n        this.ids.push(getNumericId(id));\n        this.positions.push(index, start, end);\n    }\n\n    eachPosition(id: mixed, fn: (index: number, start: number, end: number) => void) {\n        assert(this.indexed);\n\n        const intId = getNumericId(id);\n\n        // binary search for the first occurrence of id in this.ids;\n        // relies on ids/positions being sorted by id, which happens in serialization\n        let i = 0;\n        let j = this.ids.length - 1;\n        while (i < j) {\n            const m = (i + j) >> 1;\n            if (this.ids[m] >= intId) {\n                j = m;\n            } else {\n                i = m + 1;\n            }\n        }\n        while (this.ids[i] === intId) {\n            const index = this.positions[3 * i];\n            const start = this.positions[3 * i + 1];\n            const end = this.positions[3 * i + 2];\n            fn(index, start, end);\n            i++;\n        }\n    }\n\n    static serialize(map: FeaturePositionMap, transferables: Set<ArrayBuffer>): SerializedFeaturePositionMap {\n        const ids = new Float64Array(map.ids);\n        const positions = new Uint32Array(map.positions);\n\n        sort(ids, positions, 0, ids.length - 1);\n\n        if (transferables) {\n            transferables.add(ids.buffer);\n            transferables.add(positions.buffer);\n        }\n\n        return {ids, positions};\n    }\n\n    static deserialize(obj: SerializedFeaturePositionMap): FeaturePositionMap {\n        const map = new FeaturePositionMap();\n        // after transferring, we only use these arrays statically (no pushes),\n        // so TypedArray vs Array distinction that flow points out doesn't matter\n        map.ids = (obj.ids: any);\n        map.positions = (obj.positions: any);\n        let prev;\n        for (const id of map.ids) {\n            if (id !== prev) map.uniqueIds.push(id);\n            prev = id;\n        }\n        map.indexed = true;\n        return map;\n    }\n}\n\nfunction getNumericId(value: mixed) {\n    const numValue = +value;\n    if (!isNaN(numValue) && Number.MIN_SAFE_INTEGER <= numValue && numValue <= Number.MAX_SAFE_INTEGER) {\n        return numValue;\n    }\n    return murmur3(String(value));\n}\n\n// custom quicksort that sorts ids, indices and offsets together (by ids)\n// uses Hoare partitioning & manual tail call optimization to avoid worst case scenarios\nfunction sort(ids: Float64Array, positions: Uint32Array, left: number, right: number) {\n    while (left < right) {\n        const pivot = ids[(left + right) >> 1];\n        let i = left - 1;\n        let j = right + 1;\n\n        while (true) {\n            do i++; while (ids[i] < pivot);\n            do j--; while (ids[j] > pivot);\n            if (i >= j) break;\n            swap(ids, i, j);\n            swap(positions, 3 * i, 3 * j);\n            swap(positions, 3 * i + 1, 3 * j + 1);\n            swap(positions, 3 * i + 2, 3 * j + 2);\n        }\n\n        if (j - left < right - j) {\n            sort(ids, positions, left, j);\n            left = j + 1;\n        } else {\n            sort(ids, positions, j + 1, right);\n            right = j;\n        }\n    }\n}\n\nfunction swap(arr: Uint32Array | Float64Array, i: number, j: number) {\n    const tmp = arr[i];\n    arr[i] = arr[j];\n    arr[j] = tmp;\n}\n\nregister(FeaturePositionMap, 'FeaturePositionMap');\n","// @flow\n\nimport Color from '../style-spec/util/color.js';\nimport type Context from '../gl/context.js';\nimport type {ObjMap} from '../types/obj-map.js';\n\nexport type UniformValues<Us: Object>\n    = $Exact<ObjMap<Us, <V>(u: IUniform<V>) => V>>;\n\nexport interface IUniform<T> {\n    gl: WebGL2RenderingContext;\n    location: WebGLUniformLocation | null | void;\n    current: T;\n    initialized: boolean;\n    fetchUniformLocation(program: WebGLProgram, name: string): boolean;\n    set(program: WebGLProgram, name: string, v: T): void;\n}\n\nclass Uniform<T> implements IUniform<T> {\n    gl: WebGL2RenderingContext;\n    location: ?WebGLUniformLocation;\n    current: T;\n    initialized: boolean;\n\n    constructor(context: Context) {\n        this.gl = context.gl;\n        this.initialized = false;\n    }\n\n    fetchUniformLocation(program: WebGLProgram, name: string): boolean {\n        if (!this.location && !this.initialized) {\n            this.location = this.gl.getUniformLocation(program, name);\n            this.initialized = true;\n        }\n        return !!this.location;\n    }\n\n    set(_program: WebGLProgram, _name: string, _v: T): void {\n        throw new Error('Uniform#set() must be implemented by each concrete Uniform');\n    }\n}\n\nclass Uniform1i extends Uniform<number> implements IUniform<number> {\n    constructor(context: Context) {\n        super(context);\n        this.current = 0;\n    }\n\n    set(program: WebGLProgram, name: string, v: number): void {\n        if (!this.fetchUniformLocation(program, name)) return;\n        if (this.current !== v) {\n            this.current = v;\n            this.gl.uniform1i(this.location, v);\n        }\n    }\n}\n\nclass Uniform1f extends Uniform<number> implements IUniform<number> {\n    constructor(context: Context) {\n        super(context);\n        this.current = 0;\n    }\n\n    set(program: WebGLProgram, name: string, v: number): void {\n        if (!this.fetchUniformLocation(program, name)) return;\n        if (this.current !== v) {\n            this.current = v;\n            this.gl.uniform1f(this.location, v);\n        }\n    }\n}\n\nclass Uniform2f extends Uniform<[number, number]> implements IUniform<[number, number]> {\n    constructor(context: Context) {\n        super(context);\n        this.current = [0, 0];\n    }\n\n    set(program: WebGLProgram, name: string, v: [number, number]): void {\n        if (!this.fetchUniformLocation(program, name)) return;\n        if (v[0] !== this.current[0] || v[1] !== this.current[1]) {\n            this.current = v;\n            this.gl.uniform2f(this.location, v[0], v[1]);\n        }\n    }\n}\n\nclass Uniform3f extends Uniform<[number, number, number]> implements IUniform<[number, number, number]> {\n    constructor(context: Context) {\n        super(context);\n        this.current = [0, 0, 0];\n    }\n\n    set(program: WebGLProgram, name: string, v: [number, number, number]): void {\n        if (!this.fetchUniformLocation(program, name)) return;\n        if (v[0] !== this.current[0] || v[1] !== this.current[1] || v[2] !== this.current[2]) {\n            this.current = v;\n            this.gl.uniform3f(this.location, v[0], v[1], v[2]);\n        }\n    }\n}\n\nclass Uniform4f extends Uniform<[number, number, number, number]> implements IUniform<[number, number, number, number]> {\n    constructor(context: Context) {\n        super(context);\n        this.current = [0, 0, 0, 0];\n    }\n\n    set(program: WebGLProgram, name: string, v: [number, number, number, number]): void {\n        if (!this.fetchUniformLocation(program, name)) return;\n        if (v[0] !== this.current[0] || v[1] !== this.current[1] ||\n            v[2] !== this.current[2] || v[3] !== this.current[3]) {\n            this.current = v;\n            this.gl.uniform4f(this.location, v[0], v[1], v[2], v[3]);\n        }\n    }\n}\n\nclass UniformColor extends Uniform<Color> implements IUniform<Color> {\n    constructor(context: Context) {\n        super(context);\n        this.current = Color.transparent;\n    }\n\n    set(program: WebGLProgram, name: string, v: Color): void {\n        if (!this.fetchUniformLocation(program, name)) return;\n        if (v.r !== this.current.r || v.g !== this.current.g ||\n            v.b !== this.current.b || v.a !== this.current.a) {\n            this.current = v;\n            this.gl.uniform4f(this.location, v.r, v.g, v.b, v.a);\n        }\n    }\n}\n\nconst emptyMat4 = new Float32Array(16);\nclass UniformMatrix4f extends Uniform<Float32Array> implements IUniform<Float32Array> {\n    constructor(context: Context) {\n        super(context);\n        this.current = emptyMat4;\n    }\n\n    set(program: WebGLProgram, name: string, v: Float32Array): void {\n        if (!this.fetchUniformLocation(program, name)) return;\n        // The vast majority of matrix comparisons that will trip this set\n        // happen at i=12 or i=0, so we check those first to avoid lots of\n        // unnecessary iteration:\n        if (v[12] !== this.current[12] || v[0] !== this.current[0]) {\n            this.current = v;\n            this.gl.uniformMatrix4fv(this.location, false, v);\n            return;\n        }\n        for (let i = 1; i < 16; i++) {\n            if (v[i] !== this.current[i]) {\n                this.current = v;\n                this.gl.uniformMatrix4fv(this.location, false, v);\n                break;\n            }\n        }\n    }\n}\n\nconst emptyMat3 = new Float32Array(9);\nclass UniformMatrix3f extends Uniform<Float32Array> implements IUniform<Float32Array> {\n    constructor(context: Context) {\n        super(context);\n        this.current = emptyMat3;\n    }\n\n    set(program: WebGLProgram, name: string, v: Float32Array): void {\n        if (!this.fetchUniformLocation(program, name)) return;\n        for (let i = 0; i < 9; i++) {\n            if (v[i] !== this.current[i]) {\n                this.current = v;\n                this.gl.uniformMatrix3fv(this.location, false, v);\n                break;\n            }\n        }\n    }\n}\n\nconst emptyMat2 = new Float32Array(4);\nclass UniformMatrix2f extends Uniform<Float32Array> implements IUniform<Float32Array> {\n    constructor(context: Context) {\n        super(context);\n        this.current = emptyMat2;\n    }\n\n    set(program: WebGLProgram, name: string, v: Float32Array): void {\n        if (!this.fetchUniformLocation(program, name)) return;\n        for (let i = 0; i < 4; i++) {\n            if (v[i] !== this.current[i]) {\n                this.current = v;\n                this.gl.uniformMatrix2fv(this.location, false, v);\n                break;\n            }\n        }\n    }\n}\n\nexport {\n    Uniform1i,\n    Uniform1f,\n    Uniform2f,\n    Uniform3f,\n    Uniform4f,\n    UniformColor,\n    UniformMatrix2f,\n    UniformMatrix3f,\n    UniformMatrix4f\n};\n\nexport type UniformBindings = {[_: string]: IUniform<any>};\n","// @flow\n\nimport {packUint8ToFloat} from '../shaders/encode_attribute.js';\nimport Color from '../style-spec/util/color.js';\nimport {supportsPropertyExpression} from '../style-spec/util/properties.js';\nimport {register} from '../util/web_worker_transfer.js';\nimport {PossiblyEvaluatedPropertyValue} from '../style/properties.js';\nimport {StructArrayLayout1f4, StructArrayLayout2f8, StructArrayLayout4f16, PatternLayoutArray, DashLayoutArray} from './array_types.js';\nimport {clamp} from '../util/util.js';\nimport patternAttributes from './bucket/pattern_attributes.js';\nimport dashAttributes from './bucket/dash_attributes.js';\nimport EvaluationParameters from '../style/evaluation_parameters.js';\nimport FeaturePositionMap from './feature_position_map.js';\nimport {\n    Uniform1f,\n    UniformColor,\n    Uniform4f\n} from '../render/uniform_binding.js';\nimport assert from 'assert';\n\nimport type {Class} from '../../src/types/class.js';\nimport type {CanonicalTileID} from '../source/tile_id.js';\nimport type Context from '../gl/context.js';\nimport type {TypedStyleLayer} from '../style/style_layer/typed_style_layer.js';\nimport type {StructArray, StructArrayMember} from '../util/struct_array.js';\nimport type VertexBuffer from '../gl/vertex_buffer.js';\nimport type {SpritePosition, SpritePositions} from '../util/image.js';\nimport type {\n    Feature,\n    FeatureState,\n    GlobalProperties,\n    SourceExpression,\n    CompositeExpression\n} from '../style-spec/expression/index.js';\nimport type {PossiblyEvaluated} from '../style/properties.js';\nimport type {FeatureStates} from '../source/source_state.js';\nimport type {FormattedSection} from '../style-spec/expression/types/formatted.js';\nimport type {IVectorTileLayer} from '@mapbox/vector-tile';\nimport type {IUniform} from '../render/uniform_binding.js';\n\nexport type BinderUniform = {\n    name: string,\n    property: string,\n    binding: IUniform<any>\n};\n\nfunction packColor(color: Color): [number, number] {\n    return [\n        packUint8ToFloat(255 * color.r, 255 * color.g),\n        packUint8ToFloat(255 * color.b, 255 * color.a)\n    ];\n}\n\n/**\n *  `Binder` is the interface definition for the strategies for constructing,\n *  uploading, and binding paint property data as GLSL attributes. Most style-\n *  spec properties have a 1:1 relationship to shader attribute/uniforms, but\n *  some require multiple values per feature to be passed to the GPU, and in\n *  those cases we bind multiple attributes/uniforms.\n *\n *  It has three implementations, one for each of the three strategies we use:\n *\n *  * For _constant_ properties -- those whose value is a constant, or the constant\n *    result of evaluating a camera expression at a particular camera position -- we\n *    don't need a vertex attribute buffer, and instead use a uniform.\n *  * For data expressions, we use a vertex buffer with a single attribute value,\n *    the evaluated result of the source function for the given feature.\n *  * For composite expressions, we use a vertex buffer with two attributes: min and\n *    max values covering the range of zooms at which we expect the tile to be\n *    displayed. These values are calculated by evaluating the composite expression for\n *    the given feature at strategically chosen zoom levels. In addition to this\n *    attribute data, we also use a uniform value which the shader uses to interpolate\n *    between the min and max value at the final displayed zoom level. The use of a\n *    uniform allows us to cheaply update the value on every frame.\n *\n *  Note that the shader source varies depending on whether we're using a uniform or\n *  attribute. We dynamically compile shaders at runtime to accommodate this.\n *\n * @private\n */\n\ninterface AttributeBinder {\n    populatePaintArray(length: number, feature: Feature, imagePositions: SpritePositions, availableImages: Array<string>, canonical?: CanonicalTileID, brightness: ?number, formattedSection?: FormattedSection): void;\n    updatePaintArray(start: number, length: number, feature: Feature, featureState: FeatureState, availableImages: Array<string>, imagePositions: SpritePositions, brightness: number): void;\n    upload(Context): void;\n    destroy(): void;\n}\n\ninterface UniformBinder {\n    uniformNames: Array<string>;\n    setUniform(program: WebGLProgram, uniform: IUniform<any>, globals: GlobalProperties, currentValue: PossiblyEvaluatedPropertyValue<*>, uniformName: string): void;\n    getBinding(context: Context, name: string): $Shape<IUniform<any>>;\n}\n\nclass ConstantBinder implements UniformBinder {\n    value: mixed;\n    type: string;\n    uniformNames: Array<string>;\n\n    constructor(value: mixed, names: Array<string>, type: string) {\n        this.value = value;\n        this.uniformNames = names.map(name => `u_${name}`);\n        this.type = type;\n    }\n\n    setUniform(program: WebGLProgram, uniform: IUniform<any>, globals: GlobalProperties, currentValue: PossiblyEvaluatedPropertyValue<mixed>, uniformName: string): void {\n        uniform.set(program, uniformName, currentValue.constantOr(this.value));\n    }\n\n    // $FlowFixMe[method-unbinding]\n    getBinding(context: Context, _: string): $Shape<IUniform<any>> {\n        // $FlowFixMe[method-unbinding]\n        return (this.type === 'color') ?\n            new UniformColor(context) :\n            new Uniform1f(context);\n    }\n}\n\nclass PatternConstantBinder implements UniformBinder {\n    uniformNames: Array<string>;\n    pattern: ?Array<number>;\n    pixelRatio: number;\n\n    constructor(value: mixed, names: Array<string>) {\n        this.uniformNames = names.map(name => `u_${name}`);\n        this.pattern = null;\n        this.pixelRatio = 1;\n    }\n\n    setConstantPatternPositions(posTo: SpritePosition) {\n        this.pixelRatio = posTo.pixelRatio || 1;\n        this.pattern = posTo.tl.concat(posTo.br);\n    }\n\n    setUniform(program: WebGLProgram, uniform: IUniform<any>, globals: GlobalProperties, currentValue: PossiblyEvaluatedPropertyValue<mixed>, uniformName: string) {\n        const pos =\n            uniformName === 'u_pattern' || uniformName === 'u_dash' ? this.pattern :\n            uniformName === 'u_pixel_ratio' ? this.pixelRatio : null;\n        if (pos) uniform.set(program, uniformName, pos);\n    }\n\n    // $FlowFixMe[method-unbinding]\n    getBinding(context: Context, name: string): $Shape<IUniform<any>> {\n        // $FlowFixMe[method-unbinding]\n        return name === 'u_pattern' || name === 'u_dash' ?\n            new Uniform4f(context) :\n            new Uniform1f(context);\n    }\n}\n\nclass SourceExpressionBinder implements AttributeBinder {\n    expression: SourceExpression;\n    type: string;\n    maxValue: number;\n\n    paintVertexArray: StructArray;\n    paintVertexAttributes: Array<StructArrayMember>;\n    paintVertexBuffer: ?VertexBuffer;\n\n    constructor(expression: SourceExpression, names: Array<string>, type: string, PaintVertexArray: Class<StructArray>) {\n        this.expression = expression;\n        this.type = type;\n        this.maxValue = 0;\n        this.paintVertexAttributes = names.map((name) => ({\n            name: `a_${name}`,\n            type: 'Float32',\n            components: type === 'color' ? 2 : 1,\n            offset: 0\n        }));\n        this.paintVertexArray = new PaintVertexArray();\n    }\n\n    populatePaintArray(newLength: number, feature: Feature, imagePositions: SpritePositions, availableImages: Array<string>, canonical?: CanonicalTileID, brightness: ?number, formattedSection?: FormattedSection) {\n        const start = this.paintVertexArray.length;\n        assert(Array.isArray(availableImages));\n        // $FlowFixMe[method-unbinding]\n        const value = this.expression.evaluate(new EvaluationParameters(0, {brightness}), feature, {}, canonical, availableImages, formattedSection);\n        this.paintVertexArray.resize(newLength);\n        this._setPaintValue(start, newLength, value);\n    }\n\n    updatePaintArray(start: number, end: number, feature: Feature, featureState: FeatureState, availableImages: Array<string>, spritePositions: SpritePositions, brightness: number) {\n        const value = this.expression.evaluate({zoom: 0, brightness}, feature, featureState, undefined, availableImages);\n        this._setPaintValue(start, end, value);\n    }\n\n    _setPaintValue(start: number, end: number, value: any) {\n        if (this.type === 'color') {\n            const color = packColor(value);\n            for (let i = start; i < end; i++) {\n                this.paintVertexArray.emplace(i, color[0], color[1]);\n            }\n        } else {\n            for (let i = start; i < end; i++) {\n                this.paintVertexArray.emplace(i, value);\n            }\n            this.maxValue = Math.max(this.maxValue, Math.abs(value));\n        }\n    }\n\n    upload(context: Context) {\n        if (this.paintVertexArray && this.paintVertexArray.arrayBuffer) {\n            if (this.paintVertexBuffer && this.paintVertexBuffer.buffer) {\n                this.paintVertexBuffer.updateData(this.paintVertexArray);\n            } else {\n                this.paintVertexBuffer = context.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent || !this.expression.isLightConstant);\n            }\n        }\n    }\n\n    destroy() {\n        if (this.paintVertexBuffer) {\n            this.paintVertexBuffer.destroy();\n        }\n    }\n}\n\nclass CompositeExpressionBinder implements AttributeBinder, UniformBinder {\n    expression: CompositeExpression;\n    uniformNames: Array<string>;\n    type: string;\n    useIntegerZoom: boolean;\n    zoom: number;\n    maxValue: number;\n\n    paintVertexArray: StructArray;\n    paintVertexAttributes: Array<StructArrayMember>;\n    paintVertexBuffer: ?VertexBuffer;\n\n    constructor(expression: CompositeExpression, names: Array<string>, type: string, useIntegerZoom: boolean, zoom: number, PaintVertexArray: Class<StructArray>) {\n        this.expression = expression;\n        this.uniformNames = names.map(name => `u_${name}_t`);\n        this.type = type;\n        this.useIntegerZoom = useIntegerZoom;\n        this.zoom = zoom;\n        this.maxValue = 0;\n        this.paintVertexAttributes = names.map((name) => ({\n            name: `a_${name}`,\n            type: 'Float32',\n            components: type === 'color' ? 4 : 2,\n            offset: 0\n        }));\n        this.paintVertexArray = new PaintVertexArray();\n    }\n\n    populatePaintArray(newLength: number, feature: Feature, imagePositions: SpritePositions, availableImages: Array<string>, canonical?: CanonicalTileID, brightness: ?number, formattedSection?: FormattedSection) {\n        // $FlowFixMe[method-unbinding]\n        const min = this.expression.evaluate(new EvaluationParameters(this.zoom, {brightness}), feature, {}, canonical, availableImages, formattedSection);\n        // $FlowFixMe[method-unbinding]\n        const max = this.expression.evaluate(new EvaluationParameters(this.zoom + 1, {brightness}), feature, {}, canonical, availableImages, formattedSection);\n        const start = this.paintVertexArray.length;\n        this.paintVertexArray.resize(newLength);\n        this._setPaintValue(start, newLength, min, max);\n    }\n\n    updatePaintArray(start: number, end: number, feature: Feature, featureState: FeatureState, availableImages: Array<string>, spritePositions: SpritePositions, brightness: number) {\n        const min = this.expression.evaluate({zoom: this.zoom, brightness}, feature, featureState, undefined, availableImages);\n        const max = this.expression.evaluate({zoom: this.zoom + 1, brightness}, feature, featureState, undefined, availableImages);\n        this._setPaintValue(start, end, min, max);\n    }\n\n    _setPaintValue(start: number, end: number, min: any, max: any) {\n        if (this.type === 'color') {\n            const minColor = packColor(min);\n            const maxColor = packColor(max);\n            for (let i = start; i < end; i++) {\n                this.paintVertexArray.emplace(i, minColor[0], minColor[1], maxColor[0], maxColor[1]);\n            }\n        } else {\n            for (let i = start; i < end; i++) {\n                this.paintVertexArray.emplace(i, min, max);\n            }\n            this.maxValue = Math.max(this.maxValue, Math.abs(min), Math.abs(max));\n        }\n    }\n\n    upload(context: Context) {\n        if (this.paintVertexArray && this.paintVertexArray.arrayBuffer) {\n            if (this.paintVertexBuffer && this.paintVertexBuffer.buffer) {\n                this.paintVertexBuffer.updateData(this.paintVertexArray);\n            } else {\n                this.paintVertexBuffer = context.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent || !this.expression.isLightConstant);\n            }\n        }\n    }\n\n    destroy() {\n        if (this.paintVertexBuffer) {\n            this.paintVertexBuffer.destroy();\n        }\n    }\n\n    setUniform(program: WebGLProgram, uniform: IUniform<any>, globals: GlobalProperties, _: PossiblyEvaluatedPropertyValue<*>, uniformName: string): void {\n        const currentZoom = this.useIntegerZoom ? Math.floor(globals.zoom) : globals.zoom;\n        const factor = clamp(this.expression.interpolationFactor(currentZoom, this.zoom, this.zoom + 1), 0, 1);\n        uniform.set(program, uniformName, factor);\n    }\n\n    // $FlowFixMe[method-unbinding]\n    getBinding(context: Context, _: string): Uniform1f {\n        return new Uniform1f(context);\n    }\n}\n\nclass PatternCompositeBinder implements AttributeBinder {\n    expression: CompositeExpression;\n    layerId: string;\n\n    paintVertexArray: StructArray;\n    paintVertexBuffer: ?VertexBuffer;\n    paintVertexAttributes: Array<StructArrayMember>;\n\n    constructor(expression: CompositeExpression, names: Array<string>, type: string, PaintVertexArray: Class<StructArray>, layerId: string) {\n        this.expression = expression;\n        this.layerId = layerId;\n\n        this.paintVertexAttributes = (type === 'array' ? dashAttributes : patternAttributes).members;\n        for (let i = 0; i < names.length; ++i) {\n            assert(`a_${names[i]}` === this.paintVertexAttributes[i].name);\n        }\n\n        this.paintVertexArray = new PaintVertexArray();\n    }\n\n    populatePaintArray(length: number, feature: Feature, imagePositions: SpritePositions) {\n        const start = this.paintVertexArray.length;\n        this.paintVertexArray.resize(length);\n        this._setPaintValues(start, length, feature.patterns && feature.patterns[this.layerId], imagePositions);\n    }\n\n    updatePaintArray(start: number, end: number, feature: Feature, featureState: FeatureState, availableImages: Array<string>, imagePositions: SpritePositions, _?: ?number) {\n        this._setPaintValues(start, end, feature.patterns && feature.patterns[this.layerId], imagePositions);\n    }\n\n    _setPaintValues(start: number, end: number, patterns: ?string, positions: SpritePositions) {\n        if (!positions || !patterns) return;\n\n        const pos = positions[patterns];\n        if (!pos) return;\n\n        const {tl, br, pixelRatio} = pos;\n        for (let i = start; i < end; i++) {\n            this.paintVertexArray.emplace(i, tl[0], tl[1], br[0], br[1], ((pixelRatio: any): number));\n        }\n    }\n\n    upload(context: Context) {\n        if (this.paintVertexArray && this.paintVertexArray.arrayBuffer) {\n            this.paintVertexBuffer = context.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent || !this.expression.isLightConstant);\n        }\n    }\n\n    destroy() {\n        if (this.paintVertexBuffer) this.paintVertexBuffer.destroy();\n    }\n}\n\n/**\n * ProgramConfiguration contains the logic for binding style layer properties and tile\n * layer feature data into GL program uniforms and vertex attributes.\n *\n * Non-data-driven property values are bound to shader uniforms. Data-driven property\n * values are bound to vertex attributes. In order to support a uniform GLSL syntax over\n * both, [Mapbox GL Shaders](https://github.com/mapbox/mapbox-gl-shaders) defines a `#pragma`\n * abstraction, which ProgramConfiguration is responsible for implementing. At runtime,\n * it examines the attributes of a particular layer, combines this with fixed knowledge\n * about how layers of the particular type are implemented, and determines which uniforms\n * and vertex attributes will be required. It can then substitute the appropriate text\n * into the shader source code, create and link a program, and bind the uniforms and\n * vertex attributes in preparation for drawing.\n *\n * When a vector tile is parsed, this same configuration information is used to\n * populate the attribute buffers needed for data-driven styling using the zoom\n * level and feature property data.\n *\n * @private\n */\nexport default class ProgramConfiguration {\n    binders: {[_: string]: (AttributeBinder | UniformBinder) };\n    cacheKey: string;\n\n    _buffers: Array<VertexBuffer>;\n\n    constructor(layer: TypedStyleLayer, zoom: number, filterProperties: (_: string) => boolean = () => true) {\n        this.binders = {};\n        this._buffers = [];\n\n        const keys = [];\n\n        for (const property in layer.paint._values) {\n            const value = layer.paint.get(property);\n            if (!filterProperties(property)) continue;\n            if (!(value instanceof PossiblyEvaluatedPropertyValue) || !supportsPropertyExpression(value.property.specification)) {\n                continue;\n            }\n            const names = paintAttributeNames(property, layer.type);\n            const expression = value.value;\n            const type = value.property.specification.type;\n            const useIntegerZoom = !!value.property.useIntegerZoom;\n            const isPattern = property === 'line-dasharray' || property.endsWith('pattern');\n            const sourceException = property === 'line-dasharray' && (layer.layout: any).get('line-cap').value.kind !== 'constant';\n\n            if (expression.kind === 'constant' && !sourceException) {\n                this.binders[property] = isPattern ?\n                    new PatternConstantBinder(expression.value, names) :\n                    new ConstantBinder(expression.value, names, type);\n                keys.push(`/u_${property}`);\n\n            } else if (expression.kind === 'source' || sourceException || isPattern) {\n                const StructArrayLayout = layoutType(property, type, 'source');\n                this.binders[property] = isPattern ?\n                    // $FlowFixMe[prop-missing]\n                    // $FlowFixMe[incompatible-call] - expression can be a `composite` or `constant` kind expression\n                    new PatternCompositeBinder(expression, names, type, StructArrayLayout, layer.id) :\n                    // $FlowFixMe[prop-missing]\n                    // $FlowFixMe[incompatible-call] - expression can be a `composite` or `constant` kind expression\n                    new SourceExpressionBinder(expression, names, type, StructArrayLayout);\n\n                keys.push(`/a_${property}`);\n\n            } else {\n                const StructArrayLayout = layoutType(property, type, 'composite');\n                // $FlowFixMe[prop-missing]\n                // $FlowFixMe[incompatible-call] — expression can be a `constant` kind expression\n                this.binders[property] = new CompositeExpressionBinder(expression, names, type, useIntegerZoom, zoom, StructArrayLayout);\n                keys.push(`/z_${property}`);\n            }\n        }\n\n        this.cacheKey = keys.sort().join('');\n    }\n\n    getMaxValue(property: string): number {\n        const binder = this.binders[property];\n        return binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder ? binder.maxValue : 0;\n    }\n\n    populatePaintArrays(newLength: number, feature: Feature, imagePositions: SpritePositions, availableImages: Array<string>, canonical?: CanonicalTileID, brightness: ?number, formattedSection?: FormattedSection) {\n        for (const property in this.binders) {\n            const binder = this.binders[property];\n            if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof PatternCompositeBinder)\n                (binder: AttributeBinder).populatePaintArray(newLength, feature, imagePositions, availableImages, canonical, brightness, formattedSection);\n        }\n    }\n    setConstantPatternPositions(posTo: SpritePosition) {\n        for (const property in this.binders) {\n            const binder = this.binders[property];\n            if (binder instanceof PatternConstantBinder)\n                binder.setConstantPatternPositions(posTo);\n        }\n    }\n\n    updatePaintArrays(featureStates: FeatureStates, featureMap: FeaturePositionMap, featureMapWithoutIds: FeaturePositionMap, vtLayer: IVectorTileLayer, layer: TypedStyleLayer, availableImages: Array<string>, imagePositions: SpritePositions, brightness: number): boolean {\n        let dirty: boolean = false;\n        const keys = Object.keys(featureStates);\n        const featureStateUpdate = (keys.length !== 0);\n        const ids = featureStateUpdate ? keys : featureMap.uniqueIds;\n        for (const property in this.binders) {\n            const binder = this.binders[property];\n            if ((binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder ||\n                 binder instanceof PatternCompositeBinder) && ((binder: any).expression.isStateDependent === true || (binder: any).expression.isLightConstant === false)) {\n                //AHM: Remove after https://github.com/mapbox/mapbox-gl-js/issues/6255\n                const value = layer.paint.get(property);\n                (binder: any).expression = value.value;\n                for (const id of ids) {\n                    const state = featureStates[id.toString()];\n                    featureMap.eachPosition(id, (index, start, end) => {\n                        const feature = vtLayer.feature(index);\n                        (binder: AttributeBinder).updatePaintArray(start, end, feature, state, availableImages, imagePositions, brightness);\n                    });\n                }\n                if (!featureStateUpdate) {\n                    for (const id of featureMapWithoutIds.uniqueIds) {\n                        const state = featureStates[id.toString()];\n                        featureMapWithoutIds.eachPosition(id, (index, start, end) => {\n                            const feature = vtLayer.feature(index);\n                            (binder: AttributeBinder).updatePaintArray(start, end, feature, state, availableImages, imagePositions, brightness);\n                        });\n                    }\n                }\n                dirty = true;\n            }\n        }\n        return dirty;\n    }\n\n    defines(): Array<string> {\n        const result = [];\n        for (const property in this.binders) {\n            const binder = this.binders[property];\n            if (binder instanceof ConstantBinder || binder instanceof PatternConstantBinder) {\n                result.push(...binder.uniformNames.map(name => `#define HAS_UNIFORM_${name}`));\n            }\n        }\n        return result;\n    }\n\n    getBinderAttributes(): Array<string> {\n        const result = [];\n        for (const property in this.binders) {\n            const binder = this.binders[property];\n            if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof PatternCompositeBinder) {\n                for (let i = 0; i < binder.paintVertexAttributes.length; i++) {\n                    result.push(binder.paintVertexAttributes[i].name);\n                }\n            }\n        }\n        return result;\n    }\n\n    getBinderUniforms(): Array<string> {\n        const uniforms = [];\n        for (const property in this.binders) {\n            const binder = this.binders[property];\n            if (binder instanceof ConstantBinder || binder instanceof PatternConstantBinder || binder instanceof CompositeExpressionBinder) {\n                for (const uniformName of binder.uniformNames) {\n                    uniforms.push(uniformName);\n                }\n            }\n        }\n        return uniforms;\n    }\n\n    getPaintVertexBuffers(): Array<VertexBuffer> {\n        return this._buffers;\n    }\n\n    getUniforms(context: Context): Array<BinderUniform> {\n        const uniforms = [];\n        for (const property in this.binders) {\n            const binder = this.binders[property];\n            if (binder instanceof ConstantBinder || binder instanceof PatternConstantBinder || binder instanceof CompositeExpressionBinder) {\n                for (const name of binder.uniformNames) {\n                    uniforms.push({name, property, binding: binder.getBinding(context, name)});\n                }\n            }\n        }\n        return uniforms;\n    }\n\n    setUniforms<Properties: Object>(program: WebGLProgram, context: Context, binderUniforms: Array<BinderUniform>, properties: PossiblyEvaluated<Properties>, globals: GlobalProperties) {\n        // Uniform state bindings are owned by the Program, but we set them\n        // from within the ProgramConfiguration's binder members.\n        for (const {name, property, binding} of binderUniforms) {\n            (this.binders[property]: any).setUniform(program, binding, globals, properties.get(property), name);\n        }\n    }\n\n    updatePaintBuffers() {\n        this._buffers = [];\n\n        for (const property in this.binders) {\n            const binder = this.binders[property];\n            if ((\n                binder instanceof SourceExpressionBinder ||\n                binder instanceof CompositeExpressionBinder ||\n                binder instanceof PatternCompositeBinder) && binder.paintVertexBuffer) {\n                this._buffers.push(binder.paintVertexBuffer);\n            }\n        }\n    }\n\n    upload(context: Context) {\n        for (const property in this.binders) {\n            const binder = this.binders[property];\n            if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof PatternCompositeBinder)\n                binder.upload(context);\n        }\n        this.updatePaintBuffers();\n    }\n\n    destroy() {\n        for (const property in this.binders) {\n            const binder = this.binders[property];\n            if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof PatternCompositeBinder)\n                binder.destroy();\n        }\n    }\n}\n\nexport class ProgramConfigurationSet<Layer: TypedStyleLayer> {\n    programConfigurations: {[_: string]: ProgramConfiguration};\n    needsUpload: boolean;\n    _featureMap: FeaturePositionMap;\n    _featureMapWithoutIds: FeaturePositionMap;\n    _bufferOffset: number;\n    _idlessCounter: number;\n\n    constructor(layers: $ReadOnlyArray<Layer>, zoom: number, filterProperties: (_: string) => boolean = () => true) {\n        this.programConfigurations = {};\n        for (const layer of layers) {\n            this.programConfigurations[layer.id] = new ProgramConfiguration(layer, zoom, filterProperties);\n        }\n        this.needsUpload = false;\n        this._featureMap = new FeaturePositionMap();\n        this._featureMapWithoutIds = new FeaturePositionMap();\n        this._bufferOffset = 0;\n        this._idlessCounter = 0;\n    }\n\n    populatePaintArrays(length: number, feature: Feature, index: number, imagePositions: SpritePositions, availableImages: Array<string>, canonical: CanonicalTileID, brightness: ?number, formattedSection?: FormattedSection) {\n        for (const key in this.programConfigurations) {\n            this.programConfigurations[key].populatePaintArrays(length, feature, imagePositions, availableImages, canonical, brightness, formattedSection);\n        }\n\n        if (feature.id !== undefined) {\n            this._featureMap.add(feature.id, index, this._bufferOffset, length);\n        } else {\n            this._featureMapWithoutIds.add(this._idlessCounter, index, this._bufferOffset, length);\n            this._idlessCounter += 1;\n        }\n        this._bufferOffset = length;\n\n        this.needsUpload = true;\n    }\n\n    updatePaintArrays(featureStates: FeatureStates, vtLayer: IVectorTileLayer, layers: $ReadOnlyArray<TypedStyleLayer>, availableImages: Array<string>, imagePositions: SpritePositions, brightness: ?number) {\n        for (const layer of layers) {\n            this.needsUpload = this.programConfigurations[layer.id].updatePaintArrays(featureStates, this._featureMap, this._featureMapWithoutIds, vtLayer, layer, availableImages, imagePositions, brightness || 0) || this.needsUpload;\n        }\n    }\n\n    get(layerId: string): ProgramConfiguration {\n        return this.programConfigurations[layerId];\n    }\n\n    upload(context: Context) {\n        if (!this.needsUpload) return;\n        for (const layerId in this.programConfigurations) {\n            this.programConfigurations[layerId].upload(context);\n        }\n        this.needsUpload = false;\n    }\n\n    destroy() {\n        for (const layerId in this.programConfigurations) {\n            this.programConfigurations[layerId].destroy();\n        }\n    }\n}\n\nconst attributeNameExceptions = {\n    'text-opacity': ['opacity'],\n    'icon-opacity': ['opacity'],\n    'text-color': ['fill_color'],\n    'icon-color': ['fill_color'],\n    'text-emissive-strength': ['emissive_strength'],\n    'icon-emissive-strength': ['emissive_strength'],\n    'text-halo-color': ['halo_color'],\n    'icon-halo-color': ['halo_color'],\n    'text-halo-blur': ['halo_blur'],\n    'icon-halo-blur': ['halo_blur'],\n    'text-halo-width': ['halo_width'],\n    'icon-halo-width': ['halo_width'],\n    'line-gap-width': ['gapwidth'],\n    'line-pattern': ['pattern', 'pixel_ratio'],\n    'fill-pattern': ['pattern', 'pixel_ratio'],\n    'fill-extrusion-pattern': ['pattern', 'pixel_ratio'],\n    'line-dasharray': ['dash']\n};\n\nfunction paintAttributeNames(property: string, type: string) {\n    return attributeNameExceptions[property] || [property.replace(`${type}-`, '').replace(/-/g, '_')];\n}\n\nconst propertyExceptions = {\n    'line-pattern': {\n        'source': PatternLayoutArray,\n        'composite': PatternLayoutArray\n    },\n    'fill-pattern': {\n        'source': PatternLayoutArray,\n        'composite': PatternLayoutArray\n    },\n    'fill-extrusion-pattern':{\n        'source': PatternLayoutArray,\n        'composite': PatternLayoutArray\n    },\n    'line-dasharray': { // temporary layout\n        'source': DashLayoutArray,\n        'composite': DashLayoutArray\n    }\n};\n\nconst defaultLayouts = {\n    'color': {\n        'source': StructArrayLayout2f8,\n        'composite': StructArrayLayout4f16\n    },\n    'number': {\n        'source': StructArrayLayout1f4,\n        'composite': StructArrayLayout2f8\n    }\n};\n\ntype LayoutType = 'array' | 'boolean' | 'color' | 'enum' | 'number' | 'resolvedImage' | 'string';\n\nfunction layoutType(property: string, type: LayoutType, binderType: string): Class<StructArray> {\n    const layoutException = propertyExceptions[property];\n    // $FlowFixMe[prop-missing] - we don't cover all types in defaultLayouts for some reason\n    return (layoutException && layoutException[binderType]) || defaultLayouts[type][binderType];\n}\n\nregister(ConstantBinder, 'ConstantBinder');\nregister(PatternConstantBinder, 'PatternConstantBinder');\nregister(SourceExpressionBinder, 'SourceExpressionBinder');\nregister(PatternCompositeBinder, 'PatternCompositeBinder');\nregister(CompositeExpressionBinder, 'CompositeExpressionBinder');\nregister(ProgramConfiguration, 'ProgramConfiguration', {omit: ['_buffers']});\nregister(ProgramConfigurationSet, 'ProgramConfigurationSet');\n","// @flow\n\nimport EXTENT from '../../style-spec/data/extent.js';\n\nexport const GLOBE_RADIUS = EXTENT / Math.PI / 2.0;\n\nexport const GLOBE_ZOOM_THRESHOLD_MIN = 5;\nexport const GLOBE_ZOOM_THRESHOLD_MAX = 6;\n\n// At low zoom levels the globe gets rendered so that the scale at this\n// latitude matches it's scale in a mercator map. The choice of latitude is\n// a bit arbitrary. Different choices will match mercator more closely in different\n// views. 45 is a good enough choice because:\n// - it's half way from the pole to the equator\n// - matches most middle latitudes reasonably well\n// - biases towards increasing size rather than decreasing\n// - makes the globe slightly larger at very low zoom levels, where it already\n//   covers less pixels than mercator (due to the curved surface)\n//\n//   Changing this value will change how large a globe is rendered and could affect\n//   end users. This should only be done of the tradeoffs between change and improvement\n//   are carefully considered.\nexport const GLOBE_SCALE_MATCH_LATITUDE = 45;\n\nconst GLOBE_NORMALIZATION_BIT_RANGE = 15;\nexport const GLOBE_NORMALIZATION_MASK = (1 << (GLOBE_NORMALIZATION_BIT_RANGE - 1)) - 1;\nexport const GLOBE_VERTEX_GRID_SIZE = 64;\nexport const GLOBE_LATITUDINAL_GRID_LOD_TABLE = [GLOBE_VERTEX_GRID_SIZE, GLOBE_VERTEX_GRID_SIZE / 2, GLOBE_VERTEX_GRID_SIZE / 4];\nexport const TILE_SIZE = 512;\n\nexport const GLOBE_MIN = -GLOBE_RADIUS;\nexport const GLOBE_MAX = GLOBE_RADIUS;\n","// @flow\nimport assert from 'assert';\nimport {wrap, degToRad, radToDeg} from '../util/util.js';\nimport {GLOBE_RADIUS} from '../geo/projection/globe_constants.js';\n\nimport type {Vec3} from 'gl-matrix';\n\nexport function csLatLngToECEF(cosLat: number, sinLat: number, lng: number, radius: number = GLOBE_RADIUS): Vec3 {\n    lng = degToRad(lng);\n\n    // Convert lat & lng to spherical representation. Use zoom=0 as a reference\n    const sx = cosLat * Math.sin(lng) * radius;\n    const sy = -sinLat * radius;\n    const sz = cosLat * Math.cos(lng) * radius;\n\n    return [sx, sy, sz];\n}\n\nexport function ecefToLatLng([x, y, z]: Array<number>): LngLat {\n    const radius = Math.hypot(x, y, z);\n    const lng = Math.atan2(x, z);\n    const lat = Math.PI * 0.5 - Math.acos(-y / radius);\n\n    return new LngLat(radToDeg(lng), radToDeg(lat));\n}\n\nexport function latLngToECEF(lat: number, lng: number, radius?: number): Vec3 {\n    assert(lat <= 90 && lat >= -90, 'Lattitude must be between -90 and 90');\n    return csLatLngToECEF(Math.cos(degToRad(lat)), Math.sin(degToRad(lat)), lng, radius);\n}\n\n/*\n* Approximate radius of the earth in meters.\n* Uses the WGS-84 approximation. The radius at the equator is ~6378137 and at the poles is ~6356752. https://en.wikipedia.org/wiki/World_Geodetic_System#WGS84\n* 6371008.8 is one published \"average radius\" see https://en.wikipedia.org/wiki/Earth_radius#Mean_radius, or ftp://athena.fsv.cvut.cz/ZFG/grs80-Moritz.pdf p.4\n*/\nexport const earthRadius = 6371008.8;\n\n/*\n * The average circumference of the earth in meters.\n */\nexport const earthCircumference = 2 * Math.PI * earthRadius;\n\n/**\n * A `LngLat` object represents a given longitude and latitude coordinate, measured in degrees.\n * These coordinates use longitude, latitude coordinate order (as opposed to latitude, longitude)\n * to match the [GeoJSON specification](https://datatracker.ietf.org/doc/html/rfc7946#section-4),\n * which is equivalent to the OGC:CRS84 coordinate reference system.\n *\n * Note that any Mapbox GL method that accepts a `LngLat` object as an argument or option\n * can also accept an `Array` of two numbers and will perform an implicit conversion.\n * This flexible type is documented as {@link LngLatLike}.\n *\n * @param {number} lng Longitude, measured in degrees.\n * @param {number} lat Latitude, measured in degrees.\n * @example\n * const ll = new mapboxgl.LngLat(-123.9749, 40.7736);\n * console.log(ll.lng); // = -123.9749\n * @see [Example: Get coordinates of the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/mouse-position/)\n * @see [Example: Display a popup](https://www.mapbox.com/mapbox-gl-js/example/popup/)\n * @see [Example: Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/)\n * @see [Example: Create a timeline animation](https://www.mapbox.com/mapbox-gl-js/example/timeline-animation/)\n */\nclass LngLat {\n    lng: number;\n    lat: number;\n\n    constructor(lng: number, lat: number) {\n        if (isNaN(lng) || isNaN(lat)) {\n            throw new Error(`Invalid LngLat object: (${lng}, ${lat})`);\n        }\n        this.lng = +lng;\n        this.lat = +lat;\n        if (this.lat > 90 || this.lat < -90) {\n            throw new Error('Invalid LngLat latitude value: must be between -90 and 90');\n        }\n    }\n\n    /**\n     * Returns a new `LngLat` object whose longitude is wrapped to the range (-180, 180).\n     *\n     * @returns {LngLat} The wrapped `LngLat` object.\n     * @example\n     * const ll = new mapboxgl.LngLat(286.0251, 40.7736);\n     * const wrapped = ll.wrap();\n     * console.log(wrapped.lng); // = -73.9749\n     */\n    wrap(): LngLat {\n        return new LngLat(wrap(this.lng, -180, 180), this.lat);\n    }\n\n    /**\n     * Returns the coordinates represented as an array of two numbers.\n     *\n     * @returns {Array<number>} The coordinates represeted as an array of longitude and latitude.\n     * @example\n     * const ll = new mapboxgl.LngLat(-73.9749, 40.7736);\n     * ll.toArray(); // = [-73.9749, 40.7736]\n     */\n    toArray(): [number, number] {\n        return [this.lng, this.lat];\n    }\n\n    /**\n     * Returns the coordinates represent as a string.\n     *\n     * @returns {string} The coordinates represented as a string of the format `'LngLat(lng, lat)'`.\n     * @example\n     * const ll = new mapboxgl.LngLat(-73.9749, 40.7736);\n     * ll.toString(); // = \"LngLat(-73.9749, 40.7736)\"\n     */\n    toString(): string {\n        return `LngLat(${this.lng}, ${this.lat})`;\n    }\n\n    /**\n     * Returns the approximate distance between a pair of coordinates in meters.\n     * Uses the Haversine Formula (from R.W. Sinnott, \"Virtues of the Haversine\", Sky and Telescope, vol. 68, no. 2, 1984, p. 159).\n     *\n     * @param {LngLat} lngLat Coordinates to compute the distance to.\n     * @returns {number} Distance in meters between the two coordinates.\n     * @example\n     * const newYork = new mapboxgl.LngLat(-74.0060, 40.7128);\n     * const losAngeles = new mapboxgl.LngLat(-118.2437, 34.0522);\n     * newYork.distanceTo(losAngeles); // = 3935751.690893987, \"true distance\" using a non-spherical approximation is ~3966km\n     */\n    distanceTo(lngLat: LngLat): number {\n        const rad = Math.PI / 180;\n        const lat1 = this.lat * rad;\n        const lat2 = lngLat.lat * rad;\n        const a = Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos((lngLat.lng - this.lng) * rad);\n\n        const maxMeters = earthRadius * Math.acos(Math.min(a, 1));\n        return maxMeters;\n    }\n\n    /**\n     * Returns a `LngLatBounds` from the coordinates extended by a given `radius`. The returned `LngLatBounds` completely contains the `radius`.\n     *\n     * @param {number} [radius=0] Distance in meters from the coordinates to extend the bounds.\n     * @returns {LngLatBounds} A new `LngLatBounds` object representing the coordinates extended by the `radius`.\n     * @example\n     * const ll = new mapboxgl.LngLat(-73.9749, 40.7736);\n     * ll.toBounds(100).toArray(); // = [[-73.97501862141328, 40.77351016847229], [-73.97478137858673, 40.77368983152771]]\n     */\n    toBounds(radius?: number = 0): LngLatBounds {\n        const earthCircumferenceInMetersAtEquator = 40075017;\n        const latAccuracy = 360 * radius / earthCircumferenceInMetersAtEquator,\n            lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat);\n\n        return new LngLatBounds({lng: this.lng - lngAccuracy, lat: this.lat - latAccuracy},\n            {lng: this.lng + lngAccuracy, lat: this.lat + latAccuracy});\n    }\n\n    toEcef(altitude: number): [number, number, number] {\n        const altInEcef = altitude * GLOBE_RADIUS / earthRadius;\n        const radius = GLOBE_RADIUS + altInEcef;\n        return (latLngToECEF(this.lat, this.lng, radius): any);\n    }\n\n    /**\n     * Converts an array of two numbers or an object with `lng` and `lat` or `lon` and `lat` properties\n     * to a `LngLat` object.\n     *\n     * If a `LngLat` object is passed in, the function returns it unchanged.\n     *\n     * @param {LngLatLike} input An array of two numbers or object to convert, or a `LngLat` object to return.\n     * @returns {LngLat} A new `LngLat` object, if a conversion occurred, or the original `LngLat` object.\n     * @example\n     * const arr = [-73.9749, 40.7736];\n     * const ll = mapboxgl.LngLat.convert(arr);\n     * console.log(ll);   // = LngLat {lng: -73.9749, lat: 40.7736}\n     */\n    static convert(input: LngLatLike): LngLat {\n        if (input instanceof LngLat) {\n            return input;\n        }\n        if (Array.isArray(input) && (input.length === 2 || input.length === 3)) {\n            return new LngLat(Number(input[0]), Number(input[1]));\n        }\n        if (!Array.isArray(input) && typeof input === 'object' && input !== null) {\n            return new LngLat(\n                // flow can't refine this to have one of lng or lat, so we have to cast to any\n                Number('lng' in input ? (input: any).lng : (input: any).lon),\n                Number(input.lat)\n            );\n        }\n        throw new Error(\"`LngLatLike` argument must be specified as a LngLat instance, an object {lng: <lng>, lat: <lat>}, an object {lon: <lng>, lat: <lat>}, or an array of [<lng>, <lat>]\");\n    }\n}\n\n/**\n * A {@link LngLat} object, an array of two numbers representing longitude and latitude,\n * or an object with `lng` and `lat` or `lon` and `lat` properties.\n *\n * @typedef {LngLat | {lng: number, lat: number} | {lon: number, lat: number} | [number, number]} LngLatLike\n * @example\n * const v1 = new mapboxgl.LngLat(-122.420679, 37.772537);\n * const v2 = [-122.420679, 37.772537];\n * const v3 = {lon: -122.420679, lat: 37.772537};\n */\nexport type LngLatLike = LngLat | {lng: number, lat: number} | {lon: number, lat: number} | [number, number];\n\nexport default LngLat;\n\n/**\n * A `LngLatBounds` object represents a geographical bounding box,\n * defined by its southwest and northeast points in [`longitude`](https://docs.mapbox.com/help/glossary/lat-lon/) and [`latitude`](https://docs.mapbox.com/help/glossary/lat-lon/).\n * `Longitude` values are typically set between `-180` to `180`, but can exceed this range if `renderWorldCopies` is set to `true`. `Latitude` values must be within `-85.051129` to `85.051129`.\n *\n * If no arguments are provided to the constructor, a `null` bounding box is created.\n *\n * Note that any Mapbox GL method that accepts a `LngLatBounds` object as an argument or option\n * can also accept an `Array` of two {@link LngLatLike} constructs and will perform an implicit conversion.\n * This flexible type is documented as {@link LngLatBoundsLike}.\n *\n * @param {LngLatLike} [sw] The southwest corner of the bounding box.\n * @param {LngLatLike} [ne] The northeast corner of the bounding box.\n * @example\n * const sw = new mapboxgl.LngLat(-73.9876, 40.7661);\n * const ne = new mapboxgl.LngLat(-73.9397, 40.8002);\n * const llb = new mapboxgl.LngLatBounds(sw, ne);\n */\nexport class LngLatBounds {\n    _ne: LngLat;\n    _sw: LngLat;\n\n    constructor(sw: [number, number, number, number] | [LngLatLike, LngLatLike] | LngLatLike | void, ne: LngLatLike | void) {\n        if (!sw) {\n            // noop\n        } else if (ne) {\n            this.setSouthWest(((sw: any): LngLatLike)).setNorthEast(ne);\n        } else if (sw.length === 4) {\n            const bounds = ((sw: any): [number, number, number, number]);\n            this.setSouthWest([bounds[0], bounds[1]]).setNorthEast([bounds[2], bounds[3]]);\n        } else {\n            const bounds = ((sw: any): [LngLatLike, LngLatLike]);\n            this.setSouthWest(bounds[0]).setNorthEast(bounds[1]);\n        }\n    }\n\n    /**\n     * Set the northeast corner of the bounding box.\n     *\n     * @param {LngLatLike} ne A {@link LngLatLike} object describing the northeast corner of the bounding box.\n     * @returns {LngLatBounds} Returns itself to allow for method chaining.\n     * @example\n     * const sw = new mapboxgl.LngLat(-73.9876, 40.7661);\n     * const ne = new mapboxgl.LngLat(-73.9397, 40.8002);\n     * const llb = new mapboxgl.LngLatBounds(sw, ne);\n     * llb.setNorthEast([-73.9397, 42.8002]);\n     */\n    setNorthEast(ne: LngLatLike): this {\n        this._ne = ne instanceof LngLat ? new LngLat(ne.lng, ne.lat) : LngLat.convert(ne);\n        return this;\n    }\n\n    /**\n     * Set the southwest corner of the bounding box.\n     *\n     * @param {LngLatLike} sw A {@link LngLatLike} object describing the southwest corner of the bounding box.\n     * @returns {LngLatBounds} Returns itself to allow for method chaining.\n     * @example\n     * const sw = new mapboxgl.LngLat(-73.9876, 40.7661);\n     * const ne = new mapboxgl.LngLat(-73.9397, 40.8002);\n     * const llb = new mapboxgl.LngLatBounds(sw, ne);\n     * llb.setSouthWest([-73.9876, 40.2661]);\n     */\n    setSouthWest(sw: LngLatLike): this {\n        this._sw = sw instanceof LngLat ? new LngLat(sw.lng, sw.lat) : LngLat.convert(sw);\n        return this;\n    }\n\n    /**\n     * Extend the bounds to include a given LngLatLike or LngLatBoundsLike.\n     *\n     * @param {LngLatLike|LngLatBoundsLike} obj Object to extend to.\n     * @returns {LngLatBounds} Returns itself to allow for method chaining.\n     * @example\n     * const sw = new mapboxgl.LngLat(-73.9876, 40.7661);\n     * const ne = new mapboxgl.LngLat(-73.9397, 40.8002);\n     * const llb = new mapboxgl.LngLatBounds(sw, ne);\n     * llb.extend([-72.9876, 42.2661]);\n     */\n    extend(obj: LngLatLike | LngLatBoundsLike): this {\n        const sw = this._sw,\n            ne = this._ne;\n        let sw2, ne2;\n\n        if (obj instanceof LngLat) {\n            sw2 = obj;\n            ne2 = obj;\n\n        } else if (obj instanceof LngLatBounds) {\n            sw2 = obj._sw;\n            ne2 = obj._ne;\n\n            if (!sw2 || !ne2) return this;\n\n        } else if (Array.isArray(obj)) {\n            // $FlowFixMe[method-unbinding]\n            if (obj.length === 4 || obj.every(Array.isArray)) {\n                const lngLatBoundsObj = ((obj: any): LngLatBoundsLike);\n                return this.extend(LngLatBounds.convert(lngLatBoundsObj));\n            } else {\n                const lngLatObj = ((obj: any): LngLatLike);\n                return this.extend(LngLat.convert(lngLatObj));\n            }\n        } else if (typeof obj === 'object' && obj !== null && obj.hasOwnProperty(\"lat\") && (obj.hasOwnProperty(\"lon\") || obj.hasOwnProperty(\"lng\"))) {\n            return this.extend(LngLat.convert(obj));\n        } else {\n            return this;\n        }\n\n        if (!sw && !ne) {\n            this._sw = new LngLat(sw2.lng, sw2.lat);\n            this._ne = new LngLat(ne2.lng, ne2.lat);\n\n        } else {\n            sw.lng = Math.min(sw2.lng, sw.lng);\n            sw.lat = Math.min(sw2.lat, sw.lat);\n            ne.lng = Math.max(ne2.lng, ne.lng);\n            ne.lat = Math.max(ne2.lat, ne.lat);\n        }\n\n        return this;\n    }\n\n    /**\n     * Returns the geographical coordinate equidistant from the bounding box's corners.\n     *\n     * @returns {LngLat} The bounding box's center.\n     * @example\n     * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n     * llb.getCenter(); // = LngLat {lng: -73.96365, lat: 40.78315}\n     */\n    getCenter(): LngLat {\n        return new LngLat((this._sw.lng + this._ne.lng) / 2, (this._sw.lat + this._ne.lat) / 2);\n    }\n\n    /**\n     * Returns the southwest corner of the bounding box.\n     *\n     * @returns {LngLat} The southwest corner of the bounding box.\n     * @example\n     * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n     * llb.getSouthWest(); // LngLat {lng: -73.9876, lat: 40.7661}\n     */\n    getSouthWest(): LngLat { return this._sw; }\n\n    /**\n     * Returns the northeast corner of the bounding box.\n     *\n     * @returns {LngLat} The northeast corner of the bounding box.\n     * @example\n     * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n     * llb.getNorthEast(); // LngLat {lng: -73.9397, lat: 40.8002}\n     */\n    getNorthEast(): LngLat { return this._ne; }\n\n    /**\n     * Returns the northwest corner of the bounding box.\n     *\n     * @returns {LngLat} The northwest corner of the bounding box.\n     * @example\n     * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n     * llb.getNorthWest(); // LngLat {lng: -73.9876, lat: 40.8002}\n     */\n    getNorthWest(): LngLat { return new LngLat(this.getWest(), this.getNorth()); }\n\n    /**\n     * Returns the southeast corner of the bounding box.\n     *\n     * @returns {LngLat} The southeast corner of the bounding box.\n     * @example\n     * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n     * llb.getSouthEast(); // LngLat {lng: -73.9397, lat: 40.7661}\n     */\n    getSouthEast(): LngLat { return new LngLat(this.getEast(), this.getSouth()); }\n\n    /**\n     * Returns the west edge of the bounding box.\n     *\n     * @returns {number} The west edge of the bounding box.\n     * @example\n     * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n     * llb.getWest(); // -73.9876\n     */\n    getWest(): number { return this._sw.lng; }\n\n    /**\n     * Returns the south edge of the bounding box.\n     *\n     * @returns {number} The south edge of the bounding box.\n     * @example\n     * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n     * llb.getSouth(); // 40.7661\n     */\n    getSouth(): number { return this._sw.lat; }\n\n    /**\n     * Returns the east edge of the bounding box.\n     *\n     * @returns {number} The east edge of the bounding box.\n     * @example\n     * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n     * llb.getEast(); // -73.9397\n     */\n    getEast(): number { return this._ne.lng; }\n\n    /**\n     * Returns the north edge of the bounding box.\n     *\n     * @returns {number} The north edge of the bounding box.\n     * @example\n     * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n     * llb.getNorth(); // 40.8002\n     */\n    getNorth(): number { return this._ne.lat; }\n\n    /**\n     * Returns the bounding box represented as an array.\n     *\n     * @returns {Array<Array<number>>} The bounding box represented as an array, consisting of the\n     * southwest and northeast coordinates of the bounding represented as arrays of numbers.\n     * @example\n     * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n     * llb.toArray(); // = [[-73.9876, 40.7661], [-73.9397, 40.8002]]\n     */\n    toArray(): [[number, number], [number, number]] {\n        return [this._sw.toArray(), this._ne.toArray()];\n    }\n\n    /**\n     * Return the bounding box represented as a string.\n     *\n     * @returns {string} The bounding box represents as a string of the format\n     * `'LngLatBounds(LngLat(lng, lat), LngLat(lng, lat))'`.\n     * @example\n     * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n     * llb.toString(); // = \"LngLatBounds(LngLat(-73.9876, 40.7661), LngLat(-73.9397, 40.8002))\"\n     */\n    toString(): string {\n        return `LngLatBounds(${this._sw.toString()}, ${this._ne.toString()})`;\n    }\n\n    /**\n     * Check if the bounding box is an empty/`null`-type box.\n     *\n     * @returns {boolean} True if bounds have been defined, otherwise false.\n     * @example\n     * const llb = new mapboxgl.LngLatBounds();\n     * llb.isEmpty(); // true\n     * llb.setNorthEast([-73.9876, 40.7661]);\n     * llb.setSouthWest([-73.9397, 40.8002]);\n     * llb.isEmpty(); // false\n     */\n    isEmpty(): boolean {\n        return !(this._sw && this._ne);\n    }\n\n    /**\n    * Check if the point is within the bounding box.\n    *\n    * @param {LngLatLike} lnglat Geographic point to check against.\n    * @returns {boolean} True if the point is within the bounding box.\n    * @example\n    * const llb = new mapboxgl.LngLatBounds(\n    *   new mapboxgl.LngLat(-73.9876, 40.7661),\n    *   new mapboxgl.LngLat(-73.9397, 40.8002)\n    * );\n    *\n    * const ll = new mapboxgl.LngLat(-73.9567, 40.7789);\n    *\n    * console.log(llb.contains(ll)); // = true\n    */\n    contains(lnglat: LngLatLike): boolean {\n        const {lng, lat} = LngLat.convert(lnglat);\n\n        const containsLatitude = this._sw.lat <= lat && lat <= this._ne.lat;\n        let containsLongitude = this._sw.lng <= lng && lng <= this._ne.lng;\n        if (this._sw.lng > this._ne.lng) { // wrapped coordinates\n            containsLongitude = this._sw.lng >= lng && lng >= this._ne.lng;\n        }\n\n        return containsLatitude && containsLongitude;\n    }\n\n    /**\n     * Converts an array to a `LngLatBounds` object.\n     *\n     * If a `LngLatBounds` object is passed in, the function returns it unchanged.\n     *\n     * Internally, the function calls `LngLat#convert` to convert arrays to `LngLat` values.\n     *\n     * @param {LngLatBoundsLike} input An array of two coordinates to convert, or a `LngLatBounds` object to return.\n     * @returns {LngLatBounds} A new `LngLatBounds` object, if a conversion occurred, or the original `LngLatBounds` object.\n     * @example\n     * const arr = [[-73.9876, 40.7661], [-73.9397, 40.8002]];\n     * const llb = mapboxgl.LngLatBounds.convert(arr);\n     * console.log(llb);   // = LngLatBounds {_sw: LngLat {lng: -73.9876, lat: 40.7661}, _ne: LngLat {lng: -73.9397, lat: 40.8002}}\n     */\n    static convert(input: LngLatBoundsLike): LngLatBounds {\n        if (!input || input instanceof LngLatBounds) return input;\n        return new LngLatBounds(input);\n    }\n}\n\n/**\n * A {@link LngLatBounds} object, an array of {@link LngLatLike} objects in [sw, ne] order,\n * or an array of numbers in [west, south, east, north] order.\n *\n * @typedef {LngLatBounds | [LngLatLike, LngLatLike] | [number, number, number, number]} LngLatBoundsLike\n * @example\n * const v1 = new mapboxgl.LngLatBounds(\n *   new mapboxgl.LngLat(-73.9876, 40.7661),\n *   new mapboxgl.LngLat(-73.9397, 40.8002)\n * );\n * const v2 = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n * const v3 = [[-73.9876, 40.7661], [-73.9397, 40.8002]];\n */\nexport type LngLatBoundsLike = LngLatBounds | [LngLatLike, LngLatLike] | [number, number, number, number];\n","(function (global, factory) {\ntypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\ntypeof define === 'function' && define.amd ? define(['exports'], factory) :\n(factory((global.WhooTS = {})));\n}(this, (function (exports) {\n/**\n * getURL\n *\n * @param    {String}  baseUrl  Base url of the WMS server\n * @param    {String}  layer    Layer name\n * @param    {Number}  x        Tile coordinate x\n * @param    {Number}  y        Tile coordinate y\n * @param    {Number}  z        Tile zoom\n * @param    {Object}  [options]\n * @param    {String}  [options.format='image/png']\n * @param    {String}  [options.service='WMS']\n * @param    {String}  [options.version='1.1.1']\n * @param    {String}  [options.request='GetMap']\n * @param    {String}  [options.srs='EPSG:3857']\n * @param    {Number}  [options.width='256']\n * @param    {Number}  [options.height='256']\n * @returns  {String}  url\n * @example\n * var baseUrl = 'http://geodata.state.nj.us/imagerywms/Natural2015';\n * var layer = 'Natural2015';\n * var url = whoots.getURL(baseUrl, layer, 154308, 197167, 19);\n */\nfunction getURL(baseUrl, layer, x, y, z, options) {\n    options = options || {};\n\n    var url = baseUrl + '?' + [\n        'bbox='    + getTileBBox(x, y, z),\n        'format='  + (options.format || 'image/png'),\n        'service=' + (options.service || 'WMS'),\n        'version=' + (options.version || '1.1.1'),\n        'request=' + (options.request || 'GetMap'),\n        'srs='     + (options.srs || 'EPSG:3857'),\n        'width='   + (options.width || 256),\n        'height='  + (options.height || 256),\n        'layers='  + layer\n    ].join('&');\n\n    return url;\n}\n\n\n/**\n * getTileBBox\n *\n * @param    {Number}  x  Tile coordinate x\n * @param    {Number}  y  Tile coordinate y\n * @param    {Number}  z  Tile zoom\n * @returns  {String}  String of the bounding box\n */\nfunction getTileBBox(x, y, z) {\n    // for Google/OSM tile scheme we need to alter the y\n    y = (Math.pow(2, z) - y - 1);\n\n    var min = getMercCoords(x * 256, y * 256, z),\n        max = getMercCoords((x + 1) * 256, (y + 1) * 256, z);\n\n    return min[0] + ',' + min[1] + ',' + max[0] + ',' + max[1];\n}\n\n\n/**\n * getMercCoords\n *\n * @param    {Number}  x  Pixel coordinate x\n * @param    {Number}  y  Pixel coordinate y\n * @param    {Number}  z  Tile zoom\n * @returns  {Array}   [x, y]\n */\nfunction getMercCoords(x, y, z) {\n    var resolution = (2 * Math.PI * 6378137 / 256) / Math.pow(2, z),\n        merc_x = (x * resolution - 2 * Math.PI  * 6378137 / 2.0),\n        merc_y = (y * resolution - 2 * Math.PI  * 6378137 / 2.0);\n\n    return [merc_x, merc_y];\n}\n\nexports.getURL = getURL;\nexports.getTileBBox = getTileBBox;\nexports.getMercCoords = getMercCoords;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n","// @flow\n\nimport {getTileBBox} from '@mapbox/whoots-js';\nimport assert from 'assert';\nimport {register} from '../util/web_worker_transfer.js';\n\nexport class CanonicalTileID {\n    z: number;\n    x: number;\n    y: number;\n    key: number;\n\n    constructor(z: number, x: number, y: number) {\n        assert(z >= 0 && z <= 25);\n        assert(x >= 0 && x < Math.pow(2, z));\n        assert(y >= 0 && y < Math.pow(2, z));\n        this.z = z;\n        this.x = x;\n        this.y = y;\n        this.key = calculateKey(0, z, z, x, y);\n    }\n\n    equals(id: CanonicalTileID): boolean {\n        return this.z === id.z && this.x === id.x && this.y === id.y;\n    }\n\n    // given a list of urls, choose a url template and return a tile URL\n    url(urls: Array<string>, scheme: ?string): string {\n        const bbox = getTileBBox(this.x, this.y, this.z);\n        const quadkey = getQuadkey(this.z, this.x, this.y);\n\n        return urls[(this.x + this.y) % urls.length]\n            .replace('{prefix}', (this.x % 16).toString(16) + (this.y % 16).toString(16))\n            .replace(/{z}/g, String(this.z))\n            .replace(/{x}/g, String(this.x))\n            .replace(/{y}/g, String(scheme === 'tms' ? (Math.pow(2, this.z) - this.y - 1) : this.y))\n            .replace('{quadkey}', quadkey)\n            .replace('{bbox-epsg-3857}', bbox);\n    }\n\n    toString(): string {\n        return `${this.z}/${this.x}/${this.y}`;\n    }\n}\n\nexport class UnwrappedTileID {\n    wrap: number;\n    canonical: CanonicalTileID;\n    key: number;\n\n    constructor(wrap: number, canonical: CanonicalTileID) {\n        this.wrap = wrap;\n        this.canonical = canonical;\n        this.key = calculateKey(wrap, canonical.z, canonical.z, canonical.x, canonical.y);\n    }\n}\n\nexport class OverscaledTileID {\n    overscaledZ: number;\n    wrap: number;\n    canonical: CanonicalTileID;\n    key: number;\n    projMatrix: Float32Array;\n    expandedProjMatrix: Float32Array;\n\n    constructor(overscaledZ: number, wrap: number, z: number, x: number, y: number) {\n        assert(overscaledZ >= z);\n        this.overscaledZ = overscaledZ;\n        this.wrap = wrap;\n        this.canonical = new CanonicalTileID(z, +x, +y);\n        this.key = wrap === 0 && overscaledZ === z ? this.canonical.key : calculateKey(wrap, overscaledZ, z, x, y);\n    }\n\n    equals(id: OverscaledTileID): boolean {\n        return this.overscaledZ === id.overscaledZ && this.wrap === id.wrap && this.canonical.equals(id.canonical);\n    }\n\n    scaledTo(targetZ: number): OverscaledTileID {\n        assert(targetZ <= this.overscaledZ);\n        const zDifference = this.canonical.z - targetZ;\n        if (targetZ > this.canonical.z) {\n            return new OverscaledTileID(targetZ, this.wrap, this.canonical.z, this.canonical.x, this.canonical.y);\n        } else {\n            return new OverscaledTileID(targetZ, this.wrap, targetZ, this.canonical.x >> zDifference, this.canonical.y >> zDifference);\n        }\n    }\n\n    /*\n     * calculateScaledKey is an optimization:\n     * when withWrap == true, implements the same as this.scaledTo(z).key,\n     * when withWrap == false, implements the same as this.scaledTo(z).wrapped().key.\n     */\n    calculateScaledKey(targetZ: number, withWrap: boolean = true): number {\n        if (this.overscaledZ === targetZ && withWrap) return this.key;\n        if (targetZ > this.canonical.z) {\n            return calculateKey(this.wrap * +withWrap, targetZ, this.canonical.z, this.canonical.x, this.canonical.y);\n        } else {\n            const zDifference = this.canonical.z - targetZ;\n            return calculateKey(this.wrap * +withWrap, targetZ, targetZ, this.canonical.x >> zDifference, this.canonical.y >> zDifference);\n        }\n    }\n\n    isChildOf(parent: OverscaledTileID): boolean {\n        if (parent.wrap !== this.wrap) {\n            // We can't be a child if we're in a different world copy\n            return false;\n        }\n        const zDifference = this.canonical.z - parent.canonical.z;\n        // We're first testing for z == 0, to avoid a 32 bit shift, which is undefined.\n        return parent.overscaledZ === 0 || (\n            parent.overscaledZ < this.overscaledZ &&\n                parent.canonical.z < this.canonical.z &&\n                parent.canonical.x === (this.canonical.x >> zDifference) &&\n                parent.canonical.y === (this.canonical.y >> zDifference));\n    }\n\n    children(sourceMaxZoom: number): Array<OverscaledTileID> {\n        if (this.overscaledZ >= sourceMaxZoom) {\n            // return a single tile coord representing a an overscaled tile\n            return [new OverscaledTileID(this.overscaledZ + 1, this.wrap, this.canonical.z, this.canonical.x, this.canonical.y)];\n        }\n\n        const z = this.canonical.z + 1;\n        const x = this.canonical.x * 2;\n        const y = this.canonical.y * 2;\n        return [\n            new OverscaledTileID(z, this.wrap, z, x, y),\n            new OverscaledTileID(z, this.wrap, z, x + 1, y),\n            new OverscaledTileID(z, this.wrap, z, x, y + 1),\n            new OverscaledTileID(z, this.wrap, z, x + 1, y + 1)\n        ];\n    }\n\n    isLessThan(rhs: OverscaledTileID): boolean {\n        if (this.wrap < rhs.wrap) return true;\n        if (this.wrap > rhs.wrap) return false;\n\n        if (this.overscaledZ < rhs.overscaledZ) return true;\n        if (this.overscaledZ > rhs.overscaledZ) return false;\n\n        if (this.canonical.x < rhs.canonical.x) return true;\n        if (this.canonical.x > rhs.canonical.x) return false;\n\n        if (this.canonical.y < rhs.canonical.y) return true;\n        return false;\n    }\n\n    wrapped(): OverscaledTileID {\n        return new OverscaledTileID(this.overscaledZ, 0, this.canonical.z, this.canonical.x, this.canonical.y);\n    }\n\n    unwrapTo(wrap: number): OverscaledTileID {\n        return new OverscaledTileID(this.overscaledZ, wrap, this.canonical.z, this.canonical.x, this.canonical.y);\n    }\n\n    overscaleFactor(): number {\n        return Math.pow(2, this.overscaledZ - this.canonical.z);\n    }\n\n    toUnwrapped(): UnwrappedTileID {\n        return new UnwrappedTileID(this.wrap, this.canonical);\n    }\n\n    toString(): string {\n        return `${this.overscaledZ}/${this.canonical.x}/${this.canonical.y}`;\n    }\n}\n\nfunction calculateKey(wrap: number, overscaledZ: number, z: number, x: number, y: number): number {\n    // only use 22 bits for x & y so that the key fits into MAX_SAFE_INTEGER\n    const dim = 1 << Math.min(z, 22);\n    let xy = dim * (y % dim) + (x % dim);\n\n    // zigzag-encode wrap if we have the room for it\n    if (wrap && z < 22) {\n        const bitsAvailable = 2 * (22 - z);\n        xy += dim * dim * ((wrap < 0 ? -2 * wrap - 1 : 2 * wrap) % (1 << bitsAvailable));\n    }\n\n    // encode z into 5 bits (24 max) and overscaledZ into 4 bits (10 max)\n    const key = ((xy * 32) + z) * 16 + (overscaledZ - z);\n    assert(key >= 0 && key <= Number.MAX_SAFE_INTEGER);\n\n    return key;\n}\n\nfunction getQuadkey(z: number, x: number, y: number) {\n    let quadkey = '', mask;\n    for (let i = z; i > 0; i--) {\n        mask = 1 << (i - 1);\n        quadkey += ((x & mask ? 1 : 0) + (y & mask ? 2 : 0));\n    }\n    return quadkey;\n}\n\n// For all four borders: 0 - left, 1, right, 2 - top, 3 - bottom\nexport const neighborCoord = [\n    (coord: OverscaledTileID): OverscaledTileID => {\n        let x = coord.canonical.x - 1;\n        let w = coord.wrap;\n        if (x < 0) {\n            x = (1 << coord.canonical.z) - 1;\n            w--;\n        }\n        return new OverscaledTileID(coord.overscaledZ, w, coord.canonical.z, x, coord.canonical.y);\n    },\n    (coord: OverscaledTileID): OverscaledTileID => {\n        let x = coord.canonical.x + 1;\n        let w = coord.wrap;\n        if (x === 1 << coord.canonical.z) {\n            x = 0;\n            w++;\n        }\n        return new OverscaledTileID(coord.overscaledZ, w, coord.canonical.z, x, coord.canonical.y);\n    },\n    (coord: OverscaledTileID): OverscaledTileID => new OverscaledTileID(coord.overscaledZ, coord.wrap, coord.canonical.z, coord.canonical.x,\n        (coord.canonical.y === 0 ? 1 << coord.canonical.z : coord.canonical.y) - 1),\n    (coord: OverscaledTileID): OverscaledTileID => new OverscaledTileID(coord.overscaledZ, coord.wrap, coord.canonical.z, coord.canonical.x,\n        coord.canonical.y === (1 << coord.canonical.z) - 1 ? 0 : coord.canonical.y + 1)\n];\n\nregister(CanonicalTileID, 'CanonicalTileID');\nregister(OverscaledTileID, 'OverscaledTileID', {omit: ['projMatrix', 'expandedProjMatrix']});\n","// @flow\n\nimport LngLat, {earthCircumference} from '../geo/lng_lat.js';\nimport type {LngLatLike} from '../geo/lng_lat.js';\nimport {clamp, degToRad} from '../util/util.js';\nimport {CanonicalTileID} from '../source/tile_id.js';\nimport EXTENT from '../style-spec/data/extent.js';\n\nconst DEFAULT_MIN_ZOOM = 0;\nconst DEFAULT_MAX_ZOOM = 25.5;\n/*\n * The circumference at a line of latitude in meters.\n */\nexport function circumferenceAtLatitude(latitude: number): number {\n    return earthCircumference * Math.cos(latitude * Math.PI / 180);\n}\n\nexport function mercatorXfromLng(lng: number): number {\n    return (180 + lng) / 360;\n}\n\nexport function mercatorYfromLat(lat: number): number {\n    return (180 - (180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360)))) / 360;\n}\n\nexport function mercatorZfromAltitude(altitude: number, lat: number): number {\n    return altitude / circumferenceAtLatitude(lat);\n}\n\nexport function lngFromMercatorX(x: number): number {\n    return x * 360 - 180;\n}\n\nexport function latFromMercatorY(y: number): number {\n    const y2 = 180 - y * 360;\n    return 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90;\n}\n\nexport function altitudeFromMercatorZ(z: number, y: number): number {\n    return z * circumferenceAtLatitude(latFromMercatorY(y));\n}\n\nexport const MAX_MERCATOR_LATITUDE = 85.051129;\n\nexport function getLatitudeScale(lat: number): number {\n    return Math.cos(degToRad(clamp(lat, -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE)));\n}\n\nexport function getMetersPerPixelAtLatitude(lat: number, zoom: number): number {\n    const constrainedZoom = clamp(zoom, DEFAULT_MIN_ZOOM, DEFAULT_MAX_ZOOM);\n    const constrainedScale = Math.pow(2.0, constrainedZoom);\n    return getLatitudeScale(lat) * earthCircumference / (constrainedScale * 512.0);\n}\n\n/**\n * Determine the Mercator scale factor for a given latitude, see\n * https://en.wikipedia.org/wiki/Mercator_projection#Scale_factor\n *\n * At the equator the scale factor will be 1, which increases at higher latitudes.\n *\n * @param {number} lat Latitude\n * @returns {number} scale factor\n * @private\n */\nexport function mercatorScale(lat: number): number {\n    return 1 / Math.cos(lat * Math.PI / 180);\n}\n\nexport function tileToMeter(canonical: CanonicalTileID, tileYCoordinate: number = 0): number {\n    const circumferenceAtEquator = 40075017;\n    const mercatorY = (canonical.y + tileYCoordinate / EXTENT) / (1 << canonical.z);\n    const exp = Math.exp(Math.PI * (1 - 2 * mercatorY));\n    // simplify cos(2 * atan(e) - PI/2) from mercator_coordinate.js, remove trigonometrics.\n    return circumferenceAtEquator * 2 * exp / (exp * exp + 1) / EXTENT / (1 << canonical.z);\n}\n\n/**\n * A `MercatorCoordinate` object represents a projected three dimensional position.\n *\n * `MercatorCoordinate` uses the web mercator projection ([EPSG:3857](https://epsg.io/3857)) with slightly different units:\n * - the size of 1 unit is the width of the projected world instead of the \"mercator meter\"\n * - the origin of the coordinate space is at the north-west corner instead of the middle.\n *\n * For example, `MercatorCoordinate(0, 0, 0)` is the north-west corner of the mercator world and\n * `MercatorCoordinate(1, 1, 0)` is the south-east corner. If you are familiar with\n * [vector tiles](https://github.com/mapbox/vector-tile-spec) it may be helpful to think\n * of the coordinate space as the `0/0/0` tile with an extent of `1`.\n *\n * The `z` dimension of `MercatorCoordinate` is conformal. A cube in the mercator coordinate space would be rendered as a cube.\n *\n * @param {number} x The x component of the position.\n * @param {number} y The y component of the position.\n * @param {number} z The z component of the position.\n * @example\n * const nullIsland = new mapboxgl.MercatorCoordinate(0.5, 0.5, 0);\n *\n * @see [Example: Add a custom style layer](https://www.mapbox.com/mapbox-gl-js/example/custom-style-layer/)\n */\nclass MercatorCoordinate {\n    x: number;\n    y: number;\n    z: number;\n\n    constructor(x: number, y: number, z: number = 0) {\n        this.x = +x;\n        this.y = +y;\n        this.z = +z;\n    }\n\n    /**\n     * Project a `LngLat` to a `MercatorCoordinate`.\n     *\n     * @param {LngLatLike} lngLatLike The location to project.\n     * @param {number} altitude The altitude in meters of the position.\n     * @returns {MercatorCoordinate} The projected mercator coordinate.\n     * @example\n     * const coord = mapboxgl.MercatorCoordinate.fromLngLat({lng: 0, lat: 0}, 0);\n     * console.log(coord); // MercatorCoordinate(0.5, 0.5, 0)\n     */\n    static fromLngLat(lngLatLike: LngLatLike, altitude: number = 0): MercatorCoordinate {\n        const lngLat = LngLat.convert(lngLatLike);\n\n        return new MercatorCoordinate(\n                mercatorXfromLng(lngLat.lng),\n                mercatorYfromLat(lngLat.lat),\n                mercatorZfromAltitude(altitude, lngLat.lat));\n    }\n\n    /**\n     * Returns the `LngLat` for the coordinate.\n     *\n     * @returns {LngLat} The `LngLat` object.\n     * @example\n     * const coord = new mapboxgl.MercatorCoordinate(0.5, 0.5, 0);\n     * const lngLat = coord.toLngLat(); // LngLat(0, 0)\n     */\n    toLngLat(): LngLat {\n        return new LngLat(\n                lngFromMercatorX(this.x),\n                latFromMercatorY(this.y));\n    }\n\n    /**\n     * Returns the altitude in meters of the coordinate.\n     *\n     * @returns {number} The altitude in meters.\n     * @example\n     * const coord = new mapboxgl.MercatorCoordinate(0, 0, 0.02);\n     * coord.toAltitude(); // 6914.281956295339\n     */\n    toAltitude(): number {\n        return altitudeFromMercatorZ(this.z, this.y);\n    }\n\n    /**\n     * Returns the distance of 1 meter in `MercatorCoordinate` units at this latitude.\n     *\n     * For coordinates in real world units using meters, this naturally provides the scale\n     * to transform into `MercatorCoordinate`s.\n     *\n     * @returns {number} Distance of 1 meter in `MercatorCoordinate` units.\n     * @example\n     * // Calculate a new MercatorCoordinate that is 150 meters west of the other coord.\n     * const coord = new mapboxgl.MercatorCoordinate(0.5, 0.25, 0);\n     * const offsetInMeters = 150;\n     * const offsetInMercatorCoordinateUnits = offsetInMeters * coord.meterInMercatorCoordinateUnits();\n     * const westCoord = new mapboxgl.MercatorCoordinate(coord.x - offsetInMercatorCoordinateUnits, coord.y, coord.z);\n     */\n    meterInMercatorCoordinateUnits(): number {\n        // 1 meter / circumference at equator in meters * Mercator projection scale factor at this latitude\n        return 1 / earthCircumference * mercatorScale(latFromMercatorY(this.y));\n    }\n\n}\n\nexport default MercatorCoordinate;\n","// @flow\n\nimport Point from '@mapbox/point-geometry';\n\nfunction pointToLineDist(px: number, py: number, ax: number, ay: number, bx: number, by: number) {\n    const dx = ax - bx;\n    const dy = ay - by;\n    return Math.abs((ay - py) * dx - (ax - px) * dy) / Math.hypot(dx, dy);\n}\n\nfunction addResampled(resampled: Array<Point>, mx0: number, my0: number, mx2: number, my2: number, start: Point, end: Point, reproject: ((Point) => void), tolerance: number) {\n    const mx1 = (mx0 + mx2) / 2;\n    const my1 = (my0 + my2) / 2;\n    const mid = new Point(mx1, my1);\n    reproject(mid);\n    const err = pointToLineDist(mid.x, mid.y, start.x, start.y, end.x, end.y);\n\n    // if reprojected midPoint is too far from geometric midpoint, recurse into two halves\n    if (err >= tolerance) {\n        // we're very unlikely to hit max call stack exceeded here,\n        // but we might want to safeguard against it in the future\n        addResampled(resampled, mx0, my0, mx1, my1, start, mid, reproject, tolerance);\n        addResampled(resampled, mx1, my1, mx2, my2, mid, end, reproject, tolerance);\n\n    } else { // otherwise, just add the point\n        resampled.push(end);\n    }\n}\n\n// reproject and resample a line, adding point where necessary for lines that become curves;\n// note that this operation is mutable (modifying original points) for performance\nexport default function resample(line: Array<Point>, reproject: (Point) => void, tolerance: number): Array<Point> {\n    let prev = line[0];\n    let mx0 = prev.x;\n    let my0 = prev.y;\n    reproject(prev);\n    const resampled = [prev];\n\n    for (let i = 1; i < line.length; i++) {\n        const point = line[i];\n        const {x, y} = point;\n        reproject(point);\n        addResampled(resampled, mx0, my0, x, y, prev, point, reproject, tolerance);\n        mx0 = x;\n        my0 = y;\n        prev = point;\n    }\n\n    return resampled;\n}\n\nfunction addResampledPred(resampled: Point[], a: Point, b: Point, pred: ((Point, Point) => boolean)) {\n    const split = pred(a, b);\n\n    // if the predicate condition is met, recurse into two halves\n    if (split) {\n        const mid = a.add(b)._mult(0.5);\n        addResampledPred(resampled, a, mid, pred);\n        addResampledPred(resampled, mid, b, pred);\n\n    } else {\n        resampled.push(b);\n    }\n}\n\nexport function resamplePred(line: Point[], predicate: (Point, Point) => boolean): Point[] {\n    let prev = line[0];\n    const resampled = [prev];\n\n    for (let i = 1; i < line.length; i++) {\n        const point = line[i];\n        addResampledPred(resampled, prev, point, predicate);\n        prev = point;\n    }\n\n    return resampled;\n}\n","// @flow\n\nimport {warnOnce, clamp} from '../util/util.js';\n\nimport EXTENT from '../style-spec/data/extent.js';\nimport {lngFromMercatorX, latFromMercatorY} from '../geo/mercator_coordinate.js';\nimport resample from '../geo/projection/resample.js';\nimport Point from '@mapbox/point-geometry';\n\nimport type {CanonicalTileID} from '../source/tile_id.js';\nimport type {TileTransform} from '../geo/projection/tile_transform.js';\n\n// These bounds define the minimum and maximum supported coordinate values.\n// While visible coordinates are within [0, EXTENT], tiles may theoretically\n// contain coordinates within [-Infinity, Infinity]. Our range is limited by the\n// number of bits used to represent the coordinate.\nconst BITS = 15;\nconst MAX = Math.pow(2, BITS - 1) - 1;\nconst MIN = -MAX - 1;\n\nfunction preparePoint(point: Point, scale: number) {\n    const x = Math.round(point.x * scale);\n    const y = Math.round(point.y * scale);\n    point.x = clamp(x, MIN, MAX);\n    point.y = clamp(y, MIN, MAX);\n    if (x < point.x || x > point.x + 1 || y < point.y || y > point.y + 1) {\n        // warn when exceeding allowed extent except for the 1-px-off case\n        // https://github.com/mapbox/mapbox-gl-js/issues/8992\n        warnOnce('Geometry exceeds allowed extent, reduce your vector tile buffer size');\n    }\n    return point;\n}\n\n// a subset of VectorTileGeometry\ninterface FeatureWithGeometry {\n    extent: number;\n    type: 1 | 2 | 3;\n    loadGeometry(): Array<Array<Point>>;\n}\n\n/**\n * Loads a geometry from a VectorTileFeature and scales it to the common extent\n * used internally.\n * @param {VectorTileFeature} feature\n * @private\n */\nexport default function loadGeometry(feature: FeatureWithGeometry, canonical?: CanonicalTileID, tileTransform?: TileTransform): Array<Array<Point>> {\n    const geometry = feature.loadGeometry();\n    const extent = feature.extent;\n    const extentScale = EXTENT / extent;\n\n    if (canonical && tileTransform && tileTransform.projection.isReprojectedInTileSpace) {\n        const z2 = 1 << canonical.z;\n        const {scale, x, y, projection} = tileTransform;\n\n        const reproject = (p: Point) => {\n            const lng = lngFromMercatorX((canonical.x + p.x / extent) / z2);\n            const lat = latFromMercatorY((canonical.y + p.y / extent) / z2);\n            const p2 = projection.project(lng, lat);\n            p.x = (p2.x * scale - x) * extent;\n            p.y = (p2.y * scale - y) * extent;\n        };\n\n        for (let i = 0; i < geometry.length; i++) {\n            if (feature.type !== 1) {\n                geometry[i] = resample(geometry[i], reproject, 1); // resample lines and polygons\n\n            } else { // points\n                const line = [];\n                for (const p of geometry[i]) {\n                    // filter out point features outside tile boundaries now; it'd be harder to do later\n                    // when the coords are reprojected and no longer axis-aligned; ideally this would happen\n                    // or not depending on how the geometry is used, but we forego the complexity for now\n                    if (p.x < 0 || p.x >= extent || p.y < 0 || p.y >= extent) continue;\n                    reproject(p);\n                    line.push(p);\n                }\n                geometry[i] = line;\n            }\n        }\n    }\n\n    for (const line of geometry) {\n        for (const p of line) {\n            preparePoint(p, extentScale);\n        }\n    }\n\n    return geometry;\n}\n","// @flow\n\nimport loadGeometry from './load_geometry.js';\n\nimport type Point from '@mapbox/point-geometry';\nimport type {IVectorTileFeature} from '@mapbox/vector-tile';\n\nexport type EvaluationFeature = {\n    +type: 1 | 2 | 3 | 'Unknown' | 'Point' | 'LineString' | 'Polygon',\n    +id?: any,\n    +properties: {[_: string]: any},\n    +patterns?: {[_: string]: string},\n    geometry: Array<Array<Point>>\n};\n\n/**\n * Construct a new feature based on a VectorTileFeature for expression evaluation, the geometry of which\n * will be loaded based on necessity.\n * @param {VectorTileFeature} feature\n * @param {boolean} needGeometry\n * @private\n */\nexport default function toEvaluationFeature(feature: IVectorTileFeature, needGeometry: boolean): EvaluationFeature {\n    return {type: feature.type,\n        id: feature.id,\n        properties:feature.properties,\n        geometry: needGeometry ? loadGeometry(feature) : []};\n}\n","// @flow\n\nimport {CircleLayoutArray, CircleGlobeExtArray} from '../array_types.js';\n\nimport {circleAttributes, circleGlobeAttributesExt} from './circle_attributes.js';\nimport SegmentVector from '../segment.js';\nimport {ProgramConfigurationSet} from '../program_configuration.js';\nimport {TriangleIndexArray} from '../index_array_type.js';\nimport loadGeometry from '../load_geometry.js';\nimport toEvaluationFeature from '../evaluation_feature.js';\nimport EXTENT from '../../style-spec/data/extent.js';\nimport {register} from '../../util/web_worker_transfer.js';\nimport EvaluationParameters from '../../style/evaluation_parameters.js';\n\nimport type {CanonicalTileID} from '../../source/tile_id.js';\nimport type {\n    Bucket,\n    BucketParameters,\n    BucketFeature,\n    IndexedFeature,\n    PopulateParameters\n} from '../bucket.js';\nimport type CircleStyleLayer from '../../style/style_layer/circle_style_layer.js';\nimport type HeatmapStyleLayer from '../../style/style_layer/heatmap_style_layer.js';\nimport type Context from '../../gl/context.js';\nimport type IndexBuffer from '../../gl/index_buffer.js';\nimport type VertexBuffer from '../../gl/vertex_buffer.js';\nimport type Point from '@mapbox/point-geometry';\nimport type {FeatureStates} from '../../source/source_state.js';\nimport type {SpritePositions} from '../../util/image.js';\nimport type {TileTransform} from '../../geo/projection/tile_transform.js';\nimport type {ProjectionSpecification} from '../../style-spec/types.js';\nimport type Projection from '../../geo/projection/projection.js';\nimport type {Vec3} from 'gl-matrix';\nimport type {IVectorTileLayer} from '@mapbox/vector-tile';\n\nfunction addCircleVertex(layoutVertexArray: CircleLayoutArray, x: number, y: number, extrudeX: number, extrudeY: number) {\n    layoutVertexArray.emplaceBack(\n        (x * 2) + ((extrudeX + 1) / 2),\n        (y * 2) + ((extrudeY + 1) / 2));\n}\n\nfunction addGlobeExtVertex(vertexArray: CircleGlobeExtArray, pos: {x: number, y: number, z: number}, normal: Vec3) {\n    const encode = 1 << 14;\n    vertexArray.emplaceBack(\n        pos.x, pos.y, pos.z,\n        normal[0] * encode, normal[1] * encode, normal[2] * encode);\n}\n\n/**\n * Circles are represented by two triangles.\n *\n * Each corner has a pos that is the center of the circle and an extrusion\n * vector that is where it points.\n * @private\n */\nclass CircleBucket<Layer: CircleStyleLayer | HeatmapStyleLayer> implements Bucket {\n    index: number;\n    zoom: number;\n    overscaling: number;\n    layerIds: Array<string>;\n    layers: Array<Layer>;\n    stateDependentLayers: Array<Layer>;\n    stateDependentLayerIds: Array<string>;\n\n    layoutVertexArray: CircleLayoutArray;\n    layoutVertexBuffer: VertexBuffer;\n    globeExtVertexArray: ?CircleGlobeExtArray;\n    globeExtVertexBuffer: ?VertexBuffer;\n\n    indexArray: TriangleIndexArray;\n    indexBuffer: IndexBuffer;\n\n    hasPattern: boolean;\n    programConfigurations: ProgramConfigurationSet<Layer>;\n    segments: SegmentVector;\n    uploaded: boolean;\n    projection: ProjectionSpecification;\n\n    constructor(options: BucketParameters<Layer>) {\n        this.zoom = options.zoom;\n        this.overscaling = options.overscaling;\n        this.layers = options.layers;\n        this.layerIds = this.layers.map(layer => layer.fqid);\n        this.index = options.index;\n        this.hasPattern = false;\n        this.projection = options.projection;\n\n        this.layoutVertexArray = new CircleLayoutArray();\n        this.indexArray = new TriangleIndexArray();\n        this.segments = new SegmentVector();\n        this.programConfigurations = new ProgramConfigurationSet(options.layers, options.zoom);\n        this.stateDependentLayerIds = this.layers.filter((l) => l.isStateDependent()).map((l) => l.id);\n    }\n\n    populate(features: Array<IndexedFeature>, options: PopulateParameters, canonical: CanonicalTileID, tileTransform: TileTransform) {\n        const styleLayer = this.layers[0];\n        const bucketFeatures = [];\n        let circleSortKey = null;\n\n        // Heatmap layers are handled in this bucket and have no evaluated properties, so we check our access\n        if (styleLayer.type === 'circle') {\n            circleSortKey = ((styleLayer: any): CircleStyleLayer).layout.get('circle-sort-key');\n        }\n\n        for (const {feature, id, index, sourceLayerIndex} of features) {\n            const needGeometry = this.layers[0]._featureFilter.needGeometry;\n            const evaluationFeature = toEvaluationFeature(feature, needGeometry);\n\n            // $FlowFixMe[method-unbinding]\n            if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) continue;\n\n            const sortKey = circleSortKey ?\n                circleSortKey.evaluate(evaluationFeature, {}, canonical) :\n                undefined;\n\n            const bucketFeature: BucketFeature = {\n                id,\n                properties: feature.properties,\n                type: feature.type,\n                sourceLayerIndex,\n                index,\n                geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature, canonical, tileTransform),\n                patterns: {},\n                sortKey\n            };\n\n            bucketFeatures.push(bucketFeature);\n\n        }\n\n        if (circleSortKey) {\n            bucketFeatures.sort((a, b) => {\n                // a.sortKey is always a number when in use\n                return ((a.sortKey: any): number) - ((b.sortKey: any): number);\n            });\n        }\n\n        let globeProjection: ?Projection = null;\n\n        if (tileTransform.projection.name === 'globe') {\n            // Extend vertex attributes if the globe projection is enabled\n            this.globeExtVertexArray = new CircleGlobeExtArray();\n            globeProjection = tileTransform.projection;\n        }\n\n        for (const bucketFeature of bucketFeatures) {\n            const {geometry, index, sourceLayerIndex} = bucketFeature;\n            const feature = features[index].feature;\n\n            this.addFeature(bucketFeature, geometry, index, options.availableImages, canonical, globeProjection, options.brightness);\n            options.featureIndex.insert(feature, geometry, index, sourceLayerIndex, this.index);\n        }\n    }\n\n    update(states: FeatureStates, vtLayer: IVectorTileLayer, availableImages: Array<string>, imagePositions: SpritePositions, brightness: ?number) {\n        const withStateUpdates = Object.keys(states).length !== 0;\n        if (withStateUpdates && !this.stateDependentLayers.length) return;\n        const layers = withStateUpdates ? this.stateDependentLayers : this.layers;\n        this.programConfigurations.updatePaintArrays(states, vtLayer, layers, availableImages, imagePositions, brightness);\n    }\n\n    isEmpty(): boolean {\n        return this.layoutVertexArray.length === 0;\n    }\n\n    uploadPending(): boolean {\n        return !this.uploaded || this.programConfigurations.needsUpload;\n    }\n\n    upload(context: Context) {\n        if (!this.uploaded) {\n            this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, circleAttributes.members);\n            this.indexBuffer = context.createIndexBuffer(this.indexArray);\n\n            if (this.globeExtVertexArray) {\n                this.globeExtVertexBuffer = context.createVertexBuffer(this.globeExtVertexArray, circleGlobeAttributesExt.members);\n            }\n        }\n        this.programConfigurations.upload(context);\n        this.uploaded = true;\n    }\n\n    destroy() {\n        if (!this.layoutVertexBuffer) return;\n        this.layoutVertexBuffer.destroy();\n        this.indexBuffer.destroy();\n        this.programConfigurations.destroy();\n        this.segments.destroy();\n        if (this.globeExtVertexBuffer) {\n            this.globeExtVertexBuffer.destroy();\n        }\n    }\n\n    addFeature(feature: BucketFeature, geometry: Array<Array<Point>>, index: number, availableImages: Array<string>, canonical: CanonicalTileID, projection?: ?Projection, brightness: ?number) {\n        for (const ring of geometry) {\n            for (const point of ring) {\n                const x = point.x;\n                const y = point.y;\n\n                // Do not include points that are outside the tile boundaries.\n                if (x < 0 || x >= EXTENT || y < 0 || y >= EXTENT) continue;\n\n                // this geometry will be of the Point type, and we'll derive\n                // two triangles from it.\n                //\n                // ┌─────────┐\n                // │ 3     2 │\n                // │         │\n                // │ 0     1 │\n                // └─────────┘\n\n                if (projection) {\n                    const projectedPoint = projection.projectTilePoint(x, y, canonical);\n                    const normal = projection.upVector(canonical, x, y);\n                    const array: any = this.globeExtVertexArray;\n\n                    addGlobeExtVertex(array, projectedPoint, normal);\n                    addGlobeExtVertex(array, projectedPoint, normal);\n                    addGlobeExtVertex(array, projectedPoint, normal);\n                    addGlobeExtVertex(array, projectedPoint, normal);\n                }\n                const segment = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray, feature.sortKey);\n                const index = segment.vertexLength;\n\n                addCircleVertex(this.layoutVertexArray, x, y, -1, -1);\n                addCircleVertex(this.layoutVertexArray, x, y, 1, -1);\n                addCircleVertex(this.layoutVertexArray, x, y, 1, 1);\n                addCircleVertex(this.layoutVertexArray, x, y, -1, 1);\n\n                this.indexArray.emplaceBack(index, index + 1, index + 2);\n                this.indexArray.emplaceBack(index, index + 2, index + 3);\n\n                segment.vertexLength += 4;\n                segment.primitiveLength += 2;\n            }\n        }\n\n        this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, {}, availableImages, canonical, brightness);\n    }\n}\n\nregister(CircleBucket, 'CircleBucket', {omit: ['layers']});\n\nexport default CircleBucket;\n","// @flow\n\nimport {isCounterClockwise} from './util.js';\n\nimport Point from '@mapbox/point-geometry';\n\nexport {polygonIntersectsBufferedPoint, polygonIntersectsMultiPolygon, polygonIntersectsBufferedMultiLine, polygonIntersectsPolygon, distToSegmentSquared, polygonIntersectsBox, polygonContainsPoint, triangleIntersectsTriangle};\n\ntype Line = $ReadOnlyArray<Point>;\ntype MultiLine = $ReadOnlyArray<Line>;\ntype Ring = $ReadOnlyArray<Point>;\ntype Polygon = $ReadOnlyArray<Point>;\ntype MultiPolygon = $ReadOnlyArray<Polygon>;\n\nfunction polygonIntersectsPolygon(polygonA: Polygon, polygonB: Polygon): boolean {\n    for (let i = 0; i < polygonA.length; i++) {\n        if (polygonContainsPoint(polygonB, polygonA[i])) return true;\n    }\n\n    for (let i = 0; i < polygonB.length; i++) {\n        if (polygonContainsPoint(polygonA, polygonB[i])) return true;\n    }\n\n    if (lineIntersectsLine(polygonA, polygonB)) return true;\n\n    return false;\n}\n\nfunction polygonIntersectsBufferedPoint(polygon: Polygon, point: Point, radius: number): boolean {\n    if (polygonContainsPoint(polygon, point)) return true;\n    if (pointIntersectsBufferedLine(point, polygon, radius)) return true;\n    return false;\n}\n\nfunction polygonIntersectsMultiPolygon(polygon: Polygon, multiPolygon: MultiPolygon): boolean {\n\n    if (polygon.length === 1) {\n        return multiPolygonContainsPoint(multiPolygon, polygon[0]);\n    }\n\n    for (let m = 0; m < multiPolygon.length; m++) {\n        const ring = multiPolygon[m];\n        for (let n = 0; n < ring.length; n++) {\n            if (polygonContainsPoint(polygon, ring[n])) return true;\n        }\n    }\n\n    for (let i = 0; i < polygon.length; i++) {\n        if (multiPolygonContainsPoint(multiPolygon, polygon[i])) return true;\n    }\n\n    for (let k = 0; k < multiPolygon.length; k++) {\n        if (lineIntersectsLine(polygon, multiPolygon[k])) return true;\n    }\n\n    return false;\n}\n\nfunction polygonIntersectsBufferedMultiLine(polygon: Polygon, multiLine: MultiLine, radius: number): boolean {\n    for (let i = 0; i < multiLine.length; i++) {\n        const line = multiLine[i];\n\n        if (polygon.length >= 3) {\n            for (let k = 0; k < line.length; k++) {\n                if (polygonContainsPoint(polygon, line[k])) return true;\n            }\n        }\n\n        if (lineIntersectsBufferedLine(polygon, line, radius)) return true;\n    }\n    return false;\n}\n\nfunction lineIntersectsBufferedLine(lineA: Line, lineB: Line, radius: number) {\n\n    if (lineA.length > 1) {\n        if (lineIntersectsLine(lineA, lineB)) return true;\n\n        // Check whether any point in either line is within radius of the other line\n        for (let j = 0; j < lineB.length; j++) {\n            if (pointIntersectsBufferedLine(lineB[j], lineA, radius)) return true;\n        }\n    }\n\n    for (let k = 0; k < lineA.length; k++) {\n        if (pointIntersectsBufferedLine(lineA[k], lineB, radius)) return true;\n    }\n\n    return false;\n}\n\nfunction lineIntersectsLine(lineA: Line, lineB: Line) {\n    if (lineA.length === 0 || lineB.length === 0) return false;\n    for (let i = 0; i < lineA.length - 1; i++) {\n        const a0 = lineA[i];\n        const a1 = lineA[i + 1];\n        for (let j = 0; j < lineB.length - 1; j++) {\n            const b0 = lineB[j];\n            const b1 = lineB[j + 1];\n            if (lineSegmentIntersectsLineSegment(a0, a1, b0, b1)) return true;\n        }\n    }\n    return false;\n}\n\nfunction lineSegmentIntersectsLineSegment(a0: Point, a1: Point, b0: Point, b1: Point) {\n    return isCounterClockwise(a0, b0, b1) !== isCounterClockwise(a1, b0, b1) &&\n        isCounterClockwise(a0, a1, b0) !== isCounterClockwise(a0, a1, b1);\n}\n\nfunction pointIntersectsBufferedLine(p: Point, line: Line, radius: number) {\n    const radiusSquared = radius * radius;\n\n    if (line.length === 1) return p.distSqr(line[0]) < radiusSquared;\n\n    for (let i = 1; i < line.length; i++) {\n        // Find line segments that have a distance <= radius^2 to p\n        // In that case, we treat the line as \"containing point p\".\n        const v = line[i - 1], w = line[i];\n        if (distToSegmentSquared(p, v, w) < radiusSquared) return true;\n    }\n    return false;\n}\n\n// Code from http://stackoverflow.com/a/1501725/331379.\nfunction distToSegmentSquared(p: Point, v: Point, w: Point): number {\n    const l2 = v.distSqr(w);\n    if (l2 === 0) return p.distSqr(v);\n    const t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2;\n    if (t < 0) return p.distSqr(v);\n    if (t > 1) return p.distSqr(w);\n    return p.distSqr(w.sub(v)._mult(t)._add(v));\n}\n\n// point in polygon ray casting algorithm\nfunction multiPolygonContainsPoint(rings: MultiPolygon, p: Point) {\n    let c = false,\n        ring, p1, p2;\n\n    for (let k = 0; k < rings.length; k++) {\n        ring = rings[k];\n        for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n            p1 = ring[i];\n            p2 = ring[j];\n            if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {\n                c = !c;\n            }\n        }\n    }\n    return c;\n}\n\nfunction polygonContainsPoint(ring: Ring, p: Point): boolean {\n    let c = false;\n    for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n        const p1 = ring[i];\n        const p2 = ring[j];\n        if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {\n            c = !c;\n        }\n    }\n    return c;\n}\n\nfunction polygonIntersectsBox(ring: Ring, boxX1: number, boxY1: number, boxX2: number, boxY2: number): boolean {\n    for (const p of ring) {\n        if (boxX1 <= p.x &&\n            boxY1 <= p.y &&\n            boxX2 >= p.x &&\n            boxY2 >= p.y) return true;\n    }\n\n    const corners = [\n        new Point(boxX1, boxY1),\n        new Point(boxX1, boxY2),\n        new Point(boxX2, boxY2),\n        new Point(boxX2, boxY1)];\n\n    if (ring.length > 2) {\n        for (const corner of corners) {\n            if (polygonContainsPoint(ring, corner)) return true;\n        }\n    }\n\n    for (let i = 0; i < ring.length - 1; i++) {\n        const p1 = ring[i];\n        const p2 = ring[i + 1];\n        if (edgeIntersectsBox(p1, p2, corners)) return true;\n    }\n\n    return false;\n}\n\nfunction edgeIntersectsBox(e1: Point, e2: Point, corners: Array<Point>) {\n    const tl = corners[0];\n    const br = corners[2];\n    // the edge and box do not intersect in either the x or y dimensions\n    if (((e1.x < tl.x) && (e2.x < tl.x)) ||\n        ((e1.x > br.x) && (e2.x > br.x)) ||\n        ((e1.y < tl.y) && (e2.y < tl.y)) ||\n        ((e1.y > br.y) && (e2.y > br.y))) return false;\n\n    // check if all corners of the box are on the same side of the edge\n    const dir = isCounterClockwise(e1, e2, corners[0]);\n    return dir !== isCounterClockwise(e1, e2, corners[1]) ||\n        dir !== isCounterClockwise(e1, e2, corners[2]) ||\n        dir !== isCounterClockwise(e1, e2, corners[3]);\n}\n\n// Checks whether the triangle [p0, p1, p2] is on the left side of the edge [a, b].\nfunction triangleLeftSideOfEdge(a: Point, b: Point, p0: Point, p1: Point, p2: Point, padding: ?number): boolean {\n    let nx = b.y - a.y;\n    let ny = a.x - b.x;\n\n    padding = padding || 0;\n\n    if (padding) {\n        const nLenSq = nx * nx + ny * ny;\n        if (nLenSq === 0) {\n            return true;\n        }\n\n        const len = Math.sqrt(nLenSq);\n        nx /= len;\n        ny /= len;\n    }\n\n    if ((p0.x - a.x) * nx + (p0.y - a.y) * ny - padding < 0) {\n        return false;\n    } else if ((p1.x - a.x) * nx + (p1.y - a.y) * ny - padding < 0) {\n        return false;\n    } else if ((p2.x - a.x) * nx + (p2.y - a.y) * ny - padding < 0) {\n        return false;\n    }\n\n    return true;\n}\n\nfunction triangleIntersectsTriangle(a0: Point, b0: Point, c0: Point, a1: Point, b1: Point, c1: Point, padding: ?number): boolean {\n    // Triangles are not intersecting if even one separating axis can be found\n    if (triangleLeftSideOfEdge(a0, b0, a1, b1, c1, padding)) {\n        return false;\n    } else if (triangleLeftSideOfEdge(b0, c0, a1, b1, c1, padding)) {\n        return false;\n    } else if (triangleLeftSideOfEdge(c0, a0, a1, b1, c1, padding)) {\n        return false;\n    } else if (triangleLeftSideOfEdge(a1, b1, a0, b0, c0, padding)) {\n        return false;\n    } else if (triangleLeftSideOfEdge(b1, c1, a0, b0, c0, padding)) {\n        return false;\n    } else if (triangleLeftSideOfEdge(c1, a1, a0, b0, c0, padding)) {\n        return false;\n    }\n    return true;\n}\n","// @flow\n\nimport Point from '@mapbox/point-geometry';\n\nimport type {PossiblyEvaluatedPropertyValue} from './properties.js';\nimport type StyleLayer from '../style/style_layer.js';\nimport type CircleBucket from '../data/bucket/circle_bucket.js';\nimport type LineBucket from '../data/bucket/line_bucket.js';\n\nexport function getMaximumPaintValue(property: string, layer: StyleLayer, bucket: CircleBucket<*> | LineBucket): number {\n    const value = ((layer.paint: any).get(property): PossiblyEvaluatedPropertyValue<any>).value;\n    if (value.kind === 'constant') {\n        return value.value;\n    } else {\n        return bucket.programConfigurations.get(layer.id).getMaxValue(property);\n    }\n}\n\nexport function translateDistance(translate: [number, number]): number {\n    return Math.sqrt(translate[0] * translate[0] + translate[1] * translate[1]);\n}\n\nexport function translate(queryGeometry: Array<Point>,\n                   translate: [number, number],\n                   translateAnchor: 'viewport' | 'map',\n                   bearing: number,\n                   pixelsToTileUnits: number): Array<Point> {\n    if (!translate[0] && !translate[1]) {\n        return queryGeometry;\n    }\n    const pt = Point.convert(translate)._mult(pixelsToTileUnits);\n\n    if (translateAnchor === \"viewport\") {\n        pt._rotate(-bearing);\n    }\n\n    const translated = [];\n    for (let i = 0; i < queryGeometry.length; i++) {\n        const point = queryGeometry[i];\n        translated.push(point.sub(pt));\n    }\n    return translated;\n}\n\nexport function tilespaceTranslate(translate: [number, number],\n                    translateAnchor: 'viewport' | 'map',\n                    bearing: number,\n                    pixelsToTileUnits: number): Point {\n    const pt = Point.convert(translate)._mult(pixelsToTileUnits);\n\n    if (translateAnchor === \"viewport\") {\n        pt._rotate(-bearing);\n    }\n\n    return pt;\n}\n","// This file is generated. Edit build/generate-style-code.js, then run `npm run codegen`.\n// @flow\n/* eslint-disable */\n\nimport styleSpec from '../../style-spec/reference/latest.js';\n\nimport {\n    Properties,\n    DataConstantProperty,\n    DataDrivenProperty,\n    ColorRampProperty\n} from '../properties.js';\n\nimport type Color from '../../style-spec/util/color.js';\n\nimport type Formatted from '../../style-spec/expression/types/formatted.js';\n\nimport type ResolvedImage from '../../style-spec/expression/types/resolved_image.js';\n\nexport type LayoutProps = {|\n    \"circle-sort-key\": DataDrivenProperty<number>,\n    \"visibility\": DataConstantProperty<\"visible\" | \"none\">,\n|};\n\nconst layout: Properties<LayoutProps> = new Properties({\n    \"circle-sort-key\": new DataDrivenProperty(styleSpec[\"layout_circle\"][\"circle-sort-key\"]),\n    \"visibility\": new DataConstantProperty(styleSpec[\"layout_circle\"][\"visibility\"]),\n});\n\nexport type PaintProps = {|\n    \"circle-radius\": DataDrivenProperty<number>,\n    \"circle-color\": DataDrivenProperty<Color>,\n    \"circle-blur\": DataDrivenProperty<number>,\n    \"circle-opacity\": DataDrivenProperty<number>,\n    \"circle-translate\": DataConstantProperty<[number, number]>,\n    \"circle-translate-anchor\": DataConstantProperty<\"map\" | \"viewport\">,\n    \"circle-pitch-scale\": DataConstantProperty<\"map\" | \"viewport\">,\n    \"circle-pitch-alignment\": DataConstantProperty<\"map\" | \"viewport\">,\n    \"circle-stroke-width\": DataDrivenProperty<number>,\n    \"circle-stroke-color\": DataDrivenProperty<Color>,\n    \"circle-stroke-opacity\": DataDrivenProperty<number>,\n    \"circle-emissive-strength\": DataConstantProperty<number>,\n|};\n\nconst paint: Properties<PaintProps> = new Properties({\n    \"circle-radius\": new DataDrivenProperty(styleSpec[\"paint_circle\"][\"circle-radius\"]),\n    \"circle-color\": new DataDrivenProperty(styleSpec[\"paint_circle\"][\"circle-color\"]),\n    \"circle-blur\": new DataDrivenProperty(styleSpec[\"paint_circle\"][\"circle-blur\"]),\n    \"circle-opacity\": new DataDrivenProperty(styleSpec[\"paint_circle\"][\"circle-opacity\"]),\n    \"circle-translate\": new DataConstantProperty(styleSpec[\"paint_circle\"][\"circle-translate\"]),\n    \"circle-translate-anchor\": new DataConstantProperty(styleSpec[\"paint_circle\"][\"circle-translate-anchor\"]),\n    \"circle-pitch-scale\": new DataConstantProperty(styleSpec[\"paint_circle\"][\"circle-pitch-scale\"]),\n    \"circle-pitch-alignment\": new DataConstantProperty(styleSpec[\"paint_circle\"][\"circle-pitch-alignment\"]),\n    \"circle-stroke-width\": new DataDrivenProperty(styleSpec[\"paint_circle\"][\"circle-stroke-width\"]),\n    \"circle-stroke-color\": new DataDrivenProperty(styleSpec[\"paint_circle\"][\"circle-stroke-color\"]),\n    \"circle-stroke-opacity\": new DataDrivenProperty(styleSpec[\"paint_circle\"][\"circle-stroke-opacity\"]),\n    \"circle-emissive-strength\": new DataConstantProperty(styleSpec[\"paint_circle\"][\"circle-emissive-strength\"]),\n});\n\n// Note: without adding the explicit type annotation, Flow infers weaker types\n// for these objects from their use in the constructor to StyleLayer, as\n// {layout?: Properties<...>, paint: Properties<...>}\nexport default ({ paint, layout }: $Exact<{\n  paint: Properties<PaintProps>, layout: Properties<LayoutProps>\n}>);\n","// @flow\n\nimport {vec3, vec4} from 'gl-matrix';\nimport assert from 'assert';\nimport {UnwrappedTileID} from '../source/tile_id.js';\n\nimport type {Vec3, Vec4, Mat4} from 'gl-matrix';\nimport {register} from './web_worker_transfer.js';\n\nclass Ray {\n    pos: Vec3;\n    dir: Vec3;\n\n    constructor(pos_: Vec3, dir_: Vec3) {\n        this.pos = pos_;\n        this.dir = dir_;\n    }\n\n    intersectsPlane(pt: Vec3, normal: Vec3, out: Vec3): boolean {\n        const D = vec3.dot(normal, this.dir);\n\n        // ray is parallel to plane, so it misses\n        if (Math.abs(D) < 1e-6) { return false; }\n\n        const t = (\n            (pt[0] - this.pos[0]) * normal[0] +\n            (pt[1] - this.pos[1]) * normal[1] +\n            (pt[2] - this.pos[2]) * normal[2]) / D;\n\n        out[0] = this.pos[0] + this.dir[0] * t;\n        out[1] = this.pos[1] + this.dir[1] * t;\n        out[2] = this.pos[2] + this.dir[2] * t;\n\n        return true;\n    }\n\n    closestPointOnSphere(center: Vec3, r: number, out: Vec3): boolean {\n        assert(vec3.squaredLength(this.dir) > 0.0 && r >= 0.0);\n\n        if (vec3.equals(this.pos, center) || r === 0.0) {\n            out[0] = out[1] = out[2] = 0;\n            return false;\n        }\n\n        const [dx, dy, dz] = this.dir;\n\n        const px = this.pos[0] - center[0];\n        const py = this.pos[1] - center[1];\n        const pz = this.pos[2] - center[2];\n\n        const a = dx * dx + dy * dy + dz * dz;\n        const b = 2.0 * (px * dx + py * dy + pz * dz);\n        const c = (px * px + py * py + pz * pz) - r * r;\n        const d = b * b - 4 * a * c;\n\n        if (d < 0.0) {\n            // No intersection, find distance between closest points\n            const t = Math.max(-b / 2, 0.0);\n            const gx = px + dx * t; // point to globe\n            const gy = py + dy * t;\n            const gz = pz + dz * t;\n            const glen = Math.hypot(gx, gy, gz);\n            out[0] = gx * r / glen;\n            out[1] = gy * r / glen;\n            out[2] = gz * r / glen;\n            return false;\n\n        } else {\n            assert(a > 0.0);\n            const t = (-b - Math.sqrt(d)) / (2.0 * a);\n\n            if (t < 0.0) {\n                // Ray is pointing away from the sphere\n                const plen = Math.hypot(px, py, pz);\n                out[0] = px * r / plen;\n                out[1] = py * r / plen;\n                out[2] = pz * r / plen;\n                return false;\n\n            } else {\n                out[0] = px + dx * t;\n                out[1] = py + dy * t;\n                out[2] = pz + dz * t;\n                return true;\n            }\n        }\n    }\n}\n\nclass FrustumCorners {\n    TL: [number, number, number];\n    TR: [number, number, number];\n    BR: [number, number, number];\n    BL: [number, number, number];\n    horizon: number;\n\n    constructor(TL_: [number, number, number], TR_: [number, number, number], BR_: [number, number, number], BL_: [number, number, number], horizon_: number) {\n        this.TL = TL_;\n        this.TR = TR_;\n        this.BR = BR_;\n        this.BL = BL_;\n        this.horizon = horizon_;\n    }\n\n    static fromInvProjectionMatrix(invProj: Array<number>, horizonFromTop: number, viewportHeight: number): FrustumCorners {\n        const TLClip = [-1, 1, 1];\n        const TRClip = [1, 1, 1];\n        const BRClip = [1, -1, 1];\n        const BLClip = [-1, -1, 1];\n\n        const TL = vec3.transformMat4(TLClip, TLClip, invProj);\n        const TR = vec3.transformMat4(TRClip, TRClip, invProj);\n        const BR = vec3.transformMat4(BRClip, BRClip, invProj);\n        const BL = vec3.transformMat4(BLClip, BLClip, invProj);\n\n        return new FrustumCorners(TL, TR, BR, BL, horizonFromTop / viewportHeight);\n    }\n}\n\nfunction projectPoints(points: Array<Vec3>, origin: Vec3, axis: Vec3): [number, number] {\n    let min = Infinity;\n    let max = -Infinity;\n\n    const vec = [];\n    for (const point of points) {\n        vec3.sub(vec, point, origin);\n        const projection = vec3.dot(vec, axis);\n\n        min = Math.min(min, projection);\n        max = Math.max(max, projection);\n    }\n\n    return [min, max];\n}\n\nfunction intersectsFrustum(frustum: Frustum, aabbPoints: Array<Vec3>): number {\n    let fullyInside = true;\n\n    for (let p = 0; p < frustum.planes.length; p++) {\n        const plane = frustum.planes[p];\n        let pointsInside = 0;\n\n        for (let i = 0; i < aabbPoints.length; i++) {\n            pointsInside += vec3.dot(plane, aabbPoints[i]) + plane[3] >= 0;\n        }\n\n        if (pointsInside === 0)\n            return 0;\n\n        if (pointsInside !== aabbPoints.length)\n            fullyInside = false;\n    }\n\n    return fullyInside ? 2 : 1;\n}\n\nfunction intersectsFrustumPrecise(frustum: Frustum, aabbPoints: Array<Vec3>): number {\n    for (const proj of frustum.projections) {\n        const projectedAabb = projectPoints(aabbPoints, frustum.points[0], proj.axis);\n\n        if (proj.projection[1] < projectedAabb[0] || proj.projection[0] > projectedAabb[1]) {\n            return 0;\n        }\n    }\n\n    return 1;\n}\n\ntype Projection = {\n    axis: Vec3;\n    projection: [number, number];\n};\n\ntype FrustumPoints = [Vec3, Vec3, Vec3, Vec3, Vec3, Vec3, Vec3, Vec3];\ntype FrustumPlanes = [Vec4, Vec4, Vec4, Vec4, Vec4, Vec4];\n\nconst NEAR_TL = 0;\nconst NEAR_TR = 1;\nconst NEAR_BR = 2;\nconst NEAR_BL = 3;\nconst FAR_TL = 4;\nconst FAR_TR = 5;\nconst FAR_BR = 6;\nconst FAR_BL = 7;\n\nfunction pointsInsideOfPlane(points: Array<Vec3>, plane: Vec4): number {\n    let pointsInside = 0;\n    const p = [0, 0, 0, 0];\n    for (let i = 0; i < points.length; i++) {\n        p[0] = points[i][0];\n        p[1] = points[i][1];\n        p[2] = points[i][2];\n        p[3] = 1.0;\n        if (vec4.dot(p, plane) >= 0) {\n            pointsInside++;\n        }\n    }\n    return pointsInside;\n}\n\nclass Frustum {\n    points: FrustumPoints;\n    planes: FrustumPlanes;\n    bounds: Aabb;\n    projections: Array<Projection>;\n    frustumEdges: Array<Vec3>;\n\n    constructor(points_: ?FrustumPoints, planes_: ?FrustumPlanes) {\n        this.points = points_ || (new Array(8).fill([0, 0, 0]): any);\n        this.planes = planes_ || (new Array(6).fill([0, 0, 0, 0]): any);\n        this.bounds = Aabb.fromPoints((this.points: any));\n        this.projections = [];\n\n        // Precompute a set of separating axis candidates for precise intersection tests.\n        // These axes are computed as follows: (edges of aabb) x (edges of frustum)\n        this.frustumEdges = [\n            vec3.sub([], this.points[NEAR_BR], this.points[NEAR_BL]),\n            vec3.sub([], this.points[NEAR_TL], this.points[NEAR_BL]),\n            vec3.sub([], this.points[FAR_TL], this.points[NEAR_TL]),\n            vec3.sub([], this.points[FAR_TR], this.points[NEAR_TR]),\n            vec3.sub([], this.points[FAR_BR], this.points[NEAR_BR]),\n            vec3.sub([], this.points[FAR_BL], this.points[NEAR_BL])\n        ];\n\n        for (const edge of this.frustumEdges) {\n            // Cross product [1, 0, 0] x [a, b, c] == [0, -c, b]\n            // Cross product [0, 1, 0] x [a, b, c] == [c, 0, -a]\n            const axis0 = [0, -edge[2], edge[1]];\n            const axis1 = [edge[2], 0, -edge[0]];\n\n            this.projections.push({\n                axis: axis0,\n                projection: projectPoints((this.points: any), this.points[0], axis0)\n            });\n\n            this.projections.push({\n                axis: axis1,\n                projection: projectPoints((this.points: any), this.points[0], axis1)\n            });\n        }\n    }\n\n    static fromInvProjectionMatrix(invProj: Float64Array, worldSize: number, zoom: number, zInMeters: boolean): Frustum {\n        const clipSpaceCorners = [\n            [-1, 1, -1, 1],\n            [ 1, 1, -1, 1],\n            [ 1, -1, -1, 1],\n            [-1, -1, -1, 1],\n            [-1, 1, 1, 1],\n            [ 1, 1, 1, 1],\n            [ 1, -1, 1, 1],\n            [-1, -1, 1, 1]\n        ];\n\n        const scale = Math.pow(2, zoom);\n\n        // Transform frustum corner points from clip space to tile space\n        const frustumCoords = clipSpaceCorners\n            .map(v => {\n                const s = vec4.transformMat4([], v, invProj);\n                const k = 1.0 / s[3] / worldSize * scale;\n                // Z scale in meters.\n                return vec4.mul(s, s, [k, k, zInMeters ? 1.0 / s[3] : k, k]);\n            });\n\n        const frustumPlanePointIndices = [\n            [NEAR_TL, NEAR_TR, NEAR_BR], // near\n            [FAR_BR, FAR_TR, FAR_TL],    // far\n            [NEAR_TL, NEAR_BL, FAR_BL],  // left\n            [NEAR_BR, NEAR_TR, FAR_TR],  // right\n            [NEAR_BL, NEAR_BR, FAR_BR],  // bottom\n            [NEAR_TL, FAR_TL, FAR_TR]    // top\n        ];\n\n        const frustumPlanes = frustumPlanePointIndices.map((p: Vec3) => {\n            const a = vec3.sub([], frustumCoords[p[0]], frustumCoords[p[1]]);\n            const b = vec3.sub([], frustumCoords[p[2]], frustumCoords[p[1]]);\n            const n = vec3.normalize([], vec3.cross([], a, b));\n            const d = -vec3.dot(n, frustumCoords[p[1]]);\n            return n.concat(d);\n        });\n        const frustumPoints = [];\n        for (let i = 0; i < frustumCoords.length; i++) {\n            frustumPoints.push([frustumCoords[i][0], frustumCoords[i][1], frustumCoords[i][2]]);\n        }\n        return new Frustum((frustumPoints: any), (frustumPlanes: any));\n    }\n\n    // Performs precise intersection test between the frustum and the provided convex hull.\n    // The hull consits of vertices, faces (defined as planes) and a list of edges.\n    // Intersection test is performed using separating axis theoreom.\n    intersectsPrecise(vertices: Array<Vec3>, faces: Array<Vec4>, edges: Array<Vec3>): number {\n        // Check if any of the provided faces defines a separating axis\n        for (let i = 0; i < faces.length; i++) {\n            if (!pointsInsideOfPlane(vertices, faces[i])) {\n                return 0;\n            }\n        }\n        // Check if any of the frustum planes defines a separating axis\n        for (let i = 0; i < this.planes.length; i++) {\n            if (!pointsInsideOfPlane(vertices, this.planes[i])) {\n                return 0;\n            }\n        }\n\n        for (const edge of edges) {\n            for (const frustumEdge of this.frustumEdges) {\n                const axis = vec3.cross([], edge, frustumEdge);\n                const len  = vec3.length(axis);\n                if (len === 0) {\n                    continue;\n                }\n\n                vec3.scale(axis, axis, 1 / len);\n                const projA = projectPoints((this.points: any), this.points[0], axis);\n                const projB = projectPoints((vertices: any), this.points[0], axis);\n\n                if (projA[0] > projB[1] || projB[0] > projA[1]) {\n                    return 0;\n                }\n            }\n        }\n        return 1;\n    }\n\n}\n\nclass Aabb {\n    min: Vec3;\n    max: Vec3;\n    center: Vec3;\n\n    static fromPoints(points: Array<Vec3>): Aabb {\n        const min = [Infinity, Infinity, Infinity];\n        const max = [-Infinity, -Infinity, -Infinity];\n\n        for (const p of points) {\n            vec3.min(min, min, p);\n            vec3.max(max, max, p);\n        }\n\n        return new Aabb(min, max);\n    }\n\n    static fromTileIdAndHeight(id: UnwrappedTileID, minHeight: number, maxHeight: number): Aabb {\n        const tiles = 1 << id.canonical.z;\n        const x = id.canonical.x;\n        const y = id.canonical.y;\n\n        return new Aabb([x / tiles, y / tiles, minHeight], [(x + 1) / tiles, (y + 1) / tiles, maxHeight]);\n    }\n\n    static applyTransform(aabb: Aabb, transform: Mat4): Aabb {\n        const corners = aabb.getCorners();\n\n        for (let i = 0; i < corners.length; ++i) {\n            vec3.transformMat4(corners[i], corners[i], transform);\n        }\n        return Aabb.fromPoints(corners);\n    }\n\n    static projectAabbCorners(aabb: Aabb, transform: Mat4): Array<Vec3> {\n        const corners = aabb.getCorners();\n\n        for (let i = 0; i < corners.length; ++i) {\n            vec3.transformMat4(corners[i], corners[i], transform);\n        }\n        return corners;\n    }\n\n    constructor(min_: Vec3, max_: Vec3) {\n        this.min = min_;\n        this.max = max_;\n        this.center = vec3.scale([], vec3.add([], this.min, this.max), 0.5);\n    }\n\n    quadrant(index: number): Aabb {\n        const split = [(index % 2) === 0, index < 2];\n        const qMin = vec3.clone(this.min);\n        const qMax = vec3.clone(this.max);\n        for (let axis = 0; axis < split.length; axis++) {\n            qMin[axis] = split[axis] ? this.min[axis] : this.center[axis];\n            qMax[axis] = split[axis] ? this.center[axis] : this.max[axis];\n        }\n        // Temporarily, elevation is constant, hence quadrant.max.z = this.max.z\n        qMax[2] = this.max[2];\n        return new Aabb(qMin, qMax);\n    }\n\n    distanceX(point: Array<number>): number {\n        const pointOnAabb = Math.max(Math.min(this.max[0], point[0]), this.min[0]);\n        return pointOnAabb - point[0];\n    }\n\n    distanceY(point: Array<number>): number {\n        const pointOnAabb = Math.max(Math.min(this.max[1], point[1]), this.min[1]);\n        return pointOnAabb - point[1];\n    }\n\n    distanceZ(point: Array<number>): number {\n        const pointOnAabb = Math.max(Math.min(this.max[2], point[2]), this.min[2]);\n        return pointOnAabb - point[2];\n    }\n\n    getCorners(): Array<Vec3> {\n        const mn = this.min;\n        const mx = this.max;\n        return [\n            [mn[0], mn[1], mn[2]],\n            [mx[0], mn[1], mn[2]],\n            [mx[0], mx[1], mn[2]],\n            [mn[0], mx[1], mn[2]],\n            [mn[0], mn[1], mx[2]],\n            [mx[0], mn[1], mx[2]],\n            [mx[0], mx[1], mx[2]],\n            [mn[0], mx[1], mx[2]],\n        ];\n    }\n\n    // Performs conservative intersection test using separating axis theorem.\n    // Some accuracy is traded for better performance. False positive rate is < 1%.\n    // Flat intersection test checks only x and y dimensions of the aabb.\n    // Returns 0 if there's no intersection, 1 if shapes are intersecting and\n    // 2 if the aabb if fully inside the frustum.\n    intersects(frustum: Frustum): number {\n        // Execute separating axis test between two convex objects to find intersections\n        // Each frustum plane together with 3 major axes define the separating axes\n        // This implementation is conservative as it's not checking all possible axes.\n        // False positive rate is ~0.5% of all cases (see intersectsPrecise).\n        if (!this.intersectsAabb(frustum.bounds)) {\n            return 0;\n        }\n\n        return intersectsFrustum(frustum, this.getCorners());\n    }\n\n    intersectsFlat(frustum: Frustum): number {\n        if (!this.intersectsAabb(frustum.bounds)) {\n            return 0;\n        }\n\n        // Perform intersection test against flattened (z === 0) aabb\n        const aabbPoints = [\n            [this.min[0], this.min[1], 0.0],\n            [this.max[0], this.min[1], 0.0],\n            [this.max[0], this.max[1], 0.0],\n            [this.min[0], this.max[1], 0.0]\n        ];\n\n        return intersectsFrustum(frustum, aabbPoints);\n    }\n\n    // Performs precise intersection test using separating axis theorem.\n    // It is possible run only edge cases that were not covered in intersects().\n    // Flat intersection test checks only x and y dimensions of the aabb.\n    intersectsPrecise(frustum: Frustum, edgeCasesOnly: ?boolean): number {\n        if (!edgeCasesOnly) {\n            const intersects = this.intersects(frustum);\n\n            if (!intersects) {\n                return 0;\n            }\n        }\n\n        return intersectsFrustumPrecise(frustum, this.getCorners());\n    }\n\n    intersectsPreciseFlat(frustum: Frustum, edgeCasesOnly: ?boolean): number {\n        if (!edgeCasesOnly) {\n            const intersects = this.intersectsFlat(frustum);\n\n            if (!intersects) {\n                return 0;\n            }\n        }\n\n        // Perform intersection test against flattened (z === 0) aabb\n        const aabbPoints = [\n            [this.min[0], this.min[1], 0.0],\n            [this.max[0], this.min[1], 0.0],\n            [this.max[0], this.max[1], 0.0],\n            [this.min[0], this.max[1], 0.0]\n        ];\n\n        return intersectsFrustumPrecise(frustum, aabbPoints);\n    }\n\n    intersectsAabb(aabb: Aabb): boolean {\n        for (let axis = 0; axis < 3; ++axis) {\n            if (this.min[axis] > aabb.max[axis] || aabb.min[axis] > this.max[axis]) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    intersectsAabbXY(aabb: Aabb): boolean {\n        if (this.min[0] > aabb.max[0] || aabb.min[0] > this.max[0]) {\n            return false;\n        }\n        if (this.min[1] > aabb.max[1] || aabb.min[1] > this.max[1]) {\n            return false;\n        }\n        return true;\n    }\n\n    encapsulate(aabb: Aabb) {\n        for (let i = 0; i < 3; i++) {\n            this.min[i] = Math.min(this.min[i], aabb.min[i]);\n            this.max[i] = Math.max(this.max[i], aabb.max[i]);\n        }\n    }\n\n    encapsulatePoint(point: Vec3) {\n        for (let i = 0; i < 3; i++) {\n            this.min[i] = Math.min(this.min[i], point[i]);\n            this.max[i] = Math.max(this.max[i], point[i]);\n        }\n    }\n\n    closestPoint(point: Vec3): Vec3 {\n        return [Math.max(Math.min(this.max[0], point[0]), this.min[0]),\n            Math.max(Math.min(this.max[1], point[1]), this.min[1]),\n            Math.max(Math.min(this.max[2], point[2]), this.min[2])];\n    }\n}\n\nregister(Aabb, 'Aabb');\n\nexport {\n    Aabb,\n    Frustum,\n    FrustumCorners,\n    Ray\n};\n","// @flow\nimport {createLayout} from '../util/struct_array.js';\n\nimport type {StructArrayLayout} from '../util/struct_array.js';\n\nconst layout: StructArrayLayout = createLayout([\n    {type: 'Float32', name: 'a_globe_pos', components: 3},\n    {type: 'Float32', name: 'a_uv', components: 2}\n]);\n\nexport default layout;\nexport const {members, size, alignment} = layout;\n","// @flow\nimport {createLayout} from '../util/struct_array.js';\n\nimport type {StructArrayLayout} from '../util/struct_array.js';\n\nexport const posAttributesGlobeExt: StructArrayLayout = createLayout([\n    {name: 'a_pos_3', components: 3, type: 'Int16'},\n]);\n\nexport default (createLayout([\n    {name: 'a_pos', type: 'Int16', components: 2}\n]): StructArrayLayout);\n","// @flow\nimport MercatorCoordinate, {\n    lngFromMercatorX,\n    latFromMercatorY,\n    mercatorZfromAltitude,\n    mercatorXfromLng,\n    mercatorYfromLat,\n    MAX_MERCATOR_LATITUDE\n} from '../mercator_coordinate.js';\nimport EXTENT from '../../style-spec/data/extent.js';\nimport {number as interpolate} from '../../style-spec/util/interpolate.js';\nimport {degToRad, radToDeg, clamp, smoothstep, getColumn, shortestAngle} from '../../util/util.js';\nimport {vec3, vec4, mat3, mat4} from 'gl-matrix';\nimport SegmentVector from '../../data/segment.js';\nimport {members as globeLayoutAttributes} from '../../terrain/globe_attributes.js';\nimport posAttributes from '../../data/pos_attributes.js';\nimport {TriangleIndexArray, GlobeVertexArray, PosArray} from '../../data/array_types.js';\nimport {Aabb, Ray} from '../../util/primitives.js';\nimport LngLat, {earthRadius, csLatLngToECEF, latLngToECEF, LngLatBounds} from '../lng_lat.js';\nimport {\n    GLOBE_RADIUS,\n    GLOBE_MIN,\n    GLOBE_MAX,\n    TILE_SIZE,\n    GLOBE_NORMALIZATION_MASK,\n    GLOBE_ZOOM_THRESHOLD_MIN,\n    GLOBE_ZOOM_THRESHOLD_MAX,\n    GLOBE_VERTEX_GRID_SIZE,\n    GLOBE_LATITUDINAL_GRID_LOD_TABLE\n} from './globe_constants.js';\nimport Point from '@mapbox/point-geometry';\n\nimport type Painter from '../../render/painter.js';\nimport type {CanonicalTileID, UnwrappedTileID} from '../../source/tile_id.js';\nimport type Context from '../../gl/context.js';\nimport type {Vec3, Mat4} from 'gl-matrix';\nimport type IndexBuffer from '../../gl/index_buffer.js';\nimport type VertexBuffer from '../../gl/vertex_buffer.js';\nimport type Transform from '../transform.js';\n\nexport function globeMetersToEcef(d: number): number {\n    return d * GLOBE_RADIUS / earthRadius;\n}\n\nconst GLOBE_LOW_ZOOM_TILE_AABBS = [\n    // z == 0\n    new Aabb([GLOBE_MIN, GLOBE_MIN, GLOBE_MIN], [GLOBE_MAX, GLOBE_MAX, GLOBE_MAX]),\n    // z == 1\n    new Aabb([GLOBE_MIN, GLOBE_MIN, GLOBE_MIN], [0, 0, GLOBE_MAX]), // x=0, y=0\n    new Aabb([0, GLOBE_MIN, GLOBE_MIN], [GLOBE_MAX, 0, GLOBE_MAX]), // x=1, y=0\n    new Aabb([GLOBE_MIN, 0, GLOBE_MIN], [0, GLOBE_MAX, GLOBE_MAX]), // x=0, y=1\n    new Aabb([0, 0, GLOBE_MIN], [GLOBE_MAX, GLOBE_MAX, GLOBE_MAX])  // x=1, y=1\n];\n\nexport function globePointCoordinate(tr: Transform, x: number, y: number, clampToHorizon: boolean = true): ?MercatorCoordinate {\n    const point0 = vec3.scale([], tr._camera.position, tr.worldSize);\n    const point1 = [x, y, 1, 1];\n\n    vec4.transformMat4(point1, point1, tr.pixelMatrixInverse);\n    vec4.scale(point1, point1, 1 / point1[3]);\n\n    const p0p1 = vec3.sub([], point1, point0);\n    const dir = vec3.normalize([], p0p1);\n\n    // Find closest point on the sphere to the ray. This is a bit more involving operation\n    // if the ray is not intersecting with the sphere, in which case we \"clamp\" the ray\n    // to the surface of the sphere, i.e. find a tangent vector that originates from the camera position\n    const m = tr.globeMatrix;\n    const globeCenter = [m[12], m[13], m[14]];\n    const p0toCenter = vec3.sub([], globeCenter, point0);\n    const p0toCenterDist = vec3.length(p0toCenter);\n    const centerDir = vec3.normalize([], p0toCenter);\n    const radius = tr.worldSize / (2.0 * Math.PI);\n    const cosAngle = vec3.dot(centerDir, dir);\n\n    const origoTangentAngle = Math.asin(radius / p0toCenterDist);\n    const origoDirAngle = Math.acos(cosAngle);\n\n    if (origoTangentAngle < origoDirAngle) {\n        if (!clampToHorizon) return null;\n\n        // Find the tangent vector by interpolating between camera-to-globe and camera-to-click vectors.\n        // First we'll find a point P1 on the clicked ray that forms a right-angled triangle with the camera position\n        // and the center of the globe. Angle of the tanget vector is then used as the interpolation factor\n        const clampedP1 = [], origoToP1 = [];\n\n        vec3.scale(clampedP1, dir, p0toCenterDist / cosAngle);\n        vec3.normalize(origoToP1, vec3.sub(origoToP1, clampedP1, p0toCenter));\n        vec3.normalize(dir, vec3.add(dir, p0toCenter, vec3.scale(dir, origoToP1, Math.tan(origoTangentAngle) * p0toCenterDist)));\n    }\n\n    const pointOnGlobe = [];\n    const ray = new Ray(point0, dir);\n\n    ray.closestPointOnSphere(globeCenter, radius, pointOnGlobe);\n\n    // Transform coordinate axes to find lat & lng of the position\n    const xa = vec3.normalize([], getColumn(m, 0));\n    const ya = vec3.normalize([], getColumn(m, 1));\n    const za = vec3.normalize([], getColumn(m, 2));\n\n    const xp = vec3.dot(xa, pointOnGlobe);\n    const yp = vec3.dot(ya, pointOnGlobe);\n    const zp = vec3.dot(za, pointOnGlobe);\n\n    const lat = radToDeg(Math.asin(-yp / radius));\n    let lng = radToDeg(Math.atan2(xp, zp));\n\n    // Check that the returned longitude angle is not wrapped\n    lng = tr.center.lng + shortestAngle(tr.center.lng, lng);\n\n    const mx = mercatorXfromLng(lng);\n    const my = clamp(mercatorYfromLat(lat), 0, 1);\n\n    return new MercatorCoordinate(mx, my);\n}\n\nexport class Arc {\n    constructor(p0: Vec3, p1: Vec3, center: Vec3) {\n        this.a = vec3.sub([], p0, center);\n        this.b = vec3.sub([], p1, center);\n        this.center = center;\n        const an = vec3.normalize([], this.a);\n        const bn = vec3.normalize([], this.b);\n        this.angle = Math.acos(vec3.dot(an, bn));\n    }\n\n    a: Vec3;\n    b: Vec3;\n    center: Vec3;\n    angle: number;\n}\n\nexport function slerp(a: number, b: number, angle: number, t: number): number {\n    const sina = Math.sin(angle);\n    return a * (Math.sin((1.0 - t) * angle) / sina) + b * (Math.sin(t * angle) / sina);\n}\n\n// Computes local extremum point of an arc on one of the dimensions (x, y or z),\n// i.e. value of a point where d/dt*f(x,y,t) == 0\nexport function localExtremum(arc: Arc, dim: number): ?number {\n    // d/dt*slerp(x,y,t) = 0\n    // => t = (1/a)*atan(y/(x*sin(a))-1/tan(a)), x > 0\n    // => t = (1/a)*(pi/2), x == 0\n    if (arc.angle === 0) {\n        return null;\n    }\n\n    let t: number;\n    if (arc.a[dim] === 0) {\n        t = (1.0 / arc.angle) * 0.5 * Math.PI;\n    } else {\n        t = 1.0 / arc.angle * Math.atan(arc.b[dim] / arc.a[dim] / Math.sin(arc.angle) - 1.0 / Math.tan(arc.angle));\n    }\n\n    if (t < 0 || t > 1) {\n        return null;\n    }\n\n    return slerp(arc.a[dim], arc.b[dim], arc.angle, clamp(t, 0.0, 1.0)) + arc.center[dim];\n}\n\nexport function globeTileBounds(id: CanonicalTileID): Aabb {\n    if (id.z <= 1) {\n        return GLOBE_LOW_ZOOM_TILE_AABBS[id.z + id.y * 2 + id.x];\n    }\n\n    // After zoom 1 surface function is monotonic for all tile patches\n    // => it is enough to project corner points\n    const bounds = tileCornersToBounds(id);\n    const corners = boundsToECEF(bounds);\n\n    return Aabb.fromPoints(corners);\n}\n\nexport function interpolateVec3(from: Vec3, to: Vec3, phase: number): Vec3 {\n    vec3.scale(from, from, 1 - phase);\n    return vec3.scaleAndAdd(from, from, to, phase);\n}\n\n// Similar to globeTileBounds() but accounts for globe to Mercator transition.\nexport function transitionTileAABBinECEF(id: CanonicalTileID, tr: Transform): Aabb {\n    const phase = globeToMercatorTransition(tr.zoom);\n    if (phase === 0) {\n        return globeTileBounds(id);\n    }\n\n    const bounds = tileCornersToBounds(id);\n    const corners = boundsToECEF(bounds);\n\n    const w = mercatorXfromLng(bounds.getWest()) * tr.worldSize;\n    const e = mercatorXfromLng(bounds.getEast()) * tr.worldSize;\n    const n = mercatorYfromLat(bounds.getNorth()) * tr.worldSize;\n    const s = mercatorYfromLat(bounds.getSouth()) * tr.worldSize;\n    // Mercator bounds globeCorners in world/pixel space\n    const nw = [w, n, 0];\n    const ne = [e, n, 0];\n    const sw = [w, s, 0];\n    const se = [e, s, 0];\n    // Transform Mercator globeCorners to ECEF\n    const worldToECEFMatrix = mat4.invert([], tr.globeMatrix);\n    vec3.transformMat4(nw, nw, worldToECEFMatrix);\n    vec3.transformMat4(ne, ne, worldToECEFMatrix);\n    vec3.transformMat4(sw, sw, worldToECEFMatrix);\n    vec3.transformMat4(se, se, worldToECEFMatrix);\n    // Interpolate Mercator corners and globe corners\n    corners[0] = interpolateVec3(corners[0], sw, phase);\n    corners[1] = interpolateVec3(corners[1], se, phase);\n    corners[2] = interpolateVec3(corners[2], ne, phase);\n    corners[3] = interpolateVec3(corners[3], nw, phase);\n\n    return Aabb.fromPoints(corners);\n}\n\nfunction transformPoints(corners: Array<Vec3>, globeMatrix: Mat4, scale: number) {\n    for (const corner of corners) {\n        vec3.transformMat4(corner, corner, globeMatrix);\n        vec3.scale(corner, corner, scale);\n    }\n}\n\n// Returns AABB in world/camera space scaled by numTiles / tr.worldSize\n// extendToPoles - extend tiles neighboring to north / south pole segments with the north/south pole point\nexport function aabbForTileOnGlobe(tr: Transform, numTiles: number, tileId: CanonicalTileID, extendToPoles: boolean): Aabb {\n    const scale = numTiles / tr.worldSize;\n    const m = tr.globeMatrix;\n\n    if (tileId.z <= 1) {\n        // Compute world/pixel space AABB that fully encapsulates\n        // transformed corners of the ECEF AABB\n        const corners = globeTileBounds(tileId).getCorners();\n        transformPoints(corners, m, scale);\n        return Aabb.fromPoints(corners);\n    }\n\n    // Find minimal aabb for a tile. Correct solution would be to compute bounding box that\n    // fully encapsulates the curved patch that represents the tile on globes surface.\n    // This can be simplified a bit as the globe transformation is constrained:\n    //  1. Camera always faces the center point on the map\n    //  2. Camera is always above (z-coordinate) all of the tiles\n    //  3. Up direction of the coordinate space (pixel space) is always +z. This means that\n    //     the \"highest\" point of the map is at the center.\n    //  4. z-coordinate of any point in any tile descends as a function of the distance from the center\n\n    // Simplified aabb is computed by first encapsulating 4 transformed corner points of the tile.\n    // The resulting aabb is not complete yet as curved edges of the tile might span outside of the boundaries.\n    // It is enough to extend the aabb to contain only the edge that's closest to the center point.\n    const bounds = tileCornersToBounds(tileId, extendToPoles);\n\n    const corners = boundsToECEF(bounds, GLOBE_RADIUS + globeMetersToEcef(tr._tileCoverLift));\n\n    // Transform the corners to world space\n    transformPoints(corners, m, scale);\n\n    const mx = Number.MAX_VALUE;\n    const cornerMax = [-mx, -mx, -mx];\n    const cornerMin = [mx, mx, mx];\n\n    // Extend the aabb by including the center point. There are some corner cases where center point is inside the\n    // tile but due to curvature aabb computed from corner points does not cover the curved area.\n    if (bounds.contains(tr.center)) {\n\n        for (const corner of corners) {\n            vec3.min(cornerMin, cornerMin, corner);\n            vec3.max(cornerMax, cornerMax, corner);\n        }\n        cornerMax[2] = 0.0;\n        const point = tr.point;\n        const center = [point.x * scale, point.y * scale, 0];\n        vec3.min(cornerMin, cornerMin, center);\n        vec3.max(cornerMax, cornerMax, center);\n\n        return new Aabb(cornerMin, cornerMax);\n    }\n\n    if (tr._tileCoverLift > 0.0) {\n        // Early return for elevated globe tiles, where the tile cover optimization is ignored\n        for (const corner of corners) {\n            vec3.min(cornerMin, cornerMin, corner);\n            vec3.max(cornerMax, cornerMax, corner);\n        }\n        return new Aabb(cornerMin, cornerMax);\n    }\n\n    // Compute arcs describing edges of the tile on the globe surface.\n    // Vertical edges revolves around the globe origin whereas horizontal edges revolves around the y-axis.\n    const arcCenter = [m[12] * scale, m[13] * scale, m[14] * scale];\n\n    const tileCenter = bounds.getCenter();\n    const centerLat = clamp(tr.center.lat, -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE);\n    const tileCenterLat = clamp(tileCenter.lat, -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE);\n    const camX = mercatorXfromLng(tr.center.lng);\n    const camY = mercatorYfromLat(centerLat);\n\n    let dx = camX - mercatorXfromLng(tileCenter.lng);\n    const dy = camY - mercatorYfromLat(tileCenterLat);\n\n    // Shortest distance might be across the antimeridian\n    if (dx > .5) {\n        dx -= 1;\n    } else if (dx < -.5) {\n        dx += 1;\n    }\n\n    // Here we determine the arc which is closest to the map center point.\n    // Horizontal arcs origin = globe center\n    // Vertical arcs origin = globe center + yAxis * shift.\n    // Where `shift` is determined by latitude.\n    let closestArcIdx = 0;\n    if (Math.abs(dx) > Math.abs(dy)) {\n        closestArcIdx = dx >= 0 ? 1 : 3;\n    } else {\n        closestArcIdx = dy >= 0 ? 0 : 2;\n        const yAxis = [m[4] * scale, m[5] * scale, m[6] * scale];\n        const shift = -Math.sin(degToRad(dy >= 0 ? bounds.getSouth() : bounds.getNorth())) * GLOBE_RADIUS;\n        vec3.scaleAndAdd(arcCenter, arcCenter, yAxis, shift);\n    }\n\n    const arcStart = corners[closestArcIdx];\n    const arcEnd = corners[(closestArcIdx + 1) % 4];\n\n    const closestArc = new Arc(arcStart, arcEnd, arcCenter);\n    const arcExtremum = [\n        (localExtremum(closestArc, 0) || arcStart[0]),\n        (localExtremum(closestArc, 1) || arcStart[1]),\n        (localExtremum(closestArc, 2) || arcStart[2])];\n\n    const phase = globeToMercatorTransition(tr.zoom);\n    if (phase > 0.0) {\n        const mercatorCorners = mercatorTileCornersInCameraSpace(tileId, numTiles, tr._pixelsPerMercatorPixel, camX, camY);\n        // Interpolate the four corners towards their world space location in mercator projection during transition.\n        for (let i = 0; i < corners.length; i++) {\n            interpolateVec3(corners[i], mercatorCorners[i], phase);\n        }\n        // Calculate the midpoint of the closest edge midpoint in Mercator\n        const mercatorMidpoint = vec3.add([], mercatorCorners[closestArcIdx], mercatorCorners[(closestArcIdx + 1) % 4]);\n        vec3.scale(mercatorMidpoint, mercatorMidpoint, .5);\n        // Interpolate globe extremum toward Mercator midpoint\n        interpolateVec3(arcExtremum, mercatorMidpoint, phase);\n    }\n\n    for (const corner of corners) {\n        vec3.min(cornerMin, cornerMin, corner);\n        vec3.max(cornerMax, cornerMax, corner);\n    }\n\n    // Reduce height of the aabb to match height of the closest arc. This reduces false positives\n    // of tiles farther away from the center as they would otherwise intersect with far end\n    // of the view frustum\n    cornerMin[2] = Math.min(arcStart[2], arcEnd[2]);\n\n    vec3.min(cornerMin, cornerMin, arcExtremum);\n    vec3.max(cornerMax, cornerMax, arcExtremum);\n\n    return new Aabb(cornerMin, cornerMax);\n}\n\nexport function tileCornersToBounds({x, y, z}: CanonicalTileID, extendToPoles: boolean = false): LngLatBounds {\n    const s = 1.0 / (1 << z);\n    const sw = new LngLat(lngFromMercatorX(x * s), y === (1 << z) - 1 && extendToPoles ? -90 : latFromMercatorY((y + 1) * s));\n    const ne = new LngLat(lngFromMercatorX((x + 1) * s), y === 0 && extendToPoles ? 90 : latFromMercatorY(y * s));\n    return new LngLatBounds(sw, ne);\n}\n\nfunction mercatorTileCornersInCameraSpace({x, y, z}: CanonicalTileID, numTiles: number, mercatorScale: number, camX: number, camY: number): Array<Vec3> {\n\n    const tileScale = 1.0 / (1 << z);\n    // Values in Mercator coordinates (0 - 1)\n    let w = x * tileScale;\n    let e = w + tileScale;\n    let n = y * tileScale;\n    let s = n + tileScale;\n\n    // // Ensure that the tile viewed is the nearest when across the antimeridian\n    let wrap = 0;\n    const tileCenterXFromCamera = (w + e) / 2 - camX;\n    if (tileCenterXFromCamera > .5) {\n        wrap = -1;\n    } else if (tileCenterXFromCamera < -.5) {\n        wrap = 1;\n    }\n\n    camX *= numTiles;\n    camY *= numTiles;\n\n    //  Transform Mercator coordinates to points on the plane tangent to the globe at cameraCenter.\n    w = ((w + wrap) * numTiles - camX) * mercatorScale + camX;\n    e = ((e + wrap) * numTiles - camX) * mercatorScale + camX;\n    n = (n * numTiles - camY) * mercatorScale + camY;\n    s = (s * numTiles - camY) * mercatorScale + camY;\n\n    return [[w, s, 0],\n        [e, s, 0],\n        [e, n, 0],\n        [w, n, 0]];\n}\n\nfunction boundsToECEF(bounds: LngLatBounds, radius: number = GLOBE_RADIUS): Array<Vec3> {\n    const ny = degToRad(bounds.getNorth());\n    const sy = degToRad(bounds.getSouth());\n    const cosN = Math.cos(ny);\n    const cosS = Math.cos(sy);\n    const sinN = Math.sin(ny);\n    const sinS = Math.sin(sy);\n    const w = bounds.getWest();\n    const e = bounds.getEast();\n    return [\n        csLatLngToECEF(cosS, sinS, w, radius),\n        csLatLngToECEF(cosS, sinS, e, radius),\n        csLatLngToECEF(cosN, sinN, e, radius),\n        csLatLngToECEF(cosN, sinN, w, radius)\n    ];\n}\n\nexport function tileCoordToECEF(x: number, y: number, id: CanonicalTileID, radius?: number): Vec3 {\n    const tileCount = 1 << id.z;\n    const mercatorX = (x / EXTENT + id.x) / tileCount;\n    const mercatorY = (y / EXTENT + id.y) / tileCount;\n    const lat = latFromMercatorY(mercatorY);\n    const lng = lngFromMercatorX(mercatorX);\n    const pos = latLngToECEF(lat, lng, radius);\n    return pos;\n}\n\nexport function globeECEFOrigin(tileMatrix: Mat4, id: UnwrappedTileID): [number, number, number] {\n    const origin = [0, 0, 0];\n    const bounds = globeTileBounds(id.canonical);\n    const normalizationMatrix = globeNormalizeECEF(bounds);\n    vec3.transformMat4(origin, origin, normalizationMatrix);\n    vec3.transformMat4(origin, origin, tileMatrix);\n    return origin;\n}\n\nexport function globeECEFNormalizationScale({min, max}: Aabb): number {\n    return GLOBE_NORMALIZATION_MASK / Math.max(max[0] - min[0], max[1] - min[1], max[2] - min[2]);\n}\n\n// avoid redundant allocations by sharing the same typed array for normalization/denormalization matrices;\n// we never use multiple instances of these at the same time, but this might change, so let's be careful here!\nconst tempMatrix = new Float64Array(16);\n\nexport function globeNormalizeECEF(bounds: Aabb): Float64Array {\n    const scale = globeECEFNormalizationScale(bounds);\n    const m = mat4.fromScaling(tempMatrix, [scale, scale, scale]);\n    return mat4.translate(m, m, vec3.negate([], bounds.min));\n}\n\nexport function globeDenormalizeECEF(bounds: Aabb): Float64Array {\n    const m = mat4.fromTranslation(tempMatrix, bounds.min);\n    const scale = 1.0 / globeECEFNormalizationScale(bounds);\n    return mat4.scale(m, m, [scale, scale, scale]);\n}\n\nexport function globeECEFUnitsToPixelScale(worldSize: number): number {\n    const localRadius = EXTENT / (2.0 * Math.PI);\n    const wsRadius = worldSize / (2.0 * Math.PI);\n    return wsRadius / localRadius;\n}\n\nexport function globePixelsToTileUnits(zoom: number, id: CanonicalTileID): number {\n    const ecefPerPixel = EXTENT / (TILE_SIZE * Math.pow(2, zoom));\n    const normCoeff = globeECEFNormalizationScale(globeTileBounds(id));\n\n    return ecefPerPixel * normCoeff;\n}\n\nfunction calculateGlobePosMatrix(x: number, y: number, worldSize: number, lng: number, lat: number): Float64Array {\n    // transform the globe from reference coordinate space to world space\n    const scale = globeECEFUnitsToPixelScale(worldSize);\n    const offset = [x, y, -worldSize / (2.0 * Math.PI)];\n    const m = mat4.identity(new Float64Array(16));\n    mat4.translate(m, m, offset);\n    mat4.scale(m, m, [scale, scale, scale]);\n    mat4.rotateX(m, m, degToRad(-lat));\n    mat4.rotateY(m, m, degToRad(-lng));\n    return m;\n}\n\nexport function calculateGlobeMatrix(tr: Transform): Float64Array {\n    const {x, y} = tr.point;\n    const {lng, lat} = tr._center;\n    return calculateGlobePosMatrix(x, y, tr.worldSize, lng, lat);\n}\n\nexport function calculateGlobeLabelMatrix(tr: Transform, id: CanonicalTileID): Float64Array {\n    const {x, y} = tr.point;\n\n    // Map aligned label space for globe view is the non-rotated globe itself in pixel coordinates.\n\n    // Camera is moved closer towards the ground near poles as part of\n    // compesanting the reprojection. This has to be compensated for the\n    // map aligned label space. Whithout this logic map aligned symbols\n    // would appear larger than intended.\n    const m = calculateGlobePosMatrix(x, y, tr.worldSize / tr._pixelsPerMercatorPixel, 0, 0);\n    return mat4.multiply(m, m, globeDenormalizeECEF(globeTileBounds(id)));\n}\n\nexport function calculateGlobeMercatorMatrix(tr: Transform): Float32Array {\n    const zScale = tr.pixelsPerMeter;\n    const ws = zScale / mercatorZfromAltitude(1, tr.center.lat);\n\n    const posMatrix = mat4.identity(new Float64Array(16));\n    mat4.translate(posMatrix, posMatrix, [tr.point.x, tr.point.y, 0.0]);\n    mat4.scale(posMatrix, posMatrix, [ws, ws, zScale]);\n\n    return Float32Array.from(posMatrix);\n}\n\nexport function globeToMercatorTransition(zoom: number): number {\n    return smoothstep(GLOBE_ZOOM_THRESHOLD_MIN, GLOBE_ZOOM_THRESHOLD_MAX, zoom);\n}\n\nexport function globeMatrixForTile(id: CanonicalTileID, globeMatrix: Float64Array): Float32Array {\n    const decode = globeDenormalizeECEF(globeTileBounds(id));\n    return mat4.mul(mat4.create(), globeMatrix, decode);\n}\n\nexport function globePoleMatrixForTile(z: number, x: number, tr: Transform): Float32Array {\n    const poleMatrix = mat4.identity(new Float64Array(16));\n\n    // Rotate the pole triangle fan to the correct location\n    const numTiles = 1 << z;\n    const xOffsetAngle = (x / numTiles - 0.5) * Math.PI * 2.0;\n    mat4.rotateY(poleMatrix, tr.globeMatrix, xOffsetAngle);\n\n    return Float32Array.from(poleMatrix);\n}\n\nexport function globeUseCustomAntiAliasing(painter: Painter, context: Context, transform: Transform): boolean {\n    const transitionT = globeToMercatorTransition(transform.zoom);\n    const useContextAA = painter.style.map._antialias;\n    const disabled = context.options.extStandardDerivativesForceOff || (painter.terrain && painter.terrain.exaggeration() > 0.0);\n    return transitionT === 0.0 && !useContextAA && !disabled;\n}\n\nexport function getGridMatrix(id: CanonicalTileID, bounds: LngLatBounds, latitudinalLod: number, worldSize: number): Mat4 {\n    const n = bounds.getNorth();\n    const s = bounds.getSouth();\n    const w = bounds.getWest();\n    const e = bounds.getEast();\n\n    // Construct transformation matrix for converting tile coordinates into LatLngs\n    const tiles = 1 << id.z;\n    const tileWidth = e - w;\n    const tileHeight = n - s;\n    const tileToLng = tileWidth / GLOBE_VERTEX_GRID_SIZE;\n    const tileToLat = -tileHeight / GLOBE_LATITUDINAL_GRID_LOD_TABLE[latitudinalLod];\n\n    const matrix = [0, tileToLng, 0, tileToLat, 0, 0, n, w, 0];\n\n    if (id.z > 0) {\n        // Add slight padding to patch seams between tiles.\n        // This is done by extruding vertices by a fixed amount. Pixel padding\n        // is first converted to degrees and then to tile units before being\n        // applied to the final transformation matrix.\n        const pixelPadding = 0.5;\n        const padding = pixelPadding * 360.0 / worldSize;\n\n        const xScale = padding / tileWidth + 1;\n        const yScale = padding / tileHeight + 1;\n        const padMatrix = [xScale, 0, 0, 0, yScale, 0, -0.5 * padding / tileToLng, 0.5 * padding / tileToLat, 1];\n\n        mat3.multiply(matrix, matrix, padMatrix);\n    }\n\n    // Embed additional variables to the last row of the matrix\n    matrix[2] = tiles;\n    matrix[5] = id.x;\n    matrix[8] = id.y;\n\n    return matrix;\n}\n\nexport function getLatitudinalLod(lat: number): number {\n    const UPPER_LATITUDE = MAX_MERCATOR_LATITUDE - 5.0;\n    lat = clamp(lat, -UPPER_LATITUDE, UPPER_LATITUDE) / UPPER_LATITUDE * 90.0;\n    // const t = Math.pow(1.0 - Math.cos(degToRad(lat)), 2);\n    const t = Math.pow(Math.abs(Math.sin(degToRad(lat))), 3);\n    const lod = Math.round(t * (GLOBE_LATITUDINAL_GRID_LOD_TABLE.length - 1));\n    return lod;\n}\n\nexport function globeCenterToScreenPoint(tr: Transform): Point {\n    const pos = [0, 0, 0];\n    const matrix = mat4.identity(new Float64Array(16));\n    mat4.multiply(matrix, tr.pixelMatrix, tr.globeMatrix);\n    vec3.transformMat4(pos, pos, matrix);\n    return new Point(pos[0], pos[1]);\n}\n\nfunction cameraPositionInECEF(tr: Transform): Array<number> {\n    // Here \"center\" is the center of the globe. We refer to transform._center\n    // (the surface of the map on the center of the screen) as \"pivot\" to avoid confusion.\n    const centerToPivot = latLngToECEF(tr._center.lat, tr._center.lng);\n\n    // Set axis to East-West line tangent to sphere at pivot\n    const south = vec3.fromValues(0, 1, 0);\n    let axis = vec3.cross([], south, centerToPivot);\n\n    // Rotate axis around pivot by bearing\n    const rotation = mat4.fromRotation([], -tr.angle, centerToPivot);\n    axis = vec3.transformMat4(axis, axis, rotation);\n\n    // Rotate camera around axis by pitch\n    mat4.fromRotation(rotation, -tr._pitch, axis);\n\n    const pivotToCamera = vec3.normalize([], centerToPivot);\n    vec3.scale(pivotToCamera, pivotToCamera, globeMetersToEcef(tr.cameraToCenterDistance / tr.pixelsPerMeter));\n    vec3.transformMat4(pivotToCamera, pivotToCamera, rotation);\n\n    return vec3.add([], centerToPivot, pivotToCamera);\n}\n\n// Return the angle of the normal vector at a point on the globe relative to the camera.\n// i.e. how much to tilt map-aligned markers.\nexport function globeTiltAtLngLat(tr: Transform, lngLat: LngLat): number {\n    const centerToPoint = latLngToECEF(lngLat.lat, lngLat.lng);\n    const centerToCamera = cameraPositionInECEF(tr);\n    const pointToCamera = vec3.subtract([], centerToCamera, centerToPoint);\n    return vec3.angle(pointToCamera, centerToPoint);\n}\n\nexport function isLngLatBehindGlobe(tr: Transform, lngLat: LngLat): boolean {\n    // We consider 1% past the horizon not occluded, this allows popups to be dragged around the globe edge without fading.\n    return (globeTiltAtLngLat(tr, lngLat) > Math.PI / 2 * 1.01);\n}\n\n/**\n * Check if poles are visible inside the current viewport\n *\n * @param {Transform} transform The current map transform.\n * @returns {[boolean, boolean]} A tuple of booleans [northInViewport, southInViewport]\n */\nexport function polesInViewport(tr: Transform): [boolean, boolean] {\n    // Create matrix from ECEF to screen coordinates\n    const ecefToScreenMatrix = mat4.identity(new Float64Array(16));\n    mat4.multiply(ecefToScreenMatrix, tr.pixelMatrix, tr.globeMatrix);\n\n    const north = [0, GLOBE_MIN, 0];\n    const south = [0, GLOBE_MAX, 0];\n\n    // Translate the poles from ECEF to screen coordinates\n    vec3.transformMat4(north, north, ecefToScreenMatrix);\n    vec3.transformMat4(south, south, ecefToScreenMatrix);\n\n    // Check if the poles are inside the viewport and not behind the globe surface\n    const northInViewport =\n        north[0] > 0 && north[0] <= tr.width &&\n        north[1] > 0 && north[1] <= tr.height &&\n        !isLngLatBehindGlobe(tr, new LngLat(tr.center.lat, 90));\n\n    const southInViewport =\n        south[0] > 0 && south[0] <= tr.width &&\n        south[1] > 0 && south[1] <= tr.height &&\n        !isLngLatBehindGlobe(tr, new LngLat(tr.center.lat, -90));\n\n    return [northInViewport, southInViewport];\n}\n\nconst POLE_RAD = degToRad(85.0);\nconst POLE_COS = Math.cos(POLE_RAD);\nconst POLE_SIN = Math.sin(POLE_RAD);\n\n// Generate terrain grid with embedded skirts\nconst EMBED_SKIRTS = true;\n\ntype GridLodSegments = {\n    withoutSkirts: SegmentVector,\n    withSkirts: SegmentVector\n};\n\ntype GridWithLods = {\n    vertices: PosArray,\n    indices: TriangleIndexArray,\n    segments: Array<GridLodSegments>\n};\n\nexport class GlobeSharedBuffers {\n    _poleNorthVertexBuffer: VertexBuffer;\n    _poleSouthVertexBuffer: VertexBuffer;\n    _texturedPoleNorthVertexBuffer: VertexBuffer;\n    _texturedPoleSouthVertexBuffer: VertexBuffer;\n    _poleIndexBuffer: IndexBuffer;\n    _poleSegments: Array<SegmentVector>;\n\n    _gridBuffer: VertexBuffer;\n    _gridIndexBuffer: IndexBuffer;\n    _gridSegments: Array<GridLodSegments>;\n\n    constructor(context: Context) {\n        this._createGrid(context);\n        this._createPoles(context);\n    }\n\n    destroy() {\n        this._poleIndexBuffer.destroy();\n        this._gridBuffer.destroy();\n        this._gridIndexBuffer.destroy();\n        this._poleNorthVertexBuffer.destroy();\n        this._poleSouthVertexBuffer.destroy();\n        for (const segments of this._poleSegments) segments.destroy();\n        for (const segments of this._gridSegments) {\n            segments.withSkirts.destroy();\n            segments.withoutSkirts.destroy();\n        }\n    }\n\n    // Generate terrain grid vertices and indices for all LOD's\n    //\n    // Grid vertices memory layout:\n    //\n    //          First line Skirt\n    //          ┌───────────────┐\n    //          │┌─────────────┐│\n    // Left     ││┼┼┼┼┼┼┼┼┼┼┼┼┼││ Right\n    // Border   ││┼┼┼┼┼┼┼┼┼┼┼┼┼││ Border\n    // Skirt    │├─────────────┤│ Skirt\n    //          ││  Main Grid  ││\n    //          │├─────────────┤│\n    //          ││┼┼┼┼┼┼┼┼┼┼┼┼┼││\n    //          ││┼┼┼┼┼┼┼┼┼┼┼┼┼││\n    //          │└─────────────┘│\n    //          ├───────────────┤\n    //          ├───────────────┤\n    //          └───────────────┘\n    //      Bottom Skirt = Number of LOD's\n    //\n    _fillGridMeshWithLods(longitudinalCellsCount: number, latitudinalLods: number[]): GridWithLods {\n        const vertices = new PosArray();\n        const indices = new TriangleIndexArray();\n        const segments: Array<GridLodSegments> = [];\n\n        const xVertices = longitudinalCellsCount + 1 + 2 * (EMBED_SKIRTS ? 1 : 0);\n        const yVerticesHighLodNoStrip = latitudinalLods[0] + 1;\n        const yVerticesHighLodWithStrip = latitudinalLods[0] + 1 + (EMBED_SKIRTS ? 1 + latitudinalLods.length : 0);\n\n        // Index adjustment, used to make strip (x, y) vertex input attribute data\n        // to match same data on ordinary grid edges\n        const prepareVertex = (x: number, y: number, isSkirt: boolean) => {\n            if (!EMBED_SKIRTS) return [x, y];\n\n            let adjustedX = (() => {\n                if (x === xVertices - 1) {\n                    return x - 2;\n                } else if (x === 0) {\n                    return x;\n                } else {\n                    return x - 1;\n                }\n            })();\n\n            // Skirt factor is introduces as an offset to the .x coordinate, similar to how it's done for mercator grids\n            const skirtOffset = 24575;\n            adjustedX += isSkirt ? skirtOffset : 0;\n\n            return [adjustedX, y];\n        };\n\n        // Add first horizontal strip if present\n        if (EMBED_SKIRTS) {\n            for (let x = 0; x < xVertices; ++x) {\n                vertices.emplaceBack(...prepareVertex(x, 0, true));\n            }\n        }\n\n        // Add main grid part with vertices strips embedded\n        for (let y = 0; y < yVerticesHighLodNoStrip; ++y) {\n            for (let x = 0; x < xVertices; ++x) {\n                const isSideBorder = (x === 0 || x === xVertices - 1);\n\n                vertices.emplaceBack(...prepareVertex(x, y, isSideBorder && EMBED_SKIRTS));\n            }\n        }\n\n        // Add bottom strips for each LOD\n        if (EMBED_SKIRTS) {\n            for (let lodIdx = 0; lodIdx < latitudinalLods.length; ++lodIdx) {\n                const lastYRowForLod = latitudinalLods[lodIdx];\n                for (let x = 0; x < xVertices; ++x) {\n                    vertices.emplaceBack(...prepareVertex(x, lastYRowForLod, true));\n                }\n            }\n        }\n\n        // Fill triangles\n        for (let lodIdx = 0; lodIdx < latitudinalLods.length; ++lodIdx) {\n            const indexOffset = indices.length;\n\n            const yVerticesLod = latitudinalLods[lodIdx] + 1 + 2 * (EMBED_SKIRTS ? 1 : 0);\n\n            const skirtsOnlyIndices = new TriangleIndexArray();\n\n            for (let y = 0; y < yVerticesLod - 1; y++) {\n                const isLastLine = (y === yVerticesLod - 2);\n                const offsetToNextRow =\n                    (isLastLine && EMBED_SKIRTS ?\n                        (xVertices * (yVerticesHighLodWithStrip - latitudinalLods.length + lodIdx - y)) :\n                        xVertices);\n\n                for (let x = 0; x < xVertices - 1; x++) {\n                    const idx = y * xVertices + x;\n\n                    const isSkirt = EMBED_SKIRTS && (y === 0 || isLastLine || x === 0 || x === xVertices - 2);\n\n                    if (isSkirt) {\n                        skirtsOnlyIndices.emplaceBack(idx + 1, idx, idx + offsetToNextRow);\n                        skirtsOnlyIndices.emplaceBack(idx + offsetToNextRow, idx + offsetToNextRow + 1, idx + 1);\n                    } else {\n                        indices.emplaceBack(idx + 1, idx, idx + offsetToNextRow);\n                        indices.emplaceBack(idx + offsetToNextRow, idx + offsetToNextRow + 1, idx + 1);\n                    }\n                }\n            }\n\n            // Segments grid only\n            const withoutSkirts = SegmentVector.simpleSegment(0, indexOffset, vertices.length, indices.length - indexOffset);\n\n            for (let i = 0; i < skirtsOnlyIndices.uint16.length; i += 3) {\n                indices.emplaceBack(skirtsOnlyIndices.uint16[i], skirtsOnlyIndices.uint16[i + 1], skirtsOnlyIndices.uint16[i + 2]);\n            }\n\n            // Segments grid + skirts only\n            const withSkirts = SegmentVector.simpleSegment(0, indexOffset, vertices.length, indices.length - indexOffset);\n            segments.push({withoutSkirts, withSkirts});\n        }\n\n        return {vertices, indices, segments};\n    }\n\n    _createGrid(context: Context) {\n        const gridWithLods = this._fillGridMeshWithLods(GLOBE_VERTEX_GRID_SIZE, GLOBE_LATITUDINAL_GRID_LOD_TABLE);\n        this._gridSegments = gridWithLods.segments;\n\n        this._gridBuffer = context.createVertexBuffer(gridWithLods.vertices, posAttributes.members);\n        this._gridIndexBuffer = context.createIndexBuffer(gridWithLods.indices, true);\n    }\n\n    _createPoles(context: Context) {\n        const poleIndices = new TriangleIndexArray();\n        for (let i = 0; i <= GLOBE_VERTEX_GRID_SIZE; i++) {\n            poleIndices.emplaceBack(0, i + 1, i + 2);\n        }\n        this._poleIndexBuffer = context.createIndexBuffer(poleIndices, true);\n\n        const northVertices = new GlobeVertexArray();\n        const southVertices = new GlobeVertexArray();\n        const texturedNorthVertices = new GlobeVertexArray();\n        const texturedSouthVertices = new GlobeVertexArray();\n        const polePrimitives = GLOBE_VERTEX_GRID_SIZE;\n        const poleVertices = GLOBE_VERTEX_GRID_SIZE + 2;\n        this._poleSegments = [];\n\n        for (let zoom = 0, offset = 0; zoom < GLOBE_ZOOM_THRESHOLD_MIN; zoom++) {\n            const tiles = 1 << zoom;\n            const endAngle = 360.0 / tiles;\n\n            northVertices.emplaceBack(0, -GLOBE_RADIUS, 0, 0.5, 0); // place the tip\n            southVertices.emplaceBack(0, -GLOBE_RADIUS, 0, 0.5, 1);\n            texturedNorthVertices.emplaceBack(0, -GLOBE_RADIUS, 0, 0.5, 0.5);\n            texturedSouthVertices.emplaceBack(0, -GLOBE_RADIUS, 0, 0.5, 0.5);\n\n            for (let i = 0; i <= GLOBE_VERTEX_GRID_SIZE; i++) {\n                let uvX = i / GLOBE_VERTEX_GRID_SIZE;\n                let uvY = 0.0;\n                const angle = interpolate(0, endAngle, uvX);\n                const [gx, gy, gz] = csLatLngToECEF(POLE_COS, POLE_SIN, angle, GLOBE_RADIUS);\n                northVertices.emplaceBack(gx, gy, gz, uvX, uvY);\n                southVertices.emplaceBack(gx, gy, gz, uvX, 1.0 - uvY);\n                const rad = degToRad(angle);\n                uvX = 0.5 + 0.5 * Math.sin(rad);\n                uvY = 0.5 + 0.5 * Math.cos(rad);\n                texturedNorthVertices.emplaceBack(gx, gy, gz, uvX, uvY);\n                texturedSouthVertices.emplaceBack(gx, gy, gz, uvX, 1.0 - uvY);\n            }\n\n            this._poleSegments.push(SegmentVector.simpleSegment(offset, 0, poleVertices, polePrimitives));\n\n            offset += poleVertices;\n        }\n\n        this._poleNorthVertexBuffer = context.createVertexBuffer(northVertices, globeLayoutAttributes, false);\n        this._poleSouthVertexBuffer = context.createVertexBuffer(southVertices, globeLayoutAttributes, false);\n        this._texturedPoleNorthVertexBuffer = context.createVertexBuffer(texturedNorthVertices, globeLayoutAttributes, false);\n        this._texturedPoleSouthVertexBuffer = context.createVertexBuffer(texturedSouthVertices, globeLayoutAttributes, false);\n    }\n\n    getGridBuffers(latitudinalLod: number, withSkirts: boolean): [VertexBuffer, IndexBuffer, SegmentVector] {\n        return [this._gridBuffer, this._gridIndexBuffer, withSkirts ? this._gridSegments[latitudinalLod].withSkirts : this._gridSegments[latitudinalLod].withoutSkirts];\n    }\n\n    getPoleBuffers(z: number, textured: boolean): [VertexBuffer, VertexBuffer, IndexBuffer, SegmentVector] {\n        return [\n            textured ? this._texturedPoleNorthVertexBuffer : this._poleNorthVertexBuffer,\n            textured ? this._texturedPoleSouthVertexBuffer : this._poleSouthVertexBuffer,\n            this._poleIndexBuffer,\n            this._poleSegments[z]\n        ];\n    }\n}\n","// @flow\n\nimport {\n    Uniform1f,\n    Uniform2f,\n    Uniform3f,\n    UniformMatrix2f,\n    UniformMatrix4f\n} from '../uniform_binding.js';\n\nimport type Context from '../../gl/context.js';\nimport type {UniformValues} from '../uniform_binding.js';\nimport {CanonicalTileID, OverscaledTileID} from '../../source/tile_id.js';\nimport type Tile from '../../source/tile.js';\nimport type CircleStyleLayer from '../../style/style_layer/circle_style_layer.js';\nimport type Painter from '../painter.js';\nimport browser from '../../util/browser.js';\nimport {mat4} from 'gl-matrix';\nimport {globeToMercatorTransition, globePixelsToTileUnits} from '../../geo/projection/globe_util.js';\nimport EXTENT from '../../style-spec/data/extent.js';\n\nexport type CircleUniformsType = {|\n    'u_camera_to_center_distance': Uniform1f,\n    'u_extrude_scale': UniformMatrix2f,\n    'u_device_pixel_ratio': Uniform1f,\n    'u_matrix': UniformMatrix4f,\n    'u_inv_rot_matrix': UniformMatrix4f,\n    'u_merc_center': Uniform2f,\n    'u_tile_id': Uniform3f,\n    'u_zoom_transition': Uniform1f,\n    'u_up_dir': Uniform3f,\n    'u_emissive_strength': Uniform1f,\n|};\n\nexport type CircleDefinesType = 'PITCH_WITH_MAP' | 'SCALE_WITH_MAP';\n\nconst circleUniforms = (context: Context): CircleUniformsType => ({\n    'u_camera_to_center_distance': new Uniform1f(context),\n    'u_extrude_scale': new UniformMatrix2f(context),\n    'u_device_pixel_ratio': new Uniform1f(context),\n    'u_matrix': new UniformMatrix4f(context),\n    'u_inv_rot_matrix': new UniformMatrix4f(context),\n    'u_merc_center': new Uniform2f(context),\n    'u_tile_id': new Uniform3f(context),\n    'u_zoom_transition': new Uniform1f(context),\n    'u_up_dir': new Uniform3f(context),\n    'u_emissive_strength': new Uniform1f(context),\n});\n\nconst identityMatrix = mat4.create();\n\nconst circleUniformValues = (\n    painter: Painter,\n    coord: OverscaledTileID,\n    tile: Tile,\n    invMatrix: Float32Array,\n    mercatorCenter: [number, number],\n    layer: CircleStyleLayer\n): UniformValues<CircleUniformsType> => {\n    const transform = painter.transform;\n    const isGlobe = transform.projection.name === 'globe';\n\n    let extrudeScale;\n    if (layer.paint.get('circle-pitch-alignment') === 'map') {\n        if (isGlobe) {\n            const s = globePixelsToTileUnits(transform.zoom, coord.canonical) * transform._pixelsPerMercatorPixel;\n            extrudeScale = Float32Array.from([s, 0, 0, s]);\n        } else {\n            extrudeScale = transform.calculatePixelsToTileUnitsMatrix(tile);\n        }\n    } else {\n        extrudeScale = new Float32Array([\n            transform.pixelsToGLUnits[0],\n            0,\n            0,\n            transform.pixelsToGLUnits[1]]);\n    }\n\n    const values = {\n        'u_camera_to_center_distance': painter.transform.getCameraToCenterDistance(transform.projection),\n        'u_matrix': painter.translatePosMatrix(\n            coord.projMatrix,\n            tile,\n            layer.paint.get('circle-translate'),\n            layer.paint.get('circle-translate-anchor')),\n        'u_device_pixel_ratio': browser.devicePixelRatio,\n        'u_extrude_scale': extrudeScale,\n        'u_inv_rot_matrix': identityMatrix,\n        'u_merc_center': [0, 0],\n        'u_tile_id': [0, 0, 0],\n        'u_zoom_transition': 0,\n        'u_up_dir': [0, 0, 0],\n        'u_emissive_strength': layer.paint.get('circle-emissive-strength')\n    };\n\n    if (isGlobe) {\n        values['u_inv_rot_matrix'] = invMatrix;\n        values['u_merc_center'] = mercatorCenter;\n        values['u_tile_id'] = [coord.canonical.x, coord.canonical.y, 1 << coord.canonical.z];\n        values['u_zoom_transition'] = globeToMercatorTransition(transform.zoom);\n        const x = mercatorCenter[0] * EXTENT;\n        const y = mercatorCenter[1] * EXTENT;\n        values['u_up_dir'] = (transform.projection.upVector(new CanonicalTileID(0, 0, 0), x, y): any);\n    }\n\n    return values;\n};\n\nconst circleDefinesValues = (layer: CircleStyleLayer): CircleDefinesType[] => {\n    const values = [];\n    if (layer.paint.get('circle-pitch-alignment') === 'map') values.push('PITCH_WITH_MAP');\n    if (layer.paint.get('circle-pitch-scale') === 'map') values.push('SCALE_WITH_MAP');\n\n    return values;\n};\n\nexport {circleUniforms, circleUniformValues, circleDefinesValues};\n","// @flow\n\nimport StyleLayer from '../style_layer.js';\n\nimport CircleBucket from '../../data/bucket/circle_bucket.js';\nimport {polygonIntersectsBufferedPoint} from '../../util/intersection_tests.js';\nimport {getMaximumPaintValue, translateDistance, tilespaceTranslate} from '../query_utils.js';\nimport properties from './circle_style_layer_properties.js';\nimport {Transitionable, Transitioning, Layout, PossiblyEvaluated} from '../properties.js';\nimport {vec4, vec3} from 'gl-matrix';\nimport Point from '@mapbox/point-geometry';\nimport ProgramConfiguration from '../../data/program_configuration.js';\nimport {Ray} from '../../util/primitives.js';\nimport assert from 'assert';\nimport {latFromMercatorY, mercatorZfromAltitude} from '../../geo/mercator_coordinate.js';\nimport EXTENT from '../../style-spec/data/extent.js';\n\nimport type {FeatureState} from '../../style-spec/expression/index.js';\nimport type Transform from '../../geo/transform.js';\nimport type {Bucket, BucketParameters} from '../../data/bucket.js';\nimport type {LayoutProps, PaintProps} from './circle_style_layer_properties.js';\nimport type {LayerSpecification} from '../../style-spec/types.js';\nimport type {TilespaceQueryGeometry} from '../query_geometry.js';\nimport type {DEMSampler} from '../../terrain/elevation.js';\nimport type {IVectorTileFeature} from '@mapbox/vector-tile';\nimport {circleDefinesValues} from '../../render/program/circle_program.js';\nimport type {CreateProgramParams} from \"../../render/painter.js\";\nimport type {DynamicDefinesType} from \"../../render/program/program_uniforms.js\";\nimport type {ConfigOptions} from '../properties.js';\n\nclass CircleStyleLayer extends StyleLayer {\n    _unevaluatedLayout: Layout<LayoutProps>;\n    layout: PossiblyEvaluated<LayoutProps>;\n\n    _transitionablePaint: Transitionable<PaintProps>;\n    _transitioningPaint: Transitioning<PaintProps>;\n    paint: PossiblyEvaluated<PaintProps>;\n\n    constructor(layer: LayerSpecification, scope: string, options?: ?ConfigOptions) {\n        super(layer, properties, scope, options);\n    }\n\n    createBucket(parameters: BucketParameters<CircleStyleLayer>): CircleBucket<CircleStyleLayer> {\n        return new CircleBucket(parameters);\n    }\n\n    // $FlowFixMe[method-unbinding]\n    queryRadius(bucket: Bucket): number {\n        const circleBucket: CircleBucket<CircleStyleLayer> = (bucket: any);\n        return getMaximumPaintValue('circle-radius', this, circleBucket) +\n            getMaximumPaintValue('circle-stroke-width', this, circleBucket) +\n            translateDistance(this.paint.get('circle-translate'));\n    }\n\n    // $FlowFixMe[method-unbinding]\n    queryIntersectsFeature(queryGeometry: TilespaceQueryGeometry,\n                           feature: IVectorTileFeature,\n                           featureState: FeatureState,\n                           geometry: Array<Array<Point>>,\n                           zoom: number,\n                           transform: Transform,\n                           pixelPosMatrix: Float32Array,\n                           elevationHelper: ?DEMSampler): boolean {\n\n        const translation = tilespaceTranslate(\n            this.paint.get('circle-translate'),\n            this.paint.get('circle-translate-anchor'),\n            transform.angle, queryGeometry.pixelToTileUnitsFactor);\n\n        const size = this.paint.get('circle-radius').evaluate(feature, featureState) +\n            this.paint.get('circle-stroke-width').evaluate(feature, featureState);\n\n        return queryIntersectsCircle(queryGeometry, geometry, transform, pixelPosMatrix, elevationHelper,\n            this.paint.get('circle-pitch-alignment') === 'map',\n            this.paint.get('circle-pitch-scale') === 'map', translation, size);\n    }\n\n    getProgramIds(): Array<string> {\n        return ['circle'];\n    }\n\n    getDefaultProgramParams(_: string, zoom: number): CreateProgramParams | null {\n        const definesValues = ((circleDefinesValues(this): any): DynamicDefinesType[]);\n        return {\n            config: new ProgramConfiguration(this, zoom),\n            defines: definesValues,\n            overrideFog: false\n        };\n    }\n}\n\nexport function queryIntersectsCircle(queryGeometry: TilespaceQueryGeometry,\n                       geometry: Array<Array<Point>>,\n                       transform: Transform,\n                       pixelPosMatrix: Float32Array,\n                       elevationHelper: ?DEMSampler,\n                       alignWithMap: boolean,\n                       scaleWithMap: boolean,\n                       translation: Point,\n                       size: number): boolean {\n    if (alignWithMap && queryGeometry.queryGeometry.isAboveHorizon) return false;\n\n    // For pitch-alignment: map, compare feature geometry to query geometry in the plane of the tile\n    // // Otherwise, compare geometry in the plane of the viewport\n    // // A circle with fixed scaling relative to the viewport gets larger in tile space as it moves into the distance\n    // // A circle with fixed scaling relative to the map gets smaller in viewport space as it moves into the distance\n    if (alignWithMap) size *= queryGeometry.pixelToTileUnitsFactor;\n\n    const tileId = queryGeometry.tileID.canonical;\n    const elevationScale = transform.projection.upVectorScale(tileId, transform.center.lat, transform.worldSize).metersToTile;\n\n    for (const ring of geometry) {\n        for (const point of ring) {\n            const translatedPoint = point.add(translation);\n            const z = (elevationHelper && transform.elevation) ?\n                transform.elevation.exaggeration() * elevationHelper.getElevationAt(translatedPoint.x, translatedPoint.y, true) :\n                0;\n\n            // Reproject tile coordinate to the local coordinate space used by the projection\n            const reproj = transform.projection.projectTilePoint(translatedPoint.x, translatedPoint.y, tileId);\n\n            if (z > 0) {\n                const dir = transform.projection.upVector(tileId, translatedPoint.x, translatedPoint.y);\n                reproj.x += dir[0] * elevationScale * z;\n                reproj.y += dir[1] * elevationScale * z;\n                reproj.z += dir[2] * elevationScale * z;\n            }\n\n            const transformedPoint = alignWithMap ? translatedPoint : projectPoint(reproj.x, reproj.y, reproj.z, pixelPosMatrix);\n            const transformedPolygon = alignWithMap ?\n                queryGeometry.tilespaceRays.map((r) => intersectAtHeight(r, z)) :\n                queryGeometry.queryGeometry.screenGeometry;\n\n            const projectedCenter = vec4.transformMat4([], [reproj.x, reproj.y, reproj.z, 1], pixelPosMatrix);\n            if (!scaleWithMap && alignWithMap) {\n                size *= projectedCenter[3] / transform.cameraToCenterDistance;\n            } else if (scaleWithMap && !alignWithMap) {\n                size *= transform.cameraToCenterDistance / projectedCenter[3];\n            }\n\n            if (alignWithMap) {\n                // Apply extra scaling to cover different pixelPerMeter ratios at different latitudes\n                const lat = latFromMercatorY((point.y / EXTENT + tileId.y) / (1 << tileId.z));\n                const scale = transform.projection.pixelsPerMeter(lat, 1) / mercatorZfromAltitude(1, lat);\n\n                size /= scale;\n            }\n\n            if (polygonIntersectsBufferedPoint(transformedPolygon, transformedPoint, size)) return true;\n        }\n    }\n\n    return false;\n}\n\nfunction projectPoint(x: number, y: number, z: number, pixelPosMatrix: Float32Array) {\n    const point = vec4.transformMat4([], [x, y, z, 1], pixelPosMatrix);\n    return new Point(point[0] / point[3], point[1] / point[3]);\n}\n\nconst origin = vec3.fromValues(0, 0, 0);\nconst up = vec3.fromValues(0, 0, 1);\n\nfunction intersectAtHeight(r: Ray, z: number): Point {\n    const intersectionPt = vec3.create();\n    origin[2] = z;\n    const intersects = r.intersectsPlane(origin, up, intersectionPt);\n    assert(intersects, 'tilespacePoint should always be below horizon, and since camera cannot have pitch >90, ray should always intersect');\n\n    return new Point(intersectionPt[0], intersectionPt[1]);\n}\n\nexport default CircleStyleLayer;\n","// @flow\n\nimport CircleBucket from './circle_bucket.js';\n\nimport {register} from '../../util/web_worker_transfer.js';\n\nimport type HeatmapStyleLayer from '../../style/style_layer/heatmap_style_layer.js';\n\nclass HeatmapBucket extends CircleBucket<HeatmapStyleLayer> {\n    // Needed for flow to accept omit: ['layers'] below, due to\n    // https://github.com/facebook/flow/issues/4262\n    layers: Array<HeatmapStyleLayer>;\n}\n\nregister(HeatmapBucket, 'HeatmapBucket', {omit: ['layers']});\n\nexport default HeatmapBucket;\n","// @flow\n\nimport assert from 'assert';\n\nimport {register} from './web_worker_transfer.js';\n\nexport type Size = interface {\n    width: number,\n    height: number,\n};\n\nexport interface SpritePosition {\n    +tl: [number, number],\n    +br: [number, number],\n    +pixelRatio?: number\n}\nexport type SpritePositions = {[_: string]: SpritePosition};\n\ntype Point = {\n    x: number,\n    y: number\n};\n\nfunction createImage<T: AlphaImage | RGBAImage>(image: T, {width, height}: Size, channels: number, data?: Uint8Array | Uint8ClampedArray): T {\n    if (!data) {\n        data = new Uint8Array(width * height * channels);\n    } else if (data instanceof Uint8ClampedArray) {\n        data = new Uint8Array(data.buffer);\n    } else if (data.length !== width * height * channels) {\n        throw new RangeError('mismatched image size');\n    }\n    image.width = width;\n    image.height = height;\n    image.data = data;\n    return image;\n}\n\nfunction resizeImage<T: AlphaImage | RGBAImage>(image: T, newImage: T, channels: number) {\n    const {width, height} = newImage;\n    if (width === image.width && height === image.height) {\n        return;\n    }\n\n    copyImage(image, newImage, {x: 0, y: 0}, {x: 0, y: 0}, {\n        width: Math.min(image.width, width),\n        height: Math.min(image.height, height)\n    }, channels);\n\n    image.width = width;\n    image.height = height;\n    image.data = newImage.data;\n}\n\nfunction copyImage<T: RGBAImage | AlphaImage>(srcImg: T | ImageData, dstImg: T, srcPt: Point, dstPt: Point, size: Size, channels: number, overrideRGBWithWhite: ?boolean): T {\n    if (size.width === 0 || size.height === 0) {\n        return dstImg;\n    }\n\n    if (size.width > srcImg.width ||\n        size.height > srcImg.height ||\n        srcPt.x > srcImg.width - size.width ||\n        srcPt.y > srcImg.height - size.height) {\n        throw new RangeError('out of range source coordinates for image copy');\n    }\n\n    if (size.width > dstImg.width ||\n        size.height > dstImg.height ||\n        dstPt.x > dstImg.width - size.width ||\n        dstPt.y > dstImg.height - size.height) {\n        throw new RangeError('out of range destination coordinates for image copy');\n    }\n\n    const srcData = srcImg.data;\n    const dstData = dstImg.data;\n    const overrideRGB = channels === 4 && overrideRGBWithWhite;\n\n    assert(srcData !== dstData);\n\n    for (let y = 0; y < size.height; y++) {\n        const srcOffset = ((srcPt.y + y) * srcImg.width + srcPt.x) * channels;\n        const dstOffset = ((dstPt.y + y) * dstImg.width + dstPt.x) * channels;\n        if (overrideRGB) {\n            for (let i = 0; i < size.width; i++) {\n                const srcByteOffset = srcOffset + i * channels + 3;\n                const dstPixelOffset = dstOffset + i * channels;\n                dstData[dstPixelOffset + 0] = 255;\n                dstData[dstPixelOffset + 1] = 255;\n                dstData[dstPixelOffset + 2] = 255;\n                dstData[dstPixelOffset + 3] = srcData[srcByteOffset];\n            }\n        } else {\n            for (let i = 0; i < size.width * channels; i++) {\n                const srcByte = srcOffset + i;\n                dstData[dstOffset + i] = srcData[srcByte];\n            }\n        }\n    }\n    return dstImg;\n}\n\nexport class AlphaImage {\n    width: number;\n    height: number;\n    data: Uint8Array;\n\n    constructor(size: Size, data?: Uint8Array | Uint8ClampedArray) {\n        createImage(this, size, 1, data);\n    }\n\n    resize(size: Size) {\n        resizeImage(this, new AlphaImage(size), 1);\n    }\n\n    clone(): AlphaImage {\n        return new AlphaImage({width: this.width, height: this.height}, new Uint8Array(this.data));\n    }\n\n    static copy(srcImg: AlphaImage, dstImg: AlphaImage, srcPt: Point, dstPt: Point, size: Size) {\n        copyImage(srcImg, dstImg, srcPt, dstPt, size, 1);\n    }\n}\n\n// Not premultiplied, because ImageData is not premultiplied.\n// UNPACK_PREMULTIPLY_ALPHA_WEBGL must be used when uploading to a texture.\nexport class RGBAImage {\n    width: number;\n    height: number;\n\n    // data must be a Uint8Array instead of Uint8ClampedArray because texImage2D does not\n    // support Uint8ClampedArray in all browsers\n    data: Uint8Array;\n\n    constructor(size: Size, data?: Uint8Array | Uint8ClampedArray) {\n        createImage(this, size, 4, data);\n    }\n\n    resize(size: Size) {\n        resizeImage(this, new RGBAImage(size), 4);\n    }\n\n    replace(data: Uint8Array | Uint8ClampedArray, copy?: boolean) {\n        if (copy) {\n            this.data.set(data);\n        } else if (data instanceof Uint8ClampedArray) {\n            this.data = new Uint8Array(data.buffer);\n        } else {\n            this.data = data;\n        }\n    }\n\n    clone(): RGBAImage {\n        return new RGBAImage({width: this.width, height: this.height}, new Uint8Array(this.data));\n    }\n\n    static copy(srcImg: RGBAImage | ImageData, dstImg: RGBAImage, srcPt: Point, dstPt: Point, size: Size, overrideRGBWithWhite: ?boolean) {\n        copyImage(srcImg, dstImg, srcPt, dstPt, size, 4, overrideRGBWithWhite);\n    }\n}\n\nexport class Float32Image {\n    width: number;\n    height: number;\n\n    data: Float32Array;\n\n    constructor(size: Size, data: Uint8Array | Float32Array) {\n        this.width = size.width;\n        this.height = size.height;\n\n        if (data instanceof Uint8Array) {\n            this.data = new Float32Array(data.buffer);\n        } else {\n            this.data = data;\n        }\n    }\n}\n\nregister(AlphaImage, 'AlphaImage');\nregister(RGBAImage, 'RGBAImage');\n","// This file is generated. Edit build/generate-style-code.js, then run `npm run codegen`.\n// @flow\n/* eslint-disable */\n\nimport styleSpec from '../../style-spec/reference/latest.js';\n\nimport {\n    Properties,\n    DataConstantProperty,\n    DataDrivenProperty,\n    ColorRampProperty\n} from '../properties.js';\n\nimport type Color from '../../style-spec/util/color.js';\n\nimport type Formatted from '../../style-spec/expression/types/formatted.js';\n\nimport type ResolvedImage from '../../style-spec/expression/types/resolved_image.js';\n\nexport type LayoutProps = {|\n    \"visibility\": DataConstantProperty<\"visible\" | \"none\">,\n|};\n\nconst layout: Properties<LayoutProps> = new Properties({\n    \"visibility\": new DataConstantProperty(styleSpec[\"layout_heatmap\"][\"visibility\"]),\n});\n\nexport type PaintProps = {|\n    \"heatmap-radius\": DataDrivenProperty<number>,\n    \"heatmap-weight\": DataDrivenProperty<number>,\n    \"heatmap-intensity\": DataConstantProperty<number>,\n    \"heatmap-color\": ColorRampProperty,\n    \"heatmap-opacity\": DataConstantProperty<number>,\n|};\n\nconst paint: Properties<PaintProps> = new Properties({\n    \"heatmap-radius\": new DataDrivenProperty(styleSpec[\"paint_heatmap\"][\"heatmap-radius\"]),\n    \"heatmap-weight\": new DataDrivenProperty(styleSpec[\"paint_heatmap\"][\"heatmap-weight\"]),\n    \"heatmap-intensity\": new DataConstantProperty(styleSpec[\"paint_heatmap\"][\"heatmap-intensity\"]),\n    \"heatmap-color\": new ColorRampProperty(styleSpec[\"paint_heatmap\"][\"heatmap-color\"]),\n    \"heatmap-opacity\": new DataConstantProperty(styleSpec[\"paint_heatmap\"][\"heatmap-opacity\"]),\n});\n\n// Note: without adding the explicit type annotation, Flow infers weaker types\n// for these objects from their use in the constructor to StyleLayer, as\n// {layout?: Properties<...>, paint: Properties<...>}\nexport default ({ paint, layout }: $Exact<{\n  paint: Properties<PaintProps>, layout: Properties<LayoutProps>\n}>);\n","// @flow\n\nimport {RGBAImage} from './image.js';\nimport {isPowerOfTwo} from './util.js';\nimport assert from 'assert';\n\nimport type Color from '../style-spec/util/color.js';\nimport type {StylePropertyExpression} from '../style-spec/expression/index.js';\n\nexport type ColorRampParams = {\n    expression: StylePropertyExpression;\n    evaluationKey: string;\n    resolution?: number;\n    image?: RGBAImage;\n    clips?: Array<Object>;\n}\n\n/**\n * Given an expression that should evaluate to a color ramp,\n * return a RGBA image representing that ramp expression.\n *\n * @private\n */\nexport function renderColorRamp(params: ColorRampParams): RGBAImage {\n    const evaluationGlobals = {};\n    const width = params.resolution || 256;\n    const height = params.clips ? params.clips.length : 1;\n    const image = params.image || new RGBAImage({width, height});\n\n    assert(isPowerOfTwo(width));\n\n    const renderPixel = (stride: number, index: number, progress: number) => {\n        evaluationGlobals[params.evaluationKey] = progress;\n        const pxColor: ?Color = params.expression.evaluate((evaluationGlobals: any));\n        if (!pxColor) return;\n\n        // the colors are being unpremultiplied because Color uses\n        // premultiplied values, and the Texture class expects unpremultiplied ones\n        image.data[stride + index + 0] = Math.floor(pxColor.r * 255 / pxColor.a);\n        image.data[stride + index + 1] = Math.floor(pxColor.g * 255 / pxColor.a);\n        image.data[stride + index + 2] = Math.floor(pxColor.b * 255 / pxColor.a);\n        image.data[stride + index + 3] = Math.floor(pxColor.a * 255);\n    };\n\n    if (!params.clips) {\n        for (let i = 0, j = 0; i < width; i++, j += 4) {\n            const progress = i / (width - 1);\n\n            renderPixel(0, j, progress);\n        }\n    } else {\n        for (let clip = 0, stride = 0; clip < height; ++clip, stride += width * 4) {\n            for (let i = 0, j = 0; i < width; i++, j += 4) {\n                // Remap progress between clips\n                const progress = i / (width - 1);\n                const {start, end} = params.clips[clip];\n                const evaluationProgress = start * (1 - progress) + end * progress;\n                renderPixel(stride, j, evaluationProgress);\n            }\n        }\n    }\n\n    return image;\n}\n","// This file is generated. Edit build/generate-style-code.js, then run `npm run codegen`.\n// @flow\n/* eslint-disable */\n\nimport styleSpec from '../../style-spec/reference/latest.js';\n\nimport {\n    Properties,\n    DataConstantProperty,\n    DataDrivenProperty,\n    ColorRampProperty\n} from '../properties.js';\n\nimport type Color from '../../style-spec/util/color.js';\n\nimport type Formatted from '../../style-spec/expression/types/formatted.js';\n\nimport type ResolvedImage from '../../style-spec/expression/types/resolved_image.js';\n\nexport type LayoutProps = {|\n    \"visibility\": DataConstantProperty<\"visible\" | \"none\">,\n|};\n\nconst layout: Properties<LayoutProps> = new Properties({\n    \"visibility\": new DataConstantProperty(styleSpec[\"layout_hillshade\"][\"visibility\"]),\n});\n\nexport type PaintProps = {|\n    \"hillshade-illumination-direction\": DataConstantProperty<number>,\n    \"hillshade-illumination-anchor\": DataConstantProperty<\"map\" | \"viewport\">,\n    \"hillshade-exaggeration\": DataConstantProperty<number>,\n    \"hillshade-shadow-color\": DataConstantProperty<Color>,\n    \"hillshade-highlight-color\": DataConstantProperty<Color>,\n    \"hillshade-accent-color\": DataConstantProperty<Color>,\n    \"hillshade-emissive-strength\": DataConstantProperty<number>,\n|};\n\nconst paint: Properties<PaintProps> = new Properties({\n    \"hillshade-illumination-direction\": new DataConstantProperty(styleSpec[\"paint_hillshade\"][\"hillshade-illumination-direction\"]),\n    \"hillshade-illumination-anchor\": new DataConstantProperty(styleSpec[\"paint_hillshade\"][\"hillshade-illumination-anchor\"]),\n    \"hillshade-exaggeration\": new DataConstantProperty(styleSpec[\"paint_hillshade\"][\"hillshade-exaggeration\"]),\n    \"hillshade-shadow-color\": new DataConstantProperty(styleSpec[\"paint_hillshade\"][\"hillshade-shadow-color\"]),\n    \"hillshade-highlight-color\": new DataConstantProperty(styleSpec[\"paint_hillshade\"][\"hillshade-highlight-color\"]),\n    \"hillshade-accent-color\": new DataConstantProperty(styleSpec[\"paint_hillshade\"][\"hillshade-accent-color\"]),\n    \"hillshade-emissive-strength\": new DataConstantProperty(styleSpec[\"paint_hillshade\"][\"hillshade-emissive-strength\"]),\n});\n\n// Note: without adding the explicit type annotation, Flow infers weaker types\n// for these objects from their use in the constructor to StyleLayer, as\n// {layout?: Properties<...>, paint: Properties<...>}\nexport default ({ paint, layout }: $Exact<{\n  paint: Properties<PaintProps>, layout: Properties<LayoutProps>\n}>);\n","// @flow\nimport {createLayout} from '../../util/struct_array.js';\n\nimport type {StructArrayLayout} from '../../util/struct_array.js';\n\nconst layout: StructArrayLayout = createLayout([\n    {name: 'a_pos', components: 2, type: 'Int16'}\n], 4);\n\nexport default layout;\nexport const {members, size, alignment} = layout;\n","'use strict';\n\nmodule.exports = earcut;\nmodule.exports.default = earcut;\n\nfunction earcut(data, holeIndices, dim) {\n\n    dim = dim || 2;\n\n    var hasHoles = holeIndices && holeIndices.length,\n        outerLen = hasHoles ? holeIndices[0] * dim : data.length,\n        outerNode = linkedList(data, 0, outerLen, dim, true),\n        triangles = [];\n\n    if (!outerNode || outerNode.next === outerNode.prev) return triangles;\n\n    var minX, minY, maxX, maxY, x, y, invSize;\n\n    if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\n    // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n    if (data.length > 80 * dim) {\n        minX = maxX = data[0];\n        minY = maxY = data[1];\n\n        for (var i = dim; i < outerLen; i += dim) {\n            x = data[i];\n            y = data[i + 1];\n            if (x < minX) minX = x;\n            if (y < minY) minY = y;\n            if (x > maxX) maxX = x;\n            if (y > maxY) maxY = y;\n        }\n\n        // minX, minY and invSize are later used to transform coords into integers for z-order calculation\n        invSize = Math.max(maxX - minX, maxY - minY);\n        invSize = invSize !== 0 ? 32767 / invSize : 0;\n    }\n\n    earcutLinked(outerNode, triangles, dim, minX, minY, invSize, 0);\n\n    return triangles;\n}\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(data, start, end, dim, clockwise) {\n    var i, last;\n\n    if (clockwise === (signedArea(data, start, end, dim) > 0)) {\n        for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);\n    } else {\n        for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);\n    }\n\n    if (last && equals(last, last.next)) {\n        removeNode(last);\n        last = last.next;\n    }\n\n    return last;\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n    if (!start) return start;\n    if (!end) end = start;\n\n    var p = start,\n        again;\n    do {\n        again = false;\n\n        if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n            removeNode(p);\n            p = end = p.prev;\n            if (p === p.next) break;\n            again = true;\n\n        } else {\n            p = p.next;\n        }\n    } while (again || p !== end);\n\n    return end;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {\n    if (!ear) return;\n\n    // interlink polygon nodes in z-order\n    if (!pass && invSize) indexCurve(ear, minX, minY, invSize);\n\n    var stop = ear,\n        prev, next;\n\n    // iterate through ears, slicing them one by one\n    while (ear.prev !== ear.next) {\n        prev = ear.prev;\n        next = ear.next;\n\n        if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\n            // cut off the triangle\n            triangles.push(prev.i / dim | 0);\n            triangles.push(ear.i / dim | 0);\n            triangles.push(next.i / dim | 0);\n\n            removeNode(ear);\n\n            // skipping the next vertex leads to less sliver triangles\n            ear = next.next;\n            stop = next.next;\n\n            continue;\n        }\n\n        ear = next;\n\n        // if we looped through the whole remaining polygon and can't find any more ears\n        if (ear === stop) {\n            // try filtering points and slicing again\n            if (!pass) {\n                earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n\n            // if this didn't work, try curing all small self-intersections locally\n            } else if (pass === 1) {\n                ear = cureLocalIntersections(filterPoints(ear), triangles, dim);\n                earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n\n            // as a last resort, try splitting the remaining polygon into two\n            } else if (pass === 2) {\n                splitEarcut(ear, triangles, dim, minX, minY, invSize);\n            }\n\n            break;\n        }\n    }\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n    var a = ear.prev,\n        b = ear,\n        c = ear.next;\n\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n    // now make sure we don't have other points inside the potential ear\n    var ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n    // triangle bbox; min & max are calculated like this for speed\n    var x0 = ax < bx ? (ax < cx ? ax : cx) : (bx < cx ? bx : cx),\n        y0 = ay < by ? (ay < cy ? ay : cy) : (by < cy ? by : cy),\n        x1 = ax > bx ? (ax > cx ? ax : cx) : (bx > cx ? bx : cx),\n        y1 = ay > by ? (ay > cy ? ay : cy) : (by > cy ? by : cy);\n\n    var p = c.next;\n    while (p !== a) {\n        if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 &&\n            pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) &&\n            area(p.prev, p, p.next) >= 0) return false;\n        p = p.next;\n    }\n\n    return true;\n}\n\nfunction isEarHashed(ear, minX, minY, invSize) {\n    var a = ear.prev,\n        b = ear,\n        c = ear.next;\n\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n    var ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n    // triangle bbox; min & max are calculated like this for speed\n    var x0 = ax < bx ? (ax < cx ? ax : cx) : (bx < cx ? bx : cx),\n        y0 = ay < by ? (ay < cy ? ay : cy) : (by < cy ? by : cy),\n        x1 = ax > bx ? (ax > cx ? ax : cx) : (bx > cx ? bx : cx),\n        y1 = ay > by ? (ay > cy ? ay : cy) : (by > cy ? by : cy);\n\n    // z-order range for the current triangle bbox;\n    var minZ = zOrder(x0, y0, minX, minY, invSize),\n        maxZ = zOrder(x1, y1, minX, minY, invSize);\n\n    var p = ear.prevZ,\n        n = ear.nextZ;\n\n    // look for points inside the triangle in both directions\n    while (p && p.z >= minZ && n && n.z <= maxZ) {\n        if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n            pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n\n        if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n            pointInTriangle(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n\n    // look for remaining points in decreasing z-order\n    while (p && p.z >= minZ) {\n        if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n            pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n    }\n\n    // look for remaining points in increasing z-order\n    while (n && n.z <= maxZ) {\n        if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n            pointInTriangle(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n\n    return true;\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles, dim) {\n    var p = start;\n    do {\n        var a = p.prev,\n            b = p.next.next;\n\n        if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\n            triangles.push(a.i / dim | 0);\n            triangles.push(p.i / dim | 0);\n            triangles.push(b.i / dim | 0);\n\n            // remove two nodes involved\n            removeNode(p);\n            removeNode(p.next);\n\n            p = start = b;\n        }\n        p = p.next;\n    } while (p !== start);\n\n    return filterPoints(p);\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, invSize) {\n    // look for a valid diagonal that divides the polygon into two\n    var a = start;\n    do {\n        var b = a.next.next;\n        while (b !== a.prev) {\n            if (a.i !== b.i && isValidDiagonal(a, b)) {\n                // split the polygon in two by the diagonal\n                var c = splitPolygon(a, b);\n\n                // filter colinear points around the cuts\n                a = filterPoints(a, a.next);\n                c = filterPoints(c, c.next);\n\n                // run earcut on each half\n                earcutLinked(a, triangles, dim, minX, minY, invSize, 0);\n                earcutLinked(c, triangles, dim, minX, minY, invSize, 0);\n                return;\n            }\n            b = b.next;\n        }\n        a = a.next;\n    } while (a !== start);\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n    var queue = [],\n        i, len, start, end, list;\n\n    for (i = 0, len = holeIndices.length; i < len; i++) {\n        start = holeIndices[i] * dim;\n        end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n        list = linkedList(data, start, end, dim, false);\n        if (list === list.next) list.steiner = true;\n        queue.push(getLeftmost(list));\n    }\n\n    queue.sort(compareX);\n\n    // process holes from left to right\n    for (i = 0; i < queue.length; i++) {\n        outerNode = eliminateHole(queue[i], outerNode);\n    }\n\n    return outerNode;\n}\n\nfunction compareX(a, b) {\n    return a.x - b.x;\n}\n\n// find a bridge between vertices that connects hole with an outer ring and and link it\nfunction eliminateHole(hole, outerNode) {\n    var bridge = findHoleBridge(hole, outerNode);\n    if (!bridge) {\n        return outerNode;\n    }\n\n    var bridgeReverse = splitPolygon(bridge, hole);\n\n    // filter collinear points around the cuts\n    filterPoints(bridgeReverse, bridgeReverse.next);\n    return filterPoints(bridge, bridge.next);\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n    var p = outerNode,\n        hx = hole.x,\n        hy = hole.y,\n        qx = -Infinity,\n        m;\n\n    // find a segment intersected by a ray from the hole's leftmost point to the left;\n    // segment's endpoint with lesser x will be potential connection point\n    do {\n        if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n            var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n            if (x <= hx && x > qx) {\n                qx = x;\n                m = p.x < p.next.x ? p : p.next;\n                if (x === hx) return m; // hole touches outer segment; pick leftmost endpoint\n            }\n        }\n        p = p.next;\n    } while (p !== outerNode);\n\n    if (!m) return null;\n\n    // look for points inside the triangle of hole point, segment intersection and endpoint;\n    // if there are no points found, we have a valid connection;\n    // otherwise choose the point of the minimum angle with the ray as connection point\n\n    var stop = m,\n        mx = m.x,\n        my = m.y,\n        tanMin = Infinity,\n        tan;\n\n    p = m;\n\n    do {\n        if (hx >= p.x && p.x >= mx && hx !== p.x &&\n                pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n\n            tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\n            if (locallyInside(p, hole) &&\n                (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {\n                m = p;\n                tanMin = tan;\n            }\n        }\n\n        p = p.next;\n    } while (p !== stop);\n\n    return m;\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector(m, p) {\n    return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, invSize) {\n    var p = start;\n    do {\n        if (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n        p.prevZ = p.prev;\n        p.nextZ = p.next;\n        p = p.next;\n    } while (p !== start);\n\n    p.prevZ.nextZ = null;\n    p.prevZ = null;\n\n    sortLinked(p);\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n    var i, p, q, e, tail, numMerges, pSize, qSize,\n        inSize = 1;\n\n    do {\n        p = list;\n        list = null;\n        tail = null;\n        numMerges = 0;\n\n        while (p) {\n            numMerges++;\n            q = p;\n            pSize = 0;\n            for (i = 0; i < inSize; i++) {\n                pSize++;\n                q = q.nextZ;\n                if (!q) break;\n            }\n            qSize = inSize;\n\n            while (pSize > 0 || (qSize > 0 && q)) {\n\n                if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\n                    e = p;\n                    p = p.nextZ;\n                    pSize--;\n                } else {\n                    e = q;\n                    q = q.nextZ;\n                    qSize--;\n                }\n\n                if (tail) tail.nextZ = e;\n                else list = e;\n\n                e.prevZ = tail;\n                tail = e;\n            }\n\n            p = q;\n        }\n\n        tail.nextZ = null;\n        inSize *= 2;\n\n    } while (numMerges > 1);\n\n    return list;\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder(x, y, minX, minY, invSize) {\n    // coords are transformed into non-negative 15-bit integer range\n    x = (x - minX) * invSize | 0;\n    y = (y - minY) * invSize | 0;\n\n    x = (x | (x << 8)) & 0x00FF00FF;\n    x = (x | (x << 4)) & 0x0F0F0F0F;\n    x = (x | (x << 2)) & 0x33333333;\n    x = (x | (x << 1)) & 0x55555555;\n\n    y = (y | (y << 8)) & 0x00FF00FF;\n    y = (y | (y << 4)) & 0x0F0F0F0F;\n    y = (y | (y << 2)) & 0x33333333;\n    y = (y | (y << 1)) & 0x55555555;\n\n    return x | (y << 1);\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n    var p = start,\n        leftmost = start;\n    do {\n        if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;\n        p = p.next;\n    } while (p !== start);\n\n    return leftmost;\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n    return (cx - px) * (ay - py) >= (ax - px) * (cy - py) &&\n           (ax - px) * (by - py) >= (bx - px) * (ay - py) &&\n           (bx - px) * (cy - py) >= (cx - px) * (by - py);\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n    return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges\n           (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible\n            (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors\n            equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case\n}\n\n// signed area of a triangle\nfunction area(p, q, r) {\n    return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\n// check if two points are equal\nfunction equals(p1, p2) {\n    return p1.x === p2.x && p1.y === p2.y;\n}\n\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n    var o1 = sign(area(p1, q1, p2));\n    var o2 = sign(area(p1, q1, q2));\n    var o3 = sign(area(p2, q2, p1));\n    var o4 = sign(area(p2, q2, q1));\n\n    if (o1 !== o2 && o3 !== o4) return true; // general case\n\n    if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n    if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n    if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n    if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n    return false;\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment(p, q, r) {\n    return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);\n}\n\nfunction sign(num) {\n    return num > 0 ? 1 : num < 0 ? -1 : 0;\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n    var p = a;\n    do {\n        if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n                intersects(p, p.next, a, b)) return true;\n        p = p.next;\n    } while (p !== a);\n\n    return false;\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n    return area(a.prev, a, a.next) < 0 ?\n        area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n        area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n    var p = a,\n        inside = false,\n        px = (a.x + b.x) / 2,\n        py = (a.y + b.y) / 2;\n    do {\n        if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&\n                (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n            inside = !inside;\n        p = p.next;\n    } while (p !== a);\n\n    return inside;\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a, b) {\n    var a2 = new Node(a.i, a.x, a.y),\n        b2 = new Node(b.i, b.x, b.y),\n        an = a.next,\n        bp = b.prev;\n\n    a.next = b;\n    b.prev = a;\n\n    a2.next = an;\n    an.prev = a2;\n\n    b2.next = a2;\n    a2.prev = b2;\n\n    bp.next = b2;\n    b2.prev = bp;\n\n    return b2;\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n    var p = new Node(i, x, y);\n\n    if (!last) {\n        p.prev = p;\n        p.next = p;\n\n    } else {\n        p.next = last.next;\n        p.prev = last;\n        last.next.prev = p;\n        last.next = p;\n    }\n    return p;\n}\n\nfunction removeNode(p) {\n    p.next.prev = p.prev;\n    p.prev.next = p.next;\n\n    if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n    if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\nfunction Node(i, x, y) {\n    // vertex index in coordinates array\n    this.i = i;\n\n    // vertex coordinates\n    this.x = x;\n    this.y = y;\n\n    // previous and next vertex nodes in a polygon ring\n    this.prev = null;\n    this.next = null;\n\n    // z-order curve value\n    this.z = 0;\n\n    // previous and next nodes in z-order\n    this.prevZ = null;\n    this.nextZ = null;\n\n    // indicates whether this is a steiner point\n    this.steiner = false;\n}\n\n// return a percentage difference between the polygon area and its triangulation area;\n// used to verify correctness of triangulation\nearcut.deviation = function (data, holeIndices, dim, triangles) {\n    var hasHoles = holeIndices && holeIndices.length;\n    var outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n\n    var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));\n    if (hasHoles) {\n        for (var i = 0, len = holeIndices.length; i < len; i++) {\n            var start = holeIndices[i] * dim;\n            var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n            polygonArea -= Math.abs(signedArea(data, start, end, dim));\n        }\n    }\n\n    var trianglesArea = 0;\n    for (i = 0; i < triangles.length; i += 3) {\n        var a = triangles[i] * dim;\n        var b = triangles[i + 1] * dim;\n        var c = triangles[i + 2] * dim;\n        trianglesArea += Math.abs(\n            (data[a] - data[c]) * (data[b + 1] - data[a + 1]) -\n            (data[a] - data[b]) * (data[c + 1] - data[a + 1]));\n    }\n\n    return polygonArea === 0 && trianglesArea === 0 ? 0 :\n        Math.abs((trianglesArea - polygonArea) / polygonArea);\n};\n\nfunction signedArea(data, start, end, dim) {\n    var sum = 0;\n    for (var i = start, j = end - dim; i < end; i += dim) {\n        sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n        j = i;\n    }\n    return sum;\n}\n\n// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts\nearcut.flatten = function (data) {\n    var dim = data[0][0].length,\n        result = {vertices: [], holes: [], dimensions: dim},\n        holeIndex = 0;\n\n    for (var i = 0; i < data.length; i++) {\n        for (var j = 0; j < data[i].length; j++) {\n            for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]);\n        }\n        if (i > 0) {\n            holeIndex += data[i - 1].length;\n            result.holes.push(holeIndex);\n        }\n    }\n    return result;\n};\n","// @flow\n\nimport quickselect from 'quickselect';\n\nimport {calculateSignedArea} from './util.js';\n\nimport type Point from '@mapbox/point-geometry';\n\n// classifies an array of rings into polygons with outer rings and holes\nexport default function classifyRings(rings: Array<Array<Point>>, maxRings: number): Array<Array<Array<Point>>> {\n    const len = rings.length;\n\n    if (len <= 1) return [rings];\n\n    const polygons = [];\n    let polygon,\n        ccw;\n\n    for (let i = 0; i < len; i++) {\n        const area = calculateSignedArea(rings[i]);\n        if (area === 0) continue;\n\n        (rings[i]: any).area = Math.abs(area);\n\n        if (ccw === undefined) ccw = area < 0;\n\n        if (ccw === area < 0) {\n            if (polygon) polygons.push(polygon);\n            polygon = [rings[i]];\n\n        } else {\n            (polygon: any).push(rings[i]);\n        }\n    }\n    if (polygon) polygons.push(polygon);\n\n    // Earcut performance degrades with the # of rings in a polygon. For this\n    // reason, we limit strip out all but the `maxRings` largest rings.\n    if (maxRings > 1) {\n        for (let j = 0; j < polygons.length; j++) {\n            if (polygons[j].length <= maxRings) continue;\n            quickselect(polygons[j], maxRings, 1, polygons[j].length - 1, compareAreas);\n            polygons[j] = polygons[j].slice(0, maxRings);\n        }\n    }\n\n    return polygons;\n}\n\nfunction compareAreas(a: {area: number}, b: {area: number}) {\n    return b.area - a.area;\n}\n","// @flow\nimport type FillStyleLayer from '../../style/style_layer/fill_style_layer.js';\nimport type FillExtrusionStyleLayer from '../../style/style_layer/fill_extrusion_style_layer.js';\nimport type LineStyleLayer from '../../style/style_layer/line_style_layer.js';\n\nimport type {\n    BucketFeature,\n    PopulateParameters\n} from '../bucket.js';\n\ntype PatternStyleLayers =\n    Array<LineStyleLayer> |\n    Array<FillStyleLayer> |\n    Array<FillExtrusionStyleLayer>;\n\nexport function hasPattern(type: string, layers: PatternStyleLayers, options: PopulateParameters): boolean {\n    const patterns = options.patternDependencies;\n    let hasPattern = false;\n\n    for (const layer of layers) {\n        const patternProperty = layer.paint.get(`${type}-pattern`);\n        if (!patternProperty.isConstant()) {\n            hasPattern = true;\n        }\n\n        const constantPattern = patternProperty.constantOr(null);\n        if (constantPattern) {\n            hasPattern = true;\n            patterns[constantPattern] =  true;\n        }\n    }\n\n    return hasPattern;\n}\n\nexport function addPatternDependencies(type: string, layers: PatternStyleLayers, patternFeature: BucketFeature, zoom: number, options: PopulateParameters): BucketFeature {\n    const patterns = options.patternDependencies;\n    for (const layer of layers) {\n        const patternProperty = layer.paint.get(`${type}-pattern`);\n\n        const patternPropertyValue = patternProperty.value;\n        if (patternPropertyValue.kind !== \"constant\") {\n            let pattern = patternPropertyValue.evaluate({zoom}, patternFeature, {}, options.availableImages);\n            pattern = pattern && pattern.name ? pattern.name : pattern;\n\n            // add to patternDependencies\n            patterns[pattern] = true;\n\n            // save for layout\n            patternFeature.patterns[layer.id] = pattern;\n        }\n    }\n    return patternFeature;\n}\n","// @flow\n\nimport {FillLayoutArray} from '../array_types.js';\n\nimport {members as layoutAttributes} from './fill_attributes.js';\nimport SegmentVector from '../segment.js';\nimport {ProgramConfigurationSet} from '../program_configuration.js';\nimport {LineIndexArray, TriangleIndexArray} from '../index_array_type.js';\nimport earcut from 'earcut';\nimport classifyRings from '../../util/classify_rings.js';\nimport assert from 'assert';\nconst EARCUT_MAX_RINGS = 500;\nimport {register} from '../../util/web_worker_transfer.js';\nimport {hasPattern, addPatternDependencies} from './pattern_bucket_features.js';\nimport loadGeometry from '../load_geometry.js';\nimport toEvaluationFeature from '../evaluation_feature.js';\nimport EvaluationParameters from '../../style/evaluation_parameters.js';\n\nimport type {CanonicalTileID} from '../../source/tile_id.js';\nimport type {\n    Bucket,\n    BucketParameters,\n    BucketFeature,\n    IndexedFeature,\n    PopulateParameters\n} from '../bucket.js';\nimport type FillStyleLayer from '../../style/style_layer/fill_style_layer.js';\nimport type Context from '../../gl/context.js';\nimport type IndexBuffer from '../../gl/index_buffer.js';\nimport type VertexBuffer from '../../gl/vertex_buffer.js';\nimport type Point from '@mapbox/point-geometry';\nimport type {FeatureStates} from '../../source/source_state.js';\nimport type {SpritePositions} from '../../util/image.js';\nimport type {ProjectionSpecification} from '../../style-spec/types.js';\nimport type {TileTransform} from '../../geo/projection/tile_transform.js';\nimport type {IVectorTileLayer} from '@mapbox/vector-tile';\n\nclass FillBucket implements Bucket {\n    index: number;\n    zoom: number;\n    overscaling: number;\n    layers: Array<FillStyleLayer>;\n    layerIds: Array<string>;\n    stateDependentLayers: Array<FillStyleLayer>;\n    stateDependentLayerIds: Array<string>;\n    patternFeatures: Array<BucketFeature>;\n\n    layoutVertexArray: FillLayoutArray;\n    layoutVertexBuffer: VertexBuffer;\n\n    indexArray: TriangleIndexArray;\n    indexBuffer: IndexBuffer;\n\n    indexArray2: LineIndexArray;\n    indexBuffer2: IndexBuffer;\n\n    hasPattern: boolean;\n    programConfigurations: ProgramConfigurationSet<FillStyleLayer>;\n    segments: SegmentVector;\n    segments2: SegmentVector;\n    uploaded: boolean;\n    projection: ProjectionSpecification;\n\n    constructor(options: BucketParameters<FillStyleLayer>) {\n        this.zoom = options.zoom;\n        this.overscaling = options.overscaling;\n        this.layers = options.layers;\n        this.layerIds = this.layers.map(layer => layer.fqid);\n        this.index = options.index;\n        this.hasPattern = false;\n        this.patternFeatures = [];\n\n        this.layoutVertexArray = new FillLayoutArray();\n        this.indexArray = new TriangleIndexArray();\n        this.indexArray2 = new LineIndexArray();\n        this.programConfigurations = new ProgramConfigurationSet(options.layers, options.zoom);\n        this.segments = new SegmentVector();\n        this.segments2 = new SegmentVector();\n        this.stateDependentLayerIds = this.layers.filter((l) => l.isStateDependent()).map((l) => l.id);\n        this.projection = options.projection;\n    }\n\n    populate(features: Array<IndexedFeature>, options: PopulateParameters, canonical: CanonicalTileID, tileTransform: TileTransform) {\n        this.hasPattern = hasPattern('fill', this.layers, options);\n        const fillSortKey = this.layers[0].layout.get('fill-sort-key');\n        const bucketFeatures = [];\n\n        for (const {feature, id, index, sourceLayerIndex} of features) {\n            const needGeometry = this.layers[0]._featureFilter.needGeometry;\n            const evaluationFeature = toEvaluationFeature(feature, needGeometry);\n\n            // $FlowFixMe[method-unbinding]\n            if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) continue;\n\n            const sortKey = fillSortKey ?\n                fillSortKey.evaluate(evaluationFeature, {}, canonical, options.availableImages) :\n                undefined;\n\n            const bucketFeature: BucketFeature = {\n                id,\n                properties: feature.properties,\n                type: feature.type,\n                sourceLayerIndex,\n                index,\n                geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature, canonical, tileTransform),\n                patterns: {},\n                sortKey\n            };\n\n            bucketFeatures.push(bucketFeature);\n        }\n\n        if (fillSortKey) {\n            bucketFeatures.sort((a, b) => {\n                // a.sortKey is always a number when in use\n                return ((a.sortKey: any): number) - ((b.sortKey: any): number);\n            });\n        }\n\n        for (const bucketFeature of bucketFeatures) {\n            const {geometry, index, sourceLayerIndex} = bucketFeature;\n\n            if (this.hasPattern) {\n                const patternFeature = addPatternDependencies('fill', this.layers, bucketFeature, this.zoom, options);\n                // pattern features are added only once the pattern is loaded into the image atlas\n                // so are stored during populate until later updated with positions by tile worker in addFeatures\n                this.patternFeatures.push(patternFeature);\n            } else {\n                this.addFeature(bucketFeature, geometry, index, canonical, {}, options.availableImages, options.brightness);\n            }\n\n            const feature = features[index].feature;\n            options.featureIndex.insert(feature, geometry, index, sourceLayerIndex, this.index);\n        }\n    }\n\n    update(states: FeatureStates, vtLayer: IVectorTileLayer, availableImages: Array<string>, imagePositions: SpritePositions, brightness: ?number) {\n        const withStateUpdates = Object.keys(states).length !== 0;\n        if (withStateUpdates && !this.stateDependentLayers.length) return;\n        const layers = withStateUpdates ? this.stateDependentLayers : this.layers;\n        this.programConfigurations.updatePaintArrays(states, vtLayer, layers, availableImages, imagePositions, brightness);\n    }\n\n    addFeatures(options: PopulateParameters, canonical: CanonicalTileID, imagePositions: SpritePositions, availableImages: Array<string>, _: TileTransform, brightness: ?number) {\n        for (const feature of this.patternFeatures) {\n            this.addFeature(feature, feature.geometry, feature.index, canonical, imagePositions, availableImages, brightness);\n        }\n    }\n\n    isEmpty(): boolean {\n        return this.layoutVertexArray.length === 0;\n    }\n\n    uploadPending(): boolean {\n        return !this.uploaded || this.programConfigurations.needsUpload;\n    }\n    upload(context: Context) {\n        if (!this.uploaded) {\n            this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, layoutAttributes);\n            this.indexBuffer = context.createIndexBuffer(this.indexArray);\n            this.indexBuffer2 = context.createIndexBuffer(this.indexArray2);\n        }\n        this.programConfigurations.upload(context);\n        this.uploaded = true;\n    }\n\n    destroy() {\n        if (!this.layoutVertexBuffer) return;\n        this.layoutVertexBuffer.destroy();\n        this.indexBuffer.destroy();\n        this.indexBuffer2.destroy();\n        this.programConfigurations.destroy();\n        this.segments.destroy();\n        this.segments2.destroy();\n    }\n\n    addFeature(feature: BucketFeature, geometry: Array<Array<Point>>, index: number, canonical: CanonicalTileID, imagePositions: SpritePositions, availableImages: Array<string> = [], brightness: ?number) {\n        for (const polygon of classifyRings(geometry, EARCUT_MAX_RINGS)) {\n            let numVertices = 0;\n            for (const ring of polygon) {\n                numVertices += ring.length;\n            }\n\n            const triangleSegment = this.segments.prepareSegment(numVertices, this.layoutVertexArray, this.indexArray);\n            const triangleIndex = triangleSegment.vertexLength;\n\n            const flattened = [];\n            const holeIndices = [];\n\n            for (const ring of polygon) {\n                if (ring.length === 0) {\n                    continue;\n                }\n\n                if (ring !== polygon[0]) {\n                    holeIndices.push(flattened.length / 2);\n                }\n\n                const lineSegment = this.segments2.prepareSegment(ring.length, this.layoutVertexArray, this.indexArray2);\n                const lineIndex = lineSegment.vertexLength;\n\n                this.layoutVertexArray.emplaceBack(ring[0].x, ring[0].y);\n                this.indexArray2.emplaceBack(lineIndex + ring.length - 1, lineIndex);\n                flattened.push(ring[0].x);\n                flattened.push(ring[0].y);\n\n                for (let i = 1; i < ring.length; i++) {\n                    this.layoutVertexArray.emplaceBack(ring[i].x, ring[i].y);\n                    this.indexArray2.emplaceBack(lineIndex + i - 1, lineIndex + i);\n                    flattened.push(ring[i].x);\n                    flattened.push(ring[i].y);\n                }\n\n                lineSegment.vertexLength += ring.length;\n                lineSegment.primitiveLength += ring.length;\n            }\n\n            const indices = earcut(flattened, holeIndices);\n            assert(indices.length % 3 === 0);\n\n            for (let i = 0; i < indices.length; i += 3) {\n                this.indexArray.emplaceBack(\n                    triangleIndex + indices[i],\n                    triangleIndex + indices[i + 1],\n                    triangleIndex + indices[i + 2]);\n            }\n\n            triangleSegment.vertexLength += numVertices;\n            triangleSegment.primitiveLength += indices.length / 3;\n        }\n        this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, imagePositions, availableImages, canonical, brightness);\n    }\n}\n\nregister(FillBucket, 'FillBucket', {omit: ['layers', 'patternFeatures']});\n\nexport default FillBucket;\n","// This file is generated. Edit build/generate-style-code.js, then run `npm run codegen`.\n// @flow\n/* eslint-disable */\n\nimport styleSpec from '../../style-spec/reference/latest.js';\n\nimport {\n    Properties,\n    DataConstantProperty,\n    DataDrivenProperty,\n    ColorRampProperty\n} from '../properties.js';\n\nimport type Color from '../../style-spec/util/color.js';\n\nimport type Formatted from '../../style-spec/expression/types/formatted.js';\n\nimport type ResolvedImage from '../../style-spec/expression/types/resolved_image.js';\n\nexport type LayoutProps = {|\n    \"fill-sort-key\": DataDrivenProperty<number>,\n    \"visibility\": DataConstantProperty<\"visible\" | \"none\">,\n|};\n\nconst layout: Properties<LayoutProps> = new Properties({\n    \"fill-sort-key\": new DataDrivenProperty(styleSpec[\"layout_fill\"][\"fill-sort-key\"]),\n    \"visibility\": new DataConstantProperty(styleSpec[\"layout_fill\"][\"visibility\"]),\n});\n\nexport type PaintProps = {|\n    \"fill-antialias\": DataConstantProperty<boolean>,\n    \"fill-opacity\": DataDrivenProperty<number>,\n    \"fill-color\": DataDrivenProperty<Color>,\n    \"fill-outline-color\": DataDrivenProperty<Color>,\n    \"fill-translate\": DataConstantProperty<[number, number]>,\n    \"fill-translate-anchor\": DataConstantProperty<\"map\" | \"viewport\">,\n    \"fill-pattern\": DataDrivenProperty<?ResolvedImage>,\n    \"fill-emissive-strength\": DataConstantProperty<number>,\n|};\n\nconst paint: Properties<PaintProps> = new Properties({\n    \"fill-antialias\": new DataConstantProperty(styleSpec[\"paint_fill\"][\"fill-antialias\"]),\n    \"fill-opacity\": new DataDrivenProperty(styleSpec[\"paint_fill\"][\"fill-opacity\"]),\n    \"fill-color\": new DataDrivenProperty(styleSpec[\"paint_fill\"][\"fill-color\"]),\n    \"fill-outline-color\": new DataDrivenProperty(styleSpec[\"paint_fill\"][\"fill-outline-color\"]),\n    \"fill-translate\": new DataConstantProperty(styleSpec[\"paint_fill\"][\"fill-translate\"]),\n    \"fill-translate-anchor\": new DataConstantProperty(styleSpec[\"paint_fill\"][\"fill-translate-anchor\"]),\n    \"fill-pattern\": new DataDrivenProperty(styleSpec[\"paint_fill\"][\"fill-pattern\"]),\n    \"fill-emissive-strength\": new DataConstantProperty(styleSpec[\"paint_fill\"][\"fill-emissive-strength\"]),\n});\n\n// Note: without adding the explicit type annotation, Flow infers weaker types\n// for these objects from their use in the constructor to StyleLayer, as\n// {layout?: Properties<...>, paint: Properties<...>}\nexport default ({ paint, layout }: $Exact<{\n  paint: Properties<PaintProps>, layout: Properties<LayoutProps>\n}>);\n","// @flow\nimport {createLayout} from '../../util/struct_array.js';\n\nimport type {StructArrayLayout} from '../../util/struct_array.js';\n\nexport const fillExtrusionAttributes: StructArrayLayout = createLayout([\n    {name: 'a_pos_normal_ed', components: 4, type: 'Int16'}\n]);\n\nexport const fillExtrusionGroundAttributes: StructArrayLayout = createLayout([\n    {name: 'a_pos_end', components: 4, type: 'Int16'},\n    {name: 'a_angular_offset_factor', components: 1, type: 'Int16'}\n]);\n\nexport const centroidAttributes: StructArrayLayout = createLayout([\n    {name: 'a_centroid_pos',  components: 2, type: 'Uint16'}\n]);\n\nexport const hiddenByLandmarkAttributes: StructArrayLayout = createLayout([\n    {name: 'a_hidden_by_landmark',  components: 1, type: 'Uint8'}\n]);\n\nexport const fillExtrusionAttributesExt: StructArrayLayout = createLayout([\n    {name: 'a_pos_3', components: 3, type: 'Int16'},\n    {name: 'a_pos_normal_3', components: 3, type: 'Int16'}\n]);\n\nexport const {members, size, alignment} = fillExtrusionAttributes;\n","'use strict';\n\nvar Point = require('@mapbox/point-geometry');\n\nmodule.exports = VectorTileFeature;\n\nfunction VectorTileFeature(pbf, end, extent, keys, values) {\n    // Public\n    this.properties = {};\n    this.extent = extent;\n    this.type = 0;\n\n    // Private\n    this._pbf = pbf;\n    this._geometry = -1;\n    this._keys = keys;\n    this._values = values;\n\n    pbf.readFields(readFeature, this, end);\n}\n\nfunction readFeature(tag, feature, pbf) {\n    if (tag == 1) feature.id = pbf.readVarint();\n    else if (tag == 2) readTag(pbf, feature);\n    else if (tag == 3) feature.type = pbf.readVarint();\n    else if (tag == 4) feature._geometry = pbf.pos;\n}\n\nfunction readTag(pbf, feature) {\n    var end = pbf.readVarint() + pbf.pos;\n\n    while (pbf.pos < end) {\n        var key = feature._keys[pbf.readVarint()],\n            value = feature._values[pbf.readVarint()];\n        feature.properties[key] = value;\n    }\n}\n\nVectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon'];\n\nVectorTileFeature.prototype.loadGeometry = function() {\n    var pbf = this._pbf;\n    pbf.pos = this._geometry;\n\n    var end = pbf.readVarint() + pbf.pos,\n        cmd = 1,\n        length = 0,\n        x = 0,\n        y = 0,\n        lines = [],\n        line;\n\n    while (pbf.pos < end) {\n        if (length <= 0) {\n            var cmdLen = pbf.readVarint();\n            cmd = cmdLen & 0x7;\n            length = cmdLen >> 3;\n        }\n\n        length--;\n\n        if (cmd === 1 || cmd === 2) {\n            x += pbf.readSVarint();\n            y += pbf.readSVarint();\n\n            if (cmd === 1) { // moveTo\n                if (line) lines.push(line);\n                line = [];\n            }\n\n            line.push(new Point(x, y));\n\n        } else if (cmd === 7) {\n\n            // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90\n            if (line) {\n                line.push(line[0].clone()); // closePolygon\n            }\n\n        } else {\n            throw new Error('unknown command ' + cmd);\n        }\n    }\n\n    if (line) lines.push(line);\n\n    return lines;\n};\n\nVectorTileFeature.prototype.bbox = function() {\n    var pbf = this._pbf;\n    pbf.pos = this._geometry;\n\n    var end = pbf.readVarint() + pbf.pos,\n        cmd = 1,\n        length = 0,\n        x = 0,\n        y = 0,\n        x1 = Infinity,\n        x2 = -Infinity,\n        y1 = Infinity,\n        y2 = -Infinity;\n\n    while (pbf.pos < end) {\n        if (length <= 0) {\n            var cmdLen = pbf.readVarint();\n            cmd = cmdLen & 0x7;\n            length = cmdLen >> 3;\n        }\n\n        length--;\n\n        if (cmd === 1 || cmd === 2) {\n            x += pbf.readSVarint();\n            y += pbf.readSVarint();\n            if (x < x1) x1 = x;\n            if (x > x2) x2 = x;\n            if (y < y1) y1 = y;\n            if (y > y2) y2 = y;\n\n        } else if (cmd !== 7) {\n            throw new Error('unknown command ' + cmd);\n        }\n    }\n\n    return [x1, y1, x2, y2];\n};\n\nVectorTileFeature.prototype.toGeoJSON = function(x, y, z) {\n    var size = this.extent * Math.pow(2, z),\n        x0 = this.extent * x,\n        y0 = this.extent * y,\n        coords = this.loadGeometry(),\n        type = VectorTileFeature.types[this.type],\n        i, j;\n\n    function project(line) {\n        for (var j = 0; j < line.length; j++) {\n            var p = line[j], y2 = 180 - (p.y + y0) * 360 / size;\n            line[j] = [\n                (p.x + x0) * 360 / size - 180,\n                360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90\n            ];\n        }\n    }\n\n    switch (this.type) {\n    case 1:\n        var points = [];\n        for (i = 0; i < coords.length; i++) {\n            points[i] = coords[i][0];\n        }\n        coords = points;\n        project(coords);\n        break;\n\n    case 2:\n        for (i = 0; i < coords.length; i++) {\n            project(coords[i]);\n        }\n        break;\n\n    case 3:\n        coords = classifyRings(coords);\n        for (i = 0; i < coords.length; i++) {\n            for (j = 0; j < coords[i].length; j++) {\n                project(coords[i][j]);\n            }\n        }\n        break;\n    }\n\n    if (coords.length === 1) {\n        coords = coords[0];\n    } else {\n        type = 'Multi' + type;\n    }\n\n    var result = {\n        type: \"Feature\",\n        geometry: {\n            type: type,\n            coordinates: coords\n        },\n        properties: this.properties\n    };\n\n    if ('id' in this) {\n        result.id = this.id;\n    }\n\n    return result;\n};\n\n// classifies an array of rings into polygons with outer rings and holes\n\nfunction classifyRings(rings) {\n    var len = rings.length;\n\n    if (len <= 1) return [rings];\n\n    var polygons = [],\n        polygon,\n        ccw;\n\n    for (var i = 0; i < len; i++) {\n        var area = signedArea(rings[i]);\n        if (area === 0) continue;\n\n        if (ccw === undefined) ccw = area < 0;\n\n        if (ccw === area < 0) {\n            if (polygon) polygons.push(polygon);\n            polygon = [rings[i]];\n\n        } else {\n            polygon.push(rings[i]);\n        }\n    }\n    if (polygon) polygons.push(polygon);\n\n    return polygons;\n}\n\nfunction signedArea(ring) {\n    var sum = 0;\n    for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {\n        p1 = ring[i];\n        p2 = ring[j];\n        sum += (p2.x - p1.x) * (p1.y + p2.y);\n    }\n    return sum;\n}\n","'use strict';\n\nvar VectorTileFeature = require('./vectortilefeature.js');\n\nmodule.exports = VectorTileLayer;\n\nfunction VectorTileLayer(pbf, end) {\n    // Public\n    this.version = 1;\n    this.name = null;\n    this.extent = 4096;\n    this.length = 0;\n\n    // Private\n    this._pbf = pbf;\n    this._keys = [];\n    this._values = [];\n    this._features = [];\n\n    pbf.readFields(readLayer, this, end);\n\n    this.length = this._features.length;\n}\n\nfunction readLayer(tag, layer, pbf) {\n    if (tag === 15) layer.version = pbf.readVarint();\n    else if (tag === 1) layer.name = pbf.readString();\n    else if (tag === 5) layer.extent = pbf.readVarint();\n    else if (tag === 2) layer._features.push(pbf.pos);\n    else if (tag === 3) layer._keys.push(pbf.readString());\n    else if (tag === 4) layer._values.push(readValueMessage(pbf));\n}\n\nfunction readValueMessage(pbf) {\n    var value = null,\n        end = pbf.readVarint() + pbf.pos;\n\n    while (pbf.pos < end) {\n        var tag = pbf.readVarint() >> 3;\n\n        value = tag === 1 ? pbf.readString() :\n            tag === 2 ? pbf.readFloat() :\n            tag === 3 ? pbf.readDouble() :\n            tag === 4 ? pbf.readVarint64() :\n            tag === 5 ? pbf.readVarint() :\n            tag === 6 ? pbf.readSVarint() :\n            tag === 7 ? pbf.readBoolean() : null;\n    }\n\n    return value;\n}\n\n// return feature `i` from this layer as a `VectorTileFeature`\nVectorTileLayer.prototype.feature = function(i) {\n    if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');\n\n    this._pbf.pos = this._features[i];\n\n    var end = this._pbf.readVarint() + this._pbf.pos;\n    return new VectorTileFeature(this._pbf, end, this.extent, this._keys, this._values);\n};\n","'use strict';\n\nvar VectorTileLayer = require('./vectortilelayer');\n\nmodule.exports = VectorTile;\n\nfunction VectorTile(pbf, end) {\n    this.layers = pbf.readFields(readTile, {}, end);\n}\n\nfunction readTile(tag, layers, pbf) {\n    if (tag === 3) {\n        var layer = new VectorTileLayer(pbf, pbf.readVarint() + pbf.pos);\n        if (layer.length) layers[layer.name] = layer;\n    }\n}\n\n","module.exports.VectorTile = require('./lib/vectortile.js');\nmodule.exports.VectorTileFeature = require('./lib/vectortilefeature.js');\nmodule.exports.VectorTileLayer = require('./lib/vectortilelayer.js');\n","// @flow\n\nimport assert from 'assert';\nimport Point from '@mapbox/point-geometry';\n\nexport type ClippedPolygon = {\n    polygon: Array<Array<Point>>,\n    bounds: [Point, Point]\n};\n\ntype PolygonArray = Array<Array<Array<Point>>>;\n\nfunction clipPolygon(polygons: PolygonArray, clipAxis1: number, clipAxis2: number, axis: number): PolygonArray {\n    const intersectX = (ring: Array<Point>, ax: number, ay: number, bx: number, by: number, x: number) => {\n        ring.push(new Point(x, ay + (by - ay) * ((x - ax) / (bx - ax))));\n    };\n    const intersectY = (ring: Array<Point>, ax: number, ay: number, bx: number, by: number, y: number) => {\n        ring.push(new Point(ax + (bx - ax) * ((y - ay) / (by - ay)), y));\n    };\n\n    const polygonsClipped = [];\n    const intersect = axis === 0 ? intersectX : intersectY;\n    for (const polygon of polygons) {\n        const polygonClipped = [];\n        for (const ring of polygon) {\n            if (ring.length <= 2) {\n                continue;\n            }\n\n            const clipped = [];\n            for (let i = 0; i < ring.length - 1; i++) {\n                const ax = ring[i].x;\n                const ay = ring[i].y;\n                const bx = ring[i + 1].x;\n                const by = ring[i + 1].y;\n                const a = axis === 0 ? ax : ay;\n                const b = axis === 0 ? bx : by;\n                if (a < clipAxis1) {\n                    if (b > clipAxis1) {\n                        intersect(clipped, ax, ay, bx, by, clipAxis1);\n                    }\n                } else if (a > clipAxis2) {\n                    if (b < clipAxis2) {\n                        intersect(clipped, ax, ay, bx, by, clipAxis2);\n                    }\n                } else {\n                    clipped.push(ring[i]);\n                }\n                if (b < clipAxis1 && a >= clipAxis1) {\n                    intersect(clipped, ax, ay, bx, by, clipAxis1);\n                }\n                if (b > clipAxis2 && a <= clipAxis2) {\n                    intersect(clipped, ax, ay, bx, by, clipAxis2);\n                }\n            }\n\n            let last = ring[ring.length - 1];\n            const a = axis === 0 ? last.x : last.y;\n            if (a >= clipAxis1 && a <= clipAxis2) {\n                clipped.push(last);\n            }\n            if (clipped.length) {\n                last = clipped[clipped.length - 1];\n                if (clipped[0].x !== last.x || clipped[0].y !== last.y) {\n                    clipped.push(clipped[0]);\n                }\n                polygonClipped.push(clipped);\n            }\n        }\n        if (polygonClipped.length) {\n            polygonsClipped.push(polygonClipped);\n        }\n    }\n\n    return polygonsClipped;\n}\n\nexport function subdividePolygons(polygons: PolygonArray, bounds: [Point, Point], gridSizeX: number, gridSizeY: number, padding: number = 0.0, splitFn: Function): Array<ClippedPolygon> {\n    const outPolygons = [];\n\n    if (!polygons.length || !gridSizeX || !gridSizeY) {\n        return outPolygons;\n    }\n\n    const addResult = (clipped: PolygonArray, bounds: [Point, Point]) => {\n        for (const polygon of clipped) {\n            outPolygons.push({polygon, bounds});\n        }\n    };\n\n    const hSplits = Math.ceil(Math.log2(gridSizeX));\n    const vSplits = Math.ceil(Math.log2(gridSizeY));\n\n    const initialSplits = hSplits - vSplits;\n\n    const splits = [];\n    for (let i = 0; i < Math.abs(initialSplits); i++) {\n        splits.push(initialSplits > 0 ? 0 : 1);\n    }\n\n    for (let i = 0; i < Math.min(hSplits, vSplits); i++) {\n        splits.push(0); // x\n        splits.push(1); // y\n    }\n\n    let split = polygons;\n\n    split = clipPolygon(split, bounds[0].y - padding, bounds[1].y + padding, 1);\n    split = clipPolygon(split, bounds[0].x - padding, bounds[1].x + padding, 0);\n\n    if (!split.length) {\n        return outPolygons;\n    }\n\n    const stack = [];\n    if (splits.length) {\n        stack.push({polygons: split, bounds, depth: 0});\n    } else {\n        addResult(split, bounds);\n    }\n\n    while (stack.length) {\n        const frame = stack.pop();\n\n        assert(frame.polygons.length > 0);\n\n        const depth = frame.depth;\n        const axis = splits[depth];\n\n        const bboxMin = frame.bounds[0];\n        const bboxMax = frame.bounds[1];\n\n        const splitMin = axis === 0 ? bboxMin.x : bboxMin.y;\n        const splitMax = axis === 0 ? bboxMax.x : bboxMax.y;\n\n        const splitMid = splitFn ? splitFn(axis, splitMin, splitMax) : 0.5 * (splitMin + splitMax);\n\n        const lclip = clipPolygon(frame.polygons, splitMin - padding, splitMid + padding, axis);\n        const rclip = clipPolygon(frame.polygons, splitMid - padding, splitMax + padding, axis);\n\n        if (lclip.length) {\n            const bbMaxX = axis === 0 ? splitMid : bboxMax.x;\n            const bbMaxY = axis === 1 ? splitMid : bboxMax.y;\n\n            const bbMax = new Point(bbMaxX, bbMaxY);\n\n            const lclipBounds = [bboxMin, bbMax];\n\n            if (splits.length > depth + 1) {\n                stack.push({polygons: lclip, bounds: lclipBounds, depth: depth + 1});\n            } else {\n                addResult(lclip, lclipBounds);\n            }\n        }\n\n        if (rclip.length) {\n            const bbMinX = axis === 0 ? splitMid : bboxMin.x;\n            const bbMinY = axis === 1 ? splitMid : bboxMin.y;\n\n            const bbMin = new Point(bbMinX, bbMinY);\n\n            const rclipBounds = [bbMin, bboxMax];\n\n            if (splits.length > depth + 1) {\n                stack.push({polygons: rclip, bounds: rclipBounds, depth: depth + 1});\n            } else {\n                addResult(rclip, rclipBounds);\n            }\n        }\n    }\n\n    return outPolygons;\n}\n","// @flow\n\nimport Point from '@mapbox/point-geometry';\nimport EXTENT from '../../src/style-spec/data/extent.js';\nimport {UnwrappedTileID} from '../../src/source/tile_id.js';\nimport {triangleIntersectsTriangle} from '../../src/util/intersection_tests.js';\n\nimport type Tiled3dModelBucket from '../../3d-style/data/bucket/tiled_3d_model_bucket.js';\nimport type {Footprint} from '../data/model.js';\nimport type SourceCache from '../../src/source/source_cache.js';\n\ntype TileFootprint = {\n    footprint: Footprint,\n    id: UnwrappedTileID,\n}\n\n// Abstract interface that acts as a source for footprints used in the replacement process\ninterface FootprintSource {\n    getSourceId():string,\n    getFootprints(): Array<TileFootprint>\n}\n\ntype Region = {\n    min: Point;\n    max: Point;\n    sourceId: string;\n    footprint: Footprint;\n    footprintTileId: UnwrappedTileID;\n}\n\ntype RegionData = {\n    min: Point;\n    max: Point;\n    hiddenByOverlap: boolean,\n    priority: number,\n    tileId: UnwrappedTileID,\n    footprint: Footprint\n}\n\nclass ReplacementSource {\n    _updateTime: number;\n    _sourceIds: Array<string>;\n    _activeRegions: Array<RegionData>;\n    _prevRegions: Array<RegionData>;\n\n    constructor() {\n        this._updateTime = 0;\n        this._sourceIds = [];\n        this._activeRegions = [];\n        this._prevRegions = [];\n    }\n\n    clear() {\n        if (this._activeRegions.length > 0) {\n            ++this._updateTime;\n        }\n\n        this._activeRegions = [];\n        this._prevRegions = [];\n    }\n\n    get updateTime(): number {\n        return this._updateTime;\n    }\n\n    getReplacementRegionsForTile(id: UnwrappedTileID): Array<Region> {\n        const tileBounds = transformAabbToMerc(new Point(0, 0), new Point(EXTENT, EXTENT), id);\n        const result: Array<Region> = [];\n\n        for (const region of this._activeRegions) {\n            if (region.hiddenByOverlap) {\n                continue;\n            }\n\n            if (!regionsOverlap(tileBounds, region)) {\n                continue;\n            }\n\n            const bounds = transformAabbToTile(region.min, region.max, id);\n            result.push({\n                min: bounds.min,\n                max: bounds.max,\n                sourceId: this._sourceIds[region.priority],\n                footprint: region.footprint,\n                footprintTileId: region.tileId\n            });\n        }\n\n        return result;\n    }\n\n    setSources(sources: Array<{ layer: string, cache: SourceCache }>) {\n        this._setSources(sources.map(source => {\n            return {\n                getSourceId: () => {\n                    return source.cache.id;\n                },\n                getFootprints: () => {\n                    const footprints: Array<TileFootprint> = [];\n\n                    for (const id of source.cache.getVisibleCoordinates()) {\n                        const tile = source.cache.getTile(id);\n                        const bucket: ?Tiled3dModelBucket = (tile.buckets[source.layer]: any);\n                        if (!bucket) {\n                            continue;\n                        }\n                        for (const nodeInfo of bucket.getNodesInfo()) {\n                            const node = nodeInfo.node;\n                            if (!node.footprint) {\n                                continue;\n                            }\n                            footprints.push({\n                                footprint: node.footprint,\n                                id: id.toUnwrapped()\n                            });\n                        }\n                    }\n\n                    return footprints;\n                }\n            };\n        }));\n    }\n\n    _addSource(source: FootprintSource) {\n        const footprints = source.getFootprints();\n\n        if (footprints.length === 0) {\n            return;\n        }\n\n        for (const fp of footprints) {\n            if (!fp.footprint) {\n                continue;\n            }\n\n            const bounds = transformAabbToMerc(fp.footprint.min, fp.footprint.max, fp.id);\n\n            this._activeRegions.push({\n                min: bounds.min,\n                max: bounds.max,\n                hiddenByOverlap: false,\n                priority: this._sourceIds.length,\n                tileId: fp.id,\n                footprint: fp.footprint\n            });\n        }\n\n        this._sourceIds.push(source.getSourceId());\n    }\n\n    _computeReplacement() {\n        this._activeRegions.sort((a, b) => {\n            return a.priority - b.priority || comparePoint(a.min, b.min) || comparePoint(a.max, b.max);\n        });\n\n        // Check if active regions have changed since last update\n        let regionsChanged = this._activeRegions.length !== this._prevRegions.length;\n\n        if (!regionsChanged) {\n            let activeIdx = 0;\n            let prevIdx = 0;\n\n            while (!regionsChanged && activeIdx !== this._activeRegions.length) {\n                const curr = this._activeRegions[activeIdx];\n                const prev = this._prevRegions[prevIdx];\n\n                regionsChanged = curr.priority !== prev.priority || !boundsEquals(curr, prev);\n\n                ++activeIdx;\n                ++prevIdx;\n            }\n        }\n\n        if (regionsChanged) {\n            ++this._updateTime;\n\n            const firstRegionOfNextPriority = (idx: number) => {\n                const regs = this._activeRegions;\n\n                if (idx >= regs.length) {\n                    return idx;\n                }\n\n                const priority = regs[idx].priority;\n                while (idx < regs.length && regs[idx].priority === priority) {\n                    ++idx;\n                }\n\n                return idx;\n            };\n\n            if (this._sourceIds.length > 1) {\n                // More than one replacement source exists in the style.\n                // Hide any overlapping regions in subsequent sources.\n\n                // Travel through all regions and hide regions overlapping with\n                // ones with higher priority.\n                let rangeBegin = 0;\n                let rangeEnd = firstRegionOfNextPriority(rangeBegin);\n\n                while (rangeBegin !== rangeEnd) {\n                    let idx = rangeBegin;\n                    const prevRangeEnd = rangeBegin;\n\n                    while (idx !== rangeEnd) {\n                        const active = this._activeRegions[idx];\n\n                        // Go through each footprint in the current priority level\n                        // and check whether they've been occluded by any other regions\n                        // with higher priority\n                        active.hiddenByOverlap = false;\n\n                        for (let prevIdx = 0; prevIdx < prevRangeEnd; prevIdx++) {\n                            const prev = this._activeRegions[prevIdx];\n\n                            if (prev.hiddenByOverlap) {\n                                continue;\n                            }\n\n                            if (regionsOverlap(active, prev)) {\n                                active.hiddenByOverlap = footprintsIntersect(active.footprint, active.tileId, prev.footprint, prev.tileId);\n                                if (active.hiddenByOverlap) {\n                                    break;\n                                }\n                            }\n                        }\n\n                        ++idx;\n                    }\n\n                    rangeBegin = rangeEnd;\n                    rangeEnd = firstRegionOfNextPriority(rangeBegin);\n                }\n            }\n        }\n    }\n\n    _setSources(sources: Array<FootprintSource>) {\n        // $FlowIssue[unsupported-syntax]\n        [this._prevRegions, this._activeRegions] = [this._activeRegions, []];\n        this._sourceIds = [];\n\n        for (let i = sources.length - 1; i >= 0; i--) {\n            this._addSource(sources[i]);\n        }\n\n        this._computeReplacement();\n    }\n}\n\nfunction comparePoint(a: Point, b: Point): number {\n    return a.x - b.x || a.y - b.y;\n}\n\nfunction boundsEquals(a: {min: Point, max: Point}, b: {min: Point, max: Point}): boolean {\n    return comparePoint(a.min, b.min) === 0 && comparePoint(a.max, b.max) === 0;\n}\n\nfunction regionsOverlap(a: {min: Point, max: Point}, b: {min: Point, max: Point}): boolean {\n    if (a.min.x > b.max.x || a.max.x < b.min.x)\n        return false;\n    else if (a.min.y > b.max.y || a.max.y < b.min.y)\n        return false;\n    return true;\n}\n\nfunction regionsEquals(a: Array<Region>, b: Array<Region>): boolean {\n    if (a.length !== b.length) {\n        return false;\n    }\n\n    for (let i = 0; i < a.length; i++) {\n        if (a[i].sourceId !== b[i].sourceId || !boundsEquals(a[i], b[i])) {\n            return false;\n        }\n    }\n\n    return true;\n}\n\nfunction transformAabbToMerc(min: Point, max: Point, id: UnwrappedTileID): {min: Point, max: Point} {\n    const invExtent = 1.0 / EXTENT;\n    const invTiles = 1.0 / (1 << id.canonical.z);\n\n    const minx = (min.x * invExtent + id.canonical.x) * invTiles + id.wrap;\n    const maxx = (max.x * invExtent + id.canonical.x) * invTiles + id.wrap;\n    const miny = (min.y * invExtent + id.canonical.y) * invTiles;\n    const maxy = (max.y * invExtent + id.canonical.y) * invTiles;\n\n    return {\n        min: new Point(minx, miny),\n        max: new Point(maxx, maxy)\n    };\n}\n\nfunction transformAabbToTile(min: Point, max: Point, id: UnwrappedTileID): {min: Point, max: Point} {\n    const tiles = 1 << id.canonical.z;\n\n    const minx = ((min.x - id.wrap) * tiles - id.canonical.x) * EXTENT;\n    const maxx = ((max.x - id.wrap) * tiles - id.canonical.x) * EXTENT;\n    const miny = (min.y * tiles - id.canonical.y) * EXTENT;\n    const maxy = (max.y * tiles - id.canonical.y) * EXTENT;\n\n    return {\n        min: new Point(minx, miny),\n        max: new Point(maxx, maxy)\n    };\n}\n\nfunction footprintTrianglesIntersect(footprint: Footprint, vertices: Array<Point>, indices: Array<number> | Uint16Array, indexOffset: number, indexCount: number, baseVertex: number, padding: number): boolean {\n    const fpIndices = footprint.indices;\n    const fpVertices = footprint.vertices;\n    const candidateTriangles = [];\n\n    for (let i = indexOffset; i < indexOffset + indexCount; i += 3) {\n        const a = vertices[indices[i + 0] + baseVertex];\n        const b = vertices[indices[i + 1] + baseVertex];\n        const c = vertices[indices[i + 2] + baseVertex];\n\n        const mnx = Math.min(a.x, b.x, c.x);\n        const mxx = Math.max(a.x, b.x, c.x);\n        const mny = Math.min(a.y, b.y, c.y);\n        const mxy = Math.max(a.y, b.y, c.y);\n\n        candidateTriangles.length = 0;\n        footprint.grid.query(new Point(mnx, mny), new Point(mxx, mxy), candidateTriangles);\n\n        for (let j = 0; j < candidateTriangles.length; j++) {\n            const triIdx = candidateTriangles[j];\n            const v0 = fpVertices[fpIndices[triIdx * 3 + 0]];\n            const v1 = fpVertices[fpIndices[triIdx * 3 + 1]];\n            const v2 = fpVertices[fpIndices[triIdx * 3 + 2]];\n\n            if (triangleIntersectsTriangle(v0, v1, v2, a, b, c, padding)) {\n                return true;\n            }\n        }\n    }\n\n    return false;\n}\n\nfunction footprintsIntersect(a: Footprint, aTile: UnwrappedTileID, b: Footprint, bTile: UnwrappedTileID): boolean {\n    if (!a || !b) {\n        return false;\n    }\n\n    let queryVertices = a.vertices;\n\n    // Convert vertices of the smaller footprint to the coordinate space of the larger one\n    if (!aTile.canonical.equals(bTile.canonical) || aTile.wrap !== bTile.wrap) {\n        if (b.vertices.length < a.vertices.length) {\n            return footprintsIntersect(b, bTile, a, aTile);\n        }\n\n        const srcId = aTile.canonical;\n        const dstId = bTile.canonical;\n        const zDiff = Math.pow(2.0, dstId.z - srcId.z);\n\n        queryVertices = a.vertices.map(v => {\n            const x = (v.x + srcId.x * EXTENT) * zDiff - dstId.x * EXTENT;\n            const y = (v.y + srcId.y * EXTENT) * zDiff - dstId.y * EXTENT;\n            return new Point(x, y);\n        });\n    }\n\n    return footprintTrianglesIntersect(b, queryVertices, a.indices, 0, a.indices.length, 0, 0);\n}\n\nexport type {TileFootprint, FootprintSource, Region};\nexport {ReplacementSource, regionsEquals, footprintTrianglesIntersect};\n","// @flow\n\nimport {vec3} from 'gl-matrix';\nimport {number as interpolate} from '../style-spec/util/interpolate.js';\nimport {clamp} from '../util/util.js';\n\nimport type DEMData from \"./dem_data.js\";\nimport type {Vec3} from 'gl-matrix';\n\nclass MipLevel {\n    size: number;\n    minimums: Array<number>;\n    maximums: Array<number>;\n    leaves: Array<number>;\n\n    constructor(size_: number) {\n        this.size = size_;\n        this.minimums = [];\n        this.maximums = [];\n        this.leaves = [];\n    }\n\n    getElevation(x: number, y: number): { min: number, max: number} {\n        const idx = this.toIdx(x, y);\n        return {\n            min: this.minimums[idx],\n            max: this.maximums[idx]\n        };\n    }\n\n    isLeaf(x: number, y: number): number {\n        return this.leaves[this.toIdx(x, y)];\n    }\n\n    toIdx(x: number, y: number): number {\n        return y * this.size + x;\n    }\n}\n\nfunction aabbRayIntersect(min: Vec3, max: Vec3, pos: Vec3, dir: Vec3): ?number {\n    let tMin = 0;\n    let tMax = Number.MAX_VALUE;\n\n    const epsilon = 1e-15;\n\n    for (let i = 0; i < 3; i++) {\n        if (Math.abs(dir[i]) < epsilon) {\n            // Parallel ray\n            if (pos[i] < min[i] || pos[i] > max[i])\n                return null;\n        } else {\n            const ood = 1.0 / dir[i];\n            let t1 = (min[i] - pos[i]) * ood;\n            let t2 = (max[i] - pos[i]) * ood;\n            if (t1 > t2) {\n                const temp = t1;\n                t1 = t2;\n                t2 = temp;\n            }\n            if (t1 > tMin)\n                tMin = t1;\n            if (t2 < tMax)\n                tMax = t2;\n            if (tMin > tMax)\n                return null;\n        }\n    }\n\n    return tMin;\n}\n\nfunction triangleRayIntersect(ax: number, ay: number, az: number, bx: number, by: number, bz: number, cx: number, cy: number, cz: number, pos: Vec3, dir: Vec3): ?number {\n    // Compute barycentric coordinates u and v to find the intersection\n    const abX = bx - ax;\n    const abY = by - ay;\n    const abZ = bz - az;\n\n    const acX = cx - ax;\n    const acY = cy - ay;\n    const acZ = cz - az;\n\n    // pvec = cross(dir, a), det = dot(ab, pvec)\n    const pvecX = dir[1] * acZ - dir[2] * acY;\n    const pvecY = dir[2] * acX - dir[0] * acZ;\n    const pvecZ = dir[0] * acY - dir[1] * acX;\n    const det = abX * pvecX + abY * pvecY + abZ * pvecZ;\n\n    if (Math.abs(det) < 1e-15)\n        return null;\n\n    const invDet = 1.0 / det;\n    const tvecX = pos[0] - ax;\n    const tvecY = pos[1] - ay;\n    const tvecZ = pos[2] - az;\n    const u = (tvecX * pvecX + tvecY * pvecY + tvecZ * pvecZ) * invDet;\n\n    if (u < 0.0 || u > 1.0)\n        return null;\n\n    // qvec = cross(tvec, ab)\n    const qvecX = tvecY * abZ - tvecZ * abY;\n    const qvecY = tvecZ * abX - tvecX * abZ;\n    const qvecZ = tvecX * abY - tvecY * abX;\n    const v = (dir[0] * qvecX + dir[1] * qvecY + dir[2] * qvecZ) * invDet;\n\n    if (v < 0.0 || u + v > 1.0)\n        return null;\n\n    return (acX * qvecX + acY * qvecY + acZ * qvecZ) * invDet;\n}\n\nfunction frac(v: number, lo: number, hi: number) {\n    return (v - lo) / (hi - lo);\n}\n\nfunction decodeBounds(x: number, y: number, depth: number, boundsMinx: number, boundsMiny: number, boundsMaxx: number, boundsMaxy: number, outMin: Array<number>, outMax: Array<number>) {\n    const scale = 1 << depth;\n    const rangex = boundsMaxx - boundsMinx;\n    const rangey = boundsMaxy - boundsMiny;\n\n    const minX = (x + 0) / scale * rangex + boundsMinx;\n    const maxX = (x + 1) / scale * rangex + boundsMinx;\n    const minY = (y + 0) / scale * rangey + boundsMiny;\n    const maxY = (y + 1) / scale * rangey + boundsMiny;\n\n    outMin[0] = minX;\n    outMin[1] = minY;\n    outMax[0] = maxX;\n    outMax[1] = maxY;\n}\n\n// A small padding value is used with bounding boxes to extend the bottom below sea level\nconst aabbSkirtPadding = 100;\n\n// A sparse min max quad tree for performing accelerated queries against dem elevation data.\n// Each tree node stores the minimum and maximum elevation of its children nodes and a flag whether the node is a leaf.\n// Node data is stored in non-interleaved arrays where the root is at index 0.\nexport default class DemMinMaxQuadTree {\n    maximums: Array<number>;\n    minimums: Array<number>;\n    leaves: Array<number>;\n    childOffsets: Array<number>;\n    nodeCount: number;\n    dem: DEMData;\n    _siblingOffset: Array<Array<number>>;\n\n    constructor(dem_: DEMData) {\n        this.maximums = [];\n        this.minimums = [];\n        this.leaves = [];\n        this.childOffsets = [];\n        this.nodeCount = 0;\n        this.dem = dem_;\n\n        // Precompute the order of 4 sibling nodes in the memory. Top-left, top-right, bottom-left, bottom-right\n        this._siblingOffset = [\n            [0, 0],\n            [1, 0],\n            [0, 1],\n            [1, 1]\n        ];\n\n        if (!this.dem)\n            return;\n\n        const mips = buildDemMipmap(this.dem);\n        const maxLvl = mips.length - 1;\n\n        // Create the root node\n        const rootMip = mips[maxLvl];\n        const min = rootMip.minimums;\n        const max = rootMip.maximums;\n        const leaves = rootMip.leaves;\n        this._addNode(min[0], max[0], leaves[0]);\n\n        // Construct the rest of the tree recursively\n        this._construct(mips, 0, 0, maxLvl, 0);\n    }\n\n    // Performs raycast against the tree root only. Min and max coordinates defines the size of the root node\n    raycastRoot(minx: number, miny: number, maxx: number, maxy: number, p: Vec3, d: Vec3, exaggeration: number = 1): ?number {\n        const min = [minx, miny, -aabbSkirtPadding];\n        const max = [maxx, maxy, this.maximums[0] * exaggeration];\n        return aabbRayIntersect(min, max, p, d);\n    }\n\n    raycast(rootMinx: number, rootMiny: number, rootMaxx: number, rootMaxy: number, p: Vec3, d: Vec3, exaggeration: number = 1): ?number {\n        if (!this.nodeCount)\n            return null;\n\n        const t = this.raycastRoot(rootMinx, rootMiny, rootMaxx, rootMaxy, p, d, exaggeration);\n        if (t == null)\n            return null;\n\n        const tHits = [];\n        const sortedHits = [];\n        const boundsMin = [];\n        const boundsMax = [];\n\n        const stack = [{\n            idx: 0,\n            t,\n            nodex: 0,\n            nodey: 0,\n            depth: 0\n        }];\n\n        // Traverse the tree until something is hit or the ray escapes\n        while (stack.length > 0) {\n            const {idx, t, nodex, nodey, depth} = stack.pop();\n\n            if (this.leaves[idx]) {\n                // Create 2 triangles to approximate the surface plane for more precise tests\n                decodeBounds(nodex, nodey, depth, rootMinx, rootMiny, rootMaxx, rootMaxy, boundsMin, boundsMax);\n\n                const scale = 1 << depth;\n                const minxUv = (nodex + 0) / scale;\n                const maxxUv = (nodex + 1) / scale;\n                const minyUv = (nodey + 0) / scale;\n                const maxyUv = (nodey + 1) / scale;\n\n                // 4 corner points A, B, C and D defines the (quad) area covered by this node\n                const az = sampleElevation(minxUv, minyUv, this.dem) * exaggeration;\n                const bz = sampleElevation(maxxUv, minyUv, this.dem) * exaggeration;\n                const cz = sampleElevation(maxxUv, maxyUv, this.dem) * exaggeration;\n                const dz = sampleElevation(minxUv, maxyUv, this.dem) * exaggeration;\n\n                const t0: any = triangleRayIntersect(\n                    boundsMin[0], boundsMin[1], az,     // A\n                    boundsMax[0], boundsMin[1], bz,     // B\n                    boundsMax[0], boundsMax[1], cz,     // C\n                    p, d);\n\n                const t1: any = triangleRayIntersect(\n                    boundsMax[0], boundsMax[1], cz,\n                    boundsMin[0], boundsMax[1], dz,\n                    boundsMin[0], boundsMin[1], az,\n                    p, d);\n\n                const tMin = Math.min(\n                    t0 !== null ? t0 : Number.MAX_VALUE,\n                    t1 !== null ? t1 : Number.MAX_VALUE);\n\n                // The ray might go below the two surface triangles but hit one of the sides.\n                // This covers the case of skirt geometry between two dem tiles of different zoom level\n                if (tMin === Number.MAX_VALUE) {\n                    const hitPos = vec3.scaleAndAdd([], p, d, t);\n                    const fracx = frac(hitPos[0], boundsMin[0], boundsMax[0]);\n                    const fracy = frac(hitPos[1], boundsMin[1], boundsMax[1]);\n\n                    if (bilinearLerp(az, bz, dz, cz, fracx, fracy) >= hitPos[2])\n                        return t;\n                } else {\n                    return tMin;\n                }\n\n                continue;\n            }\n\n            // Perform intersection tests agains each of the 4 child nodes and store results from closest to furthest.\n            let hitCount = 0;\n\n            for (let i = 0; i < this._siblingOffset.length; i++) {\n\n                const childNodeX = (nodex << 1) + this._siblingOffset[i][0];\n                const childNodeY = (nodey << 1) + this._siblingOffset[i][1];\n\n                // Decode node aabb from the morton code\n                decodeBounds(childNodeX, childNodeY, depth + 1, rootMinx, rootMiny, rootMaxx, rootMaxy, boundsMin, boundsMax);\n\n                boundsMin[2] = -aabbSkirtPadding;\n                boundsMax[2] = this.maximums[this.childOffsets[idx] + i] * exaggeration;\n\n                const result = aabbRayIntersect(boundsMin, boundsMax, p, d);\n                if (result != null) {\n                    // Build the result list from furthest to closest hit.\n                    // The order will be inversed when building the stack\n                    const tHit: number = result;\n                    tHits[i] = tHit;\n\n                    let added = false;\n                    for (let j = 0; j < hitCount && !added; j++) {\n                        if (tHit >= tHits[sortedHits[j]]) {\n                            sortedHits.splice(j, 0, i);\n                            added = true;\n                        }\n                    }\n                    if (!added)\n                        sortedHits[hitCount] = i;\n                    hitCount++;\n                }\n            }\n\n            // Continue recursion from closest to furthest\n            for (let i = 0; i < hitCount; i++) {\n                const hitIdx = sortedHits[i];\n                stack.push({\n                    idx: this.childOffsets[idx] + hitIdx,\n                    t: tHits[hitIdx],\n                    nodex: (nodex << 1) + this._siblingOffset[hitIdx][0],\n                    nodey: (nodey << 1) + this._siblingOffset[hitIdx][1],\n                    depth: depth + 1\n                });\n            }\n        }\n\n        return null;\n    }\n\n    _addNode(min: number, max: number, leaf: number): number {\n        this.minimums.push(min);\n        this.maximums.push(max);\n        this.leaves.push(leaf);\n        this.childOffsets.push(0);\n        return this.nodeCount++;\n    }\n\n    _construct(mips: Array<MipLevel>, x: number, y: number, lvl: number, parentIdx: number) {\n        if (mips[lvl].isLeaf(x, y) === 1) {\n            return;\n        }\n\n        // Update parent offset\n        if (!this.childOffsets[parentIdx])\n            this.childOffsets[parentIdx] = this.nodeCount;\n\n        // Construct all 4 children and place them next to each other in memory\n        const childLvl = lvl - 1;\n        const childMip = mips[childLvl];\n\n        let leafMask = 0;\n        let firstNodeIdx = 0;\n\n        for (let i = 0; i < this._siblingOffset.length; i++) {\n            const childX = x * 2 + this._siblingOffset[i][0];\n            const childY = y * 2 + this._siblingOffset[i][1];\n\n            const elevation = childMip.getElevation(childX, childY);\n            const leaf = childMip.isLeaf(childX, childY);\n            const nodeIdx = this._addNode(elevation.min, elevation.max, leaf);\n\n            if (leaf)\n                leafMask |= 1 << i;\n            if (!firstNodeIdx)\n                firstNodeIdx = nodeIdx;\n        }\n\n        // Continue construction of the tree recursively to non-leaf nodes.\n        for (let i = 0; i < this._siblingOffset.length; i++) {\n            if (!(leafMask & (1 << i))) {\n                this._construct(mips, x * 2 + this._siblingOffset[i][0], y * 2 + this._siblingOffset[i][1], childLvl, firstNodeIdx + i);\n            }\n        }\n    }\n}\n\nfunction bilinearLerp(p00: any, p10: any, p01: any, p11: any, x: number, y: number): any {\n    return interpolate(\n        interpolate(p00, p01, y),\n        interpolate(p10, p11, y),\n        x);\n}\n\n// Sample elevation in normalized uv-space ([0, 0] is the top left)\n// This function does not account for exaggeration\nexport function sampleElevation(fx: number, fy: number, dem: DEMData): number {\n    // Sample position in texels\n    const demSize = dem.dim;\n    const x = clamp(fx * demSize - 0.5, 0, demSize - 1);\n    const y = clamp(fy * demSize - 0.5, 0, demSize - 1);\n\n    // Compute 4 corner points for bilinear interpolation\n    const ixMin = Math.floor(x);\n    const iyMin = Math.floor(y);\n    const ixMax = Math.min(ixMin + 1, demSize - 1);\n    const iyMax = Math.min(iyMin + 1, demSize - 1);\n\n    const e00 = dem.get(ixMin, iyMin);\n    const e10 = dem.get(ixMax, iyMin);\n    const e01 = dem.get(ixMin, iyMax);\n    const e11 = dem.get(ixMax, iyMax);\n\n    return bilinearLerp(e00, e10, e01, e11, x - ixMin, y - iyMin);\n}\n\nexport function buildDemMipmap(dem: DEMData): Array<MipLevel> {\n    const demSize = dem.dim;\n\n    const elevationDiffThreshold = 5;\n    const texelSizeOfMip0 = 8;\n    const levelCount = Math.ceil(Math.log2(demSize / texelSizeOfMip0));\n    const mips: Array<MipLevel> = [];\n\n    let blockCount = Math.ceil(Math.pow(2, levelCount));\n    const blockSize = 1 / blockCount;\n\n    const blockSamples = (x: number, y: number, size: number, exclusive: boolean, outBounds: Array<number>) => {\n        const padding = exclusive ? 1 : 0;\n        const minx = x * size;\n        const maxx = (x + 1) * size - padding;\n        const miny = y * size;\n        const maxy = (y + 1) * size - padding;\n\n        outBounds[0] = minx;\n        outBounds[1] = miny;\n        outBounds[2] = maxx;\n        outBounds[3] = maxy;\n    };\n\n    // The first mip (0) is built by sampling 4 corner points of each 8x8 texel block\n    let mip = new MipLevel(blockCount);\n    const blockBounds = [];\n\n    for (let idx = 0; idx < blockCount * blockCount; idx++) {\n        const y = Math.floor(idx / blockCount);\n        const x = idx % blockCount;\n\n        blockSamples(x, y, blockSize, false, blockBounds);\n\n        const e0 = sampleElevation(blockBounds[0], blockBounds[1], dem);    // minx, miny\n        const e1 = sampleElevation(blockBounds[2], blockBounds[1], dem);    // maxx, miny\n        const e2 = sampleElevation(blockBounds[2], blockBounds[3], dem);    // maxx, maxy\n        const e3 = sampleElevation(blockBounds[0], blockBounds[3], dem);    // minx, maxy\n\n        mip.minimums.push(Math.min(e0, e1, e2, e3));\n        mip.maximums.push(Math.max(e0, e1, e2, e3));\n        mip.leaves.push(1);\n    }\n\n    mips.push(mip);\n\n    // Construct the rest of the mip levels from bottom to up\n    for (blockCount /= 2; blockCount >= 1; blockCount /= 2) {\n        const prevMip = mips[mips.length - 1];\n\n        mip = new MipLevel(blockCount);\n\n        for (let idx = 0; idx < blockCount * blockCount; idx++) {\n            const y = Math.floor(idx / blockCount);\n            const x = idx % blockCount;\n\n            // Sample elevation of all 4 children mip texels. 4 leaf nodes can be concatenated into a single\n            // leaf if the total elevation difference is below the threshold value\n            blockSamples(x, y, 2, true, blockBounds);\n\n            const e0 = prevMip.getElevation(blockBounds[0], blockBounds[1]);\n            const e1 = prevMip.getElevation(blockBounds[2], blockBounds[1]);\n            const e2 = prevMip.getElevation(blockBounds[2], blockBounds[3]);\n            const e3 = prevMip.getElevation(blockBounds[0], blockBounds[3]);\n\n            const l0 = prevMip.isLeaf(blockBounds[0], blockBounds[1]);\n            const l1 = prevMip.isLeaf(blockBounds[2], blockBounds[1]);\n            const l2 = prevMip.isLeaf(blockBounds[2], blockBounds[3]);\n            const l3 = prevMip.isLeaf(blockBounds[0], blockBounds[3]);\n\n            const minElevation = Math.min(e0.min, e1.min, e2.min, e3.min);\n            const maxElevation = Math.max(e0.max, e1.max, e2.max, e3.max);\n            const canConcatenate = l0 && l1 && l2 && l3;\n\n            mip.maximums.push(maxElevation);\n            mip.minimums.push(minElevation);\n\n            if (maxElevation - minElevation <= elevationDiffThreshold && canConcatenate) {\n                // All samples have uniform elevation. Mark this as a leaf\n                mip.leaves.push(1);\n            } else {\n                mip.leaves.push(0);\n            }\n        }\n\n        mips.push(mip);\n    }\n\n    return mips;\n}\n","// @flow\nimport {RGBAImage, Float32Image} from '../util/image.js';\n\nimport {warnOnce, clamp} from '../util/util.js';\nimport {register} from '../util/web_worker_transfer.js';\nimport DemMinMaxQuadTree from './dem_tree.js';\nimport assert from 'assert';\nimport {CanonicalTileID} from '../source/tile_id.js';\nimport browser from '../util/browser.js';\n\nimport type {DEMSourceEncoding} from '../source/worker_source.js';\n\n// DEMData is a data structure for decoding, backfilling, and storing elevation data for processing in the hillshade shaders\n// data can be populated either from a pngraw image tile or from serliazed data sent back from a worker. When data is initially\n// loaded from a image tile, we decode the pixel values using the appropriate decoding formula, but we store the\n// elevation data as an Int32 value. we add 65536 (2^16) to eliminate negative values and enable the use of\n// integer overflow when creating the texture used in the hillshadePrepare step.\n\n// DEMData also handles the backfilling of data from a tile's neighboring tiles. This is necessary because we use a pixel's 8\n// surrounding pixel values to compute the slope at that pixel, and we cannot accurately calculate the slope at pixels on a\n// tile's edge without backfilling from neighboring tiles.\n\nconst unpackVectors = {\n    mapbox: [6553.6, 25.6, 0.1, 10000.0],\n    terrarium: [256.0, 1.0, 1.0 / 256.0, 32768.0]\n};\n\nfunction unpackMapbox(r: number, g: number, b: number): number {\n    // unpacking formula for mapbox.terrain-rgb:\n    // https://www.mapbox.com/help/access-elevation-data/#mapbox-terrain-rgb\n    return ((r * 256 * 256 + g * 256.0 + b) / 10.0 - 10000.0);\n}\n\nfunction unpackTerrarium(r: number, g: number, b: number): number {\n    // unpacking formula for mapzen terrarium:\n    // https://aws.amazon.com/public-datasets/terrain/\n    return ((r * 256 + g + b / 256) - 32768.0);\n}\n\nexport default class DEMData {\n    uid: number;\n    stride: number;\n    dim: number;\n    borderReady: boolean;\n    _tree: DemMinMaxQuadTree;\n    _modifiedForSources: {[string]: Array<CanonicalTileID>};\n    _timestamp: number;\n    pixels: Uint8Array;\n    floatView: Float32Array;\n    get tree(): DemMinMaxQuadTree {\n        if (!this._tree) this._buildQuadTree();\n        return this._tree;\n    }\n\n    // RGBAImage data has uniform 1px padding on all sides: square tile edge size defines stride\n    // and dim is calculated as stride - 2.\n    constructor(uid: number, data: ImageData, sourceEncoding: DEMSourceEncoding, borderReady: boolean = false): void {\n        // debugger;\n        this.uid = uid;\n        if (data.height !== data.width) throw new RangeError('DEM tiles must be square');\n        if (sourceEncoding && sourceEncoding !== \"mapbox\" && sourceEncoding !== \"terrarium\") return warnOnce(\n            `\"${sourceEncoding}\" is not a valid encoding type. Valid types include \"mapbox\" and \"terrarium\".`\n        );\n        this.stride = data.height;\n        const dim = this.dim = data.height - 2;\n        const values = new Uint32Array(data.data.buffer);\n        this.pixels = new Uint8Array(data.data.buffer);\n        this.floatView = new Float32Array(data.data.buffer);\n        this.borderReady = borderReady;\n        this._modifiedForSources = {};\n\n        if (!borderReady) {\n            // in order to avoid flashing seams between tiles, here we are initially populating a 1px border of pixels around the image\n            // with the data of the nearest pixel from the image. this data is eventually replaced when the tile's neighboring\n            // tiles are loaded and the accurate data can be backfilled using DEMData#backfillBorder\n            for (let x = 0; x < dim; x++) {\n                // left vertical border\n                values[this._idx(-1, x)] = values[this._idx(0, x)];\n                // right vertical border\n                values[this._idx(dim, x)] = values[this._idx(dim - 1, x)];\n                // left horizontal border\n                values[this._idx(x, -1)] = values[this._idx(x, 0)];\n                // right horizontal border\n                values[this._idx(x, dim)] = values[this._idx(x, dim - 1)];\n            }\n            // corners\n            values[this._idx(-1, -1)] = values[this._idx(0, 0)];\n            values[this._idx(dim, -1)] = values[this._idx(dim - 1, 0)];\n            values[this._idx(-1, dim)] = values[this._idx(0, dim - 1)];\n            values[this._idx(dim, dim)] = values[this._idx(dim - 1, dim - 1)];\n        }\n\n        // Convert to float\n        const unpack = sourceEncoding === \"terrarium\" ? unpackTerrarium : unpackMapbox;\n        for (let i = 0; i < values.length; ++i) {\n            const byteIdx = i * 4;\n            this.floatView[i] = unpack(this.pixels[byteIdx], this.pixels[byteIdx + 1], this.pixels[byteIdx + 2]);\n        }\n\n        this._timestamp = browser.now();\n    }\n\n    _buildQuadTree() {\n        assert(!this._tree);\n        // Construct the implicit sparse quad tree by traversing mips from top to down\n        this._tree = new DemMinMaxQuadTree(this);\n    }\n\n    get(x: number, y: number, clampToEdge: boolean = false): number {\n        if (clampToEdge) {\n            x = clamp(x, -1, this.dim);\n            y = clamp(y, -1, this.dim);\n        }\n        const idx = this._idx(x, y);\n\n        return this.floatView[idx];\n    }\n\n    set(x: number, y: number, v: number): number {\n        const idx = this._idx(x, y);\n        const p = this.floatView[idx];\n        this.floatView[idx] = v;\n        return v - p;\n    }\n\n    static getUnpackVector(encoding: DEMSourceEncoding): [number, number, number, number] {\n        return unpackVectors[encoding];\n    }\n\n    _idx(x: number, y: number): number {\n        if (x < -1 || x >= this.dim + 1 || y < -1 || y >= this.dim + 1) throw new RangeError('out of range source coordinates for DEM data');\n        return (y + 1) * this.stride + (x + 1);\n    }\n\n    static pack(altitude: number, encoding: DEMSourceEncoding): [number, number, number, number] {\n        const color = [0, 0, 0, 0];\n        const vector = DEMData.getUnpackVector(encoding);\n        let v = Math.floor((altitude + vector[3]) / vector[2]);\n        color[2] = v % 256;\n        v = Math.floor(v / 256);\n        color[1] = v % 256;\n        v = Math.floor(v / 256);\n        color[0] = v;\n        return color;\n    }\n\n    getPixels(): RGBAImage | Float32Image {\n        return new Float32Image({width: this.stride, height: this.stride}, this.pixels);\n    }\n\n    backfillBorder(borderTile: DEMData, dx: number, dy: number): void {\n        if (this.dim !== borderTile.dim) throw new Error('dem dimension mismatch');\n\n        let xMin = dx * this.dim,\n            xMax = dx * this.dim + this.dim,\n            yMin = dy * this.dim,\n            yMax = dy * this.dim + this.dim;\n\n        switch (dx) {\n        case -1:\n            xMin = xMax - 1;\n            break;\n        case 1:\n            xMax = xMin + 1;\n            break;\n        }\n\n        switch (dy) {\n        case -1:\n            yMin = yMax - 1;\n            break;\n        case 1:\n            yMax = yMin + 1;\n            break;\n        }\n\n        const ox = -dx * this.dim;\n        const oy = -dy * this.dim;\n        for (let y = yMin; y < yMax; y++) {\n            for (let x = xMin; x < xMax; x++) {\n                const i = 4 * this._idx(x, y);\n                const j = 4 * this._idx(x + ox, y + oy);\n                this.pixels[i + 0] = borderTile.pixels[j + 0];\n                this.pixels[i + 1] = borderTile.pixels[j + 1];\n                this.pixels[i + 2] = borderTile.pixels[j + 2];\n                this.pixels[i + 3] = borderTile.pixels[j + 3];\n            }\n        }\n    }\n\n    onDeserialize() {\n        if (this._tree) this._tree.dem = this;\n    }\n}\n\nregister(DEMData, 'DEMData');\nregister(DemMinMaxQuadTree, 'DemMinMaxQuadTree', {omit: ['dem']});\n","// @flow\n\nimport MercatorCoordinate, {mercatorZfromAltitude} from '../geo/mercator_coordinate.js';\nimport DEMData from '../data/dem_data.js';\nimport {number as interpolate} from '../style-spec/util/interpolate.js';\nimport EXTENT from '../style-spec/data/extent.js';\nimport {vec3} from 'gl-matrix';\nimport Point from '@mapbox/point-geometry';\nimport {OverscaledTileID} from '../source/tile_id.js';\n\nimport type {Vec4, Vec3} from 'gl-matrix';\nimport type SourceCache from '../source/source_cache.js';\nimport type Projection from '../geo/projection/projection.js';\nimport type Tile from '../source/tile.js';\nimport type {VecType} from '../types/vec-type.js';\n\n/**\n * Options common to {@link Map#queryTerrainElevation} and {@link Map#unproject3d}, used to control how elevation\n * data is returned.\n *\n * @typedef {Object} ElevationQueryOptions\n * @property {boolean} exaggerated When set to `true` returns the value of the elevation with the terrains `exaggeration` on the style already applied,\n * when`false` it returns the raw value of the underlying data without styling applied.\n */\nexport type ElevationQueryOptions = {\n    exaggerated: boolean\n};\n\n/**\n * Provides access to elevation data from raster-dem source cache.\n */\nexport class Elevation {\n\n    /**\n     * Helper that checks whether DEM data is available at a given mercator coordinate.\n     * @param {MercatorCoordinate} point Mercator coordinate of the point to check against.\n     * @returns {boolean} `true` indicating whether the data is available at `point`, and `false` otherwise.\n     */\n    isDataAvailableAtPoint(point: MercatorCoordinate): boolean {\n        const sourceCache = this._source();\n        if (this.isUsingMockSource() || !sourceCache || point.y < 0.0 || point.y > 1.0) {\n            return false;\n        }\n\n        const cache: SourceCache = sourceCache;\n        const z = cache.getSource().maxzoom;\n        const tiles = 1 << z;\n        const wrap = Math.floor(point.x);\n        const px = point.x - wrap;\n        const x = Math.floor(px * tiles);\n        const y = Math.floor(point.y * tiles);\n        const demTile = this.findDEMTileFor(new OverscaledTileID(z, wrap, z, x, y));\n\n        return !!(demTile && demTile.dem);\n    }\n\n    /**\n     * Helper around `getAtPoint` that guarantees that a numeric value is returned.\n     * @param {MercatorCoordinate} point Mercator coordinate of the point.\n     * @param {number} defaultIfNotLoaded Value that is returned if the dem tile of the provided point is not loaded.\n     * @returns {number} Altitude in meters.\n     */\n    getAtPointOrZero(point: MercatorCoordinate, defaultIfNotLoaded: number = 0): number {\n        return this.getAtPoint(point, defaultIfNotLoaded) || 0;\n    }\n\n    /**\n     * Altitude above sea level in meters at specified point.\n     * @param {MercatorCoordinate} point Mercator coordinate of the point.\n     * @param {number} defaultIfNotLoaded Value that is returned if the DEM tile of the provided point is not loaded.\n     * @param {boolean} exaggerated `true` if styling exaggeration should be applied to the resulting elevation.\n     * @returns {number} Altitude in meters.\n     * If there is no loaded tile that carries information for the requested\n     * point elevation, returns `defaultIfNotLoaded`.\n     * Doesn't invoke network request to fetch the data.\n     */\n    getAtPoint(point: MercatorCoordinate, defaultIfNotLoaded: ?number, exaggerated: boolean = true): ?number {\n        if (this.isUsingMockSource()) {\n            return null;\n        }\n\n        // Force a cast to null for both null and undefined\n        if (defaultIfNotLoaded == null) defaultIfNotLoaded = null;\n\n        const src = this._source();\n        if (!src) return defaultIfNotLoaded;\n        if (point.y < 0.0 || point.y > 1.0) {\n            return defaultIfNotLoaded;\n        }\n        const cache: SourceCache = src;\n        const z = cache.getSource().maxzoom;\n        const tiles = 1 << z;\n        const wrap = Math.floor(point.x);\n        const px = point.x - wrap;\n        const tileID = new OverscaledTileID(z, wrap, z, Math.floor(px * tiles), Math.floor(point.y * tiles));\n        const demTile = this.findDEMTileFor(tileID);\n        if (!(demTile && demTile.dem)) { return defaultIfNotLoaded; }\n        const dem: DEMData = demTile.dem;\n        const tilesAtTileZoom = 1 << demTile.tileID.canonical.z;\n        const x = (px * tilesAtTileZoom - demTile.tileID.canonical.x) * dem.dim;\n        const y = (point.y * tilesAtTileZoom - demTile.tileID.canonical.y) * dem.dim;\n        const i = Math.floor(x);\n        const j = Math.floor(y);\n        const exaggeration = exaggerated ? this.exaggeration() : 1;\n\n        return exaggeration * interpolate(\n            interpolate(dem.get(i, j), dem.get(i, j + 1), y - j),\n            interpolate(dem.get(i + 1, j), dem.get(i + 1, j + 1), y - j),\n            x - i);\n    }\n\n    /*\n     * x and y are offset within tile, in 0 .. EXTENT coordinate space.\n     */\n    getAtTileOffset(tileID: OverscaledTileID, x: number, y: number): number {\n        const tilesAtTileZoom = 1 << tileID.canonical.z;\n        return this.getAtPointOrZero(new MercatorCoordinate(\n            tileID.wrap + (tileID.canonical.x + x / EXTENT) / tilesAtTileZoom,\n            (tileID.canonical.y + y / EXTENT) / tilesAtTileZoom));\n    }\n\n    getAtTileOffsetFunc(tileID: OverscaledTileID, lat: number, worldSize: number, projection: Projection): (Point) => VecType {\n        return ((p: Point) => {\n            const elevation = this.getAtTileOffset(tileID, p.x, p.y);\n            const upVector = projection.upVector(tileID.canonical, p.x, p.y);\n            const upVectorScale = projection.upVectorScale(tileID.canonical, lat, worldSize).metersToTile;\n            // $FlowFixMe can't yet resolve tuple vs array incompatibilities\n            vec3.scale(upVector, upVector, elevation * upVectorScale);\n            return upVector;\n        });\n    }\n\n    /*\n     * Batch fetch for multiple tile points: points holds input and return value:\n     * vec3's items on index 0 and 1 define x and y offset within tile, in [0 .. EXTENT]\n     * range, respectively. vec3 item at index 2 is output value, in meters.\n     * If a DEM tile that covers tileID is loaded, true is returned, otherwise false.\n     * Nearest filter sampling on dem data is done (no interpolation).\n     */\n    getForTilePoints(tileID: OverscaledTileID, points: Array<Vec3>, interpolated: ?boolean, useDemTile: ?Tile): boolean {\n        if (this.isUsingMockSource()) {\n            return false;\n        }\n\n        const helper = DEMSampler.create(this, tileID, useDemTile);\n        if (!helper) { return false; }\n\n        points.forEach(p => {\n            p[2] = this.exaggeration() * helper.getElevationAt(p[0], p[1], interpolated);\n        });\n        return true;\n    }\n\n    /**\n     * Get elevation minimum and maximum for tile identified by `tileID`.\n     * @param {OverscaledTileID} tileID The `tileId` is a sub tile (or covers the same space) of the DEM tile we read the information from.\n     * @returns {?{min: number, max: number}} The min and max elevation.\n     */\n    getMinMaxForTile(tileID: OverscaledTileID): ?{min: number, max: number} {\n        if (this.isUsingMockSource()) {\n            return null;\n        }\n\n        const demTile = this.findDEMTileFor(tileID);\n\n        if (!(demTile && demTile.dem)) {\n            return null;\n        }\n\n        const dem: DEMData = demTile.dem;\n        const tree = dem.tree;\n        const demTileID = demTile.tileID;\n        const scale = 1 << tileID.canonical.z - demTileID.canonical.z;\n        let xOffset = tileID.canonical.x / scale - demTileID.canonical.x;\n        let yOffset = tileID.canonical.y / scale - demTileID.canonical.y;\n        let index = 0; // Start from DEM tree root.\n        for (let i = 0; i < tileID.canonical.z - demTileID.canonical.z; i++) {\n            if (tree.leaves[index]) break;\n            xOffset *= 2;\n            yOffset *= 2;\n            const childOffset = 2 * Math.floor(yOffset) + Math.floor(xOffset);\n            index = tree.childOffsets[index] + childOffset;\n            xOffset = xOffset % 1;\n            yOffset = yOffset % 1;\n        }\n        return {min: this.exaggeration() * tree.minimums[index], max: this.exaggeration() * tree.maximums[index]};\n    }\n\n    /**\n     * Get elevation minimum below MSL for the visible tiles. This function accounts\n     * for terrain exaggeration and is conservative based on the maximum DEM error,\n     * do not expect accurate values from this function.\n     * If no negative elevation is visible, this function returns 0.\n     * @returns {number} The min elevation below sea level of all visible tiles.\n     */\n    getMinElevationBelowMSL(): number {\n        throw new Error('Pure virtual method called.');\n    }\n\n    /**\n     * Performs raycast against visible DEM tiles on the screen and returns the distance travelled along the ray.\n     * `x` & `y` components of the position are expected to be in normalized mercator coordinates [0, 1] and z in meters.\n     * @param {vec3} position The ray origin.\n     * @param {vec3} dir The ray direction.\n     * @param {number} exaggeration The terrain exaggeration.\n    */\n    raycast(_position: Vec3, _dir: Vec3, _exaggeration: number): ?number {\n        throw new Error('Pure virtual method called.');\n    }\n\n    /**\n     * Given a point on screen, returns 3D MercatorCoordinate on terrain.\n     * Helper function that wraps `raycast`.\n     *\n     * @param {Point} screenPoint Screen point in pixels in top-left origin coordinate system.\n     * @returns {vec4} If there is intersection with terrain, returns vec4(x, y, z, e), a\n     * 3D MercatorCoordinate's of intersection in its first 3 components, and elevation in meter in its 4th coordinate.\n     * Otherwise returns null.\n     */\n    pointCoordinate(_screenPoint: Point): ?Vec4 {\n        throw new Error('Pure virtual method called.');\n    }\n\n    /*\n     * Implementation provides SourceCache of raster-dem source type cache, in\n     * order to access already loaded cached tiles.\n     */\n    _source(): ?SourceCache {\n        throw new Error('Pure virtual method called.');\n    }\n\n    /*\n     * Whether the SourceCache instance is a mock source cache.\n     * This mock source cache is used solely for the Globe projection and with terrain disabled,\n     * where we only want to leverage the draping rendering pipeline without incurring DEM-tile\n     * download overhead. This function is useful to skip DEM processing as the mock data source\n     * placeholder contains only 0 height.\n     */\n    isUsingMockSource(): boolean {\n        throw new Error('Pure virtual method called.');\n    }\n\n    /*\n     * A multiplier defined by style as terrain exaggeration. Elevation provided\n     * by getXXXX methods is multiplied by this.\n     */\n    exaggeration(): number {\n        throw new Error('Pure virtual method called.');\n    }\n\n    /**\n     * Lookup DEM tile that corresponds to (covers) tileID.\n     * @private\n     */\n    findDEMTileFor(_: OverscaledTileID): ?Tile {\n        throw new Error('Pure virtual method called.');\n    }\n\n    /**\n     * Get list of DEM tiles used to render current frame.\n     * @private\n     */\n    get visibleDemTiles(): Array<Tile> {\n        throw new Error('Getter must be implemented in subclass.');\n    }\n\n    /**\n     * Get elevation minimum and maximum for tiles which are visible on the current frame.\n     */\n    getMinMaxForVisibleTiles(): ?{min: number, max: number} {\n        const visibleTiles = this.visibleDemTiles;\n        if (visibleTiles.length === 0) {\n            return null;\n        }\n\n        let found = false;\n        let min = Number.MAX_VALUE;\n        let max = Number.MIN_VALUE;\n        for (const tile of visibleTiles) {\n            const minmax = this.getMinMaxForTile(tile.tileID);\n            if (!minmax) {\n                continue;\n            }\n            min = Math.min(min, minmax.min);\n            max = Math.max(max, minmax.max);\n            found = true;\n        }\n\n        if (!found) {\n            return null;\n        }\n\n        return {min, max};\n    }\n}\n\n/**\n * Helper class computes and caches data required to lookup elevation offsets at the tile level.\n */\nexport class DEMSampler {\n    _demTile: Tile;\n    _dem: DEMData;\n    _scale: number;\n    _offset: [number, number];\n\n    constructor(demTile: Tile, scale: number, offset: [number, number]) {\n        this._demTile = demTile;\n        // demTile.dem will always exist because the factory method `create` does the check\n        // Make flow happy with a cast through any\n        this._dem = (((this._demTile.dem): any): DEMData);\n        this._scale = scale;\n        this._offset = offset;\n    }\n\n    static create(elevation: Elevation, tileID: OverscaledTileID, useDemTile: ?Tile): ?DEMSampler {\n        const demTile = useDemTile || elevation.findDEMTileFor(tileID);\n        if (!(demTile && demTile.dem)) { return; }\n        const dem: DEMData = demTile.dem;\n        const demTileID = demTile.tileID;\n        const scale = 1 << tileID.canonical.z - demTileID.canonical.z;\n        const xOffset = (tileID.canonical.x / scale - demTileID.canonical.x) * dem.dim;\n        const yOffset = (tileID.canonical.y / scale - demTileID.canonical.y) * dem.dim;\n        const k = dem.dim / EXTENT / scale;\n\n        return new DEMSampler(demTile, k, [xOffset, yOffset]);\n    }\n\n    tileCoordToPixel(x: number, y: number): Point {\n        const px = x * this._scale + this._offset[0];\n        const py = y * this._scale + this._offset[1];\n        const i = Math.floor(px);\n        const j = Math.floor(py);\n        return new Point(i, j);\n    }\n\n    getElevationAt(x: number, y: number, interpolated: ?boolean, clampToEdge: ?boolean): number {\n        const px = x * this._scale + this._offset[0];\n        const py = y * this._scale + this._offset[1];\n        const i = Math.floor(px);\n        const j = Math.floor(py);\n        const dem = this._dem;\n\n        clampToEdge = !!clampToEdge;\n\n        return interpolated ? interpolate(\n            interpolate(dem.get(i, j, clampToEdge), dem.get(i, j + 1, clampToEdge), py - j),\n            interpolate(dem.get(i + 1, j, clampToEdge), dem.get(i + 1, j + 1, clampToEdge), py - j),\n            px - i) :\n            dem.get(i, j, clampToEdge);\n    }\n\n    getElevationAtPixel(x: number, y: number, clampToEdge: ?boolean): number {\n        return this._dem.get(x, y, !!clampToEdge);\n    }\n\n    getMeterToDEM(lat: number): number {\n        return (1 << this._demTile.tileID.canonical.z) * mercatorZfromAltitude(1, lat) * this._dem.stride;\n    }\n}\n","// @flow\n\nimport {FillExtrusionGroundLayoutArray, FillExtrusionLayoutArray, FillExtrusionExtArray, FillExtrusionCentroidArray, FillExtrusionHiddenByLandmarkArray, PosArray} from '../array_types.js';\n\nimport {members as layoutAttributes, fillExtrusionGroundAttributes, centroidAttributes, fillExtrusionAttributesExt, hiddenByLandmarkAttributes} from './fill_extrusion_attributes.js';\nimport SegmentVector from '../segment.js';\nimport {ProgramConfigurationSet} from '../program_configuration.js';\nimport {TriangleIndexArray} from '../index_array_type.js';\nimport EXTENT from '../../style-spec/data/extent.js';\nimport earcut from 'earcut';\nimport {VectorTileFeature} from '@mapbox/vector-tile';\nconst vectorTileFeatureTypes = VectorTileFeature.types;\nimport classifyRings from '../../util/classify_rings.js';\nimport assert from 'assert';\nconst EARCUT_MAX_RINGS = 500;\nimport {register} from '../../util/web_worker_transfer.js';\nimport {hasPattern, addPatternDependencies} from './pattern_bucket_features.js';\nimport loadGeometry from '../load_geometry.js';\nimport toEvaluationFeature from '../evaluation_feature.js';\nimport EvaluationParameters from '../../style/evaluation_parameters.js';\nimport Point from '@mapbox/point-geometry';\nimport {number as interpolate} from '../../style-spec/util/interpolate.js';\nimport {lngFromMercatorX, latFromMercatorY, mercatorYfromLat, tileToMeter} from '../../geo/mercator_coordinate.js';\nimport {subdividePolygons} from '../../util/polygon_clipping.js';\nimport {ReplacementSource, regionsEquals, footprintTrianglesIntersect} from '../../../3d-style/source/replacement_source.js';\nimport {clamp} from '../../util/util.js';\nimport {earthRadius} from '../../geo/lng_lat.js';\nimport {Aabb, Frustum} from '../../util/primitives.js';\nimport {Elevation} from '../../terrain/elevation.js';\n\nimport type {Feature} from \"../../style-spec/expression\";\nimport type {ClippedPolygon} from '../../util/polygon_clipping.js';\nimport type {Vec3} from 'gl-matrix';\nimport type {CanonicalTileID, OverscaledTileID} from '../../source/tile_id.js';\nimport type {Segment} from '../segment.js';\nimport type {\n    Bucket,\n    BucketParameters,\n    BucketFeature,\n    IndexedFeature,\n    PopulateParameters\n} from '../bucket.js';\nimport type FillExtrusionStyleLayer from '../../style/style_layer/fill_extrusion_style_layer.js';\nimport type Context from '../../gl/context.js';\nimport type IndexBuffer from '../../gl/index_buffer.js';\nimport type VertexBuffer from '../../gl/vertex_buffer.js';\nimport type {FeatureStates} from '../../source/source_state.js';\nimport type {SpritePositions} from '../../util/image.js';\nimport type {ProjectionSpecification} from '../../style-spec/types.js';\nimport type {TileTransform} from '../../geo/projection/tile_transform.js';\nimport type {IVectorTileLayer} from '@mapbox/vector-tile';\n\nexport const fillExtrusionDefaultDataDrivenProperties: Array<string> = [\n    'fill-extrusion-base',\n    'fill-extrusion-height',\n    'fill-extrusion-color',\n    'fill-extrusion-pattern',\n    'fill-extrusion-flood-light-wall-radius'\n];\n\nexport const fillExtrusionGroundDataDrivenProperties: Array<string> = [\n    'fill-extrusion-flood-light-ground-radius'\n];\n\nconst FACTOR = Math.pow(2, 13);\nconst TANGENT_CUTOFF = 4;\nconst NORM = Math.pow(2, 15) - 1;\n\nconst QUAD_VERTS = 4;\nconst QUAD_TRIS = 2;\n// In flood lighting a line segment is extruded based on the flood light radius to form a quad.\n// The tile is divided into four regions (left, right, top and bottom).\n// As an example when a quad crosses the left border it belongs to the left region.\nconst TILE_REGIONS = 4;\n\nconst HIDDEN_CENTROID: Point = new Point(0, 1);\nexport const HIDDEN_BY_REPLACEMENT: number = 0x80000000;\n\n// Also declared in _prelude_terrain.vertex.glsl\n// Used to scale most likely elevation values to fit well in an uint16\n// (Elevation of Dead Sea + ELEVATION_OFFSET) * ELEVATION_SCALE is roughly 0\n// (Height of mt everest + ELEVATION_OFFSET) * ELEVATION_SCALE is roughly 64k\nexport const ELEVATION_SCALE = 7.0;\nexport const ELEVATION_OFFSET = 450;\n\nfunction addVertex(vertexArray: FillExtrusionLayoutArray, x: number, y: number, nxRatio: number, nySign: number, normalUp: number, top: number, e: number) {\n    vertexArray.emplaceBack(\n        // a_pos_normal_ed:\n        // Encode top and side/up normal using the least significant bits\n        (x << 1) + top,\n        (y << 1) + normalUp,\n        // dxdy is signed, encode quadrant info using the least significant bit\n        (Math.floor(nxRatio * FACTOR) << 1) + nySign,\n        // edgedistance (used for wrapping patterns around extrusion sides)\n        Math.round(e)\n    );\n}\n\nfunction addGroundVertex(vertexArray: FillExtrusionGroundLayoutArray, p: Point, q: Point, start: number, bottom: number, angle: number) {\n    vertexArray.emplaceBack(\n        p.x,\n        p.y,\n        (q.x << 1) + start,\n        (q.y << 1) + bottom,\n        angle\n    );\n}\n\nfunction addGlobeExtVertex(vertexArray: FillExtrusionExtArray, pos: {x: number, y: number, z: number}, normal: Vec3) {\n    const encode = 1 << 14;\n    vertexArray.emplaceBack(\n        pos.x, pos.y, pos.z,\n        normal[0] * encode, normal[1] * encode, normal[2] * encode);\n}\n\nclass FootprintSegment {\n    vertexOffset: number;\n    vertexCount: number;\n    indexOffset: number;\n    indexCount: number;\n    ringIndices: Array<number>;\n    constructor() {\n        this.vertexOffset = 0;\n        this.vertexCount = 0;\n        this.indexOffset = 0;\n        this.indexCount = 0;\n    }\n}\n\n// Stores centroid buffer content (one entry per feature as opposite to one entry per\n// vertex in the buffer). This information is used to do conflation vs 3d model layers.\n// PartData and BorderCentroidData are split because PartData is stored for every\n// bucket feature and BorderCentroidData only for features that intersect border.\nexport class PartData {\n    centroidXY: Point;\n    vertexArrayOffset: number;\n    vertexCount: number;\n    groundVertexArrayOffset: number;\n    groundVertexCount: number;\n    flags: number;\n    footprintSegIdx: number;\n    footprintSegLen: number;\n    polygonSegIdx: number;\n    polygonSegLen: number;\n    min: Point;\n    max: Point;\n    height: number;\n\n    constructor() {\n        this.centroidXY = new Point(0, 0);\n        this.vertexArrayOffset = 0;\n        this.vertexCount = 0;\n        this.groundVertexArrayOffset = 0;\n        this.groundVertexCount = 0;\n        this.flags = 0;\n        this.footprintSegIdx = -1;\n        this.footprintSegLen = 0;\n        this.polygonSegIdx = -1;\n        this.polygonSegLen = 0;\n        this.min = new Point(Number.MAX_VALUE, Number.MAX_VALUE);\n        this.max = new Point(-Number.MAX_VALUE, -Number.MAX_VALUE);\n        this.height = 0;\n    }\n\n    span(): Point {\n        return new Point(this.max.x - this.min.x, this.max.y - this.min.y);\n    }\n}\n\n// Used for calculating centroid of a feature and intersections of a feature with tile borders.\n// Uses and extends data in PartData. References to PartData via centroidDataIndex.\nclass BorderCentroidData {\n    acc: Point;\n    accCount: number;\n    borders: ?Array<[number, number]>; // Array<[min, max]>\n    centroidDataIndex: number;\n\n    constructor() {\n        this.acc = new Point(0, 0);\n        this.accCount = 0;\n        this.centroidDataIndex = 0;\n    }\n\n    startRing(data: PartData, p: Point) {\n        if (data.min.x === Number.MAX_VALUE) {  // If not initialized.\n            data.min.x = data.max.x = p.x;\n            data.min.y = data.max.y = p.y;\n        }\n    }\n\n    appendEdge(data: PartData, p: Point, prev: Point) {\n        assert(data.min.x !== Number.MAX_VALUE);\n\n        this.accCount++;\n        this.acc._add(p);\n\n        let checkBorders = !!this.borders;\n\n        if (p.x < data.min.x) {\n            data.min.x = p.x;\n            checkBorders = true;\n        } else if (p.x > data.max.x) {\n            data.max.x = p.x;\n            checkBorders = true;\n        }\n\n        if (p.y < data.min.y) {\n            data.min.y = p.y;\n            checkBorders = true;\n        } else if (p.y > data.max.y) {\n            data.max.y = p.y;\n            checkBorders = true;\n        }\n\n        if (((p.x === 0 || p.x === EXTENT) && p.x === prev.x) !==\n            ((p.y === 0 || p.y === EXTENT) && p.y === prev.y)) {\n            // Custom defined geojson buildings are cut on borders. Points are\n            // repeated when edge cuts tile corner (reason for using xor).\n            this.processBorderOverlap(p, prev);\n        }\n\n        if (checkBorders) {\n            this.checkBorderIntersection(p, prev);\n        }\n    }\n\n    checkBorderIntersection(p: Point, prev: Point) {\n        if ((prev.x < 0) !== (p.x < 0)) {\n            this.addBorderIntersection(0, interpolate(prev.y, p.y, (0 - prev.x) / (p.x - prev.x)));\n        }\n        if ((prev.x > EXTENT) !== (p.x > EXTENT)) {\n            this.addBorderIntersection(1, interpolate(prev.y, p.y, (EXTENT - prev.x) / (p.x - prev.x)));\n        }\n        if ((prev.y < 0) !== (p.y < 0)) {\n            this.addBorderIntersection(2, interpolate(prev.x, p.x, (0 - prev.y) / (p.y - prev.y)));\n        }\n        if ((prev.y > EXTENT) !== (p.y > EXTENT)) {\n            this.addBorderIntersection(3, interpolate(prev.x, p.x, (EXTENT - prev.y) / (p.y - prev.y)));\n        }\n    }\n\n    addBorderIntersection(index: 0 | 1 | 2 | 3, i: number) {\n        if (!this.borders) {\n            this.borders = [\n                [Number.MAX_VALUE, -Number.MAX_VALUE],\n                [Number.MAX_VALUE, -Number.MAX_VALUE],\n                [Number.MAX_VALUE, -Number.MAX_VALUE],\n                [Number.MAX_VALUE, -Number.MAX_VALUE]\n            ];\n        }\n        const b = this.borders[index];\n        if (i < b[0]) b[0] = i;\n        if (i > b[1]) b[1] = i;\n    }\n\n    processBorderOverlap(p: Point, prev: Point) {\n        if (p.x === prev.x) {\n            if (p.y === prev.y) return; // custom defined geojson could have points repeated.\n            const index = p.x === 0 ? 0 : 1;\n            this.addBorderIntersection(index, prev.y);\n            this.addBorderIntersection(index, p.y);\n        } else {\n            assert(p.y === prev.y);\n            const index = p.y === 0 ? 2 : 3;\n            this.addBorderIntersection(index, prev.x);\n            this.addBorderIntersection(index, p.x);\n        }\n    }\n\n    centroid(): Point {\n        if (this.accCount === 0) {\n            return new Point(0, 0);\n        }\n        return new Point(\n            Math.floor(Math.max(0, this.acc.x) / this.accCount),\n            Math.floor(Math.max(0, this.acc.y) / this.accCount));\n    }\n\n    intersectsCount(): number {\n        if (!this.borders) {\n            return 0;\n        }\n        return this.borders.reduce((acc, p) => acc + +(p[0] !== Number.MAX_VALUE), 0);\n    }\n}\n\nfunction concavity(a: Point, b: Point) {\n    return a.x * b.y - a.y * b.x < 0 ? -1 : 1;\n}\n\nfunction tanAngleClamped(angle: number) {\n    return Math.min(TANGENT_CUTOFF, Math.max(-TANGENT_CUTOFF, Math.tan(angle))) / TANGENT_CUTOFF * NORM;\n}\n\nfunction getAngularOffsetFactor(na: Point, nb: Point): number {\n    const nm = na.add(nb)._unit();\n    const cosHalfAngle = clamp(na.x * nm.x + na.y * nm.y, -1, 1);\n    const factor = tanAngleClamped(Math.acos(cosHalfAngle)) * concavity(na, nb);\n    return factor;\n}\n\nconst borderCheck = [\n    (a: Point): boolean => { return a.x < 0; }, // left\n    (a: Point): boolean => { return a.x > EXTENT; }, // right\n    (a: Point): boolean => { return a.y < 0; }, // top\n    (a: Point): boolean => { return a.y > EXTENT; } // bottom\n];\n\n// Checks which region a quad belongs to. A quad belongs to left, right, top, bottom if\n// it intersects with the left, right, top, bottom borders of the tile respectively.\n// If a quad doesn't intersect any of the borders, it is assumed to be in the \"default\" region.\n// Ids 0, 1, 2, 3 and 4 are denoting, left, right, top, bottom and default regions respectively.\n// Note that a quad can also belong to more than one region (e.g. when it intersects with left and right borders).\nfunction getTileRegions(pa: Point, pb: Point, na: Point, maxRadius: number) {\n    const regions = [4];\n    if (maxRadius === 0) return regions;\n\n    // Approximate the position of the extruded points by using a quad.\n    na._mult(maxRadius);\n    const c = pa.sub(na);\n    const d = pb.sub(na);\n\n    const points = [pa, pb, c, d];\n    for (let i = 0; i < TILE_REGIONS; i++) {\n        for (const point of points) {\n            if (borderCheck[i](point)) {\n                regions.push(i);\n                break;\n            }\n        }\n    }\n    return regions;\n}\n\ntype GroundQuad = {\n    id: number;\n    region: number; // 0 - left, 1 - right, 2 - top, 3 - bottom, 4 - rest\n}\n\nexport class GroundEffect {\n    vertexArray: FillExtrusionGroundLayoutArray;\n    vertexBuffer: VertexBuffer;\n\n    hiddenByLandmarkVertexArray: FillExtrusionHiddenByLandmarkArray;\n    hiddenByLandmarkVertexBuffer: VertexBuffer;\n    _needsHiddenByLandmarkUpdate: boolean;\n\n    indexArray: TriangleIndexArray;\n    indexBuffer: IndexBuffer;\n\n    _segments: SegmentVector;\n\n    _segmentToGroundQuads: {[number]: Array<GroundQuad>};\n    _segmentToRegionTriCounts: {[number]: Array<number>};\n    regionSegments: {[number]: ?SegmentVector};\n\n    programConfigurations: ProgramConfigurationSet<FillExtrusionStyleLayer>;\n\n    constructor(options: BucketParameters<FillExtrusionStyleLayer>) {\n        this.vertexArray = new FillExtrusionGroundLayoutArray();\n        this.indexArray = new TriangleIndexArray();\n        const filtered = (property: string) => {\n            return fillExtrusionGroundDataDrivenProperties.includes(property);\n        };\n        this.programConfigurations = new ProgramConfigurationSet(options.layers, options.zoom, filtered);\n        this._segments = new SegmentVector();\n        this.hiddenByLandmarkVertexArray = new FillExtrusionHiddenByLandmarkArray();\n        this._segmentToGroundQuads = {};\n        this._segmentToGroundQuads[0] = [];\n        this._segmentToRegionTriCounts = {};\n        this._segmentToRegionTriCounts[0] = [0, 0, 0, 0, 0];\n        this.regionSegments = {};\n        this.regionSegments[4] = new SegmentVector();\n    }\n\n    getDefaultSegment(): any {\n        return this.regionSegments[4];\n    }\n\n    hasData(): boolean { return this.vertexArray.length !== 0; }\n\n    addData(polyline: Array<Point>, bounds: [Point, Point], maxRadius: number, roundedEdges: boolean = false) {\n        const n = polyline.length;\n        if (n > 2) {\n            let sid = Math.max(0, this._segments.get().length - 1);\n            const numNewVerts = n * 4;\n            const numExistingVerts = this.vertexArray.length;\n            const numExistingTris = this._segmentToGroundQuads[sid].length * QUAD_TRIS;\n            const segment = this._segments._prepareSegment(numNewVerts, numExistingVerts, numExistingTris);\n            const newSegmentAdded = sid !== this._segments.get().length - 1;\n            if (newSegmentAdded) {\n                sid++;\n                this._segmentToGroundQuads[sid] = [];\n                this._segmentToRegionTriCounts[sid] = [0, 0, 0, 0, 0];\n            }\n            let prevFactor;\n            {\n                const pa = polyline[n - 1];\n                const pb = polyline[0];\n                const pc = polyline[1];\n                const na = pb.sub(pa)._perp()._unit();\n                const nb = pc.sub(pb)._perp()._unit();\n                prevFactor = getAngularOffsetFactor(na, nb);\n            }\n            for (let i = 0; i < n; i++) {\n                const j = i === n - 1 ? 0 : i + 1;\n                const k = j === n - 1 ? 0 : j + 1;\n\n                const pa = polyline[i];\n                const pb = polyline[j];\n                const pc = polyline[k];\n\n                const na = pb.sub(pa)._perp()._unit();\n                const nb = pc.sub(pb)._perp()._unit();\n                const factor = getAngularOffsetFactor(na, nb);\n                const a0 = prevFactor;\n                const a1 = factor;\n\n                if (isEdgeOutsideBounds(pa, pb, bounds) ||\n                    (roundedEdges && pointOutsideBounds(pa, bounds) && pointOutsideBounds(pb, bounds))) {\n                    prevFactor = factor;\n                    continue;\n                }\n\n                const idx = segment.vertexLength;\n\n                addGroundVertex(this.vertexArray, pa, pb, 1, 1, a0);\n                addGroundVertex(this.vertexArray, pa, pb, 1, 0, a0);\n                addGroundVertex(this.vertexArray, pa, pb, 0, 1, a1);\n                addGroundVertex(this.vertexArray, pa, pb, 0, 0, a1);\n                segment.vertexLength += QUAD_VERTS;\n\n                // When a tile belongs to more than one region it needs to be duplicated for that region.\n                const regions = getTileRegions(pa, pb, na, maxRadius); // Note: mutates na\n                for (const rid of regions) {\n                    this._segmentToGroundQuads[sid].push({\n                        id: idx,\n                        region: rid\n                    });\n                    this._segmentToRegionTriCounts[sid][rid] += QUAD_TRIS;\n                    segment.primitiveLength += QUAD_TRIS;\n                }\n                prevFactor = factor;\n            }\n        }\n    }\n\n    prepareBorderSegments() {\n        if (!this.hasData()) return;\n\n        assert(this._segments && this._segmentToGroundQuads && this._segmentToRegionTriCounts);\n        assert(!this.indexArray.length);\n\n        const segments = this._segments.get();\n        // Sort the geometry in this order: left, right, top, bottom and default regions.\n        const numSegments = segments.length;\n        for (let i = 0; i < numSegments; i++) {\n            const groundQuads = this._segmentToGroundQuads[i];\n            groundQuads.sort((a: GroundQuad, b: GroundQuad) => {\n                return a.region - b.region;\n            });\n        }\n\n        // Populate the index array.\n        for (let i = 0; i < numSegments; i++) {\n            const groundQuads = this._segmentToGroundQuads[i];\n            const segment = segments[i];\n            const regionTriCounts = this._segmentToRegionTriCounts[i];\n\n            const totalTriCount = regionTriCounts.reduce((acc: number, a: number) => { return acc + a; }, 0);\n            assert(segment.primitiveLength === totalTriCount);\n\n            // For each segment create 5 additional segments each representing a region.\n            let regionTriCountOffset = 0;\n            for (let k = 0; k <= TILE_REGIONS; k++) {\n                const triCount = regionTriCounts[k];\n                assert(triCount % QUAD_TRIS === 0);\n\n                if (triCount !== 0) {\n                    let segmentVector = this.regionSegments[k];\n                    // Lazy initialise the segment vector. During rendering if no such vector exists\n                    // it means that no geometry from this tile intersects the corresponding border.\n                    // We therefore can skip the said border to speed up rendering.\n                    if (!segmentVector) {\n                        segmentVector = this.regionSegments[k] = new SegmentVector();\n                    }\n\n                    const nSegment: any = {\n                        vertexOffset: segment.vertexOffset,\n                        primitiveOffset: segment.primitiveOffset + regionTriCountOffset,\n                        vertexLength: segment.vertexLength,\n                        primitiveLength: triCount\n                    };\n                    segmentVector.get().push(nSegment);\n                }\n\n                regionTriCountOffset += triCount;\n            }\n            for (let j = 0; j < groundQuads.length; j++) {\n                const groundQuad = groundQuads[j];\n                const idx = groundQuad.id;\n                this.indexArray.emplaceBack(idx, idx + 1, idx + 3);\n                this.indexArray.emplaceBack(idx, idx + 3, idx + 2);\n            }\n        }\n\n        // Free up memory as we no longer need these.\n        this._segmentToGroundQuads = (null: any);\n        this._segmentToRegionTriCounts = (null: any);\n        this._segments.destroy();\n        this._segments = (null: any);\n    }\n\n    addPaintPropertiesData(feature: Feature, index: number, imagePositions: SpritePositions, availableImages: Array<string>, canonical: CanonicalTileID, brightness: ?number) {\n        if (!this.hasData()) return;\n        this.programConfigurations.populatePaintArrays(this.vertexArray.length, feature, index, imagePositions, availableImages, canonical, brightness);\n    }\n\n    upload(context: Context) {\n        if (!this.hasData()) return;\n        this.vertexBuffer = context.createVertexBuffer(this.vertexArray, fillExtrusionGroundAttributes.members);\n        this.indexBuffer = context.createIndexBuffer(this.indexArray);\n    }\n\n    uploadPaintProperties(context: Context) {\n        if (!this.hasData()) return;\n        this.programConfigurations.upload(context);\n    }\n\n    update(states: FeatureStates, vtLayer: IVectorTileLayer, layers: any, availableImages: Array<string>, imagePositions: SpritePositions, brightness: ?number) {\n        if (!this.hasData()) return;\n        this.programConfigurations.updatePaintArrays(states, vtLayer, layers, availableImages, imagePositions, brightness);\n    }\n\n    updateHiddenByLandmark(data: PartData) {\n        if (!this.hasData()) return;\n        const offset = data.groundVertexArrayOffset;\n        const vertexArrayBounds = data.groundVertexCount + data.groundVertexArrayOffset;\n        assert(vertexArrayBounds <= this.hiddenByLandmarkVertexArray.length);\n        assert(this.hiddenByLandmarkVertexArray.length === this.vertexArray.length);\n        if (data.groundVertexCount === 0) return;\n        const hide = data.flags & HIDDEN_BY_REPLACEMENT ? 1 : 0;\n        for (let i = offset; i < vertexArrayBounds; ++i) {\n            this.hiddenByLandmarkVertexArray.emplace(i, hide);\n        }\n        this._needsHiddenByLandmarkUpdate = true;\n    }\n\n    uploadHiddenByLandmark(context: Context) {\n        if (!this.hasData() || !this._needsHiddenByLandmarkUpdate) {\n            return;\n        }\n        if (!this.hiddenByLandmarkVertexBuffer && this.hiddenByLandmarkVertexArray.length > 0) {\n            // Create centroids vertex buffer\n            this.hiddenByLandmarkVertexBuffer = context.createVertexBuffer(this.hiddenByLandmarkVertexArray, hiddenByLandmarkAttributes.members, true);\n        } else if (this.hiddenByLandmarkVertexBuffer) {\n            this.hiddenByLandmarkVertexBuffer.updateData(this.hiddenByLandmarkVertexArray);\n        }\n        this._needsHiddenByLandmarkUpdate = false;\n    }\n\n    destroy() {\n        if (!this.vertexBuffer) return;\n        this.vertexBuffer.destroy();\n        this.indexBuffer.destroy();\n        if (this.hiddenByLandmarkVertexBuffer) {\n            this.hiddenByLandmarkVertexBuffer.destroy();\n        }\n        if (this._segments) this._segments.destroy();\n        this.programConfigurations.destroy();\n        for (let i = 0; i <= TILE_REGIONS; i++) {\n            const segments = this.regionSegments[i];\n            if (segments) {\n                segments.destroy();\n            }\n        }\n    }\n}\n\ntype PolygonSegment = {\n    triangleArrayOffset: number;\n    triangleCount: number;\n    triangleSegIdx: number;\n};\n\ntype SegmentedFeature = {\n    centroidIdx: number;\n    subtile: number;\n    polygonSegmentIdx: number;\n    triangleSegmentIdx: number;\n};\n\ntype TriangleSubSegment = {\n    segment: Segment;\n    min: Point;\n    max: Point;\n};\n\nclass FillExtrusionBucket implements Bucket {\n    index: number;\n    zoom: number;\n    canonical: CanonicalTileID;\n    overscaling: number;\n    layers: Array<FillExtrusionStyleLayer>;\n    layerIds: Array<string>;\n    stateDependentLayers: Array<FillExtrusionStyleLayer>;\n    stateDependentLayerIds: Array<string>;\n\n    layoutVertexArray: FillExtrusionLayoutArray;\n    layoutVertexBuffer: VertexBuffer;\n\n    centroidVertexArray: FillExtrusionCentroidArray;\n    centroidVertexBuffer: VertexBuffer;\n\n    layoutVertexExtArray: ?FillExtrusionExtArray;\n    layoutVertexExtBuffer: ?VertexBuffer;\n\n    indexArray: TriangleIndexArray;\n    indexBuffer: IndexBuffer;\n\n    footprintSegments: Array<FootprintSegment>\n    footprintVertices: PosArray;\n    footprintIndices: TriangleIndexArray;\n\n    hasPattern: boolean;\n    edgeRadius: number;\n    programConfigurations: ProgramConfigurationSet<FillExtrusionStyleLayer>;\n    segments: SegmentVector;\n    uploaded: boolean;\n    features: Array<BucketFeature>;\n\n    featuresOnBorder: Array<BorderCentroidData>;\n    borderFeatureIndices: Array<Array<number>>;\n    centroidData: Array<PartData>;\n    // borders / borderDoneWithNeighborZ: 0 - left, 1, right, 2 - top, 3 - bottom\n    borderDoneWithNeighborZ: Array<number>;\n    needsCentroidUpdate: boolean;\n    tileToMeter: number; // cache conversion.\n    projection: ProjectionSpecification;\n    activeReplacements: Array<any>;\n    replacementUpdateTime: number;\n\n    groundEffect: GroundEffect;\n    partLookup: {[_: number]: ?PartData};\n\n    maxHeight: number;\n\n    triangleSubSegments: Array<TriangleSubSegment>;\n    polygonSegments: Array<PolygonSegment>;\n\n    constructor(options: BucketParameters<FillExtrusionStyleLayer>) {\n        this.zoom = options.zoom;\n        this.canonical = options.canonical;\n        this.overscaling = options.overscaling;\n        this.layers = options.layers;\n        this.layerIds = this.layers.map(layer => layer.fqid);\n        this.index = options.index;\n        this.hasPattern = false;\n        this.edgeRadius = 0;\n        this.projection = options.projection;\n        this.activeReplacements = [];\n        this.replacementUpdateTime = 0;\n        this.centroidData = [];\n        this.footprintIndices = new TriangleIndexArray();\n        this.footprintVertices = new PosArray();\n        this.footprintSegments = [];\n\n        this.layoutVertexArray = new FillExtrusionLayoutArray();\n        this.centroidVertexArray = new FillExtrusionCentroidArray();\n        this.indexArray = new TriangleIndexArray();\n        const filtered = (property: string) => {\n            return fillExtrusionDefaultDataDrivenProperties.includes(property);\n        };\n        this.programConfigurations = new ProgramConfigurationSet(options.layers, options.zoom, filtered);\n        this.segments = new SegmentVector();\n        this.stateDependentLayerIds = this.layers.filter((l) => l.isStateDependent()).map((l) => l.id);\n        this.groundEffect = new GroundEffect(options);\n        this.maxHeight = 0;\n        this.partLookup = {};\n        this.triangleSubSegments = [];\n        this.polygonSegments = [];\n    }\n\n    populate(features: Array<IndexedFeature>, options: PopulateParameters, canonical: CanonicalTileID, tileTransform: TileTransform) {\n        this.features = [];\n        this.hasPattern = hasPattern('fill-extrusion', this.layers, options);\n        this.featuresOnBorder = [];\n        this.borderFeatureIndices = [[], [], [], []];\n        this.borderDoneWithNeighborZ = [-1, -1, -1, -1];\n        this.tileToMeter = tileToMeter(canonical);\n        this.edgeRadius = this.layers[0].layout.get('fill-extrusion-edge-radius') / this.tileToMeter;\n        for (const {feature, id, index, sourceLayerIndex} of features) {\n            const needGeometry = this.layers[0]._featureFilter.needGeometry;\n            const evaluationFeature = toEvaluationFeature(feature, needGeometry);\n\n            // $FlowFixMe[method-unbinding]\n            if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) continue;\n            const bucketFeature: BucketFeature = {\n                id,\n                sourceLayerIndex,\n                index,\n                geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature, canonical, tileTransform),\n                properties: feature.properties,\n                type: feature.type,\n                patterns: {}\n            };\n\n            const vertexArrayOffset = this.layoutVertexArray.length;\n            if (this.hasPattern) {\n                this.features.push(addPatternDependencies('fill-extrusion', this.layers, bucketFeature, this.zoom, options));\n            } else {\n                this.addFeature(bucketFeature, bucketFeature.geometry, index, canonical, {}, options.availableImages, tileTransform, options.brightness);\n            }\n\n            options.featureIndex.insert(feature, bucketFeature.geometry, index, sourceLayerIndex, this.index, vertexArrayOffset);\n        }\n        this.sortBorders();\n        if (this.projection.name === \"mercator\") {\n            this.splitToSubtiles();\n        }\n        this.groundEffect.prepareBorderSegments();\n        // Clear polygon segment array\n        this.polygonSegments.length = 0;\n    }\n\n    addFeatures(options: PopulateParameters, canonical: CanonicalTileID, imagePositions: SpritePositions, availableImages: Array<string>, tileTransform: TileTransform, brightness: ?number) {\n        for (const feature of this.features) {\n            const {geometry} = feature;\n            this.addFeature(feature, geometry, feature.index, canonical, imagePositions, availableImages, tileTransform, brightness);\n        }\n        this.sortBorders();\n        if (this.projection.name === \"mercator\") {\n            this.splitToSubtiles();\n        }\n    }\n\n    update(states: FeatureStates, vtLayer: IVectorTileLayer, availableImages: Array<string>, imagePositions: SpritePositions, brightness: ?number) {\n        const withStateUpdates = Object.keys(states).length !== 0;\n        if (withStateUpdates && !this.stateDependentLayers.length) return;\n        const layers = withStateUpdates ? this.stateDependentLayers : this.layers;\n        this.programConfigurations.updatePaintArrays(states, vtLayer, layers, availableImages, imagePositions, brightness);\n        this.groundEffect.update(states, vtLayer, layers, availableImages, imagePositions, brightness);\n    }\n\n    isEmpty(): boolean {\n        return this.layoutVertexArray.length === 0;\n    }\n\n    uploadPending(): boolean {\n        return !this.uploaded || this.programConfigurations.needsUpload || this.groundEffect.programConfigurations.needsUpload;\n    }\n\n    upload(context: Context) {\n        if (!this.uploaded) {\n            this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, layoutAttributes);\n            this.indexBuffer = context.createIndexBuffer(this.indexArray);\n\n            if (this.layoutVertexExtArray) {\n                this.layoutVertexExtBuffer = context.createVertexBuffer(this.layoutVertexExtArray, fillExtrusionAttributesExt.members, true);\n            }\n\n            this.groundEffect.upload(context);\n        }\n        this.groundEffect.uploadPaintProperties(context);\n        this.programConfigurations.upload(context);\n        this.uploaded = true;\n    }\n\n    uploadCentroid(context: Context) {\n        this.groundEffect.uploadHiddenByLandmark(context);\n        if (!this.needsCentroidUpdate) {\n            return;\n        }\n        if (!this.centroidVertexBuffer && this.centroidVertexArray.length > 0) {\n            // Create centroids vertex buffer\n            this.centroidVertexBuffer = context.createVertexBuffer(this.centroidVertexArray, centroidAttributes.members, true);\n        } else if (this.centroidVertexBuffer) {\n            this.centroidVertexBuffer.updateData(this.centroidVertexArray);\n        }\n        this.needsCentroidUpdate = false;\n    }\n\n    destroy() {\n        if (!this.layoutVertexBuffer) return;\n        this.layoutVertexBuffer.destroy();\n        if (this.centroidVertexBuffer) {\n            this.centroidVertexBuffer.destroy();\n        }\n        if (this.layoutVertexExtBuffer) {\n            this.layoutVertexExtBuffer.destroy();\n        }\n        this.groundEffect.destroy();\n        this.indexBuffer.destroy();\n        this.programConfigurations.destroy();\n        this.segments.destroy();\n    }\n\n    addFeature(feature: BucketFeature, geometry: Array<Array<Point>>, index: number, canonical: CanonicalTileID, imagePositions: SpritePositions, availableImages: Array<string>, tileTransform: TileTransform, brightness: ?number) {\n        const floodLightRadius = this.layers[0].paint.get('fill-extrusion-flood-light-ground-radius').evaluate(feature, {});\n        const maxRadius = floodLightRadius / this.tileToMeter;\n\n        const tileBounds = [new Point(0, 0), new Point(EXTENT, EXTENT)];\n        const projection = tileTransform.projection;\n        const isGlobe = projection.name === 'globe';\n        const isPolygon = vectorTileFeatureTypes[feature.type] === 'Polygon';\n\n        const borderCentroidData = new BorderCentroidData();\n        borderCentroidData.centroidDataIndex = this.centroidData.length;\n        const centroid = new PartData();\n\n        const base = this.layers[0].paint.get('fill-extrusion-base').evaluate(feature, {}, canonical);\n        const onGround = base <= 0;\n        const height = this.layers[0].paint.get('fill-extrusion-height').evaluate(feature, {}, canonical);\n        centroid.height = height;\n        centroid.vertexArrayOffset = this.layoutVertexArray.length;\n        centroid.groundVertexArrayOffset = this.groundEffect.vertexArray.length;\n\n        if (isGlobe && !this.layoutVertexExtArray) {\n            this.layoutVertexExtArray = new FillExtrusionExtArray();\n        }\n        const polygons = classifyRings(geometry, EARCUT_MAX_RINGS);\n\n        for (let i = polygons.length - 1; i >= 0; i--) {\n            const polygon = polygons[i];\n            if (polygon.length === 0 || isEntirelyOutside(polygon[0])) {\n                polygons.splice(i, 1);\n            }\n        }\n\n        let clippedPolygons: ClippedPolygon[];\n        if (isGlobe) {\n            // Perform tesselation for polygons of tiles in order to support long planar\n            // triangles on the curved surface of the globe. This is done for all polygons\n            // regardless of their size in order guarantee identical results on all sides of\n            // tile boundaries.\n            //\n            // The globe is subdivided into a 32x16 grid. The number of subdivisions done\n            // for a tile depends on the zoom level. For example tile with z=0 requires 2⁴\n            // subdivisions, tile with z=1 2³ etc. The subdivision is done in polar coordinates\n            // instead of tile coordinates.\n            clippedPolygons = resampleFillExtrusionPolygonsForGlobe(polygons, tileBounds, canonical);\n        } else {\n            clippedPolygons = [];\n            for (const polygon of polygons) {\n                clippedPolygons.push({polygon, bounds: tileBounds});\n            }\n        }\n\n        const edgeRadius = isPolygon ? this.edgeRadius : 0;\n        const optimiseGround = edgeRadius > 0 && this.zoom < 17;\n\n        const isDuplicate = (coords: Array<Point>, a: Point) => {\n            if (coords.length === 0) return false;\n            const b = coords[coords.length - 1];\n            return a.x === b.x && a.y === b.y;\n        };\n\n        for (const {polygon, bounds} of clippedPolygons) {\n            // Only triangulate and draw the area of the feature if it is a polygon\n            // Other feature types (e.g. LineString) do not have area, so triangulation is pointless / undefined\n            let topIndex = 0;\n            let numVertices = 0;\n            for (const ring of polygon) {\n                // make sure the ring closes\n                if (isPolygon && !ring[0].equals(ring[ring.length - 1])) ring.push(ring[0]);\n                numVertices += (isPolygon ? (ring.length - 1) : ring.length);\n            }\n\n            // We use \"(isPolygon ? 5 : 4) * numVertices\" as an estimate to ensure whether additional segments are needed or not (see SegmentVector.MAX_VERTEX_ARRAY_LENGTH).\n            const segment = this.segments.prepareSegment((isPolygon ? 5 : 4) * numVertices, this.layoutVertexArray, this.indexArray);\n\n            if (centroid.footprintSegIdx < 0) {\n                centroid.footprintSegIdx = this.footprintSegments.length;\n            }\n\n            if (centroid.polygonSegIdx < 0) {\n                centroid.polygonSegIdx = this.polygonSegments.length;\n            }\n\n            // Store location of generated triangles for the future use\n            const polygonSeg = {triangleArrayOffset: this.indexArray.length, triangleCount: 0, triangleSegIdx: this.segments.segments.length - 1};\n\n            const fpSegment = new FootprintSegment();\n            fpSegment.vertexOffset = this.footprintVertices.length;\n            fpSegment.indexOffset = this.footprintIndices.length * 3;\n            fpSegment.ringIndices = [];\n\n            if (isPolygon) {\n                const flattened = [];\n                const holeIndices = [];\n                topIndex = segment.vertexLength;\n\n                // First we offset (inset) the top vertices (i.e the vertices that make up the roof).\n                for (let r = 0; r < polygon.length; r++) {\n                    const ring = polygon[r];\n                    if (ring.length && r !== 0) {\n                        holeIndices.push(flattened.length / 2);\n                    }\n\n                    // Geometry used by ground flood light and AO.\n                    const groundPolyline: Array<Point> = [];\n\n                    // The following vectors are used to avoid duplicate normal calculations when going over the vertices.\n                    let na, nb;\n                    {\n                        const p0 = ring[0];\n                        const p1 = ring[1];\n                        na = p1.sub(p0)._perp()._unit();\n                    }\n\n                    // Store index to the end of this ring, we substract one because we don't add the last point to the\n                    // footprint as it's the same as the first one\n                    fpSegment.ringIndices.push(ring.length - 1);\n\n                    for (let i = 1; i < ring.length; i++) {\n                        const p1 = ring[i];\n                        const p2 = ring[i === ring.length - 1 ? 1 : i + 1];\n\n                        const q = p1.clone();\n\n                        if (edgeRadius) {\n                            nb = p2.sub(p1)._perp()._unit();\n                            const nm = na.add(nb)._unit();\n                            const cosHalfAngle = na.x * nm.x + na.y * nm.y;\n                            const offset = edgeRadius * Math.min(4, 1 / cosHalfAngle);\n                            q.x += offset * nm.x;\n                            q.y += offset * nm.y;\n                            q.x = Math.round(q.x);\n                            q.y = Math.round(q.y);\n                            na = nb;\n                        }\n\n                        if (onGround && (edgeRadius === 0 || optimiseGround) && !isDuplicate(groundPolyline, q)) {\n                            groundPolyline.push(q);\n                        }\n\n                        addVertex(this.layoutVertexArray, q.x, q.y, 0, 0, 1, 1, 0);\n                        segment.vertexLength++;\n\n                        this.footprintVertices.emplaceBack(p1.x, p1.y);\n\n                        // triangulate as if vertices were not offset to ensure correct triangulation\n                        flattened.push(p1.x, p1.y);\n\n                        if (isGlobe) {\n                            const array: any = this.layoutVertexExtArray;\n                            const projectedP = projection.projectTilePoint(q.x, q.y, canonical);\n                            const n = projection.upVector(canonical, q.x, q.y);\n                            addGlobeExtVertex(array, projectedP, n);\n                        }\n                    }\n\n                    if (onGround && (edgeRadius === 0 || optimiseGround)) {\n                        if (groundPolyline.length !== 0 && isDuplicate(groundPolyline, groundPolyline[0])) {\n                            groundPolyline.pop();\n                        }\n                        this.groundEffect.addData(groundPolyline, bounds, maxRadius);\n                    }\n                }\n\n                const indices = earcut(flattened, holeIndices);\n                assert(indices.length % 3 === 0);\n\n                for (let j = 0; j < indices.length; j += 3) {\n                    this.footprintIndices.emplaceBack(\n                        fpSegment.vertexOffset + indices[j + 0],\n                        fpSegment.vertexOffset + indices[j + 1],\n                        fpSegment.vertexOffset + indices[j + 2]);\n\n                    // clockwise winding order.\n                    this.indexArray.emplaceBack(\n                        topIndex + indices[j],\n                        topIndex + indices[j + 2],\n                        topIndex + indices[j + 1]);\n                    segment.primitiveLength++;\n                }\n\n                fpSegment.indexCount += indices.length;\n                fpSegment.vertexCount += this.footprintVertices.length - fpSegment.vertexOffset;\n            }\n\n            for (let r = 0; r < polygon.length; r++) {\n                const ring = polygon[r];\n                borderCentroidData.startRing(centroid, ring[0]);\n                let isPrevCornerConcave = ring.length > 4 && isAOConcaveAngle(ring[ring.length - 2], ring[0], ring[1]);\n                let offsetPrev = edgeRadius ? getRoundedEdgeOffset(ring[ring.length - 2], ring[0], ring[1], edgeRadius) : 0;\n\n                // Geometry used by ground flood light and AO.\n                const groundPolyline: Array<Point> = [];\n\n                let kFirst;\n\n                // The following vectors are used to avoid duplicate normal calculations when going over the vertices.\n                let na, nb;\n                {\n                    const p0 = ring[0];\n                    const p1 = ring[1];\n                    na = p1.sub(p0)._perp()._unit();\n                }\n                let cap = true;\n                for (let i = 1, edgeDistance = 0; i < ring.length; i++) {\n                    let p0 = ring[i - 1];\n                    let p1 = ring[i];\n                    const p2 = ring[i === ring.length - 1 ? 1 : i + 1];\n\n                    borderCentroidData.appendEdge(centroid, p1, p0);\n\n                    if (isEdgeOutsideBounds(p1, p0, bounds)) {\n                        if (edgeRadius) {\n                            na = p2.sub(p1)._perp()._unit();\n                            cap = !cap;\n                        }\n                        continue;\n                    }\n\n                    const d = p1.sub(p0)._perp();\n                    // Given that nz === 0, encode nx / (abs(nx) + abs(ny)) and signs.\n                    // This information is sufficient to reconstruct normal vector in vertex shader.\n                    const nxRatio = d.x / (Math.abs(d.x) + Math.abs(d.y));\n                    const nySign = d.y > 0 ? 1 : 0;\n\n                    const dist = p0.dist(p1);\n                    if (edgeDistance + dist > 32768) edgeDistance = 0;\n\n                    // Next offset the vertices along the edges and create a chamfer space between them:\n                    // So if we have the following (where 'x' denotes a vertex)\n                    // x──────x\n                    // |      |\n                    // |      |\n                    // |      |\n                    // |      |\n                    // x──────x\n                    // we end up with:\n                    //  x────x\n                    // x      x\n                    // |      |\n                    // |      |\n                    // x      x\n                    //  x────x\n                    // (drawing isn't exact but hopefully gets the point across).\n\n                    if (edgeRadius) {\n                        nb = p2.sub(p1)._perp()._unit();\n\n                        const cosHalfAngle = getCosHalfAngle(na, nb);\n                        let offsetNext = _getRoundedEdgeOffset(p0, p1, p2, cosHalfAngle, edgeRadius);\n\n                        if (isNaN(offsetNext)) offsetNext = 0;\n                        const nEdge = p1.sub(p0)._unit();\n                        p0 = p0.add(nEdge.mult(offsetPrev))._round();\n                        p1 = p1.add(nEdge.mult(-offsetNext))._round();\n                        offsetPrev = offsetNext;\n\n                        na = nb;\n\n                        if (onGround && this.zoom >= 17) {\n                            if (!isDuplicate(groundPolyline, p0)) groundPolyline.push(p0);\n                            if (!isDuplicate(groundPolyline, p1)) groundPolyline.push(p1);\n                        }\n                    }\n\n                    const k = segment.vertexLength;\n\n                    const isConcaveCorner = ring.length > 4 && isAOConcaveAngle(p0, p1, p2);\n                    let encodedEdgeDistance = encodeAOToEdgeDistance(edgeDistance, isPrevCornerConcave, cap);\n\n                    addVertex(this.layoutVertexArray, p0.x, p0.y, nxRatio, nySign, 0, 0, encodedEdgeDistance);\n                    addVertex(this.layoutVertexArray, p0.x, p0.y, nxRatio, nySign, 0, 1, encodedEdgeDistance);\n\n                    edgeDistance += dist;\n                    encodedEdgeDistance = encodeAOToEdgeDistance(edgeDistance, isConcaveCorner, !cap);\n                    isPrevCornerConcave = isConcaveCorner;\n\n                    addVertex(this.layoutVertexArray, p1.x, p1.y, nxRatio, nySign, 0, 0, encodedEdgeDistance);\n                    addVertex(this.layoutVertexArray, p1.x, p1.y, nxRatio, nySign, 0, 1, encodedEdgeDistance);\n\n                    segment.vertexLength += 4;\n\n                    // ┌──────┐\n                    // │ 1  3 │ clockwise winding order.\n                    // │      │ Triangle 1: 0 => 1 => 2\n                    // │ 0  2 │ Triangle 2: 1 => 3 => 2\n                    // └──────┘\n                    this.indexArray.emplaceBack(k + 0, k + 1, k + 2);\n                    this.indexArray.emplaceBack(k + 1, k + 3, k + 2);\n                    segment.primitiveLength += 2;\n\n                    if (edgeRadius) {\n                        // Note that in the previous for-loop we start from index 1 to add the top vertices which explains the next line.\n                        const t0 = topIndex + (i === 1 ? ring.length - 2 : i - 2);\n                        const t1 = i === 1 ? topIndex : t0 + 1;\n\n                        // top chamfer along the side (i.e. the space between the wall and the roof).\n                        this.indexArray.emplaceBack(k + 1, t0, k + 3);\n                        this.indexArray.emplaceBack(t0, t1, k + 3);\n                        segment.primitiveLength += 2;\n\n                        if (kFirst === undefined) {\n                            kFirst = k;\n                        }\n\n                        // Make sure to fill in the gap in the corner only when both corresponding edges are in tile bounds.\n                        if (!isEdgeOutsideBounds(p2, ring[i], bounds)) {\n                            const l = i === ring.length - 1 ? kFirst : segment.vertexLength;\n\n                            // vertical side chamfer i.e. the space between consecutive walls.\n                            this.indexArray.emplaceBack(k + 2, k + 3, l);\n                            this.indexArray.emplaceBack(k + 3, l + 1, l);\n\n                            // top corner where the top(roof) and two sides(walls) meet.\n                            this.indexArray.emplaceBack(k + 3, t1, l + 1);\n\n                            segment.primitiveLength += 3;\n                        }\n                        cap = !cap;\n                    }\n\n                    if (isGlobe) {\n                        const array: any = this.layoutVertexExtArray;\n\n                        const projectedP0 = projection.projectTilePoint(p0.x, p0.y, canonical);\n                        const projectedP1 = projection.projectTilePoint(p1.x, p1.y, canonical);\n\n                        const n0 = projection.upVector(canonical, p0.x, p0.y);\n                        const n1 = projection.upVector(canonical, p1.x, p1.y);\n\n                        addGlobeExtVertex(array, projectedP0, n0);\n                        addGlobeExtVertex(array, projectedP0, n0);\n                        addGlobeExtVertex(array, projectedP1, n1);\n                        addGlobeExtVertex(array, projectedP1, n1);\n                    }\n                }\n                if (isPolygon) topIndex += (ring.length - 1);\n                if (onGround && edgeRadius && this.zoom >= 17) {\n                    if (groundPolyline.length !== 0 && isDuplicate(groundPolyline, groundPolyline[0])) {\n                        groundPolyline.pop();\n                    }\n                    this.groundEffect.addData(groundPolyline, bounds, maxRadius, edgeRadius > 0);\n                }\n            }\n            this.footprintSegments.push(fpSegment);\n            polygonSeg.triangleCount = this.indexArray.length - polygonSeg.triangleArrayOffset;\n            this.polygonSegments.push(polygonSeg);\n            ++centroid.footprintSegLen;\n            ++centroid.polygonSegLen;\n        }\n\n        assert(!isGlobe || (this.layoutVertexExtArray && this.layoutVertexExtArray.length === this.layoutVertexArray.length));\n\n        centroid.vertexCount = this.layoutVertexArray.length - centroid.vertexArrayOffset;\n        centroid.groundVertexCount = this.groundEffect.vertexArray.length - centroid.groundVertexArrayOffset;\n        if (centroid.vertexCount === 0) {\n            return;\n        }\n\n        // hiddenCentroid {0, 1}: it is initially hidden as borders are processed later.\n        centroid.centroidXY = borderCentroidData.borders ? HIDDEN_CENTROID : this.encodeCentroid(borderCentroidData, centroid);\n        this.centroidData.push(centroid);\n\n        if (borderCentroidData.borders) {\n            // When building is split between tiles, store information that enables joining.\n            // parts of building that layes in differentt buckets.\n            assert(borderCentroidData.centroidDataIndex === this.centroidData.length - 1);\n            this.featuresOnBorder.push(borderCentroidData);\n            const borderIndex = this.featuresOnBorder.length - 1;\n            for (let i = 0; i < (borderCentroidData.borders: any).length; i++) {\n                if ((borderCentroidData.borders: any)[i][0] !== Number.MAX_VALUE) {\n                    this.borderFeatureIndices[i].push(borderIndex);\n                }\n            }\n        }\n\n        this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, imagePositions, availableImages, canonical, brightness);\n        this.groundEffect.addPaintPropertiesData(feature, index, imagePositions, availableImages, canonical, brightness);\n        // compute maximum height of the bucket\n        this.maxHeight = Math.max(this.maxHeight, height);\n    }\n\n    sortBorders() {\n        for (let i = 0; i < this.borderFeatureIndices.length; i++) {\n            const borders = this.borderFeatureIndices[i];\n            borders.sort((a, b) => (this.featuresOnBorder[a].borders: any)[i][0] - (this.featuresOnBorder[b].borders: any)[i][0]);\n        }\n    }\n\n    splitToSubtiles() {\n        // Split fill extrusion features into 4 \"sub-tiles\" each of which can\n        // be rendered separately. This allows more effective rendering as primitives\n        // sent to GPU can be reduced by a large margin if most of the tile is outside\n        // of the screen.\n        //\n        // Triangles of each feature are sorted into correct sub-tile based on their centroid\n        // positions. These tiles are in memory in clockwise order so it's possible to\n        // render almost every possible combination with just a single draw call.\n        const segmentedFeatures: Array<SegmentedFeature> = [];\n\n        for (let centroidIdx = 0; centroidIdx < this.centroidData.length; centroidIdx++) {\n            const part = this.centroidData[centroidIdx];\n            const right = +((part.min.x + part.max.x) > EXTENT);\n            const bottom = +((part.min.y + part.max.y) > EXTENT);\n            const subtile = bottom * 2 + (right ^ bottom);\n            for (let i = 0; i < part.polygonSegLen; i++) {\n                const polySegIdx = part.polygonSegIdx + i;\n                segmentedFeatures.push({centroidIdx, subtile, polygonSegmentIdx: polySegIdx, triangleSegmentIdx: this.polygonSegments[polySegIdx].triangleSegIdx});\n            }\n        }\n        // Sort features based on their subtile index. Triangles can't be moved across\n        // orignal segment boundaries due to different baseVertex values.\n        const sortedTriangles = new TriangleIndexArray();\n        segmentedFeatures.sort((a, b) => a.triangleSegmentIdx === b.triangleSegmentIdx ? a.subtile - b.subtile : a.triangleSegmentIdx - b.triangleSegmentIdx);\n        let segmentIdx = 0;\n        let segmentBeginIndex = 0;\n        let segmentEndIndex = 0;\n        for (const segmentedFeature of segmentedFeatures) {\n            if (segmentedFeature.triangleSegmentIdx !== segmentIdx) {\n                break;\n            }\n            segmentEndIndex++;\n        }\n\n        const segmentedFeaturesEndIndex = segmentedFeatures.length;\n\n        while (segmentBeginIndex !== segmentedFeatures.length) {\n            segmentIdx = segmentedFeatures[segmentBeginIndex].triangleSegmentIdx;\n            // For each feature of this triangle segment (as in all triangles in `Segments[triSegIdx]`),\n            // find the number of triangles in each subtile and construct new segments for rendering\n            let subTileIdx = 0;\n            let featuresBeginIndex = segmentBeginIndex;\n            let featuresEndIndex = segmentBeginIndex;\n\n            for (let seg = featuresBeginIndex; seg < segmentEndIndex; seg++) {\n                if (segmentedFeatures[seg].subtile !== subTileIdx) {\n                    break;\n                }\n                featuresEndIndex++;\n            }\n            while (featuresBeginIndex !== segmentEndIndex) {\n                const featuresBegin = segmentedFeatures[featuresBeginIndex];\n                subTileIdx = featuresBegin.subtile;\n                const subtileMin = this.centroidData[featuresBegin.centroidIdx].min.clone();\n                const subtileMax = this.centroidData[featuresBegin.centroidIdx].max.clone();\n\n                // Add triangles of this subtile and construct a segment for rendering\n                const segment: Segment = {vertexOffset: this.segments.segments[segmentIdx].vertexOffset,\n                    primitiveOffset: sortedTriangles.length,\n                    vertexLength: this.segments.segments[segmentIdx].vertexLength,\n                    primitiveLength: 0,\n                    sortKey: undefined,\n                    vaos: {}};\n\n                for (let featureIdx = featuresBeginIndex; featureIdx < featuresEndIndex; featureIdx++) {\n\n                    const feature = segmentedFeatures[featureIdx];\n                    const data = this.polygonSegments[feature.polygonSegmentIdx];\n                    const centroidMin = this.centroidData[feature.centroidIdx].min;\n                    const centroidMax = this.centroidData[feature.centroidIdx].max;\n                    const iArray = this.indexArray.uint16;\n                    for (let i = data.triangleArrayOffset; i < data.triangleArrayOffset + data.triangleCount; i++) {\n                        sortedTriangles.emplaceBack(iArray[i * 3], iArray[i * 3 + 1], iArray[i * 3 + 2]);\n                    }\n                    segment.primitiveLength += data.triangleCount;\n                    subtileMin.x = Math.min(subtileMin.x, centroidMin.x);\n                    subtileMin.y = Math.min(subtileMin.y, centroidMin.y);\n                    subtileMax.x = Math.max(subtileMax.x, centroidMax.x);\n                    subtileMax.y = Math.max(subtileMax.y, centroidMax.y);\n                }\n                if (segment.primitiveLength > 0) {\n                    this.triangleSubSegments.push({segment, min: subtileMin, max: subtileMax});\n                }\n                featuresBeginIndex = featuresEndIndex;\n                for (let seg = featuresBeginIndex; seg < segmentEndIndex; seg++) {\n                    if (segmentedFeatures[seg].subtile !== segmentedFeatures[featuresBeginIndex].subtile) {\n                        break;\n                    }\n                    featuresEndIndex++;\n                }\n            }\n\n            segmentBeginIndex = segmentEndIndex;\n            for (let seg = segmentBeginIndex; seg < segmentedFeaturesEndIndex; seg++) {\n                if (segmentedFeatures[seg].triangleSegmentIdx !== segmentedFeatures[segmentBeginIndex].triangleSegmentIdx) {\n                    break;\n                }\n                segmentEndIndex++;\n            }\n        }\n        sortedTriangles._trim();\n        this.indexArray = sortedTriangles;\n    }\n\n    getVisibleSegments(renderId: OverscaledTileID, elevation: ?Elevation, frustum: Frustum): SegmentVector {\n        let minZ = 0;\n        let maxZ = 0;\n        const tiles =  1 << renderId.canonical.z;\n\n        if (elevation) {\n            const minmax = elevation.getMinMaxForTile(renderId);\n            if (minmax) {\n                minZ = minmax.min;\n                maxZ = minmax.max;\n            }\n        }\n        maxZ += this.maxHeight;\n\n        const id = renderId.toUnwrapped();\n\n        // Go through sub-tiles and merge visible ones that are also adjacent in memory\n        // into single segments.\n        let activeSegment: ?Segment;\n        const tileMin = [(id.canonical.x / tiles) + id.wrap, (id.canonical.y / tiles)];\n        const tileMax = [((id.canonical.x + 1) / tiles) + id.wrap, ((id.canonical.y + 1) / tiles)];\n\n        const outSegments = new SegmentVector();\n\n        const mix = (a: Array<number>, b: Array<number>, c: Array<number>): Array<number> => {\n            return [(a[0] * (1 - c[0])) + (b[0] * c[0]), (a[1] * (1 - c[1])) + (b[1] * c[1])];\n        };\n        const fracMin = [];\n        const fracMax = [];\n\n        for (const subSegment of this.triangleSubSegments) {\n            // Compute aabb of the subtile\n            fracMin[0] = subSegment.min.x / EXTENT;\n            fracMin[1] = subSegment.min.y / EXTENT;\n            fracMax[0] = subSegment.max.x / EXTENT;\n            fracMax[1] = subSegment.max.y / EXTENT;\n            const aabbMin = mix(tileMin, tileMax, fracMin);\n            const aabbMax = mix(tileMin, tileMax, fracMax);\n            const aabb = new Aabb([aabbMin[0], aabbMin[1], minZ], [aabbMax[0], aabbMax[1], maxZ]);\n            if (aabb.intersectsPrecise(frustum) === 0) {\n                if (activeSegment) {\n                    outSegments.segments.push(activeSegment);\n                    activeSegment = undefined;\n                }\n                continue;\n            }\n            const renderSegment = subSegment.segment;\n            if (activeSegment && activeSegment.vertexOffset !== renderSegment.vertexOffset) {\n                // vertex offset is different between adjacent segments => split to separate segments\n                outSegments.segments.push(activeSegment);\n                activeSegment = undefined;\n            }\n            if (!activeSegment) {\n                activeSegment = {vertexOffset: renderSegment.vertexOffset,\n                    primitiveLength: renderSegment.primitiveLength,\n                    vertexLength: renderSegment.vertexLength,\n                    primitiveOffset: renderSegment.primitiveOffset,\n                    sortKey: undefined,\n                    vaos: {}\n                };\n            } else {\n                activeSegment.vertexLength += renderSegment.vertexLength;\n                activeSegment.primitiveLength += renderSegment.primitiveLength;\n            }\n        }\n        if (activeSegment) {\n            outSegments.segments.push(activeSegment);\n        }\n        return outSegments;\n    }\n\n    // Encoded centroid x and y:\n    //     x     y\n    // ---------------------------------------------\n    //     0     0    Default, no flat roof.\n    //     0     1    Hide, used to hide parts of buildings on border while expecting the other side to get loaded\n    //    >0     0    Elevation encoded to uint16 word\n    //    >0    >0    Encoded centroid position and x & y span\n    encodeCentroid(borderCentroidData: BorderCentroidData, data: PartData): Point {\n        const c = borderCentroidData.centroid();\n        const span = data.span();\n        const spanX = Math.min(7, Math.round(span.x * this.tileToMeter / 10));\n        const spanY = Math.min(7, Math.round(span.y * this.tileToMeter / 10));\n        return new Point((clamp(c.x, 1, EXTENT - 1) << 3) | spanX, (clamp(c.y, 1, EXTENT - 1) << 3) | spanY);\n    }\n\n    // Border centroid data is unreliable for elevating parts split on tile borders.\n    // It is used only for synchronous lowering of splits as the centroid (not the size information in split parts) is consistent.\n    encodeBorderCentroid(borderCentroidData: BorderCentroidData): Point {\n        assert(borderCentroidData.borders);\n        if (!borderCentroidData.borders) return new Point(0, 0);\n        const b = borderCentroidData.borders;\n        const notOnBorder = Number.MAX_VALUE;\n        const span = 0x6; // any non zero value since span in this is not used in shader\n        assert(borderCentroidData.intersectsCount() === 1);\n        if (b[0][0] !== notOnBorder || b[1][0] !== notOnBorder) {\n            const x = (b[0][0] !== notOnBorder ? 0 : (0x1FFF << 3)) | span;\n            const index = b[0][0] !== notOnBorder ? 0 : 1;\n            return new Point(x, (((((b[index][0] + b[index][1]) / 2) | 0) << 3) | span));\n        } else {\n            assert(b[2][0] !== notOnBorder || b[3][0] !== notOnBorder);\n            const y = (b[2][0] !== notOnBorder ? 0 : (0x1FFF << 3)) | span;\n            const index = b[2][0] !== notOnBorder ? 2 : 3;\n            return new Point((((((b[index][0] + b[index][1]) / 2) | 0) << 3) | span), y);\n        }\n    }\n\n    showCentroid(borderCentroidData: BorderCentroidData) {\n        const c = this.centroidData[borderCentroidData.centroidDataIndex];\n        c.flags &= HIDDEN_BY_REPLACEMENT;\n        c.centroidXY.x = 0;\n        c.centroidXY.y = 0;\n        this.writeCentroidToBuffer(c);\n    }\n\n    writeCentroidToBuffer(data: PartData) {\n        this.groundEffect.updateHiddenByLandmark(data);\n        const offset = data.vertexArrayOffset;\n        const vertexArrayBounds = data.vertexCount + data.vertexArrayOffset;\n        assert(vertexArrayBounds <= this.centroidVertexArray.length);\n        assert(this.centroidVertexArray.length === this.layoutVertexArray.length);\n        const c = data.flags & HIDDEN_BY_REPLACEMENT ? HIDDEN_CENTROID : data.centroidXY;\n        // All the vertex data is the same, use the first to exit early if it is not needed to re-write all.\n        const firstX = this.centroidVertexArray.geta_centroid_pos0(offset);\n        const firstY = this.centroidVertexArray.geta_centroid_pos1(offset);\n\n        if (firstY === c.y && firstX === c.x) {\n            return;\n        }\n        for (let i = offset; i < vertexArrayBounds; ++i) {\n            this.centroidVertexArray.emplace(i, c.x, c.y);\n        }\n        this.needsCentroidUpdate = true;\n    }\n\n    createCentroidsBuffer() {\n        assert(this.centroidVertexArray.length === 0);\n        assert(this.groundEffect.hiddenByLandmarkVertexArray.length === 0);\n        this.centroidVertexArray.resize(this.layoutVertexArray.length);\n        this.groundEffect.hiddenByLandmarkVertexArray.resize(this.groundEffect.vertexArray.length);\n        for (const centroid of this.centroidData) {\n            this.writeCentroidToBuffer(centroid);\n        }\n    }\n\n    updateReplacement(coord: OverscaledTileID, source: ReplacementSource) {\n        // Replacement has to be re-checked if the source has been updated since last time\n        if (source.updateTime === this.replacementUpdateTime) {\n            return;\n        }\n        this.replacementUpdateTime = source.updateTime;\n\n        // Check if replacements have changed\n        const newReplacements = source.getReplacementRegionsForTile(coord.toUnwrapped());\n        if (regionsEquals(this.activeReplacements, newReplacements)) {\n            return;\n        }\n        this.activeReplacements = newReplacements;\n\n        if (this.centroidVertexArray.length === 0) {\n            this.createCentroidsBuffer();\n        } else {\n            for (const centroid of this.centroidData) {\n                centroid.flags &= ~HIDDEN_BY_REPLACEMENT;\n            }\n        }\n\n        const transformedVertices: Array<Point> = [];\n\n        // Hide all centroids that are overlapping with footprints from the replacement source\n        for (const region of this.activeReplacements) {\n            // Apply slight padding (one unit) to fill extrusion footprints. This reduces false positives where\n            // two adjacent lines would be reported overlapping due to limited precision (16 bit) of tile units.\n            const padding = Math.pow(2.0, region.footprintTileId.canonical.z - coord.canonical.z);\n\n            for (const centroid of this.centroidData) {\n                if (centroid.flags & HIDDEN_BY_REPLACEMENT) {\n                    continue;\n                }\n\n                // Perform a quick aabb-aabb check to determine\n                // whether a more precise check is required\n                if (region.min.x > centroid.max.x || centroid.min.x > region.max.x) {\n                    continue;\n                } else if (region.min.y > centroid.max.y || centroid.min.y > region.max.y) {\n                    continue;\n                }\n\n                for (let i = 0; i < centroid.footprintSegLen; i++) {\n                    const seg = this.footprintSegments[centroid.footprintSegIdx + i];\n\n                    // Transform vertices to footprint's coordinate space\n                    transformedVertices.length = 0;\n\n                    transformFootprintVertices(\n                        this.footprintVertices,\n                        seg.vertexOffset,\n                        seg.vertexCount,\n                        region.footprintTileId.canonical,\n                        coord.canonical,\n                        transformedVertices);\n\n                    if (footprintTrianglesIntersect(\n                        region.footprint,\n                        transformedVertices,\n                        this.footprintIndices.uint16,\n                        seg.indexOffset,\n                        seg.indexCount,\n                        -seg.vertexOffset,\n                        -padding)) {\n                        centroid.flags |= HIDDEN_BY_REPLACEMENT;\n                        break;\n                    }\n                }\n            }\n        }\n\n        for (const centroid of this.centroidData) {\n            this.writeCentroidToBuffer(centroid);\n        }\n\n        this.borderDoneWithNeighborZ = [-1, -1, -1, -1];\n    }\n\n    footprintContainsPoint(x: number, y: number, centroid: PartData): boolean {\n        let c = false;\n        for (let s = 0; s < centroid.footprintSegLen; s++) {\n            const seg = this.footprintSegments[centroid.footprintSegIdx + s];\n            let startRing = 0;\n            for (const endRing of seg.ringIndices) {\n                for (let i = startRing, j = endRing + startRing - 1; i < endRing + startRing; j = i++) {\n                    const x1 = this.footprintVertices.int16[(i + seg.vertexOffset) * 2 + 0];\n                    const y1 = this.footprintVertices.int16[(i + seg.vertexOffset) * 2 + 1];\n                    const x2 = this.footprintVertices.int16[(j + seg.vertexOffset) * 2 + 0];\n                    const y2 = this.footprintVertices.int16[(j + seg.vertexOffset) * 2 + 1];\n                    if (((y1 > y) !== (y2 > y)) && (x < ((x2 - x1) * (y - y1) / (y2 - y1) + x1))) {\n                        c = !c;\n                    }\n                }\n                startRing = endRing;\n            }\n        }\n        return c;\n    }\n\n    getHeightAtTileCoord(x: number, y: number): ?{height: number, hidden: boolean} {\n        let height = Number.NEGATIVE_INFINITY;\n        let hidden = true;\n        assert(x > -EXTENT && y > -EXTENT && x < 2 * EXTENT && y < 2 * EXTENT);\n        const lookupKey = (x + EXTENT) * 4 * EXTENT + (y + EXTENT);\n        if (this.partLookup.hasOwnProperty(lookupKey)) {\n            const centroid = this.partLookup[lookupKey];\n            return centroid ? {height: centroid.height, hidden: !!(centroid.flags & HIDDEN_BY_REPLACEMENT)} : undefined;\n        }\n        for (const centroid of this.centroidData) {\n            // Perform a quick aabb-aabb check to determine\n            // whether a more precise check is required\n            if (x > centroid.max.x || centroid.min.x > x || y > centroid.max.y || centroid.min.y > y) {\n                continue;\n            }\n\n            if (this.footprintContainsPoint(x, y, centroid)) {\n                if (centroid && centroid.height > height) {\n                    height = centroid.height;\n                    this.partLookup[lookupKey] = centroid;\n                    hidden = !!(centroid.flags & HIDDEN_BY_REPLACEMENT);\n                }\n            }\n        }\n        if (height === Number.NEGATIVE_INFINITY) {\n            // nothing found, cache that info too.\n            this.partLookup[lookupKey] = undefined;\n            return;\n        }\n        return {height, hidden};\n    }\n}\n\nfunction getCosHalfAngle(na: Point, nb: Point) {\n    const nm = na.add(nb)._unit();\n    const cosHalfAngle = na.x * nm.x + na.y * nm.y;\n    return cosHalfAngle;\n}\n\nfunction getRoundedEdgeOffset(p0: Point, p1: Point, p2: Point, edgeRadius: number) {\n    const na = p1.sub(p0)._perp()._unit();\n    const nb = p2.sub(p1)._perp()._unit();\n    const cosHalfAngle = getCosHalfAngle(na, nb);\n    return _getRoundedEdgeOffset(p0, p1, p2, cosHalfAngle, edgeRadius);\n}\n\nfunction _getRoundedEdgeOffset(p0: Point, p1: Point, p2: Point, cosHalfAngle: number, edgeRadius: number) {\n    const sinHalfAngle = Math.sqrt(1 - cosHalfAngle * cosHalfAngle);\n    return Math.min(p0.dist(p1) / 3, p1.dist(p2) / 3, edgeRadius * sinHalfAngle / cosHalfAngle);\n}\n\nregister(FillExtrusionBucket, 'FillExtrusionBucket', {omit: ['layers', 'features']});\nregister(PartData, 'PartData');\nregister(FootprintSegment, 'FootprintSegment');\nregister(BorderCentroidData, 'BorderCentroidData');\nregister(GroundEffect, 'GroundEffect');\n\nexport default FillExtrusionBucket;\n\n// Edges that are outside tile bounds are defined in tile across the border.\n// Rendering them twice often results with Z-fighting.\n// In case of globe and axis aligned bounds, it is also useful to\n// discard edges that have the both endpoints outside the same bound.\nfunction isEdgeOutsideBounds(p1: Point, p2: Point, bounds: [Point, Point]) {\n    return (p1.x < bounds[0].x && p2.x < bounds[0].x) ||\n           (p1.x > bounds[1].x && p2.x > bounds[1].x) ||\n           (p1.y < bounds[0].y && p2.y < bounds[0].y) ||\n           (p1.y > bounds[1].y && p2.y > bounds[1].y);\n}\n\nfunction pointOutsideBounds(p: Point, bounds: [Point, Point]) {\n    return ((p.x < bounds[0].x) || (p.x > bounds[1].x) ||\n            (p.y < bounds[0].y) || (p.y > bounds[1].y));\n}\n\nfunction isEntirelyOutside(ring: Array<Point>) {\n    // Discard rings with corners on border if all other vertices are outside: they get defined\n    // also in the tile across the border. Eventual zero area rings at border are discarded by classifyRings\n    // and there is no need to handle that case here.\n    return ring.every(p => p.x <= 0) ||\n        ring.every(p => p.x >= EXTENT) ||\n        ring.every(p => p.y <= 0) ||\n        ring.every(p => p.y >= EXTENT);\n}\n\nfunction isAOConcaveAngle(p2: Point, p1: Point, p3: Point) {\n    if (p2.x < 0 || p2.x >= EXTENT || p1.x < 0 || p1.x >= EXTENT || p3.x < 0 || p3.x >= EXTENT) {\n        return false; // angles are not processed for edges that extend over tile borders\n    }\n    const a = p3.sub(p1);\n    const an = a.perp();\n    const b = p2.sub(p1);\n    const ab = a.x * b.x + a.y * b.y;\n    const cosAB = ab / Math.sqrt(((a.x * a.x + a.y * a.y) * (b.x * b.x + b.y * b.y)));\n    const dotProductWithNormal = an.x * b.x + an.y * b.y;\n\n    // Heuristics: don't shade concave angles above 150° (arccos(-0.866)).\n    return cosAB > -0.866 && dotProductWithNormal < 0;\n}\n\nfunction encodeAOToEdgeDistance(edgeDistance: number, isConcaveCorner: boolean, edgeStart: boolean) {\n    // Encode concavity and edge start/end using the least significant bits.\n    // Second least significant bit 1 encodes concavity.\n    // The least significant bit 1 marks the edge start, 0 for edge end.\n    const encodedEdgeDistance = isConcaveCorner ? (edgeDistance | 2) : (edgeDistance & ~2);\n    return edgeStart ? (encodedEdgeDistance | 1) : (encodedEdgeDistance & ~1);\n}\n\nexport function fillExtrusionHeightLift(): number {\n    // A rectangle covering globe is subdivided into a grid of 32 cells\n    // This information can be used to deduce a minimum lift value so that\n    // fill extrusions with 0 height will never go below the ground.\n    const angle = Math.PI / 32.0;\n    const tanAngle = Math.tan(angle);\n    const r = earthRadius;\n    return r * Math.sqrt(1.0 + 2.0 * tanAngle * tanAngle) - r;\n}\n\n// Resamples fill extrusion polygons by subdividing them into 32x16 cells in mercator space.\n// The idea is to allow reprojection of large continuous planar shapes on the surface of the globe\nexport function resampleFillExtrusionPolygonsForGlobe(polygons: Point[][][], tileBounds: [Point, Point], tileID: CanonicalTileID): ClippedPolygon[] {\n    const cellCount = 360.0 / 32.0;\n    const tiles = 1 << tileID.z;\n    const leftLng = lngFromMercatorX(tileID.x / tiles);\n    const rightLng = lngFromMercatorX((tileID.x + 1) / tiles);\n    const topLat = latFromMercatorY(tileID.y / tiles);\n    const bottomLat = latFromMercatorY((tileID.y + 1) / tiles);\n    const cellCountOnXAxis = Math.ceil((rightLng - leftLng) / cellCount);\n    const cellCountOnYAxis = Math.ceil((topLat - bottomLat) / cellCount);\n\n    const splitFn = (axis: number, min: number, max: number) => {\n        if (axis === 0) {\n            return 0.5 * (min + max);\n        } else {\n            const maxLat = latFromMercatorY((tileID.y + min / EXTENT) / tiles);\n            const minLat = latFromMercatorY((tileID.y + max / EXTENT) / tiles);\n            const midLat = 0.5 * (minLat + maxLat);\n            return (mercatorYfromLat(midLat) * tiles - tileID.y) * EXTENT;\n        }\n    };\n\n    return subdividePolygons(polygons, tileBounds, cellCountOnXAxis, cellCountOnYAxis, 1.0, splitFn);\n}\n\nfunction transformFootprintVertices(vertices: PosArray, offset: number, count: number, footprintId: CanonicalTileID, centroidId: CanonicalTileID, out: Array<Point>) {\n    const zDiff = Math.pow(2.0, footprintId.z - centroidId.z);\n\n    for (let i = 0; i < count; i++) {\n        let x = vertices.int16[(i + offset) * 2 + 0];\n        let y = vertices.int16[(i + offset) * 2 + 1];\n\n        x = (x + centroidId.x * EXTENT) * zDiff - footprintId.x * EXTENT;\n        y = (y + centroidId.y * EXTENT) * zDiff - footprintId.y * EXTENT;\n\n        out.push(new Point(x, y));\n    }\n}\n","// This file is generated. Edit build/generate-style-code.js, then run `npm run codegen`.\n// @flow\n/* eslint-disable */\n\nimport styleSpec from '../../style-spec/reference/latest.js';\n\nimport {\n    Properties,\n    DataConstantProperty,\n    DataDrivenProperty,\n    ColorRampProperty\n} from '../properties.js';\n\nimport type Color from '../../style-spec/util/color.js';\n\nimport type Formatted from '../../style-spec/expression/types/formatted.js';\n\nimport type ResolvedImage from '../../style-spec/expression/types/resolved_image.js';\n\nexport type LayoutProps = {|\n    \"visibility\": DataConstantProperty<\"visible\" | \"none\">,\n    \"fill-extrusion-edge-radius\": DataConstantProperty<number>,\n|};\n\nconst layout: Properties<LayoutProps> = new Properties({\n    \"visibility\": new DataConstantProperty(styleSpec[\"layout_fill-extrusion\"][\"visibility\"]),\n    \"fill-extrusion-edge-radius\": new DataConstantProperty(styleSpec[\"layout_fill-extrusion\"][\"fill-extrusion-edge-radius\"]),\n});\n\nexport type PaintProps = {|\n    \"fill-extrusion-opacity\": DataConstantProperty<number>,\n    \"fill-extrusion-color\": DataDrivenProperty<Color>,\n    \"fill-extrusion-translate\": DataConstantProperty<[number, number]>,\n    \"fill-extrusion-translate-anchor\": DataConstantProperty<\"map\" | \"viewport\">,\n    \"fill-extrusion-pattern\": DataDrivenProperty<?ResolvedImage>,\n    \"fill-extrusion-height\": DataDrivenProperty<number>,\n    \"fill-extrusion-base\": DataDrivenProperty<number>,\n    \"fill-extrusion-vertical-gradient\": DataConstantProperty<boolean>,\n    \"fill-extrusion-ambient-occlusion-intensity\": DataConstantProperty<number>,\n    \"fill-extrusion-ambient-occlusion-radius\": DataConstantProperty<number>,\n    \"fill-extrusion-ambient-occlusion-wall-radius\": DataConstantProperty<number>,\n    \"fill-extrusion-ambient-occlusion-ground-radius\": DataConstantProperty<number>,\n    \"fill-extrusion-ambient-occlusion-ground-attenuation\": DataConstantProperty<number>,\n    \"fill-extrusion-flood-light-color\": DataConstantProperty<Color>,\n    \"fill-extrusion-flood-light-intensity\": DataConstantProperty<number>,\n    \"fill-extrusion-flood-light-wall-radius\": DataDrivenProperty<number>,\n    \"fill-extrusion-flood-light-ground-radius\": DataDrivenProperty<number>,\n    \"fill-extrusion-flood-light-ground-attenuation\": DataConstantProperty<number>,\n    \"fill-extrusion-vertical-scale\": DataConstantProperty<number>,\n    \"fill-extrusion-rounded-roof\": DataConstantProperty<boolean>,\n    \"fill-extrusion-cutoff-fade-range\": DataConstantProperty<number>,\n    \"fill-extrusion-emissive-strength\": DataConstantProperty<number>,\n|};\n\nconst paint: Properties<PaintProps> = new Properties({\n    \"fill-extrusion-opacity\": new DataConstantProperty(styleSpec[\"paint_fill-extrusion\"][\"fill-extrusion-opacity\"]),\n    \"fill-extrusion-color\": new DataDrivenProperty(styleSpec[\"paint_fill-extrusion\"][\"fill-extrusion-color\"]),\n    \"fill-extrusion-translate\": new DataConstantProperty(styleSpec[\"paint_fill-extrusion\"][\"fill-extrusion-translate\"]),\n    \"fill-extrusion-translate-anchor\": new DataConstantProperty(styleSpec[\"paint_fill-extrusion\"][\"fill-extrusion-translate-anchor\"]),\n    \"fill-extrusion-pattern\": new DataDrivenProperty(styleSpec[\"paint_fill-extrusion\"][\"fill-extrusion-pattern\"]),\n    \"fill-extrusion-height\": new DataDrivenProperty(styleSpec[\"paint_fill-extrusion\"][\"fill-extrusion-height\"]),\n    \"fill-extrusion-base\": new DataDrivenProperty(styleSpec[\"paint_fill-extrusion\"][\"fill-extrusion-base\"]),\n    \"fill-extrusion-vertical-gradient\": new DataConstantProperty(styleSpec[\"paint_fill-extrusion\"][\"fill-extrusion-vertical-gradient\"]),\n    \"fill-extrusion-ambient-occlusion-intensity\": new DataConstantProperty(styleSpec[\"paint_fill-extrusion\"][\"fill-extrusion-ambient-occlusion-intensity\"]),\n    \"fill-extrusion-ambient-occlusion-radius\": new DataConstantProperty(styleSpec[\"paint_fill-extrusion\"][\"fill-extrusion-ambient-occlusion-radius\"]),\n    \"fill-extrusion-ambient-occlusion-wall-radius\": new DataConstantProperty(styleSpec[\"paint_fill-extrusion\"][\"fill-extrusion-ambient-occlusion-wall-radius\"]),\n    \"fill-extrusion-ambient-occlusion-ground-radius\": new DataConstantProperty(styleSpec[\"paint_fill-extrusion\"][\"fill-extrusion-ambient-occlusion-ground-radius\"]),\n    \"fill-extrusion-ambient-occlusion-ground-attenuation\": new DataConstantProperty(styleSpec[\"paint_fill-extrusion\"][\"fill-extrusion-ambient-occlusion-ground-attenuation\"]),\n    \"fill-extrusion-flood-light-color\": new DataConstantProperty(styleSpec[\"paint_fill-extrusion\"][\"fill-extrusion-flood-light-color\"]),\n    \"fill-extrusion-flood-light-intensity\": new DataConstantProperty(styleSpec[\"paint_fill-extrusion\"][\"fill-extrusion-flood-light-intensity\"]),\n    \"fill-extrusion-flood-light-wall-radius\": new DataDrivenProperty(styleSpec[\"paint_fill-extrusion\"][\"fill-extrusion-flood-light-wall-radius\"]),\n    \"fill-extrusion-flood-light-ground-radius\": new DataDrivenProperty(styleSpec[\"paint_fill-extrusion\"][\"fill-extrusion-flood-light-ground-radius\"]),\n    \"fill-extrusion-flood-light-ground-attenuation\": new DataConstantProperty(styleSpec[\"paint_fill-extrusion\"][\"fill-extrusion-flood-light-ground-attenuation\"]),\n    \"fill-extrusion-vertical-scale\": new DataConstantProperty(styleSpec[\"paint_fill-extrusion\"][\"fill-extrusion-vertical-scale\"]),\n    \"fill-extrusion-rounded-roof\": new DataConstantProperty(styleSpec[\"paint_fill-extrusion\"][\"fill-extrusion-rounded-roof\"]),\n    \"fill-extrusion-cutoff-fade-range\": new DataConstantProperty(styleSpec[\"paint_fill-extrusion\"][\"fill-extrusion-cutoff-fade-range\"]),\n    \"fill-extrusion-emissive-strength\": new DataConstantProperty(styleSpec[\"paint_fill-extrusion\"][\"fill-extrusion-emissive-strength\"]),\n});\n\n// Note: without adding the explicit type annotation, Flow infers weaker types\n// for these objects from their use in the constructor to StyleLayer, as\n// {layout?: Properties<...>, paint: Properties<...>}\nexport default ({ paint, layout }: $Exact<{\n  paint: Properties<PaintProps>, layout: Properties<LayoutProps>\n}>);\n","// @flow\n\nimport StyleLayer from '../style_layer.js';\nimport FillExtrusionBucket, {ELEVATION_SCALE, ELEVATION_OFFSET, fillExtrusionHeightLift, resampleFillExtrusionPolygonsForGlobe} from '../../data/bucket/fill_extrusion_bucket.js';\nimport {polygonIntersectsPolygon, polygonIntersectsMultiPolygon} from '../../util/intersection_tests.js';\nimport {translateDistance, tilespaceTranslate} from '../query_utils.js';\nimport properties from './fill_extrusion_style_layer_properties.js';\nimport {Transitionable, Transitioning, PossiblyEvaluated} from '../properties.js';\nimport Point from '@mapbox/point-geometry';\nimport {vec3, vec4} from 'gl-matrix';\nimport EXTENT from '../../style-spec/data/extent.js';\nimport {CanonicalTileID} from '../../source/tile_id.js';\n\nimport type {FeatureState} from '../../style-spec/expression/index.js';\nimport type {BucketParameters} from '../../data/bucket.js';\nimport type {PaintProps, LayoutProps} from './fill_extrusion_style_layer_properties.js';\nimport type Transform from '../../geo/transform.js';\nimport type {LayerSpecification} from '../../style-spec/types.js';\nimport type {TilespaceQueryGeometry} from '../query_geometry.js';\nimport type {DEMSampler} from '../../terrain/elevation.js';\nimport type {Vec2, Vec4} from 'gl-matrix';\nimport type {IVectorTileFeature} from '@mapbox/vector-tile';\nimport type {ConfigOptions} from '../properties.js';\n\nclass Point3D extends Point {\n    z: number;\n\n    constructor(x: number, y: number, z: number) {\n        super(x, y);\n        this.z = z;\n    }\n}\n\nclass FillExtrusionStyleLayer extends StyleLayer {\n    _transitionablePaint: Transitionable<PaintProps>;\n    _transitioningPaint: Transitioning<PaintProps>;\n    paint: PossiblyEvaluated<PaintProps>;\n    layout: PossiblyEvaluated<LayoutProps>;\n\n    constructor(layer: LayerSpecification, scope: string, options?: ?ConfigOptions) {\n        super(layer, properties, scope, options);\n        this._stats = {numRenderedVerticesInShadowPass : 0, numRenderedVerticesInTransparentPass: 0};\n    }\n\n    createBucket(parameters: BucketParameters<FillExtrusionStyleLayer>): FillExtrusionBucket {\n        return new FillExtrusionBucket(parameters);\n    }\n\n    // $FlowFixMe[method-unbinding]\n    queryRadius(): number {\n        return translateDistance(this.paint.get('fill-extrusion-translate'));\n    }\n\n    is3D(): boolean {\n        return true;\n    }\n\n    hasShadowPass(): boolean {\n        return true;\n    }\n\n    cutoffRange(): number {\n        return this.paint.get('fill-extrusion-cutoff-fade-range');\n    }\n\n    canCastShadows(): boolean {\n        return true;\n    }\n\n    getProgramIds(): string[] {\n        const patternProperty = this.paint.get('fill-extrusion-pattern');\n        const image = patternProperty.constantOr((1: any));\n        return [image ? 'fillExtrusionPattern' : 'fillExtrusion'];\n    }\n\n    // $FlowFixMe[method-unbinding]\n    queryIntersectsFeature(queryGeometry: TilespaceQueryGeometry,\n                           feature: IVectorTileFeature,\n                           featureState: FeatureState,\n                           geometry: Array<Array<Point>>,\n                           zoom: number,\n                           transform: Transform,\n                           pixelPosMatrix: Float32Array,\n                           elevationHelper: ?DEMSampler,\n                           layoutVertexArrayOffset: number): boolean | number {\n\n        const translation = tilespaceTranslate(this.paint.get('fill-extrusion-translate'),\n                                this.paint.get('fill-extrusion-translate-anchor'),\n                                transform.angle,\n                                queryGeometry.pixelToTileUnitsFactor);\n        const height = this.paint.get('fill-extrusion-height').evaluate(feature, featureState);\n        const base = this.paint.get('fill-extrusion-base').evaluate(feature, featureState);\n\n        const centroid = [0, 0];\n        const terrainVisible = elevationHelper && transform.elevation;\n        const exaggeration = transform.elevation ? transform.elevation.exaggeration() : 1;\n        const bucket = queryGeometry.tile.getBucket(this);\n        if (terrainVisible && bucket instanceof FillExtrusionBucket) {\n            const centroidVertexArray = bucket.centroidVertexArray;\n\n            // See FillExtrusionBucket#encodeCentroid(), centroid is inserted at vertexOffset + 1\n            const centroidOffset = layoutVertexArrayOffset + 1;\n            if (centroidOffset < centroidVertexArray.length) {\n                centroid[0] = centroidVertexArray.geta_centroid_pos0(centroidOffset);\n                centroid[1] = centroidVertexArray.geta_centroid_pos1(centroidOffset);\n            }\n        }\n\n        // Early exit if fill extrusion is still hidden while waiting for backfill\n        const isHidden = centroid[0] === 0 && centroid[1] === 1;\n        if (isHidden) return false;\n\n        if (transform.projection.name === 'globe') {\n            // Fill extrusion geometry has to be resampled so that large planar polygons\n            // can be rendered on the curved surface\n            const bounds = [new Point(0, 0), new Point(EXTENT, EXTENT)];\n            const resampledGeometry = resampleFillExtrusionPolygonsForGlobe([geometry], bounds, queryGeometry.tileID.canonical);\n            geometry = resampledGeometry.map(clipped => clipped.polygon).flat();\n        }\n\n        const demSampler = terrainVisible ? elevationHelper : null;\n        const [projectedBase, projectedTop] = projectExtrusion(transform, geometry, base, height, translation, pixelPosMatrix, demSampler, centroid, exaggeration, transform.center.lat, queryGeometry.tileID.canonical);\n\n        const screenQuery = queryGeometry.queryGeometry;\n        const projectedQueryGeometry = screenQuery.isPointQuery() ? screenQuery.screenBounds : screenQuery.screenGeometry;\n        return checkIntersection(projectedBase, projectedTop, projectedQueryGeometry);\n    }\n}\n\nfunction dot(a: Point, b: Point) {\n    return a.x * b.x + a.y * b.y;\n}\n\nexport function getIntersectionDistance(projectedQueryGeometry: Array<Point>, projectedFace: Array<Point3D>): number {\n\n    if (projectedQueryGeometry.length === 1) {\n        // For point queries calculate the z at which the point intersects the face\n        // using barycentric coordinates.\n\n        // Find the barycentric coordinates of the projected point within the first\n        // triangle of the face, using only the xy plane. It doesn't matter if the\n        // point is outside the first triangle because all the triangles in the face\n        // are in the same plane.\n        //\n        // Check whether points are coincident and use other points if they are.\n        let i = 0;\n        const a = projectedFace[i++];\n        let b;\n        while (!b || a.equals(b)) {\n            b = projectedFace[i++];\n            if (!b) return Infinity;\n        }\n\n        // Loop until point `c` is not colinear with points `a` and `b`.\n        for (; i < projectedFace.length; i++) {\n            const c = projectedFace[i];\n\n            const p = projectedQueryGeometry[0];\n\n            const ab = b.sub(a);\n            const ac = c.sub(a);\n            const ap = p.sub(a);\n\n            const dotABAB = dot(ab, ab);\n            const dotABAC = dot(ab, ac);\n            const dotACAC = dot(ac, ac);\n            const dotAPAB = dot(ap, ab);\n            const dotAPAC = dot(ap, ac);\n            const denom = dotABAB * dotACAC - dotABAC * dotABAC;\n\n            const v = (dotACAC * dotAPAB - dotABAC * dotAPAC) / denom;\n            const w = (dotABAB * dotAPAC - dotABAC * dotAPAB) / denom;\n            const u = 1 - v - w;\n\n            // Use the barycentric weighting along with the original triangle z coordinates to get the point of intersection.\n            const distance = a.z * u + b.z * v + c.z * w;\n\n            if (isFinite(distance)) return distance;\n        }\n\n        return Infinity;\n\n    } else {\n        // The counts as closest is less clear when the query is a box. This\n        // returns the distance to the nearest point on the face, whether it is\n        // within the query or not. It could be more correct to return the\n        // distance to the closest point within the query box but this would be\n        // more complicated and expensive to calculate with little benefit.\n        let closestDistance = Infinity;\n        for (const p of projectedFace) {\n            closestDistance = Math.min(closestDistance, p.z);\n        }\n        return closestDistance;\n    }\n}\n\nfunction checkIntersection(projectedBase: Array<Array<Point3D>>, projectedTop: Array<Array<Point3D>>, projectedQueryGeometry: Array<Point>) {\n    let closestDistance = Infinity;\n\n    if (polygonIntersectsMultiPolygon(projectedQueryGeometry, projectedTop)) {\n        closestDistance = getIntersectionDistance(projectedQueryGeometry, projectedTop[0]);\n    }\n\n    for (let r = 0; r < projectedTop.length; r++) {\n        const ringTop = projectedTop[r];\n        const ringBase = projectedBase[r];\n        for (let p = 0; p < ringTop.length - 1; p++) {\n            const topA = ringTop[p];\n            const topB = ringTop[p + 1];\n            const baseA = ringBase[p];\n            const baseB = ringBase[p + 1];\n            const face = [topA, topB, baseB, baseA, topA];\n            if (polygonIntersectsPolygon(projectedQueryGeometry, face)) {\n                closestDistance = Math.min(closestDistance, getIntersectionDistance(projectedQueryGeometry, face));\n            }\n        }\n    }\n\n    return closestDistance === Infinity ? false : closestDistance;\n}\n\nfunction projectExtrusion(tr: Transform, geometry: Array<Array<Point>>, zBase: number, zTop: number, translation: Point, m: Float32Array, demSampler: ?DEMSampler, centroid: Vec2, exaggeration: number, lat: number, tileID: CanonicalTileID) {\n    if (tr.projection.name === 'globe') {\n        return projectExtrusionGlobe(tr, geometry, zBase, zTop, translation, m, demSampler, centroid, exaggeration, lat, tileID);\n    } else {\n        if (demSampler) {\n            return projectExtrusion3D(geometry, zBase, zTop, translation, m, demSampler, centroid, exaggeration, lat);\n        } else {\n            return projectExtrusion2D(geometry, zBase, zTop, translation, m);\n        }\n    }\n}\n\nfunction projectExtrusionGlobe(tr: Transform, geometry: Array<Array<Point>>, zBase: number, zTop: number, translation: Point, m: Float32Array, demSampler: ?DEMSampler, centroid: Vec2, exaggeration: number, lat: number, tileID: CanonicalTileID) {\n    const projectedBase = [];\n    const projectedTop = [];\n    const elevationScale = tr.projection.upVectorScale(tileID, tr.center.lat, tr.worldSize).metersToTile;\n    const basePoint = [0, 0, 0, 1];\n    const topPoint = [0, 0, 0, 1];\n\n    const setPoint = (point: Array<number>, x: number, y: number, z: number) => {\n        point[0] = x;\n        point[1] = y;\n        point[2] = z;\n        point[3] = 1;\n    };\n\n    // Fixed \"lift\" value is added to height so that 0-height fill extrusions wont clip with globe's surface\n    const lift = fillExtrusionHeightLift();\n\n    if (zBase > 0) {\n        zBase += lift;\n    }\n    zTop += lift;\n\n    for (const r of geometry) {\n        const ringBase = [];\n        const ringTop = [];\n        for (const p of r) {\n            const x = p.x + translation.x;\n            const y = p.y + translation.y;\n\n            // Reproject tile coordinate into ecef and apply elevation to correct direction\n            const reproj = tr.projection.projectTilePoint(x, y, tileID);\n            const dir = tr.projection.upVector(tileID, p.x, p.y);\n\n            let zBasePoint = zBase;\n            let zTopPoint = zTop;\n\n            if (demSampler) {\n                const offset = getTerrainHeightOffset(x, y, zBase, zTop, demSampler, centroid, exaggeration, lat);\n\n                zBasePoint += offset.base;\n                zTopPoint += offset.top;\n            }\n\n            if (zBase !== 0) {\n                setPoint(\n                    basePoint,\n                    reproj.x + dir[0] * elevationScale * zBasePoint,\n                    reproj.y + dir[1] * elevationScale * zBasePoint,\n                    reproj.z + dir[2] * elevationScale * zBasePoint);\n            } else {\n                setPoint(basePoint, reproj.x, reproj.y, reproj.z);\n            }\n\n            setPoint(\n                topPoint,\n                reproj.x + dir[0] * elevationScale * zTopPoint,\n                reproj.y + dir[1] * elevationScale * zTopPoint,\n                reproj.z + dir[2] * elevationScale * zTopPoint);\n\n            vec3.transformMat4(basePoint, basePoint, m);\n            vec3.transformMat4(topPoint, topPoint, m);\n\n            ringBase.push(new Point3D(basePoint[0], basePoint[1], basePoint[2]));\n            ringTop.push(new Point3D(topPoint[0], topPoint[1], topPoint[2]));\n        }\n        projectedBase.push(ringBase);\n        projectedTop.push(ringTop);\n    }\n\n    return [projectedBase, projectedTop];\n}\n\n/*\n * Project the geometry using matrix `m`. This is essentially doing\n * `vec4.transformMat4([], [p.x, p.y, z, 1], m)` but the multiplication\n * is inlined so that parts of the projection that are the same across\n * different points can only be done once. This produced a measurable\n * performance improvement.\n */\nfunction projectExtrusion2D(geometry: Array<Array<Point>>, zBase: number, zTop: number, translation: Point, m: Float32Array) {\n    const projectedBase = [];\n    const projectedTop = [];\n\n    const baseXZ = m[8] * zBase;\n    const baseYZ = m[9] * zBase;\n    const baseZZ = m[10] * zBase;\n    const baseWZ = m[11] * zBase;\n    const topXZ = m[8] * zTop;\n    const topYZ = m[9] * zTop;\n    const topZZ = m[10] * zTop;\n    const topWZ = m[11] * zTop;\n\n    for (const r of geometry) {\n        const ringBase = [];\n        const ringTop = [];\n        for (const p of r) {\n            const x = p.x + translation.x;\n            const y = p.y + translation.y;\n\n            const sX = m[0] * x + m[4] * y + m[12];\n            const sY = m[1] * x + m[5] * y + m[13];\n            const sZ = m[2] * x + m[6] * y + m[14];\n            const sW = m[3] * x + m[7] * y + m[15];\n\n            const baseX = sX + baseXZ;\n            const baseY = sY + baseYZ;\n            const baseZ = sZ + baseZZ;\n            const baseW = Math.max(sW + baseWZ, 0.00001);\n\n            const topX = sX + topXZ;\n            const topY = sY + topYZ;\n            const topZ = sZ + topZZ;\n            const topW = Math.max(sW + topWZ, 0.00001);\n\n            ringBase.push(new Point3D(baseX / baseW, baseY / baseW, baseZ / baseW));\n            ringTop.push(new Point3D(topX / topW, topY / topW, topZ / topW));\n        }\n        projectedBase.push(ringBase);\n        projectedTop.push(ringTop);\n    }\n    return [projectedBase, projectedTop];\n}\n\n/*\n * Projects a fill extrusion vertices to screen while accounting for terrain.\n * This and its dependent functions are ported directly from `fill_extrusion.vertex.glsl`\n * with a few co-ordinate space differences.\n *\n * - Matrix `m` projects to screen-pixel space instead of to gl-coordinates (NDC)\n * - Texture querying is performed in texture pixel coordinates instead of  normalized uv coordinates.\n * - Height offset calculation for fill-extrusion-base is offset with -1 instead of -5 to prevent underground picking.\n */\nfunction projectExtrusion3D(geometry: Array<Array<Point>>, zBase: number, zTop: number, translation: Point, m: Float32Array, demSampler: DEMSampler, centroid: Vec2, exaggeration: number, lat: number) {\n    const projectedBase = [];\n    const projectedTop = [];\n    const v = [0, 0, 0, 1];\n\n    for (const r of geometry) {\n        const ringBase = [];\n        const ringTop = [];\n        for (const p of r) {\n            const x = p.x + translation.x;\n            const y = p.y + translation.y;\n            const heightOffset = getTerrainHeightOffset(x, y, zBase, zTop, demSampler, centroid, exaggeration, lat);\n\n            v[0] = x;\n            v[1] = y;\n            v[2] = heightOffset.base;\n            v[3] = 1;\n            vec4.transformMat4(v, v, m);\n            v[3] = Math.max(v[3], 0.00001);\n            const base = new Point3D(v[0] / v[3], v[1] / v[3], v[2] / v[3]);\n\n            v[0] = x;\n            v[1] = y;\n            v[2] = heightOffset.top;\n            v[3] = 1;\n            vec4.transformMat4(v, v, m);\n            v[3] = Math.max(v[3], 0.00001);\n            const top = new Point3D(v[0] / v[3], v[1] / v[3], v[2] / v[3]);\n\n            ringBase.push(base);\n            ringTop.push(top);\n        }\n        projectedBase.push(ringBase);\n        projectedTop.push(ringTop);\n    }\n    return [projectedBase, projectedTop];\n}\n\nfunction getTerrainHeightOffset(x: number, y: number, zBase: number, zTop: number, demSampler: DEMSampler, centroid: Vec2, exaggeration: number, lat: number): { base: number, top: number} {\n    const ele = exaggeration * demSampler.getElevationAt(x, y, true, true);\n    const flatRoof = centroid[0] !== 0;\n    const centroidElevation = flatRoof ? centroid[1] === 0 ? exaggeration * elevationFromUint16(centroid[0]) : exaggeration * flatElevation(demSampler, centroid, lat) : ele;\n    return {\n        base: ele + (zBase === 0) ? -1 : zBase, // Use -1 instead of -5 in shader to prevent picking underground\n        top: flatRoof ? Math.max(centroidElevation + zTop, ele + zBase + 2) : ele + zTop\n    };\n}\n\n// Elevation is encoded into unit16 in fill_extrusion_bucket.js FillExtrusionBucket#encodeCentroid\nfunction elevationFromUint16(n: number): number {\n    return n / ELEVATION_SCALE - ELEVATION_OFFSET;\n}\n\n// Equivalent GPU side function is in _prelude_terrain.vertex.glsl\nfunction flatElevation(demSampler: DEMSampler, centroid: Vec2, lat: number): number {\n    // Span and pos are packed two 16 bit uint16 values in fill_extrusion_bucket.js FillExtrusionBucket#encodeCentroid\n    // pos is encoded by << by 3 bits thus dividing by 8 performs equivalent of right shifting it back.\n    const posX = Math.floor(centroid[0] / 8);\n    const posY = Math.floor(centroid[1] / 8);\n\n    // Span is stored in the lower three bits in multiples of 10\n    const spanX = 10 * (centroid[0] - posX * 8);\n    const spanY = 10 * (centroid[1] - posY * 8);\n\n    // Get height at centroid\n    const z = demSampler.getElevationAt(posX, posY, true, true);\n    const meterToDEM = demSampler.getMeterToDEM(lat);\n\n    const wX = Math.floor(0.5 * (spanX * meterToDEM - 1));\n    const wY = Math.floor(0.5 * (spanY * meterToDEM - 1));\n\n    const posPx = demSampler.tileCoordToPixel(posX, posY);\n\n    const offsetX = 2 * wX + 1;\n    const offsetY = 2 * wY + 1;\n    const corners = fourSample(demSampler, posPx.x - wX, posPx.y - wY, offsetX, offsetY);\n\n    const diffX = Math.abs(corners[0] - corners[1]);\n    const diffY = Math.abs(corners[2] - corners[3]);\n    const diffZ = Math.abs(corners[0] - corners[2]);\n    const diffW = Math.abs(corners[1] - corners[3]);\n\n    const diffSumX = diffX + diffY;\n    const diffSumY = diffZ + diffW;\n\n    const slopeX = Math.min(0.25, meterToDEM * 0.5 * diffSumX / offsetX);\n    const slopeY = Math.min(0.25, meterToDEM * 0.5 * diffSumY / offsetY);\n\n    return z + Math.max(slopeX * spanX, slopeY * spanY);\n}\n\nfunction fourSample(demSampler: DEMSampler, posX: number, posY: number, offsetX: number, offsetY: number): Vec4 {\n    return [\n        demSampler.getElevationAtPixel(posX, posY, true),\n        demSampler.getElevationAtPixel(posX + offsetY, posY, true),\n        demSampler.getElevationAtPixel(posX, posY + offsetY, true),\n        demSampler.getElevationAtPixel(posX + offsetX, posY + offsetY, true)\n    ];\n}\n\nexport default FillExtrusionStyleLayer;\n","// @flow\nimport {createLayout} from '../../util/struct_array.js';\n\nimport type {StructArrayLayout} from '../../util/struct_array.js';\n\nconst lineLayoutAttributes: StructArrayLayout = createLayout([\n    {name: 'a_pos_normal', components: 2, type: 'Int16'},\n    {name: 'a_data', components: 4, type: 'Uint8'},\n    {name: 'a_linesofar', components: 1, type: 'Float32'}\n], 4);\n\nexport default lineLayoutAttributes;\nexport const {members, size, alignment} = lineLayoutAttributes;\n","// @flow\nimport {createLayout} from '../../util/struct_array.js';\n\nimport type {StructArrayLayout} from '../../util/struct_array.js';\n\nconst lineLayoutAttributesExt: StructArrayLayout = createLayout([\n    {name: 'a_packed', components: 4, type: 'Float32'}\n]);\n\nexport default lineLayoutAttributesExt;\nexport const {members, size, alignment} = lineLayoutAttributesExt;\n","// @flow\nimport {createLayout} from '../../util/struct_array.js';\n\nimport type {StructArrayLayout} from '../../util/struct_array.js';\n\nconst lineLayoutAttributesPattern: StructArrayLayout = createLayout([\n    {name: 'a_pattern_data', components: 2, type: 'Float32'}\n]);\n\nexport default lineLayoutAttributesPattern;\nexport const {members, size, alignment} = lineLayoutAttributesPattern;\n","// @flow\n\nimport {warnOnce, nextPowerOfTwo} from '../util/util.js';\nimport {AlphaImage} from '../util/image.js';\nimport {register} from '../util/web_worker_transfer.js';\n\nimport type {SpritePosition, SpritePositions} from '../util/image.js';\n\ntype DashRange = {|\n    isDash: boolean,\n    left: number,\n    right: number,\n    zeroLength: boolean\n|};\n\n/**\n * A LineAtlas lets us reuse rendered dashed lines\n * by writing many of them to a texture and then fetching their positions\n * using .getDash.\n *\n * @param {number} width\n * @param {number} height\n * @private\n */\nclass LineAtlas {\n    width: number;\n    height: number;\n    nextRow: number;\n    image: AlphaImage;\n    positions: SpritePositions;\n    uploaded: boolean;\n\n    constructor(width: number, height: number) {\n        this.width = width;\n        this.height = height;\n        this.nextRow = 0;\n        this.image = new AlphaImage({width, height});\n        this.positions = {};\n        this.uploaded = false;\n    }\n\n    /**\n     * Get a dash line pattern.\n     *\n     * @param {Array<number>} dasharray\n     * @param {string} lineCap the type of line caps to be added to dashes\n     * @returns {Object} position of dash texture in { y, height, width }\n     * @private\n     */\n    getDash(dasharray: Array<number>, lineCap: string): SpritePosition {\n        const key = this.getKey(dasharray, lineCap);\n        return this.positions[key];\n    }\n\n    trim() {\n        const width = this.width;\n        const height = this.height = nextPowerOfTwo(this.nextRow);\n        this.image.resize({width, height});\n    }\n\n    getKey(dasharray: Array<number>, lineCap: string): string {\n        return dasharray.join(',') + lineCap;\n    }\n\n    getDashRanges(dasharray: Array<number>, lineAtlasWidth: number, stretch: number): Array<DashRange> {\n        // If dasharray has an odd length, both the first and last parts\n        // are dashes and should be joined seamlessly.\n        const oddDashArray = dasharray.length % 2 === 1;\n\n        const ranges = [];\n\n        let left = oddDashArray ? -dasharray[dasharray.length - 1] * stretch : 0;\n        let right = dasharray[0] * stretch;\n        let isDash = true;\n\n        ranges.push({left, right, isDash, zeroLength: dasharray[0] === 0});\n\n        let currentDashLength = dasharray[0];\n        for (let i = 1; i < dasharray.length; i++) {\n            isDash = !isDash;\n\n            const dashLength = dasharray[i];\n            left = currentDashLength * stretch;\n            currentDashLength += dashLength;\n            right = currentDashLength * stretch;\n\n            ranges.push({left, right, isDash, zeroLength: dashLength === 0});\n        }\n\n        return ranges;\n    }\n\n    addRoundDash(ranges: Array<DashRange>, stretch: number, n: number) {\n        const halfStretch = stretch / 2;\n\n        for (let y = -n; y <= n; y++) {\n            const row = this.nextRow + n + y;\n            const index = this.width * row;\n            let currIndex = 0;\n            let range = ranges[currIndex];\n\n            for (let x = 0; x < this.width; x++) {\n                if (x / range.right > 1) { range = ranges[++currIndex]; }\n\n                const distLeft = Math.abs(x - range.left);\n                const distRight = Math.abs(x - range.right);\n                const minDist = Math.min(distLeft, distRight);\n                let signedDistance;\n\n                const distMiddle =  y / n * (halfStretch + 1);\n                if (range.isDash) {\n                    const distEdge = halfStretch - Math.abs(distMiddle);\n                    signedDistance = Math.sqrt(minDist * minDist + distEdge * distEdge);\n                } else {\n                    signedDistance = halfStretch - Math.sqrt(minDist * minDist + distMiddle * distMiddle);\n                }\n\n                this.image.data[index + x] = Math.max(0, Math.min(255, signedDistance + 128));\n            }\n        }\n    }\n\n    addRegularDash(ranges: Array<DashRange>, capLength: number) {\n\n        // Collapse any zero-length range\n        // Collapse neighbouring same-type parts into a single part\n        for (let i = ranges.length - 1; i >= 0; --i) {\n            const part = ranges[i];\n            const next = ranges[i + 1];\n            if (part.zeroLength) {\n                ranges.splice(i, 1);\n            } else if (next && next.isDash === part.isDash) {\n                next.left = part.left;\n                ranges.splice(i, 1);\n            }\n        }\n\n        // Combine the first and last parts if possible\n        const first = ranges[0];\n        const last = ranges[ranges.length - 1];\n        if (first.isDash === last.isDash) {\n            first.left = last.left - this.width;\n            last.right = first.right + this.width;\n        }\n\n        const index = this.width * this.nextRow;\n        let currIndex = 0;\n        let range = ranges[currIndex];\n\n        for (let x = 0; x < this.width; x++) {\n            if (x / range.right > 1) {\n                range = ranges[++currIndex];\n            }\n\n            const distLeft = Math.abs(x - range.left);\n            const distRight = Math.abs(x - range.right);\n\n            const minDist = Math.min(distLeft, distRight);\n            const signedDistance = (range.isDash ? minDist : -minDist) + capLength;\n\n            this.image.data[index + x] = Math.max(0, Math.min(255, signedDistance + 128));\n        }\n    }\n\n    addDash(dasharray: Array<number>, lineCap: string): null | SpritePosition {\n        const key = this.getKey(dasharray, lineCap);\n        if (this.positions[key]) return this.positions[key];\n\n        const round = lineCap === 'round';\n        const n = round ? 7 : 0;\n        const height = 2 * n + 1;\n\n        if (this.nextRow + height > this.height) {\n            warnOnce('LineAtlas out of space');\n            return null;\n        }\n\n        // dasharray is empty, draws a full line (no dash or no gap length represented, default behavior)\n        if (dasharray.length === 0) {\n            // insert a single dash range in order to draw a full line\n            dasharray.push(1);\n        }\n\n        let length = 0;\n        for (let i = 0; i < dasharray.length; i++) {\n            if (dasharray[i] < 0) {\n                warnOnce('Negative value is found in line dasharray, replacing values with 0');\n                dasharray[i] = 0;\n            }\n            length += dasharray[i];\n        }\n\n        if (length !== 0) {\n            const stretch = this.width / length;\n            const ranges = this.getDashRanges(dasharray, this.width, stretch);\n\n            if (round) {\n                this.addRoundDash(ranges, stretch, n);\n            } else {\n                const capLength = lineCap === 'square' ? 0.5 * stretch : 0;\n                this.addRegularDash(ranges, capLength);\n            }\n        }\n\n        const y = this.nextRow + n;\n\n        this.nextRow += height;\n\n        const pos = {\n            tl: [y, n],\n            br: [length, 0]\n        };\n        this.positions[key] = pos;\n        return pos;\n    }\n}\n\nregister(LineAtlas, 'LineAtlas');\n\nexport default LineAtlas;\n","// @flow\n\nimport {LineLayoutArray, LineExtLayoutArray, LinePatternLayoutArray} from '../array_types.js';\n\nimport {members as layoutAttributes} from './line_attributes.js';\nimport {members as layoutAttributesExt} from './line_attributes_ext.js';\nimport {members as layoutAttributesPattern} from './line_attributes_pattern.js';\nimport SegmentVector from '../segment.js';\nimport {ProgramConfigurationSet} from '../program_configuration.js';\nimport {TriangleIndexArray} from '../index_array_type.js';\nimport EXTENT from '../../style-spec/data/extent.js';\nimport {VectorTileFeature} from '@mapbox/vector-tile';\nconst vectorTileFeatureTypes = VectorTileFeature.types;\nimport {register} from '../../util/web_worker_transfer.js';\nimport {hasPattern, addPatternDependencies} from './pattern_bucket_features.js';\nimport loadGeometry from '../load_geometry.js';\nimport toEvaluationFeature from '../evaluation_feature.js';\nimport EvaluationParameters from '../../style/evaluation_parameters.js';\n\n// Import LineAtlas as a module with side effects to ensure\n// it's registered as a serializable class on the main thread\nimport '../../render/line_atlas.js';\n\nimport type {ProjectionSpecification} from '../../style-spec/types.js';\nimport type {CanonicalTileID} from '../../source/tile_id.js';\nimport type {\n    Bucket,\n    BucketParameters,\n    BucketFeature,\n    IndexedFeature,\n    PopulateParameters\n} from '../bucket.js';\nimport type LineStyleLayer from '../../style/style_layer/line_style_layer.js';\nimport type Point from '@mapbox/point-geometry';\nimport type {Segment} from '../segment.js';\nimport type {RGBAImage, SpritePositions} from '../../util/image.js';\nimport type Context from '../../gl/context.js';\nimport type Texture from '../../render/texture.js';\nimport type IndexBuffer from '../../gl/index_buffer.js';\nimport type VertexBuffer from '../../gl/vertex_buffer.js';\nimport type {FeatureStates} from '../../source/source_state.js';\nimport type LineAtlas from '../../render/line_atlas.js';\nimport type {TileTransform} from '../../geo/projection/tile_transform.js';\nimport type {IVectorTileLayer} from '@mapbox/vector-tile';\n\n// NOTE ON EXTRUDE SCALE:\n// scale the extrusion vector so that the normal length is this value.\n// contains the \"texture\" normals (-1..1). this is distinct from the extrude\n// normals for line joins, because the x-value remains 0 for the texture\n// normal array, while the extrude normal actually moves the vertex to create\n// the acute/bevelled line join.\nconst EXTRUDE_SCALE = 63;\n\n/*\n * Sharp corners cause dashed lines to tilt because the distance along the line\n * is the same at both the inner and outer corners. To improve the appearance of\n * dashed lines we add extra points near sharp corners so that a smaller part\n * of the line is tilted.\n *\n * COS_HALF_SHARP_CORNER controls how sharp a corner has to be for us to add an\n * extra vertex. The default is 75 degrees.\n *\n * The newly created vertices are placed SHARP_CORNER_OFFSET pixels from the corner.\n */\nconst COS_HALF_SHARP_CORNER = Math.cos(75 / 2 * (Math.PI / 180));\nconst SHARP_CORNER_OFFSET = 15;\n\n/*\n * Straight corners are used to reduce vertex count for line-join: none lines.\n * If corner angle is less than COS_STRAIGHT_CORNER, we use a miter joint,\n * instead of creating a new line segment. The default is 5 degrees.\n */\nconst COS_STRAIGHT_CORNER = Math.cos(5 * (Math.PI / 180));\n\n// Angle per triangle for approximating round line joins.\nconst DEG_PER_TRIANGLE = 20;\n\ntype LineClips = {\n    start: number;\n    end: number;\n}\n\ntype GradientTexture = {\n    texture: Texture;\n    gradient: ?RGBAImage;\n    version: number;\n}\n\n/**\n * @private\n */\nclass LineBucket implements Bucket {\n    distance: number;\n    totalDistance: number;\n    maxLineLength: number;\n    scaledDistance: number;\n    lineSoFar: number;\n    lineClips: ?LineClips;\n\n    e1: number;\n    e2: number;\n\n    patternJoinNone: boolean;\n    segmentStart: number;\n    segmentPoints: Array<number>;\n\n    index: number;\n    zoom: number;\n    overscaling: number;\n    layers: Array<LineStyleLayer>;\n    layerIds: Array<string>;\n    gradients: {[string]: GradientTexture};\n    stateDependentLayers: Array<any>;\n    stateDependentLayerIds: Array<string>;\n    patternFeatures: Array<BucketFeature>;\n    lineClipsArray: Array<LineClips>;\n\n    layoutVertexArray: LineLayoutArray;\n    layoutVertexBuffer: VertexBuffer;\n    layoutVertexArray2: LineExtLayoutArray;\n    layoutVertexBuffer2: VertexBuffer;\n    patternVertexArray: LinePatternLayoutArray;\n    patternVertexBuffer: VertexBuffer;\n\n    indexArray: TriangleIndexArray;\n    indexBuffer: IndexBuffer;\n\n    hasPattern: boolean;\n    programConfigurations: ProgramConfigurationSet<LineStyleLayer>;\n    segments: SegmentVector;\n    uploaded: boolean;\n    projection: ProjectionSpecification;\n\n    constructor(options: BucketParameters<LineStyleLayer>) {\n        this.zoom = options.zoom;\n        this.overscaling = options.overscaling;\n        this.layers = options.layers;\n        this.layerIds = this.layers.map(layer => layer.fqid);\n        this.index = options.index;\n        this.projection = options.projection;\n        this.hasPattern = false;\n        this.patternFeatures = [];\n        this.lineClipsArray = [];\n        this.gradients = {};\n        this.layers.forEach(layer => {\n            this.gradients[layer.id] = {};\n        });\n\n        this.layoutVertexArray = new LineLayoutArray();\n        this.layoutVertexArray2 = new LineExtLayoutArray();\n        this.patternVertexArray = new LinePatternLayoutArray();\n        this.indexArray = new TriangleIndexArray();\n        this.programConfigurations = new ProgramConfigurationSet(options.layers, options.zoom);\n        this.segments = new SegmentVector();\n        this.maxLineLength = 0;\n\n        this.stateDependentLayerIds = this.layers.filter((l) => l.isStateDependent()).map((l) => l.id);\n    }\n\n    populate(features: Array<IndexedFeature>, options: PopulateParameters, canonical: CanonicalTileID, tileTransform: TileTransform) {\n        this.hasPattern = hasPattern('line', this.layers, options);\n        const lineSortKey = this.layers[0].layout.get('line-sort-key');\n        const bucketFeatures = [];\n\n        for (const {feature, id, index, sourceLayerIndex} of features) {\n            const needGeometry = this.layers[0]._featureFilter.needGeometry;\n            const evaluationFeature = toEvaluationFeature(feature, needGeometry);\n\n            // $FlowFixMe[method-unbinding]\n            if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) continue;\n\n            const sortKey = lineSortKey ?\n                lineSortKey.evaluate(evaluationFeature, {}, canonical) :\n                undefined;\n\n            const bucketFeature: BucketFeature = {\n                id,\n                properties: feature.properties,\n                type: feature.type,\n                sourceLayerIndex,\n                index,\n                geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature, canonical, tileTransform),\n                patterns: {},\n                sortKey\n            };\n\n            bucketFeatures.push(bucketFeature);\n        }\n\n        if (lineSortKey) {\n            bucketFeatures.sort((a, b) => {\n                // a.sortKey is always a number when in use\n                return ((a.sortKey: any): number) - ((b.sortKey: any): number);\n            });\n        }\n\n        const {lineAtlas, featureIndex} = options;\n        const hasFeatureDashes = this.addConstantDashes(lineAtlas);\n\n        for (const bucketFeature of bucketFeatures) {\n            const {geometry, index, sourceLayerIndex} = bucketFeature;\n\n            if (hasFeatureDashes) {\n                this.addFeatureDashes(bucketFeature, lineAtlas);\n            }\n\n            if (this.hasPattern) {\n                const patternBucketFeature = addPatternDependencies('line', this.layers, bucketFeature, this.zoom, options);\n                // pattern features are added only once the pattern is loaded into the image atlas\n                // so are stored during populate until later updated with positions by tile worker in addFeatures\n                this.patternFeatures.push(patternBucketFeature);\n\n            } else {\n                this.addFeature(bucketFeature, geometry, index, canonical, lineAtlas.positions, options.availableImages, options.brightness);\n            }\n\n            const feature = features[index].feature;\n            featureIndex.insert(feature, geometry, index, sourceLayerIndex, this.index);\n        }\n    }\n\n    addConstantDashes(lineAtlas: LineAtlas): boolean {\n        let hasFeatureDashes = false;\n\n        for (const layer of this.layers) {\n            const dashPropertyValue = layer.paint.get('line-dasharray').value;\n            const capPropertyValue = layer.layout.get('line-cap').value;\n\n            if (dashPropertyValue.kind !== 'constant' || capPropertyValue.kind !== 'constant') {\n                hasFeatureDashes = true;\n\n            } else {\n                const constCap = capPropertyValue.value;\n                const constDash = dashPropertyValue.value;\n                if (!constDash) continue;\n                lineAtlas.addDash(constDash, constCap);\n            }\n        }\n\n        return hasFeatureDashes;\n    }\n\n    addFeatureDashes(feature: BucketFeature, lineAtlas: LineAtlas) {\n\n        const zoom = this.zoom;\n\n        for (const layer of this.layers) {\n            const dashPropertyValue = layer.paint.get('line-dasharray').value;\n            const capPropertyValue = layer.layout.get('line-cap').value;\n\n            if (dashPropertyValue.kind === 'constant' && capPropertyValue.kind === 'constant') continue;\n\n            let dashArray, cap;\n\n            if (dashPropertyValue.kind === 'constant') {\n                dashArray = dashPropertyValue.value;\n                if (!dashArray) continue;\n\n            } else {\n                dashArray = dashPropertyValue.evaluate({zoom}, feature);\n            }\n\n            if (capPropertyValue.kind === 'constant') {\n                cap = capPropertyValue.value;\n\n            } else {\n                cap = capPropertyValue.evaluate({zoom}, feature);\n            }\n\n            lineAtlas.addDash(dashArray, cap);\n\n            // save positions for paint array\n            feature.patterns[layer.id] = lineAtlas.getKey(dashArray, cap);\n        }\n\n    }\n\n    update(states: FeatureStates, vtLayer: IVectorTileLayer, availableImages: Array<string>, imagePositions: SpritePositions, brightness: ?number) {\n        const withStateUpdates = Object.keys(states).length !== 0;\n        if (withStateUpdates && !this.stateDependentLayers.length) return;\n        const layers = withStateUpdates ? this.stateDependentLayers : this.layers;\n        this.programConfigurations.updatePaintArrays(states, vtLayer, layers, availableImages, imagePositions, brightness);\n    }\n\n    addFeatures(options: PopulateParameters, canonical: CanonicalTileID, imagePositions: SpritePositions, availableImages: Array<string>, _: TileTransform, brightness: ?number) {\n        for (const feature of this.patternFeatures) {\n            this.addFeature(feature, feature.geometry, feature.index, canonical, imagePositions, availableImages, brightness);\n        }\n    }\n\n    isEmpty(): boolean {\n        return this.layoutVertexArray.length === 0;\n    }\n\n    uploadPending(): boolean {\n        return !this.uploaded || this.programConfigurations.needsUpload;\n    }\n\n    upload(context: Context) {\n        if (!this.uploaded) {\n            if (this.layoutVertexArray2.length !== 0) {\n                this.layoutVertexBuffer2 = context.createVertexBuffer(this.layoutVertexArray2, layoutAttributesExt);\n            }\n            if (this.patternVertexArray.length !== 0) {\n                this.patternVertexBuffer = context.createVertexBuffer(this.patternVertexArray, layoutAttributesPattern);\n            }\n            this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, layoutAttributes);\n            this.indexBuffer = context.createIndexBuffer(this.indexArray);\n        }\n        this.programConfigurations.upload(context);\n        this.uploaded = true;\n    }\n\n    destroy() {\n        if (!this.layoutVertexBuffer) return;\n        this.layoutVertexBuffer.destroy();\n        this.indexBuffer.destroy();\n        this.programConfigurations.destroy();\n        this.segments.destroy();\n    }\n\n    lineFeatureClips(feature: BucketFeature): ?LineClips {\n        if (!!feature.properties && feature.properties.hasOwnProperty('mapbox_clip_start') && feature.properties.hasOwnProperty('mapbox_clip_end')) {\n            const start = +feature.properties['mapbox_clip_start'];\n            const end = +feature.properties['mapbox_clip_end'];\n            return {start, end};\n        }\n    }\n\n    addFeature(feature: BucketFeature, geometry: Array<Array<Point>>, index: number, canonical: CanonicalTileID, imagePositions: SpritePositions, availableImages: Array<string>, brightness: ?number) {\n        const layout = this.layers[0].layout;\n        const join = layout.get('line-join').evaluate(feature, {});\n        const cap = layout.get('line-cap').evaluate(feature, {});\n        const miterLimit = layout.get('line-miter-limit');\n        const roundLimit = layout.get('line-round-limit');\n        this.lineClips = this.lineFeatureClips(feature);\n\n        for (const line of geometry) {\n            this.addLine(line, feature, join, cap, miterLimit, roundLimit);\n        }\n\n        this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, imagePositions, availableImages, canonical, brightness);\n    }\n\n    addLine(vertices: Array<Point>, feature: BucketFeature, join: string, cap: string, miterLimit: number, roundLimit: number) {\n        this.distance = 0;\n        this.scaledDistance = 0;\n        this.totalDistance = 0;\n        this.lineSoFar = 0;\n\n        const joinNone = join === 'none';\n        this.patternJoinNone = this.hasPattern && joinNone;\n        this.segmentStart = 0;\n        this.segmentPoints = [];\n\n        if (this.lineClips) {\n            this.lineClipsArray.push(this.lineClips);\n            // Calculate the total distance, in tile units, of this tiled line feature\n            for (let i = 0; i < vertices.length - 1; i++) {\n                this.totalDistance += vertices[i].dist(vertices[i + 1]);\n            }\n            this.updateScaledDistance();\n            this.maxLineLength = Math.max(this.maxLineLength, this.totalDistance);\n        }\n\n        const isPolygon = vectorTileFeatureTypes[feature.type] === 'Polygon';\n\n        // If the line has duplicate vertices at the ends, adjust start/length to remove them.\n        let len = vertices.length;\n        while (len >= 2 && vertices[len - 1].equals(vertices[len - 2])) {\n            len--;\n        }\n        let first = 0;\n        while (first < len - 1 && vertices[first].equals(vertices[first + 1])) {\n            first++;\n        }\n\n        // Ignore invalid geometry.\n        if (len < (isPolygon ? 3 : 2)) return;\n\n        if (join === 'bevel') miterLimit = 1.05;\n\n        const sharpCornerOffset = this.overscaling <= 16 ?\n            SHARP_CORNER_OFFSET * EXTENT / (512 * this.overscaling) :\n            0;\n\n        // we could be more precise, but it would only save a negligible amount of space\n        const segment = this.segments.prepareSegment(len * 10, this.layoutVertexArray, this.indexArray);\n\n        let currentVertex;\n        let prevVertex = ((undefined: any): Point);\n        let nextVertex = ((undefined: any): Point);\n        let prevNormal = ((undefined: any): Point);\n        let nextNormal = ((undefined: any): Point);\n\n        // the last two vertices added\n        this.e1 = this.e2 = -1;\n\n        if (isPolygon) {\n            currentVertex = vertices[len - 2];\n            nextNormal = vertices[first].sub(currentVertex)._unit()._perp();\n        }\n\n        for (let i = first; i < len; i++) {\n\n            nextVertex = i === len - 1 ?\n                (isPolygon ? vertices[first + 1] : (undefined: any)) : // if it's a polygon, treat the last vertex like the first\n                vertices[i + 1]; // just the next vertex\n\n            // if two consecutive vertices exist, skip the current one\n            if (nextVertex && vertices[i].equals(nextVertex)) continue;\n\n            if (nextNormal) prevNormal = nextNormal;\n            if (currentVertex) prevVertex = currentVertex;\n\n            currentVertex = vertices[i];\n\n            // Calculate the normal towards the next vertex in this line. In case\n            // there is no next vertex, pretend that the line is continuing straight,\n            // meaning that we are just using the previous normal.\n            nextNormal = nextVertex ? nextVertex.sub(currentVertex)._unit()._perp() : prevNormal;\n\n            // If we still don't have a previous normal, this is the beginning of a\n            // non-closed line, so we're doing a straight \"join\".\n            prevNormal = prevNormal || nextNormal;\n\n            // The join if a middle vertex, otherwise the cap.\n            const middleVertex = prevVertex && nextVertex;\n            let currentJoin = middleVertex ? join : (isPolygon || joinNone) ? 'butt' : cap;\n\n            // calculate cosines of the angle (and its half) using dot product\n            const cosAngle = prevNormal.x * nextNormal.x + prevNormal.y * nextNormal.y;\n\n            if (joinNone) {\n                const endLineSegment = function (bucket: LineBucket) {\n                    if (bucket.patternJoinNone) {\n                        const pointCount = bucket.segmentPoints.length / 2;\n                        const segmentLength = bucket.lineSoFar - bucket.segmentStart;\n                        for (let idx = 0; idx < pointCount; ++idx) {\n                            const pos = bucket.segmentPoints[idx * 2];\n                            const offsetSign = bucket.segmentPoints[idx * 2 + 1];\n                            // Integer part contains position in tile units\n                            // Fractional part has offset sign 0.25 = -1, 0.5 = 0, 0.75 = 1\n                            const posAndOffset = Math.round(pos) + 0.5 + offsetSign * 0.25;\n                            bucket.patternVertexArray.emplaceBack(posAndOffset, segmentLength);\n                            bucket.patternVertexArray.emplaceBack(posAndOffset, segmentLength);\n                        }\n\n                        // Reset line segment\n                        bucket.segmentPoints = [];\n                        bucket.segmentStart = bucket.lineSoFar;\n                    }\n\n                    bucket.e1 = bucket.e2 = -1;\n                };\n\n                if (middleVertex && cosAngle < COS_STRAIGHT_CORNER) { // Not straight corner, create separate line segment\n                    this.updateDistance(prevVertex, currentVertex);\n                    this.addCurrentVertex(currentVertex, prevNormal, 1, 1, segment);\n                    endLineSegment(this);\n\n                    // Start new segment\n                    this.addCurrentVertex(currentVertex, nextNormal, -1, -1, segment);\n\n                    continue; // Don't apply other geometry generation logic\n                } else if (prevVertex) {\n                    if (!nextVertex) { // End line string\n                        this.updateDistance(prevVertex, currentVertex);\n                        this.addCurrentVertex(currentVertex, prevNormal, 1, 1, segment);\n                        endLineSegment(this);\n\n                        continue; // Don't apply other geometry generation logic\n                    } else {\n                        currentJoin = 'miter';\n                    }\n                }\n            }\n\n            // Determine the normal of the join extrusion. It is the angle bisector\n            // of the segments between the previous line and the next line.\n            // In the case of 180° angles, the prev and next normals cancel each other out:\n            // prevNormal + nextNormal = (0, 0), its magnitude is 0, so the unit vector would be\n            // undefined. In that case, we're keeping the joinNormal at (0, 0), so that the cosHalfAngle\n            // below will also become 0 and miterLength will become Infinity.\n            let joinNormal = prevNormal.add(nextNormal);\n            if (joinNormal.x !== 0 || joinNormal.y !== 0) {\n                joinNormal._unit();\n            }\n            /*  joinNormal     prevNormal\n             *             ↖      ↑\n             *                .________. prevVertex\n             *                |\n             * nextNormal  ←  |  currentVertex\n             *                |\n             *     nextVertex !\n             *\n             */\n\n            const cosHalfAngle = joinNormal.x * nextNormal.x + joinNormal.y * nextNormal.y;\n\n            // Calculate the length of the miter (the ratio of the miter to the width)\n            // as the inverse of cosine of the angle between next and join normals\n            const miterLength = cosHalfAngle !== 0 ? 1 / cosHalfAngle : Infinity;\n\n            // approximate angle from cosine\n            const approxAngle = 2 * Math.sqrt(2 - 2 * cosHalfAngle);\n\n            const isSharpCorner = cosHalfAngle < COS_HALF_SHARP_CORNER && prevVertex && nextVertex;\n            const lineTurnsLeft = prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x > 0;\n\n            if (isSharpCorner && i > first) {\n                const prevSegmentLength = currentVertex.dist(prevVertex);\n                if (prevSegmentLength > 2 * sharpCornerOffset) {\n                    const newPrevVertex = currentVertex.sub(currentVertex.sub(prevVertex)._mult(sharpCornerOffset / prevSegmentLength)._round());\n                    this.updateDistance(prevVertex, newPrevVertex);\n                    this.addCurrentVertex(newPrevVertex, prevNormal, 0, 0, segment);\n                    prevVertex = newPrevVertex;\n                }\n            }\n\n            if (middleVertex && currentJoin === 'round') {\n                if (miterLength < roundLimit) {\n                    currentJoin = 'miter';\n                } else if (miterLength <= 2) {\n                    currentJoin = 'fakeround';\n                }\n            }\n\n            if (currentJoin === 'miter' && miterLength > miterLimit) {\n                currentJoin = 'bevel';\n            }\n\n            if (currentJoin === 'bevel') {\n                // The maximum extrude length is 128 / 63 = 2 times the width of the line\n                // so if miterLength >= 2 we need to draw a different type of bevel here.\n                if (miterLength > 2) currentJoin = 'flipbevel';\n\n                // If the miterLength is really small and the line bevel wouldn't be visible,\n                // just draw a miter join to save a triangle.\n                if (miterLength < miterLimit) currentJoin = 'miter';\n            }\n\n            // Calculate how far along the line the currentVertex is\n            if (prevVertex) this.updateDistance(prevVertex, currentVertex);\n\n            if (currentJoin === 'miter') {\n\n                joinNormal._mult(miterLength);\n                this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment);\n\n            } else if (currentJoin === 'flipbevel') {\n                // miter is too big, flip the direction to make a beveled join\n\n                if (miterLength > 100) {\n                    // Almost parallel lines\n                    joinNormal = nextNormal.mult(-1);\n\n                } else {\n                    const bevelLength = miterLength * prevNormal.add(nextNormal).mag() / prevNormal.sub(nextNormal).mag();\n                    joinNormal._perp()._mult(bevelLength * (lineTurnsLeft ? -1 : 1));\n                }\n                this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment);\n                this.addCurrentVertex(currentVertex, joinNormal.mult(-1), 0, 0, segment);\n\n            } else if (currentJoin === 'bevel' || currentJoin === 'fakeround') {\n                const offset = -Math.sqrt(miterLength * miterLength - 1);\n                const offsetA = lineTurnsLeft ? offset : 0;\n                const offsetB = lineTurnsLeft ? 0 : offset;\n\n                // Close previous segment with a bevel\n                if (prevVertex) {\n                    this.addCurrentVertex(currentVertex, prevNormal, offsetA, offsetB, segment);\n                }\n\n                if (currentJoin === 'fakeround') {\n                    // The join angle is sharp enough that a round join would be visible.\n                    // Bevel joins fill the gap between segments with a single pie slice triangle.\n                    // Create a round join by adding multiple pie slices. The join isn't actually round, but\n                    // it looks like it is at the sizes we render lines at.\n\n                    // pick the number of triangles for approximating round join by based on the angle between normals\n                    const n = Math.round((approxAngle * 180 / Math.PI) / DEG_PER_TRIANGLE);\n\n                    for (let m = 1; m < n; m++) {\n                        let t = m / n;\n                        if (t !== 0.5) {\n                            // approximate spherical interpolation https://observablehq.com/@mourner/approximating-geometric-slerp\n                            const t2 = t - 0.5;\n                            const A = 1.0904 + cosAngle * (-3.2452 + cosAngle * (3.55645 - cosAngle * 1.43519));\n                            const B = 0.848013 + cosAngle * (-1.06021 + cosAngle * 0.215638);\n                            t = t + t * t2 * (t - 1) * (A * t2 * t2 + B);\n                        }\n                        const extrude = nextNormal.sub(prevNormal)._mult(t)._add(prevNormal)._unit()._mult(lineTurnsLeft ? -1 : 1);\n                        this.addHalfVertex(currentVertex, extrude.x, extrude.y, false, lineTurnsLeft, 0, segment);\n                    }\n                }\n\n                if (nextVertex) {\n                    // Start next segment\n                    this.addCurrentVertex(currentVertex, nextNormal, -offsetA, -offsetB, segment);\n                }\n\n            } else if (currentJoin === 'butt') {\n                this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment); // butt cap\n            } else if (currentJoin === 'square') {\n                if (!prevVertex) {\n                    this.addCurrentVertex(currentVertex, joinNormal, -1, -1, segment);\n                }\n\n                // make the cap it's own quad to avoid the cap affecting the line distance\n                this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment);\n\n                if (prevVertex) {\n                    this.addCurrentVertex(currentVertex, joinNormal, 1, 1, segment);\n                }\n\n            } else if (currentJoin === 'round') {\n\n                if (prevVertex) {\n                    // Close previous segment with butt\n                    this.addCurrentVertex(currentVertex, prevNormal, 0, 0, segment);\n\n                    // Add round cap or linejoin at end of segment\n                    this.addCurrentVertex(currentVertex, prevNormal, 1, 1, segment, true);\n                }\n                if (nextVertex) {\n                    // Add round cap before first segment\n                    this.addCurrentVertex(currentVertex, nextNormal, -1, -1, segment, true);\n\n                    // Start next segment with a butt\n                    this.addCurrentVertex(currentVertex, nextNormal, 0, 0, segment);\n                }\n            }\n\n            if (isSharpCorner && i < len - 1) {\n                const nextSegmentLength = currentVertex.dist(nextVertex);\n                if (nextSegmentLength > 2 * sharpCornerOffset) {\n                    const newCurrentVertex = currentVertex.add(nextVertex.sub(currentVertex)._mult(sharpCornerOffset / nextSegmentLength)._round());\n                    this.updateDistance(currentVertex, newCurrentVertex);\n                    this.addCurrentVertex(newCurrentVertex, nextNormal, 0, 0, segment);\n                    currentVertex = newCurrentVertex;\n                }\n            }\n        }\n    }\n\n    /**\n     * Add two vertices to the buffers.\n     *\n     * @param p the line vertex to add buffer vertices for\n     * @param normal vertex normal\n     * @param endLeft extrude to shift the left vertex along the line\n     * @param endRight extrude to shift the left vertex along the line\n     * @param segment the segment object to add the vertex to\n     * @param round whether this is a round cap\n     * @private\n     */\n    addCurrentVertex(p: Point, normal: Point, endLeft: number, endRight: number, segment: Segment, round: boolean = false) {\n        // left and right extrude vectors, perpendicularly shifted by endLeft/endRight\n        const leftX = normal.x + normal.y * endLeft;\n        const leftY = normal.y - normal.x * endLeft;\n        const rightX = -normal.x + normal.y * endRight;\n        const rightY = -normal.y - normal.x * endRight;\n\n        this.addHalfVertex(p, leftX, leftY, round, false, endLeft, segment);\n        this.addHalfVertex(p, rightX, rightY, round, true, -endRight, segment);\n\n        if (this.patternJoinNone) {\n            // Real data is inserted after each line segment is finished\n            this.segmentPoints.push(this.lineSoFar - this.segmentStart, endLeft);\n        }\n    }\n\n    addHalfVertex({x, y}: Point, extrudeX: number, extrudeY: number, round: boolean, up: boolean, dir: number, segment: Segment) {\n        this.layoutVertexArray.emplaceBack(\n            // a_pos_normal\n            // Encode round/up the least significant bits\n            (x << 1) + (round ? 1 : 0),\n            (y << 1) + (up ? 1 : 0),\n            // a_data\n            // add 128 to store a byte in an unsigned byte\n            Math.round(EXTRUDE_SCALE * extrudeX) + 128,\n            Math.round(EXTRUDE_SCALE * extrudeY) + 128,\n            ((dir === 0 ? 0 : (dir < 0 ? -1 : 1)) + 1),\n            0, // unused\n            // a_linesofar\n            this.lineSoFar);\n\n        // Constructs a second vertex buffer with higher precision line progress\n        if (this.lineClips) {\n            this.layoutVertexArray2.emplaceBack(this.scaledDistance, this.lineClipsArray.length, this.lineClips.start, this.lineClips.end);\n        }\n\n        const e = segment.vertexLength++;\n        if (this.e1 >= 0 && this.e2 >= 0) {\n            this.indexArray.emplaceBack(this.e1, this.e2, e);\n            segment.primitiveLength++;\n        }\n        if (up) {\n            this.e2 = e;\n        } else {\n            this.e1 = e;\n        }\n    }\n\n    updateScaledDistance() {\n        // Knowing the ratio of the full linestring covered by this tiled feature, as well\n        // as the total distance (in tile units) of this tiled feature, and the distance\n        // (in tile units) of the current vertex, we can determine the relative distance\n        // of this vertex along the full linestring feature.\n        if (this.lineClips) {\n            const featureShare = this.lineClips.end - this.lineClips.start;\n            const totalFeatureLength = this.totalDistance / featureShare;\n            this.scaledDistance = this.distance / this.totalDistance;\n            this.lineSoFar = totalFeatureLength * this.lineClips.start + this.distance;\n        } else {\n            this.lineSoFar = this.distance;\n        }\n    }\n\n    updateDistance(prev: Point, next: Point) {\n        this.distance += prev.dist(next);\n        this.updateScaledDistance();\n    }\n}\n\nregister(LineBucket, 'LineBucket', {omit: ['layers', 'patternFeatures']});\n\nexport default LineBucket;\n","// This file is generated. Edit build/generate-style-code.js, then run `npm run codegen`.\n// @flow\n/* eslint-disable */\n\nimport styleSpec from '../../style-spec/reference/latest.js';\n\nimport {\n    Properties,\n    DataConstantProperty,\n    DataDrivenProperty,\n    ColorRampProperty\n} from '../properties.js';\n\nimport type Color from '../../style-spec/util/color.js';\n\nimport type Formatted from '../../style-spec/expression/types/formatted.js';\n\nimport type ResolvedImage from '../../style-spec/expression/types/resolved_image.js';\n\nexport type LayoutProps = {|\n    \"line-cap\": DataDrivenProperty<\"butt\" | \"round\" | \"square\">,\n    \"line-join\": DataDrivenProperty<\"bevel\" | \"round\" | \"miter\" | \"none\">,\n    \"line-miter-limit\": DataConstantProperty<number>,\n    \"line-round-limit\": DataConstantProperty<number>,\n    \"line-sort-key\": DataDrivenProperty<number>,\n    \"visibility\": DataConstantProperty<\"visible\" | \"none\">,\n|};\n\nconst layout: Properties<LayoutProps> = new Properties({\n    \"line-cap\": new DataDrivenProperty(styleSpec[\"layout_line\"][\"line-cap\"]),\n    \"line-join\": new DataDrivenProperty(styleSpec[\"layout_line\"][\"line-join\"]),\n    \"line-miter-limit\": new DataConstantProperty(styleSpec[\"layout_line\"][\"line-miter-limit\"]),\n    \"line-round-limit\": new DataConstantProperty(styleSpec[\"layout_line\"][\"line-round-limit\"]),\n    \"line-sort-key\": new DataDrivenProperty(styleSpec[\"layout_line\"][\"line-sort-key\"]),\n    \"visibility\": new DataConstantProperty(styleSpec[\"layout_line\"][\"visibility\"]),\n});\n\nexport type PaintProps = {|\n    \"line-opacity\": DataDrivenProperty<number>,\n    \"line-color\": DataDrivenProperty<Color>,\n    \"line-translate\": DataConstantProperty<[number, number]>,\n    \"line-translate-anchor\": DataConstantProperty<\"map\" | \"viewport\">,\n    \"line-width\": DataDrivenProperty<number>,\n    \"line-gap-width\": DataDrivenProperty<number>,\n    \"line-offset\": DataDrivenProperty<number>,\n    \"line-blur\": DataDrivenProperty<number>,\n    \"line-dasharray\": DataDrivenProperty<?Array<number>>,\n    \"line-pattern\": DataDrivenProperty<?ResolvedImage>,\n    \"line-gradient\": ColorRampProperty,\n    \"line-trim-offset\": DataConstantProperty<[number, number]>,\n    \"line-emissive-strength\": DataConstantProperty<number>,\n    \"line-border-width\": DataDrivenProperty<number>,\n    \"line-border-color\": DataDrivenProperty<Color>,\n|};\n\nconst paint: Properties<PaintProps> = new Properties({\n    \"line-opacity\": new DataDrivenProperty(styleSpec[\"paint_line\"][\"line-opacity\"]),\n    \"line-color\": new DataDrivenProperty(styleSpec[\"paint_line\"][\"line-color\"]),\n    \"line-translate\": new DataConstantProperty(styleSpec[\"paint_line\"][\"line-translate\"]),\n    \"line-translate-anchor\": new DataConstantProperty(styleSpec[\"paint_line\"][\"line-translate-anchor\"]),\n    \"line-width\": new DataDrivenProperty(styleSpec[\"paint_line\"][\"line-width\"]),\n    \"line-gap-width\": new DataDrivenProperty(styleSpec[\"paint_line\"][\"line-gap-width\"]),\n    \"line-offset\": new DataDrivenProperty(styleSpec[\"paint_line\"][\"line-offset\"]),\n    \"line-blur\": new DataDrivenProperty(styleSpec[\"paint_line\"][\"line-blur\"]),\n    \"line-dasharray\": new DataDrivenProperty(styleSpec[\"paint_line\"][\"line-dasharray\"]),\n    \"line-pattern\": new DataDrivenProperty(styleSpec[\"paint_line\"][\"line-pattern\"]),\n    \"line-gradient\": new ColorRampProperty(styleSpec[\"paint_line\"][\"line-gradient\"]),\n    \"line-trim-offset\": new DataConstantProperty(styleSpec[\"paint_line\"][\"line-trim-offset\"]),\n    \"line-emissive-strength\": new DataConstantProperty(styleSpec[\"paint_line\"][\"line-emissive-strength\"]),\n    \"line-border-width\": new DataDrivenProperty(styleSpec[\"paint_line\"][\"line-border-width\"]),\n    \"line-border-color\": new DataDrivenProperty(styleSpec[\"paint_line\"][\"line-border-color\"]),\n});\n\n// Note: without adding the explicit type annotation, Flow infers weaker types\n// for these objects from their use in the constructor to StyleLayer, as\n// {layout?: Properties<...>, paint: Properties<...>}\nexport default ({ paint, layout }: $Exact<{\n  paint: Properties<PaintProps>, layout: Properties<LayoutProps>\n}>);\n","// @flow\n\nimport {mat2} from 'gl-matrix';\n\nimport EXTENT from '../style-spec/data/extent.js';\n\nimport type {OverscaledTileID} from './tile_id.js';\nimport type Transform from '../geo/transform.js';\nimport type {TileTransform} from '../geo/projection/tile_transform.js';\n\n/**\n * Converts a pixel value at a the given zoom level to tile units.\n *\n * The shaders mostly calculate everything in tile units so style\n * properties need to be converted from pixels to tile units using this.\n *\n * For example, a translation by 30 pixels at zoom 6.5 will be a\n * translation by pixelsToTileUnits(30, 6.5) tile units.\n *\n * @returns value in tile units\n * @private\n */\nexport default function(tile: interface {tileID: OverscaledTileID, tileSize: number}, pixelValue: number, z: number): number {\n    return pixelValue * (EXTENT / (tile.tileSize * Math.pow(2, z - tile.tileID.overscaledZ)));\n}\n\nexport function getPixelsToTileUnitsMatrix(tile: interface {tileID: OverscaledTileID, tileSize: number, +tileTransform: TileTransform}, transform: Transform): Float32Array {\n    const {scale} = tile.tileTransform;\n    const s = scale * EXTENT / (tile.tileSize * Math.pow(2, transform.zoom - tile.tileID.overscaledZ + tile.tileID.canonical.z));\n    return mat2.scale(new Float32Array(4), transform.inverseAdjustmentMatrix, [s, s]);\n}\n","// @flow\n\nimport {\n    Uniform1i,\n    Uniform1f,\n    Uniform2f,\n    UniformMatrix2f,\n    UniformMatrix4f\n} from '../uniform_binding.js';\nimport pixelsToTileUnits from '../../source/pixels_to_tile_units.js';\n\nimport type Context from '../../gl/context.js';\nimport type {UniformValues} from '../uniform_binding.js';\nimport type Transform from '../../geo/transform.js';\nimport type Tile from '../../source/tile.js';\nimport type LineStyleLayer from '../../style/style_layer/line_style_layer.js';\nimport type Painter from '../painter.js';\n\nexport type LineUniformsType = {|\n    'u_matrix': UniformMatrix4f,\n    'u_pixels_to_tile_units': UniformMatrix2f,\n    'u_device_pixel_ratio': Uniform1f,\n    'u_units_to_pixels': Uniform2f,\n    'u_dash_image': Uniform1i,\n    'u_gradient_image': Uniform1i,\n    'u_image_height': Uniform1f,\n    'u_texsize': Uniform2f,\n    'u_tile_units_to_pixels': Uniform1f,\n    'u_alpha_discard_threshold': Uniform1f,\n    'u_trim_offset': Uniform2f,\n    'u_emissive_strength': Uniform1f\n|};\n\nexport type LinePatternUniformsType = {|\n    'u_matrix': UniformMatrix4f,\n    'u_texsize': Uniform2f,\n    'u_pixels_to_tile_units': UniformMatrix2f,\n    'u_device_pixel_ratio': Uniform1f,\n    'u_units_to_pixels': Uniform2f,\n    'u_image': Uniform1i,\n    'u_tile_units_to_pixels': Uniform1f,\n    'u_alpha_discard_threshold': Uniform1f,\n    'u_trim_offset': Uniform2f,\n|};\n\nexport type LineDefinesType = 'RENDER_LINE_GRADIENT' | 'RENDER_LINE_DASH' | 'RENDER_LINE_TRIM_OFFSET' | 'RENDER_LINE_BORDER' | 'LINE_JOIN_NONE';\n\nconst lineUniforms = (context: Context): LineUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context),\n    'u_pixels_to_tile_units': new UniformMatrix2f(context),\n    'u_device_pixel_ratio': new Uniform1f(context),\n    'u_units_to_pixels': new Uniform2f(context),\n    'u_dash_image': new Uniform1i(context),\n    'u_gradient_image': new Uniform1i(context),\n    'u_image_height': new Uniform1f(context),\n    'u_texsize': new Uniform2f(context),\n    'u_tile_units_to_pixels': new Uniform1f(context),\n    'u_alpha_discard_threshold': new Uniform1f(context),\n    'u_trim_offset': new Uniform2f(context),\n    'u_emissive_strength': new Uniform1f(context)\n});\n\nconst linePatternUniforms = (context: Context): LinePatternUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context),\n    'u_texsize': new Uniform2f(context),\n    'u_pixels_to_tile_units': new UniformMatrix2f(context),\n    'u_device_pixel_ratio': new Uniform1f(context),\n    'u_image': new Uniform1i(context),\n    'u_units_to_pixels': new Uniform2f(context),\n    'u_tile_units_to_pixels': new Uniform1f(context),\n    'u_alpha_discard_threshold': new Uniform1f(context),\n    'u_trim_offset': new Uniform2f(context),\n});\n\nconst lineUniformValues = (\n    painter: Painter,\n    tile: Tile,\n    layer: LineStyleLayer,\n    matrix: ?Float32Array,\n    imageHeight: number,\n    pixelRatio: number,\n    trimOffset: [number, number],\n): UniformValues<LineUniformsType> => {\n    const transform = painter.transform;\n    const pixelsToTileUnits = transform.calculatePixelsToTileUnitsMatrix(tile);\n    return {\n        'u_matrix': calculateMatrix(painter, tile, layer, matrix),\n        'u_pixels_to_tile_units': pixelsToTileUnits,\n        'u_device_pixel_ratio': pixelRatio,\n        'u_units_to_pixels': [\n            1 / transform.pixelsToGLUnits[0],\n            1 / transform.pixelsToGLUnits[1]\n        ],\n        'u_dash_image': 0,\n        'u_gradient_image': 1,\n        'u_image_height': imageHeight,\n        'u_texsize': hasDash(layer) && tile.lineAtlasTexture ? tile.lineAtlasTexture.size : [0, 0],\n        'u_tile_units_to_pixels': calculateTileRatio(tile, painter.transform),\n        'u_alpha_discard_threshold': 0.0,\n        'u_trim_offset': trimOffset,\n        'u_emissive_strength': layer.paint.get('line-emissive-strength')\n    };\n};\n\nconst linePatternUniformValues = (\n    painter: Painter,\n    tile: Tile,\n    layer: LineStyleLayer,\n    matrix: ?Float32Array,\n    pixelRatio: number,\n    trimOffset: [number, number],\n): UniformValues<LinePatternUniformsType> => {\n    const transform = painter.transform;\n    return {\n        'u_matrix': calculateMatrix(painter, tile, layer, matrix),\n        'u_texsize': tile.imageAtlasTexture ? tile.imageAtlasTexture.size : [0, 0],\n        // camera zoom ratio\n        'u_pixels_to_tile_units': transform.calculatePixelsToTileUnitsMatrix(tile),\n        'u_device_pixel_ratio': pixelRatio,\n        'u_image': 0,\n        'u_tile_units_to_pixels': calculateTileRatio(tile, transform),\n        'u_units_to_pixels': [\n            1 / transform.pixelsToGLUnits[0],\n            1 / transform.pixelsToGLUnits[1]\n        ],\n        'u_alpha_discard_threshold': 0.0,\n        'u_trim_offset': trimOffset\n    };\n};\n\nfunction calculateTileRatio(tile: Tile, transform: Transform) {\n    return 1 / pixelsToTileUnits(tile, 1, transform.tileZoom);\n}\n\nfunction calculateMatrix(painter: Painter, tile: Tile, layer: LineStyleLayer, matrix: ?Float32Array) {\n    return painter.translatePosMatrix(\n        matrix ? matrix : tile.tileID.projMatrix,\n        tile,\n        layer.paint.get('line-translate'),\n        layer.paint.get('line-translate-anchor')\n    );\n}\n\nconst lineDefinesValues = (layer: LineStyleLayer): LineDefinesType[] => {\n    const values = [];\n    if (hasDash(layer)) values.push('RENDER_LINE_DASH');\n    if (layer.paint.get('line-gradient')) values.push('RENDER_LINE_GRADIENT');\n\n    const trimOffset = layer.paint.get('line-trim-offset');\n    if (trimOffset[0] !== 0 || trimOffset[1] !== 0) {\n        values.push('RENDER_LINE_TRIM_OFFSET');\n    }\n\n    const hasBorder = layer.paint.get('line-border-width').constantOr(1.0) !== 0.0;\n    if (hasBorder) values.push('RENDER_LINE_BORDER');\n\n    const hasJoinNone = layer.layout.get('line-join').constantOr('miter') === 'none';\n    const hasPattern = !!layer.paint.get('line-pattern').constantOr((1: any));\n    if (hasJoinNone && hasPattern) {\n        values.push('LINE_JOIN_NONE');\n    }\n\n    return values;\n};\n\nfunction hasDash(layer: LineStyleLayer) {\n    const dashPropertyValue = layer.paint.get('line-dasharray').value;\n    return dashPropertyValue.value || dashPropertyValue.kind !== \"constant\";\n}\n\nexport {\n    lineUniforms,\n    linePatternUniforms,\n    lineUniformValues,\n    linePatternUniformValues,\n    lineDefinesValues\n};\n","// @flow\n\nimport Point from '@mapbox/point-geometry';\n\nimport StyleLayer from '../style_layer.js';\nimport LineBucket from '../../data/bucket/line_bucket.js';\nimport {polygonIntersectsBufferedMultiLine} from '../../util/intersection_tests.js';\nimport {getMaximumPaintValue, translateDistance, translate} from '../query_utils.js';\nimport properties from './line_style_layer_properties.js';\nimport {extend} from '../../util/util.js';\nimport EvaluationParameters from '../evaluation_parameters.js';\nimport {Transitionable, Transitioning, Layout, PossiblyEvaluated, DataDrivenProperty} from '../properties.js';\nimport ProgramConfiguration from '../../data/program_configuration.js';\n\nimport Step from '../../style-spec/expression/definitions/step.js';\nimport type {PossiblyEvaluatedValue, PropertyValue, PossiblyEvaluatedPropertyValue, ConfigOptions} from '../properties.js';\nimport type {Feature, FeatureState, ZoomConstantExpression, StylePropertyExpression} from '../../style-spec/expression/index.js';\nimport type {Bucket, BucketParameters} from '../../data/bucket.js';\nimport type {LayoutProps, PaintProps} from './line_style_layer_properties.js';\nimport type Transform from '../../geo/transform.js';\nimport type {LayerSpecification} from '../../style-spec/types.js';\nimport type {TilespaceQueryGeometry} from '../query_geometry.js';\nimport type {IVectorTileFeature} from '@mapbox/vector-tile';\nimport {lineDefinesValues} from \"../../render/program/line_program.js\";\nimport type {CreateProgramParams} from \"../../render/painter.js\";\nimport type {DynamicDefinesType} from \"../../render/program/program_uniforms.js\";\n\nclass LineFloorwidthProperty extends DataDrivenProperty<number> {\n    useIntegerZoom: ?boolean;\n\n    possiblyEvaluate(value: PropertyValue<number, PossiblyEvaluatedPropertyValue<number>>, parameters: EvaluationParameters): PossiblyEvaluatedPropertyValue<number> {\n        parameters = new EvaluationParameters(Math.floor(parameters.zoom), {\n            now: parameters.now,\n            fadeDuration: parameters.fadeDuration,\n            transition: parameters.transition\n        });\n        return super.possiblyEvaluate(value, parameters);\n    }\n\n    evaluate(value: PossiblyEvaluatedValue<number>, globals: EvaluationParameters, feature: Feature, featureState: FeatureState): number {\n        globals = extend({}, globals, {zoom: Math.floor(globals.zoom)});\n        return super.evaluate(value, globals, feature, featureState);\n    }\n}\n\nconst lineFloorwidthProperty = new LineFloorwidthProperty(properties.paint.properties['line-width'].specification);\nlineFloorwidthProperty.useIntegerZoom = true;\n\nclass LineStyleLayer extends StyleLayer {\n    _unevaluatedLayout: Layout<LayoutProps>;\n    layout: PossiblyEvaluated<LayoutProps>;\n\n    gradientVersion: number;\n    stepInterpolant: boolean;\n\n    _transitionablePaint: Transitionable<PaintProps>;\n    _transitioningPaint: Transitioning<PaintProps>;\n    paint: PossiblyEvaluated<PaintProps>;\n\n    constructor(layer: LayerSpecification, scope: string, options?: ?ConfigOptions) {\n        super(layer, properties, scope, options);\n        this.gradientVersion = 0;\n    }\n\n    _handleSpecialPaintPropertyUpdate(name: string) {\n        if (name === 'line-gradient') {\n            const expression: ZoomConstantExpression<'source'> = ((this._transitionablePaint._values['line-gradient'].value.expression): any);\n            this.stepInterpolant = expression._styleExpression && expression._styleExpression.expression instanceof Step;\n            this.gradientVersion = (this.gradientVersion + 1) % Number.MAX_SAFE_INTEGER;\n        }\n    }\n\n    gradientExpression(): StylePropertyExpression {\n        return this._transitionablePaint._values['line-gradient'].value.expression;\n    }\n\n    widthExpression(): StylePropertyExpression {\n        return this._transitionablePaint._values['line-width'].value.expression;\n    }\n\n    recalculate(parameters: EvaluationParameters, availableImages: Array<string>) {\n        super.recalculate(parameters, availableImages);\n\n        (this.paint._values: any)['line-floorwidth'] =\n            lineFloorwidthProperty.possiblyEvaluate(this._transitioningPaint._values['line-width'].value, parameters);\n    }\n\n    createBucket(parameters: BucketParameters<LineStyleLayer>): LineBucket {\n        return new LineBucket(parameters);\n    }\n\n    getProgramIds(): string[] {\n        const patternProperty = this.paint.get('line-pattern');\n        const image = patternProperty.constantOr((1: any));\n        const programId = image ? 'linePattern' : 'line';\n        return [programId];\n    }\n\n    getDefaultProgramParams(name: string, zoom: number): CreateProgramParams | null {\n        const definesValues = ((lineDefinesValues(this): any): DynamicDefinesType[]);\n        return {\n            config: new ProgramConfiguration(this, zoom),\n            defines: definesValues,\n            overrideFog: false\n        };\n    }\n\n    // $FlowFixMe[method-unbinding]\n    queryRadius(bucket: Bucket): number {\n        const lineBucket: LineBucket = (bucket: any);\n        const width = getLineWidth(\n            getMaximumPaintValue('line-width', this, lineBucket),\n            getMaximumPaintValue('line-gap-width', this, lineBucket));\n        const offset = getMaximumPaintValue('line-offset', this, lineBucket);\n        return width / 2 + Math.abs(offset) + translateDistance(this.paint.get('line-translate'));\n    }\n\n    // $FlowFixMe[method-unbinding]\n    queryIntersectsFeature(queryGeometry: TilespaceQueryGeometry,\n                           feature: IVectorTileFeature,\n                           featureState: FeatureState,\n                           geometry: Array<Array<Point>>,\n                           zoom: number,\n                           transform: Transform): boolean {\n        if (queryGeometry.queryGeometry.isAboveHorizon) return false;\n\n        const translatedPolygon = translate(queryGeometry.tilespaceGeometry,\n            this.paint.get('line-translate'),\n            this.paint.get('line-translate-anchor'),\n            transform.angle, queryGeometry.pixelToTileUnitsFactor);\n        const halfWidth = queryGeometry.pixelToTileUnitsFactor / 2 * getLineWidth(\n            this.paint.get('line-width').evaluate(feature, featureState),\n            this.paint.get('line-gap-width').evaluate(feature, featureState));\n        const lineOffset = this.paint.get('line-offset').evaluate(feature, featureState);\n        if (lineOffset) {\n            geometry = offsetLine(geometry, lineOffset * queryGeometry.pixelToTileUnitsFactor);\n        }\n\n        return polygonIntersectsBufferedMultiLine(translatedPolygon, geometry, halfWidth);\n    }\n\n    isTileClipped(): boolean {\n        return true;\n    }\n}\n\nexport default LineStyleLayer;\n\nfunction getLineWidth(lineWidth: number, lineGapWidth: number) {\n    if (lineGapWidth > 0) {\n        return lineGapWidth + 2 * lineWidth;\n    } else {\n        return lineWidth;\n    }\n}\n\nfunction offsetLine(rings: Array<Array<Point>>, offset: number) {\n    const newRings = [];\n    const zero = new Point(0, 0);\n    for (let k = 0; k < rings.length; k++) {\n        const ring = rings[k];\n        const newRing = [];\n        for (let i = 0; i < ring.length; i++) {\n            const a = ring[i - 1];\n            const b = ring[i];\n            const c = ring[i + 1];\n            const aToB = i === 0 ? zero : b.sub(a)._unit()._perp();\n            const bToC = i === ring.length - 1 ? zero : c.sub(b)._unit()._perp();\n            const extrude = aToB._add(bToC)._unit();\n\n            const cosHalfAngle = extrude.x * bToC.x + extrude.y * bToC.y;\n            extrude._mult(1 / cosHalfAngle);\n\n            newRing.push(extrude._mult(offset)._add(b));\n        }\n        newRings.push(newRing);\n    }\n    return newRings;\n}\n","// @flow\nimport {createLayout} from '../../util/struct_array.js';\n\nimport type {StructArrayLayout} from '../../util/struct_array.js';\n\nexport const symbolLayoutAttributes: StructArrayLayout = createLayout([\n    {name: 'a_pos_offset',   components: 4, type: 'Int16'},\n    {name: 'a_tex_size',     components: 4, type: 'Uint16'},\n    {name: 'a_pixeloffset',  components: 4, type: 'Int16'}\n], 4);\n\nexport const symbolGlobeExtAttributes: StructArrayLayout = createLayout([\n    {name: 'a_globe_anchor', components: 3, type: 'Int16'},\n    {name: 'a_globe_normal', components: 3, type: 'Float32'},\n], 4);\n\nexport const dynamicLayoutAttributes: StructArrayLayout = createLayout([\n    {name: 'a_projected_pos', components: 4, type: 'Float32'}\n], 4);\n\nexport const placementOpacityAttributes: StructArrayLayout = createLayout([\n    {name: 'a_fade_opacity', components: 1, type: 'Uint32'}\n], 4);\n\nexport const zOffsetAttributes: StructArrayLayout = createLayout([\n    {name: 'a_z_offset', components: 1, type: 'Float32'}\n], 4);\n\nexport const iconTransitioningAttributes: StructArrayLayout = createLayout([\n    {name: 'a_texb', components: 2, type: 'Uint16'}\n]);\n\nexport const collisionVertexAttributes: StructArrayLayout = createLayout([\n    {name: 'a_placed', components: 2, type: 'Uint8'},\n    {name: 'a_shift', components: 2, type: 'Float32'},\n]);\n\nexport const collisionVertexAttributesExt: StructArrayLayout = createLayout([\n    {name: 'a_size_scale', components: 1, type: 'Float32'},\n    {name: 'a_padding', components: 2, type: 'Float32'},\n    {name: 'a_z_offset', components: 1, type: 'Float32'}\n]);\n\nexport const collisionBox: StructArrayLayout = createLayout([\n    // the box is centered around the anchor point\n    {type: 'Int16', name: 'projectedAnchorX'},\n    {type: 'Int16', name: 'projectedAnchorY'},\n    {type: 'Int16', name: 'projectedAnchorZ'},\n\n    {type: 'Int16', name: 'tileAnchorX'},\n    {type: 'Int16', name: 'tileAnchorY'},\n\n    // distances to the edges from the anchor\n    {type: 'Float32', name: 'x1'},\n    {type: 'Float32', name: 'y1'},\n    {type: 'Float32', name: 'x2'},\n    {type: 'Float32', name: 'y2'},\n\n    {type: 'Int16', name: 'padding'},\n\n    // the index of the feature in the original vectortile\n    {type: 'Uint32', name: 'featureIndex'},\n    // the source layer the feature appears in\n    {type: 'Uint16', name: 'sourceLayerIndex'},\n    // the bucket the feature appears in\n    {type: 'Uint16', name: 'bucketIndex'},\n]);\n\nexport const collisionBoxLayout: StructArrayLayout = createLayout([ // used to render collision boxes for debugging purposes\n    {name: 'a_pos',             components: 3, type: 'Int16'},\n    {name: 'a_anchor_pos',      components: 2, type: 'Int16'},\n    {name: 'a_extrude',         components: 2, type: 'Int16'}\n], 4);\n\nexport const collisionCircleLayout: StructArrayLayout = createLayout([ // used to render collision circles for debugging purposes\n    {name: 'a_pos_2f',     components: 2, type: 'Float32'},\n    {name: 'a_radius',     components: 1, type: 'Float32'},\n    {name: 'a_flags',      components: 2, type: 'Int16'}\n], 4);\n\nexport const quadTriangle: StructArrayLayout = createLayout([\n    {name: 'triangle', components: 3, type: 'Uint16'},\n]);\n\nexport const placement: StructArrayLayout = createLayout([\n    {type: 'Int16', name: 'projectedAnchorX'},\n    {type: 'Int16', name: 'projectedAnchorY'},\n    {type: 'Int16', name: 'projectedAnchorZ'},\n    {type: 'Float32', name: 'tileAnchorX'},\n    {type: 'Float32', name: 'tileAnchorY'},\n    {type: 'Uint16', name: 'glyphStartIndex'},\n    {type: 'Uint16', name: 'numGlyphs'},\n    {type: 'Uint32', name: 'vertexStartIndex'},\n    {type: 'Uint32', name: 'lineStartIndex'},\n    {type: 'Uint32', name: 'lineLength'},\n    {type: 'Uint16', name: 'segment'},\n    {type: 'Uint16', name: 'lowerSize'},\n    {type: 'Uint16', name: 'upperSize'},\n    {type: 'Float32', name: 'lineOffsetX'},\n    {type: 'Float32', name: 'lineOffsetY'},\n    {type: 'Uint8', name: 'writingMode'},\n    {type: 'Uint8', name: 'placedOrientation'},\n    {type: 'Uint8', name: 'hidden'},\n    {type: 'Uint32', name: 'crossTileID'},\n    {type: 'Int16', name: 'associatedIconIndex'},\n    {type: 'Uint8', name: 'flipState'}\n]);\n\nexport const symbolInstance: StructArrayLayout = createLayout([\n    {type: 'Float32', name: 'tileAnchorX'},\n    {type: 'Float32', name: 'tileAnchorY'},\n    {type: 'Int16', name: 'projectedAnchorX'},\n    {type: 'Int16', name: 'projectedAnchorY'},\n    {type: 'Int16', name: 'projectedAnchorZ'},\n    {type: 'Int16', name: 'rightJustifiedTextSymbolIndex'},\n    {type: 'Int16', name: 'centerJustifiedTextSymbolIndex'},\n    {type: 'Int16', name: 'leftJustifiedTextSymbolIndex'},\n    {type: 'Int16', name: 'verticalPlacedTextSymbolIndex'},\n    {type: 'Int16', name: 'placedIconSymbolIndex'},\n    {type: 'Int16', name: 'verticalPlacedIconSymbolIndex'},\n    {type: 'Uint16', name: 'key'},\n    {type: 'Uint16', name: 'textBoxStartIndex'},\n    {type: 'Uint16', name: 'textBoxEndIndex'},\n    {type: 'Uint16', name: 'verticalTextBoxStartIndex'},\n    {type: 'Uint16', name: 'verticalTextBoxEndIndex'},\n    {type: 'Uint16', name: 'iconBoxStartIndex'},\n    {type: 'Uint16', name: 'iconBoxEndIndex'},\n    {type: 'Uint16', name: 'verticalIconBoxStartIndex'},\n    {type: 'Uint16', name: 'verticalIconBoxEndIndex'},\n    {type: 'Uint16', name: 'featureIndex'},\n    {type: 'Uint16', name: 'numHorizontalGlyphVertices'},\n    {type: 'Uint16', name: 'numVerticalGlyphVertices'},\n    {type: 'Uint16', name: 'numIconVertices'},\n    {type: 'Uint16', name: 'numVerticalIconVertices'},\n    {type: 'Uint16', name: 'useRuntimeCollisionCircles'},\n    {type: 'Uint32', name: 'crossTileID'},\n    {type: 'Float32', components: 2, name: 'textOffset'},\n    {type: 'Float32', name: 'collisionCircleDiameter'},\n    {type: 'Float32', name: 'zOffset'},\n    {type: 'Uint8', name: 'hasIconTextFit'}\n]);\n\nexport const glyphOffset: StructArrayLayout = createLayout([\n    {type: 'Float32', name: 'offsetX'}\n]);\n\nexport const lineVertex: StructArrayLayout = createLayout([\n    {type: 'Int16', name: 'x'},\n    {type: 'Int16', name: 'y'}\n]);\n","// @flow\n// ONE_EM constant used to go between \"em\" units used in style spec and \"points\" used internally for layout\n\nexport default 24;\n","// @flow\n\nimport {number as interpolate} from '../style-spec/util/interpolate.js';\nimport Interpolate from '../style-spec/expression/definitions/interpolate.js';\nimport {clamp} from '../util/util.js';\nimport EvaluationParameters from '../style/evaluation_parameters.js';\n\nimport type {PropertyValue, PossiblyEvaluatedPropertyValue} from '../style/properties.js';\nimport type {InterpolationType} from '../style-spec/expression/definitions/interpolate.js';\n\nconst SIZE_PACK_FACTOR = 128;\n\nexport {getSizeData, evaluateSizeForFeature, evaluateSizeForZoom, SIZE_PACK_FACTOR};\n\nexport type SizeData = {\n    kind: 'constant',\n    layoutSize: number\n} | {\n    kind: 'source'\n} | {\n    kind: 'camera',\n    minZoom: number,\n    maxZoom: number,\n    minSize: number,\n    maxSize: number,\n    interpolationType: ?InterpolationType\n} | {\n    kind: 'composite',\n    minZoom: number,\n    maxZoom: number,\n    interpolationType: ?InterpolationType\n};\n\nexport type InterpolatedSize = {|\n    uSize: number,\n    uSizeT: number\n|};\n\n// For {text,icon}-size, get the bucket-level data that will be needed by\n// the painter to set symbol-size-related uniforms\nfunction getSizeData(tileZoom: number, value: PropertyValue<number, PossiblyEvaluatedPropertyValue<number>>): SizeData {\n    const {expression} = value;\n\n    if (expression.kind === 'constant') {\n        // $FlowFixMe[method-unbinding]\n        const layoutSize = expression.evaluate(new EvaluationParameters(tileZoom + 1));\n        return {kind: 'constant', layoutSize};\n\n    } else if (expression.kind === 'source') {\n        return {kind: 'source'};\n\n    } else {\n        const {zoomStops, interpolationType} = expression;\n\n        // calculate covering zoom stops for zoom-dependent values\n        let lower = 0;\n        while (lower < zoomStops.length && zoomStops[lower] <= tileZoom) lower++;\n        lower = Math.max(0, lower - 1);\n        let upper = lower;\n        while (upper < zoomStops.length && zoomStops[upper] < tileZoom + 1) upper++;\n        upper = Math.min(zoomStops.length - 1, upper);\n\n        const minZoom = zoomStops[lower];\n        const maxZoom = zoomStops[upper];\n\n        // We'd like to be able to use CameraExpression or CompositeExpression in these\n        // return types rather than ExpressionSpecification, but the former are not\n        // transferrable across Web Worker boundaries.\n        if (expression.kind === 'composite') {\n            return {kind: 'composite', minZoom, maxZoom, interpolationType};\n        }\n\n        // for camera functions, also save off the function values\n        // evaluated at the covering zoom levels\n        // $FlowFixMe[method-unbinding]\n        const minSize = expression.evaluate(new EvaluationParameters(minZoom));\n        // $FlowFixMe[method-unbinding]\n        const maxSize = expression.evaluate(new EvaluationParameters(maxZoom));\n\n        return {kind: 'camera', minZoom, maxZoom, minSize, maxSize, interpolationType};\n    }\n}\n\nfunction evaluateSizeForFeature(sizeData: SizeData,\n                                {uSize, uSizeT}: InterpolatedSize,\n                                {lowerSize, upperSize}: interface {+lowerSize: number, +upperSize: number}): number {\n    if (sizeData.kind === 'source') {\n        return lowerSize / SIZE_PACK_FACTOR;\n    } else if (sizeData.kind === 'composite') {\n        return interpolate(lowerSize / SIZE_PACK_FACTOR, upperSize / SIZE_PACK_FACTOR, uSizeT);\n    }\n    return uSize;\n}\n\nfunction evaluateSizeForZoom(sizeData: SizeData, zoom: number): InterpolatedSize {\n    let uSizeT = 0;\n    let uSize = 0;\n\n    if (sizeData.kind === 'constant') {\n        uSize = sizeData.layoutSize;\n\n    } else if (sizeData.kind !== 'source') {\n        const {interpolationType, minZoom, maxZoom} = sizeData;\n\n        // Even though we could get the exact value of the camera function\n        // at z = tr.zoom, we intentionally do not: instead, we interpolate\n        // between the camera function values at a pair of zoom stops covering\n        // [tileZoom, tileZoom + 1] in order to be consistent with this\n        // restriction on composite functions\n        const t = !interpolationType ? 0 : clamp(\n            Interpolate.interpolationFactor(interpolationType, zoom, minZoom, maxZoom), 0, 1);\n\n        if (sizeData.kind === 'camera') {\n            uSize = interpolate(sizeData.minSize, sizeData.maxSize, t);\n        } else {\n            uSizeT = t;\n        }\n    }\n\n    return {uSizeT, uSize};\n}\n","// @flow\n\nimport {plugin as rtlTextPlugin} from '../source/rtl_text_plugin.js';\n\nimport type SymbolStyleLayer from '../style/style_layer/symbol_style_layer.js';\nimport type {Feature} from '../style-spec/expression/index.js';\nimport Formatted from '../style-spec/expression/types/formatted.js';\n\nfunction transformText(text: string, layer: SymbolStyleLayer, feature: Feature) {\n    const transform = layer.layout.get('text-transform').evaluate(feature, {});\n    if (transform === 'uppercase') {\n        text = text.toLocaleUpperCase();\n    } else if (transform === 'lowercase') {\n        text = text.toLocaleLowerCase();\n    }\n\n    if (rtlTextPlugin.applyArabicShaping) {\n        text = rtlTextPlugin.applyArabicShaping(text);\n    }\n\n    return text;\n}\n\nexport default function(text: Formatted, layer: SymbolStyleLayer, feature: Feature): Formatted {\n    text.sections.forEach(section => {\n        section.text = transformText(section.text, layer, feature);\n    });\n    return text;\n}\n","// @flow\n\nimport {charHasRotatedVerticalOrientation} from './script_detection.js';\n\nexport const verticalizedCharacterMap = {\n    '!': '︕',\n    '#': '#',\n    '$': '$',\n    '%': '%',\n    '&': '&',\n    '(': '︵',\n    ')': '︶',\n    '*': '*',\n    '+': '+',\n    ',': '︐',\n    '-': '︲',\n    '.': '・',\n    '/': '/',\n    ':': '︓',\n    ';': '︔',\n    '<': '︿',\n    '=': '=',\n    '>': '﹀',\n    '?': '︖',\n    '@': '@',\n    '[': '﹇',\n    '\\\\': '\',\n    ']': '﹈',\n    '^': '^',\n    '_': '︳',\n    '`': '`',\n    '{': '︷',\n    '|': '―',\n    '}': '︸',\n    '~': '~',\n    '¢': '¢',\n    '£': '£',\n    '¥': '¥',\n    '¦': '¦',\n    '¬': '¬',\n    '¯': ' ̄',\n    '–': '︲',\n    '—': '︱',\n    '‘': '﹃',\n    '’': '﹄',\n    '“': '﹁',\n    '”': '﹂',\n    '…': '︙',\n    '‧': '・',\n    '₩': '₩',\n    '、': '︑',\n    '。': '︒',\n    '〈': '︿',\n    '〉': '﹀',\n    '《': '︽',\n    '》': '︾',\n    '「': '﹁',\n    '」': '﹂',\n    '『': '﹃',\n    '』': '﹄',\n    '【': '︻',\n    '】': '︼',\n    '〔': '︹',\n    '〕': '︺',\n    '〖': '︗',\n    '〗': '︘',\n    '!': '︕',\n    '(': '︵',\n    ')': '︶',\n    ',': '︐',\n    '-': '︲',\n    '.': '・',\n    ':': '︓',\n    ';': '︔',\n    '<': '︿',\n    '>': '﹀',\n    '?': '︖',\n    '[': '﹇',\n    ']': '﹈',\n    '_': '︳',\n    '{': '︷',\n    '|': '―',\n    '}': '︸',\n    '⦅': '︵',\n    '⦆': '︶',\n    '。': '︒',\n    '「': '﹁',\n    '」': '﹂',\n    '←': '↑',\n    '→': '↓'\n};\n\nexport default function verticalizePunctuation(input: string, skipContextChecking: boolean): string {\n    let output = '';\n\n    for (let i = 0; i < input.length; i++) {\n        const nextCharCode = input.charCodeAt(i + 1) || null;\n        const prevCharCode = input.charCodeAt(i - 1) || null;\n\n        const canReplacePunctuation = skipContextChecking || (\n            (!nextCharCode || !charHasRotatedVerticalOrientation(nextCharCode) || verticalizedCharacterMap[input[i + 1]]) &&\n            (!prevCharCode || !charHasRotatedVerticalOrientation(prevCharCode) || verticalizedCharacterMap[input[i - 1]])\n        );\n\n        if (canReplacePunctuation && verticalizedCharacterMap[input[i]]) {\n            output += verticalizedCharacterMap[input[i]];\n        } else {\n            output += input[i];\n        }\n    }\n\n    return output;\n}\n\nexport function isVerticalClosePunctuation(chr: string): boolean {\n    return chr === '︶' || chr === '﹈' || chr === '︸' || chr === '﹄' || chr === '﹂' || chr === '︾' ||\n           chr === '︼' || chr === '︺' || chr === '︘' || chr === '﹀' || chr === '︐' || chr === '︓' ||\n           chr === '︔' || chr === '`' || chr === ' ̄' || chr === '︑' || chr === '︒';\n}\n\nexport function isVerticalOpenPunctuation(chr: string): boolean {\n    return chr === '︵' || chr === '﹇' || chr === '︷' || chr === '﹃' || chr === '﹁' || chr === '︽' ||\n           chr === '︻' || chr === '︹' || chr === '︗' || chr === '︿';\n}\n","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n  var e, m\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var nBits = -7\n  var i = isLE ? (nBytes - 1) : 0\n  var d = isLE ? -1 : 1\n  var s = buffer[offset + i]\n\n  i += d\n\n  e = s & ((1 << (-nBits)) - 1)\n  s >>= (-nBits)\n  nBits += eLen\n  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  m = e & ((1 << (-nBits)) - 1)\n  e >>= (-nBits)\n  nBits += mLen\n  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  if (e === 0) {\n    e = 1 - eBias\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity)\n  } else {\n    m = m + Math.pow(2, mLen)\n    e = e - eBias\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n  var e, m, c\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n  var i = isLE ? 0 : (nBytes - 1)\n  var d = isLE ? 1 : -1\n  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n  value = Math.abs(value)\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0\n    e = eMax\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2)\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--\n      c *= 2\n    }\n    if (e + eBias >= 1) {\n      value += rt / c\n    } else {\n      value += rt * Math.pow(2, 1 - eBias)\n    }\n    if (value * c >= 2) {\n      e++\n      c /= 2\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0\n      e = eMax\n    } else if (e + eBias >= 1) {\n      m = ((value * c) - 1) * Math.pow(2, mLen)\n      e = e + eBias\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n      e = 0\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n  e = (e << mLen) | m\n  eLen += mLen\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n  buffer[offset + i - d] |= s * 128\n}\n","'use strict';\n\nmodule.exports = Pbf;\n\nvar ieee754 = require('ieee754');\n\nfunction Pbf(buf) {\n    this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);\n    this.pos = 0;\n    this.type = 0;\n    this.length = this.buf.length;\n}\n\nPbf.Varint  = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum\nPbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64\nPbf.Bytes   = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields\nPbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32\n\nvar SHIFT_LEFT_32 = (1 << 16) * (1 << 16),\n    SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;\n\n// Threshold chosen based on both benchmarking and knowledge about browser string\n// data structures (which currently switch structure types at 12 bytes or more)\nvar TEXT_DECODER_MIN_LENGTH = 12;\nvar utf8TextDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder('utf8');\n\nPbf.prototype = {\n\n    destroy: function() {\n        this.buf = null;\n    },\n\n    // === READING =================================================================\n\n    readFields: function(readField, result, end) {\n        end = end || this.length;\n\n        while (this.pos < end) {\n            var val = this.readVarint(),\n                tag = val >> 3,\n                startPos = this.pos;\n\n            this.type = val & 0x7;\n            readField(tag, result, this);\n\n            if (this.pos === startPos) this.skip(val);\n        }\n        return result;\n    },\n\n    readMessage: function(readField, result) {\n        return this.readFields(readField, result, this.readVarint() + this.pos);\n    },\n\n    readFixed32: function() {\n        var val = readUInt32(this.buf, this.pos);\n        this.pos += 4;\n        return val;\n    },\n\n    readSFixed32: function() {\n        var val = readInt32(this.buf, this.pos);\n        this.pos += 4;\n        return val;\n    },\n\n    // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)\n\n    readFixed64: function() {\n        var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;\n        this.pos += 8;\n        return val;\n    },\n\n    readSFixed64: function() {\n        var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;\n        this.pos += 8;\n        return val;\n    },\n\n    readFloat: function() {\n        var val = ieee754.read(this.buf, this.pos, true, 23, 4);\n        this.pos += 4;\n        return val;\n    },\n\n    readDouble: function() {\n        var val = ieee754.read(this.buf, this.pos, true, 52, 8);\n        this.pos += 8;\n        return val;\n    },\n\n    readVarint: function(isSigned) {\n        var buf = this.buf,\n            val, b;\n\n        b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) return val;\n        b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) return val;\n        b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;\n        b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;\n        b = buf[this.pos];   val |= (b & 0x0f) << 28;\n\n        return readVarintRemainder(val, isSigned, this);\n    },\n\n    readVarint64: function() { // for compatibility with v2.0.1\n        return this.readVarint(true);\n    },\n\n    readSVarint: function() {\n        var num = this.readVarint();\n        return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding\n    },\n\n    readBoolean: function() {\n        return Boolean(this.readVarint());\n    },\n\n    readString: function() {\n        var end = this.readVarint() + this.pos;\n        var pos = this.pos;\n        this.pos = end;\n\n        if (end - pos >= TEXT_DECODER_MIN_LENGTH && utf8TextDecoder) {\n            // longer strings are fast with the built-in browser TextDecoder API\n            return readUtf8TextDecoder(this.buf, pos, end);\n        }\n        // short strings are fast with our custom implementation\n        return readUtf8(this.buf, pos, end);\n    },\n\n    readBytes: function() {\n        var end = this.readVarint() + this.pos,\n            buffer = this.buf.subarray(this.pos, end);\n        this.pos = end;\n        return buffer;\n    },\n\n    // verbose for performance reasons; doesn't affect gzipped size\n\n    readPackedVarint: function(arr, isSigned) {\n        if (this.type !== Pbf.Bytes) return arr.push(this.readVarint(isSigned));\n        var end = readPackedEnd(this);\n        arr = arr || [];\n        while (this.pos < end) arr.push(this.readVarint(isSigned));\n        return arr;\n    },\n    readPackedSVarint: function(arr) {\n        if (this.type !== Pbf.Bytes) return arr.push(this.readSVarint());\n        var end = readPackedEnd(this);\n        arr = arr || [];\n        while (this.pos < end) arr.push(this.readSVarint());\n        return arr;\n    },\n    readPackedBoolean: function(arr) {\n        if (this.type !== Pbf.Bytes) return arr.push(this.readBoolean());\n        var end = readPackedEnd(this);\n        arr = arr || [];\n        while (this.pos < end) arr.push(this.readBoolean());\n        return arr;\n    },\n    readPackedFloat: function(arr) {\n        if (this.type !== Pbf.Bytes) return arr.push(this.readFloat());\n        var end = readPackedEnd(this);\n        arr = arr || [];\n        while (this.pos < end) arr.push(this.readFloat());\n        return arr;\n    },\n    readPackedDouble: function(arr) {\n        if (this.type !== Pbf.Bytes) return arr.push(this.readDouble());\n        var end = readPackedEnd(this);\n        arr = arr || [];\n        while (this.pos < end) arr.push(this.readDouble());\n        return arr;\n    },\n    readPackedFixed32: function(arr) {\n        if (this.type !== Pbf.Bytes) return arr.push(this.readFixed32());\n        var end = readPackedEnd(this);\n        arr = arr || [];\n        while (this.pos < end) arr.push(this.readFixed32());\n        return arr;\n    },\n    readPackedSFixed32: function(arr) {\n        if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed32());\n        var end = readPackedEnd(this);\n        arr = arr || [];\n        while (this.pos < end) arr.push(this.readSFixed32());\n        return arr;\n    },\n    readPackedFixed64: function(arr) {\n        if (this.type !== Pbf.Bytes) return arr.push(this.readFixed64());\n        var end = readPackedEnd(this);\n        arr = arr || [];\n        while (this.pos < end) arr.push(this.readFixed64());\n        return arr;\n    },\n    readPackedSFixed64: function(arr) {\n        if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed64());\n        var end = readPackedEnd(this);\n        arr = arr || [];\n        while (this.pos < end) arr.push(this.readSFixed64());\n        return arr;\n    },\n\n    skip: function(val) {\n        var type = val & 0x7;\n        if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}\n        else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;\n        else if (type === Pbf.Fixed32) this.pos += 4;\n        else if (type === Pbf.Fixed64) this.pos += 8;\n        else throw new Error('Unimplemented type: ' + type);\n    },\n\n    // === WRITING =================================================================\n\n    writeTag: function(tag, type) {\n        this.writeVarint((tag << 3) | type);\n    },\n\n    realloc: function(min) {\n        var length = this.length || 16;\n\n        while (length < this.pos + min) length *= 2;\n\n        if (length !== this.length) {\n            var buf = new Uint8Array(length);\n            buf.set(this.buf);\n            this.buf = buf;\n            this.length = length;\n        }\n    },\n\n    finish: function() {\n        this.length = this.pos;\n        this.pos = 0;\n        return this.buf.subarray(0, this.length);\n    },\n\n    writeFixed32: function(val) {\n        this.realloc(4);\n        writeInt32(this.buf, val, this.pos);\n        this.pos += 4;\n    },\n\n    writeSFixed32: function(val) {\n        this.realloc(4);\n        writeInt32(this.buf, val, this.pos);\n        this.pos += 4;\n    },\n\n    writeFixed64: function(val) {\n        this.realloc(8);\n        writeInt32(this.buf, val & -1, this.pos);\n        writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);\n        this.pos += 8;\n    },\n\n    writeSFixed64: function(val) {\n        this.realloc(8);\n        writeInt32(this.buf, val & -1, this.pos);\n        writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);\n        this.pos += 8;\n    },\n\n    writeVarint: function(val) {\n        val = +val || 0;\n\n        if (val > 0xfffffff || val < 0) {\n            writeBigVarint(val, this);\n            return;\n        }\n\n        this.realloc(4);\n\n        this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;\n        this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;\n        this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;\n        this.buf[this.pos++] =   (val >>> 7) & 0x7f;\n    },\n\n    writeSVarint: function(val) {\n        this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);\n    },\n\n    writeBoolean: function(val) {\n        this.writeVarint(Boolean(val));\n    },\n\n    writeString: function(str) {\n        str = String(str);\n        this.realloc(str.length * 4);\n\n        this.pos++; // reserve 1 byte for short string length\n\n        var startPos = this.pos;\n        // write the string directly to the buffer and see how much was written\n        this.pos = writeUtf8(this.buf, str, this.pos);\n        var len = this.pos - startPos;\n\n        if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);\n\n        // finally, write the message length in the reserved place and restore the position\n        this.pos = startPos - 1;\n        this.writeVarint(len);\n        this.pos += len;\n    },\n\n    writeFloat: function(val) {\n        this.realloc(4);\n        ieee754.write(this.buf, val, this.pos, true, 23, 4);\n        this.pos += 4;\n    },\n\n    writeDouble: function(val) {\n        this.realloc(8);\n        ieee754.write(this.buf, val, this.pos, true, 52, 8);\n        this.pos += 8;\n    },\n\n    writeBytes: function(buffer) {\n        var len = buffer.length;\n        this.writeVarint(len);\n        this.realloc(len);\n        for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];\n    },\n\n    writeRawMessage: function(fn, obj) {\n        this.pos++; // reserve 1 byte for short message length\n\n        // write the message directly to the buffer and see how much was written\n        var startPos = this.pos;\n        fn(obj, this);\n        var len = this.pos - startPos;\n\n        if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);\n\n        // finally, write the message length in the reserved place and restore the position\n        this.pos = startPos - 1;\n        this.writeVarint(len);\n        this.pos += len;\n    },\n\n    writeMessage: function(tag, fn, obj) {\n        this.writeTag(tag, Pbf.Bytes);\n        this.writeRawMessage(fn, obj);\n    },\n\n    writePackedVarint:   function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedVarint, arr);   },\n    writePackedSVarint:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSVarint, arr);  },\n    writePackedBoolean:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedBoolean, arr);  },\n    writePackedFloat:    function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFloat, arr);    },\n    writePackedDouble:   function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedDouble, arr);   },\n    writePackedFixed32:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed32, arr);  },\n    writePackedSFixed32: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed32, arr); },\n    writePackedFixed64:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed64, arr);  },\n    writePackedSFixed64: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed64, arr); },\n\n    writeBytesField: function(tag, buffer) {\n        this.writeTag(tag, Pbf.Bytes);\n        this.writeBytes(buffer);\n    },\n    writeFixed32Field: function(tag, val) {\n        this.writeTag(tag, Pbf.Fixed32);\n        this.writeFixed32(val);\n    },\n    writeSFixed32Field: function(tag, val) {\n        this.writeTag(tag, Pbf.Fixed32);\n        this.writeSFixed32(val);\n    },\n    writeFixed64Field: function(tag, val) {\n        this.writeTag(tag, Pbf.Fixed64);\n        this.writeFixed64(val);\n    },\n    writeSFixed64Field: function(tag, val) {\n        this.writeTag(tag, Pbf.Fixed64);\n        this.writeSFixed64(val);\n    },\n    writeVarintField: function(tag, val) {\n        this.writeTag(tag, Pbf.Varint);\n        this.writeVarint(val);\n    },\n    writeSVarintField: function(tag, val) {\n        this.writeTag(tag, Pbf.Varint);\n        this.writeSVarint(val);\n    },\n    writeStringField: function(tag, str) {\n        this.writeTag(tag, Pbf.Bytes);\n        this.writeString(str);\n    },\n    writeFloatField: function(tag, val) {\n        this.writeTag(tag, Pbf.Fixed32);\n        this.writeFloat(val);\n    },\n    writeDoubleField: function(tag, val) {\n        this.writeTag(tag, Pbf.Fixed64);\n        this.writeDouble(val);\n    },\n    writeBooleanField: function(tag, val) {\n        this.writeVarintField(tag, Boolean(val));\n    }\n};\n\nfunction readVarintRemainder(l, s, p) {\n    var buf = p.buf,\n        h, b;\n\n    b = buf[p.pos++]; h  = (b & 0x70) >> 4;  if (b < 0x80) return toNum(l, h, s);\n    b = buf[p.pos++]; h |= (b & 0x7f) << 3;  if (b < 0x80) return toNum(l, h, s);\n    b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);\n    b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);\n    b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);\n    b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);\n\n    throw new Error('Expected varint not more than 10 bytes');\n}\n\nfunction readPackedEnd(pbf) {\n    return pbf.type === Pbf.Bytes ?\n        pbf.readVarint() + pbf.pos : pbf.pos + 1;\n}\n\nfunction toNum(low, high, isSigned) {\n    if (isSigned) {\n        return high * 0x100000000 + (low >>> 0);\n    }\n\n    return ((high >>> 0) * 0x100000000) + (low >>> 0);\n}\n\nfunction writeBigVarint(val, pbf) {\n    var low, high;\n\n    if (val >= 0) {\n        low  = (val % 0x100000000) | 0;\n        high = (val / 0x100000000) | 0;\n    } else {\n        low  = ~(-val % 0x100000000);\n        high = ~(-val / 0x100000000);\n\n        if (low ^ 0xffffffff) {\n            low = (low + 1) | 0;\n        } else {\n            low = 0;\n            high = (high + 1) | 0;\n        }\n    }\n\n    if (val >= 0x10000000000000000 || val < -0x10000000000000000) {\n        throw new Error('Given varint doesn\\'t fit into 10 bytes');\n    }\n\n    pbf.realloc(10);\n\n    writeBigVarintLow(low, high, pbf);\n    writeBigVarintHigh(high, pbf);\n}\n\nfunction writeBigVarintLow(low, high, pbf) {\n    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;\n    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;\n    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;\n    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;\n    pbf.buf[pbf.pos]   = low & 0x7f;\n}\n\nfunction writeBigVarintHigh(high, pbf) {\n    var lsb = (high & 0x07) << 4;\n\n    pbf.buf[pbf.pos++] |= lsb         | ((high >>>= 3) ? 0x80 : 0); if (!high) return;\n    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;\n    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;\n    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;\n    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;\n    pbf.buf[pbf.pos++]  = high & 0x7f;\n}\n\nfunction makeRoomForExtraLength(startPos, len, pbf) {\n    var extraLen =\n        len <= 0x3fff ? 1 :\n        len <= 0x1fffff ? 2 :\n        len <= 0xfffffff ? 3 : Math.floor(Math.log(len) / (Math.LN2 * 7));\n\n    // if 1 byte isn't enough for encoding message length, shift the data to the right\n    pbf.realloc(extraLen);\n    for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];\n}\n\nfunction writePackedVarint(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]);   }\nfunction writePackedSVarint(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]);  }\nfunction writePackedFloat(arr, pbf)    { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]);    }\nfunction writePackedDouble(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]);   }\nfunction writePackedBoolean(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]);  }\nfunction writePackedFixed32(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]);  }\nfunction writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }\nfunction writePackedFixed64(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]);  }\nfunction writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }\n\n// Buffer code below from https://github.com/feross/buffer, MIT-licensed\n\nfunction readUInt32(buf, pos) {\n    return ((buf[pos]) |\n        (buf[pos + 1] << 8) |\n        (buf[pos + 2] << 16)) +\n        (buf[pos + 3] * 0x1000000);\n}\n\nfunction writeInt32(buf, val, pos) {\n    buf[pos] = val;\n    buf[pos + 1] = (val >>> 8);\n    buf[pos + 2] = (val >>> 16);\n    buf[pos + 3] = (val >>> 24);\n}\n\nfunction readInt32(buf, pos) {\n    return ((buf[pos]) |\n        (buf[pos + 1] << 8) |\n        (buf[pos + 2] << 16)) +\n        (buf[pos + 3] << 24);\n}\n\nfunction readUtf8(buf, pos, end) {\n    var str = '';\n    var i = pos;\n\n    while (i < end) {\n        var b0 = buf[i];\n        var c = null; // codepoint\n        var bytesPerSequence =\n            b0 > 0xEF ? 4 :\n            b0 > 0xDF ? 3 :\n            b0 > 0xBF ? 2 : 1;\n\n        if (i + bytesPerSequence > end) break;\n\n        var b1, b2, b3;\n\n        if (bytesPerSequence === 1) {\n            if (b0 < 0x80) {\n                c = b0;\n            }\n        } else if (bytesPerSequence === 2) {\n            b1 = buf[i + 1];\n            if ((b1 & 0xC0) === 0x80) {\n                c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F);\n                if (c <= 0x7F) {\n                    c = null;\n                }\n            }\n        } else if (bytesPerSequence === 3) {\n            b1 = buf[i + 1];\n            b2 = buf[i + 2];\n            if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {\n                c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F);\n                if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) {\n                    c = null;\n                }\n            }\n        } else if (bytesPerSequence === 4) {\n            b1 = buf[i + 1];\n            b2 = buf[i + 2];\n            b3 = buf[i + 3];\n            if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {\n                c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F);\n                if (c <= 0xFFFF || c >= 0x110000) {\n                    c = null;\n                }\n            }\n        }\n\n        if (c === null) {\n            c = 0xFFFD;\n            bytesPerSequence = 1;\n\n        } else if (c > 0xFFFF) {\n            c -= 0x10000;\n            str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);\n            c = 0xDC00 | c & 0x3FF;\n        }\n\n        str += String.fromCharCode(c);\n        i += bytesPerSequence;\n    }\n\n    return str;\n}\n\nfunction readUtf8TextDecoder(buf, pos, end) {\n    return utf8TextDecoder.decode(buf.subarray(pos, end));\n}\n\nfunction writeUtf8(buf, str, pos) {\n    for (var i = 0, c, lead; i < str.length; i++) {\n        c = str.charCodeAt(i); // code point\n\n        if (c > 0xD7FF && c < 0xE000) {\n            if (lead) {\n                if (c < 0xDC00) {\n                    buf[pos++] = 0xEF;\n                    buf[pos++] = 0xBF;\n                    buf[pos++] = 0xBD;\n                    lead = c;\n                    continue;\n                } else {\n                    c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;\n                    lead = null;\n                }\n            } else {\n                if (c > 0xDBFF || (i + 1 === str.length)) {\n                    buf[pos++] = 0xEF;\n                    buf[pos++] = 0xBF;\n                    buf[pos++] = 0xBD;\n                } else {\n                    lead = c;\n                }\n                continue;\n            }\n        } else if (lead) {\n            buf[pos++] = 0xEF;\n            buf[pos++] = 0xBF;\n            buf[pos++] = 0xBD;\n            lead = null;\n        }\n\n        if (c < 0x80) {\n            buf[pos++] = c;\n        } else {\n            if (c < 0x800) {\n                buf[pos++] = c >> 0x6 | 0xC0;\n            } else {\n                if (c < 0x10000) {\n                    buf[pos++] = c >> 0xC | 0xE0;\n                } else {\n                    buf[pos++] = c >> 0x12 | 0xF0;\n                    buf[pos++] = c >> 0xC & 0x3F | 0x80;\n                }\n                buf[pos++] = c >> 0x6 & 0x3F | 0x80;\n            }\n            buf[pos++] = c & 0x3F | 0x80;\n        }\n    }\n    return pos;\n}\n","// @flow\n\nimport {AlphaImage} from '../util/image.js';\n\nimport Protobuf from 'pbf';\nconst border = 3;\n\nimport type {StyleGlyph} from './style_glyph.js';\n\nfunction readFontstacks(tag: number, glyphData: {glyphs: Array<StyleGlyph>, ascender?: number, descender?: number}, pbf: Protobuf) {\n    glyphData.glyphs = [];\n    if (tag === 1) {\n        pbf.readMessage(readFontstack, glyphData);\n    }\n}\n\nfunction readFontstack(tag: number,  glyphData: {glyphs: Array<StyleGlyph>, ascender?: number, descender?: number}, pbf: Protobuf) {\n    if (tag === 3) {\n        const {id, bitmap, width, height, left, top, advance} = pbf.readMessage(readGlyph, {});\n        glyphData.glyphs.push({\n            id,\n            bitmap: new AlphaImage({\n                width: width + 2 * border,\n                height: height + 2 * border\n            }, bitmap),\n            metrics: {width, height, left, top, advance}\n        });\n    } else if (tag === 4) {\n        glyphData.ascender = pbf.readSVarint();\n    } else if (tag === 5) {\n        glyphData.descender = pbf.readSVarint();\n    }\n}\n\nfunction readGlyph(tag: number, glyph: Object, pbf: Protobuf) {\n    if (tag === 1) glyph.id = pbf.readVarint();\n    else if (tag === 2) glyph.bitmap = pbf.readBytes();\n    else if (tag === 3) glyph.width = pbf.readVarint();\n    else if (tag === 4) glyph.height = pbf.readVarint();\n    else if (tag === 5) glyph.left = pbf.readSVarint();\n    else if (tag === 6) glyph.top = pbf.readSVarint();\n    else if (tag === 7) glyph.advance = pbf.readVarint();\n}\n\nexport default function (data: ArrayBuffer | Uint8Array): {glyphs: Array<StyleGlyph>, ascender?: number, descender?: number} {\n    return new Protobuf(data).readFields(readFontstacks, {});\n}\n\nexport const GLYPH_PBF_BORDER = border;\n","// @flow\n\nimport assert from 'assert';\nimport {\n    charHasUprightVerticalOrientation,\n    charAllowsIdeographicBreaking,\n    charInComplexShapingScript\n} from '../util/script_detection.js';\nimport verticalizePunctuation from '../util/verticalize_punctuation.js';\nimport {plugin as rtlTextPlugin} from '../source/rtl_text_plugin.js';\nimport ONE_EM from './one_em.js';\nimport {warnOnce} from '../util/util.js';\n\nimport type {StyleGlyph, GlyphMetrics} from '../style/style_glyph.js';\nimport {GLYPH_PBF_BORDER} from '../style/parse_glyph_pbf.js';\nimport type {ImagePosition} from '../render/image_atlas.js';\nimport type {GlyphRect, GlyphPositions} from '../render/glyph_atlas.js';\nimport Formatted, {FormattedSection} from '../style-spec/expression/types/formatted.js';\n\nconst WritingMode = {\n    horizontal: 1,\n    vertical: 2,\n    horizontalOnly: 3\n};\n\nconst SHAPING_DEFAULT_OFFSET = -17;\nexport {shapeText, shapeIcon, fitIconToText, getAnchorAlignment, WritingMode, SHAPING_DEFAULT_OFFSET};\n\n// The position of a glyph relative to the text's anchor point.\nexport type PositionedGlyph = {\n    glyph: number,\n    imageName: string | null,\n    x: number,\n    y: number,\n    vertical: boolean,\n    scale: number,\n    fontStack: string,\n    sectionIndex: number,\n    metrics: GlyphMetrics,\n    rect: GlyphRect | null,\n    localGlyph?: boolean\n};\n\nexport type PositionedLine = {\n    positionedGlyphs: Array<PositionedGlyph>,\n    lineOffset: number\n};\n\n// A collection of positioned glyphs and some metadata\nexport type Shaping = {\n    positionedLines: Array<PositionedLine>,\n    top: number,\n    bottom: number,\n    left: number,\n    right: number,\n    writingMode: 1 | 2,\n    text: string,\n    iconsInText: boolean,\n    verticalizable: boolean,\n    hasBaseline: boolean\n};\n\ntype AnchorAlignment = {|\n    horizontalAlign: number,\n    verticalAlign: number\n|};\n\nfunction isEmpty(positionedLines: Array<PositionedLine>) {\n    for (const line of positionedLines) {\n        if (line.positionedGlyphs.length !== 0) {\n            return false;\n        }\n    }\n    return true;\n}\n\nexport type SymbolAnchor = 'center' | 'left' | 'right' | 'top' | 'bottom' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\nexport type TextJustify = 'left' | 'center' | 'right';\n\n// Max number of images in label is 6401 U+E000–U+F8FF that covers\n// Basic Multilingual Plane Unicode Private Use Area (PUA).\nconst PUAbegin = 0xE000;\nconst PUAend = 0xF8FF;\n\nclass SectionOptions {\n    // Text options\n    scale: number;\n    fontStack: string;\n    // Image options\n    imageName: string | null;\n\n    constructor() {\n        this.scale = 1.0;\n        this.fontStack = \"\";\n        this.imageName = null;\n    }\n\n    static forText(scale: ?number, fontStack: string): SectionOptions {\n        const textOptions = new SectionOptions();\n        textOptions.scale = scale || 1;\n        textOptions.fontStack = fontStack;\n        return textOptions;\n    }\n\n    static forImage(imageName: string): SectionOptions {\n        const imageOptions = new SectionOptions();\n        imageOptions.imageName = imageName;\n        return imageOptions;\n    }\n\n}\n\nclass TaggedString {\n    text: string;\n    sectionIndex: Array<number> // maps each character in 'text' to its corresponding entry in 'sections'\n    sections: Array<SectionOptions>\n    imageSectionID: number | null;\n\n    constructor() {\n        this.text = \"\";\n        this.sectionIndex = [];\n        this.sections = [];\n        this.imageSectionID = null;\n    }\n\n    static fromFeature(text: Formatted, defaultFontStack: string): TaggedString {\n        const result = new TaggedString();\n        for (let i = 0; i < text.sections.length; i++) {\n            const section = text.sections[i];\n            if (!section.image) {\n                result.addTextSection(section, defaultFontStack);\n            } else {\n                result.addImageSection(section);\n            }\n        }\n        return result;\n    }\n\n    length(): number {\n        return this.text.length;\n    }\n\n    getSection(index: number): SectionOptions {\n        return this.sections[this.sectionIndex[index]];\n    }\n\n    getSections(): Array<SectionOptions> {\n        return this.sections;\n    }\n\n    getSectionIndex(index: number): number {\n        return this.sectionIndex[index];\n    }\n\n    getCodePoint(index: number): number {\n        return this.text.codePointAt(index);\n    }\n\n    verticalizePunctuation(skipContextChecking: boolean) {\n        this.text = verticalizePunctuation(this.text, skipContextChecking);\n    }\n\n    trim() {\n        let beginningWhitespace = 0;\n        for (let i = 0;\n            i < this.text.length && whitespace[this.text.charCodeAt(i)];\n            i++) {\n            beginningWhitespace++;\n        }\n        let trailingWhitespace = this.text.length;\n        for (let i = this.text.length - 1;\n            i >= 0 && i >= beginningWhitespace && whitespace[this.text.charCodeAt(i)];\n            i--) {\n            trailingWhitespace--;\n        }\n        this.text = this.text.substring(beginningWhitespace, trailingWhitespace);\n        this.sectionIndex = this.sectionIndex.slice(beginningWhitespace, trailingWhitespace);\n    }\n\n    substring(start: number, end: number): TaggedString {\n        const substring = new TaggedString();\n        substring.text = this.text.substring(start, end);\n        substring.sectionIndex = this.sectionIndex.slice(start, end);\n        substring.sections = this.sections;\n        return substring;\n    }\n\n    toString(): string {\n        return this.text;\n    }\n\n    getMaxScale(): number {\n        return this.sectionIndex.reduce((max, index) => Math.max(max, this.sections[index].scale), 0);\n    }\n\n    addTextSection(section: FormattedSection, defaultFontStack: string) {\n        this.text += section.text;\n        this.sections.push(SectionOptions.forText(section.scale, section.fontStack || defaultFontStack));\n        const index = this.sections.length - 1;\n        for (let i = 0; i < section.text.length; ++i) {\n            this.sectionIndex.push(index);\n        }\n    }\n\n    addImageSection(section: FormattedSection) {\n        const imageName = section.image ? section.image.namePrimary : '';\n        if (imageName.length === 0) {\n            warnOnce(`Can't add FormattedSection with an empty image.`);\n            return;\n        }\n\n        const nextImageSectionCharCode = this.getNextImageSectionCharCode();\n        if (!nextImageSectionCharCode) {\n            warnOnce(`Reached maximum number of images ${PUAend - PUAbegin + 2}`);\n            return;\n        }\n\n        this.text += String.fromCodePoint(nextImageSectionCharCode);\n        this.sections.push(SectionOptions.forImage(imageName));\n        this.sectionIndex.push(this.sections.length - 1);\n    }\n\n    getNextImageSectionCharCode(): number | null {\n        if (!this.imageSectionID) {\n            this.imageSectionID = PUAbegin;\n            return this.imageSectionID;\n        }\n\n        if (this.imageSectionID >= PUAend) return null;\n        return ++this.imageSectionID;\n    }\n}\n\nfunction breakLines(input: TaggedString, lineBreakPoints: Array<number>): Array<TaggedString> {\n    const lines = [];\n    const text = input.text;\n    let start = 0;\n    for (const lineBreak of lineBreakPoints) {\n        lines.push(input.substring(start, lineBreak));\n        start = lineBreak;\n    }\n\n    if (start < text.length) {\n        lines.push(input.substring(start, text.length));\n    }\n    return lines;\n}\n\nfunction shapeText(text: Formatted,\n                   glyphMap: {[_: string]: {glyphs: {[_: number]: ?StyleGlyph}, ascender?: number, descender?: number}},\n                   glyphPositions: GlyphPositions,\n                   imagePositions: {[_: string]: ImagePosition},\n                   defaultFontStack: string,\n                   maxWidth: number,\n                   lineHeight: number,\n                   textAnchor: SymbolAnchor,\n                   textJustify: TextJustify,\n                   spacing: number,\n                   translate: [number, number],\n                   writingMode: 1 | 2,\n                   allowVerticalPlacement: boolean,\n                   layoutTextSize: number,\n                   layoutTextSizeThisZoom: number): Shaping | false {\n    const logicalInput = TaggedString.fromFeature(text, defaultFontStack);\n\n    if (writingMode === WritingMode.vertical) {\n        logicalInput.verticalizePunctuation(allowVerticalPlacement);\n    }\n\n    let lines: Array<TaggedString> = [];\n\n    const lineBreaks = determineLineBreaks(logicalInput, spacing, maxWidth, glyphMap, imagePositions, layoutTextSize);\n\n    const {processBidirectionalText, processStyledBidirectionalText} = rtlTextPlugin;\n    if (processBidirectionalText && logicalInput.sections.length === 1) {\n        // Bidi doesn't have to be style-aware\n        const untaggedLines = processBidirectionalText(logicalInput.toString(), lineBreaks);\n        for (const line of untaggedLines) {\n            const taggedLine = new TaggedString();\n            taggedLine.text = line;\n            taggedLine.sections = logicalInput.sections;\n            for (let i = 0; i < line.length; i++) {\n                taggedLine.sectionIndex.push(0);\n            }\n            lines.push(taggedLine);\n        }\n    } else if (processStyledBidirectionalText) {\n        // Need version of mapbox-gl-rtl-text with style support for combining RTL text with formatting\n        const processedLines = processStyledBidirectionalText(logicalInput.text, logicalInput.sectionIndex, lineBreaks);\n        for (const line of processedLines) {\n            const taggedLine = new TaggedString();\n            taggedLine.text = line[0];\n            taggedLine.sectionIndex = line[1];\n            taggedLine.sections = logicalInput.sections;\n            lines.push(taggedLine);\n        }\n    } else {\n        lines = breakLines(logicalInput, lineBreaks);\n    }\n\n    const positionedLines = [];\n    const shaping = {\n        positionedLines,\n        text: logicalInput.toString(),\n        top: translate[1],\n        bottom: translate[1],\n        left: translate[0],\n        right: translate[0],\n        writingMode,\n        iconsInText: false,\n        verticalizable: false,\n        hasBaseline: false\n    };\n\n    shapeLines(shaping, glyphMap, glyphPositions, imagePositions, lines, lineHeight, textAnchor, textJustify, writingMode, spacing, allowVerticalPlacement, layoutTextSizeThisZoom);\n    if (isEmpty(positionedLines)) return false;\n\n    return shaping;\n}\n\n// using computed properties due to https://github.com/facebook/flow/issues/380\n/* eslint no-useless-computed-key: 0 */\n\nconst whitespace: {[_: number]: boolean} = {\n    [0x09]: true, // tab\n    [0x0a]: true, // newline\n    [0x0b]: true, // vertical tab\n    [0x0c]: true, // form feed\n    [0x0d]: true, // carriage return\n    [0x20]: true, // space\n};\n\nconst breakable: {[_: number]: boolean} = {\n    [0x0a]:   true, // newline\n    [0x20]:   true, // space\n    [0x26]:   true, // ampersand\n    [0x28]:   true, // left parenthesis\n    [0x29]:   true, // right parenthesis\n    [0x2b]:   true, // plus sign\n    [0x2d]:   true, // hyphen-minus\n    [0x2f]:   true, // solidus\n    [0xad]:   true, // soft hyphen\n    [0xb7]:   true, // middle dot\n    [0x200b]: true, // zero-width space\n    [0x2010]: true, // hyphen\n    [0x2013]: true, // en dash\n    [0x2027]: true  // interpunct\n    // Many other characters may be reasonable breakpoints\n    // Consider \"neutral orientation\" characters at scriptDetection.charHasNeutralVerticalOrientation\n    // See https://github.com/mapbox/mapbox-gl-js/issues/3658\n};\n\nfunction getGlyphAdvance(codePoint: number,\n                         section: SectionOptions,\n                         glyphMap: {[_: string]: {glyphs: {[_: number]: ?StyleGlyph}, ascender?: number, descender?: number}},\n                         imagePositions: {[_: string]: ImagePosition},\n                         spacing: number,\n                         layoutTextSize: number): number {\n    if (!section.imageName) {\n        const positions = glyphMap[section.fontStack];\n        const glyph = positions && positions.glyphs[codePoint];\n        if (!glyph) return 0;\n        return glyph.metrics.advance * section.scale + spacing;\n    } else {\n        const imagePosition = imagePositions[section.imageName];\n        if (!imagePosition) return 0;\n        return imagePosition.displaySize[0] * section.scale * ONE_EM / layoutTextSize + spacing;\n    }\n}\n\nfunction determineAverageLineWidth(logicalInput: TaggedString,\n                                   spacing: number,\n                                   maxWidth: number,\n                                   glyphMap: {[_: string]: {glyphs: {[_: number]: ?StyleGlyph}, ascender?: number, descender?: number}},\n                                   imagePositions: {[_: string]: ImagePosition},\n                                   layoutTextSize: number) {\n    let totalWidth = 0;\n\n    for (let index = 0; index < logicalInput.length(); index++) {\n        const section = logicalInput.getSection(index);\n        totalWidth += getGlyphAdvance(logicalInput.getCodePoint(index), section, glyphMap, imagePositions, spacing, layoutTextSize);\n    }\n\n    const lineCount = Math.max(1, Math.ceil(totalWidth / maxWidth));\n    return totalWidth / lineCount;\n}\n\nfunction calculateBadness(lineWidth: number,\n                          targetWidth: number,\n                          penalty: number,\n                          isLastBreak: boolean) {\n    const raggedness = Math.pow(lineWidth - targetWidth, 2);\n    if (isLastBreak) {\n        // Favor finals lines shorter than average over longer than average\n        if (lineWidth < targetWidth) {\n            return raggedness / 2;\n        } else {\n            return raggedness * 2;\n        }\n    }\n\n    return raggedness + Math.abs(penalty) * penalty;\n}\n\nfunction calculatePenalty(codePoint: number, nextCodePoint: number, penalizableIdeographicBreak: boolean) {\n    let penalty = 0;\n    // Force break on newline\n    if (codePoint === 0x0a) {\n        penalty -= 10000;\n    }\n    // Penalize breaks between characters that allow ideographic breaking because\n    // they are less preferable than breaks at spaces (or zero width spaces).\n    if (penalizableIdeographicBreak) {\n        penalty += 150;\n    }\n\n    // Penalize open parenthesis at end of line\n    if (codePoint === 0x28 || codePoint === 0xff08) {\n        penalty += 50;\n    }\n\n    // Penalize close parenthesis at beginning of line\n    if (nextCodePoint === 0x29 || nextCodePoint === 0xff09) {\n        penalty += 50;\n    }\n    return penalty;\n}\n\ntype Break = {\n    index: number,\n    x: number,\n    priorBreak: ?Break,\n    badness: number\n};\n\nfunction evaluateBreak(breakIndex: number,\n                       breakX: number,\n                       targetWidth: number,\n                       potentialBreaks: Array<Break>,\n                       penalty: number,\n                       isLastBreak: boolean): Break {\n    // We could skip evaluating breaks where the line length (breakX - priorBreak.x) > maxWidth\n    //  ...but in fact we allow lines longer than maxWidth (if there's no break points)\n    //  ...and when targetWidth and maxWidth are close, strictly enforcing maxWidth can give\n    //     more lopsided results.\n\n    let bestPriorBreak: ?Break = null;\n    let bestBreakBadness = calculateBadness(breakX, targetWidth, penalty, isLastBreak);\n\n    for (const potentialBreak of potentialBreaks) {\n        const lineWidth = breakX - potentialBreak.x;\n        const breakBadness =\n            calculateBadness(lineWidth, targetWidth, penalty, isLastBreak) + potentialBreak.badness;\n        if (breakBadness <= bestBreakBadness) {\n            bestPriorBreak = potentialBreak;\n            bestBreakBadness = breakBadness;\n        }\n    }\n\n    return {\n        index: breakIndex,\n        x: breakX,\n        priorBreak: bestPriorBreak,\n        badness: bestBreakBadness\n    };\n}\n\nfunction leastBadBreaks(lastLineBreak: ?Break): Array<number> {\n    if (!lastLineBreak) {\n        return [];\n    }\n    return leastBadBreaks(lastLineBreak.priorBreak).concat(lastLineBreak.index);\n}\n\nfunction determineLineBreaks(logicalInput: TaggedString,\n                             spacing: number,\n                             maxWidth: number,\n                             glyphMap: {[_: string]: {glyphs: {[_: number]: ?StyleGlyph}, ascender?: number, descender?: number}},\n                             imagePositions: {[_: string]: ImagePosition},\n                             layoutTextSize: number): Array<number> {\n    if (!logicalInput)\n        return [];\n\n    const potentialLineBreaks = [];\n    const targetWidth = determineAverageLineWidth(logicalInput, spacing, maxWidth, glyphMap, imagePositions, layoutTextSize);\n\n    const hasServerSuggestedBreakpoints = logicalInput.text.indexOf(\"\\u200b\") >= 0;\n\n    let currentX = 0;\n\n    for (let i = 0; i < logicalInput.length(); i++) {\n        const section = logicalInput.getSection(i);\n        const codePoint = logicalInput.getCodePoint(i);\n        if (!whitespace[codePoint]) currentX += getGlyphAdvance(codePoint, section, glyphMap, imagePositions, spacing, layoutTextSize);\n\n        // Ideographic characters, spaces, and word-breaking punctuation that often appear without\n        // surrounding spaces.\n        if ((i < logicalInput.length() - 1)) {\n            const ideographicBreak = charAllowsIdeographicBreaking(codePoint);\n            if (breakable[codePoint] || ideographicBreak || section.imageName) {\n\n                potentialLineBreaks.push(\n                    evaluateBreak(\n                        i + 1,\n                        currentX,\n                        targetWidth,\n                        potentialLineBreaks,\n                        calculatePenalty(codePoint, logicalInput.getCodePoint(i + 1), ideographicBreak && hasServerSuggestedBreakpoints),\n                        false));\n            }\n        }\n    }\n\n    return leastBadBreaks(\n        evaluateBreak(\n            logicalInput.length(),\n            currentX,\n            targetWidth,\n            potentialLineBreaks,\n            0,\n            true));\n}\n\nfunction getAnchorAlignment(anchor: SymbolAnchor): AnchorAlignment {\n    let horizontalAlign = 0.5, verticalAlign = 0.5;\n\n    switch (anchor) {\n    case 'right':\n    case 'top-right':\n    case 'bottom-right':\n        horizontalAlign = 1;\n        break;\n    case 'left':\n    case 'top-left':\n    case 'bottom-left':\n        horizontalAlign = 0;\n        break;\n    }\n\n    switch (anchor) {\n    case 'bottom':\n    case 'bottom-right':\n    case 'bottom-left':\n        verticalAlign = 1;\n        break;\n    case 'top':\n    case 'top-right':\n    case 'top-left':\n        verticalAlign = 0;\n        break;\n    }\n\n    return {horizontalAlign, verticalAlign};\n}\n\nfunction shapeLines(shaping: Shaping,\n                    glyphMap: {[_: string]: {glyphs: {[_: number]: ?StyleGlyph}, ascender?: number, descender?: number}},\n                    glyphPositions: GlyphPositions,\n                    imagePositions: {[_: string]: ImagePosition},\n                    lines: Array<TaggedString>,\n                    lineHeight: number,\n                    textAnchor: SymbolAnchor,\n                    textJustify: TextJustify,\n                    writingMode: 1 | 2,\n                    spacing: number,\n                    allowVerticalPlacement: boolean,\n                    layoutTextSizeThisZoom: number) {\n\n    let x = 0;\n    let y = 0;\n\n    let maxLineLength = 0;\n    let maxLineHeight = 0;\n\n    const justify =\n        textJustify === 'right' ? 1 :\n        textJustify === 'left' ? 0 : 0.5;\n\n    let hasBaseline = false;\n    for (const line of lines) {\n        const sections = line.getSections();\n        for (const section of sections) {\n            if (section.imageName) continue;\n\n            const glyphData = glyphMap[section.fontStack];\n            if (!glyphData) continue;\n\n            hasBaseline = glyphData.ascender !== undefined && glyphData.descender !== undefined;\n            if (!hasBaseline) break;\n        }\n        if (!hasBaseline) break;\n    }\n\n    let lineIndex = 0;\n    for (const line of lines) {\n        line.trim();\n\n        const lineMaxScale = line.getMaxScale();\n        const maxLineOffset = (lineMaxScale - 1) * ONE_EM;\n        const positionedLine = {positionedGlyphs: [], lineOffset: 0};\n        shaping.positionedLines[lineIndex] = positionedLine;\n        const positionedGlyphs = positionedLine.positionedGlyphs;\n        let lineOffset = 0.0;\n\n        if (!line.length()) {\n            y += lineHeight; // Still need a line feed after empty line\n            ++lineIndex;\n            continue;\n        }\n\n        let biggestHeight = 0;\n        let baselineOffset = 0;\n        for (let i = 0; i < line.length(); i++) {\n            const section = line.getSection(i);\n            const sectionIndex = line.getSectionIndex(i);\n            const codePoint = line.getCodePoint(i);\n\n            let sectionScale = section.scale;\n            let metrics = null;\n            let rect = null;\n            let imageName = null;\n            let verticalAdvance = ONE_EM;\n            let glyphOffset = 0;\n\n            const vertical = !(writingMode === WritingMode.horizontal ||\n                // Don't verticalize glyphs that have no upright orientation if vertical placement is disabled.\n                (!allowVerticalPlacement && !charHasUprightVerticalOrientation(codePoint)) ||\n                // If vertical placement is enabled, don't verticalize glyphs that\n                // are from complex text layout script, or whitespaces.\n                (allowVerticalPlacement && (whitespace[codePoint] || charInComplexShapingScript(codePoint))));\n\n            if (!section.imageName) {\n                // Find glyph position in the glyph atlas, if bitmap is null,\n                // glyphPosition will not exit in the glyphPosition map\n                const glyphPositionData = glyphPositions[section.fontStack];\n                if (!glyphPositionData) continue;\n                if (glyphPositionData[codePoint]) {\n                    rect = glyphPositionData[codePoint];\n                }\n                const glyphData = glyphMap[section.fontStack];\n                if (!glyphData) continue;\n                const glyph = glyphData.glyphs[codePoint];\n                if (!glyph) continue;\n\n                metrics = glyph.metrics;\n                verticalAdvance = codePoint !== 0x200b ? ONE_EM : 0;\n\n                // In order to make different fonts aligned, they must share a general baseline that aligns with every\n                // font's real baseline. Glyph's offset is counted from the top left corner, where the ascender line\n                // starts.\n                // First of all, each glyph's baseline lies on the center line of the shaping line. Since ascender\n                // is above the baseline, the glyphOffset is the negative shift. Then, in order to make glyphs fit in\n                // the shaping box, for each line, we shift the glyph with biggest height(with scale) to make its center\n                // lie on the center line of the line, which will lead to a baseline shift. Then adjust the whole line\n                // with the baseline offset we calculated from the shift.\n                if (hasBaseline) {\n                    const ascender = glyphData.ascender !== undefined ? Math.abs(glyphData.ascender) : 0;\n                    const descender = glyphData.descender !== undefined ? Math.abs(glyphData.descender) : 0;\n                    const value = (ascender + descender) * sectionScale;\n                    if (biggestHeight < value) {\n                        biggestHeight = value;\n                        baselineOffset = (ascender - descender) / 2 * sectionScale;\n                    }\n                    glyphOffset = -ascender * sectionScale;\n                } else {\n                    // If font's baseline is not applicable, fall back to use a default baseline offset, see\n                    // Shaping::yOffset. Since we're laying out at 24 points, we need also calculate how much it will\n                    // move when we scale up or down.\n                    glyphOffset = SHAPING_DEFAULT_OFFSET + (lineMaxScale - sectionScale) * ONE_EM;\n                }\n            } else {\n                const imagePosition = imagePositions[section.imageName];\n                if (!imagePosition) continue;\n                imageName = section.imageName;\n                shaping.iconsInText = shaping.iconsInText || true;\n                rect = imagePosition.paddedRect;\n                const size = imagePosition.displaySize;\n                // If needed, allow to set scale factor for an image using\n                // alias \"image-scale\" that could be alias for \"font-scale\"\n                // when FormattedSection is an image section.\n                sectionScale = sectionScale * ONE_EM / layoutTextSizeThisZoom;\n\n                metrics = {width: size[0],\n                    height: size[1],\n                    left: 0,\n                    top: -GLYPH_PBF_BORDER,\n                    advance: vertical ? size[1] : size[0],\n                    localGlyph: false};\n\n                if (!hasBaseline) {\n                    glyphOffset = SHAPING_DEFAULT_OFFSET + lineMaxScale * ONE_EM - size[1] * sectionScale;\n                } else {\n                    // Based on node-fontnik: 'top = heightAboveBaseline - Ascender'(it is not valid for locally\n                    // generated glyph). Since the top is a constant: glyph's borderSize. So if we set image glyph with\n                    // 'ascender = height', it means we pull down the glyph under baseline with a distance of glyph's borderSize.\n                    const imageAscender = metrics.height;\n                    glyphOffset = -imageAscender * sectionScale;\n\n                }\n                verticalAdvance = metrics.advance;\n\n                // Difference between height of an image and one EM at max line scale.\n                // Pushes current line down if an image size is over 1 EM at max line scale.\n                const offset = (vertical ? size[0] : size[1]) * sectionScale - ONE_EM * lineMaxScale;\n                if (offset > 0 && offset > lineOffset) {\n                    lineOffset = offset;\n                }\n            }\n\n            if (!vertical) {\n                positionedGlyphs.push({glyph: codePoint, imageName, x, y: y + glyphOffset, vertical, scale: sectionScale, localGlyph: metrics.localGlyph, fontStack: section.fontStack, sectionIndex, metrics, rect});\n                x += metrics.advance * sectionScale + spacing;\n            } else {\n                shaping.verticalizable = true;\n                positionedGlyphs.push({glyph: codePoint, imageName, x, y: y + glyphOffset, vertical, scale: sectionScale, localGlyph: metrics.localGlyph, fontStack: section.fontStack, sectionIndex, metrics, rect});\n                x += verticalAdvance * sectionScale + spacing;\n            }\n        }\n\n        // Only justify if we placed at least one glyph\n        if (positionedGlyphs.length !== 0) {\n            const lineLength = x - spacing;\n            maxLineLength = Math.max(lineLength, maxLineLength);\n            // Justify the line so that its top is aligned with the current height of y, and its horizontal coordinates\n            // are justified according to the TextJustifyType\n            if (hasBaseline) {\n                justifyLine(positionedGlyphs, justify, lineOffset, baselineOffset, lineHeight * lineMaxScale / 2);\n            } else {\n                // Scaled line height offset is counted in glyphOffset, so here just use an unscaled line height\n                justifyLine(positionedGlyphs, justify, lineOffset, 0, lineHeight / 2);\n            }\n        }\n\n        x = 0;\n        const currentLineHeight = lineHeight * lineMaxScale + lineOffset;\n        positionedLine.lineOffset = Math.max(lineOffset, maxLineOffset);\n        y += currentLineHeight;\n        maxLineHeight = Math.max(currentLineHeight, maxLineHeight);\n        ++lineIndex;\n    }\n\n    const height = y;\n    const {horizontalAlign, verticalAlign} = getAnchorAlignment(textAnchor);\n    align(shaping.positionedLines, justify, horizontalAlign, verticalAlign, maxLineLength, height);\n    // Calculate the bounding box\n    shaping.top += -verticalAlign * height;\n    shaping.bottom = shaping.top + height;\n    shaping.left += -horizontalAlign * maxLineLength;\n    shaping.right = shaping.left + maxLineLength;\n    shaping.hasBaseline = hasBaseline;\n}\n\n// justify right = 1, left = 0, center = 0.5\nfunction justifyLine(positionedGlyphs: Array<PositionedGlyph>,\n                     justify: 1 | 0 | 0.5,\n                     lineOffset: number,\n                     baselineOffset: number,\n                     halfLineHeight: number) {\n    if (!justify && !lineOffset && !baselineOffset && !halfLineHeight) {\n        return;\n    }\n    const end = positionedGlyphs.length - 1;\n    const lastGlyph = positionedGlyphs[end];\n    const lastAdvance = lastGlyph.metrics.advance * lastGlyph.scale;\n    const lineIndent = (lastGlyph.x + lastAdvance) * justify;\n\n    for (let j = 0; j <= end; j++) {\n        positionedGlyphs[j].x -= lineIndent;\n        positionedGlyphs[j].y += lineOffset + baselineOffset + halfLineHeight;\n    }\n}\n\nfunction align(positionedLines: Array<PositionedLine>,\n               justify: number,\n               horizontalAlign: number,\n               verticalAlign: number,\n               maxLineLength: number,\n               blockHeight: number) {\n    const shiftX = (justify - horizontalAlign) * maxLineLength;\n\n    const shiftY = -blockHeight * verticalAlign;\n    for (const line of positionedLines) {\n        for (const positionedGlyph of line.positionedGlyphs) {\n            positionedGlyph.x += shiftX;\n            positionedGlyph.y += shiftY;\n        }\n    }\n}\n\nexport type PositionedIcon = {\n    imagePrimary: ImagePosition,\n    imageSecondary: ?ImagePosition,\n    top: number,\n    bottom: number,\n    left: number,\n    right: number,\n    collisionPadding?: [number, number, number, number]\n};\n\nfunction shapeIcon(imagePrimary: ImagePosition, imageSecondary: ?ImagePosition, iconOffset: [number, number], iconAnchor: SymbolAnchor): PositionedIcon {\n    const {horizontalAlign, verticalAlign} = getAnchorAlignment(iconAnchor);\n    const dx = iconOffset[0];\n    const dy = iconOffset[1];\n    const x1 = dx - imagePrimary.displaySize[0] * horizontalAlign;\n    const x2 = x1 + imagePrimary.displaySize[0];\n    const y1 = dy - imagePrimary.displaySize[1] * verticalAlign;\n    const y2 = y1 + imagePrimary.displaySize[1];\n    return {imagePrimary, imageSecondary, top: y1, bottom: y2, left: x1, right: x2};\n}\n\nfunction fitIconToText(shapedIcon: PositionedIcon, shapedText: Shaping,\n                       textFit: string,\n                       padding: [ number, number, number, number ],\n                       iconOffset: [ number, number ], fontScale: number): PositionedIcon {\n    assert(textFit !== 'none');\n    assert(Array.isArray(padding) && padding.length === 4);\n    assert(Array.isArray(iconOffset) && iconOffset.length === 2);\n\n    const image = shapedIcon.imagePrimary;\n\n    let collisionPadding;\n    if (image.content) {\n        const content = image.content;\n        const pixelRatio = image.pixelRatio || 1;\n        collisionPadding = [\n            content[0] / pixelRatio,\n            content[1] / pixelRatio,\n            image.displaySize[0] - content[2] / pixelRatio,\n            image.displaySize[1] - content[3] / pixelRatio\n        ];\n    }\n\n    // We don't respect the icon-anchor, because icon-text-fit is set. Instead,\n    // the icon will be centered on the text, then stretched in the given\n    // dimensions.\n\n    const textLeft = shapedText.left * fontScale;\n    const textRight = shapedText.right * fontScale;\n\n    let top, right, bottom, left;\n    if (textFit === 'width' || textFit === 'both') {\n        // Stretched horizontally to the text width\n        left = iconOffset[0] + textLeft - padding[3];\n        right = iconOffset[0] + textRight + padding[1];\n    } else {\n        // Centered on the text\n        left = iconOffset[0] + (textLeft + textRight - image.displaySize[0]) / 2;\n        right = left + image.displaySize[0];\n    }\n\n    const textTop = shapedText.top * fontScale;\n    const textBottom = shapedText.bottom * fontScale;\n    if (textFit === 'height' || textFit === 'both') {\n        // Stretched vertically to the text height\n        top = iconOffset[1] + textTop - padding[0];\n        bottom = iconOffset[1] + textBottom + padding[2];\n    } else {\n        // Centered on the text\n        top = iconOffset[1] + (textTop + textBottom - image.displaySize[1]) / 2;\n        bottom = top + image.displaySize[1];\n    }\n\n    return {imagePrimary: image, imageSecondary: undefined, top, right, bottom, left, collisionPadding};\n}\n","// @flow\n\nimport Point from '@mapbox/point-geometry';\n\nimport {register} from '../util/web_worker_transfer.js';\n\nclass Anchor extends Point {\n    angle: any;\n    z: number;\n    segment: number | void;\n\n    constructor(x: number, y: number, z: number, angle: number, segment?: number) {\n        super(x, y);\n        this.angle = angle;\n        this.z = z;\n        if (segment !== undefined) {\n            this.segment = segment;\n        }\n    }\n\n    clone(): Anchor {\n        return new Anchor(this.x, this.y, this.z, this.angle, this.segment);\n    }\n}\n\nregister(Anchor, 'Anchor');\n\nexport default Anchor;\n","// @flow\n\nexport default checkMaxAngle;\n\nimport type Point from '@mapbox/point-geometry';\nimport type Anchor from './anchor.js';\n\n/**\n * Labels placed around really sharp angles aren't readable. Check if any\n * part of the potential label has a combined angle that is too big.\n *\n * @param line\n * @param anchor The point on the line around which the label is anchored.\n * @param labelLength The length of the label in geometry units.\n * @param windowSize The check fails if the combined angles within a part of the line that is `windowSize` long is too big.\n * @param maxAngle The maximum combined angle that any window along the label is allowed to have.\n *\n * @returns {boolean} whether the label should be placed\n * @private\n */\nfunction checkMaxAngle(line: Array<Point>, anchor: Anchor, labelLength: number, windowSize: number, maxAngle: number): boolean {\n\n    // horizontal labels always pass\n    if (anchor.segment === undefined) return true;\n\n    let p: Point = anchor;\n    let index = anchor.segment + 1;\n    let anchorDistance = 0;\n\n    // move backwards along the line to the first segment the label appears on\n    while (anchorDistance > -labelLength / 2) {\n        index--;\n\n        // there isn't enough room for the label after the beginning of the line\n        if (index < 0) return false;\n\n        anchorDistance -= line[index].dist(p);\n        p = line[index];\n    }\n\n    anchorDistance += line[index].dist(line[index + 1]);\n    index++;\n\n    // store recent corners and their total angle difference\n    const recentCorners = [];\n    let recentAngleDelta = 0;\n\n    // move forwards by the length of the label and check angles along the way\n    while (anchorDistance < labelLength / 2) {\n        const prev = line[index - 1];\n        const current = line[index];\n        const next = line[index + 1];\n\n        // there isn't enough room for the label before the end of the line\n        if (!next) return false;\n\n        let angleDelta = prev.angleTo(current) - current.angleTo(next);\n        // restrict angle to -pi..pi range\n        angleDelta = Math.abs(((angleDelta + 3 * Math.PI) % (Math.PI * 2)) - Math.PI);\n\n        recentCorners.push({\n            distance: anchorDistance,\n            angleDelta\n        });\n        recentAngleDelta += angleDelta;\n\n        // remove corners that are far enough away from the list of recent anchors\n        while (anchorDistance - recentCorners[0].distance > windowSize) {\n            recentAngleDelta -= recentCorners.shift().angleDelta;\n        }\n\n        // the sum of angles within the window area exceeds the maximum allowed value. check fails.\n        if (recentAngleDelta > maxAngle) return false;\n\n        index++;\n        anchorDistance += current.dist(next);\n    }\n\n    // no part of the line had an angle greater than the maximum allowed. check passes.\n    return true;\n}\n","// @flow\n\nimport {number as interpolate} from '../style-spec/util/interpolate.js';\n\nimport Anchor from '../symbol/anchor.js';\nimport checkMaxAngle from './check_max_angle.js';\n\nimport type Point from '@mapbox/point-geometry';\nimport type {Shaping, PositionedIcon} from './shaping.js';\n\nexport {getAnchors, getCenterAnchor};\n\nfunction getLineLength(line: Array<Point>): number {\n    let lineLength = 0;\n    for (let k = 0; k < line.length - 1; k++) {\n        lineLength += line[k].dist(line[k + 1]);\n    }\n    return lineLength;\n}\n\nfunction getAngleWindowSize(shapedText: ?Shaping,\n                            glyphSize: number,\n                            boxScale: number): number {\n    return shapedText ?\n        3 / 5 * glyphSize * boxScale :\n        0;\n}\n\nfunction getShapedLabelLength(shapedText: ?Shaping, shapedIcon: ?PositionedIcon): number {\n    return Math.max(\n        shapedText ? shapedText.right - shapedText.left : 0,\n        shapedIcon ? shapedIcon.right - shapedIcon.left : 0);\n}\n\nfunction getCenterAnchor(line: Array<Point>,\n                         maxAngle: number,\n                         shapedText: ?Shaping,\n                         shapedIcon: ?PositionedIcon,\n                         glyphSize: number,\n                         boxScale: number): ?Anchor {\n    const angleWindowSize = getAngleWindowSize(shapedText, glyphSize, boxScale);\n    const labelLength = getShapedLabelLength(shapedText, shapedIcon) * boxScale;\n\n    let prevDistance = 0;\n    const centerDistance = getLineLength(line) / 2;\n\n    for (let i = 0; i < line.length - 1; i++) {\n\n        const a = line[i],\n            b = line[i + 1];\n\n        const segmentDistance = a.dist(b);\n\n        if (prevDistance + segmentDistance > centerDistance) {\n            // The center is on this segment\n            const t = (centerDistance - prevDistance) / segmentDistance,\n                x = interpolate(a.x, b.x, t),\n                y = interpolate(a.y, b.y, t);\n\n            const anchor = new Anchor(x, y, 0, b.angleTo(a), i);\n            if (!angleWindowSize || checkMaxAngle(line, anchor, labelLength, angleWindowSize, maxAngle)) {\n                return anchor;\n            } else {\n                return;\n            }\n        }\n\n        prevDistance += segmentDistance;\n    }\n}\n\nfunction getAnchors(line: Array<Point>,\n                    spacing: number,\n                    maxAngle: number,\n                    shapedText: ?Shaping,\n                    shapedIcon: ?PositionedIcon,\n                    glyphSize: number,\n                    boxScale: number,\n                    overscaling: number,\n                    tileExtent: number): Array<Anchor> {\n\n    // Resample a line to get anchor points for labels and check that each\n    // potential label passes text-max-angle check and has enough froom to fit\n    // on the line.\n\n    const angleWindowSize = getAngleWindowSize(shapedText, glyphSize, boxScale);\n    const shapedLabelLength = getShapedLabelLength(shapedText, shapedIcon);\n    const labelLength = shapedLabelLength * boxScale;\n\n    // Is the line continued from outside the tile boundary?\n    const isLineContinued = line[0].x === 0 || line[0].x === tileExtent || line[0].y === 0 || line[0].y === tileExtent;\n\n    // Is the label long, relative to the spacing?\n    // If so, adjust the spacing so there is always a minimum space of `spacing / 4` between label edges.\n    if (spacing - labelLength < spacing / 4) {\n        spacing = labelLength + spacing / 4;\n    }\n\n    // Offset the first anchor by:\n    // Either half the label length plus a fixed extra offset if the line is not continued\n    // Or half the spacing if the line is continued.\n\n    // For non-continued lines, add a bit of fixed extra offset to avoid collisions at T intersections.\n    const fixedExtraOffset = glyphSize * 2;\n\n    const offset = !isLineContinued ?\n        ((shapedLabelLength / 2 + fixedExtraOffset) * boxScale * overscaling) % spacing :\n        (spacing / 2 * overscaling) % spacing;\n\n    return resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, false, tileExtent);\n}\n\nfunction resample(line: Array<Point>, offset: number, spacing: number, angleWindowSize: number, maxAngle: number, labelLength: number, isLineContinued: boolean, placeAtMiddle: boolean, tileExtent: number) {\n\n    const halfLabelLength = labelLength / 2;\n    const lineLength = getLineLength(line);\n\n    let distance = 0,\n        markedDistance = offset - spacing;\n\n    let anchors = [];\n\n    for (let i = 0; i < line.length - 1; i++) {\n\n        const a = line[i],\n            b = line[i + 1];\n\n        const segmentDist = a.dist(b),\n            angle = b.angleTo(a);\n\n        while (markedDistance + spacing < distance + segmentDist) {\n            markedDistance += spacing;\n\n            const t = (markedDistance - distance) / segmentDist,\n                x = interpolate(a.x, b.x, t),\n                y = interpolate(a.y, b.y, t);\n\n            // Check that the point is within the tile boundaries and that\n            // the label would fit before the beginning and end of the line\n            // if placed at this point.\n            if (x >= 0 && x < tileExtent && y >= 0 && y < tileExtent &&\n                    markedDistance - halfLabelLength >= 0 &&\n                    markedDistance + halfLabelLength <= lineLength) {\n                const anchor = new Anchor(x, y, 0, angle, i);\n\n                if (!angleWindowSize || checkMaxAngle(line, anchor, labelLength, angleWindowSize, maxAngle)) {\n                    anchors.push(anchor);\n                }\n            }\n        }\n\n        distance += segmentDist;\n    }\n\n    if (!placeAtMiddle && !anchors.length && !isLineContinued) {\n        // The first attempt at finding anchors at which labels can be placed failed.\n        // Try again, but this time just try placing one anchor at the middle of the line.\n        // This has the most effect for short lines in overscaled tiles, since the\n        // initial offset used in overscaled tiles is calculated to align labels with positions in\n        // parent tiles instead of placing the label as close to the beginning as possible.\n        anchors = resample(line, distance / 2, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, true, tileExtent);\n    }\n\n    return anchors;\n}\n","// @flow\n\nimport Point from '@mapbox/point-geometry';\n\nexport default clipLine;\n\n/**\n * Returns the part of a multiline that intersects with the provided rectangular box.\n *\n * @param lines\n * @param x1 the left edge of the box\n * @param y1 the top edge of the box\n * @param x2 the right edge of the box\n * @param y2 the bottom edge of the box\n * @returns lines\n * @private\n */\nfunction clipLine(lines: Array<Array<Point>>, x1: number, y1: number, x2: number, y2: number): Array<Array<Point>> {\n    const clippedLines = [];\n\n    for (let l = 0; l < lines.length; l++) {\n        const line = lines[l];\n        let clippedLine;\n\n        for (let i = 0; i < line.length - 1; i++) {\n            let p0 = line[i];\n            let p1 = line[i + 1];\n\n            if (p0.x < x1 && p1.x < x1) {\n                continue;\n            } else if (p0.x < x1) {\n                p0 = new Point(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round();\n            } else if (p1.x < x1) {\n                p1 = new Point(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round();\n            }\n\n            if (p0.y < y1 && p1.y < y1) {\n                continue;\n            } else if (p0.y < y1) {\n                p0 = new Point(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round();\n            } else if (p1.y < y1) {\n                p1 = new Point(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round();\n            }\n\n            if (p0.x >= x2 && p1.x >= x2) {\n                continue;\n            } else if (p0.x >= x2) {\n                p0 = new Point(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round();\n            } else if (p1.x >= x2) {\n                p1 = new Point(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round();\n            }\n\n            if (p0.y >= y2 && p1.y >= y2) {\n                continue;\n            } else if (p0.y >= y2) {\n                p0 = new Point(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round();\n            } else if (p1.y >= y2) {\n                p1 = new Point(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round();\n            }\n\n            if (!clippedLine || !p0.equals(clippedLine[clippedLine.length - 1])) {\n                clippedLine = [p0];\n                clippedLines.push(clippedLine);\n            }\n\n            clippedLine.push(p1);\n        }\n    }\n\n    return clippedLines;\n}\n","\nexport default function potpack(boxes) {\n\n    // calculate total box area and maximum box width\n    let area = 0;\n    let maxWidth = 0;\n\n    for (const box of boxes) {\n        area += box.w * box.h;\n        maxWidth = Math.max(maxWidth, box.w);\n    }\n\n    // sort the boxes for insertion by height, descending\n    boxes.sort((a, b) => b.h - a.h);\n\n    // aim for a squarish resulting container,\n    // slightly adjusted for sub-100% space utilization\n    const startWidth = Math.max(Math.ceil(Math.sqrt(area / 0.95)), maxWidth);\n\n    // start with a single empty space, unbounded at the bottom\n    const spaces = [{x: 0, y: 0, w: startWidth, h: Infinity}];\n\n    let width = 0;\n    let height = 0;\n\n    for (const box of boxes) {\n        // look through spaces backwards so that we check smaller spaces first\n        for (let i = spaces.length - 1; i >= 0; i--) {\n            const space = spaces[i];\n\n            // look for empty spaces that can accommodate the current box\n            if (box.w > space.w || box.h > space.h) continue;\n\n            // found the space; add the box to its top-left corner\n            // |-------|-------|\n            // |  box  |       |\n            // |_______|       |\n            // |         space |\n            // |_______________|\n            box.x = space.x;\n            box.y = space.y;\n\n            height = Math.max(height, box.y + box.h);\n            width = Math.max(width, box.x + box.w);\n\n            if (box.w === space.w && box.h === space.h) {\n                // space matches the box exactly; remove it\n                const last = spaces.pop();\n                if (i < spaces.length) spaces[i] = last;\n\n            } else if (box.h === space.h) {\n                // space matches the box height; update it accordingly\n                // |-------|---------------|\n                // |  box  | updated space |\n                // |_______|_______________|\n                space.x += box.w;\n                space.w -= box.w;\n\n            } else if (box.w === space.w) {\n                // space matches the box width; update it accordingly\n                // |---------------|\n                // |      box      |\n                // |_______________|\n                // | updated space |\n                // |_______________|\n                space.y += box.h;\n                space.h -= box.h;\n\n            } else {\n                // otherwise the box splits the space into two spaces\n                // |-------|-----------|\n                // |  box  | new space |\n                // |_______|___________|\n                // | updated space     |\n                // |___________________|\n                spaces.push({\n                    x: space.x + box.w,\n                    y: space.y,\n                    w: space.w - box.w,\n                    h: box.h\n                });\n                space.y += box.h;\n                space.h -= box.h;\n            }\n            break;\n        }\n    }\n\n    return {\n        w: width, // container width\n        h: height, // container height\n        fill: (area / (width * height)) || 0 // space utilization\n    };\n}\n","// @flow\n\nimport {RGBAImage} from '../util/image.js';\nimport {register} from '../util/web_worker_transfer.js';\nimport potpack from 'potpack';\n\nimport type {StyleImage} from '../style/style_image.js';\nimport type ImageManager from './image_manager.js';\nimport type Texture from './texture.js';\nimport type {SpritePosition} from '../util/image.js';\n\nconst IMAGE_PADDING: number = 1;\nexport {IMAGE_PADDING};\n\ntype Rect = {\n    x: number,\n    y: number,\n    w: number,\n    h: number\n};\n\nexport class ImagePosition implements SpritePosition {\n    paddedRect: Rect;\n    pixelRatio: number;\n    version: number;\n    stretchY: ?Array<[number, number]>;\n    stretchX: ?Array<[number, number]>;\n    content: ?[number, number, number, number];\n\n    constructor(paddedRect: Rect, {pixelRatio, version, stretchX, stretchY, content}: StyleImage) {\n        this.paddedRect = paddedRect;\n        this.pixelRatio = pixelRatio;\n        this.stretchX = stretchX;\n        this.stretchY = stretchY;\n        this.content = content;\n        this.version = version;\n    }\n\n    get tl(): [number, number] {\n        return [\n            this.paddedRect.x + IMAGE_PADDING,\n            this.paddedRect.y + IMAGE_PADDING\n        ];\n    }\n\n    get br(): [number, number] {\n        return [\n            this.paddedRect.x + this.paddedRect.w - IMAGE_PADDING,\n            this.paddedRect.y + this.paddedRect.h - IMAGE_PADDING\n        ];\n    }\n\n    get displaySize(): [number, number] {\n        return [\n            (this.paddedRect.w - IMAGE_PADDING * 2) / this.pixelRatio,\n            (this.paddedRect.h - IMAGE_PADDING * 2) / this.pixelRatio\n        ];\n    }\n}\n\nexport default class ImageAtlas {\n    image: RGBAImage;\n    iconPositions: {[_: string]: ImagePosition};\n    patternPositions: {[_: string]: ImagePosition};\n    haveRenderCallbacks: Array<string>;\n    uploaded: ?boolean;\n\n    constructor(icons: {[_: string]: StyleImage}, patterns: {[_: string]: StyleImage}) {\n        const iconPositions = {}, patternPositions = {};\n        this.haveRenderCallbacks = [];\n\n        const bins = [];\n\n        this.addImages(icons, iconPositions, bins);\n        this.addImages(patterns, patternPositions, bins);\n\n        const {w, h} = potpack(bins);\n        const image = new RGBAImage({width: w || 1, height: h || 1});\n\n        for (const id in icons) {\n            const src = icons[id];\n            const bin = iconPositions[id].paddedRect;\n            // For SDF icons, we override the RGB channels with white.\n            // This is because we read the red channel in the shader and RGB channels will get alpha-premultiplied on upload.\n            const overrideRGB = src.sdf;\n            RGBAImage.copy(src.data, image, {x: 0, y: 0}, {x: bin.x + IMAGE_PADDING, y: bin.y + IMAGE_PADDING}, src.data, overrideRGB);\n        }\n\n        for (const id in patterns) {\n            const src = patterns[id];\n            const bin = patternPositions[id].paddedRect;\n            const x = bin.x + IMAGE_PADDING,\n                y = bin.y + IMAGE_PADDING,\n                w = src.data.width,\n                h = src.data.height;\n\n            RGBAImage.copy(src.data, image, {x: 0, y: 0}, {x, y}, src.data);\n            // Add 1 pixel wrapped padding on each side of the image.\n            RGBAImage.copy(src.data, image, {x: 0, y: h - 1}, {x, y: y - 1}, {width: w, height: 1}); // T\n            RGBAImage.copy(src.data, image, {x: 0, y:     0}, {x, y: y + h}, {width: w, height: 1}); // B\n            RGBAImage.copy(src.data, image, {x: w - 1, y: 0}, {x: x - 1, y}, {width: 1, height: h}); // L\n            RGBAImage.copy(src.data, image, {x: 0,     y: 0}, {x: x + w, y}, {width: 1, height: h}); // R\n        }\n\n        this.image = image;\n        this.iconPositions = iconPositions;\n        this.patternPositions = patternPositions;\n    }\n\n    addImages(images: {[_: string]: StyleImage}, positions: {[_: string]: ImagePosition}, bins: Array<Rect>) {\n        for (const id in images) {\n            const src = images[id];\n            const bin = {\n                x: 0,\n                y: 0,\n                w: src.data.width + 2 * IMAGE_PADDING,\n                h: src.data.height + 2 * IMAGE_PADDING,\n            };\n            bins.push(bin);\n            positions[id] = new ImagePosition(bin, src);\n\n            if (src.hasRenderCallback) {\n                this.haveRenderCallbacks.push(id);\n            }\n        }\n    }\n\n    patchUpdatedImages(imageManager: ImageManager, texture: Texture, scope: string) {\n        this.haveRenderCallbacks = this.haveRenderCallbacks.filter(id => imageManager.hasImage(id, scope));\n        imageManager.dispatchRenderCallbacks(this.haveRenderCallbacks, scope);\n        for (const name in imageManager.getUpdatedImages(scope)) {\n            this.patchUpdatedImage(this.iconPositions[name], imageManager.getImage(name, scope), texture);\n            this.patchUpdatedImage(this.patternPositions[name], imageManager.getImage(name, scope), texture);\n        }\n    }\n\n    patchUpdatedImage(position: ?ImagePosition, image: ?StyleImage, texture: Texture) {\n        if (!position || !image) return;\n\n        if (position.version === image.version) return;\n\n        position.version = image.version;\n        const [x, y] = position.tl;\n        const hasPattern = !!Object.keys(this.patternPositions).length;\n        texture.update(image.data, {useMipmap: hasPattern}, {x, y});\n    }\n\n}\n\nregister(ImagePosition, 'ImagePosition');\nregister(ImageAtlas, 'ImageAtlas');\n","const INF = 1e20;\n\nexport default class TinySDF {\n    constructor({\n        fontSize = 24,\n        buffer = 3,\n        radius = 8,\n        cutoff = 0.25,\n        fontFamily = 'sans-serif',\n        fontWeight = 'normal',\n        fontStyle = 'normal'\n    } = {}) {\n        this.buffer = buffer;\n        this.cutoff = cutoff;\n        this.radius = radius;\n\n        // make the canvas size big enough to both have the specified buffer around the glyph\n        // for \"halo\", and account for some glyphs possibly being larger than their font size\n        const size = this.size = fontSize + buffer * 4;\n\n        const canvas = this._createCanvas(size);\n        const ctx = this.ctx = canvas.getContext('2d', {willReadFrequently: true});\n        ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`;\n\n        ctx.textBaseline = 'alphabetic';\n        ctx.textAlign = 'left'; // Necessary so that RTL text doesn't have different alignment\n        ctx.fillStyle = 'black';\n\n        // temporary arrays for the distance transform\n        this.gridOuter = new Float64Array(size * size);\n        this.gridInner = new Float64Array(size * size);\n        this.f = new Float64Array(size);\n        this.z = new Float64Array(size + 1);\n        this.v = new Uint16Array(size);\n    }\n\n    _createCanvas(size) {\n        const canvas = document.createElement('canvas');\n        canvas.width = canvas.height = size;\n        return canvas;\n    }\n\n    draw(char) {\n        const {\n            width: glyphAdvance,\n            actualBoundingBoxAscent,\n            actualBoundingBoxDescent,\n            actualBoundingBoxLeft,\n            actualBoundingBoxRight\n        } = this.ctx.measureText(char);\n\n        // The integer/pixel part of the top alignment is encoded in metrics.glyphTop\n        // The remainder is implicitly encoded in the rasterization\n        const glyphTop = Math.ceil(actualBoundingBoxAscent);\n        const glyphLeft = 0;\n\n        // If the glyph overflows the canvas size, it will be clipped at the bottom/right\n        const glyphWidth = Math.max(0, Math.min(this.size - this.buffer, Math.ceil(actualBoundingBoxRight - actualBoundingBoxLeft)));\n        const glyphHeight = Math.min(this.size - this.buffer, glyphTop + Math.ceil(actualBoundingBoxDescent));\n\n        const width = glyphWidth + 2 * this.buffer;\n        const height = glyphHeight + 2 * this.buffer;\n\n        const len = Math.max(width * height, 0);\n        const data = new Uint8ClampedArray(len);\n        const glyph = {data, width, height, glyphWidth, glyphHeight, glyphTop, glyphLeft, glyphAdvance};\n        if (glyphWidth === 0 || glyphHeight === 0) return glyph;\n\n        const {ctx, buffer, gridInner, gridOuter} = this;\n        ctx.clearRect(buffer, buffer, glyphWidth, glyphHeight);\n        ctx.fillText(char, buffer, buffer + glyphTop);\n        const imgData = ctx.getImageData(buffer, buffer, glyphWidth, glyphHeight);\n\n        // Initialize grids outside the glyph range to alpha 0\n        gridOuter.fill(INF, 0, len);\n        gridInner.fill(0, 0, len);\n\n        for (let y = 0; y < glyphHeight; y++) {\n            for (let x = 0; x < glyphWidth; x++) {\n                const a = imgData.data[4 * (y * glyphWidth + x) + 3] / 255; // alpha value\n                if (a === 0) continue; // empty pixels\n\n                const j = (y + buffer) * width + x + buffer;\n\n                if (a === 1) { // fully drawn pixels\n                    gridOuter[j] = 0;\n                    gridInner[j] = INF;\n\n                } else { // aliased pixels\n                    const d = 0.5 - a;\n                    gridOuter[j] = d > 0 ? d * d : 0;\n                    gridInner[j] = d < 0 ? d * d : 0;\n                }\n            }\n        }\n\n        edt(gridOuter, 0, 0, width, height, width, this.f, this.v, this.z);\n        edt(gridInner, buffer, buffer, glyphWidth, glyphHeight, width, this.f, this.v, this.z);\n\n        for (let i = 0; i < len; i++) {\n            const d = Math.sqrt(gridOuter[i]) - Math.sqrt(gridInner[i]);\n            data[i] = Math.round(255 - 255 * (d / this.radius + this.cutoff));\n        }\n\n        return glyph;\n    }\n}\n\n// 2D Euclidean squared distance transform by Felzenszwalb & Huttenlocher https://cs.brown.edu/~pff/papers/dt-final.pdf\nfunction edt(data, x0, y0, width, height, gridSize, f, v, z) {\n    for (let x = x0; x < x0 + width; x++) edt1d(data, y0 * gridSize + x, gridSize, height, f, v, z);\n    for (let y = y0; y < y0 + height; y++) edt1d(data, y * gridSize + x0, 1, width, f, v, z);\n}\n\n// 1D squared distance transform\nfunction edt1d(grid, offset, stride, length, f, v, z) {\n    v[0] = 0;\n    z[0] = -INF;\n    z[1] = INF;\n    f[0] = grid[offset];\n\n    for (let q = 1, k = 0, s = 0; q < length; q++) {\n        f[q] = grid[offset + q * stride];\n        const q2 = q * q;\n        do {\n            const r = v[k];\n            s = (f[q] - f[r] + q2 - r * r) / (q - r) / 2;\n        } while (s <= z[k] && --k > -1);\n\n        k++;\n        v[k] = q;\n        z[k] = s;\n        z[k + 1] = INF;\n    }\n\n    for (let q = 0, k = 0; q < length; q++) {\n        while (z[k + 1] < q) k++;\n        const r = v[k];\n        const qr = q - r;\n        grid[offset + q * stride] = f[r] + qr * qr;\n    }\n}\n","// @flow\n\nimport loadGlyphRange from '../style/load_glyph_range.js';\n\nimport TinySDF from '@mapbox/tiny-sdf';\nimport isChar from '../util/is_char_in_unicode_block.js';\nimport config from '../util/config.js';\nimport {asyncAll} from '../util/util.js';\nimport {AlphaImage} from '../util/image.js';\n\nimport type {Class} from '../types/class.js';\nimport type {StyleGlyph} from '../style/style_glyph.js';\nimport type {RequestManager} from '../util/mapbox.js';\nimport type {Callback} from '../types/callback.js';\n\n/*\n  SDF_SCALE controls the pixel density of locally generated glyphs relative\n  to \"normal\" SDFs which are generated at 24pt font and a \"pixel ratio\" of 1.\n  The GlyphManager will generate glyphs SDF_SCALE times as large,\n  but with the same glyph metrics, and the quad generation code will scale them\n  back down so they display at the same size.\n\n  The choice of SDF_SCALE is a trade-off between performance and quality.\n  Glyph generation time grows quadratically with the the scale, while quality\n  improvements drop off rapidly when the scale is higher than the pixel ratio\n  of the device. The scale of 2 buys noticeable improvements on HDPI screens\n  at acceptable cost.\n\n  The scale can be any value, but in order to avoid small distortions, these\n  pixel-based values must come out to integers:\n   - \"localGlyphPadding\" in GlyphAtlas\n   - Font/Canvas/Buffer size for TinySDF\n  localGlyphPadding + buffer should equal 4 * SDF_SCALE. So if you wanted to\n  use an SDF_SCALE of 1.75, you could manually set localGlyphAdding to 2 and\n  buffer to 5.\n*/\nexport const SDF_SCALE = 2;\n\ntype Entry = {\n    // null means we've requested the range, but the glyph wasn't included in the result.\n    glyphs: {[id: number]: StyleGlyph | null},\n    requests: {[range: number]: Array<Callback<{glyphs: {[number]: StyleGlyph | null}, ascender?: number, descender?: number}>>},\n    ranges: {[range: number]: boolean | null},\n    tinySDF?: TinySDF,\n    ascender?: number,\n    descender?: number\n};\n\nexport const LocalGlyphMode = {\n    none: 0,\n    ideographs: 1,\n    all: 2\n};\n\nclass GlyphManager {\n    requestManager: RequestManager;\n    localFontFamily: ?string;\n    localGlyphMode: number;\n    entries: {[_: string]: Entry};\n    // Multiple fontstacks may share the same local glyphs, so keep an index\n    // into the glyphs based soley on font weight\n    localGlyphs: {[_: string]: {glyphs: {[id: number]: StyleGlyph | null}, ascender: ?number, descender: ?number}};\n    urls: {[scope: string]: ?string};\n\n    // exposed as statics to enable stubbing in unit tests\n    static loadGlyphRange: typeof loadGlyphRange;\n    static TinySDF: Class<TinySDF>;\n\n    constructor(requestManager: RequestManager, localGlyphMode: number, localFontFamily: ?string) {\n        this.requestManager = requestManager;\n        this.localGlyphMode = localGlyphMode;\n        this.localFontFamily = localFontFamily;\n        this.urls = {};\n        this.entries = {};\n        this.localGlyphs = {\n            // Only these four font weights are supported\n            '200': {},\n            '400': {},\n            '500': {},\n            '900': {}\n        };\n    }\n\n    setURL(url: ?string, scope: string) {\n        this.urls[scope] = url;\n    }\n\n    getGlyphs(glyphs: {[stack: string]: Array<number>}, scope: string, callback: Callback<{[stack: string]: {glyphs: {[_: number]: ?StyleGlyph}, ascender?: number, descender?: number}}>) {\n        const all = [];\n\n        // Fallback to the default glyphs URL if none is specified\n        const url = this.urls[scope] || config.GLYPHS_URL;\n\n        for (const stack in glyphs) {\n            for (const id of glyphs[stack]) {\n                all.push({stack, id});\n            }\n        }\n\n        asyncAll(all, ({stack, id}, fnCallback: Callback<{stack: string, id: number, glyph: ?StyleGlyph}>) => {\n            let entry = this.entries[stack];\n            if (!entry) {\n                entry = this.entries[stack] = {\n                    glyphs: {},\n                    requests: {},\n                    ranges: {},\n                    ascender: undefined,\n                    descender: undefined\n                };\n            }\n\n            let glyph = entry.glyphs[id];\n            if (glyph !== undefined) {\n                fnCallback(null, {stack, id, glyph});\n                return;\n            }\n\n            glyph = this._tinySDF(entry, stack, id);\n            if (glyph) {\n                entry.glyphs[id] = glyph;\n                fnCallback(null, {stack, id, glyph});\n                return;\n            }\n\n            const range = Math.floor(id / 256);\n            if (range * 256 > 65535) {\n                fnCallback(new Error('glyphs > 65535 not supported'));\n                return;\n            }\n\n            if (entry.ranges[range]) {\n                fnCallback(null, {stack, id, glyph});\n                return;\n            }\n\n            let requests = entry.requests[range];\n            if (!requests) {\n                requests = entry.requests[range] = [];\n                GlyphManager.loadGlyphRange(stack, range, url, this.requestManager,\n                    (err, response: ?{glyphs: {[_: number]: StyleGlyph | null}, ascender?: number, descender?: number}) => {\n                        if (response) {\n                            entry.ascender = response.ascender;\n                            entry.descender = response.descender;\n                            for (const id in response.glyphs) {\n                                if (!this._doesCharSupportLocalGlyph(+id)) {\n                                    entry.glyphs[+id] = response.glyphs[+id];\n                                }\n                            }\n                            entry.ranges[range] = true;\n                        }\n                        for (const cb of requests) {\n                            cb(err, response);\n                        }\n                        delete entry.requests[range];\n                    });\n            }\n\n            requests.push((err, result: ?{glyphs: {[_: number]: StyleGlyph | null}, ascender?: number, descender?: number}) => {\n                if (err) {\n                    fnCallback(err);\n                } else if (result) {\n                    fnCallback(null, {stack, id, glyph: result.glyphs[id] || null});\n                }\n            });\n        }, (err, glyphs: ?Array<{stack: string, id: number, glyph: ?StyleGlyph}>) => {\n            if (err) {\n                callback(err);\n            } else if (glyphs) {\n                const result = {};\n\n                for (const {stack, id, glyph} of glyphs) {\n                    // Clone the glyph so that our own copy of its ArrayBuffer doesn't get transferred.\n                    if (result[stack] === undefined) result[stack] = {};\n                    if (result[stack].glyphs === undefined) result[stack].glyphs = {};\n                    result[stack].glyphs[id] = glyph && {\n                        id: glyph.id,\n                        bitmap: glyph.bitmap.clone(),\n                        metrics: glyph.metrics\n                    };\n                    result[stack].ascender = this.entries[stack].ascender;\n                    result[stack].descender = this.entries[stack].descender;\n                }\n\n                callback(null, result);\n            }\n        });\n    }\n\n    _doesCharSupportLocalGlyph(id: number): boolean {\n        if (this.localGlyphMode === LocalGlyphMode.none) {\n            return false;\n        } else if (this.localGlyphMode === LocalGlyphMode.all) {\n            return !!this.localFontFamily;\n        } else {\n            /* eslint-disable new-cap */\n            return !!this.localFontFamily && (\n                isChar['CJK Unified Ideographs'](id) ||\n                isChar['Hangul Syllables'](id) ||\n                isChar['Hiragana'](id) ||\n                isChar['Katakana'](id) ||\n                // gl-native parity: Extend Ideographs rasterization range to include CJK symbols and punctuations\n                isChar['CJK Symbols and Punctuation'](id) ||\n                isChar['CJK Unified Ideographs Extension A'](id) ||\n                isChar['CJK Unified Ideographs Extension B'](id) // very rare surrogate characters\n            );\n            /* eslint-enable new-cap */\n        }\n    }\n\n    _tinySDF(entry: Entry, stack: string, id: number): ?StyleGlyph {\n        const fontFamily = this.localFontFamily;\n        if (!fontFamily || !this._doesCharSupportLocalGlyph(id)) return;\n\n        let tinySDF = entry.tinySDF;\n        if (!tinySDF) {\n            let fontWeight = '400';\n            if (/bold/i.test(stack)) {\n                fontWeight = '900';\n            } else if (/medium/i.test(stack)) {\n                fontWeight = '500';\n            } else if (/light/i.test(stack)) {\n                fontWeight = '200';\n            }\n\n            const fontSize = 24 * SDF_SCALE;\n            const buffer = 3 * SDF_SCALE;\n            const radius = 8 * SDF_SCALE;\n            tinySDF = entry.tinySDF = new GlyphManager.TinySDF({fontFamily, fontWeight, fontSize, buffer, radius});\n            tinySDF.fontWeight = fontWeight;\n        }\n\n        if (this.localGlyphs[tinySDF.fontWeight][id]) {\n            return this.localGlyphs[tinySDF.fontWeight][id];\n        }\n\n        const char = String.fromCodePoint(id);\n        const {data, width, height, glyphWidth, glyphHeight, glyphLeft, glyphTop, glyphAdvance} = tinySDF.draw(char);\n        /*\n        TinySDF's \"top\" is the distance from the alphabetic baseline to the\n         top of the glyph.\n\n        Server-generated fonts specify \"top\" relative to an origin above the\n         em box (the origin comes from FreeType, but I'm unclear on exactly\n         how it's derived)\n          ref: https://github.com/mapbox/sdf-glyph-foundry\n\n        Server fonts don't yet include baseline information, so we can't line\n        up exactly with them (and they don't line up with each other)\n          ref: https://github.com/mapbox/node-fontnik/pull/160\n\n        To approximately align TinySDF glyphs with server-provided glyphs, we\n        use this baseline adjustment factor calibrated to be in between DIN Pro\n        and Arial Unicode (but closer to Arial Unicode)\n        */\n        const baselineAdjustment = 27;\n\n        const glyph = this.localGlyphs[tinySDF.fontWeight][id] = {\n            id,\n            bitmap: new AlphaImage({width, height}, data),\n            metrics: {\n                width: glyphWidth / SDF_SCALE,\n                height: glyphHeight / SDF_SCALE,\n                left: glyphLeft / SDF_SCALE,\n                top: glyphTop / SDF_SCALE - baselineAdjustment,\n                advance: glyphAdvance / SDF_SCALE,\n                localGlyph: true\n            }\n        };\n        return glyph;\n    }\n}\n\nGlyphManager.loadGlyphRange = loadGlyphRange;\nGlyphManager.TinySDF = TinySDF;\n\nexport default GlyphManager;\n","// @flow\n\nimport {getArrayBuffer, ResourceType} from '../util/ajax.js';\n\nimport parseGlyphPBF from './parse_glyph_pbf.js';\n\nimport type {StyleGlyph} from './style_glyph.js';\nimport type {RequestManager} from '../util/mapbox.js';\nimport type {Callback} from '../types/callback.js';\n\nexport default function (fontstack: string,\n                           range: number,\n                           urlTemplate: string,\n                           requestManager: RequestManager,\n                           callback: Callback<{glyphs: {[number]: StyleGlyph | null}, ascender?: number, descender?: number}>) {\n    const begin = range * 256;\n    const end = begin + 255;\n\n    const request = requestManager.transformRequest(\n        requestManager.normalizeGlyphsURL(urlTemplate)\n            .replace('{fontstack}', fontstack)\n            .replace('{range}', `${begin}-${end}`),\n        ResourceType.Glyphs);\n\n    getArrayBuffer(request, (err: ?Error, data: ?ArrayBuffer) => {\n        if (err) {\n            callback(err);\n        } else if (data) {\n            const glyphs = {};\n            const glyphData = parseGlyphPBF(data);\n            for (const glyph of glyphData.glyphs) {\n                glyphs[glyph.id] = glyph;\n            }\n            callback(null, {glyphs, ascender: glyphData.ascender, descender: glyphData.descender});\n        }\n    });\n}\n","// @flow\n\nimport Point from '@mapbox/point-geometry';\n\nimport {GLYPH_PBF_BORDER} from '../style/parse_glyph_pbf.js';\n\nimport type Anchor from './anchor.js';\nimport type {PositionedIcon, Shaping} from './shaping.js';\nimport {IMAGE_PADDING} from '../render/image_atlas.js';\nimport {SDF_SCALE} from '../render/glyph_manager.js';\nimport type SymbolStyleLayer from '../style/style_layer/symbol_style_layer.js';\nimport type {Feature} from '../style-spec/expression/index.js';\nimport type {StyleImage} from '../style/style_image.js';\nimport {isVerticalClosePunctuation, isVerticalOpenPunctuation} from '../util/verticalize_punctuation.js';\nimport ONE_EM from './one_em.js';\nimport {warnOnce} from '../util/util.js';\n\nexport type TextureCoordinate = {\n    x: number,\n    y: number,\n    w: number,\n    h: number\n};\n\ntype Size = {| fixed: number, stretch: number |};\n\n/**\n * A textured quad for rendering a single icon or glyph.\n *\n * The zoom range the glyph can be shown is defined by minScale and maxScale.\n *\n * @param tl The offset of the top left corner from the anchor.\n * @param tr The offset of the top right corner from the anchor.\n * @param bl The offset of the bottom left corner from the anchor.\n * @param br The offset of the bottom right corner from the anchor.\n * @param texPrimary The texture coordinates of the primary image.\n * @param texSecondary The texture coordinates of an optional secondary image.\n *\n * @private\n */\nexport type SymbolQuad = {\n    tl: Point,\n    tr: Point,\n    bl: Point,\n    br: Point,\n    texPrimary: TextureCoordinate,\n    texSecondary: ?TextureCoordinate,\n    pixelOffsetTL: Point,\n    pixelOffsetBR: Point,\n    writingMode: any | void,\n    glyphOffset: [number, number],\n    sectionIndex: number,\n    isSDF: boolean,\n    minFontScaleX: number,\n    minFontScaleY: number\n};\n\n// If you have a 10px icon that isn't perfectly aligned to the pixel grid it will cover 11 actual\n// pixels. The quad needs to be padded to account for this, otherwise they'll look slightly clipped\n// on one edge in some cases.\nconst border = IMAGE_PADDING;\n\n/**\n * Create the quads used for rendering an icon.\n * @private\n */\nexport function getIconQuads(\n                      shapedIcon: PositionedIcon,\n                      iconRotate: number,\n                      isSDFIcon: boolean,\n                      hasIconTextFit: boolean): Array<SymbolQuad> {\n    const quads = [];\n\n    const image = shapedIcon.imagePrimary;\n    const pixelRatio = image.pixelRatio;\n    const imageWidth = image.paddedRect.w - 2 * border;\n    const imageHeight = image.paddedRect.h - 2 * border;\n\n    const iconWidth = shapedIcon.right - shapedIcon.left;\n    const iconHeight = shapedIcon.bottom - shapedIcon.top;\n\n    const stretchX = image.stretchX || [[0, imageWidth]];\n    const stretchY = image.stretchY || [[0, imageHeight]];\n\n    const reduceRanges = (sum: number, range: [number, number]) => sum + range[1] - range[0];\n    const stretchWidth = stretchX.reduce(reduceRanges, 0);\n    const stretchHeight = stretchY.reduce(reduceRanges, 0);\n    const fixedWidth = imageWidth - stretchWidth;\n    const fixedHeight = imageHeight - stretchHeight;\n\n    let stretchOffsetX = 0;\n    let stretchContentWidth = stretchWidth;\n    let stretchOffsetY = 0;\n    let stretchContentHeight = stretchHeight;\n    let fixedOffsetX = 0;\n    let fixedContentWidth = fixedWidth;\n    let fixedOffsetY = 0;\n    let fixedContentHeight = fixedHeight;\n\n    if (image.content && hasIconTextFit) {\n        const content = image.content;\n        stretchOffsetX = sumWithinRange(stretchX, 0, content[0]);\n        stretchOffsetY = sumWithinRange(stretchY, 0, content[1]);\n        stretchContentWidth = sumWithinRange(stretchX, content[0], content[2]);\n        stretchContentHeight = sumWithinRange(stretchY, content[1], content[3]);\n        fixedOffsetX = content[0] - stretchOffsetX;\n        fixedOffsetY = content[1] - stretchOffsetY;\n        fixedContentWidth = content[2] - content[0] - stretchContentWidth;\n        fixedContentHeight = content[3] - content[1] - stretchContentHeight;\n    }\n\n    const makeBox = (left: Size, top: Size, right: Size, bottom: Size) => {\n\n        const leftEm = getEmOffset(left.stretch - stretchOffsetX, stretchContentWidth, iconWidth, shapedIcon.left);\n        const leftPx = getPxOffset(left.fixed - fixedOffsetX, fixedContentWidth, left.stretch, stretchWidth);\n\n        const topEm = getEmOffset(top.stretch - stretchOffsetY, stretchContentHeight, iconHeight, shapedIcon.top);\n        const topPx = getPxOffset(top.fixed - fixedOffsetY, fixedContentHeight, top.stretch, stretchHeight);\n\n        const rightEm = getEmOffset(right.stretch - stretchOffsetX, stretchContentWidth, iconWidth, shapedIcon.left);\n        const rightPx = getPxOffset(right.fixed - fixedOffsetX, fixedContentWidth, right.stretch, stretchWidth);\n\n        const bottomEm = getEmOffset(bottom.stretch - stretchOffsetY, stretchContentHeight, iconHeight, shapedIcon.top);\n        const bottomPx = getPxOffset(bottom.fixed - fixedOffsetY, fixedContentHeight, bottom.stretch, stretchHeight);\n\n        const tl = new Point(leftEm, topEm);\n        const tr = new Point(rightEm, topEm);\n        const br = new Point(rightEm, bottomEm);\n        const bl = new Point(leftEm, bottomEm);\n        const pixelOffsetTL = new Point(leftPx / pixelRatio, topPx / pixelRatio);\n        const pixelOffsetBR = new Point(rightPx / pixelRatio, bottomPx / pixelRatio);\n\n        const angle = iconRotate * Math.PI / 180;\n\n        if (angle) {\n            const sin = Math.sin(angle),\n                cos = Math.cos(angle),\n                matrix = [cos, -sin, sin, cos];\n\n            tl._matMult(matrix);\n            tr._matMult(matrix);\n            bl._matMult(matrix);\n            br._matMult(matrix);\n        }\n\n        const x1 = left.stretch + left.fixed;\n        const x2 = right.stretch + right.fixed;\n        const y1 = top.stretch + top.fixed;\n        const y2 = bottom.stretch + bottom.fixed;\n\n        const subRect = {\n            x: image.paddedRect.x + border + x1,\n            y: image.paddedRect.y + border + y1,\n            w: x2 - x1,\n            h: y2 - y1\n        };\n\n        const imageSecondary = shapedIcon.imageSecondary;\n        const subRectB = imageSecondary ? {\n            x: imageSecondary.paddedRect.x + border + x1,\n            y: imageSecondary.paddedRect.y + border + y1,\n            w: x2 - x1,\n            h: y2 - y1\n        } : undefined;\n\n        const minFontScaleX = fixedContentWidth / pixelRatio / iconWidth;\n        const minFontScaleY = fixedContentHeight / pixelRatio / iconHeight;\n\n        // Icon quad is padded, so texture coordinates also need to be padded.\n        return {tl, tr, bl, br, texPrimary: subRect, texSecondary: subRectB, writingMode: undefined, glyphOffset: [0, 0], sectionIndex: 0, pixelOffsetTL, pixelOffsetBR, minFontScaleX, minFontScaleY, isSDF: isSDFIcon};\n    };\n\n    if (!hasIconTextFit || (!image.stretchX && !image.stretchY)) {\n        quads.push(makeBox(\n            {fixed: 0, stretch: -1},\n            {fixed: 0, stretch: -1},\n            {fixed: 0, stretch: imageWidth + 1},\n            {fixed: 0, stretch: imageHeight + 1}));\n    } else {\n        const xCuts = stretchZonesToCuts(stretchX, fixedWidth, stretchWidth);\n        const yCuts = stretchZonesToCuts(stretchY, fixedHeight, stretchHeight);\n\n        for (let xi = 0; xi < xCuts.length - 1; xi++) {\n            const x1 = xCuts[xi];\n            const x2 = xCuts[xi + 1];\n            for (let yi = 0; yi < yCuts.length - 1; yi++) {\n                const y1 = yCuts[yi];\n                const y2 = yCuts[yi + 1];\n                quads.push(makeBox(x1, y1, x2, y2));\n            }\n        }\n    }\n\n    return quads;\n}\n\nfunction sumWithinRange(ranges: Array<[number, number]>, min: number, max: number) {\n    let sum = 0;\n    for (const range of ranges) {\n        sum += Math.max(min, Math.min(max, range[1])) - Math.max(min, Math.min(max, range[0]));\n    }\n    return sum;\n}\n\nfunction stretchZonesToCuts(stretchZones: Array<[number, number]>, fixedSize: number, stretchSize: number) {\n    const cuts = [{fixed: -border, stretch: 0}];\n\n    for (const [c1, c2] of stretchZones) {\n        const last = cuts[cuts.length - 1];\n        cuts.push({\n            fixed: c1 - last.stretch,\n            stretch: last.stretch\n        });\n        cuts.push({\n            fixed: c1 - last.stretch,\n            stretch: last.stretch + (c2 - c1)\n        });\n    }\n    cuts.push({\n        fixed: fixedSize + border,\n        stretch: stretchSize\n    });\n    return cuts;\n}\n\nfunction getEmOffset(stretchOffset: number, stretchSize: number, iconSize: number, iconOffset: number) {\n    return stretchOffset / stretchSize * iconSize + iconOffset;\n}\n\nfunction getPxOffset(fixedOffset: number, fixedSize: number, stretchOffset: number, stretchSize: number) {\n    return fixedOffset - fixedSize * stretchOffset / stretchSize;\n}\n\nfunction getRotateOffset(textOffset: [number, number]) {\n    const x = textOffset[0], y = textOffset[1];\n    const product = x * y;\n    if (product > 0) {\n        return [x, -y];\n    } else if (product < 0) {\n        return [-x, y];\n    } else if (x === 0) {\n        return [y, x];\n    } else {\n        return [y, -x];\n    }\n}\n\nfunction getMidlineOffset(shaping: Shaping, lineHeight: number, previousOffset: number, lineIndex: number) {\n    const currentLineHeight = (lineHeight + shaping.positionedLines[lineIndex].lineOffset);\n    if (lineIndex === 0) {\n        return previousOffset + currentLineHeight / 2.0;\n    }\n    const aboveLineHeight = (lineHeight + shaping.positionedLines[lineIndex - 1].lineOffset);\n    return previousOffset + (currentLineHeight + aboveLineHeight) / 2.0;\n}\n\n/**\n * Create the quads used for rendering a text label.\n * @private\n */\nexport function getGlyphQuads(anchor: Anchor,\n                       shaping: Shaping,\n                       textOffset: [number, number],\n                       layer: SymbolStyleLayer,\n                       alongLine: boolean,\n                       feature: Feature,\n                       imageMap: {[_: string]: StyleImage},\n                       allowVerticalPlacement: boolean): Array<SymbolQuad> {\n    const quads = [];\n    if (shaping.positionedLines.length === 0) return quads;\n\n    const textRotate = layer.layout.get('text-rotate').evaluate(feature, {}) * Math.PI / 180;\n    const rotateOffset = getRotateOffset(textOffset);\n\n    let shapingHeight = Math.abs(shaping.top - shaping.bottom);\n    for (const line of shaping.positionedLines) {\n        shapingHeight -= line.lineOffset;\n    }\n    const lineCounts = shaping.positionedLines.length;\n    const lineHeight = shapingHeight / lineCounts;\n    let currentOffset = shaping.top - textOffset[1];\n    for (let lineIndex = 0; lineIndex < lineCounts; ++lineIndex) {\n        const line = shaping.positionedLines[lineIndex];\n        currentOffset = getMidlineOffset(shaping, lineHeight, currentOffset, lineIndex);\n        for (const positionedGlyph of line.positionedGlyphs) {\n            if (!positionedGlyph.rect) continue;\n            const textureRect = positionedGlyph.rect || {};\n\n            // The rects have an additional buffer that is not included in their size.\n            const glyphPadding = 1.0;\n            let rectBuffer = GLYPH_PBF_BORDER + glyphPadding;\n            let isSDF = true;\n            let pixelRatio = 1.0;\n            let lineOffset = 0.0;\n            if (positionedGlyph.imageName) {\n                const image = imageMap[positionedGlyph.imageName];\n                if (!image) continue;\n                if (image.sdf) {\n                    warnOnce(\"SDF images are not supported in formatted text and will be ignored.\");\n                    continue;\n                }\n                isSDF = false;\n                pixelRatio = image.pixelRatio;\n                rectBuffer = IMAGE_PADDING / pixelRatio;\n            }\n\n            const rotateVerticalGlyph = (alongLine || allowVerticalPlacement) && positionedGlyph.vertical;\n            const halfAdvance = positionedGlyph.metrics.advance * positionedGlyph.scale / 2;\n            const metrics = positionedGlyph.metrics;\n            const rect = positionedGlyph.rect;\n            if (rect === null) continue;\n\n            // Align images and scaled glyphs in the middle of a vertical line.\n            if (allowVerticalPlacement && shaping.verticalizable) {\n                // image's advance for vertical shaping is its height, so that we have to take the difference into\n                // account after image glyph is rotated\n                lineOffset = positionedGlyph.imageName ? halfAdvance - positionedGlyph.metrics.width * positionedGlyph.scale / 2.0 : 0;\n            }\n\n            const glyphOffset = alongLine ?\n                [positionedGlyph.x + halfAdvance, positionedGlyph.y] :\n                [0, 0];\n\n            let builtInOffset = [0, 0];\n            let verticalizedLabelOffset = [0, 0];\n            let useRotateOffset = false;\n            if (!alongLine) {\n                if (rotateVerticalGlyph) {\n                // Vertical POI labels that are rotated 90deg CW and whose glyphs must preserve upright orientation\n                // need to be rotated 90deg CCW. After a quad is rotated, it is translated to the original built-in offset.\n                    verticalizedLabelOffset =\n                        [positionedGlyph.x + halfAdvance + rotateOffset[0], positionedGlyph.y + rotateOffset[1] - lineOffset];\n                    useRotateOffset = true;\n                } else {\n                    builtInOffset =  [positionedGlyph.x + halfAdvance + textOffset[0], positionedGlyph.y + textOffset[1] - lineOffset];\n                }\n            }\n\n            const paddedWidth =\n                rect.w * positionedGlyph.scale / (pixelRatio * (positionedGlyph.localGlyph ? SDF_SCALE : 1));\n            const  paddedHeight =\n                rect.h * positionedGlyph.scale / (pixelRatio * (positionedGlyph.localGlyph ? SDF_SCALE : 1));\n\n            let tl, tr, bl, br;\n            if (!rotateVerticalGlyph) {\n                const x1 = (metrics.left - rectBuffer) * positionedGlyph.scale - halfAdvance + builtInOffset[0];\n                const y1 = (-metrics.top - rectBuffer) * positionedGlyph.scale + builtInOffset[1];\n                const x2 = x1 + paddedWidth;\n                const y2 = y1 + paddedHeight;\n\n                tl = new Point(x1, y1);\n                tr = new Point(x2, y1);\n                bl = new Point(x1, y2);\n                br = new Point(x2, y2);\n            } else {\n                // For vertical glyph placement, follow the steps to put the glyph bitmap in right coordinates:\n                // 1. Rotate the glyph by using original glyph coordinates instead of padded coordinates, since the\n                // rotation center and xOffsetCorrection are all based on original glyph's size.\n                // 2. Do x offset correction so that 'tl' is shifted to the same x coordinate before rotation.\n                // 3. Adjust glyph positon for 'tl' by applying vertial padding and horizontal shift, now 'tl' is the\n                // coordinate where we draw the glyph bitmap.\n                // 4. Calculate other three bitmap coordinates.\n\n                // Vertical-supporting glyphs are laid out in 24x24 point boxes (1 square em)\n                // In horizontal orientation, the \"yShift\" is the negative value of the height that\n                // the glyph is above the horizontal midline.\n                // By rotating counter-clockwise around the point at the center of the left\n                // edge of a 24x24 layout box centered below the midline, we align the midline\n                // of the rotated glyphs with the horizontal midline, so the yShift is no longer\n                // necessary, but we also pull the glyph to the left along the x axis.\n                const yShift = (positionedGlyph.y - currentOffset);\n                const center = new Point(-halfAdvance, halfAdvance - yShift);\n                const verticalRotation = -Math.PI / 2;\n                const verticalOffsetCorrection = new Point(...verticalizedLabelOffset);\n                // Relative position before rotation\n                // tl ----- tr\n                //   |     |\n                //   |     |\n                // bl ----- br\n                tl = new Point(-halfAdvance + builtInOffset[0], builtInOffset[1]);\n                tl._rotateAround(verticalRotation, center)._add(verticalOffsetCorrection);\n\n                // Relative position after rotating\n                // tr ----- br\n                //   |     |\n                //   |     |\n                // tl ----- bl\n                // After rotation, glyph lies on the horizontal midline.\n                // Shift back to tl's original x coordinate before rotation by applying 'xOffsetCorrection'.\n                tl.x += -yShift + halfAdvance;\n\n                // Add padding for y coordinate's justification\n                tl.y -= (metrics.left - rectBuffer) * positionedGlyph.scale;\n\n                // Adjust x coordinate according to glyph bitmap's height and the vectical advance\n                const verticalAdvance = positionedGlyph.imageName ? metrics.advance * positionedGlyph.scale :\n                    ONE_EM * positionedGlyph.scale;\n                // Check wether the glyph is generated from server side or locally\n                const chr = String.fromCodePoint(positionedGlyph.glyph);\n                if (isVerticalClosePunctuation(chr)) {\n                    // Place vertical punctuation in right place, pull down 1 pixel's space for close punctuations\n                    tl.x += (-rectBuffer + 1) * positionedGlyph.scale;\n                } else if (isVerticalOpenPunctuation(chr)) {\n                    const xOffset = verticalAdvance - metrics.height * positionedGlyph.scale;\n                    // Place vertical punctuation in right place, pull up 1 pixel's space for open punctuations\n                    tl.x += xOffset + (-rectBuffer - 1) * positionedGlyph.scale;\n                } else if (!positionedGlyph.imageName &&\n                           ((metrics.width + rectBuffer * 2) !== rect.w || metrics.height + rectBuffer * 2 !== rect.h)) {\n                    // Locally generated glyphs' bitmap do not have exact 'rectBuffer' padded around the glyphs,\n                    // but the original tl do have distance of rectBuffer padded to the top of the glyph.\n                    const perfectPaddedHeight = (metrics.height + rectBuffer * 2) * positionedGlyph.scale;\n                    const delta = verticalAdvance - perfectPaddedHeight;\n                    tl.x += delta / 2;\n                } else {\n                    // Place the glyph bitmap right in the center of the 24x24 point boxes\n                    const delta = verticalAdvance - paddedHeight;\n                    tl.x += delta / 2;\n                }\n                // Calculate other three points\n                tr = new Point(tl.x, tl.y - paddedWidth);\n                bl = new Point(tl.x + paddedHeight, tl.y);\n                br = new Point(tl.x + paddedHeight, tl.y - paddedWidth);\n            }\n\n            if (textRotate) {\n                let center;\n                if (!alongLine) {\n                    if (useRotateOffset) {\n                        center = new Point(rotateOffset[0], rotateOffset[1]);\n                    } else {\n                        center = new Point(textOffset[0], textOffset[1]);\n                    }\n                } else {\n                    center = new Point(0, 0);\n                }\n                tl._rotateAround(textRotate, center);\n                tr._rotateAround(textRotate, center);\n                bl._rotateAround(textRotate, center);\n                br._rotateAround(textRotate, center);\n            }\n\n            const pixelOffsetTL = new Point(0, 0);\n            const pixelOffsetBR = new Point(0, 0);\n            const minFontScaleX = 0;\n            const minFontScaleY = 0;\n            quads.push({tl, tr, bl, br, texPrimary: textureRect, texSecondary: undefined, writingMode: shaping.writingMode, glyphOffset, sectionIndex: positionedGlyph.sectionIndex, isSDF, pixelOffsetTL, pixelOffsetBR, minFontScaleX, minFontScaleY});\n        }\n    }\n\n    return quads;\n}\n","// @flow\n\nimport Queue from 'tinyqueue';\n\nimport Point from '@mapbox/point-geometry';\nimport {distToSegmentSquared} from './intersection_tests.js';\n\n/**\n * Finds an approximation of a polygon's Pole Of Inaccessibility https://en.wikipedia.org/wiki/Pole_of_inaccessibility\n * This is a copy of http://github.com/mapbox/polylabel adapted to use Points\n *\n * @param polygonRings first item in array is the outer ring followed optionally by the list of holes, should be an element of the result of util/classify_rings\n * @param precision Specified in input coordinate units. If 0 returns after first run, if > 0 repeatedly narrows the search space until the radius of the area searched for the best pole is less than precision\n * @param debug Print some statistics to the console during execution\n * @returns Pole of Inaccessibility.\n * @private\n */\nexport default function (polygonRings: Array<Array<Point>>, precision?: number = 1, debug?: boolean = false): Point {\n    // find the bounding box of the outer ring\n    let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n    const outerRing = polygonRings[0];\n    for (let i = 0; i < outerRing.length; i++) {\n        const p = outerRing[i];\n        if (!i || p.x < minX) minX = p.x;\n        if (!i || p.y < minY) minY = p.y;\n        if (!i || p.x > maxX) maxX = p.x;\n        if (!i || p.y > maxY) maxY = p.y;\n    }\n\n    const width = maxX - minX;\n    const height = maxY - minY;\n    const cellSize = Math.min(width, height);\n    let h = cellSize / 2;\n\n    // a priority queue of cells in order of their \"potential\" (max distance to polygon)\n    const cellQueue = new Queue([], compareMax);\n\n    if (cellSize === 0) return new Point(minX, minY);\n\n    // cover polygon with initial cells\n    for (let x = minX; x < maxX; x += cellSize) {\n        for (let y = minY; y < maxY; y += cellSize) {\n            cellQueue.push(new Cell(x + h, y + h, h, polygonRings));\n        }\n    }\n\n    // take centroid as the first best guess\n    let bestCell = getCentroidCell(polygonRings);\n    let numProbes = cellQueue.length;\n\n    while (cellQueue.length) {\n        // pick the most promising cell from the queue\n        const cell = cellQueue.pop();\n\n        // update the best cell if we found a better one\n        if (cell.d > bestCell.d || !bestCell.d) {\n            bestCell = cell;\n            if (debug) console.log('found best %d after %d probes', Math.round(1e4 * cell.d) / 1e4, numProbes);\n        }\n\n        // do not drill down further if there's no chance of a better solution\n        if (cell.max - bestCell.d <= precision) continue;\n\n        // split the cell into four cells\n        h = cell.h / 2;\n        cellQueue.push(new Cell(cell.p.x - h, cell.p.y - h, h, polygonRings));\n        cellQueue.push(new Cell(cell.p.x + h, cell.p.y - h, h, polygonRings));\n        cellQueue.push(new Cell(cell.p.x - h, cell.p.y + h, h, polygonRings));\n        cellQueue.push(new Cell(cell.p.x + h, cell.p.y + h, h, polygonRings));\n        numProbes += 4;\n    }\n\n    if (debug) {\n        console.log(`num probes: ${numProbes}`);\n        console.log(`best distance: ${bestCell.d}`);\n    }\n\n    return bestCell.p;\n}\n\nfunction compareMax(a: Cell, b: Cell) {\n    return b.max - a.max;\n}\n\nclass Cell {\n    p: Point;\n    h: number;\n    d: number;\n    max: number;\n\n    constructor(x: number, y: number, h: number, polygon: Array<Array<Point>>) {\n        this.p = new Point(x, y);\n        this.h = h; // half the cell size\n        this.d = pointToPolygonDist(this.p, polygon); // distance from cell center to polygon\n        this.max = this.d + this.h * Math.SQRT2; // max distance to polygon within a cell\n    }\n}\n\n// signed distance from point to polygon outline (negative if point is outside)\nfunction pointToPolygonDist(p: Point, polygon: Array<Array<Point>>) {\n    let inside = false;\n    let minDistSq = Infinity;\n\n    for (let k = 0; k < polygon.length; k++) {\n        const ring = polygon[k];\n\n        for (let i = 0, len = ring.length, j = len - 1; i < len; j = i++) {\n            const a = ring[i];\n            const b = ring[j];\n\n            if ((a.y > p.y !== b.y > p.y) &&\n                (p.x < (b.x - a.x) * (p.y - a.y) / (b.y - a.y) + a.x)) inside = !inside;\n\n            minDistSq = Math.min(minDistSq, distToSegmentSquared(p, a, b));\n        }\n    }\n\n    return (inside ? 1 : -1) * Math.sqrt(minDistSq);\n}\n\n// get polygon centroid\nfunction getCentroidCell(polygon: Array<Array<Point>>) {\n    let area = 0;\n    let x = 0;\n    let y = 0;\n    const points = polygon[0];\n    for (let i = 0, len = points.length, j = len - 1; i < len; j = i++) {\n        const a = points[i];\n        const b = points[j];\n        const f = a.x * b.y - b.x * a.y;\n        x += (a.x + b.x) * f;\n        y += (a.y + b.y) * f;\n        area += f * 3;\n    }\n    return new Cell(x / area, y / area, 0, polygon);\n}\n","// @flow\n\nimport Anchor from './anchor.js';\n\nimport {getAnchors, getCenterAnchor} from './get_anchors.js';\nimport clipLine from './clip_line.js';\nimport {shapeText, shapeIcon, WritingMode, fitIconToText} from './shaping.js';\nimport {getGlyphQuads, getIconQuads} from './quads.js';\nimport {warnOnce, degToRad} from '../util/util.js';\nimport {\n    allowsVerticalWritingMode,\n    allowsLetterSpacing\n} from '../util/script_detection.js';\nimport findPoleOfInaccessibility from '../util/find_pole_of_inaccessibility.js';\nimport classifyRings from '../util/classify_rings.js';\nimport EXTENT from '../style-spec/data/extent.js';\nimport EvaluationParameters from '../style/evaluation_parameters.js';\nimport {SIZE_PACK_FACTOR} from './symbol_size.js';\nimport ONE_EM from './one_em.js';\nimport Point from '@mapbox/point-geometry';\nimport murmur3 from 'murmurhash-js';\n\nimport type SymbolBucket from '../data/bucket/symbol_bucket.js';\nimport type {CanonicalTileID} from '../source/tile_id.js';\nimport type {Shaping, PositionedIcon, TextJustify} from './shaping.js';\nimport type {CollisionBoxArray} from '../data/array_types.js';\nimport type {SymbolFeature} from '../data/bucket/symbol_bucket.js';\nimport type {StyleImage} from '../style/style_image.js';\nimport type {StyleGlyph} from '../style/style_glyph.js';\nimport type SymbolStyleLayer from '../style/style_layer/symbol_style_layer.js';\nimport type {ImagePosition} from '../render/image_atlas.js';\nimport type {GlyphPositions} from '../render/glyph_atlas.js';\nimport type {PossiblyEvaluatedPropertyValue} from '../style/properties.js';\nimport type Projection from '../geo/projection/projection.js';\nimport type {Vec3} from 'gl-matrix';\n\n// The symbol layout process needs `text-size` evaluated at up to five different zoom levels, and\n// `icon-size` at up to three:\n//\n//   1. `text-size` at the zoom level of the bucket. Used to calculate a per-feature size for source `text-size`\n//       expressions, and to calculate the box dimensions for icon-text-fit.\n//   2. `icon-size` at the zoom level of the bucket. Used to calculate a per-feature size for source `icon-size`\n//       expressions.\n//   3. `text-size` and `icon-size` at the zoom level of the bucket, plus one. Used to calculate collision boxes.\n//   4. `text-size` at zoom level 18. Used for something line-symbol-placement-related.\n//   5.  For composite `*-size` expressions: two zoom levels of curve stops that \"cover\" the zoom level of the\n//       bucket. These go into a vertex buffer and are used by the shader to interpolate the size at render time.\n//\n// (1) and (2) are stored in `bucket.layers[0].layout`. The remainder are below.\n//\ntype Sizes = {\n    layoutTextSize: PossiblyEvaluatedPropertyValue<number>, // (3)\n    layoutIconSize: PossiblyEvaluatedPropertyValue<number>, // (3)\n    textMaxSize: PossiblyEvaluatedPropertyValue<number>,    // (4)\n    compositeTextSizes: [PossiblyEvaluatedPropertyValue<number>, PossiblyEvaluatedPropertyValue<number>], // (5)\n    compositeIconSizes: [PossiblyEvaluatedPropertyValue<number>, PossiblyEvaluatedPropertyValue<number>], // (5)\n};\n\nexport type TextAnchor = 'center' | 'left' | 'right' | 'top' | 'bottom' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n\n// The radial offset is to the edge of the text box\n// In the horizontal direction, the edge of the text box is where glyphs start\n// But in the vertical direction, the glyphs appear to \"start\" at the baseline\n// We don't actually load baseline data, but we assume an offset of ONE_EM - 17\n// (see \"yOffset\" in shaping.js)\nconst baselineOffset = 7;\nconst INVALID_TEXT_OFFSET = Number.POSITIVE_INFINITY;\nconst sqrt2 = Math.sqrt(2);\n\nexport const SymbolBucketConstants = {\n    // this constant is based on the size of StructArray indexes used in a symbol\n    // bucket--namely, glyphOffsetArrayStart\n    // eg the max valid UInt16 is 65,535\n    // See https://github.com/mapbox/mapbox-gl-js/issues/2907 for motivation\n    // lineStartIndex and textBoxStartIndex could potentially be concerns\n    // but we expect there to be many fewer boxes/lines than glyphs\n    MAX_GLYPHS: 65535\n};\n\nexport function evaluateVariableOffset(anchor: TextAnchor, [offsetX, offsetY]: [number, number]): [number, number] {\n    let x = 0, y = 0;\n\n    if (offsetY === INVALID_TEXT_OFFSET) { // radial offset\n        if (offsetX < 0) offsetX = 0; // Ignore negative offset.\n        // solve for r where r^2 + r^2 = offsetX^2\n        const hypotenuse = offsetX / sqrt2;\n        switch (anchor) {\n        case 'top-right':\n        case 'top-left':\n            y = hypotenuse - baselineOffset;\n            break;\n        case 'bottom-right':\n        case 'bottom-left':\n            y = -hypotenuse + baselineOffset;\n            break;\n        case 'bottom':\n            y = -offsetX + baselineOffset;\n            break;\n        case 'top':\n            y = offsetX - baselineOffset;\n            break;\n        }\n\n        switch (anchor) {\n        case 'top-right':\n        case 'bottom-right':\n            x = -hypotenuse;\n            break;\n        case 'top-left':\n        case 'bottom-left':\n            x = hypotenuse;\n            break;\n        case 'left':\n            x = offsetX;\n            break;\n        case 'right':\n            x = -offsetX;\n            break;\n        }\n\n    } else { // text offset\n        // Use absolute offset values.\n        offsetX = Math.abs(offsetX);\n        offsetY = Math.abs(offsetY);\n\n        switch (anchor) {\n        case 'top-right':\n        case 'top-left':\n        case 'top':\n            y = offsetY - baselineOffset;\n            break;\n        case 'bottom-right':\n        case 'bottom-left':\n        case 'bottom':\n            y = -offsetY + baselineOffset;\n            break;\n        }\n\n        switch (anchor) {\n        case 'top-right':\n        case 'bottom-right':\n        case 'right':\n            x = -offsetX;\n            break;\n        case 'top-left':\n        case 'bottom-left':\n        case 'left':\n            x = offsetX;\n            break;\n        }\n    }\n\n    return [x, y];\n}\n\nexport function performSymbolLayout(bucket: SymbolBucket,\n                             glyphMap: {[_: string]: {glyphs: {[_: number]: ?StyleGlyph}, ascender?: number, descender?: number}},\n                             glyphPositions: GlyphPositions,\n                             imageMap: {[_: string]: StyleImage},\n                             imagePositions: {[_: string]: ImagePosition},\n                             showCollisionBoxes: boolean,\n                             availableImages: Array<string>,\n                             canonical: CanonicalTileID,\n                             tileZoom: number,\n                             projection: Projection,\n                             brightness: ?number) {\n    bucket.createArrays();\n\n    const tileSize = 512 * bucket.overscaling;\n    bucket.tilePixelRatio = EXTENT / tileSize;\n    bucket.compareText = {};\n    bucket.iconsNeedLinear = false;\n\n    const layout = bucket.layers[0].layout;\n    const unevaluatedLayoutValues = bucket.layers[0]._unevaluatedLayout._values;\n\n    const sizes = {};\n\n    if (bucket.textSizeData.kind === 'composite') {\n        const {minZoom, maxZoom} = bucket.textSizeData;\n        sizes.compositeTextSizes = [\n            unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(minZoom), canonical),\n            unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(maxZoom), canonical)\n        ];\n    }\n\n    if (bucket.iconSizeData.kind === 'composite') {\n        const {minZoom, maxZoom} = bucket.iconSizeData;\n        sizes.compositeIconSizes = [\n            unevaluatedLayoutValues['icon-size'].possiblyEvaluate(new EvaluationParameters(minZoom), canonical),\n            unevaluatedLayoutValues['icon-size'].possiblyEvaluate(new EvaluationParameters(maxZoom), canonical)\n        ];\n    }\n\n    sizes.layoutTextSize = unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(tileZoom + 1), canonical);\n    sizes.layoutIconSize = unevaluatedLayoutValues['icon-size'].possiblyEvaluate(new EvaluationParameters(tileZoom + 1), canonical);\n    sizes.textMaxSize = unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(18), canonical);\n\n    const textAlongLine = layout.get('text-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point';\n    const textSize = layout.get('text-size');\n\n    let hasAnySecondaryIcon = false;\n    for (const feature of bucket.features) {\n        if (feature.icon && feature.icon.nameSecondary) {\n            hasAnySecondaryIcon = true;\n            break;\n        }\n    }\n\n    for (const feature of bucket.features) {\n        const fontstack = layout.get('text-font').evaluate(feature, {}, canonical).join(',');\n        const layoutTextSizeThisZoom = textSize.evaluate(feature, {}, canonical);\n        const layoutTextSize = sizes.layoutTextSize.evaluate(feature, {}, canonical);\n        const layoutIconSize = sizes.layoutIconSize.evaluate(feature, {}, canonical);\n\n        const shapedTextOrientations = {\n            horizontal: {},\n            vertical: undefined\n        };\n        const text = feature.text;\n        let textOffset: [number, number] = [0, 0];\n        if (text) {\n            const unformattedText = text.toString();\n            const spacing = layout.get('text-letter-spacing').evaluate(feature, {}, canonical) * ONE_EM;\n            const lineHeight = layout.get('text-line-height').evaluate(feature, {}, canonical) * ONE_EM;\n            const spacingIfAllowed = allowsLetterSpacing(unformattedText) ? spacing : 0;\n\n            const textAnchor = layout.get('text-anchor').evaluate(feature, {}, canonical);\n            const variableTextAnchor = layout.get('text-variable-anchor');\n\n            if (!variableTextAnchor) {\n                const radialOffset = layout.get('text-radial-offset').evaluate(feature, {}, canonical);\n                // Layers with variable anchors use the `text-radial-offset` property and the [x, y] offset vector\n                // is calculated at placement time instead of layout time\n                if (radialOffset) {\n                    // The style spec says don't use `text-offset` and `text-radial-offset` together\n                    // but doesn't actually specify what happens if you use both. We go with the radial offset.\n                    textOffset = evaluateVariableOffset(textAnchor, [radialOffset * ONE_EM, INVALID_TEXT_OFFSET]);\n                } else {\n                    textOffset = (layout.get('text-offset').evaluate(feature, {}, canonical).map(t => t * ONE_EM): any);\n                }\n            }\n\n            let textJustify = textAlongLine ?\n                \"center\" :\n                layout.get('text-justify').evaluate(feature, {}, canonical);\n\n            const isPointPlacement = layout.get('symbol-placement') === 'point';\n            const maxWidth = isPointPlacement ?\n                layout.get('text-max-width').evaluate(feature, {}, canonical) * ONE_EM :\n                Infinity;\n\n            const addVerticalShapingIfNeeded = (textJustify: TextJustify) => {\n                if (bucket.allowVerticalPlacement && allowsVerticalWritingMode(unformattedText)) {\n                    // Vertical POI label placement is meant to be used for scripts that support vertical\n                    // writing mode, thus, default left justification is used. If Latin\n                    // scripts would need to be supported, this should take into account other justifications.\n                    shapedTextOrientations.vertical = shapeText(text, glyphMap, glyphPositions, imagePositions, fontstack, maxWidth, lineHeight, textAnchor,\n                                                                textJustify, spacingIfAllowed, textOffset, WritingMode.vertical, true, layoutTextSize, layoutTextSizeThisZoom);\n                }\n            };\n\n            // If this layer uses text-variable-anchor, generate shapings for all justification possibilities.\n            if (!textAlongLine && variableTextAnchor) {\n                const justifications = textJustify === \"auto\" ?\n                    variableTextAnchor.map(a => getAnchorJustification(a)) :\n                    [textJustify];\n\n                let singleLine = false;\n                for (let i = 0; i < justifications.length; i++) {\n                    const justification: TextJustify = justifications[i];\n                    if (shapedTextOrientations.horizontal[justification]) continue;\n                    if (singleLine) {\n                        // If the shaping for the first justification was only a single line, we\n                        // can re-use it for the other justifications\n                        shapedTextOrientations.horizontal[justification] = shapedTextOrientations.horizontal[0];\n                    } else {\n                        // If using text-variable-anchor for the layer, we use a center anchor for all shapings and apply\n                        // the offsets for the anchor in the placement step.\n                        const shaping = shapeText(text, glyphMap, glyphPositions, imagePositions, fontstack, maxWidth, lineHeight, 'center',\n                                                  justification, spacingIfAllowed, textOffset, WritingMode.horizontal, false, layoutTextSize, layoutTextSizeThisZoom);\n                        if (shaping) {\n                            shapedTextOrientations.horizontal[justification] = shaping;\n                            singleLine = shaping.positionedLines.length === 1;\n                        }\n                    }\n                }\n\n                addVerticalShapingIfNeeded('left');\n            } else {\n                if (textJustify === \"auto\") {\n                    textJustify = getAnchorJustification(textAnchor);\n                }\n                // Add horizontal shaping for all point labels and line labels that need horizontal writing mode.\n                if (isPointPlacement || ((layout.get(\"text-writing-mode\").indexOf('horizontal') >= 0) || !allowsVerticalWritingMode(unformattedText))) {\n                    const shaping = shapeText(text, glyphMap, glyphPositions, imagePositions, fontstack, maxWidth, lineHeight, textAnchor, textJustify, spacingIfAllowed,\n                                            textOffset, WritingMode.horizontal, false, layoutTextSize, layoutTextSizeThisZoom);\n                    if (shaping) shapedTextOrientations.horizontal[textJustify] = shaping;\n                }\n\n                // Vertical point label (if allowVerticalPlacement is enabled).\n                addVerticalShapingIfNeeded(isPointPlacement ? 'left' : textJustify);\n            }\n        }\n\n        let shapedIcon;\n        let isSDFIcon = false;\n        if (feature.icon && feature.icon.namePrimary) {\n            const image = imageMap[feature.icon.namePrimary];\n            if (image) {\n                shapedIcon = shapeIcon(\n                    imagePositions[feature.icon.namePrimary],\n                    feature.icon.nameSecondary ? imagePositions[feature.icon.nameSecondary] : undefined,\n                    layout.get('icon-offset').evaluate(feature, {}, canonical),\n                    layout.get('icon-anchor').evaluate(feature, {}, canonical));\n                isSDFIcon = image.sdf;\n                if (bucket.sdfIcons === undefined) {\n                    bucket.sdfIcons = image.sdf;\n                } else if (bucket.sdfIcons !== image.sdf) {\n                    warnOnce('Style sheet warning: Cannot mix SDF and non-SDF icons in one buffer');\n                }\n                if (image.pixelRatio !== bucket.pixelRatio) {\n                    bucket.iconsNeedLinear = true;\n                } else if (layout.get('icon-rotate').constantOr(1) !== 0) {\n                    bucket.iconsNeedLinear = true;\n                }\n            }\n        }\n\n        const shapedText = getDefaultHorizontalShaping(shapedTextOrientations.horizontal) || shapedTextOrientations.vertical;\n        if (!bucket.iconsInText) {\n            bucket.iconsInText = shapedText ? shapedText.iconsInText : false;\n        }\n        if (shapedText || shapedIcon) {\n            addFeature(bucket, feature, shapedTextOrientations, shapedIcon, imageMap, sizes, layoutTextSize, layoutIconSize, textOffset, isSDFIcon, availableImages, canonical, projection, brightness, hasAnySecondaryIcon);\n        }\n    }\n\n    if (showCollisionBoxes) {\n        bucket.generateCollisionDebugBuffers(tileZoom, bucket.collisionBoxArray);\n    }\n}\n\n// Choose the justification that matches the direction of the TextAnchor\nexport function getAnchorJustification(anchor: TextAnchor): TextJustify  {\n    switch (anchor) {\n    case 'right':\n    case 'top-right':\n    case 'bottom-right':\n        return 'right';\n    case 'left':\n    case 'top-left':\n    case 'bottom-left':\n        return 'left';\n    }\n    return 'center';\n}\n\n/**\n * for \"very\" overscaled tiles (overscaleFactor > 2) on high zoom levels (z > 18)\n * we use the tile pixel ratio from the previous zoom level and clamp it to 1\n * in order to thin out labels density and save memory and CPU .\n * @private\n */\nfunction tilePixelRatioForSymbolSpacing(overscaleFactor: number, overscaledZ: number) {\n    if (overscaledZ > 18 && overscaleFactor > 2) {\n        overscaleFactor >>= 1;\n    }\n    const tilePixelRatio = EXTENT / (512 * overscaleFactor);\n    return Math.max(tilePixelRatio, 1);\n}\n\n/**\n * Given a feature and its shaped text and icon data, add a 'symbol\n * instance' for each _possible_ placement of the symbol feature.\n * (At render time Placement.updateBucketOpacities() selects which of these\n * instances to show or hide based on collisions with symbols in other layers.)\n * @private\n */\nfunction addFeature(bucket: SymbolBucket,\n                    feature: SymbolFeature,\n                    shapedTextOrientations: any,\n                    shapedIcon: PositionedIcon | void,\n                    imageMap: {[_: string]: StyleImage},\n                    sizes: Sizes,\n                    layoutTextSize: number,\n                    layoutIconSize: number,\n                    textOffset: [number, number],\n                    isSDFIcon: boolean,\n                    availableImages: Array<string>,\n                    canonical: CanonicalTileID,\n                    projection: Projection,\n                    brightness: ?number,\n                    hasAnySecondaryIcon: boolean) {\n    // To reduce the number of labels that jump around when zooming we need\n    // to use a text-size value that is the same for all zoom levels.\n    // bucket calculates text-size at a high zoom level so that all tiles can\n    // use the same value when calculating anchor positions.\n    let textMaxSize = sizes.textMaxSize.evaluate(feature, {}, canonical);\n    if (textMaxSize === undefined) {\n        textMaxSize = layoutTextSize;\n    }\n    const layout = bucket.layers[0].layout;\n    const iconOffset = layout.get('icon-offset').evaluate(feature, {}, canonical);\n    const defaultShaping = getDefaultHorizontalShaping(shapedTextOrientations.horizontal) || shapedTextOrientations.vertical;\n    const isGlobe = projection.name === 'globe';\n\n    const glyphSize = ONE_EM,\n        fontScale = layoutTextSize / glyphSize,\n        textMaxBoxScale = bucket.tilePixelRatio * textMaxSize / glyphSize,\n        iconBoxScale = bucket.tilePixelRatio * layoutIconSize,\n        symbolMinDistance = tilePixelRatioForSymbolSpacing(bucket.overscaling, bucket.zoom) * layout.get('symbol-spacing'),\n        textPadding = layout.get('text-padding') * bucket.tilePixelRatio,\n        iconPadding = layout.get('icon-padding') * bucket.tilePixelRatio,\n        textMaxAngle = degToRad(layout.get('text-max-angle')),\n        textAlongLine = layout.get('text-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point',\n        iconAlongLine = layout.get('icon-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point',\n        symbolPlacement = layout.get('symbol-placement'),\n        textRepeatDistance = symbolMinDistance / 2;\n\n    const iconTextFit = layout.get('icon-text-fit').evaluate(feature, {}, canonical);\n    const iconTextFitPadding = layout.get('icon-text-fit-padding').evaluate(feature, {}, canonical);\n    const hasIconTextFit = iconTextFit !== 'none';\n    if (bucket.hasAnyIconTextFit === false && hasIconTextFit) {\n        bucket.hasAnyIconTextFit = true;\n    }\n    let verticallyShapedIcon;\n\n    // Adjust shaped icon size when icon-text-fit is used.\n    if (shapedIcon && hasIconTextFit) {\n        if (bucket.allowVerticalPlacement && shapedTextOrientations.vertical) {\n            verticallyShapedIcon = fitIconToText(shapedIcon, shapedTextOrientations.vertical, iconTextFit,\n                iconTextFitPadding, iconOffset, fontScale);\n        }\n        if (defaultShaping) {\n            shapedIcon = fitIconToText(shapedIcon, defaultShaping, iconTextFit,\n                                       iconTextFitPadding, iconOffset, fontScale);\n        }\n    }\n\n    const addSymbolAtAnchor = (line: Array<Point>, anchor: Anchor, canonicalId: CanonicalTileID) => {\n        if (anchor.x < 0 || anchor.x >= EXTENT || anchor.y < 0 || anchor.y >= EXTENT) {\n            // Symbol layers are drawn across tile boundaries, We filter out symbols\n            // outside our tile boundaries (which may be included in vector tile buffers)\n            // to prevent double-drawing symbols.\n            return;\n        }\n\n        let globe: ?{anchor: Anchor, up: Vec3} = null;\n        if (isGlobe) {\n            const {x, y, z} = projection.projectTilePoint(anchor.x, anchor.y, canonicalId);\n            globe = {\n                anchor: new Anchor(x, y, z, 0, undefined),\n                up: projection.upVector(canonicalId, anchor.x, anchor.y)\n            };\n        }\n\n        addSymbol(bucket, anchor, globe, line, shapedTextOrientations, shapedIcon, imageMap, verticallyShapedIcon, bucket.layers[0],\n            bucket.collisionBoxArray, feature.index, feature.sourceLayerIndex,\n            bucket.index, textPadding, textAlongLine, textOffset,\n            iconBoxScale, iconPadding, iconAlongLine, iconOffset,\n            feature, sizes, isSDFIcon, availableImages, canonical, brightness, hasAnySecondaryIcon);\n    };\n\n    if (symbolPlacement === 'line') {\n        for (const line of clipLine(feature.geometry, 0, 0, EXTENT, EXTENT)) {\n            const anchors = getAnchors(\n                line,\n                symbolMinDistance,\n                textMaxAngle,\n                shapedTextOrientations.vertical || defaultShaping,\n                shapedIcon,\n                glyphSize,\n                textMaxBoxScale,\n                bucket.overscaling,\n                EXTENT\n            );\n            for (const anchor of anchors) {\n                const shapedText = defaultShaping;\n                if (!shapedText || !anchorIsTooClose(bucket, shapedText.text, textRepeatDistance, anchor)) {\n                    addSymbolAtAnchor(line, anchor, canonical);\n                }\n            }\n        }\n    } else if (symbolPlacement === 'line-center') {\n        // No clipping, multiple lines per feature are allowed\n        // \"lines\" with only one point are ignored as in clipLines\n        for (const line of feature.geometry) {\n            if (line.length > 1) {\n                const anchor = getCenterAnchor(\n                    line,\n                    textMaxAngle,\n                    shapedTextOrientations.vertical || defaultShaping,\n                    shapedIcon,\n                    glyphSize,\n                    textMaxBoxScale);\n                if (anchor) {\n                    addSymbolAtAnchor(line, anchor, canonical);\n                }\n            }\n        }\n    } else if (feature.type === 'Polygon') {\n        for (const polygon of classifyRings(feature.geometry, 0)) {\n            // 16 here represents 2 pixels\n            const poi = findPoleOfInaccessibility(polygon, 16);\n            addSymbolAtAnchor(polygon[0], new Anchor(poi.x, poi.y, 0, 0, undefined), canonical);\n        }\n    } else if (feature.type === 'LineString') {\n        // https://github.com/mapbox/mapbox-gl-js/issues/3808\n        for (const line of feature.geometry) {\n            addSymbolAtAnchor(line, new Anchor(line[0].x, line[0].y, 0, 0, undefined), canonical);\n        }\n    } else if (feature.type === 'Point') {\n        for (const points of feature.geometry) {\n            for (const point of points) {\n                addSymbolAtAnchor([point], new Anchor(point.x, point.y, 0, 0, undefined), canonical);\n            }\n        }\n    }\n}\n\nconst MAX_GLYPH_ICON_SIZE = 255;\nconst MAX_PACKED_SIZE = MAX_GLYPH_ICON_SIZE * SIZE_PACK_FACTOR;\nexport {MAX_PACKED_SIZE};\n\nfunction addTextVertices(bucket: SymbolBucket,\n                         globe: ?{ anchor: Anchor, up: Vec3 },\n                         tileAnchor: Anchor,\n                         shapedText: Shaping,\n                         imageMap: {[_: string]: StyleImage},\n                         layer: SymbolStyleLayer,\n                         textAlongLine: boolean,\n                         feature: SymbolFeature,\n                         textOffset: [number, number],\n                         lineArray: {lineStartIndex: number, lineLength: number},\n                         writingMode: number,\n                         placementTypes: Array<'vertical' | 'center' | 'left' | 'right'>,\n                         placedTextSymbolIndices: {[_: string]: number},\n                         placedIconIndex: number,\n                         sizes: Sizes,\n                         availableImages: Array<string>,\n                         canonical: CanonicalTileID,\n                         brightness: ?number) {\n    const glyphQuads = getGlyphQuads(tileAnchor, shapedText, textOffset,\n                            layer, textAlongLine, feature, imageMap, bucket.allowVerticalPlacement);\n\n    const sizeData = bucket.textSizeData;\n    let textSizeData = null;\n\n    if (sizeData.kind === 'source') {\n        textSizeData = [\n            SIZE_PACK_FACTOR * layer.layout.get('text-size').evaluate(feature, {}, canonical)\n        ];\n        if (textSizeData[0] > MAX_PACKED_SIZE) {\n            warnOnce(`${bucket.layerIds[0]}: Value for \"text-size\" is >= ${MAX_GLYPH_ICON_SIZE}. Reduce your \"text-size\".`);\n        }\n    } else if (sizeData.kind === 'composite') {\n        textSizeData = [\n            SIZE_PACK_FACTOR * sizes.compositeTextSizes[0].evaluate(feature, {}, canonical),\n            SIZE_PACK_FACTOR * sizes.compositeTextSizes[1].evaluate(feature, {}, canonical)\n        ];\n        if (textSizeData[0] > MAX_PACKED_SIZE || textSizeData[1] > MAX_PACKED_SIZE) {\n            warnOnce(`${bucket.layerIds[0]}: Value for \"text-size\" is >= ${MAX_GLYPH_ICON_SIZE}. Reduce your \"text-size\".`);\n        }\n    }\n\n    bucket.addSymbols(\n        bucket.text,\n        glyphQuads,\n        textSizeData,\n        textOffset,\n        textAlongLine,\n        feature,\n        writingMode,\n        globe,\n        tileAnchor,\n        lineArray.lineStartIndex,\n        lineArray.lineLength,\n        placedIconIndex,\n        availableImages,\n        canonical,\n        brightness,\n        false);\n\n    // The placedSymbolArray is used at render time in drawTileSymbols\n    // These indices allow access to the array at collision detection time\n    for (const placementType of placementTypes) {\n        placedTextSymbolIndices[placementType] = bucket.text.placedSymbolArray.length - 1;\n    }\n\n    return glyphQuads.length * 4;\n}\n\nfunction getDefaultHorizontalShaping(horizontalShaping: {[_: TextJustify]: Shaping}): Shaping | null {\n    // We don't care which shaping we get because this is used for collision purposes\n    // and all the justifications have the same collision box\n    for (const justification: any in horizontalShaping) {\n        return horizontalShaping[justification];\n    }\n    return null;\n}\n\nexport function evaluateBoxCollisionFeature(collisionBoxArray: CollisionBoxArray,\n                                     projectedAnchor: Anchor,\n                                     tileAnchor: Anchor,\n                                     featureIndex: number,\n                                     sourceLayerIndex: number,\n                                     bucketIndex: number,\n                                     shaped: Object,\n                                     padding: number,\n                                     rotate: number,\n                                     textOffset: ?[number, number]): number {\n    let y1 = shaped.top;\n    let y2 = shaped.bottom;\n    let x1 = shaped.left;\n    let x2 = shaped.right;\n\n    const collisionPadding = shaped.collisionPadding;\n    if (collisionPadding) {\n        x1 -= collisionPadding[0];\n        y1 -= collisionPadding[1];\n        x2 += collisionPadding[2];\n        y2 += collisionPadding[3];\n    }\n\n    if (rotate) {\n        // Account for *-rotate in point collision boxes\n        // See https://github.com/mapbox/mapbox-gl-js/issues/6075\n        // Doesn't account for icon-text-fit\n\n        const tl = new Point(x1, y1);\n        const tr = new Point(x2, y1);\n        const bl = new Point(x1, y2);\n        const br = new Point(x2, y2);\n\n        const rotateRadians = degToRad(rotate);\n        let rotateCenter = new Point(0, 0);\n\n        if (textOffset) {\n            rotateCenter = new Point(textOffset[0], textOffset[1]);\n        }\n\n        tl._rotateAround(rotateRadians, rotateCenter);\n        tr._rotateAround(rotateRadians, rotateCenter);\n        bl._rotateAround(rotateRadians, rotateCenter);\n        br._rotateAround(rotateRadians, rotateCenter);\n\n        // Collision features require an \"on-axis\" geometry,\n        // so take the envelope of the rotated geometry\n        // (may be quite large for wide labels rotated 45 degrees)\n        x1 = Math.min(tl.x, tr.x, bl.x, br.x);\n        x2 = Math.max(tl.x, tr.x, bl.x, br.x);\n        y1 = Math.min(tl.y, tr.y, bl.y, br.y);\n        y2 = Math.max(tl.y, tr.y, bl.y, br.y);\n    }\n\n    collisionBoxArray.emplaceBack(projectedAnchor.x, projectedAnchor.y, projectedAnchor.z, tileAnchor.x, tileAnchor.y, x1, y1, x2, y2, padding, featureIndex, sourceLayerIndex, bucketIndex);\n\n    return collisionBoxArray.length - 1;\n}\n\nexport function evaluateCircleCollisionFeature(shaped: Object): number | null {\n    if (shaped.collisionPadding) {\n        // Compute height of the shape in glyph metrics and apply padding.\n        // Note that the pixel based 'text-padding' is applied at runtime\n        shaped.top -= shaped.collisionPadding[1];\n        shaped.bottom += shaped.collisionPadding[3];\n    }\n\n    // Set minimum box height to avoid very many small labels\n    const height = shaped.bottom - shaped.top;\n    return height > 0 ? Math.max(10, height) : null;\n}\n\n/**\n * Add a single label & icon placement.\n *\n * @private\n */\nfunction addSymbol(bucket: SymbolBucket,\n                   anchor: Anchor,\n                   globe: ?{ anchor: Anchor, up: Vec3 },\n                   line: Array<Point>,\n                   shapedTextOrientations: any,\n                   shapedIcon: PositionedIcon | void,\n                   imageMap: {[_: string]: StyleImage},\n                   verticallyShapedIcon: PositionedIcon | void,\n                   layer: SymbolStyleLayer,\n                   collisionBoxArray: CollisionBoxArray,\n                   featureIndex: number,\n                   sourceLayerIndex: number,\n                   bucketIndex: number,\n                   textPadding: number,\n                   textAlongLine: boolean,\n                   textOffset: [number, number],\n                   iconBoxScale: number,\n                   iconPadding: number,\n                   iconAlongLine: boolean,\n                   iconOffset: [number, number],\n                   feature: SymbolFeature,\n                   sizes: Sizes,\n                   isSDFIcon: boolean,\n                   availableImages: Array<string>,\n                   canonical: CanonicalTileID,\n                   brightness: ?number,\n                   hasAnySecondaryIcon: boolean) {\n    const lineArray = bucket.addToLineVertexArray(anchor, line);\n    let textBoxIndex, iconBoxIndex, verticalTextBoxIndex, verticalIconBoxIndex;\n    let textCircle, verticalTextCircle, verticalIconCircle;\n\n    let numIconVertices = 0;\n    let numVerticalIconVertices = 0;\n    let numHorizontalGlyphVertices = 0;\n    let numVerticalGlyphVertices = 0;\n    let placedIconSymbolIndex = -1;\n    let verticalPlacedIconSymbolIndex = -1;\n    const placedTextSymbolIndices = {};\n    let key = murmur3('');\n    const collisionFeatureAnchor: Anchor = globe ? globe.anchor : anchor;\n    const hasIconTextFit = layer.layout.get('icon-text-fit').evaluate(feature, {}, canonical) !== 'none';\n\n    let textOffset0 = 0;\n    let textOffset1 = 0;\n    if (layer._unevaluatedLayout.getValue('text-radial-offset') === undefined) {\n        [textOffset0, textOffset1] = (layer.layout.get('text-offset').evaluate(feature, {}, canonical).map(t => t * ONE_EM): any);\n    } else {\n        textOffset0 = layer.layout.get('text-radial-offset').evaluate(feature, {}, canonical) * ONE_EM;\n        textOffset1 = INVALID_TEXT_OFFSET;\n    }\n\n    if (bucket.allowVerticalPlacement && shapedTextOrientations.vertical) {\n        const verticalShaping = shapedTextOrientations.vertical;\n        if (textAlongLine) {\n            verticalTextCircle = evaluateCircleCollisionFeature(verticalShaping);\n            if (verticallyShapedIcon) {\n                verticalIconCircle = evaluateCircleCollisionFeature(verticallyShapedIcon);\n            }\n        } else {\n            const textRotation = layer.layout.get('text-rotate').evaluate(feature, {}, canonical);\n            const verticalTextRotation = textRotation + 90.0;\n            verticalTextBoxIndex = evaluateBoxCollisionFeature(collisionBoxArray, collisionFeatureAnchor, anchor, featureIndex, sourceLayerIndex, bucketIndex, verticalShaping, textPadding, verticalTextRotation, textOffset);\n            if (verticallyShapedIcon) {\n                verticalIconBoxIndex = evaluateBoxCollisionFeature(collisionBoxArray, collisionFeatureAnchor, anchor, featureIndex, sourceLayerIndex, bucketIndex, verticallyShapedIcon, iconPadding, verticalTextRotation);\n            }\n        }\n    }\n\n    // Place icon first, so text can have a reference to its index in the placed symbol array.\n    // Text symbols can lazily shift at render-time because of variable anchor placement.\n    // If the style specifies an `icon-text-fit` then the icon would have to shift along with it.\n    // For more info check `updateVariableAnchors` in `draw_symbol.js` .\n\n    if (shapedIcon) {\n        const iconRotate = layer.layout.get('icon-rotate').evaluate(feature, {}, canonical);\n        const iconQuads = getIconQuads(shapedIcon, iconRotate, isSDFIcon, hasIconTextFit);\n        const verticalIconQuads = verticallyShapedIcon ? getIconQuads(verticallyShapedIcon, iconRotate, isSDFIcon, hasIconTextFit) : undefined;\n        iconBoxIndex = evaluateBoxCollisionFeature(collisionBoxArray, collisionFeatureAnchor, anchor, featureIndex, sourceLayerIndex, bucketIndex, shapedIcon, iconPadding, iconRotate);\n        numIconVertices = iconQuads.length * 4;\n\n        const sizeData = bucket.iconSizeData;\n        let iconSizeData = null;\n\n        if (sizeData.kind === 'source') {\n            iconSizeData = [\n                SIZE_PACK_FACTOR * layer.layout.get('icon-size').evaluate(feature, {}, canonical)\n            ];\n            if (iconSizeData[0] > MAX_PACKED_SIZE) {\n                warnOnce(`${bucket.layerIds[0]}: Value for \"icon-size\" is >= ${MAX_GLYPH_ICON_SIZE}. Reduce your \"icon-size\".`);\n            }\n        } else if (sizeData.kind === 'composite') {\n            iconSizeData = [\n                SIZE_PACK_FACTOR * sizes.compositeIconSizes[0].evaluate(feature, {}, canonical),\n                SIZE_PACK_FACTOR * sizes.compositeIconSizes[1].evaluate(feature, {}, canonical)\n            ];\n            if (iconSizeData[0] > MAX_PACKED_SIZE || iconSizeData[1] > MAX_PACKED_SIZE) {\n                warnOnce(`${bucket.layerIds[0]}: Value for \"icon-size\" is >= ${MAX_GLYPH_ICON_SIZE}. Reduce your \"icon-size\".`);\n            }\n        }\n\n        bucket.addSymbols(\n            bucket.icon,\n            iconQuads,\n            iconSizeData,\n            iconOffset,\n            iconAlongLine,\n            feature,\n            false,\n            globe,\n            anchor,\n            lineArray.lineStartIndex,\n            lineArray.lineLength,\n            // The icon itself does not have an associated symbol since the text isnt placed yet\n            -1,\n            availableImages,\n            canonical,\n            brightness,\n            hasAnySecondaryIcon);\n\n        placedIconSymbolIndex = bucket.icon.placedSymbolArray.length - 1;\n\n        if (verticalIconQuads) {\n            numVerticalIconVertices = verticalIconQuads.length * 4;\n\n            bucket.addSymbols(\n                bucket.icon,\n                verticalIconQuads,\n                iconSizeData,\n                iconOffset,\n                iconAlongLine,\n                feature,\n                WritingMode.vertical,\n                globe,\n                anchor,\n                lineArray.lineStartIndex,\n                lineArray.lineLength,\n                // The icon itself does not have an associated symbol since the text isnt placed yet\n                -1,\n                availableImages,\n                canonical,\n                brightness,\n                hasAnySecondaryIcon);\n\n            verticalPlacedIconSymbolIndex = bucket.icon.placedSymbolArray.length - 1;\n        }\n    }\n\n    for (const justification: any in shapedTextOrientations.horizontal) {\n        const shaping = shapedTextOrientations.horizontal[justification];\n\n        if (!textBoxIndex) {\n            key = murmur3(shaping.text);\n            // As a collision approximation, we can use either the vertical or any of the horizontal versions of the feature\n            // We're counting on all versions having similar dimensions\n            if (textAlongLine) {\n                textCircle = evaluateCircleCollisionFeature(shaping);\n            } else {\n                const textRotate = layer.layout.get('text-rotate').evaluate(feature, {}, canonical);\n                textBoxIndex = evaluateBoxCollisionFeature(collisionBoxArray, collisionFeatureAnchor, anchor, featureIndex, sourceLayerIndex, bucketIndex, shaping, textPadding, textRotate, textOffset);\n            }\n        }\n\n        const singleLine = shaping.positionedLines.length === 1;\n        numHorizontalGlyphVertices += addTextVertices(\n            bucket, globe, anchor, shaping, imageMap, layer, textAlongLine, feature, textOffset, lineArray,\n            shapedTextOrientations.vertical ? WritingMode.horizontal : WritingMode.horizontalOnly,\n            singleLine ? (Object.keys(shapedTextOrientations.horizontal): any) : [justification],\n            placedTextSymbolIndices, placedIconSymbolIndex, sizes, availableImages, canonical, brightness);\n\n        if (singleLine) {\n            break;\n        }\n    }\n\n    if (shapedTextOrientations.vertical) {\n        numVerticalGlyphVertices += addTextVertices(\n            bucket, globe, anchor, shapedTextOrientations.vertical, imageMap, layer, textAlongLine, feature,\n            textOffset, lineArray, WritingMode.vertical, ['vertical'], placedTextSymbolIndices,\n            verticalPlacedIconSymbolIndex, sizes, availableImages, canonical, brightness);\n    }\n\n    // Check if runtime collision circles should be used for any of the collision features.\n    // It is enough to choose the tallest feature shape as circles are always placed on a line.\n    // All measurements are in glyph metrics and later converted into pixels using proper font size \"layoutTextSize\"\n    let collisionCircleDiameter = -1;\n\n    const getCollisionCircleHeight = (diameter: ?number, prevHeight: number): number => {\n        return diameter ? Math.max(diameter, prevHeight) : prevHeight;\n    };\n\n    collisionCircleDiameter = getCollisionCircleHeight(textCircle, collisionCircleDiameter);\n    collisionCircleDiameter = getCollisionCircleHeight(verticalTextCircle, collisionCircleDiameter);\n    collisionCircleDiameter = getCollisionCircleHeight(verticalIconCircle, collisionCircleDiameter);\n    const useRuntimeCollisionCircles = (collisionCircleDiameter > -1) ? 1 : 0;\n\n    if (bucket.glyphOffsetArray.length >= SymbolBucketConstants.MAX_GLYPHS) warnOnce(\n        \"Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907\"\n    );\n\n    if (feature.sortKey !== undefined) {\n        bucket.addToSortKeyRanges(bucket.symbolInstances.length, feature.sortKey);\n    }\n\n    const projectedAnchor = collisionFeatureAnchor;\n\n    bucket.symbolInstances.emplaceBack(\n        anchor.x,\n        anchor.y,\n        projectedAnchor.x,\n        projectedAnchor.y,\n        projectedAnchor.z,\n        placedTextSymbolIndices.right >= 0 ? placedTextSymbolIndices.right : -1,\n        placedTextSymbolIndices.center >= 0 ? placedTextSymbolIndices.center : -1,\n        placedTextSymbolIndices.left >= 0 ? placedTextSymbolIndices.left : -1,\n        placedTextSymbolIndices.vertical  >= 0 ? placedTextSymbolIndices.vertical : -1,\n        placedIconSymbolIndex,\n        verticalPlacedIconSymbolIndex,\n        key,\n        textBoxIndex !== undefined ? textBoxIndex : bucket.collisionBoxArray.length,\n        textBoxIndex !== undefined ? textBoxIndex + 1 : bucket.collisionBoxArray.length,\n        verticalTextBoxIndex !== undefined ? verticalTextBoxIndex : bucket.collisionBoxArray.length,\n        verticalTextBoxIndex !== undefined ? verticalTextBoxIndex + 1 : bucket.collisionBoxArray.length,\n        iconBoxIndex !== undefined ? iconBoxIndex : bucket.collisionBoxArray.length,\n        iconBoxIndex !== undefined ? iconBoxIndex + 1 : bucket.collisionBoxArray.length,\n        verticalIconBoxIndex ? verticalIconBoxIndex : bucket.collisionBoxArray.length,\n        verticalIconBoxIndex ? verticalIconBoxIndex + 1 : bucket.collisionBoxArray.length,\n        featureIndex,\n        numHorizontalGlyphVertices,\n        numVerticalGlyphVertices,\n        numIconVertices,\n        numVerticalIconVertices,\n        useRuntimeCollisionCircles,\n        0,\n        textOffset0,\n        textOffset1,\n        collisionCircleDiameter,\n        0,\n        hasIconTextFit ? 1 : 0\n    );\n}\n\nfunction anchorIsTooClose(bucket: any, text: string, repeatDistance: number, anchor: Point) {\n    const compareText = bucket.compareText;\n    if (!(text in compareText)) {\n        compareText[text] = [];\n    } else {\n        const otherAnchors = compareText[text];\n        for (let k = otherAnchors.length - 1; k >= 0; k--) {\n            if (anchor.dist(otherAnchors[k]) < repeatDistance) {\n                // If it's within repeatDistance of one anchor, stop looking\n                return true;\n            }\n        }\n    }\n    // If anchor is not within repeatDistance of any other anchor, add to array\n    compareText[text].push(anchor);\n    return false;\n}\n","// @flow\nimport {vec3} from 'gl-matrix';\nimport {Ray} from '../../util/primitives.js';\nimport type Transform from '../transform.js';\n\nexport function farthestPixelDistanceOnPlane(tr: Transform, pixelsPerMeter: number): number {\n    // Find the distance from the center point [width/2 + offset.x, height/2 + offset.y] to the\n    // center top point [width/2 + offset.x, 0] in Z units, using the law of sines.\n    // 1 Z unit is equivalent to 1 horizontal px at the center of the map\n    // (the distance between[width/2, height/2] and [width/2 + 1, height/2])\n    const fovAboveCenter = tr.fovAboveCenter;\n\n    // Adjust distance to MSL by the minimum possible elevation visible on screen,\n    // this way the far plane is pushed further in the case of negative elevation.\n    const minElevationInPixels = tr.elevation ?\n        tr.elevation.getMinElevationBelowMSL() * pixelsPerMeter :\n        0;\n    const cameraToSeaLevelDistance = ((tr._camera.position[2] * tr.worldSize) - minElevationInPixels) / Math.cos(tr._pitch);\n    const topHalfSurfaceDistance = Math.sin(fovAboveCenter) * cameraToSeaLevelDistance / Math.sin(Math.max(Math.PI / 2.0 - tr._pitch - fovAboveCenter, 0.01));\n\n    // Calculate z distance of the farthest fragment that should be rendered.\n    const furthestDistance = Math.sin(tr._pitch) * topHalfSurfaceDistance + cameraToSeaLevelDistance;\n    const horizonDistance = cameraToSeaLevelDistance * (1 / tr._horizonShift);\n\n    // Add a bit extra to avoid precision problems when a fragment's distance is exactly `furthestDistance`\n    return Math.min(furthestDistance * 1.01, horizonDistance);\n}\n\nexport function farthestPixelDistanceOnSphere(tr: Transform, pixelsPerMeter: number): number {\n    // Find farthest distance of the globe that is potentially visible to the camera.\n    // First check if the view frustum is fully covered by the map by casting a ray\n    // from the top left/right corner and see if it intersects with the globe. In case\n    // of no intersection we need to find distance to the horizon point where the\n    // surface normal is perpendicular to the camera forward direction.\n    const cameraDistance = tr.cameraToCenterDistance;\n    const centerPixelAltitude = tr._centerAltitude * pixelsPerMeter;\n\n    const camera = tr._camera;\n    const forward = tr._camera.forward();\n    const cameraPosition = vec3.add([], vec3.scale([], forward, -cameraDistance), [0, 0, centerPixelAltitude]);\n\n    const globeRadius = tr.worldSize / (2.0 * Math.PI);\n    const globeCenter = [0, 0, -globeRadius];\n\n    const aspectRatio = tr.width / tr.height;\n    const tanFovAboveCenter = Math.tan(tr.fovAboveCenter);\n\n    const up = vec3.scale([], camera.up(), tanFovAboveCenter);\n    const right = vec3.scale([], camera.right(), tanFovAboveCenter * aspectRatio);\n    const dir = vec3.normalize([], vec3.add([], vec3.add([], forward, up), right));\n\n    const pointOnGlobe = [];\n    const ray = new Ray(cameraPosition, dir);\n\n    let pixelDistance;\n    if (ray.closestPointOnSphere(globeCenter, globeRadius, pointOnGlobe)) {\n        const p0 = vec3.add([], pointOnGlobe, globeCenter);\n        const p1 = vec3.sub([], p0, cameraPosition);\n        // Globe is fully covering the view frustum. Project the intersection\n        // point to the camera view vector in order to find the pixel distance\n        pixelDistance = Math.cos(tr.fovAboveCenter) * vec3.length(p1);\n    } else {\n        // Background space is visible. Find distance to the point of the\n        // globe where surface normal is parallel to the view vector\n        const globeCenterToCamera = vec3.sub([], cameraPosition, globeCenter);\n        const cameraToGlobe = vec3.sub([], globeCenter, cameraPosition);\n        vec3.normalize(cameraToGlobe, cameraToGlobe);\n\n        const cameraHeight = vec3.length(globeCenterToCamera) - globeRadius;\n        pixelDistance = Math.sqrt(cameraHeight * (cameraHeight + 2 * globeRadius));\n        const angle = Math.acos(pixelDistance / (globeRadius + cameraHeight)) - Math.acos(vec3.dot(forward, cameraToGlobe));\n        pixelDistance *= Math.cos(angle);\n    }\n\n    return pixelDistance * 1.01;\n}\n","// @flow\nimport Point from '@mapbox/point-geometry';\nimport MercatorCoordinate, {altitudeFromMercatorZ, lngFromMercatorX, latFromMercatorY} from '../mercator_coordinate.js';\nimport EXTENT from '../../style-spec/data/extent.js';\nimport {vec3} from 'gl-matrix';\nimport {Aabb} from '../../util/primitives.js';\nimport {aabbForTileOnGlobe} from './globe_util.js';\nimport assert from 'assert';\nimport {CanonicalTileID} from '../../source/tile_id.js';\n\nimport type {Vec3} from 'gl-matrix';\nimport type Projection from './projection.js';\nimport type {ProjectedPoint} from './projection.js';\nimport type Transform from '../transform.js';\n\nexport type TileTransform = {\n    scale: number,\n    x: number,\n    y: number,\n    x2: number,\n    y2: number,\n    projection: Projection\n};\n\nexport default function tileTransform(id: Object, projection: Projection): TileTransform {\n    if (!projection.isReprojectedInTileSpace) {\n        return {scale: 1 << id.z, x: id.x, y: id.y, x2: id.x + 1, y2: id.y + 1, projection};\n    }\n\n    const s = Math.pow(2, -id.z);\n\n    const x1 = (id.x) * s;\n    const x2 = (id.x + 1) * s;\n    const y1 = (id.y) * s;\n    const y2 = (id.y + 1) * s;\n\n    const lng1 = lngFromMercatorX(x1);\n    const lng2 = lngFromMercatorX(x2);\n    const lat1 = latFromMercatorY(y1);\n    const lat2 = latFromMercatorY(y2);\n\n    const p0 = projection.project(lng1, lat1);\n    const p1 = projection.project(lng2, lat1);\n    const p2 = projection.project(lng2, lat2);\n    const p3 = projection.project(lng1, lat2);\n\n    let minX = Math.min(p0.x, p1.x, p2.x, p3.x);\n    let minY = Math.min(p0.y, p1.y, p2.y, p3.y);\n    let maxX = Math.max(p0.x, p1.x, p2.x, p3.x);\n    let maxY = Math.max(p0.y, p1.y, p2.y, p3.y);\n\n    // we pick an error threshold for calculating the bbox that balances between performance and precision\n    const maxErr = s / 16;\n\n    function processSegment(pa: ProjectedPoint, pb: ProjectedPoint, ax: number, ay: number, bx: number, by: number) {\n        const mx = (ax + bx) / 2;\n        const my = (ay + by) / 2;\n\n        const pm = projection.project(lngFromMercatorX(mx), latFromMercatorY(my));\n        const err = Math.max(0, minX - pm.x, minY - pm.y, pm.x - maxX, pm.y - maxY);\n\n        minX = Math.min(minX, pm.x);\n        maxX = Math.max(maxX, pm.x);\n        minY = Math.min(minY, pm.y);\n        maxY = Math.max(maxY, pm.y);\n\n        if (err > maxErr) {\n            processSegment(pa, pm, ax, ay, mx, my);\n            processSegment(pm, pb, mx, my, bx, by);\n        }\n    }\n\n    processSegment(p0, p1, x1, y1, x2, y1);\n    processSegment(p1, p2, x2, y1, x2, y2);\n    processSegment(p2, p3, x2, y2, x1, y2);\n    processSegment(p3, p0, x1, y2, x1, y1);\n\n    // extend the bbox by max error to make sure coords don't go past tile extent\n    minX -= maxErr;\n    minY -= maxErr;\n    maxX += maxErr;\n    maxY += maxErr;\n\n    const max = Math.max(maxX - minX, maxY - minY);\n    const scale = 1 / max;\n\n    return {\n        scale,\n        x: minX * scale,\n        y: minY * scale,\n        x2: maxX * scale,\n        y2: maxY * scale,\n        projection\n    };\n}\n\nexport function tileAABB(tr: Transform, numTiles: number, z: number, x: number, y: number, wrap: number, min: number, max: number, projection: Projection): Aabb {\n    if (projection.name === 'globe') {\n        const tileId = new CanonicalTileID(z, x, y);\n        return aabbForTileOnGlobe(tr, numTiles, tileId, false);\n    }\n\n    const tt = tileTransform({z, x, y}, projection);\n    const tx = tt.x / tt.scale;\n    const ty = tt.y / tt.scale;\n    const tx2 = tt.x2 / tt.scale;\n    const ty2 = tt.y2 / tt.scale;\n\n    if (isNaN(tx) || isNaN(tx2) || isNaN(ty) || isNaN(ty2)) {\n        assert(false);\n    }\n\n    return new Aabb(\n        [(wrap + tx) * numTiles, numTiles * ty, min],\n        [(wrap  + tx2) * numTiles, numTiles * ty2, max]);\n}\n\nexport function getTilePoint(tileTransform: TileTransform, {x, y}: interface { x: number, y: number }, wrap: number = 0): Point {\n    return new Point(\n        ((x - wrap) * tileTransform.scale - tileTransform.x) * EXTENT,\n        (y * tileTransform.scale - tileTransform.y) * EXTENT);\n}\n\nexport function getTileVec3(tileTransform: TileTransform, coord: MercatorCoordinate, wrap: number = 0): Vec3 {\n    const x = ((coord.x - wrap) * tileTransform.scale - tileTransform.x) * EXTENT;\n    const y = (coord.y * tileTransform.scale - tileTransform.y) * EXTENT;\n    return vec3.fromValues(x, y, altitudeFromMercatorZ(coord.z, coord.y));\n}\n","// @flow\nimport LngLat from '../lng_lat.js';\nimport {mercatorZfromAltitude} from '../mercator_coordinate.js';\nimport Point from '@mapbox/point-geometry';\nimport {farthestPixelDistanceOnPlane} from './far_z.js';\nimport {mat4} from 'gl-matrix';\nimport EXTENT from '../../style-spec/data/extent.js';\nimport tileTransform from './tile_transform.js';\n\nimport type Transform from '../../geo/transform.js';\nimport type {Vec3} from 'gl-matrix';\nimport type MercatorCoordinate from '../mercator_coordinate.js';\nimport type {ProjectionSpecification} from '../../style-spec/types.js';\nimport type {CanonicalTileID, UnwrappedTileID} from '../../source/tile_id.js';\n\nexport type ProjectedPoint = {\n    x: number;\n    y: number;\n    z: number;\n};\n\nexport type ElevationScale = {\n    // `metersToTile` converts meters to units used to describe elevation in tile space.\n    // Default units in mercator space are x & y: [0, 8192] and z: meters\n    metersToTile: number\n}\n\nconst identity = mat4.identity(new Float32Array(16));\n\nexport default class Projection {\n    name: string;\n    wrap: boolean;\n    conic: boolean;\n    requiresDraping: boolean;\n    supportsWorldCopies: boolean;\n    supportsTerrain: boolean;\n    supportsFog: boolean;\n    supportsFreeCamera: boolean;\n    zAxisUnit: 'meters' | 'pixels';\n    isReprojectedInTileSpace: boolean;\n    center: [number, number];\n    range: ?[number, number];\n    parallels: ?[number, number];\n    unsupportedLayers: Array<string>;\n    spec: ProjectionSpecification;\n\n    constructor(options: ProjectionSpecification) {\n        this.spec = options;\n        this.name = options.name;\n        this.wrap = false;\n        this.requiresDraping = false;\n        this.supportsWorldCopies = false;\n        this.supportsTerrain = false;\n        this.supportsFog = false;\n        this.supportsFreeCamera = false;\n        this.zAxisUnit = 'meters';\n        this.isReprojectedInTileSpace = true;\n        this.unsupportedLayers = ['custom'];\n        this.center = [0, 0];\n        this.range = [3.5, 7];\n    }\n\n    project(lng: number, lat: number): ProjectedPoint { // eslint-disable-line\n        return {x: 0, y: 0, z: 0}; // overriden in subclasses\n    }\n\n    unproject(x: number, y: number): LngLat { // eslint-disable-line\n        return new LngLat(0, 0); // overriden in subclasses\n    }\n\n    projectTilePoint(x: number, y: number, _: CanonicalTileID): ProjectedPoint {\n        return {x, y, z: 0};\n    }\n\n    locationPoint(tr: Transform, lngLat: LngLat, terrain: boolean = true): Point {\n        return tr._coordinatePoint(tr.locationCoordinate(lngLat), terrain);\n    }\n\n    pixelsPerMeter(lat: number, worldSize: number): number {\n        return mercatorZfromAltitude(1, lat) * worldSize;\n    }\n\n    // pixels-per-meter is used to describe relation between real world and pixel distances.\n    // `pixelSpaceConversion` can be used to convert the ratio from mercator projection to\n    // the currently active projection.\n    //\n    // `pixelSpaceConversion` is useful for converting between pixel spaces where some logic\n    // expects mercator pixels, such as raycasting where the scale is expected to be in\n    // mercator pixels.\n    pixelSpaceConversion(lat: number, worldSize: number, interpolationT: number): number { // eslint-disable-line\n        return 1.0;\n    }\n\n    farthestPixelDistance(tr: Transform): number {\n        return farthestPixelDistanceOnPlane(tr, tr.pixelsPerMeter);\n    }\n\n    pointCoordinate(tr: Transform, x: number, y: number, z: number): MercatorCoordinate {\n        const horizonOffset = tr.horizonLineFromTop(false);\n        const clamped = new Point(x, Math.max(horizonOffset, y));\n        return tr.rayIntersectionCoordinate(tr.pointRayIntersection(clamped, z));\n    }\n\n    pointCoordinate3D(tr: Transform, x: number, y: number): ?Vec3 {\n        const p = new Point(x, y);\n        if (tr.elevation) {\n            return tr.elevation.pointCoordinate(p);\n        } else {\n            const mc = this.pointCoordinate(tr, p.x, p.y, 0);\n            return [mc.x, mc.y, mc.z];\n        }\n    }\n\n    isPointAboveHorizon(tr: Transform, p: Point): boolean {\n        if (tr.elevation) {\n            const raycastOnTerrain = this.pointCoordinate3D(tr, p.x, p.y);\n            return !raycastOnTerrain;\n        }\n        const horizon = tr.horizonLineFromTop();\n        return p.y < horizon;\n    }\n\n    createInversionMatrix(tr: Transform, id: CanonicalTileID): Float32Array { // eslint-disable-line\n        return identity;\n    }\n\n    createTileMatrix(tr: Transform, worldSize: number, id: UnwrappedTileID): Float64Array {\n        let scale, scaledX, scaledY;\n        const canonical = id.canonical;\n        const posMatrix = mat4.identity(new Float64Array(16));\n\n        if (this.isReprojectedInTileSpace) {\n            const cs = tileTransform(canonical, this);\n            scale = 1;\n            scaledX = cs.x + id.wrap * cs.scale;\n            scaledY = cs.y;\n            mat4.scale(posMatrix, posMatrix, [scale / cs.scale, scale / cs.scale, tr.pixelsPerMeter / worldSize]);\n        } else {\n            scale = worldSize / tr.zoomScale(canonical.z);\n            const unwrappedX = canonical.x + Math.pow(2, canonical.z) * id.wrap;\n            scaledX = unwrappedX * scale;\n            scaledY = canonical.y * scale;\n        }\n\n        mat4.translate(posMatrix, posMatrix, [scaledX, scaledY, 0]);\n        mat4.scale(posMatrix, posMatrix, [scale / EXTENT, scale / EXTENT, 1]);\n\n        return posMatrix;\n    }\n\n    upVector(id: CanonicalTileID, x: number, y: number): Vec3 { // eslint-disable-line\n        return [0, 0, 1];\n    }\n\n    upVectorScale(id: CanonicalTileID, latitude: number, worldSize: number): ElevationScale { // eslint-disable-line\n        return {metersToTile: 1};\n    }\n}\n","// @flow\nimport LngLat from '../lng_lat.js';\nimport {clamp, wrap, degToRad, radToDeg} from '../../util/util.js';\nimport {MAX_MERCATOR_LATITUDE} from '../mercator_coordinate.js';\nimport Projection from './projection.js';\n\nimport type {ProjectionSpecification} from '../../style-spec/types.js';\nimport type {ProjectedPoint} from './projection.js';\n\n// based on https://github.com/d3/d3-geo-projection, MIT-licensed\nexport default class Albers extends Projection {\n    n: number;\n    c: number;\n    r0: number;\n\n    constructor(options: ProjectionSpecification) {\n        super(options);\n        this.range = [4, 7];\n        this.center = options.center || [-96, 37.5];\n        const [lat0, lat1] = this.parallels = options.parallels || [29.5, 45.5];\n\n        const sy0 = Math.sin(degToRad(lat0));\n        this.n = (sy0 + Math.sin(degToRad(lat1))) / 2;\n        this.c = 1 + sy0 * (2 * this.n - sy0);\n        this.r0 = Math.sqrt(this.c) / this.n;\n    }\n\n    project(lng: number, lat: number): ProjectedPoint {\n        const {n, c, r0} = this;\n        const lambda = degToRad(lng - this.center[0]);\n        const phi = degToRad(lat);\n\n        const r = Math.sqrt(c - 2 * n * Math.sin(phi)) / n;\n        const x = r * Math.sin(lambda * n);\n        const y = r * Math.cos(lambda * n) - r0;\n        return {x, y, z: 0};\n    }\n\n    unproject(x: number, y: number): LngLat {\n        const {n, c, r0} = this;\n        const r0y = r0 + y;\n        let l = Math.atan2(x, Math.abs(r0y)) * Math.sign(r0y);\n        if (r0y * n < 0) {\n            l -= Math.PI * Math.sign(x) * Math.sign(r0y);\n        }\n        const dt = degToRad(this.center[0]) * n;\n        l = wrap(l, -Math.PI - dt, Math.PI - dt);\n\n        const lng = clamp(radToDeg(l / n) + this.center[0], -180, 180);\n        const phi = Math.asin(clamp((c - (x * x + r0y * r0y) * n * n) / (2 * n), -1, 1));\n        const lat = clamp(radToDeg(phi), -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE);\n\n        return new LngLat(lng, lat);\n    }\n}\n","// @flow\nimport LngLat from '../lng_lat.js';\nimport {clamp} from '../../util/util.js';\nimport {MAX_MERCATOR_LATITUDE} from '../mercator_coordinate.js';\nimport Projection from './projection.js';\n\nimport type {ProjectedPoint} from './projection.js';\n\nconst a1 = 1.340264;\nconst a2 = -0.081106;\nconst a3 = 0.000893;\nconst a4 = 0.003796;\nconst M = Math.sqrt(3) / 2;\n\nexport default class EqualEarth extends Projection {\n\n    project(lng: number, lat: number): ProjectedPoint {\n        // based on https://github.com/d3/d3-geo, MIT-licensed\n        lat = lat / 180 * Math.PI;\n        lng = lng / 180 * Math.PI;\n        const theta = Math.asin(M * Math.sin(lat));\n        const theta2 = theta * theta;\n        const theta6 = theta2 * theta2 * theta2;\n        const x = lng * Math.cos(theta) / (M * (a1 + 3 * a2 * theta2 + theta6 * (7 * a3 + 9 * a4 * theta2)));\n        const y = theta * (a1 + a2 * theta2 + theta6 * (a3 + a4 * theta2));\n\n        return {\n            x: (x / Math.PI + 0.5) * 0.5,\n            y: 1 - (y / Math.PI + 1) * 0.5,\n            z: 0\n        };\n    }\n\n    unproject(x: number, y: number): LngLat {\n        // based on https://github.com/d3/d3-geo, MIT-licensed\n        x = (2 * x - 0.5) * Math.PI;\n        y = (2 * (1 - y) - 1) * Math.PI;\n        let theta = y;\n        let theta2 = theta * theta;\n        let theta6 = theta2 * theta2 * theta2;\n\n        for (let i = 0, delta, fy, fpy; i < 12; ++i) {\n            fy = theta * (a1 + a2 * theta2 + theta6 * (a3 + a4 * theta2)) - y;\n            fpy = a1 + 3 * a2 * theta2 + theta6 * (7 * a3 + 9 * a4 * theta2);\n            delta = fy / fpy;\n            theta = clamp(theta - delta, -Math.PI / 3, Math.PI / 3);\n            theta2 = theta * theta;\n            theta6 = theta2 * theta2 * theta2;\n            if (Math.abs(delta) < 1e-12) break;\n        }\n\n        const lambda = M * x * (a1 + 3 * a2 * theta2 + theta6 * (7 * a3 + 9 * a4 * theta2)) / Math.cos(theta);\n        const phi = Math.asin(Math.sin(theta) / M);\n        const lng = clamp(lambda * 180 / Math.PI, -180, 180);\n        const lat = clamp(phi * 180 / Math.PI, -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE);\n\n        return new LngLat(lng, lat);\n    }\n}\n","// @flow\nimport LngLat from '../lng_lat.js';\nimport {clamp} from '../../util/util.js';\nimport {MAX_MERCATOR_LATITUDE} from '../mercator_coordinate.js';\nimport Projection from './projection.js';\n\nimport type {ProjectionSpecification} from '../../style-spec/types.js';\nimport type {ProjectedPoint} from './projection.js';\n\nexport default class Equirectangular extends Projection {\n\n    constructor(options: ProjectionSpecification) {\n        super(options);\n        this.wrap = true;\n        this.supportsWorldCopies = true;\n    }\n\n    project(lng: number, lat: number): ProjectedPoint {\n        const x = 0.5 + lng / 360;\n        const y = 0.5 - lat / 360;\n        return {x, y, z: 0};\n    }\n\n    unproject(x: number, y: number): LngLat {\n        const lng = (x - 0.5) * 360;\n        const lat = clamp((0.5 - y) * 360, -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE);\n        return new LngLat(lng, lat);\n    }\n}\n","// @flow\nimport LngLat from '../lng_lat.js';\nimport {clamp, degToRad, radToDeg} from '../../util/util.js';\nimport {MAX_MERCATOR_LATITUDE} from '../mercator_coordinate.js';\nimport Projection from './projection.js';\n\nimport type {ProjectionSpecification} from '../../style-spec/types.js';\nimport type {ProjectedPoint} from './projection.js';\n\nconst halfPi = Math.PI / 2;\n\nfunction tany(y: number) {\n    return Math.tan((halfPi + y) / 2);\n}\n\n// based on https://github.com/d3/d3-geo, MIT-licensed\nexport default class LambertConformalConic extends Projection {\n    n: number;\n    f: number;\n    southernCenter: boolean;\n\n    constructor(options: ProjectionSpecification) {\n        super(options);\n        this.center = options.center || [0, 30];\n        const [lat0, lat1] = this.parallels = options.parallels || [30, 30];\n\n        let y0 = degToRad(lat0);\n        let y1 = degToRad(lat1);\n        // Run projection math on inverted lattitudes if the paralell lines are south of the equator\n        // This fixes divide by zero errors with a South polar projection\n        this.southernCenter = (y0 + y1) < 0;\n        if (this.southernCenter) {\n            y0 = -y0;\n            y1 = -y1;\n        }\n        const cy0 = Math.cos(y0);\n        const tany0 = tany(y0);\n\n        this.n = y0 === y1 ? Math.sin(y0) : Math.log(cy0 / Math.cos(y1)) / Math.log(tany(y1) / tany0);\n        this.f = cy0 * Math.pow(tany(y0), this.n) / this.n;\n    }\n\n    project(lng: number, lat: number): ProjectedPoint {\n        lat = degToRad(lat);\n        if (this.southernCenter) lat = -lat;\n        lng = degToRad(lng - this.center[0]);\n\n        const epsilon = 1e-6;\n        const {n, f} = this;\n\n        if (f > 0) {\n            if (lat < -halfPi + epsilon) lat = -halfPi + epsilon;\n        } else {\n            if (lat > halfPi - epsilon) lat = halfPi - epsilon;\n        }\n\n        const r = f / Math.pow(tany(lat), n);\n        let x = r * Math.sin(n * lng);\n        let y = f - r * Math.cos(n * lng);\n        x = (x / Math.PI + 0.5) * 0.5;\n        y = (y / Math.PI + 0.5) * 0.5;\n\n        return {\n            x,\n            y: this.southernCenter ? y : 1 - y,\n            z: 0\n        };\n    }\n\n    unproject(x: number, y: number): LngLat {\n        x = (2 * x - 0.5) * Math.PI;\n        if (this.southernCenter) y = 1 - y;\n        y = (2 * (1 - y) - 0.5) * Math.PI;\n        const {n, f} = this;\n        const fy = f - y;\n        const signFy = Math.sign(fy);\n        const r = Math.sign(n) * Math.sqrt(x * x + fy * fy);\n        let l = Math.atan2(x, Math.abs(fy)) * signFy;\n\n        if (fy * n < 0) l -= Math.PI * Math.sign(x) * signFy;\n\n        const lng = clamp(radToDeg(l / n) + this.center[0], -180, 180);\n        const phi = 2 * Math.atan(Math.pow(f / r, 1 / n)) - halfPi;\n        const lat = clamp(radToDeg(phi), -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE);\n\n        return new LngLat(lng, this.southernCenter ? -lat : lat);\n    }\n}\n","// @flow\nimport LngLat from '../lng_lat.js';\nimport {mercatorXfromLng, mercatorYfromLat, lngFromMercatorX, latFromMercatorY} from '../mercator_coordinate.js';\nimport Projection from './projection.js';\n\nimport type {ProjectionSpecification} from '../../style-spec/types.js';\nimport type {ProjectedPoint} from './projection.js';\n\nexport default class Mercator extends Projection {\n\n    constructor(options: ProjectionSpecification) {\n        super(options);\n        this.wrap = true;\n        this.supportsWorldCopies = true;\n        this.supportsTerrain = true;\n        this.supportsFog = true;\n        this.supportsFreeCamera = true;\n        this.isReprojectedInTileSpace = false;\n        this.unsupportedLayers = [];\n        this.range = null;\n    }\n\n    project(lng: number, lat: number): ProjectedPoint {\n        const x = mercatorXfromLng(lng);\n        const y = mercatorYfromLat(lat);\n        return {x, y, z: 0};\n    }\n\n    unproject(x: number, y: number): LngLat {\n        const lng = lngFromMercatorX(x);\n        const lat = latFromMercatorY(y);\n        return new LngLat(lng, lat);\n    }\n}\n","// @flow\nimport LngLat from '../lng_lat.js';\nimport {clamp, degToRad, radToDeg} from '../../util/util.js';\nimport {MAX_MERCATOR_LATITUDE} from '../mercator_coordinate.js';\nimport Projection from './projection.js';\n\nimport type {ProjectedPoint} from './projection.js';\n\nconst maxPhi = degToRad(MAX_MERCATOR_LATITUDE);\n\nexport default class NaturalEarth extends Projection {\n\n    project(lng: number, lat: number): ProjectedPoint {\n        // based on https://github.com/d3/d3-geo, MIT-licensed\n        lat = degToRad(lat);\n        lng = degToRad(lng);\n\n        const phi2 = lat * lat;\n        const phi4 = phi2 * phi2;\n        const x = lng * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4)));\n        const y = lat * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4)));\n\n        return {\n            x: (x / Math.PI + 0.5) * 0.5,\n            y: 1 - (y / Math.PI + 1) * 0.5,\n            z: 0\n        };\n    }\n\n    unproject(x: number, y: number): LngLat {\n        // based on https://github.com/d3/d3-geo, MIT-licensed\n        x = (2 * x - 0.5) * Math.PI;\n        y = (2 * (1 - y) - 1) * Math.PI;\n        const epsilon = 1e-6;\n        let phi = y;\n        let i = 25;\n        let delta = 0;\n        let phi2 = phi * phi;\n\n        do {\n            phi2 = phi * phi;\n            const phi4 = phi2 * phi2;\n            delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) /\n                (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4)));\n            phi = clamp(phi - delta, -maxPhi, maxPhi);\n        } while (Math.abs(delta) > epsilon && --i > 0);\n\n        phi2 = phi * phi;\n        const lambda = x / (0.8707 + phi2 * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2))));\n\n        const lng = clamp(radToDeg(lambda), -180, 180);\n        const lat = radToDeg(phi);\n\n        return new LngLat(lng, lat);\n    }\n}\n","// @flow\nimport LngLat from '../lng_lat.js';\nimport {clamp, degToRad, radToDeg} from '../../util/util.js';\nimport {MAX_MERCATOR_LATITUDE} from '../mercator_coordinate.js';\nimport Projection from './projection.js';\n\nimport type {ProjectedPoint} from './projection.js';\n\nconst maxPhi = degToRad(MAX_MERCATOR_LATITUDE);\n\nexport default class WinkelTripel extends Projection {\n\n    project(lng: number, lat: number): ProjectedPoint {\n        lat = degToRad(lat);\n        lng = degToRad(lng);\n        const cosLat = Math.cos(lat);\n        const twoOverPi = 2 / Math.PI;\n        const alpha = Math.acos(cosLat * Math.cos(lng / 2));\n        const sinAlphaOverAlpha = Math.sin(alpha) / alpha;\n        const x = 0.5 * (lng * twoOverPi + (2 * cosLat * Math.sin(lng / 2)) / sinAlphaOverAlpha) || 0;\n        const y = 0.5 * (lat + Math.sin(lat) / sinAlphaOverAlpha) || 0;\n        return {\n            x: (x / Math.PI + 0.5) * 0.5,\n            y: 1 - (y / Math.PI + 1) * 0.5,\n            z: 0\n        };\n    }\n\n    unproject(x: number, y: number): LngLat {\n        // based on https://github.com/d3/d3-geo-projection, MIT-licensed\n        x = (2 * x - 0.5) * Math.PI;\n        y = (2 * (1 - y) - 1) * Math.PI;\n        let lambda = x;\n        let phi = y;\n        let i = 25;\n        const epsilon = 1e-6;\n        let dlambda = 0, dphi = 0;\n        do {\n            const cosphi = Math.cos(phi),\n                sinphi = Math.sin(phi),\n                sinphi2 = 2 * sinphi * cosphi,\n                sin2phi = sinphi * sinphi,\n                cos2phi = cosphi * cosphi,\n                coslambda2 = Math.cos(lambda / 2),\n                sinlambda2 = Math.sin(lambda / 2),\n                sinlambda = 2 * coslambda2 * sinlambda2,\n                sin2lambda2 = sinlambda2 * sinlambda2,\n                C = 1 - cos2phi * coslambda2 * coslambda2,\n                F = C ? 1 / C : 0,\n                E = C ? Math.acos(cosphi * coslambda2) * Math.sqrt(1 / C) : 0,\n                fx = 0.5 * (2 * E * cosphi * sinlambda2 + lambda * 2 / Math.PI) - x,\n                fy = 0.5 * (E * sinphi + phi) - y,\n                dxdlambda = 0.5 * F * (cos2phi * sin2lambda2 + E * cosphi * coslambda2 * sin2phi) + 1 / Math.PI,\n                dxdphi = F * (sinlambda * sinphi2 / 4 - E * sinphi * sinlambda2),\n                dydlambda = 0.125 * F * (sinphi2 * sinlambda2 - E * sinphi * cos2phi * sinlambda),\n                dydphi = 0.5 * F * (sin2phi * coslambda2 + E * sin2lambda2 * cosphi) + 0.5,\n                denominator = dxdphi * dydlambda - dydphi * dxdlambda;\n\n            dlambda = (fy * dxdphi - fx * dydphi) / denominator;\n            dphi = (fx * dydlambda - fy * dxdlambda) / denominator;\n            lambda = clamp(lambda - dlambda, -Math.PI, Math.PI);\n            phi = clamp(phi - dphi, -maxPhi, maxPhi);\n\n        } while ((Math.abs(dlambda) > epsilon || Math.abs(dphi) > epsilon) && --i > 0);\n\n        return new LngLat(radToDeg(lambda), radToDeg(phi));\n    }\n}\n","// @flow\nimport LngLat from '../lng_lat.js';\nimport {clamp, degToRad, radToDeg} from '../../util/util.js';\nimport {MAX_MERCATOR_LATITUDE} from '../mercator_coordinate.js';\nimport Projection from './projection.js';\n\nimport type {ProjectionSpecification} from '../../style-spec/types.js';\nimport type {ProjectedPoint} from './projection.js';\n\nexport default class CylindricalEqualArea extends Projection {\n    cosPhi: number;\n    scale: number;\n\n    constructor(options: ProjectionSpecification) {\n        super(options);\n        this.center = options.center || [0, 0];\n        this.parallels = options.parallels || [0, 0];\n        this.cosPhi = Math.max(0.01, Math.cos(degToRad(this.parallels[0])));\n        // scale coordinates between 0 and 1 to avoid constraint issues\n        this.scale = 1 / (2 * Math.max(Math.PI * this.cosPhi, 1 / this.cosPhi));\n        this.wrap = true;\n        this.supportsWorldCopies = true;\n    }\n\n    project(lng: number, lat: number): ProjectedPoint {\n        const {scale, cosPhi} = this;\n        const x = degToRad(lng) * cosPhi;\n        const y = Math.sin(degToRad(lat)) / cosPhi;\n\n        return {\n            x: (x * scale) + 0.5,\n            y: (-y * scale) + 0.5,\n            z: 0\n        };\n    }\n\n    unproject(x: number, y: number): LngLat {\n        const {scale, cosPhi} = this;\n        const x_ = (x - 0.5) / scale;\n        const y_ = -(y - 0.5) / scale;\n        const lng = clamp(radToDeg(x_) / cosPhi, -180, 180);\n        const y2 = y_ * cosPhi;\n        const y3 = Math.asin(clamp(y2, -1, 1));\n        const lat = clamp(radToDeg(y3), -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE);\n\n        return new LngLat(lng, lat);\n    }\n}\n","// @flow\nimport {mat4, vec3} from 'gl-matrix';\nimport EXTENT from '../../style-spec/data/extent.js';\nimport LngLat, {latLngToECEF} from '../lng_lat.js';\nimport {degToRad} from '../../util/util.js';\nimport MercatorCoordinate, {\n    mercatorZfromAltitude,\n} from '../mercator_coordinate.js';\nimport Mercator from './mercator.js';\nimport Point from '@mapbox/point-geometry';\nimport {farthestPixelDistanceOnPlane, farthestPixelDistanceOnSphere} from './far_z.js';\nimport {number as interpolate} from '../../style-spec/util/interpolate.js';\nimport {\n    globeTileBounds,\n    globeNormalizeECEF,\n    globeDenormalizeECEF,\n    globeECEFNormalizationScale,\n    globeToMercatorTransition,\n    globePointCoordinate,\n    tileCoordToECEF,\n    globeMetersToEcef\n} from './globe_util.js';\nimport {GLOBE_SCALE_MATCH_LATITUDE} from './globe_constants.js';\n\nimport type Transform from '../transform.js';\nimport type {ElevationScale} from './projection.js';\nimport type {Vec3} from 'gl-matrix';\nimport type {ProjectionSpecification} from '../../style-spec/types.js';\nimport type {CanonicalTileID, UnwrappedTileID} from '../../source/tile_id.js';\n\nexport default class Globe extends Mercator {\n\n    constructor(options: ProjectionSpecification) {\n        super(options);\n        this.requiresDraping = true;\n        this.supportsWorldCopies = false;\n        this.supportsFog = true;\n        this.zAxisUnit = \"pixels\";\n        this.unsupportedLayers = ['debug'];\n        this.range = [3, 5];\n    }\n\n    projectTilePoint(x: number, y: number, id: CanonicalTileID): {x: number, y: number, z: number} {\n        const pos = tileCoordToECEF(x, y, id);\n        const bounds = globeTileBounds(id);\n        const normalizationMatrix = globeNormalizeECEF(bounds);\n        vec3.transformMat4(pos, pos, normalizationMatrix);\n\n        return {x: pos[0], y: pos[1], z: pos[2]};\n    }\n\n    locationPoint(tr: Transform, lngLat: LngLat): Point {\n        const pos = latLngToECEF(lngLat.lat, lngLat.lng);\n        const up = vec3.normalize([], pos);\n\n        const elevation = tr.elevation ?\n            tr.elevation.getAtPointOrZero(tr.locationCoordinate(lngLat), tr._centerAltitude) :\n            tr._centerAltitude;\n\n        const upScale = mercatorZfromAltitude(1, 0) * EXTENT * elevation;\n        vec3.scaleAndAdd(pos, pos, up, upScale);\n        const matrix = mat4.identity(new Float64Array(16));\n        mat4.multiply(matrix, tr.pixelMatrix, tr.globeMatrix);\n        vec3.transformMat4(pos, pos, matrix);\n\n        return new Point(pos[0], pos[1]);\n    }\n\n    pixelsPerMeter(lat: number, worldSize: number): number {\n        return mercatorZfromAltitude(1, 0) * worldSize;\n    }\n\n    pixelSpaceConversion(lat: number, worldSize: number, interpolationT: number): number {\n        // Using only the center latitude to determine scale causes the globe to rapidly change\n        // size as you pan up and down. As you approach the pole, the globe's size approaches infinity.\n        // This is because zoom levels are based on mercator.\n        //\n        // Instead, use a fixed reference latitude at lower zoom levels. And transition between\n        // this latitude and the center's latitude as you zoom in. This is a compromise that\n        // makes globe view more usable with existing camera parameters, styles and data.\n        const centerScale = mercatorZfromAltitude(1, lat) * worldSize;\n        const referenceScale = mercatorZfromAltitude(1, GLOBE_SCALE_MATCH_LATITUDE) * worldSize;\n        const combinedScale = interpolate(referenceScale, centerScale, interpolationT);\n        return this.pixelsPerMeter(lat, worldSize) / combinedScale;\n    }\n\n    createTileMatrix(tr: Transform, worldSize: number, id: UnwrappedTileID): Float64Array {\n        const decode = globeDenormalizeECEF(globeTileBounds(id.canonical));\n        return mat4.multiply(new Float64Array(16), tr.globeMatrix, decode);\n    }\n\n    createInversionMatrix(tr: Transform, id: CanonicalTileID): Float32Array {\n        const {center} = tr;\n        const matrix = globeNormalizeECEF(globeTileBounds(id));\n        mat4.rotateY(matrix, matrix, degToRad(center.lng));\n        mat4.rotateX(matrix, matrix, degToRad(center.lat));\n        mat4.scale(matrix, matrix, [tr._pixelsPerMercatorPixel, tr._pixelsPerMercatorPixel, 1.0]);\n        return Float32Array.from(matrix);\n    }\n\n    pointCoordinate(tr: Transform, x: number, y: number, _: number): MercatorCoordinate {\n        const coord = globePointCoordinate(tr, x, y, true);\n        if (!coord) { return new MercatorCoordinate(0, 0); } // This won't happen, is here for Flow\n        return coord;\n    }\n\n    pointCoordinate3D(tr: Transform, x: number, y: number): ?Vec3 {\n        const coord = this.pointCoordinate(tr, x, y, 0);\n        return [coord.x, coord.y, coord.z];\n    }\n\n    isPointAboveHorizon(tr: Transform, p: Point): boolean {\n        const raycastOnGlobe = globePointCoordinate(tr, p.x, p.y, false);\n        return !raycastOnGlobe;\n    }\n\n    farthestPixelDistance(tr: Transform): number {\n        const pixelsPerMeter = this.pixelsPerMeter(tr.center.lat, tr.worldSize);\n        const globePixelDistance = farthestPixelDistanceOnSphere(tr, pixelsPerMeter);\n        const t = globeToMercatorTransition(tr.zoom);\n        if (t > 0.0) {\n            const mercatorPixelsPerMeter = mercatorZfromAltitude(1, tr.center.lat) * tr.worldSize;\n            const mercatorPixelDistance = farthestPixelDistanceOnPlane(tr, mercatorPixelsPerMeter);\n            const pixelRadius = tr.worldSize / (2.0 * Math.PI);\n            const approxTileArcHalfAngle = Math.max(tr.width, tr.height) / tr.worldSize * Math.PI;\n            const padding = pixelRadius * (1.0 - Math.cos(approxTileArcHalfAngle));\n\n            // During transition to mercator we would like to keep\n            // the far plane lower to ensure that geometries (e.g. circles) that are far away and are not supposed\n            // to be rendered get culled out correctly. see https://github.com/mapbox/mapbox-gl-js/issues/11476\n            // To achieve this we dampen the interpolation.\n            return interpolate(globePixelDistance, mercatorPixelDistance + padding, Math.pow(t, 10.0));\n        }\n        return globePixelDistance;\n    }\n\n    upVector(id: CanonicalTileID, x: number, y: number): Vec3 {\n        return tileCoordToECEF(x, y, id, 1);\n    }\n\n    upVectorScale(id: CanonicalTileID): ElevationScale {\n        return {metersToTile: globeMetersToEcef(globeECEFNormalizationScale(globeTileBounds(id)))};\n    }\n}\n","// @flow\nimport Albers from './albers.js';\nimport EqualEarth from './equal_earth.js';\nimport Equirectangular from './equirectangular.js';\nimport LambertConformalConic from './lambert.js';\nimport Mercator from './mercator.js';\nimport NaturalEarth from './natural_earth.js';\nimport WinkelTripel from './winkel_tripel.js';\nimport CylindricalEqualArea from './cylindrical_equal_area.js';\nimport Globe from './globe.js';\n\nimport type {ProjectionSpecification} from '../../style-spec/types.js';\nimport type Projection from './projection.js';\n\nexport function getProjection(config: ProjectionSpecification): Projection {\n\n    const parallels = config.parallels;\n    const isDegenerateConic = parallels ? Math.abs(parallels[0] + parallels[1]) < 0.01 : false;\n\n    switch (config.name) {\n    case 'mercator':\n        return new Mercator(config);\n    case 'equirectangular':\n        return new Equirectangular(config);\n    case 'naturalEarth':\n        return new NaturalEarth(config);\n    case 'equalEarth':\n        return new EqualEarth(config);\n    case 'winkelTripel':\n        return new WinkelTripel(config);\n    case 'albers':\n        return isDegenerateConic ? new CylindricalEqualArea(config) : new Albers(config);\n    case 'lambertConformalConic':\n        return isDegenerateConic ? new CylindricalEqualArea(config) : new LambertConformalConic(config);\n    case 'globe':\n        return new Globe(config);\n    }\n\n    throw new Error(`Invalid projection name: ${config.name}`);\n}\n","// @flow\n\nimport {symbolLayoutAttributes,\n    symbolGlobeExtAttributes,\n    collisionVertexAttributes,\n    collisionVertexAttributesExt,\n    collisionBoxLayout,\n    dynamicLayoutAttributes,\n    iconTransitioningAttributes,\n    zOffsetAttributes\n} from './symbol_attributes.js';\n\nimport {SymbolLayoutArray,\n    SymbolGlobeExtArray,\n    SymbolDynamicLayoutArray,\n    SymbolOpacityArray,\n    CollisionBoxLayoutArray,\n    CollisionVertexExtArray,\n    CollisionVertexArray,\n    PlacedSymbolArray,\n    SymbolInstanceArray,\n    GlyphOffsetArray,\n    SymbolLineVertexArray,\n    SymbolIconTransitioningArray,\n    ZOffsetVertexArray\n} from '../array_types.js';\n\nimport ONE_EM from '../../symbol/one_em.js';\nimport * as symbolSize from '../../symbol/symbol_size.js';\nimport Point from '@mapbox/point-geometry';\nimport SegmentVector from '../segment.js';\nimport {ProgramConfigurationSet} from '../program_configuration.js';\nimport {TriangleIndexArray, LineIndexArray} from '../index_array_type.js';\nimport transformText from '../../symbol/transform_text.js';\nimport mergeLines from '../../symbol/mergelines.js';\nimport {allowsVerticalWritingMode, stringContainsRTLText} from '../../util/script_detection.js';\nimport {WritingMode} from '../../symbol/shaping.js';\nimport loadGeometry from '../load_geometry.js';\nimport toEvaluationFeature from '../evaluation_feature.js';\nimport {VectorTileFeature} from '@mapbox/vector-tile';\nconst vectorTileFeatureTypes = VectorTileFeature.types;\nimport {verticalizedCharacterMap} from '../../util/verticalize_punctuation.js';\nimport Anchor from '../../symbol/anchor.js';\nimport {getSizeData} from '../../symbol/symbol_size.js';\nimport {MAX_PACKED_SIZE} from '../../symbol/symbol_layout.js';\nimport {register} from '../../util/web_worker_transfer.js';\nimport EvaluationParameters from '../../style/evaluation_parameters.js';\nimport Formatted from '../../style-spec/expression/types/formatted.js';\nimport ResolvedImage from '../../style-spec/expression/types/resolved_image.js';\nimport {plugin as globalRTLTextPlugin, getRTLTextPluginStatus} from '../../source/rtl_text_plugin.js';\nimport {resamplePred} from '../../geo/projection/resample.js';\nimport {tileCoordToECEF} from '../../geo/projection/globe_util.js';\nimport {getProjection} from '../../geo/projection/index.js';\nimport {mat4, vec3} from 'gl-matrix';\nimport assert from 'assert';\nimport type SymbolStyleLayer from '../../style/style_layer/symbol_style_layer.js';\n\nimport type {Class} from '../../types/class.js';\nimport type {ProjectionSpecification} from '../../style-spec/types.js';\nimport type Projection from '../../geo/projection/projection.js';\nimport type {CanonicalTileID, OverscaledTileID} from '../../source/tile_id.js';\nimport type {\n    Bucket,\n    BucketParameters,\n    IndexedFeature,\n    PopulateParameters\n} from '../bucket.js';\nimport type {CollisionBoxArray, CollisionBox, SymbolInstance, StructArrayLayout1f4} from '../array_types.js';\nimport type {StructArray, StructArrayMember} from '../../util/struct_array.js';\nimport type Context from '../../gl/context.js';\nimport type IndexBuffer from '../../gl/index_buffer.js';\nimport type VertexBuffer from '../../gl/vertex_buffer.js';\nimport type {SymbolQuad} from '../../symbol/quads.js';\nimport type {SizeData} from '../../symbol/symbol_size.js';\nimport type {FeatureStates} from '../../source/source_state.js';\nimport type {TileTransform} from '../../geo/projection/tile_transform.js';\n\nexport type SingleCollisionBox = {\n    x1: number;\n    y1: number;\n    x2: number;\n    y2: number;\n    padding: number;\n    projectedAnchorX: number;\n    projectedAnchorY: number;\n    projectedAnchorZ: number;\n    tileAnchorX: number;\n    tileAnchorY: number;\n    elevation?: number;\n    tileID?: OverscaledTileID;\n};\n\nimport type {Mat4, Vec3} from 'gl-matrix';\nimport type {SpritePositions} from '../../util/image.js';\nimport type {IVectorTileLayer} from '@mapbox/vector-tile';\n\nexport type CollisionArrays = {\n    textBox?: SingleCollisionBox;\n    verticalTextBox?: SingleCollisionBox;\n    iconBox?: SingleCollisionBox;\n    verticalIconBox?: SingleCollisionBox;\n    textFeatureIndex?: number;\n    verticalTextFeatureIndex?: number;\n    iconFeatureIndex?: number;\n    verticalIconFeatureIndex?: number;\n};\n\nexport type SymbolFeature = {|\n    sortKey: number | void,\n    text: Formatted | void,\n    icon: ?ResolvedImage,\n    index: number,\n    sourceLayerIndex: number,\n    geometry: Array<Array<Point>>,\n    properties: Object,\n    type: 'Point' | 'LineString' | 'Polygon',\n    id?: any\n|};\n\nexport type SortKeyRange = {\n    sortKey: number,\n    symbolInstanceStart: number,\n    symbolInstanceEnd: number\n};\n\ntype LineVertexRange = {|\n    lineLength: number,\n    lineStartIndex: number\n|};\n\n// Opacity arrays are frequently updated but don't contain a lot of information, so we pack them\n// tight. Each Uint32 is actually four duplicate Uint8s for the four corners of a glyph\n// 7 bits are for the current opacity, and the lowest bit is the target opacity\n\n// actually defined in symbol_attributes.js\n// const placementOpacityAttributes = [\n//     { name: 'a_fade_opacity', components: 1, type: 'Uint32' }\n// ];\nconst shaderOpacityAttributes = [\n    {name: 'a_fade_opacity', components: 1, type: 'Uint8', offset: 0}\n];\n\nfunction addVertex(array: SymbolLayoutArray, tileAnchorX: number, tileAnchorY: number, ox: number, oy: number, tx: number, ty: number, sizeVertex: any, isSDF: boolean, pixelOffsetX: number, pixelOffsetY: number, minFontScaleX: number, minFontScaleY: number) {\n    const aSizeX = sizeVertex ? Math.min(MAX_PACKED_SIZE, Math.round(sizeVertex[0])) : 0;\n    const aSizeY = sizeVertex ? Math.min(MAX_PACKED_SIZE, Math.round(sizeVertex[1])) : 0;\n\n    array.emplaceBack(\n        // a_pos_offset\n        tileAnchorX,\n        tileAnchorY,\n        Math.round(ox * 32),\n        Math.round(oy * 32),\n\n        // a_data\n        tx, // x coordinate of symbol on glyph atlas texture\n        ty, // y coordinate of symbol on glyph atlas texture\n        (aSizeX << 1) + (isSDF ? 1 : 0),\n        aSizeY,\n        pixelOffsetX * 16,\n        pixelOffsetY * 16,\n        minFontScaleX * 256,\n        minFontScaleY * 256\n    );\n}\n\nfunction addTransitioningVertex(array: SymbolIconTransitioningArray, tx: number, ty: number) {\n    array.emplaceBack(tx, ty);\n}\n\nfunction addGlobeVertex(array: SymbolGlobeExtArray, projAnchorX: number, projAnchorY: number, projAnchorZ: number, normX: number, normY: number, normZ: number) {\n    array.emplaceBack(\n        // a_globe_anchor\n        projAnchorX,\n        projAnchorY,\n        projAnchorZ,\n\n        // a_globe_normal\n        normX,\n        normY,\n        normZ\n    );\n}\n\nfunction updateGlobeVertexNormal(array: SymbolGlobeExtArray, vertexIdx: number, normX: number, normY: number, normZ: number) {\n    // Modify float32 array directly. 20 bytes per entry, 3xInt16 for position, 3xfloat32 for normal\n    const offset = vertexIdx * 5 + 2;\n    array.float32[offset + 0] = normX;\n    array.float32[offset + 1] = normY;\n    array.float32[offset + 2] = normZ;\n}\n\nfunction addDynamicAttributes(dynamicLayoutVertexArray: StructArray, x: number, y: number, z: number, angle: number) {\n    dynamicLayoutVertexArray.emplaceBack(x, y, z, angle);\n    dynamicLayoutVertexArray.emplaceBack(x, y, z, angle);\n    dynamicLayoutVertexArray.emplaceBack(x, y, z, angle);\n    dynamicLayoutVertexArray.emplaceBack(x, y, z, angle);\n}\n\nfunction containsRTLText(formattedText: Formatted): boolean {\n    for (const section of formattedText.sections) {\n        if (stringContainsRTLText(section.text)) {\n            return true;\n        }\n    }\n    return false;\n}\n\nexport class SymbolBuffers {\n    layoutVertexArray: SymbolLayoutArray;\n    layoutVertexBuffer: VertexBuffer;\n\n    indexArray: TriangleIndexArray;\n    indexBuffer: IndexBuffer;\n\n    programConfigurations: ProgramConfigurationSet<SymbolStyleLayer>;\n    segments: SegmentVector;\n\n    dynamicLayoutVertexArray: SymbolDynamicLayoutArray;\n    dynamicLayoutVertexBuffer: VertexBuffer;\n\n    opacityVertexArray: SymbolOpacityArray;\n    opacityVertexBuffer: VertexBuffer;\n\n    zOffsetVertexArray: ZOffsetVertexArray;\n    zOffsetVertexBuffer: VertexBuffer;\n\n    iconTransitioningVertexArray: SymbolIconTransitioningArray;\n    iconTransitioningVertexBuffer: ?VertexBuffer;\n\n    globeExtVertexArray: SymbolGlobeExtArray;\n    globeExtVertexBuffer: ?VertexBuffer;\n\n    placedSymbolArray: PlacedSymbolArray;\n\n    constructor(programConfigurations: ProgramConfigurationSet<SymbolStyleLayer>) {\n        this.layoutVertexArray = new SymbolLayoutArray();\n        this.indexArray = new TriangleIndexArray();\n        this.programConfigurations = programConfigurations;\n        this.segments = new SegmentVector();\n        this.dynamicLayoutVertexArray = new SymbolDynamicLayoutArray();\n        this.opacityVertexArray = new SymbolOpacityArray();\n        this.placedSymbolArray = new PlacedSymbolArray();\n        this.iconTransitioningVertexArray = new SymbolIconTransitioningArray();\n        this.globeExtVertexArray = new SymbolGlobeExtArray();\n        this.zOffsetVertexArray = new ZOffsetVertexArray();\n    }\n\n    isEmpty(): boolean {\n        return this.layoutVertexArray.length === 0 &&\n            this.indexArray.length === 0 &&\n            this.dynamicLayoutVertexArray.length === 0 &&\n            this.opacityVertexArray.length === 0 &&\n            this.iconTransitioningVertexArray.length === 0;\n    }\n\n    upload(context: Context, dynamicIndexBuffer: boolean, upload?: boolean, update?: boolean, createZOffsetBuffer?: boolean) {\n        if (this.isEmpty()) {\n            return;\n        }\n\n        if (upload) {\n            this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, symbolLayoutAttributes.members);\n            this.indexBuffer = context.createIndexBuffer(this.indexArray, dynamicIndexBuffer);\n            this.dynamicLayoutVertexBuffer = context.createVertexBuffer(this.dynamicLayoutVertexArray, dynamicLayoutAttributes.members, true);\n            this.opacityVertexBuffer = context.createVertexBuffer(this.opacityVertexArray, shaderOpacityAttributes, true);\n            if (this.iconTransitioningVertexArray.length > 0) {\n                this.iconTransitioningVertexBuffer = context.createVertexBuffer(this.iconTransitioningVertexArray, iconTransitioningAttributes.members, true);\n            }\n            if (this.globeExtVertexArray.length > 0) {\n                this.globeExtVertexBuffer = context.createVertexBuffer(this.globeExtVertexArray, symbolGlobeExtAttributes.members, true);\n            }\n            if (!this.zOffsetVertexBuffer && (this.zOffsetVertexArray.length > 0 || !!createZOffsetBuffer)) {\n                this.zOffsetVertexBuffer = context.createVertexBuffer(this.zOffsetVertexArray, zOffsetAttributes.members, true);\n            }\n            // This is a performance hack so that we can write to opacityVertexArray with uint32s\n            // even though the shaders read uint8s\n            this.opacityVertexBuffer.itemSize = 1;\n        }\n        if (upload || update) {\n            this.programConfigurations.upload(context);\n        }\n    }\n\n    destroy() {\n        if (!this.layoutVertexBuffer) return;\n        this.layoutVertexBuffer.destroy();\n        this.indexBuffer.destroy();\n        this.programConfigurations.destroy();\n        this.segments.destroy();\n        this.dynamicLayoutVertexBuffer.destroy();\n        this.opacityVertexBuffer.destroy();\n        if (this.iconTransitioningVertexBuffer) {\n            this.iconTransitioningVertexBuffer.destroy();\n        }\n        if (this.globeExtVertexBuffer) {\n            this.globeExtVertexBuffer.destroy();\n        }\n        if (this.zOffsetVertexBuffer) {\n            this.zOffsetVertexBuffer.destroy();\n        }\n    }\n}\n\nregister(SymbolBuffers, 'SymbolBuffers');\n\nclass CollisionBuffers {\n    layoutVertexArray: StructArray;\n    layoutAttributes: Array<StructArrayMember>;\n    layoutVertexBuffer: VertexBuffer;\n\n    indexArray: TriangleIndexArray | LineIndexArray;\n    indexBuffer: IndexBuffer;\n\n    segments: SegmentVector;\n\n    collisionVertexArray: CollisionVertexArray;\n    collisionVertexBuffer: VertexBuffer;\n\n    collisionVertexArrayExt: CollisionVertexExtArray;\n    collisionVertexBufferExt: VertexBuffer;\n\n    constructor(LayoutArray: Class<StructArray>,\n                layoutAttributes: Array<StructArrayMember>,\n                IndexArray: Class<TriangleIndexArray | LineIndexArray>) {\n        this.layoutVertexArray = new LayoutArray();\n        this.layoutAttributes = layoutAttributes;\n        this.indexArray = new IndexArray();\n        this.segments = new SegmentVector();\n        this.collisionVertexArray = new CollisionVertexArray();\n        this.collisionVertexArrayExt = new CollisionVertexExtArray();\n    }\n\n    upload(context: Context) {\n        this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, this.layoutAttributes);\n        this.indexBuffer = context.createIndexBuffer(this.indexArray);\n        this.collisionVertexBuffer = context.createVertexBuffer(this.collisionVertexArray, collisionVertexAttributes.members, true);\n        this.collisionVertexBufferExt = context.createVertexBuffer(this.collisionVertexArrayExt, collisionVertexAttributesExt.members, true);\n    }\n\n    destroy() {\n        if (!this.layoutVertexBuffer) return;\n        this.layoutVertexBuffer.destroy();\n        this.indexBuffer.destroy();\n        this.segments.destroy();\n        this.collisionVertexBuffer.destroy();\n        this.collisionVertexBufferExt.destroy();\n    }\n}\n\nregister(CollisionBuffers, 'CollisionBuffers');\n\n/**\n * Unlike other buckets, which simply implement #addFeature with type-specific\n * logic for (essentially) triangulating feature geometries, SymbolBucket\n * requires specialized behavior:\n *\n * 1. WorkerTile#parse(), the logical owner of the bucket creation process,\n *    calls SymbolBucket#populate(), which resolves text and icon tokens on\n *    each feature, adds each glyphs and symbols needed to the passed-in\n *    collections options.glyphDependencies and options.iconDependencies, and\n *    stores the feature data for use in subsequent step (this.features).\n *\n * 2. WorkerTile asynchronously requests from the main thread all of the glyphs\n *    and icons needed (by this bucket and any others). When glyphs and icons\n *    have been received, the WorkerTile creates a CollisionIndex and invokes:\n *\n * 3. performSymbolLayout(bucket, stacks, icons) perform texts shaping and\n *    layout on a Symbol Bucket. This step populates:\n *      `this.symbolInstances`: metadata on generated symbols\n *      `collisionBoxArray`: collision data for use by foreground\n *      `this.text`: SymbolBuffers for text symbols\n *      `this.icons`: SymbolBuffers for icons\n *      `this.iconCollisionBox`: Debug SymbolBuffers for icon collision boxes\n *      `this.textCollisionBox`: Debug SymbolBuffers for text collision boxes\n *    The results are sent to the foreground for rendering\n *\n * 4. Placement.updateBucketOpacities() is run on the foreground,\n *    and uses the CollisionIndex along with current camera settings to determine\n *    which symbols can actually show on the map. Collided symbols are hidden\n *    using a dynamic \"OpacityVertexArray\".\n *\n * @private\n */\nclass SymbolBucket implements Bucket {\n    static addDynamicAttributes: typeof addDynamicAttributes;\n\n    collisionBoxArray: CollisionBoxArray;\n    zoom: number;\n    overscaling: number;\n    layers: Array<SymbolStyleLayer>;\n    layerIds: Array<string>;\n    stateDependentLayers: Array<SymbolStyleLayer>;\n    stateDependentLayerIds: Array<string>;\n\n    index: number;\n    sdfIcons: boolean;\n    iconsInText: boolean;\n    iconsNeedLinear: boolean;\n    bucketInstanceId: number;\n    justReloaded: boolean;\n    hasPattern: boolean;\n    fullyClipped: boolean;\n\n    textSizeData: SizeData;\n    iconSizeData: SizeData;\n\n    glyphOffsetArray: GlyphOffsetArray;\n    lineVertexArray: SymbolLineVertexArray;\n    features: Array<SymbolFeature>;\n    symbolInstances: SymbolInstanceArray;\n    collisionArrays: Array<CollisionArrays>;\n    sortKeyRanges: Array<SortKeyRange>;\n    pixelRatio: number;\n    tilePixelRatio: number;\n    compareText: {[_: string]: Array<Point>};\n    fadeStartTime: number;\n    sortFeaturesByKey: boolean;\n    sortFeaturesByY: boolean;\n    canOverlap: boolean;\n    sortedAngle: number;\n    featureSortOrder: Array<number>;\n\n    collisionCircleArray: Array<number>;\n    placementInvProjMatrix: Mat4;\n    placementViewportMatrix: Mat4;\n\n    text: SymbolBuffers;\n    icon: SymbolBuffers;\n    textCollisionBox: CollisionBuffers;\n    iconCollisionBox: CollisionBuffers;\n    uploaded: boolean;\n    sourceLayerIndex: number;\n    sourceID: string;\n    symbolInstanceIndexes: Array<number>;\n    writingModes: Array<number>;\n    allowVerticalPlacement: boolean;\n    hasRTLText: boolean;\n    projection: ProjectionSpecification;\n    projectionInstance: ?Projection;\n    hasAnyIconTextFit: boolean;\n    hasAnyZOffset: boolean;\n    symbolInstanceIndexesSortedZOffset: Array<number>;\n    zOffsetSortDirty: boolean;\n    zOffsetBuffersNeedUpload: boolean;\n\n    constructor(options: BucketParameters<SymbolStyleLayer>) {\n        this.collisionBoxArray = options.collisionBoxArray;\n        this.zoom = options.zoom;\n        this.overscaling = options.overscaling;\n        this.layers = options.layers;\n        this.layerIds = this.layers.map(layer => layer.fqid);\n        this.index = options.index;\n        this.pixelRatio = options.pixelRatio;\n        this.sourceLayerIndex = options.sourceLayerIndex;\n        this.hasPattern = false;\n        this.hasRTLText = false;\n        this.fullyClipped = false;\n        this.hasAnyIconTextFit = false;\n        this.sortKeyRanges = [];\n\n        this.collisionCircleArray = [];\n        this.placementInvProjMatrix = mat4.identity([]);\n        this.placementViewportMatrix = mat4.identity([]);\n\n        const layer = this.layers[0];\n        const unevaluatedLayoutValues = layer._unevaluatedLayout._values;\n\n        this.textSizeData = getSizeData(this.zoom, unevaluatedLayoutValues['text-size']);\n        this.iconSizeData = getSizeData(this.zoom, unevaluatedLayoutValues['icon-size']);\n\n        const layout = this.layers[0].layout;\n        const sortKey = layout.get('symbol-sort-key');\n        const zOrder = layout.get('symbol-z-order');\n        this.canOverlap =\n            layout.get('text-allow-overlap') ||\n            layout.get('icon-allow-overlap') ||\n            layout.get('text-ignore-placement') ||\n            layout.get('icon-ignore-placement');\n        this.sortFeaturesByKey = zOrder !== 'viewport-y' && sortKey.constantOr(1) !== undefined;\n        const zOrderByViewportY = zOrder === 'viewport-y' || (zOrder === 'auto' && !this.sortFeaturesByKey);\n        this.sortFeaturesByY = zOrderByViewportY && this.canOverlap;\n\n        this.writingModes = layout.get('text-writing-mode').map(wm => WritingMode[wm]);\n\n        this.stateDependentLayerIds = this.layers.filter((l) => l.isStateDependent()).map((l) => l.id);\n\n        this.sourceID = options.sourceID;\n        this.projection = options.projection;\n        this.hasAnyZOffset = false;\n        this.zOffsetSortDirty = false;\n        this.zOffsetBuffersNeedUpload = layout.get('symbol-z-elevate');\n    }\n\n    createArrays() {\n        this.text = new SymbolBuffers(new ProgramConfigurationSet(this.layers, this.zoom, (property) => /^text/.test(property)));\n        this.icon = new SymbolBuffers(new ProgramConfigurationSet(this.layers, this.zoom, (property) => /^icon/.test(property)));\n\n        this.glyphOffsetArray = new GlyphOffsetArray();\n        this.lineVertexArray = new SymbolLineVertexArray();\n        this.symbolInstances = new SymbolInstanceArray();\n    }\n\n    calculateGlyphDependencies(text: string, stack: {[_: number]: boolean}, textAlongLine: boolean, allowVerticalPlacement: boolean, doesAllowVerticalWritingMode: boolean) {\n        for (let i = 0; i < text.length; i++) {\n            const codePoint = text.codePointAt(i);\n            if (codePoint === undefined) break;\n            stack[codePoint] = true;\n            if (allowVerticalPlacement && doesAllowVerticalWritingMode && codePoint <= 65535) {\n                const verticalChar = verticalizedCharacterMap[text.charAt(i)];\n                if (verticalChar) {\n                    stack[verticalChar.charCodeAt(0)] = true;\n                }\n            }\n        }\n    }\n\n    populate(features: Array<IndexedFeature>, options: PopulateParameters, canonical: CanonicalTileID, tileTransform: TileTransform) {\n        const layer = this.layers[0];\n        const layout = layer.layout;\n        const isGlobe = this.projection.name === 'globe';\n\n        const textFont = layout.get('text-font');\n        const textField = layout.get('text-field');\n        const iconImage = layout.get('icon-image');\n        const hasText =\n            (textField.value.kind !== 'constant' ||\n                (textField.value.value instanceof Formatted && !textField.value.value.isEmpty()) ||\n                textField.value.value.toString().length > 0) &&\n            (textFont.value.kind !== 'constant' || textFont.value.value.length > 0);\n        // we should always resolve the icon-image value if the property was defined in the style\n        // this allows us to fire the styleimagemissing event if image evaluation returns null\n        // the only way to distinguish between null returned from a coalesce statement with no valid images\n        // and null returned because icon-image wasn't defined is to check whether or not iconImage.parameters is an empty object\n        const hasIcon = iconImage.value.kind !== 'constant' || !!iconImage.value.value || Object.keys(iconImage.parameters).length > 0;\n        const symbolSortKey = layout.get('symbol-sort-key');\n\n        this.features = [];\n\n        if (!hasText && !hasIcon) {\n            return;\n        }\n\n        const icons = options.iconDependencies;\n        const stacks = options.glyphDependencies;\n        const availableImages = options.availableImages;\n        const globalProperties = new EvaluationParameters(this.zoom);\n\n        for (const {feature, id, index, sourceLayerIndex} of features) {\n\n            const needGeometry = layer._featureFilter.needGeometry;\n            const evaluationFeature = toEvaluationFeature(feature, needGeometry);\n            // $FlowFixMe[method-unbinding]\n            if (!layer._featureFilter.filter(globalProperties, evaluationFeature, canonical)) {\n                continue;\n            }\n\n            if (!needGeometry) evaluationFeature.geometry = loadGeometry(feature, canonical, tileTransform);\n\n            if (isGlobe && feature.type !== 1 && canonical.z <= 5) {\n                // Resample long lines and polygons in globe view so that their length wont exceed ~0.19 radians (360/32 degrees).\n                // Otherwise lines could clip through the globe as the resolution is not enough to represent curved paths.\n                // The threshold value follows subdivision size used with fill extrusions\n                const geom = evaluationFeature.geometry;\n\n                // cos(11.25 degrees) = 0.98078528056\n                const cosAngleThreshold = 0.98078528056;\n                const predicate = (a: Point, b: Point) => {\n                    const v0 = tileCoordToECEF(a.x, a.y, canonical, 1);\n                    const v1 = tileCoordToECEF(b.x, b.y, canonical, 1);\n                    return vec3.dot(v0, v1) < cosAngleThreshold;\n                };\n\n                for (let i = 0; i < geom.length; i++) {\n                    geom[i] = resamplePred(geom[i], predicate);\n                }\n            }\n\n            let text: Formatted | void;\n            if (hasText) {\n                // Expression evaluation will automatically coerce to Formatted\n                // but plain string token evaluation skips that pathway so do the\n                // conversion here.\n                const resolvedTokens = layer.getValueAndResolveTokens('text-field', evaluationFeature, canonical, availableImages);\n                const formattedText = Formatted.factory(resolvedTokens);\n                if (containsRTLText(formattedText)) {\n                    this.hasRTLText = true;\n                }\n                if (\n                    !this.hasRTLText || // non-rtl text so can proceed safely\n                    getRTLTextPluginStatus() === 'unavailable' || // We don't intend to lazy-load the rtl text plugin, so proceed with incorrect shaping\n                    (this.hasRTLText && globalRTLTextPlugin.isParsed()) // Use the rtlText plugin to shape text\n                ) {\n                    text = transformText(formattedText, layer, evaluationFeature);\n                }\n            }\n\n            let icon: ?ResolvedImage;\n            if (hasIcon) {\n                // Expression evaluation will automatically coerce to Image\n                // but plain string token evaluation skips that pathway so do the\n                // conversion here.\n                const resolvedTokens = layer.getValueAndResolveTokens('icon-image', evaluationFeature, canonical, availableImages);\n                if (resolvedTokens instanceof ResolvedImage) {\n                    icon = resolvedTokens;\n                } else {\n                    icon = ResolvedImage.fromString(resolvedTokens);\n                }\n            }\n\n            if (!text && !icon) {\n                continue;\n            }\n            const sortKey = this.sortFeaturesByKey ?\n                symbolSortKey.evaluate(evaluationFeature, {}, canonical) :\n                undefined;\n\n            const symbolFeature: SymbolFeature = {\n                id,\n                text,\n                icon,\n                index,\n                sourceLayerIndex,\n                geometry: evaluationFeature.geometry,\n                properties: feature.properties,\n                type: vectorTileFeatureTypes[feature.type],\n                sortKey\n            };\n            this.features.push(symbolFeature);\n\n            if (icon) {\n                icons[icon.namePrimary] = true;\n                if (icon.nameSecondary) {\n                    icons[icon.nameSecondary] = true;\n                }\n            }\n\n            if (text) {\n                const fontStack = textFont.evaluate(evaluationFeature, {}, canonical).join(',');\n                const textAlongLine = layout.get('text-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point';\n                this.allowVerticalPlacement = this.writingModes && this.writingModes.indexOf(WritingMode.vertical) >= 0;\n                for (const section of text.sections) {\n                    if (!section.image) {\n                        const doesAllowVerticalWritingMode = allowsVerticalWritingMode(text.toString());\n                        const sectionFont = section.fontStack || fontStack;\n                        const sectionStack = stacks[sectionFont] = stacks[sectionFont] || {};\n                        this.calculateGlyphDependencies(section.text, sectionStack, textAlongLine, this.allowVerticalPlacement, doesAllowVerticalWritingMode);\n                    } else {\n                        // Add section image to the list of dependencies.\n                        icons[section.image.namePrimary] = true;\n                    }\n                }\n            }\n        }\n\n        if (layout.get('symbol-placement') === 'line') {\n            // Merge adjacent lines with the same text to improve labelling.\n            // It's better to place labels on one long line than on many short segments.\n            this.features = mergeLines(this.features);\n        }\n\n        if (this.sortFeaturesByKey) {\n            this.features.sort((a, b) => {\n                // a.sortKey is always a number when sortFeaturesByKey is true\n                return ((a.sortKey: any): number) - ((b.sortKey: any): number);\n            });\n        }\n    }\n\n    update(states: FeatureStates, vtLayer: IVectorTileLayer, availableImages: Array<string>, imagePositions: SpritePositions, brightness: ?number) {\n        const withStateUpdates = Object.keys(states).length !== 0;\n        if (withStateUpdates && !this.stateDependentLayers.length) return;\n        const layers = withStateUpdates ? this.stateDependentLayers : this.layers;\n        this.text.programConfigurations.updatePaintArrays(states, vtLayer, layers, availableImages, imagePositions, brightness);\n        this.icon.programConfigurations.updatePaintArrays(states, vtLayer, layers, availableImages, imagePositions, brightness);\n    }\n\n    updateZOffset() {\n        // z offset is expected to change less frequently than the placement opacity and, if values are the same,\n        // avoid uploading arrays to buffers.\n        const addZOffsetTextVertex = (array: StructArrayLayout1f4, numVertices: number, value: number) => {\n            currentTextZOffsetVertex += numVertices;\n            if (currentTextZOffsetVertex > array.length) {\n                array.resize(currentTextZOffsetVertex);\n            }\n            for (let i = -numVertices; i < 0; i++) {\n                array.emplace(i + currentTextZOffsetVertex, value);\n            }\n        };\n        const addZOffsetIconVertex = (array: StructArrayLayout1f4, numVertices: number, value: number) => {\n            currentIconZOffsetVertex += numVertices;\n            if (currentIconZOffsetVertex > array.length) {\n                array.resize(currentIconZOffsetVertex);\n            }\n            for (let i = -numVertices; i < 0; i++) {\n                array.emplace(i + currentIconZOffsetVertex, value);\n            }\n        };\n\n        const updateZOffset = this.zOffsetBuffersNeedUpload;\n        if (!updateZOffset) return;\n        this.zOffsetBuffersNeedUpload = false;\n        let currentTextZOffsetVertex = 0;\n        let currentIconZOffsetVertex = 0;\n        for (let s = 0; s < this.symbolInstances.length; s++) {\n            const symbolInstance = this.symbolInstances.get(s);\n            const {\n                numHorizontalGlyphVertices,\n                numVerticalGlyphVertices,\n                numIconVertices\n            } = symbolInstance;\n            const zOffset = symbolInstance.zOffset;\n            const hasText = numHorizontalGlyphVertices > 0 || numVerticalGlyphVertices > 0;\n            const hasIcon = numIconVertices > 0;\n            if (hasText) {\n                addZOffsetTextVertex(this.text.zOffsetVertexArray, numHorizontalGlyphVertices, zOffset);\n                addZOffsetTextVertex(this.text.zOffsetVertexArray, numVerticalGlyphVertices, zOffset);\n            }\n            if (hasIcon) {\n                const {placedIconSymbolIndex, verticalPlacedIconSymbolIndex} = symbolInstance;\n                if (placedIconSymbolIndex >= 0) {\n                    addZOffsetIconVertex(this.icon.zOffsetVertexArray, numIconVertices, zOffset);\n                }\n\n                if (verticalPlacedIconSymbolIndex >= 0) {\n                    addZOffsetIconVertex(this.icon.zOffsetVertexArray, symbolInstance.numVerticalIconVertices, zOffset);\n                }\n            }\n        }\n\n        if (this.text.zOffsetVertexBuffer) {\n            this.text.zOffsetVertexBuffer.updateData(this.text.zOffsetVertexArray);\n            assert(this.text.zOffsetVertexBuffer.length === this.text.layoutVertexArray.length);\n        }\n        if (this.icon.zOffsetVertexBuffer) {\n            this.icon.zOffsetVertexBuffer.updateData(this.icon.zOffsetVertexArray);\n            assert(this.icon.zOffsetVertexBuffer.length === this.icon.layoutVertexArray.length);\n        }\n\n    }\n\n    isEmpty(): boolean {\n        // When the bucket encounters only rtl-text but the plugin isn't loaded, no symbol instances will be created.\n        // In order for the bucket to be serialized, and not discarded as an empty bucket both checks are necessary.\n        return this.symbolInstances.length === 0 && !this.hasRTLText;\n    }\n\n    uploadPending(): boolean {\n        return !this.uploaded || this.text.programConfigurations.needsUpload || this.icon.programConfigurations.needsUpload;\n    }\n\n    upload(context: Context) {\n        if (!this.uploaded && this.hasDebugData()) {\n            this.textCollisionBox.upload(context);\n            this.iconCollisionBox.upload(context);\n        }\n        this.text.upload(context, this.sortFeaturesByY, !this.uploaded, this.text.programConfigurations.needsUpload, this.zOffsetBuffersNeedUpload);\n        this.icon.upload(context, this.sortFeaturesByY, !this.uploaded, this.icon.programConfigurations.needsUpload, this.zOffsetBuffersNeedUpload);\n        this.uploaded = true;\n    }\n\n    destroyDebugData() {\n        this.textCollisionBox.destroy();\n        this.iconCollisionBox.destroy();\n    }\n\n    getProjection(): Projection {\n        if (!this.projectionInstance) {\n            this.projectionInstance = getProjection(this.projection);\n        }\n        return this.projectionInstance;\n    }\n\n    destroy() {\n        this.text.destroy();\n        this.icon.destroy();\n\n        if (this.hasDebugData()) {\n            this.destroyDebugData();\n        }\n    }\n\n    addToLineVertexArray(anchor: Anchor, line: Array<Point>): LineVertexRange {\n        const lineStartIndex = this.lineVertexArray.length;\n        if (anchor.segment !== undefined) {\n            for (const {x, y} of line) {\n                this.lineVertexArray.emplaceBack(x, y);\n            }\n        }\n        return {\n            lineStartIndex,\n            lineLength: this.lineVertexArray.length - lineStartIndex\n        };\n    }\n\n    addSymbols(arrays: SymbolBuffers,\n               quads: Array<SymbolQuad>,\n               sizeVertex: any,\n               lineOffset: [number, number],\n               alongLine: boolean,\n               feature: SymbolFeature,\n               writingMode: any,\n               globe: ?{ anchor: Anchor, up: Vec3 },\n               tileAnchor: Anchor,\n               lineStartIndex: number,\n               lineLength: number,\n               associatedIconIndex: number,\n               availableImages: Array<string>,\n               canonical: CanonicalTileID,\n               brightness: ?number,\n               hasAnySecondaryIcon: boolean) {\n        const indexArray = arrays.indexArray;\n        const layoutVertexArray = arrays.layoutVertexArray;\n        const globeExtVertexArray = arrays.globeExtVertexArray;\n\n        const segment = arrays.segments.prepareSegment(4 * quads.length, layoutVertexArray, indexArray, this.canOverlap ? feature.sortKey : undefined);\n        const glyphOffsetArrayStart = this.glyphOffsetArray.length;\n        const vertexStartIndex = segment.vertexLength;\n\n        const angle = (this.allowVerticalPlacement && writingMode === WritingMode.vertical) ? Math.PI / 2 : 0;\n\n        const sections = feature.text && feature.text.sections;\n\n        for (let i = 0; i < quads.length; i++) {\n            const {tl, tr, bl, br, texPrimary, texSecondary, pixelOffsetTL, pixelOffsetBR, minFontScaleX, minFontScaleY, glyphOffset, isSDF, sectionIndex} = quads[i];\n            const index = segment.vertexLength;\n\n            const y = glyphOffset[1];\n            addVertex(layoutVertexArray, tileAnchor.x, tileAnchor.y, tl.x, y + tl.y, texPrimary.x, texPrimary.y, sizeVertex, isSDF, pixelOffsetTL.x, pixelOffsetTL.y, minFontScaleX, minFontScaleY);\n            addVertex(layoutVertexArray, tileAnchor.x, tileAnchor.y, tr.x, y + tr.y, texPrimary.x + texPrimary.w, texPrimary.y, sizeVertex, isSDF, pixelOffsetBR.x, pixelOffsetTL.y, minFontScaleX, minFontScaleY);\n            addVertex(layoutVertexArray, tileAnchor.x, tileAnchor.y, bl.x, y + bl.y, texPrimary.x, texPrimary.y + texPrimary.h, sizeVertex, isSDF, pixelOffsetTL.x, pixelOffsetBR.y, minFontScaleX, minFontScaleY);\n            addVertex(layoutVertexArray, tileAnchor.x, tileAnchor.y, br.x, y + br.y, texPrimary.x + texPrimary.w, texPrimary.y + texPrimary.h, sizeVertex, isSDF, pixelOffsetBR.x, pixelOffsetBR.y, minFontScaleX, minFontScaleY);\n\n            if (globe) {\n                const {x, y, z} = globe.anchor;\n                const [ux, uy, uz] = globe.up;\n                addGlobeVertex(globeExtVertexArray, x, y, z, ux, uy, uz);\n                addGlobeVertex(globeExtVertexArray, x, y, z, ux, uy, uz);\n                addGlobeVertex(globeExtVertexArray, x, y, z, ux, uy, uz);\n                addGlobeVertex(globeExtVertexArray, x, y, z, ux, uy, uz);\n\n                addDynamicAttributes(arrays.dynamicLayoutVertexArray, x, y, z, angle);\n            } else {\n                addDynamicAttributes(arrays.dynamicLayoutVertexArray, tileAnchor.x, tileAnchor.y, tileAnchor.z, angle);\n            }\n\n            // For data-driven cases if at least of one the icon has a transitionable variant\n            // we have to load the main variant in cases where the secondary image is not specified\n            if (hasAnySecondaryIcon) {\n                const tex = texSecondary ? texSecondary : texPrimary;\n                addTransitioningVertex(arrays.iconTransitioningVertexArray, tex.x, tex.y);\n                addTransitioningVertex(arrays.iconTransitioningVertexArray, tex.x + tex.w, tex.y);\n                addTransitioningVertex(arrays.iconTransitioningVertexArray, tex.x, tex.y + tex.h);\n                addTransitioningVertex(arrays.iconTransitioningVertexArray, tex.x + tex.w, tex.y + tex.h);\n            }\n\n            indexArray.emplaceBack(index, index + 1, index + 2);\n            indexArray.emplaceBack(index + 1, index + 2, index + 3);\n\n            segment.vertexLength += 4;\n            segment.primitiveLength += 2;\n\n            this.glyphOffsetArray.emplaceBack(glyphOffset[0]);\n\n            if (i === quads.length - 1 || sectionIndex !== quads[i + 1].sectionIndex) {\n                arrays.programConfigurations.populatePaintArrays(layoutVertexArray.length, feature, feature.index, {}, availableImages, canonical, brightness, sections && sections[sectionIndex]);\n            }\n        }\n\n        const projectedAnchor = globe ? globe.anchor : tileAnchor;\n\n        arrays.placedSymbolArray.emplaceBack(projectedAnchor.x, projectedAnchor.y, projectedAnchor.z, tileAnchor.x, tileAnchor.y,\n            glyphOffsetArrayStart, this.glyphOffsetArray.length - glyphOffsetArrayStart, vertexStartIndex,\n            lineStartIndex, lineLength, (tileAnchor.segment: any),\n            sizeVertex ? sizeVertex[0] : 0, sizeVertex ? sizeVertex[1] : 0,\n            lineOffset[0], lineOffset[1],\n            writingMode,\n            // placedOrientation is null initially; will be updated to horizontal(1)/vertical(2) if placed\n            0,\n            (false: any),\n            // The crossTileID is only filled/used on the foreground for dynamic text anchors\n            0,\n            associatedIconIndex,\n            // flipState is unknown initially; will be updated to flipRequired(1)/flipNotRequired(2) during line label reprojection\n            0\n        );\n    }\n\n    _commitLayoutVertex(array: StructArray, boxTileAnchorX: number, boxTileAnchorY: number, boxTileAnchorZ: number, tileAnchorX: number, tileAnchorY: number, extrude: Point) {\n        array.emplaceBack(\n            // pos\n            boxTileAnchorX,\n            boxTileAnchorY,\n            boxTileAnchorZ,\n            // a_anchor_pos\n            tileAnchorX,\n            tileAnchorY,\n            // extrude\n            Math.round(extrude.x),\n            Math.round(extrude.y));\n    }\n\n    _addCollisionDebugVertices(box: CollisionBox, scale: number, arrays: CollisionBuffers, boxTileAnchorX: number, boxTileAnchorY: number, boxTileAnchorZ: number, symbolInstance: SymbolInstance) {\n        const segment = arrays.segments.prepareSegment(4, arrays.layoutVertexArray, arrays.indexArray);\n        const index = segment.vertexLength;\n        const symbolTileAnchorX = symbolInstance.tileAnchorX;\n        const symbolTileAnchorY = symbolInstance.tileAnchorY;\n\n        for (let i = 0; i < 4; i++) {\n            arrays.collisionVertexArray.emplaceBack(0, 0, 0, 0);\n        }\n\n        this._commitDebugCollisionVertexUpdate(arrays.collisionVertexArrayExt, scale, box.padding, symbolInstance.zOffset);\n\n        this._commitLayoutVertex(arrays.layoutVertexArray, boxTileAnchorX, boxTileAnchorY, boxTileAnchorZ, symbolTileAnchorX, symbolTileAnchorY, new Point(box.x1, box.y1));\n        this._commitLayoutVertex(arrays.layoutVertexArray, boxTileAnchorX, boxTileAnchorY, boxTileAnchorZ, symbolTileAnchorX, symbolTileAnchorY, new Point(box.x2, box.y1));\n        this._commitLayoutVertex(arrays.layoutVertexArray, boxTileAnchorX, boxTileAnchorY, boxTileAnchorZ, symbolTileAnchorX, symbolTileAnchorY, new Point(box.x2, box.y2));\n        this._commitLayoutVertex(arrays.layoutVertexArray, boxTileAnchorX, boxTileAnchorY, boxTileAnchorZ, symbolTileAnchorX, symbolTileAnchorY, new Point(box.x1, box.y2));\n\n        segment.vertexLength += 4;\n\n        const indexArray: LineIndexArray = (arrays.indexArray: any);\n        indexArray.emplaceBack(index, index + 1);\n        indexArray.emplaceBack(index + 1, index + 2);\n        indexArray.emplaceBack(index + 2, index + 3);\n        indexArray.emplaceBack(index + 3, index);\n\n        segment.primitiveLength += 4;\n    }\n\n    _addTextDebugCollisionBoxes(size: any, zoom: number, collisionBoxArray: CollisionBoxArray, startIndex: number, endIndex: number, instance: SymbolInstance) {\n        for (let b = startIndex; b < endIndex; b++) {\n            const box: CollisionBox = (collisionBoxArray.get(b): any);\n            const scale = this.getSymbolInstanceTextSize(size, instance, zoom, b);\n\n            this._addCollisionDebugVertices(box, scale, this.textCollisionBox, box.projectedAnchorX, box.projectedAnchorY, box.projectedAnchorZ, instance);\n        }\n    }\n\n    _addIconDebugCollisionBoxes(size: any, zoom: number, collisionBoxArray: CollisionBoxArray, startIndex: number, endIndex: number, instance: SymbolInstance) {\n        for (let b = startIndex; b < endIndex; b++) {\n            const box: CollisionBox = (collisionBoxArray.get(b): any);\n            const scale = this.getSymbolInstanceIconSize(size, zoom, instance.placedIconSymbolIndex);\n\n            this._addCollisionDebugVertices(box, scale, this.iconCollisionBox, box.projectedAnchorX, box.projectedAnchorY, box.projectedAnchorZ, instance);\n        }\n    }\n\n    generateCollisionDebugBuffers(zoom: number, collisionBoxArray: CollisionBoxArray) {\n        if (this.hasDebugData()) {\n            this.destroyDebugData();\n        }\n\n        this.textCollisionBox = new CollisionBuffers(CollisionBoxLayoutArray, collisionBoxLayout.members, LineIndexArray);\n        this.iconCollisionBox = new CollisionBuffers(CollisionBoxLayoutArray, collisionBoxLayout.members, LineIndexArray);\n\n        const iconSize = symbolSize.evaluateSizeForZoom(this.iconSizeData, zoom);\n        const textSize = symbolSize.evaluateSizeForZoom(this.textSizeData, zoom);\n\n        for (let i = 0; i < this.symbolInstances.length; i++) {\n            const symbolInstance = this.symbolInstances.get(i);\n            this._addTextDebugCollisionBoxes(textSize, zoom, collisionBoxArray, symbolInstance.textBoxStartIndex, symbolInstance.textBoxEndIndex, symbolInstance);\n            this._addTextDebugCollisionBoxes(textSize, zoom, collisionBoxArray, symbolInstance.verticalTextBoxStartIndex, symbolInstance.verticalTextBoxEndIndex, symbolInstance);\n            this._addIconDebugCollisionBoxes(iconSize, zoom, collisionBoxArray, symbolInstance.iconBoxStartIndex, symbolInstance.iconBoxEndIndex, symbolInstance);\n            this._addIconDebugCollisionBoxes(iconSize, zoom, collisionBoxArray, symbolInstance.verticalIconBoxStartIndex, symbolInstance.verticalIconBoxEndIndex, symbolInstance);\n        }\n    }\n\n    getSymbolInstanceTextSize(textSize: any, instance: SymbolInstance, zoom: number, boxIndex: number): number {\n        const symbolIndex = instance.rightJustifiedTextSymbolIndex >= 0 ?\n            instance.rightJustifiedTextSymbolIndex : instance.centerJustifiedTextSymbolIndex >= 0 ?\n                instance.centerJustifiedTextSymbolIndex : instance.leftJustifiedTextSymbolIndex >= 0 ?\n                    instance.leftJustifiedTextSymbolIndex : instance.verticalPlacedTextSymbolIndex >= 0 ?\n                        instance.verticalPlacedTextSymbolIndex : boxIndex;\n\n        const symbol = this.text.placedSymbolArray.get(symbolIndex);\n        const featureSize = symbolSize.evaluateSizeForFeature(this.textSizeData, textSize, symbol) / ONE_EM;\n\n        return this.tilePixelRatio * featureSize;\n    }\n\n    getSymbolInstanceIconSize(iconSize: any, zoom: number, iconIndex: number): number {\n        const symbol = this.icon.placedSymbolArray.get(iconIndex);\n        const featureSize = symbolSize.evaluateSizeForFeature(this.iconSizeData, iconSize, symbol);\n\n        return this.tilePixelRatio * featureSize;\n    }\n\n    _commitDebugCollisionVertexUpdate(array: StructArray, scale: number, padding: number, zOffset: number) {\n        array.emplaceBack(scale, -padding, -padding, zOffset);\n        array.emplaceBack(scale,  padding, -padding, zOffset);\n        array.emplaceBack(scale,  padding,  padding, zOffset);\n        array.emplaceBack(scale, -padding,  padding, zOffset);\n    }\n\n    _updateTextDebugCollisionBoxes(size: any, zoom: number, collisionBoxArray: CollisionBoxArray, startIndex: number, endIndex: number, instance: SymbolInstance) {\n        for (let b = startIndex; b < endIndex; b++) {\n            const box: CollisionBox = (collisionBoxArray.get(b): any);\n            const scale = this.getSymbolInstanceTextSize(size, instance, zoom, b);\n            const array = this.textCollisionBox.collisionVertexArrayExt;\n            this._commitDebugCollisionVertexUpdate(array, scale, box.padding, instance.zOffset);\n        }\n    }\n\n    _updateIconDebugCollisionBoxes(size: any, zoom: number, collisionBoxArray: CollisionBoxArray, startIndex: number, endIndex: number, instance: SymbolInstance) {\n        for (let b = startIndex; b < endIndex; b++) {\n            const box = (collisionBoxArray.get(b));\n            const scale = this.getSymbolInstanceIconSize(size, zoom, instance.placedIconSymbolIndex);\n            const array = this.iconCollisionBox.collisionVertexArrayExt;\n            this._commitDebugCollisionVertexUpdate(array, scale, box.padding, instance.zOffset);\n        }\n    }\n\n    updateCollisionDebugBuffers(zoom: number, collisionBoxArray: CollisionBoxArray) {\n        if (!this.hasDebugData()) {\n            return;\n        }\n\n        if (this.hasTextCollisionBoxData()) this.textCollisionBox.collisionVertexArrayExt.clear();\n        if (this.hasIconCollisionBoxData()) this.iconCollisionBox.collisionVertexArrayExt.clear();\n\n        const iconSize = symbolSize.evaluateSizeForZoom(this.iconSizeData, zoom);\n        const textSize = symbolSize.evaluateSizeForZoom(this.textSizeData, zoom);\n\n        for (let i = 0; i < this.symbolInstances.length; i++) {\n            const symbolInstance = this.symbolInstances.get(i);\n            this._updateTextDebugCollisionBoxes(textSize, zoom, collisionBoxArray, symbolInstance.textBoxStartIndex, symbolInstance.textBoxEndIndex, symbolInstance);\n            this._updateTextDebugCollisionBoxes(textSize, zoom, collisionBoxArray, symbolInstance.verticalTextBoxStartIndex, symbolInstance.verticalTextBoxEndIndex, symbolInstance);\n            this._updateIconDebugCollisionBoxes(iconSize, zoom, collisionBoxArray, symbolInstance.iconBoxStartIndex, symbolInstance.iconBoxEndIndex, symbolInstance);\n            this._updateIconDebugCollisionBoxes(iconSize, zoom, collisionBoxArray, symbolInstance.verticalIconBoxStartIndex, symbolInstance.verticalIconBoxEndIndex, symbolInstance);\n        }\n\n        if (this.hasTextCollisionBoxData() && this.textCollisionBox.collisionVertexBufferExt) {\n            this.textCollisionBox.collisionVertexBufferExt.updateData(this.textCollisionBox.collisionVertexArrayExt);\n        }\n        if (this.hasIconCollisionBoxData() && this.iconCollisionBox.collisionVertexBufferExt) {\n            this.iconCollisionBox.collisionVertexBufferExt.updateData(this.iconCollisionBox.collisionVertexArrayExt);\n        }\n    }\n\n    // These flat arrays are meant to be quicker to iterate over than the source\n    // CollisionBoxArray\n    _deserializeCollisionBoxesForSymbol(collisionBoxArray: CollisionBoxArray,\n        textStartIndex: number, textEndIndex: number,\n        verticalTextStartIndex: number, verticalTextEndIndex: number,\n        iconStartIndex: number, iconEndIndex: number,\n        verticalIconStartIndex: number, verticalIconEndIndex: number): CollisionArrays {\n\n        // Only one box allowed per instance\n        const collisionArrays = {};\n        if (textStartIndex < textEndIndex) {\n            const {x1, y1, x2, y2, padding, projectedAnchorX, projectedAnchorY, projectedAnchorZ, tileAnchorX, tileAnchorY, featureIndex} = collisionBoxArray.get(textStartIndex);\n            collisionArrays.textBox = {x1, y1, x2, y2, padding, projectedAnchorX, projectedAnchorY, projectedAnchorZ, tileAnchorX, tileAnchorY};\n            collisionArrays.textFeatureIndex = featureIndex;\n        }\n        if (verticalTextStartIndex < verticalTextEndIndex) {\n            const {x1, y1, x2, y2, padding, projectedAnchorX, projectedAnchorY, projectedAnchorZ, tileAnchorX, tileAnchorY, featureIndex} = collisionBoxArray.get(verticalTextStartIndex);\n            collisionArrays.verticalTextBox = {x1, y1, x2, y2, padding, projectedAnchorX, projectedAnchorY, projectedAnchorZ, tileAnchorX, tileAnchorY};\n            collisionArrays.verticalTextFeatureIndex = featureIndex;\n        }\n        if (iconStartIndex < iconEndIndex) {\n            const {x1, y1, x2, y2, padding, projectedAnchorX, projectedAnchorY, projectedAnchorZ, tileAnchorX, tileAnchorY, featureIndex} = collisionBoxArray.get(iconStartIndex);\n            collisionArrays.iconBox = {x1, y1, x2, y2, padding, projectedAnchorX, projectedAnchorY, projectedAnchorZ, tileAnchorX, tileAnchorY};\n            collisionArrays.iconFeatureIndex = featureIndex;\n        }\n        if (verticalIconStartIndex < verticalIconEndIndex) {\n            const {x1, y1, x2, y2, padding, projectedAnchorX, projectedAnchorY, projectedAnchorZ, tileAnchorX, tileAnchorY, featureIndex} = collisionBoxArray.get(verticalIconStartIndex);\n            collisionArrays.verticalIconBox = {x1, y1, x2, y2, padding, projectedAnchorX, projectedAnchorY, projectedAnchorZ, tileAnchorX, tileAnchorY};\n            collisionArrays.verticalIconFeatureIndex = featureIndex;\n        }\n        return collisionArrays;\n    }\n\n    deserializeCollisionBoxes(collisionBoxArray: CollisionBoxArray) {\n        this.collisionArrays = [];\n        for (let i = 0; i < this.symbolInstances.length; i++) {\n            const symbolInstance = this.symbolInstances.get(i);\n            this.collisionArrays.push(this._deserializeCollisionBoxesForSymbol(\n                collisionBoxArray,\n                symbolInstance.textBoxStartIndex,\n                symbolInstance.textBoxEndIndex,\n                symbolInstance.verticalTextBoxStartIndex,\n                symbolInstance.verticalTextBoxEndIndex,\n                symbolInstance.iconBoxStartIndex,\n                symbolInstance.iconBoxEndIndex,\n                symbolInstance.verticalIconBoxStartIndex,\n                symbolInstance.verticalIconBoxEndIndex\n            ));\n        }\n    }\n\n    hasTextData(): boolean {\n        return this.text.segments.get().length > 0;\n    }\n\n    hasIconData(): boolean {\n        return this.icon.segments.get().length > 0;\n    }\n\n    hasDebugData(): CollisionBuffers {\n        return this.textCollisionBox && this.iconCollisionBox;\n    }\n\n    hasTextCollisionBoxData(): boolean {\n        return this.hasDebugData() && this.textCollisionBox.segments.get().length > 0;\n    }\n\n    hasIconCollisionBoxData(): boolean {\n        return this.hasDebugData() && this.iconCollisionBox.segments.get().length > 0;\n    }\n\n    hasIconTextFit(): boolean {\n        return this.hasAnyIconTextFit;\n    }\n\n    addIndicesForPlacedSymbol(iconOrText: SymbolBuffers, placedSymbolIndex: number) {\n        const placedSymbol = iconOrText.placedSymbolArray.get(placedSymbolIndex);\n\n        const endIndex = placedSymbol.vertexStartIndex + placedSymbol.numGlyphs * 4;\n        for (let vertexIndex = placedSymbol.vertexStartIndex; vertexIndex < endIndex; vertexIndex += 4) {\n            iconOrText.indexArray.emplaceBack(vertexIndex, vertexIndex + 1, vertexIndex + 2);\n            iconOrText.indexArray.emplaceBack(vertexIndex + 1, vertexIndex + 2, vertexIndex + 3);\n        }\n    }\n\n    getSortedSymbolIndexes(angle: number): Array<number> {\n        if (this.sortedAngle === angle && this.symbolInstanceIndexes !== undefined) {\n            return this.symbolInstanceIndexes;\n        }\n        const sin = Math.sin(angle);\n        const cos = Math.cos(angle);\n        const rotatedYs = [];\n        const featureIndexes = [];\n        const result = [];\n\n        for (let i = 0; i < this.symbolInstances.length; ++i) {\n            result.push(i);\n            const symbolInstance = this.symbolInstances.get(i);\n            rotatedYs.push(Math.round(sin * symbolInstance.tileAnchorX + cos * symbolInstance.tileAnchorY) | 0);\n            featureIndexes.push(symbolInstance.featureIndex);\n        }\n\n        result.sort((aIndex, bIndex) => (rotatedYs[aIndex] - rotatedYs[bIndex]) || (featureIndexes[bIndex] - featureIndexes[aIndex]));\n\n        return result;\n    }\n\n    getSortedIndexesByZOffset(): Array<number> {\n        if (!this.zOffsetSortDirty) {\n            assert(this.symbolInstanceIndexesSortedZOffset.length === this.symbolInstances.length);\n            return this.symbolInstanceIndexesSortedZOffset;\n        }\n        if (!this.symbolInstanceIndexesSortedZOffset) {\n            this.symbolInstanceIndexesSortedZOffset = [];\n            for (let i = 0; i < this.symbolInstances.length; ++i) {\n                this.symbolInstanceIndexesSortedZOffset.push(i);\n            }\n        }\n        this.zOffsetSortDirty = false;\n        return this.symbolInstanceIndexesSortedZOffset.sort((aIndex, bIndex) => this.symbolInstances.get(bIndex).zOffset - this.symbolInstances.get(aIndex).zOffset);\n    }\n\n    addToSortKeyRanges(symbolInstanceIndex: number, sortKey: number) {\n        const last = this.sortKeyRanges[this.sortKeyRanges.length - 1];\n        if (last && last.sortKey === sortKey) {\n            last.symbolInstanceEnd = symbolInstanceIndex + 1;\n        } else {\n            this.sortKeyRanges.push({\n                sortKey,\n                symbolInstanceStart: symbolInstanceIndex,\n                symbolInstanceEnd: symbolInstanceIndex + 1\n            });\n        }\n    }\n\n    sortFeatures(angle: number) {\n        if (!this.sortFeaturesByY) return;\n        if (this.sortedAngle === angle) return;\n\n        // The current approach to sorting doesn't sort across segments so don't try.\n        // Sorting within segments separately seemed not to be worth the complexity.\n        if (this.text.segments.get().length > 1 || this.icon.segments.get().length > 1) return;\n\n        // If the symbols are allowed to overlap sort them by their vertical screen position.\n        // The index array buffer is rewritten to reference the (unchanged) vertices in the\n        // sorted order.\n\n        // To avoid sorting the actual symbolInstance array we sort an array of indexes.\n        this.symbolInstanceIndexes = this.getSortedSymbolIndexes(angle);\n        this.sortedAngle = angle;\n\n        this.text.indexArray.clear();\n        this.icon.indexArray.clear();\n\n        this.featureSortOrder = [];\n\n        for (const i of this.symbolInstanceIndexes) {\n            const symbol = this.symbolInstances.get(i);\n            this.featureSortOrder.push(symbol.featureIndex);\n            const {\n                rightJustifiedTextSymbolIndex: right, centerJustifiedTextSymbolIndex: center,\n                leftJustifiedTextSymbolIndex: left, verticalPlacedTextSymbolIndex: vertical,\n                placedIconSymbolIndex: icon, verticalPlacedIconSymbolIndex: iconVertical\n            } = symbol;\n\n            // Only add a given index the first time it shows up, to avoid duplicate\n            // opacity entries when multiple justifications share the same glyphs.\n            if (right >= 0) this.addIndicesForPlacedSymbol(this.text, right);\n            if (center >= 0 && center !== right) this.addIndicesForPlacedSymbol(this.text, center);\n            if (left >= 0 && left !== center && left !== right) this.addIndicesForPlacedSymbol(this.text, left);\n\n            if (vertical >= 0) this.addIndicesForPlacedSymbol(this.text, vertical);\n            if (icon >= 0) this.addIndicesForPlacedSymbol(this.icon, icon);\n            if (iconVertical >= 0) this.addIndicesForPlacedSymbol(this.icon, iconVertical);\n        }\n\n        if (this.text.indexBuffer) this.text.indexBuffer.updateData(this.text.indexArray);\n        if (this.icon.indexBuffer) this.icon.indexBuffer.updateData(this.icon.indexArray);\n    }\n}\n\nregister(SymbolBucket, 'SymbolBucket', {\n    omit: ['layers', 'collisionBoxArray', 'features', 'compareText']\n});\n\nSymbolBucket.addDynamicAttributes = addDynamicAttributes;\n\nexport default SymbolBucket;\nexport {addDynamicAttributes, updateGlobeVertexNormal};\n","// @flow\n\nimport type Point from '@mapbox/point-geometry';\nimport type {SymbolFeature} from '../data/bucket/symbol_bucket.js';\n\nexport default function (features: Array<SymbolFeature>): Array<SymbolFeature> {\n    const leftIndex: {[_: string]: number} = {};\n    const rightIndex: {[_: string]: number} = {};\n    const mergedFeatures = [];\n    let mergedIndex = 0;\n\n    function add(k: number) {\n        mergedFeatures.push(features[k]);\n        mergedIndex++;\n    }\n\n    function mergeFromRight(leftKey: string, rightKey: string, geom: Array<Array<Point>>) {\n        const i = rightIndex[leftKey];\n        delete rightIndex[leftKey];\n        rightIndex[rightKey] = i;\n\n        mergedFeatures[i].geometry[0].pop();\n        mergedFeatures[i].geometry[0] = mergedFeatures[i].geometry[0].concat(geom[0]);\n        return i;\n    }\n\n    function mergeFromLeft(leftKey: string, rightKey: string, geom: Array<Array<Point>>) {\n        const i = leftIndex[rightKey];\n        delete leftIndex[rightKey];\n        leftIndex[leftKey] = i;\n\n        mergedFeatures[i].geometry[0].shift();\n        mergedFeatures[i].geometry[0] = geom[0].concat(mergedFeatures[i].geometry[0]);\n        return i;\n    }\n\n    function getKey(text: string, geom: Array<Array<Point>>, onRight: ?boolean) {\n        const point = onRight ? geom[0][geom[0].length - 1] : geom[0][0];\n        return `${text}:${point.x}:${point.y}`;\n    }\n\n    for (let k = 0; k < features.length; k++) {\n        const feature = features[k];\n        const geom = feature.geometry;\n        const text = feature.text ? feature.text.toString() : null;\n\n        if (!text) {\n            add(k);\n            continue;\n        }\n\n        const leftKey = getKey(text, geom),\n            rightKey = getKey(text, geom, true);\n\n        if ((leftKey in rightIndex) && (rightKey in leftIndex) && (rightIndex[leftKey] !== leftIndex[rightKey])) {\n            // found lines with the same text adjacent to both ends of the current line, merge all three\n            const j = mergeFromLeft(leftKey, rightKey, geom);\n            const i = mergeFromRight(leftKey, rightKey, mergedFeatures[j].geometry);\n\n            delete leftIndex[leftKey];\n            delete rightIndex[rightKey];\n\n            rightIndex[getKey(text, mergedFeatures[i].geometry, true)] = i;\n            mergedFeatures[j].geometry = (null: any);\n\n        } else if (leftKey in rightIndex) {\n            // found mergeable line adjacent to the start of the current line, merge\n            mergeFromRight(leftKey, rightKey, geom);\n\n        } else if (rightKey in leftIndex) {\n            // found mergeable line adjacent to the end of the current line, merge\n            mergeFromLeft(leftKey, rightKey, geom);\n\n        } else {\n            // no adjacent lines, add as a new item\n            add(k);\n            leftIndex[leftKey] = mergedIndex - 1;\n            rightIndex[rightKey] = mergedIndex - 1;\n        }\n    }\n\n    return mergedFeatures.filter((f) => f.geometry);\n}\n","// This file is generated. Edit build/generate-style-code.js, then run `npm run codegen`.\n// @flow\n/* eslint-disable */\n\nimport styleSpec from '../../style-spec/reference/latest.js';\n\nimport {\n    Properties,\n    DataConstantProperty,\n    DataDrivenProperty,\n    ColorRampProperty\n} from '../properties.js';\n\nimport type Color from '../../style-spec/util/color.js';\n\nimport type Formatted from '../../style-spec/expression/types/formatted.js';\n\nimport type ResolvedImage from '../../style-spec/expression/types/resolved_image.js';\n\nimport {\n    ColorType\n} from '../../style-spec/expression/types.js';\n\nexport type LayoutProps = {|\n    \"symbol-placement\": DataConstantProperty<\"point\" | \"line\" | \"line-center\">,\n    \"symbol-spacing\": DataConstantProperty<number>,\n    \"symbol-avoid-edges\": DataConstantProperty<boolean>,\n    \"symbol-sort-key\": DataDrivenProperty<number>,\n    \"symbol-z-order\": DataConstantProperty<\"auto\" | \"viewport-y\" | \"source\">,\n    \"symbol-z-elevate\": DataConstantProperty<boolean>,\n    \"icon-allow-overlap\": DataConstantProperty<boolean>,\n    \"icon-ignore-placement\": DataConstantProperty<boolean>,\n    \"icon-optional\": DataConstantProperty<boolean>,\n    \"icon-rotation-alignment\": DataConstantProperty<\"map\" | \"viewport\" | \"auto\">,\n    \"icon-size\": DataDrivenProperty<number>,\n    \"icon-text-fit\": DataDrivenProperty<\"none\" | \"width\" | \"height\" | \"both\">,\n    \"icon-text-fit-padding\": DataDrivenProperty<[number, number, number, number]>,\n    \"icon-image\": DataDrivenProperty<ResolvedImage>,\n    \"icon-rotate\": DataDrivenProperty<number>,\n    \"icon-padding\": DataConstantProperty<number>,\n    \"icon-keep-upright\": DataConstantProperty<boolean>,\n    \"icon-offset\": DataDrivenProperty<[number, number]>,\n    \"icon-anchor\": DataDrivenProperty<\"center\" | \"left\" | \"right\" | \"top\" | \"bottom\" | \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\">,\n    \"icon-pitch-alignment\": DataConstantProperty<\"map\" | \"viewport\" | \"auto\">,\n    \"text-pitch-alignment\": DataConstantProperty<\"map\" | \"viewport\" | \"auto\">,\n    \"text-rotation-alignment\": DataConstantProperty<\"map\" | \"viewport\" | \"auto\">,\n    \"text-field\": DataDrivenProperty<Formatted>,\n    \"text-font\": DataDrivenProperty<Array<string>>,\n    \"text-size\": DataDrivenProperty<number>,\n    \"text-max-width\": DataDrivenProperty<number>,\n    \"text-line-height\": DataDrivenProperty<number>,\n    \"text-letter-spacing\": DataDrivenProperty<number>,\n    \"text-justify\": DataDrivenProperty<\"auto\" | \"left\" | \"center\" | \"right\">,\n    \"text-radial-offset\": DataDrivenProperty<number>,\n    \"text-variable-anchor\": DataConstantProperty<Array<\"center\" | \"left\" | \"right\" | \"top\" | \"bottom\" | \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\">>,\n    \"text-anchor\": DataDrivenProperty<\"center\" | \"left\" | \"right\" | \"top\" | \"bottom\" | \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\">,\n    \"text-max-angle\": DataConstantProperty<number>,\n    \"text-writing-mode\": DataConstantProperty<Array<\"horizontal\" | \"vertical\">>,\n    \"text-rotate\": DataDrivenProperty<number>,\n    \"text-padding\": DataConstantProperty<number>,\n    \"text-keep-upright\": DataConstantProperty<boolean>,\n    \"text-transform\": DataDrivenProperty<\"none\" | \"uppercase\" | \"lowercase\">,\n    \"text-offset\": DataDrivenProperty<[number, number]>,\n    \"text-allow-overlap\": DataConstantProperty<boolean>,\n    \"text-ignore-placement\": DataConstantProperty<boolean>,\n    \"text-optional\": DataConstantProperty<boolean>,\n    \"visibility\": DataConstantProperty<\"visible\" | \"none\">,\n|};\n\nconst layout: Properties<LayoutProps> = new Properties({\n    \"symbol-placement\": new DataConstantProperty(styleSpec[\"layout_symbol\"][\"symbol-placement\"]),\n    \"symbol-spacing\": new DataConstantProperty(styleSpec[\"layout_symbol\"][\"symbol-spacing\"]),\n    \"symbol-avoid-edges\": new DataConstantProperty(styleSpec[\"layout_symbol\"][\"symbol-avoid-edges\"]),\n    \"symbol-sort-key\": new DataDrivenProperty(styleSpec[\"layout_symbol\"][\"symbol-sort-key\"]),\n    \"symbol-z-order\": new DataConstantProperty(styleSpec[\"layout_symbol\"][\"symbol-z-order\"]),\n    \"symbol-z-elevate\": new DataConstantProperty(styleSpec[\"layout_symbol\"][\"symbol-z-elevate\"]),\n    \"icon-allow-overlap\": new DataConstantProperty(styleSpec[\"layout_symbol\"][\"icon-allow-overlap\"]),\n    \"icon-ignore-placement\": new DataConstantProperty(styleSpec[\"layout_symbol\"][\"icon-ignore-placement\"]),\n    \"icon-optional\": new DataConstantProperty(styleSpec[\"layout_symbol\"][\"icon-optional\"]),\n    \"icon-rotation-alignment\": new DataConstantProperty(styleSpec[\"layout_symbol\"][\"icon-rotation-alignment\"]),\n    \"icon-size\": new DataDrivenProperty(styleSpec[\"layout_symbol\"][\"icon-size\"]),\n    \"icon-text-fit\": new DataDrivenProperty(styleSpec[\"layout_symbol\"][\"icon-text-fit\"]),\n    \"icon-text-fit-padding\": new DataDrivenProperty(styleSpec[\"layout_symbol\"][\"icon-text-fit-padding\"]),\n    \"icon-image\": new DataDrivenProperty(styleSpec[\"layout_symbol\"][\"icon-image\"]),\n    \"icon-rotate\": new DataDrivenProperty(styleSpec[\"layout_symbol\"][\"icon-rotate\"]),\n    \"icon-padding\": new DataConstantProperty(styleSpec[\"layout_symbol\"][\"icon-padding\"]),\n    \"icon-keep-upright\": new DataConstantProperty(styleSpec[\"layout_symbol\"][\"icon-keep-upright\"]),\n    \"icon-offset\": new DataDrivenProperty(styleSpec[\"layout_symbol\"][\"icon-offset\"]),\n    \"icon-anchor\": new DataDrivenProperty(styleSpec[\"layout_symbol\"][\"icon-anchor\"]),\n    \"icon-pitch-alignment\": new DataConstantProperty(styleSpec[\"layout_symbol\"][\"icon-pitch-alignment\"]),\n    \"text-pitch-alignment\": new DataConstantProperty(styleSpec[\"layout_symbol\"][\"text-pitch-alignment\"]),\n    \"text-rotation-alignment\": new DataConstantProperty(styleSpec[\"layout_symbol\"][\"text-rotation-alignment\"]),\n    \"text-field\": new DataDrivenProperty(styleSpec[\"layout_symbol\"][\"text-field\"]),\n    \"text-font\": new DataDrivenProperty(styleSpec[\"layout_symbol\"][\"text-font\"]),\n    \"text-size\": new DataDrivenProperty(styleSpec[\"layout_symbol\"][\"text-size\"]),\n    \"text-max-width\": new DataDrivenProperty(styleSpec[\"layout_symbol\"][\"text-max-width\"]),\n    \"text-line-height\": new DataDrivenProperty(styleSpec[\"layout_symbol\"][\"text-line-height\"]),\n    \"text-letter-spacing\": new DataDrivenProperty(styleSpec[\"layout_symbol\"][\"text-letter-spacing\"]),\n    \"text-justify\": new DataDrivenProperty(styleSpec[\"layout_symbol\"][\"text-justify\"]),\n    \"text-radial-offset\": new DataDrivenProperty(styleSpec[\"layout_symbol\"][\"text-radial-offset\"]),\n    \"text-variable-anchor\": new DataConstantProperty(styleSpec[\"layout_symbol\"][\"text-variable-anchor\"]),\n    \"text-anchor\": new DataDrivenProperty(styleSpec[\"layout_symbol\"][\"text-anchor\"]),\n    \"text-max-angle\": new DataConstantProperty(styleSpec[\"layout_symbol\"][\"text-max-angle\"]),\n    \"text-writing-mode\": new DataConstantProperty(styleSpec[\"layout_symbol\"][\"text-writing-mode\"]),\n    \"text-rotate\": new DataDrivenProperty(styleSpec[\"layout_symbol\"][\"text-rotate\"]),\n    \"text-padding\": new DataConstantProperty(styleSpec[\"layout_symbol\"][\"text-padding\"]),\n    \"text-keep-upright\": new DataConstantProperty(styleSpec[\"layout_symbol\"][\"text-keep-upright\"]),\n    \"text-transform\": new DataDrivenProperty(styleSpec[\"layout_symbol\"][\"text-transform\"]),\n    \"text-offset\": new DataDrivenProperty(styleSpec[\"layout_symbol\"][\"text-offset\"]),\n    \"text-allow-overlap\": new DataConstantProperty(styleSpec[\"layout_symbol\"][\"text-allow-overlap\"]),\n    \"text-ignore-placement\": new DataConstantProperty(styleSpec[\"layout_symbol\"][\"text-ignore-placement\"]),\n    \"text-optional\": new DataConstantProperty(styleSpec[\"layout_symbol\"][\"text-optional\"]),\n    \"visibility\": new DataConstantProperty(styleSpec[\"layout_symbol\"][\"visibility\"]),\n});\n\nexport type PaintProps = {|\n    \"icon-opacity\": DataDrivenProperty<number>,\n    \"icon-emissive-strength\": DataDrivenProperty<number>,\n    \"text-emissive-strength\": DataDrivenProperty<number>,\n    \"icon-color\": DataDrivenProperty<Color>,\n    \"icon-halo-color\": DataDrivenProperty<Color>,\n    \"icon-halo-width\": DataDrivenProperty<number>,\n    \"icon-halo-blur\": DataDrivenProperty<number>,\n    \"icon-translate\": DataConstantProperty<[number, number]>,\n    \"icon-translate-anchor\": DataConstantProperty<\"map\" | \"viewport\">,\n    \"icon-image-cross-fade\": DataDrivenProperty<number>,\n    \"text-opacity\": DataDrivenProperty<number>,\n    \"text-color\": DataDrivenProperty<Color>,\n    \"text-halo-color\": DataDrivenProperty<Color>,\n    \"text-halo-width\": DataDrivenProperty<number>,\n    \"text-halo-blur\": DataDrivenProperty<number>,\n    \"text-translate\": DataConstantProperty<[number, number]>,\n    \"text-translate-anchor\": DataConstantProperty<\"map\" | \"viewport\">,\n    \"icon-color-saturation\": DataConstantProperty<number>,\n    \"icon-color-contrast\": DataConstantProperty<number>,\n    \"icon-color-brightness-min\": DataConstantProperty<number>,\n    \"icon-color-brightness-max\": DataConstantProperty<number>,\n|};\n\nconst paint: Properties<PaintProps> = new Properties({\n    \"icon-opacity\": new DataDrivenProperty(styleSpec[\"paint_symbol\"][\"icon-opacity\"]),\n    \"icon-emissive-strength\": new DataDrivenProperty(styleSpec[\"paint_symbol\"][\"icon-emissive-strength\"]),\n    \"text-emissive-strength\": new DataDrivenProperty(styleSpec[\"paint_symbol\"][\"text-emissive-strength\"]),\n    \"icon-color\": new DataDrivenProperty(styleSpec[\"paint_symbol\"][\"icon-color\"]),\n    \"icon-halo-color\": new DataDrivenProperty(styleSpec[\"paint_symbol\"][\"icon-halo-color\"]),\n    \"icon-halo-width\": new DataDrivenProperty(styleSpec[\"paint_symbol\"][\"icon-halo-width\"]),\n    \"icon-halo-blur\": new DataDrivenProperty(styleSpec[\"paint_symbol\"][\"icon-halo-blur\"]),\n    \"icon-translate\": new DataConstantProperty(styleSpec[\"paint_symbol\"][\"icon-translate\"]),\n    \"icon-translate-anchor\": new DataConstantProperty(styleSpec[\"paint_symbol\"][\"icon-translate-anchor\"]),\n    \"icon-image-cross-fade\": new DataDrivenProperty(styleSpec[\"paint_symbol\"][\"icon-image-cross-fade\"]),\n    \"text-opacity\": new DataDrivenProperty(styleSpec[\"paint_symbol\"][\"text-opacity\"]),\n    \"text-color\": new DataDrivenProperty(styleSpec[\"paint_symbol\"][\"text-color\"], { runtimeType: ColorType, getOverride: (o) => o.textColor, hasOverride: (o) => !!o.textColor }),\n    \"text-halo-color\": new DataDrivenProperty(styleSpec[\"paint_symbol\"][\"text-halo-color\"]),\n    \"text-halo-width\": new DataDrivenProperty(styleSpec[\"paint_symbol\"][\"text-halo-width\"]),\n    \"text-halo-blur\": new DataDrivenProperty(styleSpec[\"paint_symbol\"][\"text-halo-blur\"]),\n    \"text-translate\": new DataConstantProperty(styleSpec[\"paint_symbol\"][\"text-translate\"]),\n    \"text-translate-anchor\": new DataConstantProperty(styleSpec[\"paint_symbol\"][\"text-translate-anchor\"]),\n    \"icon-color-saturation\": new DataConstantProperty(styleSpec[\"paint_symbol\"][\"icon-color-saturation\"]),\n    \"icon-color-contrast\": new DataConstantProperty(styleSpec[\"paint_symbol\"][\"icon-color-contrast\"]),\n    \"icon-color-brightness-min\": new DataConstantProperty(styleSpec[\"paint_symbol\"][\"icon-color-brightness-min\"]),\n    \"icon-color-brightness-max\": new DataConstantProperty(styleSpec[\"paint_symbol\"][\"icon-color-brightness-max\"]),\n});\n\n// Note: without adding the explicit type annotation, Flow infers weaker types\n// for these objects from their use in the constructor to StyleLayer, as\n// {layout?: Properties<...>, paint: Properties<...>}\nexport default ({ paint, layout }: $Exact<{\n  paint: Properties<PaintProps>, layout: Properties<LayoutProps>\n}>);\n","// @flow\n\nimport assert from 'assert';\nimport type {Expression} from '../style-spec/expression/expression.js';\nimport type EvaluationContext from '../style-spec/expression/evaluation_context.js';\nimport type {Type} from '../style-spec/expression/types.js';\nimport type {ZoomConstantExpression} from '../style-spec/expression/index.js';\nimport {NullType} from '../style-spec/expression/types.js';\nimport {PossiblyEvaluatedPropertyValue} from './properties.js';\nimport {register} from '../util/web_worker_transfer.js';\n\n// This is an internal expression class. It is only used in GL JS and\n// has GL JS dependencies which can break the standalone style-spec module\nexport default class FormatSectionOverride<T> implements Expression {\n    type: Type;\n    defaultValue: PossiblyEvaluatedPropertyValue<T>;\n\n    constructor(defaultValue: PossiblyEvaluatedPropertyValue<T>) {\n        assert(defaultValue.property.overrides !== undefined);\n        this.type = defaultValue.property.overrides ? defaultValue.property.overrides.runtimeType : NullType;\n        this.defaultValue = defaultValue;\n    }\n\n    evaluate(ctx: EvaluationContext): T {\n        if (ctx.formattedSection) {\n            const overrides = this.defaultValue.property.overrides;\n            if (overrides && overrides.hasOverride(ctx.formattedSection)) {\n                return overrides.getOverride(ctx.formattedSection);\n            }\n        }\n\n        if (ctx.feature && ctx.featureState) {\n            return this.defaultValue.evaluate(ctx.feature, ctx.featureState);\n        }\n\n        // not sure how to make Flow refine the type properly here — will need investigation\n        return ((this.defaultValue.property.specification.default: any): T);\n    }\n\n    eachChild(fn: (_: Expression) => void) {\n        if (!this.defaultValue.isConstant()) {\n            const expr: ZoomConstantExpression<'source'> = ((this.defaultValue.value): any);\n            fn(expr._styleExpression.expression);\n        }\n    }\n\n    // Cannot be statically evaluated, as the output depends on the evaluation context.\n    outputDefined(): boolean {\n        return false;\n    }\n\n    serialize(): null {\n        return null;\n    }\n}\n\nregister(FormatSectionOverride, 'FormatSectionOverride', {omit: ['defaultValue']});\n","// @flow\n\nimport {mat4} from 'gl-matrix';\n\nimport StyleLayer from '../style_layer.js';\n\nimport assert from 'assert';\nimport SymbolBucket from '../../data/bucket/symbol_bucket.js';\nimport resolveTokens from '../../util/resolve_tokens.js';\nimport properties from './symbol_style_layer_properties.js';\nimport {computeColorAdjustmentMatrix} from '../../util/util.js';\n\nimport type {FormattedSection} from '../../style-spec/expression/types/formatted.js';\nimport type {FormattedSectionExpression} from '../../style-spec/expression/definitions/format.js';\nimport type {CreateProgramParams} from \"../../render/painter.js\";\nimport type {ConfigOptions} from '../properties.js';\n\nimport {\n    Transitionable,\n    Transitioning,\n    Layout,\n    PossiblyEvaluated,\n    PossiblyEvaluatedPropertyValue,\n    PropertyValue\n} from '../properties.js';\n\nimport {\n    isExpression,\n    StyleExpression,\n    ZoomConstantExpression,\n    ZoomDependentExpression\n} from '../../style-spec/expression/index.js';\n\nimport type {BucketParameters} from '../../data/bucket.js';\nimport type {LayoutProps, PaintProps} from './symbol_style_layer_properties.js';\nimport type EvaluationParameters from '../evaluation_parameters.js';\nimport type {LayerSpecification} from '../../style-spec/types.js';\nimport type {Feature, SourceExpression, CompositeExpression} from '../../style-spec/expression/index.js';\nimport type {Expression} from '../../style-spec/expression/expression.js';\nimport type {CanonicalTileID} from '../../source/tile_id.js';\nimport {FormattedType} from '../../style-spec/expression/types.js';\nimport {typeOf} from '../../style-spec/expression/values.js';\nimport Formatted from '../../style-spec/expression/types/formatted.js';\nimport FormatSectionOverride from '../format_section_override.js';\nimport FormatExpression from '../../style-spec/expression/definitions/format.js';\nimport Literal from '../../style-spec/expression/definitions/literal.js';\nimport ProgramConfiguration from '../../data/program_configuration.js';\n\nclass SymbolStyleLayer extends StyleLayer {\n    _unevaluatedLayout: Layout<LayoutProps>;\n    layout: PossiblyEvaluated<LayoutProps>;\n\n    _transitionablePaint: Transitionable<PaintProps>;\n    _transitioningPaint: Transitioning<PaintProps>;\n    paint: PossiblyEvaluated<PaintProps>;\n\n    _colorAdjustmentMatrix: Float32Array;\n    _saturation: number;\n    _contrast: number;\n    _brightnessMin: number;\n    _brightnessMax: number;\n\n    constructor(layer: LayerSpecification, scope: string, options?: ?ConfigOptions) {\n        super(layer, properties, scope, options);\n        // $FlowFixMe[incompatible-type]\n        this._colorAdjustmentMatrix = mat4.identity([]);\n    }\n\n    recalculate(parameters: EvaluationParameters, availableImages: Array<string>) {\n        super.recalculate(parameters, availableImages);\n\n        if (this.layout.get('icon-rotation-alignment') === 'auto') {\n            if (this.layout.get('symbol-placement') !== 'point') {\n                this.layout._values['icon-rotation-alignment'] = 'map';\n            } else {\n                this.layout._values['icon-rotation-alignment'] = 'viewport';\n            }\n        }\n\n        if (this.layout.get('text-rotation-alignment') === 'auto') {\n            if (this.layout.get('symbol-placement') !== 'point') {\n                this.layout._values['text-rotation-alignment'] = 'map';\n            } else {\n                this.layout._values['text-rotation-alignment'] = 'viewport';\n            }\n        }\n\n        // If unspecified, `*-pitch-alignment` inherits `*-rotation-alignment`\n        if (this.layout.get('text-pitch-alignment') === 'auto') {\n            this.layout._values['text-pitch-alignment'] = this.layout.get('text-rotation-alignment');\n        }\n        if (this.layout.get('icon-pitch-alignment') === 'auto') {\n            this.layout._values['icon-pitch-alignment'] = this.layout.get('icon-rotation-alignment');\n        }\n\n        const writingModes = this.layout.get('text-writing-mode');\n        if (writingModes) {\n            // remove duplicates, preserving order\n            const deduped = [];\n            for (const m of writingModes) {\n                if (deduped.indexOf(m) < 0) deduped.push(m);\n            }\n            this.layout._values['text-writing-mode'] = deduped;\n        } else if (this.layout.get('symbol-placement') === 'point') {\n            // default value for 'point' placement symbols\n            this.layout._values['text-writing-mode'] = ['horizontal'];\n        } else {\n            // default value for 'line' placement symbols\n            this.layout._values['text-writing-mode'] = ['horizontal', 'vertical'];\n        }\n\n        this._setPaintOverrides();\n    }\n\n    getColorAdjustmentMatrix(saturation: number, contrast: number, brightnessMin: number, brightnessMax: number): Float32Array {\n        if (this._saturation !== saturation ||\n            this._contrast !== contrast ||\n            this._brightnessMin !== brightnessMin ||\n            this._brightnessMax !== brightnessMax) {\n\n            this._colorAdjustmentMatrix = computeColorAdjustmentMatrix(saturation, contrast, brightnessMin, brightnessMax);\n\n            this._saturation = saturation;\n            this._contrast = contrast;\n            this._brightnessMin = brightnessMin;\n            this._brightnessMax = brightnessMax;\n        }\n        return this._colorAdjustmentMatrix;\n    }\n\n    getValueAndResolveTokens(name: any, feature: Feature, canonical: CanonicalTileID, availableImages: Array<string>): string {\n        const value = this.layout.get(name).evaluate(feature, {}, canonical, availableImages);\n        const unevaluated = this._unevaluatedLayout._values[name];\n        if (!unevaluated.isDataDriven() && !isExpression(unevaluated.value) && value) {\n            return resolveTokens(feature.properties, value);\n        }\n\n        return value;\n    }\n\n    createBucket(parameters: BucketParameters<SymbolStyleLayer>): SymbolBucket {\n        return new SymbolBucket(parameters);\n    }\n\n    // $FlowFixMe[method-unbinding]\n    queryRadius(): number {\n        return 0;\n    }\n\n    // $FlowFixMe[method-unbinding]\n    queryIntersectsFeature(): boolean {\n        assert(false); // Should take a different path in FeatureIndex\n        return false;\n    }\n\n    _setPaintOverrides() {\n        for (const overridable of properties.paint.overridableProperties) {\n            if (!SymbolStyleLayer.hasPaintOverride(this.layout, overridable)) {\n                continue;\n            }\n            const overriden = this.paint.get(overridable);\n            const override = new FormatSectionOverride(overriden);\n            const styleExpression = new StyleExpression(override, overriden.property.specification, this.scope, this.options);\n            let expression = null;\n            // eslint-disable-next-line no-warning-comments\n            // TODO: check why were the `isLightConstant` values omitted from the construction of these expressions\n            if (overriden.value.kind === 'constant' || overriden.value.kind === 'source') {\n                // $FlowFixMe[method-unbinding]\n                expression = (new ZoomConstantExpression('source', styleExpression): SourceExpression);\n            } else {\n                // $FlowFixMe[method-unbinding]\n                expression = (new ZoomDependentExpression('composite',\n                                                          styleExpression,\n                                                          overriden.value.zoomStops,\n                                                          overriden.value._interpolationType): CompositeExpression);\n            }\n            // $FlowFixMe[prop-missing]\n            this.paint._values[overridable] = new PossiblyEvaluatedPropertyValue(overriden.property,\n                                                                                 expression,\n                                                                                 overriden.parameters);\n        }\n    }\n\n    _handleOverridablePaintPropertyUpdate<T, R>(name: string, oldValue: PropertyValue<T, R>, newValue: PropertyValue<T, R>): boolean {\n        if (!this.layout || oldValue.isDataDriven() || newValue.isDataDriven()) {\n            return false;\n        }\n        return SymbolStyleLayer.hasPaintOverride(this.layout, name);\n    }\n\n    static hasPaintOverride(layout: PossiblyEvaluated<LayoutProps>, propertyName: string): boolean {\n        const textField = layout.get('text-field');\n        const property = properties.paint.properties[propertyName];\n        let hasOverrides = false;\n\n        const checkSections = (sections: Array<FormattedSection> | Array<FormattedSectionExpression>) => {\n            for (const section of sections) {\n                if (property.overrides && property.overrides.hasOverride(section)) {\n                    hasOverrides = true;\n                    return;\n                }\n            }\n        };\n\n        if (textField.value.kind === 'constant' && textField.value.value instanceof Formatted) {\n            checkSections(textField.value.value.sections);\n        } else if (textField.value.kind === 'source') {\n\n            const checkExpression = (expression: Expression) => {\n                if (hasOverrides) return;\n\n                if (expression instanceof Literal && typeOf(expression.value) === FormattedType) {\n                    const formatted: Formatted = ((expression.value): any);\n                    checkSections(formatted.sections);\n                } else if (expression instanceof FormatExpression) {\n                    checkSections(expression.sections);\n                } else {\n                    expression.eachChild(checkExpression);\n                }\n            };\n\n            const expr: ZoomConstantExpression<'source'> = ((textField.value): any);\n            if (expr._styleExpression) {\n                checkExpression(expr._styleExpression.expression);\n            }\n        }\n\n        return hasOverrides;\n    }\n\n    getProgramIds(): string[] {\n        const hasIcon = (this.paint.get('icon-opacity').constantOr(1) !== 0);\n        const hasText = (this.paint.get('text-opacity').constantOr(1) !== 0);\n        const ids = [];\n        if (hasIcon) {\n            ids.push('symbolIcon');\n        }\n        if (hasText) {\n            ids.push('symbolSDF');\n        }\n        return ids;\n    }\n\n    getDefaultProgramParams(name: string, zoom: number): CreateProgramParams | null {\n        return {\n            config: new ProgramConfiguration(this, zoom),\n            overrideFog: false\n        };\n    }\n}\n\nexport default SymbolStyleLayer;\n","// @flow\nexport default resolveTokens;\n\n/**\n * Replace tokens in a string template with values in an object\n *\n * @param properties a key/value relationship between tokens and replacements\n * @param text the template string\n * @returns the template with tokens replaced\n * @private\n */\nfunction resolveTokens(properties: {+[string]: mixed}, text: string): string {\n    return text.replace(/{([^{}]+)}/g, (match, key: string) => {\n        return key in properties ? String(properties[key]) : '';\n    });\n}\n","// This file is generated. Edit build/generate-style-code.js, then run `npm run codegen`.\n// @flow\n/* eslint-disable */\n\nimport styleSpec from '../../style-spec/reference/latest.js';\n\nimport {\n    Properties,\n    DataConstantProperty,\n    DataDrivenProperty,\n    ColorRampProperty\n} from '../properties.js';\n\nimport type Color from '../../style-spec/util/color.js';\n\nimport type Formatted from '../../style-spec/expression/types/formatted.js';\n\nimport type ResolvedImage from '../../style-spec/expression/types/resolved_image.js';\n\nexport type LayoutProps = {|\n    \"visibility\": DataConstantProperty<\"visible\" | \"none\">,\n|};\n\nconst layout: Properties<LayoutProps> = new Properties({\n    \"visibility\": new DataConstantProperty(styleSpec[\"layout_background\"][\"visibility\"]),\n});\n\nexport type PaintProps = {|\n    \"background-color\": DataConstantProperty<Color>,\n    \"background-pattern\": DataConstantProperty<?ResolvedImage>,\n    \"background-opacity\": DataConstantProperty<number>,\n    \"background-emissive-strength\": DataConstantProperty<number>,\n|};\n\nconst paint: Properties<PaintProps> = new Properties({\n    \"background-color\": new DataConstantProperty(styleSpec[\"paint_background\"][\"background-color\"]),\n    \"background-pattern\": new DataConstantProperty(styleSpec[\"paint_background\"][\"background-pattern\"]),\n    \"background-opacity\": new DataConstantProperty(styleSpec[\"paint_background\"][\"background-opacity\"]),\n    \"background-emissive-strength\": new DataConstantProperty(styleSpec[\"paint_background\"][\"background-emissive-strength\"]),\n});\n\n// Note: without adding the explicit type annotation, Flow infers weaker types\n// for these objects from their use in the constructor to StyleLayer, as\n// {layout?: Properties<...>, paint: Properties<...>}\nexport default ({ paint, layout }: $Exact<{\n  paint: Properties<PaintProps>, layout: Properties<LayoutProps>\n}>);\n","// This file is generated. Edit build/generate-style-code.js, then run `npm run codegen`.\n// @flow\n/* eslint-disable */\n\nimport styleSpec from '../../style-spec/reference/latest.js';\n\nimport {\n    Properties,\n    DataConstantProperty,\n    DataDrivenProperty,\n    ColorRampProperty\n} from '../properties.js';\n\nimport type Color from '../../style-spec/util/color.js';\n\nimport type Formatted from '../../style-spec/expression/types/formatted.js';\n\nimport type ResolvedImage from '../../style-spec/expression/types/resolved_image.js';\n\nexport type LayoutProps = {|\n    \"visibility\": DataConstantProperty<\"visible\" | \"none\">,\n|};\n\nconst layout: Properties<LayoutProps> = new Properties({\n    \"visibility\": new DataConstantProperty(styleSpec[\"layout_raster\"][\"visibility\"]),\n});\n\nexport type PaintProps = {|\n    \"raster-opacity\": DataConstantProperty<number>,\n    \"raster-color\": ColorRampProperty,\n    \"raster-color-mix\": DataConstantProperty<[number, number, number, number]>,\n    \"raster-color-range\": DataConstantProperty<[number, number]>,\n    \"raster-hue-rotate\": DataConstantProperty<number>,\n    \"raster-brightness-min\": DataConstantProperty<number>,\n    \"raster-brightness-max\": DataConstantProperty<number>,\n    \"raster-saturation\": DataConstantProperty<number>,\n    \"raster-contrast\": DataConstantProperty<number>,\n    \"raster-resampling\": DataConstantProperty<\"linear\" | \"nearest\">,\n    \"raster-fade-duration\": DataConstantProperty<number>,\n    \"raster-emissive-strength\": DataConstantProperty<number>,\n    \"raster-array-band\": DataConstantProperty<string>,\n    \"raster-elevation\": DataConstantProperty<number>,\n|};\n\nconst paint: Properties<PaintProps> = new Properties({\n    \"raster-opacity\": new DataConstantProperty(styleSpec[\"paint_raster\"][\"raster-opacity\"]),\n    \"raster-color\": new ColorRampProperty(styleSpec[\"paint_raster\"][\"raster-color\"]),\n    \"raster-color-mix\": new DataConstantProperty(styleSpec[\"paint_raster\"][\"raster-color-mix\"]),\n    \"raster-color-range\": new DataConstantProperty(styleSpec[\"paint_raster\"][\"raster-color-range\"]),\n    \"raster-hue-rotate\": new DataConstantProperty(styleSpec[\"paint_raster\"][\"raster-hue-rotate\"]),\n    \"raster-brightness-min\": new DataConstantProperty(styleSpec[\"paint_raster\"][\"raster-brightness-min\"]),\n    \"raster-brightness-max\": new DataConstantProperty(styleSpec[\"paint_raster\"][\"raster-brightness-max\"]),\n    \"raster-saturation\": new DataConstantProperty(styleSpec[\"paint_raster\"][\"raster-saturation\"]),\n    \"raster-contrast\": new DataConstantProperty(styleSpec[\"paint_raster\"][\"raster-contrast\"]),\n    \"raster-resampling\": new DataConstantProperty(styleSpec[\"paint_raster\"][\"raster-resampling\"]),\n    \"raster-fade-duration\": new DataConstantProperty(styleSpec[\"paint_raster\"][\"raster-fade-duration\"]),\n    \"raster-emissive-strength\": new DataConstantProperty(styleSpec[\"paint_raster\"][\"raster-emissive-strength\"]),\n    \"raster-array-band\": new DataConstantProperty(styleSpec[\"paint_raster\"][\"raster-array-band\"]),\n    \"raster-elevation\": new DataConstantProperty(styleSpec[\"paint_raster\"][\"raster-elevation\"]),\n});\n\n// Note: without adding the explicit type annotation, Flow infers weaker types\n// for these objects from their use in the constructor to StyleLayer, as\n// {layout?: Properties<...>, paint: Properties<...>}\nexport default ({ paint, layout }: $Exact<{\n  paint: Properties<PaintProps>, layout: Properties<LayoutProps>\n}>);\n","// @flow\nimport {createLayout} from '../util/struct_array.js';\n\nimport type {StructArrayLayout} from '../util/struct_array.js';\n\nexport default (createLayout([\n    {name: 'a_pos', type: 'Int16', components: 2},\n    {name: 'a_texture_pos', type: 'Int16', components: 2}\n]): StructArrayLayout);\n","// @flow\n\nimport type Context from '../gl/context.js';\nimport type {RGBAImage, AlphaImage} from '../util/image.js';\nimport {Float32Image} from '../util/image.js';\nimport assert from 'assert';\n\nexport type TextureFormat =\n    | $PropertyType<WebGL2RenderingContext, 'RGBA'>\n    | $PropertyType<WebGL2RenderingContext, 'DEPTH_COMPONENT'>\n    | $PropertyType<WebGL2RenderingContext, 'R8'>\n    | $PropertyType<WebGL2RenderingContext, 'R32F'>\n    | $PropertyType<WebGL2RenderingContext, 'RED'>;\nexport type TextureType =\n    | $PropertyType<WebGL2RenderingContext, 'UNSIGNED_BYTE'>\n    | $PropertyType<WebGL2RenderingContext, 'UNSIGNED_SHORT'>\n    | $PropertyType<WebGL2RenderingContext, 'FLOAT'>;\nexport type TextureFilter =\n    | $PropertyType<WebGL2RenderingContext, 'LINEAR'>\n    | $PropertyType<WebGL2RenderingContext, 'NEAREST_MIPMAP_NEAREST'>\n    | $PropertyType<WebGL2RenderingContext, 'LINEAR_MIPMAP_NEAREST'>\n    | $PropertyType<WebGL2RenderingContext, 'NEAREST_MIPMAP_LINEAR'>\n    | $PropertyType<WebGL2RenderingContext, 'LINEAR_MIPMAP_LINEAR'>\n    | $PropertyType<WebGL2RenderingContext, 'NEAREST'>;\nexport type TextureWrap =\n    | $PropertyType<WebGL2RenderingContext, 'REPEAT'>\n    | $PropertyType<WebGL2RenderingContext, 'CLAMP_TO_EDGE'>\n    | $PropertyType<WebGL2RenderingContext, 'MIRRORED_REPEAT'>;\n\ntype EmptyImage = {\n    width: number,\n    height: number,\n    data: null\n}\n\nexport type TextureImage =\n    | RGBAImage\n    | AlphaImage\n    | Float32Image\n    | HTMLImageElement\n    | HTMLCanvasElement\n    | HTMLVideoElement\n    | ImageData\n    | EmptyImage\n    | ImageBitmap;\n\nclass Texture {\n    context: Context;\n    size: [number, number];\n    texture: WebGLTexture;\n    format: TextureFormat;\n    minFilter: ?TextureFilter;\n    magFilter: ?TextureFilter;\n    wrapS: ?TextureWrap;\n    wrapT: ?TextureWrap;\n    useMipmap: boolean;\n\n    constructor(context: Context, image: TextureImage, format: TextureFormat, options: ?{ premultiply?: boolean, useMipmap?: boolean }) {\n        this.context = context;\n        this.format = format;\n        this.texture = ((context.gl.createTexture(): any): WebGLTexture);\n        this.update(image, options);\n    }\n\n    update(image: TextureImage, options: ?{ premultiply?: boolean, useMipmap?: boolean }, position?: { x: number, y: number }) {\n        const {width, height} = image;\n        const {context} = this;\n        const {gl} = context;\n\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n\n        context.pixelStoreUnpackFlipY.set(false);\n        context.pixelStoreUnpack.set(1);\n        context.pixelStoreUnpackPremultiplyAlpha.set(this.format === gl.RGBA && (!options || options.premultiply !== false));\n\n        if (!position && (!this.size || this.size[0] !== width || this.size[1] !== height)) {\n            this.size = [width, height];\n\n            if (image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof HTMLVideoElement || image instanceof ImageData || (ImageBitmap && image instanceof ImageBitmap)) {\n                let baseFormat = this.format;\n                if (this.format === gl.R8) {\n                    baseFormat = gl.RED;\n                }\n                gl.texImage2D(gl.TEXTURE_2D, 0, this.format, baseFormat, gl.UNSIGNED_BYTE, image);\n            } else {\n                let internalFormat = this.format;\n                let format = this.format;\n                let type: TextureType = gl.UNSIGNED_BYTE;\n\n                if (this.format === gl.DEPTH_COMPONENT) {\n                    // $FlowFixMe[incompatible-type]\n                    internalFormat = gl.DEPTH_COMPONENT16;\n                    type = gl.UNSIGNED_SHORT;\n                }\n                if (this.format === gl.R8) {\n                    format = gl.RED;\n                }\n                if (this.format === gl.R32F) {\n                    assert(image instanceof Float32Image);\n                    type = gl.FLOAT;\n                    format = gl.RED;\n                }\n                // $FlowFixMe prop-missing - Flow can't refine image type here\n                gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, width, height, 0, format, type, image.data);\n            }\n        } else {\n            const {x, y} = position || {x: 0, y: 0};\n            if (image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof HTMLVideoElement || image instanceof ImageData || (ImageBitmap && image instanceof ImageBitmap)) {\n                gl.texSubImage2D(gl.TEXTURE_2D, 0, x, y, gl.RGBA, gl.UNSIGNED_BYTE, image);\n            } else {\n                let format = this.format;\n                let type: TextureType = gl.UNSIGNED_BYTE;\n\n                if (this.format === gl.R32F) {\n                    assert(image instanceof Float32Image);\n\n                    format = gl.RED;\n                    type = gl.FLOAT;\n                }\n                // $FlowFixMe prop-missing - Flow can't refine image type here\n                gl.texSubImage2D(gl.TEXTURE_2D, 0, x, y, width, height, format, type, image.data);\n            }\n        }\n\n        this.useMipmap = Boolean(options && options.useMipmap);\n        if (this.useMipmap) {\n            gl.generateMipmap(gl.TEXTURE_2D);\n        }\n    }\n\n    bind(filter: TextureFilter, wrap: TextureWrap, ignoreMipMap: boolean = false) {\n        const {context} = this;\n        const {gl} = context;\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n\n        if (filter !== this.minFilter) {\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER,\n                (this.useMipmap && !ignoreMipMap) ? (filter === gl.NEAREST ? gl.NEAREST_MIPMAP_NEAREST : gl.LINEAR_MIPMAP_LINEAR) : filter\n            );\n            this.minFilter = filter;\n        }\n\n        if (wrap !== this.wrapS) {\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrap);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrap);\n            this.wrapS = wrap;\n        }\n    }\n\n    bindExtraParam(minFilter: TextureFilter, magFilter: TextureFilter, wrapS: TextureWrap, wrapT: TextureWrap) {\n        const {context} = this;\n        const {gl} = context;\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n\n        if (magFilter !== this.magFilter) {\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, magFilter);\n            this.magFilter = magFilter;\n        }\n        if (minFilter !== this.minFilter) {\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER,\n                this.useMipmap ? (minFilter === gl.NEAREST ? gl.NEAREST_MIPMAP_NEAREST : gl.LINEAR_MIPMAP_LINEAR) : minFilter\n            );\n            this.minFilter = minFilter;\n        }\n\n        if (wrapS !== this.wrapS) {\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrapS);\n            this.wrapS = wrapS;\n        }\n\n        if (wrapT !== this.wrapT) {\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrapT);\n            this.wrapT = wrapT;\n        }\n    }\n\n    destroy() {\n        const {gl} = this.context;\n        gl.deleteTexture(this.texture);\n        this.texture = (null: any);\n    }\n}\n\nexport default Texture;\nexport class UserManagedTexture {\n    context: Context;\n    texture: WebGLTexture;\n    minFilter: ?TextureFilter;\n    wrapS: ?TextureWrap;\n\n    constructor(context: Context, texture: WebGLTexture) {\n        this.context = context;\n        this.texture = texture;\n    }\n\n    bind(filter: TextureFilter, wrap: TextureWrap) {\n        const {context} = this;\n        const {gl} = context;\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n\n        if (filter !== this.minFilter) {\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);\n            this.minFilter = filter;\n        }\n\n        if (wrap !== this.wrapS) {\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrap);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrap);\n            this.wrapS = wrap;\n        }\n    }\n\n}\n","// @flow\n\nimport {CanonicalTileID} from './tile_id.js';\nimport {Event, ErrorEvent, Evented} from '../util/evented.js';\nimport {lowerBound, upperBound} from '../util/util.js';\nimport {getImage, ResourceType} from '../util/ajax.js';\nimport EXTENT from '../style-spec/data/extent.js';\nimport {RasterBoundsArray, TriangleIndexArray} from '../data/array_types.js';\nimport boundsAttributes from '../data/bounds_attributes.js';\nimport SegmentVector from '../data/segment.js';\nimport Texture, {UserManagedTexture} from '../render/texture.js';\nimport MercatorCoordinate, {MAX_MERCATOR_LATITUDE} from '../geo/mercator_coordinate.js';\nimport browser from '../util/browser.js';\nimport tileTransform, {getTilePoint} from '../geo/projection/tile_transform.js';\nimport {GLOBE_VERTEX_GRID_SIZE} from '../geo/projection/globe_constants.js';\nimport {mat3, vec3} from 'gl-matrix';\nimport LngLat from '../geo/lng_lat.js';\n\nimport type {Source} from './source.js';\nimport type {CanvasSourceSpecification} from './canvas_source.js';\nimport type {Map} from '../ui/map.js';\nimport type Dispatcher from '../util/dispatcher.js';\nimport type Tile from './tile.js';\nimport type {Callback} from '../types/callback.js';\nimport type {Cancelable} from '../types/cancelable.js';\nimport type VertexBuffer from '../gl/vertex_buffer.js';\nimport type IndexBuffer from '../gl/index_buffer.js';\nimport type {ProjectedPoint} from '../geo/projection/projection.js';\nimport type {\n    ImageSourceSpecification,\n    VideoSourceSpecification\n} from '../style-spec/types.js';\nimport type Context from '../gl/context.js';\nimport assert from \"assert\";\n\ntype Coordinates = [[number, number], [number, number], [number, number], [number, number]];\ntype ImageSourceTexture = {|\n    dimensions: [number, number],\n    handle: WebGLTexture\n|};\n\n// perspective correction for texture mapping, see https://github.com/mapbox/mapbox-gl-js/issues/9158\n// adapted from https://math.stackexchange.com/a/339033/48653\n\n// Creates a matrix that maps\n// (1, 0, 0) -> (a * x1, a * y1, a)\n// (0, 1, 0) -> (b * x2, b * y2, b)\n// (0, 0, 1) -> (c * x3, c * y3, c)\n// (1, 1, 1) -> (x4, y4, 1)\nfunction basisToPoints(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, x4: number, y4: number) {\n    const m = [x1, y1, 1, x2, y2, 1, x3, y3, 1];\n    const s = [x4, y4, 1];\n    const ma = mat3.adjoint([], m);\n    const [sx, sy, sz] = vec3.transformMat3(s, s, ma);\n    return mat3.multiply(m, m, [sx, 0, 0, 0, sy, 0, 0, 0, sz]);\n}\n\nfunction getTileToTextureTransformMatrix(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, x4: number, y4: number) {\n    const a = basisToPoints(0, 0, 1, 0, 1, 1, 0, 1);\n    const b = basisToPoints(x1, y1, x2, y2, x3, y3, x4, y4);\n    const adjB = mat3.adjoint([], b);\n    return mat3.multiply(a, a, adjB);\n}\n\nfunction getTextureToTileTransformMatrix(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, x4: number, y4: number) {\n    const a = basisToPoints(0, 0, 1, 0, 1, 1, 0, 1);\n    const b = basisToPoints(x1, y1, x2, y2, x3, y3, x4, y4);\n    const adjA = mat3.adjoint([], a);\n    return mat3.multiply(b, b, adjA);\n}\n\nfunction getPerspectiveTransform(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, x4: number, y4: number) {\n    const m = getTextureToTileTransformMatrix(x1, y1, x2, y2, x3, y3, x4, y4);\n    return [\n        m[2] / m[8] / EXTENT,\n        m[5] / m[8] / EXTENT\n    ];\n}\n\nfunction isConvex(coords: [ProjectedPoint, ProjectedPoint, ProjectedPoint, ProjectedPoint]) {\n    const dx1 = coords[1].x - coords[0].x;\n    const dy1 = coords[1].y - coords[0].y;\n    const dx2 = coords[2].x - coords[1].x;\n    const dy2 = coords[2].y - coords[1].y;\n    const dx3 = coords[3].x - coords[2].x;\n    const dy3 = coords[3].y - coords[2].y;\n    const dx4 = coords[0].x - coords[3].x;\n    const dy4 = coords[0].y - coords[3].y;\n\n    const crossProduct1 = dx1 * dy2 - dx2 * dy1;\n    const crossProduct2 = dx2 * dy3 - dx3 * dy2;\n    const crossProduct3 = dx3 * dy4 - dx4 * dy3;\n    const crossProduct4 = dx4 * dy1 - dx1 * dy4;\n\n    return (crossProduct1 > 0 && crossProduct2 > 0 && crossProduct3 > 0 && crossProduct4 > 0) ||\n        (crossProduct1 < 0 && crossProduct2 < 0 && crossProduct3 < 0 && crossProduct4 < 0);\n}\n\nfunction constrainCoordinates(coords: [number, number]) {\n    return [coords[0], Math.min(Math.max(coords[1], -MAX_MERCATOR_LATITUDE), MAX_MERCATOR_LATITUDE)];\n}\n\nfunction constrain(coords: Coordinates) {\n    return [\n        constrainCoordinates(coords[0]),\n        constrainCoordinates(coords[1]),\n        constrainCoordinates(coords[2]),\n        constrainCoordinates(coords[3])];\n}\n\nfunction calculateMinAndSize(coords: Coordinates) {\n    let minX = coords[0][0];\n    let maxX = minX;\n    let minY = coords[0][1];\n    let maxY = minY;\n\n    for (let i = 1; i < coords.length; i++) {\n        if (coords[i][0] < minX) {\n            minX = coords[i][0];\n        } else if (coords[i][0] > maxX) {\n            maxX = coords[i][0];\n        }\n        if (coords[i][1] < minY) {\n            minY = coords[i][1];\n        } else if (coords[i][1] > maxY) {\n            maxY = coords[i][1];\n        }\n    }\n    return [minX, minY, maxX - minX, maxY - minY];\n}\n\nfunction calculateMinAndSizeForPoints(coords: ProjectedPoint[]) {\n    let minX = coords[0].x;\n    let maxX = minX;\n    let minY = coords[0].y;\n    let maxY = minY;\n\n    for (let i = 1; i < coords.length; i++) {\n        if (coords[i].x < minX) {\n            minX = coords[i].x;\n        } else if (coords[i].x > maxX) {\n            maxX = coords[i].x;\n        }\n        if (coords[i].y < minY) {\n            minY = coords[i].y;\n        } else if (coords[i].y > maxY) {\n            maxY = coords[i].y;\n        }\n    }\n    return [minX, minY, maxX - minX, maxY - minY];\n}\n\nfunction sortTriangles(centerLatitudes: number[], indices: TriangleIndexArray): [number[], TriangleIndexArray] {\n    const triangleCount = centerLatitudes.length;\n    assert(indices.length === triangleCount);\n\n    // Sorting triangles\n    const triangleIndexes = Array.from({length: triangleCount}, (v, i) => i);\n\n    triangleIndexes.sort((idx1: number, idx2: number) => {\n        return centerLatitudes[idx1] - centerLatitudes[idx2];\n    });\n\n    const sortedCenterLatitudes = [];\n    const sortedIndices = new TriangleIndexArray();\n\n    for (let i = 0; i < triangleIndexes.length; i++) {\n        const idx = triangleIndexes[i];\n        sortedCenterLatitudes.push(centerLatitudes[idx]);\n        const i0 = idx * 3;\n        const i1 = i0 + 1;\n        const i2 = i1 + 1;\n        sortedIndices.emplaceBack(indices.uint16[i0], indices.uint16[i1], indices.uint16[i2]);\n    }\n\n    return [sortedCenterLatitudes, sortedIndices];\n}\n\n/**\n * A data source containing an image.\n * See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-image) for detailed documentation of options.\n *\n * @example\n * // add to map\n * map.addSource('some id', {\n *     type: 'image',\n *     url: 'https://www.mapbox.com/images/foo.png',\n *     coordinates: [\n *         [-76.54, 39.18],\n *         [-76.52, 39.18],\n *         [-76.52, 39.17],\n *         [-76.54, 39.17]\n *     ]\n * });\n *\n * // update coordinates\n * const mySource = map.getSource('some id');\n * mySource.setCoordinates([\n *     [-76.54335737228394, 39.18579907229748],\n *     [-76.52803659439087, 39.1838364847587],\n *     [-76.5295386314392, 39.17683392507606],\n *     [-76.54520273208618, 39.17876344106642]\n * ]);\n *\n * // update url and coordinates simultaneously\n * mySource.updateImage({\n *     url: 'https://www.mapbox.com/images/bar.png',\n *     coordinates: [\n *         [-76.54335737228394, 39.18579907229748],\n *         [-76.52803659439087, 39.1838364847587],\n *         [-76.5295386314392, 39.17683392507606],\n *         [-76.54520273208618, 39.17876344106642]\n *     ]\n * });\n *\n * map.removeSource('some id');  // remove\n * @see [Example: Add an image](https://www.mapbox.com/mapbox-gl-js/example/image-on-a-map/)\n * @see [Example: Animate a series of images](https://www.mapbox.com/mapbox-gl-js/example/animate-images/)\n */\nclass ImageSource extends Evented implements Source {\n    type: string;\n    id: string;\n    scope: string;\n    minzoom: number;\n    maxzoom: number;\n    tileSize: number;\n    url: ?string;\n    width: number;\n    height: number;\n\n    coordinates: Coordinates;\n    tiles: {[_: string]: Tile};\n    options: any;\n    dispatcher: Dispatcher;\n    map: Map;\n    texture: Texture | UserManagedTexture | null;\n    image: HTMLImageElement | ImageBitmap | ImageData;\n    // $FlowFixMe\n    tileID: ?CanonicalTileID;\n    onNorthPole: boolean;\n    onSouthPole: boolean;\n    _unsupportedCoords: boolean;\n    _boundsArray: ?RasterBoundsArray;\n    boundsBuffer: ?VertexBuffer;\n    boundsSegments: ?SegmentVector;\n    elevatedGlobeVertexBuffer: ?VertexBuffer;\n    elevatedGlobeIndexBuffer: ?IndexBuffer;\n    elevatedGlobeSegments: ?SegmentVector;\n    elevatedGlobeTrianglesCenterLongitudes: ?number[];\n    maxLongitudeTriangleSize: number;\n    elevatedGlobeGridMatrix: ?Float32Array;\n    _loaded: boolean;\n    _dirty: boolean;\n    _imageRequest: ?Cancelable;\n    perspectiveTransform: [number, number];\n    elevatedGlobePerspectiveTransform: [number, number];\n\n    /**\n     * @private\n     */\n    constructor(id: string, options: ImageSourceSpecification | VideoSourceSpecification | CanvasSourceSpecification, dispatcher: Dispatcher, eventedParent: Evented) {\n        super();\n        this.id = id;\n        this.dispatcher = dispatcher;\n        this.coordinates = options.coordinates;\n\n        this.type = 'image';\n        this.minzoom = 0;\n        this.maxzoom = 22;\n        this.tileSize = 512;\n        this.tiles = {};\n        this._loaded = false;\n        this.onNorthPole = false;\n        this.onSouthPole = false;\n\n        this.setEventedParent(eventedParent);\n\n        this.options = options;\n        this._dirty = false;\n    }\n\n    load(newCoordinates?: Coordinates, loaded?: boolean) {\n        this._loaded = loaded || false;\n        this.fire(new Event('dataloading', {dataType: 'source'}));\n\n        this.url = this.options.url;\n        if (!this.url) {\n            if (newCoordinates) {\n                this.coordinates = newCoordinates;\n            }\n            this._loaded = true;\n            this._finishLoading();\n            return;\n        }\n\n        this._imageRequest = getImage(this.map._requestManager.transformRequest(this.url, ResourceType.Image), (err, image) => {\n            this._imageRequest = null;\n            this._loaded = true;\n            if (err) {\n                this.fire(new ErrorEvent(err));\n            } else if (image) {\n                if (image instanceof HTMLImageElement) {\n                    this.image = browser.getImageData(image);\n                } else {\n                    this.image = image;\n                }\n                this._dirty = true;\n                this.width = this.image.width;\n                this.height = this.image.height;\n                if (newCoordinates) {\n                    this.coordinates = newCoordinates;\n                }\n                this._finishLoading();\n            }\n        });\n    }\n\n    loaded(): boolean {\n        return this._loaded;\n    }\n\n    /**\n     * Updates the image URL and, optionally, the coordinates. To avoid having the image flash after changing,\n     * set the `raster-fade-duration` paint property on the raster layer to 0.\n     *\n     * @param {Object} options Options object.\n     * @param {string} [options.url] Required image URL.\n     * @param {Array<Array<number>>} [options.coordinates] Four geographical coordinates,\n     * represented as arrays of longitude and latitude numbers, which define the corners of the image.\n     * The coordinates start at the top left corner of the image and proceed in clockwise order.\n     * They do not have to represent a rectangle.\n     * @returns {ImageSource} Returns itself to allow for method chaining.\n     * @example\n     * // Add to an image source to the map with some initial URL and coordinates\n     * map.addSource('image_source_id', {\n     *     type: 'image',\n     *     url: 'https://www.mapbox.com/images/foo.png',\n     *     coordinates: [\n     *         [-76.54, 39.18],\n     *         [-76.52, 39.18],\n     *         [-76.52, 39.17],\n     *         [-76.54, 39.17]\n     *     ]\n     * });\n     * // Then update the image URL and coordinates\n     * imageSource.updateImage({\n     *     url: 'https://www.mapbox.com/images/bar.png',\n     *     coordinates: [\n     *         [-76.5433, 39.1857],\n     *         [-76.5280, 39.1838],\n     *         [-76.5295, 39.1768],\n     *         [-76.5452, 39.1787]\n     *     ]\n     * });\n     */\n    updateImage(options: {url: string, coordinates?: Coordinates}): this {\n        if (!options.url) {\n            return this;\n        }\n        if (this._imageRequest && options.url !== this.options.url) {\n            this._imageRequest.cancel();\n            this._imageRequest = null;\n        }\n        this.options.url = options.url;\n        this.load(options.coordinates, this._loaded);\n        return this;\n    }\n\n    setTexture(texture: ImageSourceTexture): this {\n        if (!(texture.handle instanceof WebGLTexture)) {\n            throw new Error(`The provided handle is not a WebGLTexture instance`);\n        }\n        const context = this.map.painter.context;\n        this.texture = new UserManagedTexture(context, texture.handle);\n        this.width = texture.dimensions[0];\n        this.height = texture.dimensions[1];\n        this._dirty = false;\n        this._loaded = true;\n        this._finishLoading();\n        return this;\n    }\n\n    _finishLoading() {\n        if (this.map) {\n            this.setCoordinates(this.coordinates);\n            this.fire(new Event('data', {dataType: 'source', sourceDataType: 'metadata'}));\n        }\n    }\n\n    // $FlowFixMe[method-unbinding]\n    onAdd(map: Map) {\n        this.map = map;\n        this.load();\n    }\n\n    // $FlowFixMe[method-unbinding]\n    onRemove() {\n        if (this._imageRequest) {\n            this._imageRequest.cancel();\n            this._imageRequest = null;\n        }\n        if (this.texture && !(this.texture instanceof UserManagedTexture)) this.texture.destroy();\n        if (this.boundsBuffer) {\n            this.boundsBuffer.destroy();\n            if (this.elevatedGlobeVertexBuffer) {\n                this.elevatedGlobeVertexBuffer.destroy();\n            }\n            if (this.elevatedGlobeIndexBuffer) {\n                this.elevatedGlobeIndexBuffer.destroy();\n            }\n        }\n    }\n\n    /**\n     * Sets the image's coordinates and re-renders the map.\n     *\n     * @param {Array<Array<number>>} coordinates Four geographical coordinates,\n     * represented as arrays of longitude and latitude numbers, which define the corners of the image.\n     * The coordinates start at the top left corner of the image and proceed in clockwise order.\n     * They do not have to represent a rectangle.\n     * @returns {ImageSource} Returns itself to allow for method chaining.\n     * @example\n     * // Add an image source to the map with some initial coordinates\n     * map.addSource('image_source_id', {\n     *     type: 'image',\n     *     url: 'https://www.mapbox.com/images/foo.png',\n     *     coordinates: [\n     *         [-76.54, 39.18],\n     *         [-76.52, 39.18],\n     *         [-76.52, 39.17],\n     *         [-76.54, 39.17]\n     *     ]\n     * });\n     * // Then update the image coordinates\n     * imageSource.setCoordinates([\n     *     [-76.5433, 39.1857],\n     *     [-76.5280, 39.1838],\n     *     [-76.5295, 39.1768],\n     *     [-76.5452, 39.1787]\n     * ]);\n     */\n    setCoordinates(coordinates: Coordinates): this {\n        this.coordinates = coordinates;\n        this._boundsArray = undefined;\n        this._unsupportedCoords = false;\n\n        if (!coordinates.length) {\n            assert(false);\n            return this;\n        }\n        this.onNorthPole = false;\n        this.onSouthPole = false;\n        let minLat = coordinates[0][1];\n        let maxLat = coordinates[0][1];\n        for (const coord of coordinates) {\n            if (coord[1] > maxLat) {\n                maxLat = coord[1];\n            }\n            if (coord[1] < minLat) {\n                minLat = coord[1];\n            }\n        }\n        const midLat = (maxLat + minLat) / 2.0;\n        if (midLat > MAX_MERCATOR_LATITUDE) {\n            this.onNorthPole = true;\n        } else if (midLat < -MAX_MERCATOR_LATITUDE) {\n            this.onSouthPole = true;\n        }\n\n        if (!this.onNorthPole && !this.onSouthPole) {\n            // Calculate which mercator tile is suitable for rendering the video in\n            // and create a buffer with the corner coordinates. These coordinates\n            // may be outside the tile, because raster tiles aren't clipped when rendering.\n\n            // transform the geo coordinates into (zoom 0) tile space coordinates\n            // $FlowFixMe[method-unbinding]\n            const cornerCoords = coordinates.map(MercatorCoordinate.fromLngLat);\n\n            // Compute the coordinates of the tile we'll use to hold this image's\n            // render data\n            this.tileID = getCoordinatesCenterTileID(cornerCoords);\n\n            // Constrain min/max zoom to our tile's zoom level in order to force\n            // SourceCache to request this tile (no matter what the map's zoom\n            // level)\n            this.minzoom = this.maxzoom = this.tileID.z;\n        }\n\n        this.fire(new Event('data', {dataType:'source', sourceDataType: 'content'}));\n        return this;\n    }\n\n    // $FlowFixMe[method-unbinding]\n    _clear() {\n        this._boundsArray = undefined;\n        this._unsupportedCoords = false;\n    }\n\n    _prepareData(context: Context) {\n        for (const w in this.tiles) {\n            const tile = this.tiles[w];\n            if (tile.state !== 'loaded') {\n                tile.state = 'loaded';\n                tile.texture = this.texture;\n            }\n        }\n\n        if (this._boundsArray || this.onNorthPole || this.onSouthPole || this._unsupportedCoords) return;\n\n        const globalTileTr = tileTransform(new CanonicalTileID(0, 0, 0), this.map.transform.projection);\n\n        const globalTileCoords = [\n            globalTileTr.projection.project(this.coordinates[0][0], this.coordinates[0][1]),\n            globalTileTr.projection.project(this.coordinates[1][0], this.coordinates[1][1]),\n            globalTileTr.projection.project(this.coordinates[2][0], this.coordinates[2][1]),\n            globalTileTr.projection.project(this.coordinates[3][0], this.coordinates[3][1])\n        ];\n\n        if (!isConvex(globalTileCoords)) {\n            console.warn('Image source coordinates are defining non-convex area in the Mercator projection');\n            this._unsupportedCoords = true;\n            return;\n        }\n\n        const tileTr = tileTransform(this.tileID, this.map.transform.projection);\n\n        // Transform the corner coordinates into the coordinate space of our tile.\n        const [tl, tr, br, bl] = this.coordinates.map((coord) => {\n            const projectedCoord = tileTr.projection.project(coord[0], coord[1]);\n            return getTilePoint(tileTr, projectedCoord)._round();\n        });\n\n        this.perspectiveTransform = getPerspectiveTransform(tl.x, tl.y, tr.x, tr.y, br.x, br.y, bl.x, bl.y);\n\n        const boundsArray = this._boundsArray = new RasterBoundsArray();\n        boundsArray.emplaceBack(tl.x, tl.y, 0, 0);\n        boundsArray.emplaceBack(tr.x, tr.y, EXTENT, 0);\n        boundsArray.emplaceBack(bl.x, bl.y, 0, EXTENT);\n        boundsArray.emplaceBack(br.x, br.y, EXTENT, EXTENT);\n\n        if (this.boundsBuffer) {\n            this.boundsBuffer.destroy();\n            if (this.elevatedGlobeVertexBuffer) {\n                this.elevatedGlobeVertexBuffer.destroy();\n            }\n            if (this.elevatedGlobeIndexBuffer) {\n                this.elevatedGlobeIndexBuffer.destroy();\n            }\n        }\n        this.boundsBuffer = context.createVertexBuffer(boundsArray, boundsAttributes.members);\n        this.boundsSegments = SegmentVector.simpleSegment(0, 0, 4, 2);\n\n        // Creating a mesh for elevated rasters in the globe projection.\n        // We want to follow the curve of the globe, but on the same time we can't use and transform\n        // grid buffers from globeSharedBuffers for several reasons:\n        //   * our mesh in the Mercator projection is non-rectangular (for example, can be rotated),\n        //     and the latitude has non-linear dependency from tile y coordinate, so we can't restore\n        //     lat/lon just by multiplying a grid matrix and a vertex;\n        //   * it has limited precision (neighbour points differ only by 1);\n        //   * we also want to store UV coordinates as attributes.\n        // Grid coordinates go from 0 to EXTENT and contain transformed longitude/latitude,\n        // but the grid itself is linear in tile cooridinates, cause we want to get just the same result as with\n        // draped rasters.\n        // We calculate UV using matrix for perspective projection for all vertices and also correct UV interpolation\n        // inside a triangle in shader.\n        // During a transition from the Globe projection to the Mercator projection some triangles becomes stretched.\n        // In order to detect and skip these triangles we sort them by their middle longitude.\n        // We also calculate the maximum longitude size for triangles, and during rendering we find which triangles\n        // are close to the vertical line on the other side of the Globe and skip them - during rendering we can have\n        // two draw calls instead of one (draw all before the gap and after) or just one (dropped triangles are at\n        // the beginning and at the end of our array).\n\n        const cellCount = GLOBE_VERTEX_GRID_SIZE;\n        const lineSize = cellCount + 1;\n        const linesCount = cellCount + 1;\n        const vertexCount = lineSize * linesCount;\n        const triangleCount = cellCount * cellCount * 2;\n        const verticesLongitudes = [];\n        const constrainedCoordinates = constrain(this.coordinates);\n        const [minLng, minLat, lngDiff, latDiff] = calculateMinAndSize(constrainedCoordinates);\n\n        // Vertices\n        {\n            const elevatedGlobeVertexArray = new RasterBoundsArray();\n\n            const [minX, minY, dx, dy] = calculateMinAndSizeForPoints(globalTileCoords);\n\n            const transformToImagePoint = (coord: ProjectedPoint) => {\n                return [(coord.x - minX) / dx, (coord.y - minY) / dy];\n            };\n            const [p0, p1, p2, p3] = globalTileCoords.map(transformToImagePoint);\n            const toUV = getTileToTextureTransformMatrix(p0[0], p0[1], p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);\n            this.elevatedGlobePerspectiveTransform = getPerspectiveTransform(p0[0], p0[1], p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);\n\n            const addVertex = (point: LngLat, tilePoint: ProjectedPoint) => {\n                verticesLongitudes.push(point.lng);\n                const x = Math.round((point.lng - minLng) / lngDiff * EXTENT);\n                const y = Math.round((point.lat - minLat) / latDiff * EXTENT);\n                const imagePoint = transformToImagePoint(tilePoint);\n                const uv = vec3.transformMat3([], [imagePoint[0], imagePoint[1], 1], toUV);\n                const u = Math.round(uv[0] / uv[2] * EXTENT);\n                const v = Math.round(uv[1] / uv[2] * EXTENT);\n                elevatedGlobeVertexArray.emplaceBack(x, y, u, v);\n            };\n\n            const leftDx = globalTileCoords[3].x - globalTileCoords[0].x;\n            const leftDy = globalTileCoords[3].y - globalTileCoords[0].y;\n            const rightDx = globalTileCoords[2].x - globalTileCoords[1].x;\n            const rightDy = globalTileCoords[2].y - globalTileCoords[1].y;\n\n            for (let i = 0; i < linesCount; i++) {\n                const linesPart = i / cellCount;\n                const startLinePoint = [globalTileCoords[0].x + linesPart * leftDx, globalTileCoords[0].y + linesPart * leftDy];\n                const endLinePoint = [globalTileCoords[1].x + linesPart * rightDx, globalTileCoords[1].y + linesPart * rightDy];\n                const lineDx = endLinePoint[0] - startLinePoint[0];\n                const lineDy = endLinePoint[1] - startLinePoint[1];\n\n                for (let j = 0; j < lineSize; j++) {\n                    const linePart = j / cellCount;\n                    const point = {x: startLinePoint[0] + lineDx * linePart, y: startLinePoint[1] + lineDy * linePart, z: 0};\n                    addVertex(globalTileTr.projection.unproject(point.x, point.y), point);\n                }\n            }\n\n            this.elevatedGlobeVertexBuffer = context.createVertexBuffer(elevatedGlobeVertexArray, boundsAttributes.members);\n        }\n\n        // Indices\n        {\n            this.maxLongitudeTriangleSize = 0;\n            let elevatedGlobeTrianglesCenterLongitudes = [];\n\n            let indices = new TriangleIndexArray();\n\n            const processTriangle = (i0: number, i1: number, i2: number) => {\n                indices.emplaceBack(i0, i1, i2);\n\n                const l0 = verticesLongitudes[i0];\n                const l1 = verticesLongitudes[i1];\n                const l2 = verticesLongitudes[i2];\n                const minLongitude = Math.min(Math.min(l0, l1), l2);\n                const maxLongitude = Math.max(Math.max(l0, l1), l2);\n                const diff = maxLongitude - minLongitude;\n                if (diff > this.maxLongitudeTriangleSize) {\n                    this.maxLongitudeTriangleSize = diff;\n                }\n                elevatedGlobeTrianglesCenterLongitudes.push(minLongitude + diff / 2.);\n            };\n\n            for (let i = 0; i < cellCount; i++) {\n                for (let j = 0; j < cellCount; j++) {\n                    // Making indexes the way that after transforming to the Globe projection triangles\n                    // on our side will be rotated clockwise.\n                    // lon\n                    //  ^\n                    //  | 2  3\n                    //  | 0  1\n                    //  +------> lat\n                    const i0 = i * lineSize + j;\n                    const i1 = i0 + 1;\n                    const i2 = i0 + lineSize;\n                    const i3 = i2 + 1;\n                    processTriangle(i0, i2, i1);\n                    processTriangle(i1, i2, i3);\n                }\n            }\n\n            [elevatedGlobeTrianglesCenterLongitudes, indices] = sortTriangles(elevatedGlobeTrianglesCenterLongitudes, indices);\n\n            this.elevatedGlobeTrianglesCenterLongitudes = elevatedGlobeTrianglesCenterLongitudes;\n            this.elevatedGlobeIndexBuffer = context.createIndexBuffer(indices);\n        }\n\n        this.elevatedGlobeSegments = SegmentVector.simpleSegment(0, 0, vertexCount, triangleCount);\n        this.elevatedGlobeGridMatrix = new Float32Array([0, lngDiff / EXTENT, 0, latDiff / EXTENT, 0, 0, minLat, minLng, 0]);\n    }\n\n    // $FlowFixMe[method-unbinding]\n    prepare() {\n        const hasTiles = Object.keys(this.tiles).length !== 0;\n        if (this.tileID && !hasTiles) return;\n\n        const context = this.map.painter.context;\n        const gl = context.gl;\n\n        if (this._dirty && !(this.texture instanceof UserManagedTexture)) {\n            if (!this.texture) {\n                this.texture = new Texture(context, this.image, gl.RGBA);\n                this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n            } else {\n                this.texture.update(this.image);\n            }\n            this._dirty = false;\n        }\n\n        if (!hasTiles) return;\n        this._prepareData(context);\n    }\n\n    loadTile(tile: Tile, callback: Callback<void>) {\n        // We have a single tile -- whoose coordinates are this.tileID -- that\n        // covers the image we want to render.  If that's the one being\n        // requested, set it up with the image; otherwise, mark the tile as\n        // `errored` to indicate that we have no data for it.\n        // If the world wraps, we may have multiple \"wrapped\" copies of the\n        // single tile.\n        if (this.tileID && this.tileID.equals(tile.tileID.canonical)) {\n            this.tiles[String(tile.tileID.wrap)] = tile;\n            tile.buckets = {};\n            callback(null);\n        } else {\n            tile.state = 'errored';\n            callback(null);\n        }\n    }\n\n    serialize(): Object {\n        return {\n            type: 'image',\n            url: this.options.url,\n            coordinates: this.coordinates\n        };\n    }\n\n    hasTransition(): boolean {\n        return false;\n    }\n\n    getSegmentsForLongitude(longitude: number): ?SegmentVector {\n        const segments = this.elevatedGlobeSegments;\n        if (!this.elevatedGlobeTrianglesCenterLongitudes || !segments) {\n            return null;\n        }\n        const longitudes = this.elevatedGlobeTrianglesCenterLongitudes;\n        assert(longitudes.length !== 0);\n\n        // Normalizing longitude so that abs(normalizedLongitude - desiredLongitude) <= 180\n        const normalizeLongitudeTo = (longitude: number, desiredLongitude: number) => {\n            const diff = Math.round((desiredLongitude - longitude) / 360.);\n            return longitude + diff * 360.;\n        };\n\n        let gapLongitude = normalizeLongitudeTo(longitude + 180., longitudes[0]);\n        const ret = new SegmentVector();\n\n        const addTriangleRange = (triangleOffset: number, triangleCount: number) => {\n            ret.segments.push(\n                {\n                    vertexOffset: 0,\n                    primitiveOffset: triangleOffset,\n                    vertexLength: segments.segments[0].vertexLength,\n                    primitiveLength: triangleCount,\n                    sortKey: undefined,\n                    vaos: {}\n                });\n        };\n\n        // +0.01 - just to be sure that we don't draw \"bad\" triangles because of calculation errors\n        const distanceToDrop = 0.51 * this.maxLongitudeTriangleSize;\n        assert(distanceToDrop > 0);\n        assert(distanceToDrop < 180.);\n\n        if (Math.abs(longitudes[0] - gapLongitude) <= distanceToDrop) {\n            const minIdx = upperBound(longitudes, 0, longitudes.length, gapLongitude + distanceToDrop);\n            if (minIdx === longitudes.length) {\n                // Rotated 90 degrees, and one side is almost zero?\n                return ret;\n            }\n            const maxIdx = lowerBound(longitudes, minIdx + 1, longitudes.length, gapLongitude + 360. - distanceToDrop);\n            const count = maxIdx - minIdx;\n            addTriangleRange(minIdx, count);\n            return ret;\n        }\n\n        if (gapLongitude < longitudes[0]) {\n            gapLongitude += 360.;\n        }\n\n        // Looking for the range inside or in the end of our triangles array to skip\n        const minIdx = lowerBound(longitudes, 0, longitudes.length, gapLongitude - distanceToDrop);\n        if (minIdx === longitudes.length) {\n            // Skip nothing\n            addTriangleRange(0, longitudes.length);\n            return ret;\n        }\n\n        addTriangleRange(0, minIdx - 0);\n\n        const maxIdx = upperBound(longitudes, minIdx + 1, longitudes.length, gapLongitude + distanceToDrop);\n        if (maxIdx !== longitudes.length) {\n            addTriangleRange(maxIdx, longitudes.length - maxIdx);\n        }\n\n        return ret;\n    }\n}\n\n/**\n * Given a list of coordinates, get their center as a coordinate.\n *\n * @returns centerpoint\n * @private\n */\nexport function getCoordinatesCenterTileID(coords: Array<MercatorCoordinate>): CanonicalTileID {\n    let minX = Infinity;\n    let minY = Infinity;\n    let maxX = -Infinity;\n    let maxY = -Infinity;\n\n    for (const coord of coords) {\n        minX = Math.min(minX, coord.x);\n        minY = Math.min(minY, coord.y);\n        maxX = Math.max(maxX, coord.x);\n        maxY = Math.max(maxY, coord.y);\n    }\n\n    const dx = maxX - minX;\n    const dy = maxY - minY;\n    const dMax = Math.max(dx, dy);\n    const zoom = Math.max(0, Math.floor(-Math.log(dMax) / Math.LN2));\n    const tilesAtZoom = Math.pow(2, zoom);\n\n    let x = Math.floor((minX + maxX) / 2 * tilesAtZoom);\n    if (x > 1) {\n        x -= 1;\n    }\n\n    return new CanonicalTileID(\n            zoom,\n            x,\n            Math.floor((minY + maxY) / 2 * tilesAtZoom));\n}\n\nexport default ImageSource;\n","// @flow\n\nimport StyleLayer from '../style_layer.js';\n\nimport properties from './raster_style_layer_properties.js';\nimport {Transitionable, Transitioning, PossiblyEvaluated} from '../properties.js';\nimport {renderColorRamp} from '../../util/color_ramp.js';\nimport {RGBAImage} from '../../util/image.js';\nimport ImageSource from '../../source/image_source.js';\n\nimport type {PaintProps} from './raster_style_layer_properties.js';\nimport type {LayerSpecification} from '../../style-spec/types.js';\nimport type Texture from '../../render/texture.js';\nimport type {ConfigOptions} from '../properties.js';\nimport type SourceCache from '../../source/source_cache.js';\n\nexport const COLOR_RAMP_RES = 256;\nexport const COLOR_MIX_FACTOR = (Math.pow(COLOR_RAMP_RES, 2) - 1) / (255 * COLOR_RAMP_RES * (COLOR_RAMP_RES + 3));\n\nclass RasterStyleLayer extends StyleLayer {\n    _transitionablePaint: Transitionable<PaintProps>;\n    _transitioningPaint: Transitioning<PaintProps>;\n    paint: PossiblyEvaluated<PaintProps>;\n\n    colorRamp: RGBAImage;\n    colorRampTexture: ?Texture;\n\n    // Cache the currently-computed range so that we can call updateColorRamp\n    // during raster color rendering, at which point we can make use of the\n    // source's data range in case raster-color-range is not explicitly specified\n    // in the style. This allows us to call multiple times and only update if\n    // it's changed.\n    _curRampRange: [number, number];\n\n    constructor(layer: LayerSpecification, scope: string, options?: ?ConfigOptions) {\n        super(layer, properties, scope, options);\n        this.updateColorRamp();\n        this._curRampRange = [NaN, NaN];\n    }\n\n    getProgramIds(): Array<string> {\n        return ['raster'];\n    }\n\n    hasColorMap(): boolean {\n        const expr = this._transitionablePaint._values['raster-color'].value;\n        return !!expr.value;\n    }\n\n    tileCoverLift(): number {\n        return this.paint.get('raster-elevation');\n    }\n\n    isDraped(sourceCache: ?SourceCache): boolean {\n        // Special handling for raster, where the drapeability depends on the source\n        if (sourceCache && sourceCache._source instanceof ImageSource) {\n            // If tile ID is missing, it's rendered outside of the tile pyramid (eg. poles)\n            if (sourceCache._source.onNorthPole || sourceCache._source.onSouthPole) {\n                return false;\n            }\n        }\n        return this.paint.get('raster-elevation') === 0.0;\n    }\n\n    _handleSpecialPaintPropertyUpdate(name: string) {\n        if (name === 'raster-color' || name === 'raster-color-range') {\n            // Force recomputation\n            this._curRampRange = [NaN, NaN];\n\n            this.updateColorRamp();\n        }\n    }\n\n    updateColorRamp(overrideRange: ?[number, number]) {\n        if (!this.hasColorMap()) return;\n        if (!this._curRampRange) return;\n\n        const expression = this._transitionablePaint._values['raster-color'].value.expression;\n        const [start, end] = overrideRange || this._transitionablePaint._values['raster-color-range'].value.expression.evaluate({zoom: 0}) || [NaN, NaN];\n\n        if (isNaN(start) && isNaN(end)) return;\n        if (start === this._curRampRange[0] && end === this._curRampRange[1]) return;\n\n        this.colorRamp = renderColorRamp({\n            expression,\n            evaluationKey: 'rasterValue',\n            image: this.colorRamp,\n            clips: [{start, end}],\n            resolution: COLOR_RAMP_RES,\n        });\n        this.colorRampTexture = null;\n        this._curRampRange = [start, end];\n    }\n}\n\nexport default RasterStyleLayer;\n","// This file is generated. Edit build/generate-style-code.js, then run `npm run codegen`.\n// @flow\n/* eslint-disable */\n\nimport styleSpec from '../../style-spec/reference/latest.js';\n\nimport {\n    Properties,\n    DataConstantProperty,\n    DataDrivenProperty,\n    ColorRampProperty\n} from '../properties.js';\n\nimport type Color from '../../style-spec/util/color.js';\n\nimport type Formatted from '../../style-spec/expression/types/formatted.js';\n\nimport type ResolvedImage from '../../style-spec/expression/types/resolved_image.js';\n\nexport type LayoutProps = {|\n    \"visibility\": DataConstantProperty<\"visible\" | \"none\">,\n|};\n\nconst layout: Properties<LayoutProps> = new Properties({\n    \"visibility\": new DataConstantProperty(styleSpec[\"layout_raster-particle\"][\"visibility\"]),\n});\n\nexport type PaintProps = {|\n    \"raster-particle-array-band\": DataConstantProperty<string>,\n    \"raster-particle-count\": DataConstantProperty<number>,\n    \"raster-particle-color\": ColorRampProperty,\n    \"raster-particle-max-speed\": DataConstantProperty<number>,\n    \"raster-particle-speed-factor\": DataConstantProperty<number>,\n    \"raster-particle-fade-opacity-factor\": DataConstantProperty<number>,\n    \"raster-particle-reset-rate-factor\": DataConstantProperty<number>,\n|};\n\nconst paint: Properties<PaintProps> = new Properties({\n    \"raster-particle-array-band\": new DataConstantProperty(styleSpec[\"paint_raster-particle\"][\"raster-particle-array-band\"]),\n    \"raster-particle-count\": new DataConstantProperty(styleSpec[\"paint_raster-particle\"][\"raster-particle-count\"]),\n    \"raster-particle-color\": new ColorRampProperty(styleSpec[\"paint_raster-particle\"][\"raster-particle-color\"]),\n    \"raster-particle-max-speed\": new DataConstantProperty(styleSpec[\"paint_raster-particle\"][\"raster-particle-max-speed\"]),\n    \"raster-particle-speed-factor\": new DataConstantProperty(styleSpec[\"paint_raster-particle\"][\"raster-particle-speed-factor\"]),\n    \"raster-particle-fade-opacity-factor\": new DataConstantProperty(styleSpec[\"paint_raster-particle\"][\"raster-particle-fade-opacity-factor\"]),\n    \"raster-particle-reset-rate-factor\": new DataConstantProperty(styleSpec[\"paint_raster-particle\"][\"raster-particle-reset-rate-factor\"]),\n});\n\n// Note: without adding the explicit type annotation, Flow infers weaker types\n// for these objects from their use in the constructor to StyleLayer, as\n// {layout?: Properties<...>, paint: Properties<...>}\nexport default ({ paint, layout }: $Exact<{\n  paint: Properties<PaintProps>, layout: Properties<LayoutProps>\n}>);\n","// @flow\n\nimport StyleLayer from '../style_layer.js';\nimport browser from '../../util/browser.js';\nimport properties from './raster_particle_style_layer_properties.js';\nimport {PossiblyEvaluated} from '../properties.js';\nimport {renderColorRamp} from '../../util/color_ramp.js';\nimport {RGBAImage} from '../../util/image.js';\n\nimport type {ConfigOptions} from \"../properties\";\nimport type {Map as MapboxMap} from '../../ui/map.js';\nimport type {PaintProps} from './raster_particle_style_layer_properties.js';\nimport type {LayerSpecification} from '../../style-spec/types.js';\nimport type Texture from '../../render/texture.js';\nimport type Framebuffer from '../../gl/framebuffer.js';\nimport type SourceCache from '../../source/source_cache.js';\n\nconst COLOR_RAMP_RES = 256;\n\nclass RasterParticleStyleLayer extends StyleLayer {\n    paint: PossiblyEvaluated<PaintProps>;\n\n    // Shared rendering resources\n\n    colorRamp: RGBAImage;\n    colorRampTexture: ?Texture;\n    tileFramebuffer: Framebuffer;\n    particleFramebuffer: Framebuffer;\n\n    previousDrawTimestamp: ?number;\n    lastInvalidatedAt: number;\n\n    constructor(layer: LayerSpecification, scope: string, options?: ?ConfigOptions) {\n        super(layer, properties, scope, options);\n        this._updateColorRamp();\n        this.lastInvalidatedAt = browser.now();\n    }\n\n    onRemove(_: MapboxMap): void {\n        if (this.colorRampTexture) {\n            this.colorRampTexture.destroy();\n        }\n\n        if (this.tileFramebuffer) {\n            this.tileFramebuffer.destroy();\n        }\n\n        if (this.particleFramebuffer) {\n            this.particleFramebuffer.destroy();\n        }\n    }\n\n    hasColorMap(): boolean {\n        const expr = this._transitionablePaint._values['raster-particle-color'].value;\n        return !!expr.value;\n    }\n\n    getProgramIds(): Array<string> {\n        return ['rasterParticle'];\n    }\n\n    hasOffscreenPass(): boolean {\n        return this.visibility !== 'none';\n    }\n\n    isDraped(_: ?SourceCache): boolean {\n        return false;\n    }\n\n    _handleSpecialPaintPropertyUpdate(name: string) {\n        if (name === 'raster-particle-color' || name === 'raster-particle-max-speed') {\n            this._updateColorRamp();\n            this._invalidateAnimationState();\n        }\n\n        if (name === 'raster-particle-count') {\n            this._invalidateAnimationState();\n        }\n    }\n\n    _updateColorRamp() {\n        if (!this.hasColorMap()) return;\n\n        const expression = this._transitionablePaint._values['raster-particle-color'].value.expression;\n        const end = this._transitionablePaint._values['raster-particle-max-speed'].value.expression.evaluate({zoom: 0});\n\n        this.colorRamp = renderColorRamp({\n            expression,\n            evaluationKey: 'rasterParticleSpeed',\n            image: this.colorRamp,\n            clips: [{start:0, end}],\n            resolution: COLOR_RAMP_RES,\n        });\n        this.colorRampTexture = null;\n    }\n\n    _invalidateAnimationState() {\n        this.lastInvalidatedAt = browser.now();\n    }\n}\n\nexport {COLOR_RAMP_RES};\nexport default RasterParticleStyleLayer;\n","// @flow\n\nimport StyleLayer from '../style_layer.js';\nimport MercatorCoordinate from '../../geo/mercator_coordinate.js';\nimport type {Map} from '../../ui/map.js';\nimport assert from 'assert';\n\nimport type {ValidationErrors} from '../validate_style.js';\nimport type {ProjectionSpecification} from '../../style-spec/types.js';\nimport type SourceCache from '../../source/source_cache.js';\n\ntype CustomRenderMethod = (gl: WebGL2RenderingContext, matrix: Array<number>, projection: ?ProjectionSpecification, projectionToMercatorMatrix: ?Array<number>, projectionToMercatorTransition: ?number, centerInMercator: ?Array<number>, pixelsPerMeterRatio: ?number) => void;\n\n/**\n * Interface for custom style layers. This is a specification for\n * implementers to model: it is not an exported method or class.\n *\n * Custom layers allow a user to render directly into the map's GL context using the map's camera.\n * These layers can be added between any regular layers using {@link Map#addLayer}.\n *\n * Custom layers must have a unique `id` and must have the `type` of `\"custom\"`.\n * They must implement `render` and may implement `prerender`, `onAdd` and `onRemove`.\n * They can trigger rendering using {@link Map#triggerRepaint}\n * and they should appropriately handle {@link Map.event:webglcontextlost} and\n * {@link Map.event:webglcontextrestored}.\n *\n * The `renderingMode` property controls whether the layer is treated as a `\"2d\"` or `\"3d\"` map layer. Use:\n * - `\"renderingMode\": \"3d\"` to use the depth buffer and share it with other layers\n * - `\"renderingMode\": \"2d\"` to add a layer with no depth. If you need to use the depth buffer for a `\"2d\"` layer you must use an offscreen\n *   framebuffer and {@link CustomLayerInterface#prerender}.\n *\n * @interface CustomLayerInterface\n * @property {string} id A unique layer id.\n * @property {string} type The layer's type. Must be `\"custom\"`.\n * @property {string} renderingMode Either `\"2d\"` or `\"3d\"`. Defaults to `\"2d\"`.\n * @example\n * // Custom layer implemented as ES6 class\n * class NullIslandLayer {\n *     constructor() {\n *         this.id = 'null-island';\n *         this.type = 'custom';\n *         this.renderingMode = '2d';\n *     }\n *\n *     onAdd(map, gl) {\n *         const vertexSource = `\n *         uniform mat4 u_matrix;\n *         void main() {\n *             gl_Position = u_matrix * vec4(0.5, 0.5, 0.0, 1.0);\n *             gl_PointSize = 20.0;\n *         }`;\n *\n *         const fragmentSource = `\n *         void main() {\n *             gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n *         }`;\n *\n *         const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n *         gl.shaderSource(vertexShader, vertexSource);\n *         gl.compileShader(vertexShader);\n *         const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n *         gl.shaderSource(fragmentShader, fragmentSource);\n *         gl.compileShader(fragmentShader);\n *\n *         this.program = gl.createProgram();\n *         gl.attachShader(this.program, vertexShader);\n *         gl.attachShader(this.program, fragmentShader);\n *         gl.linkProgram(this.program);\n *     }\n *\n *     render(gl, matrix) {\n *         gl.useProgram(this.program);\n *         gl.uniformMatrix4fv(gl.getUniformLocation(this.program, \"u_matrix\"), false, matrix);\n *         gl.drawArrays(gl.POINTS, 0, 1);\n *     }\n * }\n *\n * map.on('load', () => {\n *     map.addLayer(new NullIslandLayer());\n * });\n * @see [Example: Add a custom style layer](https://docs.mapbox.com/mapbox-gl-js/example/custom-style-layer/)\n * @see [Example: Add a 3D model](https://docs.mapbox.com/mapbox-gl-js/example/add-3d-model/)\n */\n\n/**\n * Optional method called when the layer has been added to the Map with {@link Map#addLayer}. This\n * gives the layer a chance to initialize gl resources and register event listeners.\n *\n * @function\n * @memberof CustomLayerInterface\n * @instance\n * @name onAdd\n * @param {Map} map The Map this custom layer was just added to.\n * @param {WebGL2RenderingContext} gl The gl context for the map.\n */\n\n/**\n * Optional method called when the layer has been removed from the Map with {@link Map#removeLayer}. This\n * gives the layer a chance to clean up gl resources and event listeners.\n *\n * @function\n * @memberof CustomLayerInterface\n * @instance\n * @name onRemove\n * @param {Map} map The Map this custom layer was just added to.\n * @param {WebGL2RenderingContext} gl The gl context for the map.\n */\n\n/**\n * Optional method called during a render frame to allow a layer to prepare resources or render into a texture.\n *\n * The layer cannot make any assumptions about the current GL state and must bind a framebuffer before rendering.\n *\n * @function\n * @memberof CustomLayerInterface\n * @instance\n * @name prerender\n * @param {WebGL2RenderingContext} gl The map's gl context.\n * @param {Array<number>} matrix The map's camera matrix. It projects spherical mercator\n * coordinates to gl coordinates. The mercator coordinate `[0, 0]` represents the\n * top left corner of the mercator world and `[1, 1]` represents the bottom right corner. When\n * the `renderingMode` is `\"3d\"`, the z coordinate is conformal. A box with identical x, y, and z\n * lengths in mercator units would be rendered as a cube. {@link MercatorCoordinate}.fromLngLat\n * can be used to project a `LngLat` to a mercator coordinate.\n */\n\n/**\n * Called during a render frame allowing the layer to draw into the GL context.\n *\n * The layer can assume blending and depth state is set to allow the layer to properly\n * blend and clip other layers. The layer cannot make any other assumptions about the\n * current GL state.\n *\n * If the layer needs to render to a texture, it should implement the `prerender` method\n * to do this and only use the `render` method for drawing directly into the main framebuffer.\n *\n * The blend function is set to `gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA)`. This expects\n * colors to be provided in premultiplied alpha form where the `r`, `g` and `b` values are already\n * multiplied by the `a` value. If you are unable to provide colors in premultiplied form you\n * may want to change the blend function to\n * `gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA)`.\n *\n * @function\n * @memberof CustomLayerInterface\n * @instance\n * @name render\n * @param {WebGL2RenderingContext} gl The map's gl context.\n * @param {Array<number>} matrix The map's camera matrix. It projects spherical mercator\n * coordinates to gl coordinates. The spherical mercator coordinate `[0, 0]` represents the\n * top left corner of the mercator world and `[1, 1]` represents the bottom right corner. When\n * the `renderingMode` is `\"3d\"`, the z coordinate is conformal. A box with identical x, y, and z\n * lengths in mercator units would be rendered as a cube. {@link MercatorCoordinate}.fromLngLat\n * can be used to project a `LngLat` to a mercator coordinate.\n */\nexport type CustomLayerInterface = {\n    id: string,\n    type: 'custom',\n    slot?: string | void,\n    renderingMode?: '2d' | '3d',\n    render: CustomRenderMethod,\n    prerender?: CustomRenderMethod | void,\n    renderToTile?: (gl: WebGL2RenderingContext, tileId: MercatorCoordinate) => void,\n    shouldRerenderTiles?: () => boolean,\n    onAdd?: (map: Map, gl: WebGL2RenderingContext) => void,\n    onRemove?: (map: Map, gl: WebGL2RenderingContext) => void\n}\n\nexport function validateCustomStyleLayer(layerObject: CustomLayerInterface): ValidationErrors {\n    const errors = [];\n    const id = layerObject.id;\n\n    if (id === undefined) {\n        errors.push({\n            message: `layers.${id}: missing required property \"id\"`\n        });\n    }\n\n    if (layerObject.render === undefined) {\n        errors.push({\n            message: `layers.${id}: missing required method \"render\"`\n        });\n    }\n\n    if (layerObject.renderingMode &&\n        layerObject.renderingMode !== '2d' &&\n        layerObject.renderingMode !== '3d') {\n        errors.push({\n            message: `layers.${id}: property \"renderingMode\" must be either \"2d\" or \"3d\"`\n        });\n    }\n\n    return errors;\n}\n\nclass CustomStyleLayer extends StyleLayer {\n\n    implementation: CustomLayerInterface;\n\n    constructor(implementation: CustomLayerInterface, scope: string) {\n        super(implementation, {}, scope);\n        this.implementation = implementation;\n        if (implementation.slot) this.slot = implementation.slot;\n    }\n\n    is3D(): boolean {\n        return this.implementation.renderingMode === '3d';\n    }\n\n    hasOffscreenPass(): boolean {\n        return this.implementation.prerender !== undefined;\n    }\n\n    isDraped(_: ?SourceCache): boolean {\n        return this.implementation.renderToTile !== undefined;\n    }\n\n    shouldRedrape(): boolean {\n        return !!this.implementation.shouldRerenderTiles && this.implementation.shouldRerenderTiles();\n    }\n\n    recalculate() {}\n    updateTransitions() {}\n    hasTransition(): boolean {\n        return false;\n    }\n\n    serialize(): any {\n        assert(false, \"Custom layers cannot be serialized\");\n    }\n\n    // $FlowFixMe[method-unbinding]\n    onAdd(map: Map) {\n        if (this.implementation.onAdd) {\n            this.implementation.onAdd(map, map.painter.context.gl);\n        }\n    }\n\n    // $FlowFixMe[method-unbinding]\n    onRemove(map: Map) {\n        if (this.implementation.onRemove) {\n            this.implementation.onRemove(map, map.painter.context.gl);\n        }\n    }\n}\n\nexport default CustomStyleLayer;\n","// This file is generated. Edit build/generate-style-code.js, then run `npm run codegen`.\n// @flow\n/* eslint-disable */\n\nimport styleSpec from '../../style-spec/reference/latest.js';\n\nimport {\n    Properties,\n    DataConstantProperty,\n    DataDrivenProperty,\n    ColorRampProperty\n} from '../properties.js';\n\nimport type Color from '../../style-spec/util/color.js';\n\nimport type Formatted from '../../style-spec/expression/types/formatted.js';\n\nimport type ResolvedImage from '../../style-spec/expression/types/resolved_image.js';\n\nexport type LayoutProps = {|\n    \"visibility\": DataConstantProperty<\"visible\" | \"none\">,\n|};\n\nconst layout: Properties<LayoutProps> = new Properties({\n    \"visibility\": new DataConstantProperty(styleSpec[\"layout_sky\"][\"visibility\"]),\n});\n\nexport type PaintProps = {|\n    \"sky-type\": DataConstantProperty<\"gradient\" | \"atmosphere\">,\n    \"sky-atmosphere-sun\": DataConstantProperty<[number, number]>,\n    \"sky-atmosphere-sun-intensity\": DataConstantProperty<number>,\n    \"sky-gradient-center\": DataConstantProperty<[number, number]>,\n    \"sky-gradient-radius\": DataConstantProperty<number>,\n    \"sky-gradient\": ColorRampProperty,\n    \"sky-atmosphere-halo-color\": DataConstantProperty<Color>,\n    \"sky-atmosphere-color\": DataConstantProperty<Color>,\n    \"sky-opacity\": DataConstantProperty<number>,\n|};\n\nconst paint: Properties<PaintProps> = new Properties({\n    \"sky-type\": new DataConstantProperty(styleSpec[\"paint_sky\"][\"sky-type\"]),\n    \"sky-atmosphere-sun\": new DataConstantProperty(styleSpec[\"paint_sky\"][\"sky-atmosphere-sun\"]),\n    \"sky-atmosphere-sun-intensity\": new DataConstantProperty(styleSpec[\"paint_sky\"][\"sky-atmosphere-sun-intensity\"]),\n    \"sky-gradient-center\": new DataConstantProperty(styleSpec[\"paint_sky\"][\"sky-gradient-center\"]),\n    \"sky-gradient-radius\": new DataConstantProperty(styleSpec[\"paint_sky\"][\"sky-gradient-radius\"]),\n    \"sky-gradient\": new ColorRampProperty(styleSpec[\"paint_sky\"][\"sky-gradient\"]),\n    \"sky-atmosphere-halo-color\": new DataConstantProperty(styleSpec[\"paint_sky\"][\"sky-atmosphere-halo-color\"]),\n    \"sky-atmosphere-color\": new DataConstantProperty(styleSpec[\"paint_sky\"][\"sky-atmosphere-color\"]),\n    \"sky-opacity\": new DataConstantProperty(styleSpec[\"paint_sky\"][\"sky-opacity\"]),\n});\n\n// Note: without adding the explicit type annotation, Flow infers weaker types\n// for these objects from their use in the constructor to StyleLayer, as\n// {layout?: Properties<...>, paint: Properties<...>}\nexport default ({ paint, layout }: $Exact<{\n  paint: Properties<PaintProps>, layout: Properties<LayoutProps>\n}>);\n","// @flow\n\nimport StyleLayer from '../style_layer.js';\nimport properties from './sky_style_layer_properties.js';\nimport {Transitionable, Transitioning, PossiblyEvaluated} from '../properties.js';\nimport {renderColorRamp} from '../../util/color_ramp.js';\nimport {warnOnce, degToRad} from '../../util/util.js';\nimport {vec3, quat} from 'gl-matrix';\nimport assert from 'assert';\n\nimport type {PaintProps} from './sky_style_layer_properties.js';\nimport type Texture from '../../render/texture.js';\nimport type Painter from '../../render/painter.js';\nimport type {LayerSpecification} from '../../style-spec/types.js';\nimport type Framebuffer from '../../gl/framebuffer.js';\nimport type {RGBAImage} from '../../util/image.js';\nimport type SkyboxGeometry from '../../render/skybox_geometry.js';\nimport type {Position} from '../../util/util.js';\nimport type {ConfigOptions} from '../properties.js';\n\nfunction getCelestialDirection(azimuth: number, altitude: number, leftHanded: boolean) {\n    const up = [0, 0, 1];\n    const rotation = quat.identity([]);\n\n    quat.rotateY(rotation, rotation, leftHanded ? -degToRad(azimuth) + Math.PI : degToRad(azimuth));\n    quat.rotateX(rotation, rotation, -degToRad(altitude));\n    vec3.transformQuat(up, up, rotation);\n\n    return vec3.normalize(up, up);\n}\n\nclass SkyLayer extends StyleLayer {\n    _transitionablePaint: Transitionable<PaintProps>;\n    _transitioningPaint: Transitioning<PaintProps>;\n    paint: PossiblyEvaluated<PaintProps>;\n    _lightPosition: Position;\n\n    skyboxFbo: ?Framebuffer;\n    skyboxTexture: ?WebGLTexture;\n    _skyboxInvalidated: ?boolean;\n\n    colorRamp: RGBAImage;\n    colorRampTexture: ?Texture;\n\n    skyboxGeometry: SkyboxGeometry;\n\n    constructor(layer: LayerSpecification, scope: string, options?: ?ConfigOptions) {\n        super(layer, properties, scope, options);\n        this._updateColorRamp();\n    }\n\n    _handleSpecialPaintPropertyUpdate(name: string) {\n        if (name === 'sky-gradient') {\n            this._updateColorRamp();\n        } else if (name === 'sky-atmosphere-sun' ||\n                   name === 'sky-atmosphere-halo-color' ||\n                   name === 'sky-atmosphere-color' ||\n                   name === 'sky-atmosphere-sun-intensity') {\n            this._skyboxInvalidated = true;\n        }\n    }\n\n    _updateColorRamp() {\n        const expression = this._transitionablePaint._values['sky-gradient'].value.expression;\n        this.colorRamp = renderColorRamp({\n            expression,\n            evaluationKey: 'skyRadialProgress'\n        });\n        if (this.colorRampTexture) {\n            this.colorRampTexture.destroy();\n            this.colorRampTexture = null;\n        }\n    }\n\n    needsSkyboxCapture(painter: Painter): boolean {\n        if (!!this._skyboxInvalidated || !this.skyboxTexture || !this.skyboxGeometry) {\n            return true;\n        }\n        if (!this.paint.get('sky-atmosphere-sun')) {\n            const lightPosition = painter.style.light.properties.get('position');\n            return this._lightPosition.azimuthal !== lightPosition.azimuthal ||\n                   this._lightPosition.polar !== lightPosition.polar;\n        }\n        return false;\n    }\n\n    getCenter(painter: Painter, leftHanded: boolean): [number, number, number] {\n        const type = this.paint.get('sky-type');\n        if (type === 'atmosphere') {\n            const sunPosition = this.paint.get('sky-atmosphere-sun');\n            const useLightPosition = !sunPosition;\n            const light = painter.style.light;\n            const lightPosition = light.properties.get('position');\n\n            if (useLightPosition && light.properties.get('anchor') === 'viewport') {\n                warnOnce('The sun direction is attached to a light with viewport anchor, lighting may behave unexpectedly.');\n            }\n\n            return useLightPosition ?\n                getCelestialDirection(lightPosition.azimuthal, -lightPosition.polar + 90, leftHanded) :\n                getCelestialDirection(sunPosition[0], -sunPosition[1] + 90, leftHanded);\n        }\n        assert(type === 'gradient');\n        const direction = this.paint.get('sky-gradient-center');\n        return getCelestialDirection(direction[0], -direction[1] + 90, leftHanded);\n    }\n\n    isSky(): boolean {\n        return true;\n    }\n\n    markSkyboxValid(painter: Painter) {\n        this._skyboxInvalidated = false;\n        this._lightPosition = painter.style.light.properties.get('position');\n    }\n\n    hasOffscreenPass(): boolean {\n        return true;\n    }\n\n    getProgramIds(): string[] | null {\n        const type = this.paint.get('sky-type');\n        if (type === 'atmosphere') {\n            return ['skyboxCapture', 'skybox'];\n        } else if (type === 'gradient') {\n            return ['skyboxGradient'];\n        }\n        return null;\n    }\n}\n\nexport default SkyLayer;\n","// This file is generated. Edit build/generate-style-code.js, then run `npm run codegen`.\n// @flow\n/* eslint-disable */\n\nimport styleSpec from '../../style-spec/reference/latest.js';\n\nimport {\n    Properties,\n    DataConstantProperty,\n    DataDrivenProperty,\n    ColorRampProperty\n} from '../properties.js';\n\nimport type Color from '../../style-spec/util/color.js';\n\nimport type Formatted from '../../style-spec/expression/types/formatted.js';\n\nimport type ResolvedImage from '../../style-spec/expression/types/resolved_image.js';\n\n\nexport type PaintProps = {};\n\nconst paint: Properties<PaintProps> = new Properties({\n});\n\n// Note: without adding the explicit type annotation, Flow infers weaker types\n// for these objects from their use in the constructor to StyleLayer, as\n// {layout?: Properties<...>, paint: Properties<...>}\nexport default ({ paint }: $Exact<{\n  paint: Properties<PaintProps>\n}>);\n","// @flow\n\nimport LngLat from '../lng_lat.js';\nimport MercatorCoordinate, {MAX_MERCATOR_LATITUDE} from '../mercator_coordinate.js';\nimport {mat4, mat2} from 'gl-matrix';\nimport {clamp, smoothstep} from '../../util/util.js';\n\nimport type Projection from './projection.js';\nimport type Transform from '../transform.js';\n\nexport default function getProjectionAdjustments(transform: Transform, withoutRotation?: boolean): Array<number> {\n    const interpT = getProjectionInterpolationT(transform.projection, transform.zoom, transform.width, transform.height);\n    const matrix = getShearAdjustment(transform.projection, transform.zoom, transform.center, interpT, withoutRotation);\n\n    const scaleAdjustment = getScaleAdjustment(transform);\n    mat4.scale(matrix, matrix, [scaleAdjustment, scaleAdjustment, 1]);\n\n    return matrix;\n}\n\nexport function getScaleAdjustment(transform: Transform): number {\n    const projection = transform.projection;\n    const interpT = getProjectionInterpolationT(transform.projection, transform.zoom, transform.width, transform.height);\n    const zoomAdjustment = getZoomAdjustment(projection, transform.center);\n    const zoomAdjustmentOrigin = getZoomAdjustment(projection, LngLat.convert(projection.center));\n    const scaleAdjustment = Math.pow(2, zoomAdjustment * interpT + (1 - interpT) * zoomAdjustmentOrigin);\n    return scaleAdjustment;\n}\n\nexport function getProjectionAdjustmentInverted(transform: Transform): Array<number> {\n    const m = getProjectionAdjustments(transform, true);\n    return mat2.invert([], [\n        m[0], m[1],\n        m[4], m[5]]);\n}\n\nexport function getProjectionInterpolationT(projection: Projection, zoom: number, width: number, height: number, maxSize: number = Infinity): number {\n    const range = projection.range;\n    if (!range) return 0;\n\n    const size = Math.min(maxSize, Math.max(width, height));\n    // The interpolation ranges are manually defined based on what makes\n    // sense in a 1024px wide map. Adjust the ranges to the current size\n    // of the map. The smaller the map, the earlier you can start unskewing.\n    const rangeAdjustment = Math.log(size / 1024) / Math.LN2;\n    const zoomA = range[0] + rangeAdjustment;\n    const zoomB = range[1] + rangeAdjustment;\n    const t = smoothstep(zoomA, zoomB, zoom);\n    return t;\n}\n\n// approx. kilometers per longitude degree at equator\nconst offset = 1 / 40000;\n\n/*\n * Calculates the scale difference between Mercator and the given projection at a certain location.\n */\nfunction getZoomAdjustment(projection: Projection, loc: LngLat) {\n    // make sure we operate within mercator space for adjustments (they can go over for other projections)\n    const lat = clamp(loc.lat, -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE);\n\n    const loc1 = new LngLat(loc.lng - 180 * offset, lat);\n    const loc2 = new LngLat(loc.lng + 180 * offset, lat);\n\n    const p1 = projection.project(loc1.lng, lat);\n    const p2 = projection.project(loc2.lng, lat);\n\n    const m1 = MercatorCoordinate.fromLngLat(loc1);\n    const m2 = MercatorCoordinate.fromLngLat(loc2);\n\n    const pdx = p2.x - p1.x;\n    const pdy = p2.y - p1.y;\n    const mdx = m2.x - m1.x;\n    const mdy = m2.y - m1.y;\n\n    const scale = Math.sqrt((mdx * mdx + mdy * mdy) / (pdx * pdx + pdy * pdy));\n\n    return Math.log(scale) / Math.LN2;\n}\n\nfunction getShearAdjustment(projection: Projection, zoom: number, loc: LngLat, interpT: number, withoutRotation?: boolean) {\n\n    // create two locations a tiny amount (~1km) east and west of the given location\n    const locw = new LngLat(loc.lng - 180 * offset, loc.lat);\n    const loce = new LngLat(loc.lng + 180 * offset, loc.lat);\n\n    const pw = projection.project(locw.lng, locw.lat);\n    const pe = projection.project(loce.lng, loce.lat);\n\n    const pdx = pe.x - pw.x;\n    const pdy = pe.y - pw.y;\n\n    // Calculate how much the map would need to be rotated to make east-west in\n    // projected coordinates be left-right\n    const angleAdjust = -Math.atan2(pdy, pdx);\n\n    // Pick a location identical to the original one except for poles to make sure we're within mercator bounds\n    const mc2 = MercatorCoordinate.fromLngLat(loc);\n    mc2.y = clamp(mc2.y, -1 + offset, 1 - offset);\n    const loc2 = mc2.toLngLat();\n    const p2 = projection.project(loc2.lng, loc2.lat);\n\n    // Find the projected coordinates of two locations, one slightly south and one slightly east.\n    // Then calculate the transform that would make the projected coordinates of the two locations be:\n    // - equal distances from the original location\n    // - perpendicular to one another\n    //\n    // Only the position of the coordinate to the north is adjusted.\n    // The coordinate to the east stays where it is.\n    const mc3 = MercatorCoordinate.fromLngLat(loc2);\n    mc3.x += offset;\n    const loc3 = mc3.toLngLat();\n    const p3 = projection.project(loc3.lng, loc3.lat);\n    const pdx3 = p3.x - p2.x;\n    const pdy3 = p3.y - p2.y;\n    const delta3 = rotate(pdx3, pdy3, angleAdjust);\n\n    const mc4 = MercatorCoordinate.fromLngLat(loc2);\n    mc4.y += offset;\n    const loc4 = mc4.toLngLat();\n    const p4 = projection.project(loc4.lng, loc4.lat);\n    const pdx4 = p4.x - p2.x;\n    const pdy4 = p4.y - p2.y;\n    const delta4 = rotate(pdx4, pdy4, angleAdjust);\n\n    const scale = Math.abs(delta3.x) / Math.abs(delta4.y);\n\n    const unrotate = mat4.identity([]);\n    mat4.rotateZ(unrotate, unrotate, (-angleAdjust) * (1 - (withoutRotation ? 0 : interpT)));\n\n    // unskew\n    const shear = mat4.identity([]);\n    mat4.scale(shear, shear, [1, 1 - (1 - scale) * interpT, 1]);\n    shear[4] = -delta4.x / delta4.y * interpT;\n\n    // unrotate\n    mat4.rotateZ(shear, shear, angleAdjust);\n\n    mat4.multiply(shear, unrotate, shear);\n\n    return shear;\n}\n\nfunction rotate(x: number, y: number, angle: number) {\n    const cos = Math.cos(angle);\n    const sin = Math.sin(angle);\n    return {\n        x: x * cos - y * sin,\n        y: x * sin + y * cos\n    };\n}\n","// @flow\n\nimport {\n    lngFromMercatorX,\n    latFromMercatorY,\n    mercatorZfromAltitude,\n    getMetersPerPixelAtLatitude\n} from '../../src/geo/mercator_coordinate.js';\nimport {getProjectionInterpolationT} from '../../src/geo/projection/adjustments.js';\nimport {mat4, vec3, quat} from 'gl-matrix';\nimport {degToRad} from '../../src/util/util.js';\nimport {\n    interpolateVec3,\n    globeToMercatorTransition,\n    globeECEFUnitsToPixelScale,\n} from '../../src/geo/projection/globe_util.js';\nimport {latLngToECEF} from '../../src/geo/lng_lat.js';\nimport {GLOBE_RADIUS} from '../../src/geo/projection/globe_constants.js';\nimport {number as interpolate} from '../../src/style-spec/util/interpolate.js';\nimport assert from 'assert';\nimport {Aabb} from '../../src/util/primitives.js';\nimport {polygonIntersectsPolygon} from '../../src/util/intersection_tests.js';\nimport Point from '@mapbox/point-geometry';\n\nimport type {Mat4, Vec3, Quat} from 'gl-matrix';\nimport type Transform from '../../src/geo/transform.js';\n\nexport function rotationScaleYZFlipMatrix(out: Mat4, rotation: Vec3, scale: Vec3) {\n    mat4.identity(out);\n    mat4.rotateZ(out, out, degToRad(rotation[2]));\n    mat4.rotateX(out, out, degToRad(rotation[0]));\n    mat4.rotateY(out, out, degToRad(rotation[1]));\n\n    mat4.scale(out, out, scale);\n\n    // gltf spec uses right handed coordinate space where +y is up. Coordinate space transformation matrix\n    // has to be created for the initial transform to our left handed coordinate space\n    const coordSpaceTransform = [\n        1, 0, 0, 0,\n        0, 0, 1, 0,\n        0, 1, 0, 0,\n        0, 0, 0, 1\n    ];\n\n    mat4.multiply(out, out, coordSpaceTransform);\n}\n\ntype BoxFace = {\n    corners: [number, number, number, number];\n    dotProductWithUp: number;\n}\n\n// corners are in world coordinates.\nexport function getBoxBottomFace(corners: Array<Vec3>, meterToMercator: number): [number, number, number, number] {\n    const zUp =  [0, 0, 1];\n    const boxFaces: BoxFace[] = [{corners: [0, 1, 3, 2], dotProductWithUp : 0},\n        {corners: [1, 5, 2, 6], dotProductWithUp : 0},\n        {corners: [0, 4, 1, 5], dotProductWithUp : 0},\n        {corners: [2, 6, 3, 7], dotProductWithUp : 0},\n        {corners: [4, 7, 5, 6], dotProductWithUp : 0},\n        {corners: [0, 3, 4, 7], dotProductWithUp : 0}];\n    for (const face of boxFaces) {\n        const p0 = corners[face.corners[0]];\n        const p1 = corners[face.corners[1]];\n        const p2 = corners[face.corners[2]];\n        const a = [p1[0] - p0[0], p1[1] - p0[1], meterToMercator * (p1[2] - p0[2])];\n        const b = [p2[0] - p0[0], p2[1] - p0[1], meterToMercator * (p2[2] - p0[2])];\n        const normal = vec3.cross(a, a, b);\n        vec3.normalize(normal, normal);\n        face.dotProductWithUp = vec3.dot(normal, zUp);\n    }\n\n    boxFaces.sort((a, b) => {\n        return a.dotProductWithUp - b.dotProductWithUp;\n    });\n    return boxFaces[0].corners;\n}\n\nexport function rotationFor3Points(out: Quat, p0: Vec3, p1: Vec3, p2: Vec3, h0: number, h1: number, h2: number, meterToMercator: number): Quat {\n    const p0p1 = [p1[0] - p0[0], p1[1] - p0[1], 0.0];\n    const p0p2 = [p2[0] - p0[0], p2[1] - p0[1], 0.0];\n    // If model scale is zero, all bounding box points are identical and no rotation can be calculated\n    if (vec3.length(p0p1) < 1e-12 || vec3.length(p0p2) < 1e-12) {\n        return quat.identity(out);\n    }\n    const from = vec3.cross([], p0p1, p0p2);\n    vec3.normalize(from, from);\n    vec3.subtract(p0p2, p2, p0);\n    p0p1[2] = (h1 - h0) * meterToMercator;\n    p0p2[2] = (h2 - h0) * meterToMercator;\n    const to = p0p1;\n    vec3.cross(to, p0p1, p0p2);\n    vec3.normalize(to, to);\n    return quat.rotationTo(out, from, to);\n}\n\nexport function coordinateFrameAtEcef(ecef: Vec3): Mat4 {\n    const zAxis = [ecef[0], ecef[1], ecef[2]];\n    let yAxis = [0.0, 1.0, 0.0];\n    const xAxis = vec3.cross([], yAxis, zAxis);\n    vec3.cross(yAxis, zAxis, xAxis);\n    if (vec3.squaredLength(yAxis) === 0.0) {\n        // Coordinate space is ambiguous if the model is placed directly at north or south pole\n        yAxis = [0.0, 1.0, 0.0];\n        vec3.cross(xAxis, zAxis, yAxis);\n        assert(vec3.squaredLength(xAxis) > 0.0);\n    }\n    vec3.normalize(xAxis, xAxis);\n    vec3.normalize(yAxis, yAxis);\n    vec3.normalize(zAxis, zAxis);\n    return [xAxis[0], xAxis[1], xAxis[2], 0.0,\n        yAxis[0], yAxis[1], yAxis[2], 0.0,\n        zAxis[0], zAxis[1], zAxis[2], 0.0,\n        ecef[0], ecef[1], ecef[2], 1.0];\n}\n\nexport function convertModelMatrix(matrix: Mat4, transform: Transform, scaleWithViewport: boolean): Mat4 {\n    // The provided transformation matrix is expected to define model position and orientation in pixel units\n    // with the exception of z-axis being in meters. Converting this into globe-aware matrix requires following steps:\n    //  1. Take the (pixel) position from the last column of the matrix and convert it to lat&lng and then to\n    //     ecef-presentation.\n    //  2. Scale the model from (px, px, m) units to ecef-units and apply pixels-per-meter correction. Also\n    //     remove translation component from the matrix as it represents position in Mercator coordinates.\n    //  3. Compute coordinate frame at the desired lat&lng position by aligning coordinate axes x,y & z with\n    //     the tangent plane at the said location.\n    //  4. Prepend the original matrix with the new coordinate frame matrix and apply translation in ecef-units.\n    //     After this operation the matrix presents correct position in ecef-space\n    //  5. Multiply the matrix with globe matrix for getting the final pixel space position\n    const worldSize = transform.worldSize;\n    const position = [matrix[12], matrix[13], matrix[14]];\n    const lat = latFromMercatorY(position[1] / worldSize);\n    const lng = lngFromMercatorX(position[0] / worldSize);\n    // Construct a matrix for scaling the original one to ecef space and removing the translation in mercator space\n    const mercToEcef = mat4.identity([]);\n    const sourcePixelsPerMeter = mercatorZfromAltitude(1, lat) * worldSize;\n    const pixelsPerMeterConversion = mercatorZfromAltitude(1, 0) * worldSize * getMetersPerPixelAtLatitude(lat, transform.zoom);\n    const pixelsToEcef = 1.0 / globeECEFUnitsToPixelScale(worldSize);\n    let scale = pixelsPerMeterConversion * pixelsToEcef;\n    if (scaleWithViewport) {\n        // Keep the size relative to viewport\n        const t = getProjectionInterpolationT(transform.projection, transform.zoom, transform.width, transform.height, 1024);\n        const projectionScaler = transform.projection.pixelSpaceConversion(transform.center.lat, worldSize, t);\n        scale = pixelsToEcef * projectionScaler;\n    }\n    // Construct coordinate space matrix at the provided location in ecef space.\n    const ecefCoord = latLngToECEF(lat, lng);\n    // add altitude\n    vec3.add(ecefCoord, ecefCoord, vec3.scale([], vec3.normalize([], ecefCoord), sourcePixelsPerMeter * scale * position[2]));\n    const ecefFrame = coordinateFrameAtEcef(ecefCoord);\n    mat4.scale(mercToEcef, mercToEcef, [scale, scale, scale * sourcePixelsPerMeter]);\n    mat4.translate(mercToEcef, mercToEcef, [-position[0], -position[1], -position[2]]);\n    const result = mat4.multiply([], transform.globeMatrix, ecefFrame);\n    mat4.multiply(result, result, mercToEcef);\n    mat4.multiply(result, result, matrix);\n    return result;\n}\n\n// Computes a matrix for representing the provided transformation matrix (in mercator projection) in globe\nexport function mercatorToGlobeMatrix(matrix: Mat4, transform: Transform): Mat4 {\n    const worldSize = transform.worldSize;\n\n    const pixelsPerMeterConversion = mercatorZfromAltitude(1, 0) * worldSize * getMetersPerPixelAtLatitude(transform.center.lat, transform.zoom);\n    const pixelsToEcef = pixelsPerMeterConversion / globeECEFUnitsToPixelScale(worldSize);\n    const pixelsPerMeter = mercatorZfromAltitude(1, transform.center.lat) * worldSize;\n\n    const m = mat4.identity([]);\n    mat4.rotateY(m, m, degToRad(transform.center.lng));\n    mat4.rotateX(m, m, degToRad(transform.center.lat));\n\n    mat4.translate(m, m, [0, 0, GLOBE_RADIUS]);\n    mat4.scale(m, m, [pixelsToEcef, pixelsToEcef, pixelsToEcef * pixelsPerMeter]);\n\n    mat4.translate(m, m, [transform.point.x - 0.5 * worldSize, transform.point.y - 0.5 * worldSize, 0.0]);\n    mat4.multiply(m, m, matrix);\n    return mat4.multiply(m, transform.globeMatrix, m);\n}\n\nfunction affineMatrixLerp(a: Mat4, b: Mat4, t: number): Mat4 {\n    // Interpolate each of the coordinate axes separately while also preserving their length\n    const lerpAxis = (ax: Vec3, bx: Vec3, t: number) => {\n        const axLen  = vec3.length(ax);\n        const bxLen = vec3.length(bx);\n        const c = interpolateVec3(ax, bx, t);\n        return vec3.scale(c, c, 1.0 / vec3.length(c) * interpolate(axLen, bxLen, t));\n    };\n\n    const xAxis = lerpAxis([a[0], a[1], a[2]], [b[0], b[1], b[2]], t);\n    const yAxis = lerpAxis([a[4], a[5], a[6]], [b[4], b[5], b[6]], t);\n    const zAxis = lerpAxis([a[8], a[9], a[10]], [b[8], b[9], b[10]], t);\n    const pos = interpolateVec3([a[12], a[13], a[14]], [b[12], b[13], b[14]], t);\n\n    return [\n        xAxis[0], xAxis[1], xAxis[2], 0,\n        yAxis[0], yAxis[1], yAxis[2], 0,\n        zAxis[0], zAxis[1], zAxis[2], 0,\n        pos[0], pos[1], pos[2], 1\n    ];\n}\n\nexport function convertModelMatrixForGlobe(matrix: Mat4, transform: Transform, scaleWithViewport: boolean = false): Mat4 {\n    const t = globeToMercatorTransition(transform.zoom);\n    const modelMatrix = convertModelMatrix(matrix, transform, scaleWithViewport);\n    if (t > 0.0) {\n        const mercatorMatrix = mercatorToGlobeMatrix(matrix, transform);\n        return affineMatrixLerp(modelMatrix, mercatorMatrix, t);\n    }\n    return modelMatrix;\n}\n\n// In case of intersection, returns depth of the closest corner. Otherwise, returns undefined.\nexport function queryGeometryIntersectsProjectedAabb(queryGeometry: Point[], transform: Transform, worldViewProjection: Mat4, aabb: Aabb): ?number {\n    // Collision checks are performed in screen space. Corners are in ndc space.\n    const corners = Aabb.projectAabbCorners(aabb, worldViewProjection);\n    // convert to screen points\n    let minDepth = Number.MAX_VALUE;\n    let closestCornerIndex = -1;\n    for (let c = 0; c < corners.length; ++c) {\n        const corner = corners[c];\n        corner[0] = (0.5 * corner[0] + 0.5) * transform.width;\n        corner[1] = (0.5 - 0.5 * corner[1]) * transform.height;\n        if (corner[2] < minDepth) {\n            closestCornerIndex = c;\n            minDepth = corner[2]; // This is a rough aabb intersection check for now and no need to interpolate over aabb sides.\n        }\n    }\n    const p = (i: number): Point => new Point(corners[i][0], corners[i][1]);\n\n    let convexPolygon;\n    switch (closestCornerIndex) {\n    case 0:\n    case 6:\n        convexPolygon = [p(1), p(5), p(4), p(7), p(3), p(2), p(1)];\n        break;\n    case 1:\n    case 7:\n        convexPolygon = [p(0), p(4), p(5), p(6), p(2), p(3), p(0)];\n        break;\n    case 3:\n    case 5:\n        convexPolygon = [p(1), p(0), p(4), p(7), p(6), p(2), p(1)];\n        break;\n    default:\n        convexPolygon = [p(1), p(5), p(6), p(7), p(3), p(0), p(1)];\n        break;\n    }\n\n    if (polygonIntersectsPolygon(queryGeometry, convexPolygon)) {\n        return minDepth;\n    }\n}\n","// @flow\nimport {createLayout} from '../../src/util/struct_array.js';\n\nimport type {StructArrayLayout} from '../../src/util/struct_array.js';\n\nexport const modelAttributes: StructArrayLayout = createLayout([\n    {name: 'a_pos_3f',  components: 3, type: 'Float32'}\n]);\n\nexport const color3fAttributes: StructArrayLayout = createLayout([\n    {name: 'a_color_3f',  components: 3, type: 'Float32'}\n]);\n\nexport const color4fAttributes: StructArrayLayout = createLayout([\n    {name: 'a_color_4f',  components: 4, type: 'Float32'}\n]);\n\nexport const texcoordAttributes: StructArrayLayout = createLayout([\n    {name: 'a_uv_2f',  components: 2, type: 'Float32'}\n]);\n\nexport const normalAttributes: StructArrayLayout = createLayout([\n    {name: 'a_normal_3f',  components: 3, type: 'Float32'}\n]);\n\nexport const instanceAttributes: StructArrayLayout = createLayout([\n    {name: 'a_normal_matrix0',  components: 4, type: 'Float32'},\n    {name: 'a_normal_matrix1',  components: 4, type: 'Float32'},\n    {name: 'a_normal_matrix2',  components: 4, type: 'Float32'},\n    {name: 'a_normal_matrix3',  components: 4, type: 'Float32'}\n]);\n\nexport const featureAttributes: StructArrayLayout = createLayout([\n    // pbr encoding: | color.rgba (4 bytes) | emissivity (a byte) | roughness (a nibble) | metallic (a nibble)\n    {name: 'a_pbr', components: 4, type: 'Uint16'},\n    {name: 'a_heightBasedEmissiveStrength', components: 3, type: 'Float32'}\n]);\n\nexport const {members, size, alignment} = modelAttributes;\n","// @flow\n\n// Note: Do not inherit from Error. It breaks when transpiling to ES5.\n\nexport default class ValidationError {\n    message: string;\n    identifier: ?string;\n    line: ?number;\n\n    constructor(key: ?string, value: ?{ __line__: number }, message: string, identifier: ?string) {\n        this.message = (key ? `${key}: ` : '') + message;\n        if (identifier) this.identifier = identifier;\n\n        if (value !== null && value !== undefined && value.__line__) {\n            this.line = value.__line__;\n        }\n    }\n}\n\nexport class ValidationWarning extends ValidationError {}\n","// @flow\n\nimport ValidationError from '../error/validation_error.js';\nimport getType from '../util/get_type.js';\n\nimport type {ValidationOptions} from './validate.js';\n\n// Allow any URL, use dummy base, if it's a relative URL\nexport function isValidUrl(str: string, allowRelativeUrls: boolean): boolean {\n    const isRelative = str.indexOf('://') === -1;\n    try {\n        new URL(str, isRelative && allowRelativeUrls ? 'http://example.com' : undefined);\n        return true;\n    } catch (_) {\n        return false;\n    }\n}\n\nexport default function validateModel(options: ValidationOptions): Array<ValidationError> {\n    const url = options.value;\n    let errors = [];\n\n    if (!url) {\n        return errors;\n    }\n\n    const type = getType(url);\n    if (type !== 'string') {\n        errors = errors.concat([new ValidationError(options.key, url, `string expected, \"${type}\" found`)]);\n        return errors;\n    }\n\n    if (!isValidUrl(url, true)) {\n        errors = errors.concat([new ValidationError(options.key, url, `invalid url \"${url}\"`)]);\n    }\n\n    return errors;\n}\n","// @flow\n\nimport EXTENT from '../../../src/style-spec/data/extent.js';\nimport {register} from '../../../src/util/web_worker_transfer.js';\nimport loadGeometry from '../../../src/data/load_geometry.js';\nimport toEvaluationFeature from '../../../src/data/evaluation_feature.js';\nimport EvaluationParameters from '../../../src/style/evaluation_parameters.js';\nimport Point from '@mapbox/point-geometry';\nimport {vec3} from 'gl-matrix';\nimport {InstanceVertexArray} from '../../../src/data/array_types.js';\nimport assert from 'assert';\nimport {warnOnce} from '../../../src/util/util.js';\nimport {rotationScaleYZFlipMatrix} from '../../util/model_util.js';\nimport {tileToMeter} from '../../../src/geo/mercator_coordinate.js';\nimport {instanceAttributes} from '../model_attributes.js';\n\nimport type ModelStyleLayer from '../../style/style_layer/model_style_layer.js';\nimport {isValidUrl} from '../../../src/style-spec/validate/validate_model.js';\nimport type {EvaluationFeature} from '../../../src/data/evaluation_feature.js';\nimport type {Mat4} from 'gl-matrix';\nimport type {CanonicalTileID, OverscaledTileID} from '../../../src/source/tile_id.js';\nimport type {\n    Bucket,\n    BucketParameters,\n    BucketFeature,\n    IndexedFeature,\n    PopulateParameters\n} from '../../../src/data/bucket.js';\n\nimport type Context from '../../../src/gl/context.js';\nimport type VertexBuffer from '../../../src/gl/vertex_buffer.js';\nimport type {FeatureStates} from '../../../src/source/source_state.js';\nimport type {SpritePositions} from '../../../src/util/image.js';\nimport type {ProjectionSpecification} from '../../../src/style-spec/types.js';\nimport type {TileTransform} from '../../../src/geo/projection/tile_transform.js';\nimport type {IVectorTileLayer} from '@mapbox/vector-tile';\n\nclass ModelFeature {\n    feature: EvaluationFeature;\n    instancedDataOffset: number;\n    instancedDataCount: number;\n\n    rotation: Array<number>;\n    scale: Array<number>;\n    translation: Array<number>;\n\n    constructor(feature: EvaluationFeature, offset: number) {\n        this.feature = feature;\n        this.instancedDataOffset = offset;\n        this.instancedDataCount = 0;\n        this.rotation = [0, 0, 0];\n        this.scale = [1, 1, 1];\n        this.translation = [0, 0, 0];\n    }\n}\n\nclass PerModelAttributes {\n    // If node has meshes, instancedDataArray gets an entry for each feature instance (used for all meshes or the node).\n    instancedDataArray: InstanceVertexArray;\n    instancedDataBuffer: VertexBuffer;\n    instancesEvaluatedElevation: Array<number>; // Gets added to DEM elevation of the instance to produce value in instancedDataArray.\n\n    features: Array<ModelFeature>;\n    idToFeaturesIndex: {[string | number]: number}; // via this.features, enable lookup instancedDataArray based on feature ID.\n\n    constructor() {\n        this.instancedDataArray = new InstanceVertexArray();\n        this.instancesEvaluatedElevation = [];\n        this.features = [];\n        this.idToFeaturesIndex = {};\n    }\n}\n\nclass ModelBucket implements Bucket {\n    zoom: number;\n    index: number;\n    canonical: CanonicalTileID;\n    layers: Array<ModelStyleLayer>;\n    layerIds: Array<string>;\n    stateDependentLayers: Array<ModelStyleLayer>;\n    stateDependentLayerIds: Array<string>;\n    hasPattern: boolean;\n\n    instancesPerModel: {string: PerModelAttributes};\n\n    uploaded: boolean;\n\n    tileToMeter: number;\n    projection: ProjectionSpecification;\n\n    // elevation is baked into vertex buffer together with evaluated instance translation\n    validForExaggeration: number;\n    validForDEMTile: {id: ?OverscaledTileID, timestamp: number};\n    maxVerticalOffset: number; // for tile AABB calculation\n    maxScale: number; // across all dimensions, for tile AABB calculation\n    maxHeight: number; // calculated from previous two, during rendering, when models are available.\n    isInsideFirstShadowMapFrustum: boolean; // evaluated during first shadows pass and cached here for the second shadow pass.\n    lookup: ?Uint8Array;\n    lookupDim: number;\n    instanceCount: number;\n    // Bucket min/max terrain elevation among instance positions taking exaggeration value into account\n    terrainElevationMin: number;\n    terrainElevationMax: number;\n\n    hasZoomDependentProperties: boolean;\n    modelUris: Array<string>;\n    modelsRequested: boolean;\n\n    constructor(options: BucketParameters<ModelStyleLayer>) {\n        this.zoom = options.zoom;\n        this.canonical = options.canonical;\n        this.layers = options.layers;\n        this.layerIds = this.layers.map(layer => layer.fqid);\n        this.projection = options.projection;\n        this.index = options.index;\n\n        this.hasZoomDependentProperties = this.layers[0].isZoomDependent();\n\n        this.stateDependentLayerIds = this.layers.filter((l) => l.isStateDependent()).map((l) => l.id);\n        this.hasPattern = false;\n        this.instancesPerModel = {};\n        this.validForExaggeration = 0;\n        this.maxVerticalOffset = 0;\n        this.maxScale = 0;\n        this.maxHeight = 0;\n        // reduce density, more on lower zooms and almost no reduction in overscale range.\n        // Heuristics is related to trees performance.\n        this.lookupDim = this.zoom > this.canonical.z ? 256 : this.zoom > 15 ? 75 : 100;\n        this.instanceCount = 0;\n\n        this.terrainElevationMin = 0;\n        this.terrainElevationMax = 0;\n        this.validForDEMTile = {id: null, timestamp: 0};\n        this.modelUris = [];\n        this.modelsRequested = false;\n\n    }\n\n    populate(features: Array<IndexedFeature>, options: PopulateParameters, canonical: CanonicalTileID, tileTransform: TileTransform) {\n        this.tileToMeter = tileToMeter(canonical);\n        const needGeometry = this.layers[0]._featureFilter.needGeometry;\n        this.lookup = new Uint8Array(this.lookupDim * this.lookupDim);\n\n        for (const {feature, id, index, sourceLayerIndex} of features) {\n            // use non numeric id, if in properties, too.\n            const featureId = (id != null) ? id :\n                (feature.properties && feature.properties.hasOwnProperty(\"id\")) ? feature.properties[\"id\"] : undefined;\n            const evaluationFeature = toEvaluationFeature(feature, needGeometry);\n\n            // $FlowFixMe[method-unbinding]\n            if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) continue;\n\n            const bucketFeature: BucketFeature = {\n                id: featureId,\n                sourceLayerIndex,\n                index,\n                geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature, canonical, tileTransform),\n                properties: feature.properties,\n                type: feature.type,\n                patterns: {}\n            };\n\n            const modelId = this.addFeature(bucketFeature, bucketFeature.geometry, evaluationFeature);\n\n            if (modelId) {\n                // Since 3D model geometry extends over footprint or point geometry, it is important\n                // to add some padding to envelope calculated for grid index lookup, in order to\n                // prevent false negatives in FeatureIndex's coarse check.\n                // Envelope padding is a half of featureIndex.grid cell size.\n                options.featureIndex.insert(feature, bucketFeature.geometry, index, sourceLayerIndex, this.index, this.instancesPerModel[modelId].instancedDataArray.length, EXTENT / 32);\n            }\n        }\n        this.lookup = null;\n    }\n\n    // eslint-disable-next-line no-unused-vars\n    update(states: FeatureStates, vtLayer: IVectorTileLayer, availableImages: Array<string>, imagePositions: SpritePositions) {\n        // called when setFeature state API is used\n        for (const modelId in this.instancesPerModel) {\n            const instances = this.instancesPerModel[modelId];\n            for (const id in states) {\n                if (instances.idToFeaturesIndex.hasOwnProperty(id)) {\n                    const feature = instances.features[instances.idToFeaturesIndex[id]];\n                    this.evaluate(feature, states[id], instances, true);\n                    this.uploaded = false;\n                }\n            }\n        }\n        this.maxHeight = 0; // needs to be recalculated.\n    }\n\n    updateZoomBasedPaintProperties(): boolean {\n        if (!this.hasZoomDependentProperties) {\n            return false;\n        }\n\n        // layer.paint.get('model-rotation').isZoom\n        let reuploadNeeded = false;\n        for (const modelId in this.instancesPerModel) {\n            const instances = this.instancesPerModel[modelId];\n            for (const feature of instances.features) {\n                const layer = this.layers[0];\n                const evaluationFeature = feature.feature;\n                const canonical = this.canonical;\n                const rotation = layer.paint.get('model-rotation').evaluate(evaluationFeature, {}, canonical);\n                const scale = layer.paint.get('model-scale').evaluate(evaluationFeature, {}, canonical);\n                const translation = layer.paint.get('model-translation').evaluate(evaluationFeature, {}, canonical);\n\n                // $FlowFixMe.\n                if (!vec3.exactEquals(feature.rotation, rotation) ||\n                    // $FlowFixMe.\n                    !vec3.exactEquals(feature.scale, scale) ||\n                    // $FlowFixMe.\n                    !vec3.exactEquals(feature.translation, translation)) {\n                    this.evaluate(feature, feature.featureStates, instances, true);\n                    reuploadNeeded = true;\n                }\n            }\n        }\n        return reuploadNeeded;\n    }\n\n    isEmpty(): boolean {\n        for (const modelId in this.instancesPerModel) {\n            const perModelAttributes = this.instancesPerModel[modelId];\n            if (perModelAttributes.instancedDataArray.length !== 0) return false;\n        }\n        return true;\n    }\n\n    uploadPending(): boolean {\n        return !this.uploaded;\n    }\n\n    upload(context: Context) {\n        // if buffer size is less than the threshold, do not upload instance buffer.\n        // if instance buffer is not uploaded, instances are rendered one by one.\n        const useInstancingThreshold = 0;\n        if (!this.uploaded) {\n            for (const modelId in this.instancesPerModel) {\n                const perModelAttributes = this.instancesPerModel[modelId];\n                if (perModelAttributes.instancedDataArray.length < useInstancingThreshold || perModelAttributes.instancedDataArray.length === 0) continue;\n                if (!perModelAttributes.instancedDataBuffer) {\n                    perModelAttributes.instancedDataBuffer = context.createVertexBuffer(perModelAttributes.instancedDataArray, instanceAttributes.members, true, undefined, this.instanceCount);\n                } else {\n                    perModelAttributes.instancedDataBuffer.updateData(perModelAttributes.instancedDataArray);\n                }\n            }\n        }\n        this.uploaded = true;\n    }\n\n    destroy() {\n        for (const modelId in this.instancesPerModel) {\n            const perModelAttributes = this.instancesPerModel[modelId];\n            if (perModelAttributes.instancedDataArray.length === 0) continue;\n            if (perModelAttributes.instancedDataBuffer) {\n                perModelAttributes.instancedDataBuffer.destroy();\n            }\n        }\n        const modelManager = this.layers[0].modelManager;\n        if (modelManager && this.modelUris) {\n            for (const modelUri of this.modelUris) {\n                modelManager.removeModel(modelUri, \"\");\n            }\n        }\n    }\n\n    addFeature(feature: BucketFeature, geometry: Array<Array<Point>>, evaluationFeature: EvaluationFeature): string {\n        const layer = this.layers[0];\n        const modelIdProperty = layer.layout.get('model-id');\n        assert(modelIdProperty);\n        const modelId = modelIdProperty.evaluate(evaluationFeature, {}, this.canonical);\n\n        if (!modelId) {\n            warnOnce(`modelId is not evaluated for layer ${layer.id} and it is not going to get rendered.`);\n            return modelId;\n        }\n        // check if it's a valid model (absolute) URL\n        // otherwise is considered as an style defined model, and hence we don't need to\n        // load it here.\n        if (isValidUrl(modelId, false)) {\n            if (!this.modelUris.includes(modelId)) {\n                this.modelUris.push(modelId);\n            }\n        }\n        if (!this.instancesPerModel[modelId]) {\n            this.instancesPerModel[modelId] = new PerModelAttributes();\n        }\n\n        const perModelVertexArray = this.instancesPerModel[modelId];\n        const instancedDataArray = perModelVertexArray.instancedDataArray;\n\n        const modelFeature = new ModelFeature(evaluationFeature, instancedDataArray.length);\n        for (const geometries of geometry) {\n            for (const point of geometries) {\n                if (point.x < 0 || point.x >= EXTENT || point.y < 0 || point.y >= EXTENT) {\n                    continue; // Clip on tile borders to prevent duplicates\n                }\n                // reduce density\n                const tileToLookup = (this.lookupDim - 1.0) / EXTENT;\n                const lookupIndex = this.lookupDim * ((point.y * tileToLookup) | 0) + (point.x * tileToLookup) | 0;\n                if (this.lookup) {\n                    if (this.lookup[lookupIndex] !== 0) {\n                        continue;\n                    }\n                    this.lookup[lookupIndex] = 1;\n                }\n                this.instanceCount++;\n                const i = instancedDataArray.length;\n                instancedDataArray.resize(i + 1);\n                perModelVertexArray.instancesEvaluatedElevation.push(0);\n                instancedDataArray.float32[i * 16] = point.x;\n                instancedDataArray.float32[i * 16 + 1] = point.y;\n            }\n        }\n        modelFeature.instancedDataCount = perModelVertexArray.instancedDataArray.length - modelFeature.instancedDataOffset;\n        if (modelFeature.instancedDataCount > 0) {\n            if (feature.id) {\n                perModelVertexArray.idToFeaturesIndex[feature.id] = perModelVertexArray.features.length;\n            }\n            perModelVertexArray.features.push(modelFeature);\n            this.evaluate(modelFeature, {}, perModelVertexArray, false);\n        }\n        return modelId;\n    }\n\n    getModelUris(): Array<string> {\n        return this.modelUris;\n    }\n\n    evaluate(feature: ModelFeature, featureState: FeatureStates, perModelVertexArray: PerModelAttributes, update: boolean) {\n        const layer = this.layers[0];\n        const evaluationFeature = feature.feature;\n        const canonical = this.canonical;\n        // $FlowFixMe.\n        const rotation = feature.rotation = layer.paint.get('model-rotation').evaluate(evaluationFeature, featureState, canonical);\n        // $FlowFixMe.\n        const scale = feature.scale = layer.paint.get('model-scale').evaluate(evaluationFeature, featureState, canonical);\n        // $FlowFixMe.\n        const translation = feature.translation = layer.paint.get('model-translation').evaluate(evaluationFeature, featureState, canonical);\n\n        const color = layer.paint.get('model-color').evaluate(evaluationFeature, featureState, canonical);\n        color.a = layer.paint.get('model-color-mix-intensity').evaluate(evaluationFeature, featureState, canonical);\n        const rotationScaleYZFlip: Mat4 = [];\n        if (this.maxVerticalOffset < translation[2]) this.maxVerticalOffset = translation[2];\n        this.maxScale = Math.max(Math.max(this.maxScale, scale[0]), Math.max(scale[1], scale[2]));\n\n        rotationScaleYZFlipMatrix(rotationScaleYZFlip, (rotation: any), (scale: any));\n\n        // https://github.com/mapbox/mapbox-gl-native-internal/blob/c380f9492220906accbdca1f02cca5ee489d97fc/src/mbgl/renderer/layers/render_model_layer.cpp#L1282\n        const constantTileToMeterAcrossTile = 10;\n        assert(perModelVertexArray.instancedDataArray.bytesPerElement === 64);\n\n        const vaOffset2 = Math.round(100.0 * color.a) + color.b / 1.05;\n\n        for (let i = 0; i < feature.instancedDataCount; ++i) {\n            const instanceOffset = feature.instancedDataOffset + i;\n            const offset = instanceOffset * 16;\n\n            const va = perModelVertexArray.instancedDataArray.float32;\n            let terrainElevationContribution = 0;\n            if (update) {\n                terrainElevationContribution = va[offset + 6] - perModelVertexArray.instancesEvaluatedElevation[instanceOffset];\n            }\n\n            // All per-instance attributes are packed to one 4x4 float matrix. Data is not expected\n            // to change on every frame when e.g. camera or light changes.\n            // Column major order. Elements:\n            // 0 & 1: tile coordinates stored in integer part of float, R and G color components,\n            // originally in range [0..1], scaled to range [0..0.952(arbitrary, just needs to be\n            // under 1)].\n            const pointY = va[offset + 1] | 0; // point.y stored in integer part\n            va[offset]      = (va[offset] | 0) + color.r / 1.05; // point.x stored in integer part\n            va[offset + 1]  = pointY + color.g / 1.05;\n            // Element 2: packs color's alpha (as integer part) and blue component in fractional part.\n            va[offset + 2]  = vaOffset2;\n            // tileToMeter is taken at center of tile. Prevent recalculating it over again for\n            // thousands of trees.\n            // Element 3: tileUnitsToMeter conversion.\n            va[offset + 3]  = 1.0 / (canonical.z > constantTileToMeterAcrossTile ? this.tileToMeter : tileToMeter(canonical, pointY));\n            // Elements [4..6]: translation evaluated for the feature.\n            va[offset + 4]  = translation[0];\n            va[offset + 5]  = translation[1];\n            va[offset + 6]  = translation[2] + terrainElevationContribution;\n            // Elements [7..16] Instance modelMatrix holds combined rotation and scale 3x3,\n            va[offset + 7]  = rotationScaleYZFlip[0];\n            va[offset + 8]  = rotationScaleYZFlip[1];\n            va[offset + 9]  = rotationScaleYZFlip[2];\n            va[offset + 10] = rotationScaleYZFlip[4];\n            va[offset + 11] = rotationScaleYZFlip[5];\n            va[offset + 12] = rotationScaleYZFlip[6];\n            va[offset + 13] = rotationScaleYZFlip[8];\n            va[offset + 14] = rotationScaleYZFlip[9];\n            va[offset + 15] = rotationScaleYZFlip[10];\n            perModelVertexArray.instancesEvaluatedElevation[instanceOffset] = translation[2];\n        }\n    }\n}\n\nregister(ModelBucket, 'ModelBucket', {omit: ['layers']});\nregister(PerModelAttributes, 'PerModelAttributes');\nregister(ModelFeature, 'ModelFeature');\n\nexport default ModelBucket;\n","// This file is generated. Edit build/generate-style-code.js, then run `npm run codegen`.\n// @flow\n/* eslint-disable */\n\nimport styleSpec from '../../../src/style-spec/reference/latest.js';\n\nimport {\n    Properties,\n    DataConstantProperty,\n    DataDrivenProperty,\n    ColorRampProperty\n} from '../../../src/style/properties.js';\n\nimport type Color from '../../../src/style-spec/util/color.js';\n\nimport type Formatted from '../../../src/style-spec/expression/types/formatted.js';\n\nimport type ResolvedImage from '../../../src/style-spec/expression/types/resolved_image.js';\n\nexport type LayoutProps = {|\n    \"visibility\": DataConstantProperty<\"visible\" | \"none\">,\n    \"model-id\": DataDrivenProperty<string>,\n|};\n\nconst layout: Properties<LayoutProps> = new Properties({\n    \"visibility\": new DataConstantProperty(styleSpec[\"layout_model\"][\"visibility\"]),\n    \"model-id\": new DataDrivenProperty(styleSpec[\"layout_model\"][\"model-id\"]),\n});\n\nexport type PaintProps = {|\n    \"model-opacity\": DataConstantProperty<number>,\n    \"model-rotation\": DataDrivenProperty<[number, number, number]>,\n    \"model-scale\": DataDrivenProperty<[number, number, number]>,\n    \"model-translation\": DataDrivenProperty<[number, number, number]>,\n    \"model-color\": DataDrivenProperty<Color>,\n    \"model-color-mix-intensity\": DataDrivenProperty<number>,\n    \"model-type\": DataConstantProperty<\"common-3d\" | \"location-indicator\">,\n    \"model-cast-shadows\": DataConstantProperty<boolean>,\n    \"model-receive-shadows\": DataConstantProperty<boolean>,\n    \"model-ambient-occlusion-intensity\": DataConstantProperty<number>,\n    \"model-emissive-strength\": DataDrivenProperty<number>,\n    \"model-roughness\": DataDrivenProperty<number>,\n    \"model-height-based-emissive-strength-multiplier\": DataDrivenProperty<[number, number, number, number, number]>,\n    \"model-cutoff-fade-range\": DataConstantProperty<number>,\n    \"model-front-cutoff\": DataConstantProperty<[number, number, number]>,\n|};\n\nconst paint: Properties<PaintProps> = new Properties({\n    \"model-opacity\": new DataConstantProperty(styleSpec[\"paint_model\"][\"model-opacity\"]),\n    \"model-rotation\": new DataDrivenProperty(styleSpec[\"paint_model\"][\"model-rotation\"]),\n    \"model-scale\": new DataDrivenProperty(styleSpec[\"paint_model\"][\"model-scale\"]),\n    \"model-translation\": new DataDrivenProperty(styleSpec[\"paint_model\"][\"model-translation\"]),\n    \"model-color\": new DataDrivenProperty(styleSpec[\"paint_model\"][\"model-color\"]),\n    \"model-color-mix-intensity\": new DataDrivenProperty(styleSpec[\"paint_model\"][\"model-color-mix-intensity\"]),\n    \"model-type\": new DataConstantProperty(styleSpec[\"paint_model\"][\"model-type\"]),\n    \"model-cast-shadows\": new DataConstantProperty(styleSpec[\"paint_model\"][\"model-cast-shadows\"]),\n    \"model-receive-shadows\": new DataConstantProperty(styleSpec[\"paint_model\"][\"model-receive-shadows\"]),\n    \"model-ambient-occlusion-intensity\": new DataConstantProperty(styleSpec[\"paint_model\"][\"model-ambient-occlusion-intensity\"]),\n    \"model-emissive-strength\": new DataDrivenProperty(styleSpec[\"paint_model\"][\"model-emissive-strength\"]),\n    \"model-roughness\": new DataDrivenProperty(styleSpec[\"paint_model\"][\"model-roughness\"]),\n    \"model-height-based-emissive-strength-multiplier\": new DataDrivenProperty(styleSpec[\"paint_model\"][\"model-height-based-emissive-strength-multiplier\"]),\n    \"model-cutoff-fade-range\": new DataConstantProperty(styleSpec[\"paint_model\"][\"model-cutoff-fade-range\"]),\n    \"model-front-cutoff\": new DataConstantProperty(styleSpec[\"paint_model\"][\"model-front-cutoff\"]),\n});\n\n// Note: without adding the explicit type annotation, Flow infers weaker types\n// for these objects from their use in the constructor to StyleLayer, as\n// {layout?: Properties<...>, paint: Properties<...>}\nexport default ({ paint, layout }: $Exact<{\n  paint: Properties<PaintProps>, layout: Properties<LayoutProps>\n}>);\n","// @flow\n\nimport LngLat from '../../src/geo/lng_lat.js';\nimport Color from '../../src/style-spec/util/color.js';\nimport Texture from '../../src/render/texture.js';\nimport {ModelLayoutArray, TriangleIndexArray, NormalLayoutArray, TexcoordLayoutArray, FeatureVertexArray} from '../../src/data/array_types.js';\nimport {StructArray} from '../../src/util/struct_array.js';\nimport {Aabb} from '../../src/util/primitives.js';\nimport {mat4, vec4} from 'gl-matrix';\nimport {modelAttributes, normalAttributes, texcoordAttributes, color3fAttributes, color4fAttributes, featureAttributes} from './model_attributes.js';\nimport SegmentVector from '../../src/data/segment.js';\nimport {globeToMercatorTransition} from '../../src/geo/projection/globe_util.js';\nimport {number as interpolate} from '../../src/style-spec/util/interpolate.js';\nimport MercatorCoordinate, {getMetersPerPixelAtLatitude, getLatitudeScale, mercatorZfromAltitude} from '../../src/geo/mercator_coordinate.js';\nimport {rotationScaleYZFlipMatrix, getBoxBottomFace, rotationFor3Points, convertModelMatrixForGlobe} from '../util/model_util.js';\n\nimport type Point from '@mapbox/point-geometry';\nimport type {Mat4, Vec2, Vec3, Vec4, Quat} from 'gl-matrix';\nimport type Context from '../../src/gl/context.js';\nimport type IndexBuffer from '../../src/gl/index_buffer.js';\nimport type Painter from '../../src/render/painter.js';\nimport type TriangleGridIndex from '../../src/util/triangle_grid_index.js';\nimport type VertexBuffer from '../../src/gl/vertex_buffer.js';\nimport type {TextureImage, TextureWrap, TextureFilter} from '../../src/render/texture.js';\nimport type Transform from '../../src/geo/transform.js';\n\nexport type Sampler = {\n    minFilter: TextureFilter;\n    magFilter: TextureFilter;\n    wrapS: TextureWrap;\n    wrapT: TextureWrap;\n}\n\nexport type ModelTexture = {\n    image: TextureImage;\n    sampler: Sampler;\n    gfxTexture?: Texture;\n    uploaded: boolean;\n    offsetScale?: [number, number, number, number];\n}\n\nexport type PbrMetallicRoughness = {\n    baseColorFactor: Color;\n    metallicFactor: number;\n    roughnessFactor: number;\n    baseColorTexture: ?ModelTexture;\n    metallicRoughnessTexture: ?ModelTexture;\n}\n\nexport type Material = {\n    normalTexture: ?ModelTexture;\n    occlusionTexture: ?ModelTexture;\n    emissionTexture: ?ModelTexture;\n    pbrMetallicRoughness: PbrMetallicRoughness;\n    emissiveFactor: [number, number, number];\n    alphaMode: string;\n    alphaCutoff: number;\n    doubleSided: boolean;\n    defined: boolean;\n}\n\nexport const HEIGHTMAP_DIM = 64;\n\nexport type Mesh = {\n    // eslint-disable-next-line no-warning-comments\n    indexArray: TriangleIndexArray; // TODO: Add TriangleStrip, etc\n    indexBuffer: IndexBuffer;\n    vertexArray: ModelLayoutArray;\n    vertexBuffer: VertexBuffer;\n    normalArray: NormalLayoutArray;\n    normalBuffer: VertexBuffer;\n    texcoordArray: TexcoordLayoutArray;\n    texcoordBuffer: VertexBuffer;\n    colorArray: StructArray;\n    colorBuffer: VertexBuffer;\n    featureData: $TypedArray;\n    featureArray: FeatureVertexArray;\n    pbrBuffer: VertexBuffer;\n    material: Material;\n    aabb: Aabb;\n    segments: SegmentVector;\n    centroid: Vec3;\n    heightmap: Float32Array;\n}\n\nexport type Footprint = {\n    vertices: Array<Point>;\n    indices: Array<number>;\n    grid: TriangleGridIndex;\n    min: Point;\n    max: Point;\n}\n// A rectangle with 5 DoF, no rolling\nexport type AreaLight = {\n    pos: Vec3;\n    normal: Vec3;\n    width: number;\n    height: number;\n    depth: number;\n    points: Vec4;\n};\n\nexport type Node = {\n    id: string;\n    matrix: Mat4;\n    meshes: Array<Mesh>;\n    children: Array<Node>;\n    footprint: ?Footprint;\n    lights: Array<AreaLight>;\n    lightMeshIndex: number;\n    elevation: ?number;\n    anchor: Vec2;\n}\n\nexport const ModelTraits = {\n    CoordinateSpaceTile : 1,\n    CoordinateSpaceYUp : 2, // not used yet.\n    HasMapboxMeshFeatures : 1 << 2,\n    HasMeshoptCompression: 1 << 3\n};\n\nexport const DefaultModelScale = [1, 1, 1];\n\nfunction positionModelOnTerrain(rotationOnTerrain: Quat, transform: Transform, aabb: Aabb, matrix: Mat4, position: LngLat): number {\n    const elevation = transform.elevation;\n    if (!elevation) {\n        return 0.0;\n    }\n    const corners = Aabb.projectAabbCorners(aabb, matrix);\n    const meterToMercator = mercatorZfromAltitude(1, position.lat) * transform.worldSize;\n    const bottomFace = getBoxBottomFace(corners, meterToMercator);\n\n    const b0 = corners[bottomFace[0]];\n    const b1 = corners[bottomFace[1]];\n    const b2 = corners[bottomFace[2]];\n    const b3 = corners[bottomFace[3]];\n\n    const e0 = elevation.getAtPointOrZero(new MercatorCoordinate(b0[0] / transform.worldSize, b0[1] / transform.worldSize), 0);\n    const e1 = elevation.getAtPointOrZero(new MercatorCoordinate(b1[0] / transform.worldSize, b1[1] / transform.worldSize), 0);\n    const e2 = elevation.getAtPointOrZero(new MercatorCoordinate(b2[0] / transform.worldSize, b2[1] / transform.worldSize), 0);\n    const e3 = elevation.getAtPointOrZero(new MercatorCoordinate(b3[0] / transform.worldSize, b3[1] / transform.worldSize), 0);\n\n    const d03 = (e0 + e3) / 2;\n    const d12 = (e1 + e2) / 2;\n\n    if (d03 > d12) {\n        if (e1 < e2) {\n            rotationFor3Points(rotationOnTerrain, b1, b3, b0, e1, e3, e0, meterToMercator);\n        } else {\n            rotationFor3Points(rotationOnTerrain, b2, b0, b3, e2, e0, e3, meterToMercator);\n        }\n    } else {\n        if (e0 < e3) {\n            rotationFor3Points(rotationOnTerrain, b0, b1, b2, e0, e1, e2, meterToMercator);\n        } else {\n            rotationFor3Points(rotationOnTerrain, b3, b2, b1, e3, e2, e1, meterToMercator);\n        }\n    }\n    return Math.max(d03, d12);\n}\n\nexport function calculateModelMatrix(matrix: Mat4, model: $ReadOnly<Model>, state: Transform, position: LngLat, rotation: Vec3, scale: Vec3, translation: Vec3, applyElevation: boolean, followTerrainSlope: boolean, viewportScale: boolean = false) {\n    const zoom = state.zoom;\n    const projectedPoint = state.project(position);\n    const modelMetersPerPixel = getMetersPerPixelAtLatitude(position.lat, zoom);\n    const modelPixelsPerMeter = 1.0 / modelMetersPerPixel;\n    mat4.identity(matrix);\n    const offset = [projectedPoint.x + translation[0] * modelPixelsPerMeter, projectedPoint.y + translation[1] * modelPixelsPerMeter, translation[2]];\n    mat4.translate(matrix, matrix, offset);\n    let scaleXY = 1.0;\n    let scaleZ = 1.0;\n    const worldSize = state.worldSize;\n    if (viewportScale) {\n        if (state.projection.name === 'mercator') {\n            let elevation = 0.0;\n            if (state.elevation) {\n                elevation = state.elevation.getAtPointOrZero(new MercatorCoordinate(projectedPoint.x / worldSize, projectedPoint.y / worldSize), 0.0);\n            }\n            const mercProjPos = vec4.transformMat4([], [projectedPoint.x, projectedPoint.y, elevation, 1.0], state.projMatrix);\n            const mercProjectionScale = mercProjPos[3] / state.cameraToCenterDistance;\n            const viewMetersPerPixel = getMetersPerPixelAtLatitude(state.center.lat, zoom);\n            scaleXY = mercProjectionScale;\n            scaleZ = mercProjectionScale * viewMetersPerPixel;\n        } else if (state.projection.name === 'globe') {\n            const globeMatrix = convertModelMatrixForGlobe(matrix, state);\n            const worldViewProjection = mat4.multiply([], state.projMatrix, globeMatrix);\n            const globeProjPos =  [0, 0, 0, 1];\n            vec4.transformMat4(globeProjPos, globeProjPos, worldViewProjection);\n            const globeProjectionScale = globeProjPos[3] / state.cameraToCenterDistance;\n            const transition = globeToMercatorTransition(zoom);\n            const modelPixelConv = state.projection.pixelsPerMeter(position.lat, worldSize) * getMetersPerPixelAtLatitude(position.lat, zoom);\n            const viewPixelConv = state.projection.pixelsPerMeter(state.center.lat, worldSize) * getMetersPerPixelAtLatitude(state.center.lat, zoom);\n            const viewLatScale = getLatitudeScale(state.center.lat);\n            // Compensate XY size difference from model latitude, taking into account globe-mercator transition\n            scaleXY = globeProjectionScale / interpolate(modelPixelConv, viewLatScale, transition);\n            // Compensate height difference from model latitude.\n            // No interpolation, because the Z axis is fixed in globe projection.\n            scaleZ = globeProjectionScale * modelMetersPerPixel / modelPixelConv;\n            // In globe projection, zoom and scale do not match anymore.\n            // Use pixelScaleConversion to scale to correct worldSize.\n            scaleXY *= viewPixelConv;\n            scaleZ *= viewPixelConv;\n        }\n    } else {\n        scaleXY = modelPixelsPerMeter;\n    }\n\n    mat4.scale(matrix, matrix, [scaleXY, scaleXY, scaleZ]);\n\n    // When applying physics (rotation) we need to insert rotation matrix\n    // between model rotation and transforms above. Keep the intermediate results.\n    const modelMatrixBeforeRotationScaleYZFlip = [...matrix];\n\n    const orientation = model.orientation;\n\n    const rotationScaleYZFlip: Mat4 = [];\n    rotationScaleYZFlipMatrix(rotationScaleYZFlip,\n                          [orientation[0] + rotation[0],\n                              orientation[1] + rotation[1],\n                              orientation[2] + rotation[2]],\n                           scale);\n    mat4.multiply(matrix, modelMatrixBeforeRotationScaleYZFlip, rotationScaleYZFlip);\n\n    if (applyElevation && state.elevation) {\n        let elevate = 0;\n        const rotateOnTerrain = [];\n        if (followTerrainSlope && state.elevation) {\n            elevate = positionModelOnTerrain(rotateOnTerrain, state, model.aabb, matrix, position);\n            const rotationOnTerrain = mat4.fromQuat([], rotateOnTerrain);\n            const appendRotation = mat4.multiply([], rotationOnTerrain, rotationScaleYZFlip);\n            mat4.multiply(matrix, modelMatrixBeforeRotationScaleYZFlip, appendRotation);\n        } else {\n            elevate = state.elevation.getAtPointOrZero(new MercatorCoordinate(projectedPoint.x / worldSize, projectedPoint.y / worldSize), 0.0);\n        }\n        if (elevate !== 0) {\n            matrix[14] += elevate;\n        }\n    }\n}\n\nexport default class Model {\n    id: string;\n    position: LngLat;\n    orientation: [number, number, number];\n    nodes: Array<Node>;\n    matrix: Mat4;\n    uploaded: boolean;\n    aabb: Aabb;\n\n    constructor(id: string, position: ?[number, number], orientation: ?[number, number, number], nodes: Array<Node>) {\n        this.id = id;\n        this.position = position != null ? new LngLat(position[0], position[1]) : new LngLat(0, 0);\n\n        this.orientation = orientation != null ? orientation : [0, 0, 0];\n        this.nodes = nodes;\n        this.uploaded = false;\n        this.aabb = new Aabb([Infinity, Infinity, Infinity], [-Infinity, -Infinity, -Infinity]);\n        this.matrix = [];\n    }\n\n    _applyTransformations(node: Node, parentMatrix: Mat4) {\n        // update local matrix\n        mat4.multiply(node.matrix, parentMatrix, node.matrix);\n        // apply local transform to bounding volume\n        if (node.meshes) {\n            for (const mesh of node.meshes) {\n                const enclosingBounds = Aabb.applyTransform(mesh.aabb, node.matrix);\n                this.aabb.encapsulate(enclosingBounds);\n            }\n        }\n        if (node.children) {\n            for (const child of node.children) {\n                this._applyTransformations(child, node.matrix);\n            }\n        }\n    }\n\n    computeBoundsAndApplyParent() {\n        const localMatrix =  mat4.identity([]);\n        for (const node of this.nodes) {\n            this._applyTransformations(node, localMatrix);\n        }\n    }\n\n    computeModelMatrix(painter: Painter, rotation: Vec3, scale: Vec3, translation: Vec3, applyElevation: boolean, followTerrainSlope: boolean, viewportScale: boolean = false) {\n        // calculate the model matrix for the single instance that uses the model.\n        calculateModelMatrix(this.matrix, this, painter.transform, this.position, rotation, scale, translation, applyElevation, followTerrainSlope, viewportScale);\n    }\n\n    upload(context: Context) {\n        if (this.uploaded) return;\n        for (const node of this.nodes) {\n            uploadNode(node, context);\n        }\n\n        // Now destroy all buffers\n        for (const node of this.nodes) {\n            destroyNodeArrays(node);\n        }\n\n        this.uploaded = true;\n    }\n\n    destroy() {\n        for (const node of this.nodes) {\n            destroyBuffers(node);\n        }\n    }\n}\n\nexport function uploadTexture(texture: ModelTexture, context: Context, useSingleChannelTexture: boolean = false) {\n    const textureFormat = useSingleChannelTexture ? context.gl.R8 : context.gl.RGBA;\n    if (!texture.uploaded) {\n        const useMipmap = texture.sampler.minFilter >= context.gl.NEAREST_MIPMAP_NEAREST;\n        texture.gfxTexture = new Texture(context, texture.image, textureFormat, {useMipmap});\n        texture.uploaded = true;\n        texture.image = (null: any);\n    }\n}\n\nexport function uploadMesh(mesh: Mesh, context: Context, useSingleChannelOcclusionTexture?: boolean) {\n    // Buffers\n    // Note: array buffers could reused for different nodes so destroy them in a later pass\n    mesh.indexBuffer = context.createIndexBuffer(mesh.indexArray, false, true);\n    mesh.vertexBuffer = context.createVertexBuffer(mesh.vertexArray, modelAttributes.members, false, true);\n    if (mesh.normalArray) {\n        mesh.normalBuffer = context.createVertexBuffer(mesh.normalArray, normalAttributes.members, false, true);\n    }\n    if (mesh.texcoordArray) {\n        mesh.texcoordBuffer = context.createVertexBuffer(mesh.texcoordArray, texcoordAttributes.members, false, true);\n    }\n    if (mesh.colorArray) {\n        const colorAttributes = mesh.colorArray.bytesPerElement === 12 ? color3fAttributes : color4fAttributes;\n        mesh.colorBuffer = context.createVertexBuffer(mesh.colorArray, colorAttributes.members, false, true);\n    }\n    if (mesh.featureArray) {\n        mesh.pbrBuffer = context.createVertexBuffer(mesh.featureArray, featureAttributes.members, true);\n    }\n    mesh.segments = SegmentVector.simpleSegment(0, 0, mesh.vertexArray.length, mesh.indexArray.length);\n\n    // Textures\n    const material = mesh.material;\n    if (material.pbrMetallicRoughness.baseColorTexture) {\n        uploadTexture(material.pbrMetallicRoughness.baseColorTexture, context);\n    }\n    if (material.pbrMetallicRoughness.metallicRoughnessTexture) {\n        uploadTexture(material.pbrMetallicRoughness.metallicRoughnessTexture, context);\n    }\n    if (material.normalTexture) {\n        uploadTexture(material.normalTexture, context);\n    }\n    if (material.occlusionTexture) {\n        uploadTexture(material.occlusionTexture, context, useSingleChannelOcclusionTexture);\n    }\n    if (material.emissionTexture) {\n        uploadTexture(material.emissionTexture, context);\n    }\n}\n\nexport function uploadNode(node: Node, context: Context, useSingleChannelOcclusionTexture?: boolean) {\n    if (node.meshes) {\n        for (const mesh of node.meshes) {\n            uploadMesh(mesh, context, useSingleChannelOcclusionTexture);\n        }\n    }\n    if (node.children) {\n        for (const child of node.children) {\n            uploadNode(child, context, useSingleChannelOcclusionTexture);\n        }\n    }\n}\n\nexport function destroyNodeArrays(node: Node) {\n    if (node.meshes) {\n        for (const mesh of node.meshes) {\n            mesh.indexArray.destroy();\n            mesh.vertexArray.destroy();\n            if (mesh.colorArray) mesh.colorArray.destroy();\n            if (mesh.normalArray) mesh.normalArray.destroy();\n            if (mesh.texcoordArray) mesh.texcoordArray.destroy();\n            if (mesh.featureArray) {\n                mesh.featureArray.destroy();\n            }\n        }\n    }\n    if (node.children) {\n        for (const child of node.children) {\n            destroyNodeArrays(child);\n        }\n    }\n}\n\nexport function destroyTextures(material: Material) {\n    if (material.pbrMetallicRoughness.baseColorTexture && material.pbrMetallicRoughness.baseColorTexture.gfxTexture) {\n        material.pbrMetallicRoughness.baseColorTexture.gfxTexture.destroy();\n    }\n    if (material.pbrMetallicRoughness.metallicRoughnessTexture && material.pbrMetallicRoughness.metallicRoughnessTexture.gfxTexture) {\n        material.pbrMetallicRoughness.metallicRoughnessTexture.gfxTexture.destroy();\n    }\n    if (material.normalTexture && material.normalTexture.gfxTexture) {\n        material.normalTexture.gfxTexture.destroy();\n    }\n    if (material.emissionTexture && material.emissionTexture.gfxTexture) {\n        material.emissionTexture.gfxTexture.destroy();\n    }\n    if (material.occlusionTexture && material.occlusionTexture.gfxTexture) {\n        material.occlusionTexture.gfxTexture.destroy();\n    }\n}\n\nexport function destroyBuffers(node: Node) {\n    if (node.meshes) {\n        for (const mesh of node.meshes) {\n            if (!mesh.vertexBuffer) continue;\n            mesh.vertexBuffer.destroy();\n            mesh.indexBuffer.destroy();\n            if (mesh.normalBuffer) {\n                mesh.normalBuffer.destroy();\n            }\n            if (mesh.texcoordBuffer) {\n                mesh.texcoordBuffer.destroy();\n            }\n            if (mesh.colorBuffer) {\n                mesh.colorBuffer.destroy();\n            }\n            if (mesh.pbrBuffer) {\n                mesh.pbrBuffer.destroy();\n            }\n\n            mesh.segments.destroy();\n            if (mesh.material) {\n                destroyTextures(mesh.material);\n            }\n        }\n    }\n    if (node.children) {\n        for (const child of node.children) {\n            destroyBuffers(child);\n        }\n    }\n}\n","// @flow\n\n/**\n * Invokes the wrapped function in a non-blocking way when trigger() is called. Invocation requests\n * are ignored until the function was actually invoked.\n *\n * @private\n */\nclass ThrottledInvoker {\n    _channel: ?MessageChannel;\n    _triggered: boolean;\n    _callback: Function\n\n    constructor(callback: Function) {\n        this._callback = callback;\n        this._triggered = false;\n        if (typeof MessageChannel !== 'undefined') {\n            this._channel = new MessageChannel();\n            this._channel.port2.onmessage = () => {\n                this._triggered = false;\n                this._callback();\n            };\n        }\n    }\n\n    trigger() {\n        if (!this._triggered) {\n            this._triggered = true;\n            if (this._channel) {\n                this._channel.port1.postMessage(true);\n            } else {\n                setTimeout(() => {\n                    this._triggered = false;\n                    this._callback();\n                }, 0);\n            }\n        }\n    }\n\n    remove() {\n        this._channel = undefined;\n        this._callback = () => {};\n    }\n}\n\nexport default ThrottledInvoker;\n","// @flow\n\nimport ThrottledInvoker from './throttled_invoker.js';\nimport {bindAll, isWorker} from './util.js';\nimport {PerformanceUtils} from './performance.js';\n\nimport type {Cancelable} from '../types/cancelable.js';\n\ntype TaskMetadata = {\n    type: 'message' | 'maybePrepare' | 'parseTile',\n    isSymbolTile: ?boolean,\n    zoom?: number\n};\n\ntype TaskFunction = () => void;\n\ntype Task = {\n    fn: TaskFunction,\n    metadata: TaskMetadata,\n    priority: number,\n    id: number\n};\n\nclass Scheduler {\n\n    tasks: { [number]: Task };\n    taskQueue: Array<number>;\n    invoker: ThrottledInvoker;\n    nextId: number;\n\n    constructor() {\n        this.tasks = {};\n        this.taskQueue = [];\n        bindAll(['process'], this);\n        // $FlowFixMe[method-unbinding]\n        this.invoker = new ThrottledInvoker(this.process);\n\n        this.nextId = 0;\n    }\n\n    add(fn: TaskFunction, metadata: TaskMetadata): Cancelable | null {\n        const id = this.nextId++;\n        const priority = getPriority(metadata);\n\n        if (priority === 0) {\n            // Process tasks with priority 0 immediately. Do not yield to the event loop.\n            const m = isWorker() ? PerformanceUtils.beginMeasure('workerTask') : undefined;\n            try {\n                fn();\n            } finally {\n                if (m) PerformanceUtils.endMeasure(m);\n            }\n            // Don't return an empty cancel because we can't actually be cancelled\n            return null;\n        }\n\n        this.tasks[id] = {fn, metadata, priority, id};\n        this.taskQueue.push(id);\n        this.invoker.trigger();\n        return {\n            cancel: () => {\n                delete this.tasks[id];\n            }\n        };\n    }\n\n    process() {\n        const m = isWorker() ? PerformanceUtils.beginMeasure('workerTask') : undefined;\n        try {\n            this.taskQueue = this.taskQueue.filter(id => !!this.tasks[id]);\n\n            if (!this.taskQueue.length) {\n                return;\n            }\n            const id = this.pick();\n            if (id === null) return;\n\n            const task = this.tasks[id];\n            delete this.tasks[id];\n            // Schedule another process call if we know there's more to process _before_ invoking the\n            // current task. This is necessary so that processing continues even if the current task\n            // doesn't execute successfully.\n            if (this.taskQueue.length) {\n                this.invoker.trigger();\n            }\n            if (!task) {\n                // If the task ID doesn't have associated task data anymore, it was canceled.\n                return;\n            }\n\n            task.fn();\n        } finally {\n            if (m) PerformanceUtils.endMeasure(m);\n        }\n    }\n\n    pick(): null | number {\n        let minIndex = null;\n        let minPriority = Infinity;\n        for (let i = 0; i < this.taskQueue.length; i++) {\n            const id = this.taskQueue[i];\n            const task = this.tasks[id];\n            if (task.priority < minPriority) {\n                minPriority = task.priority;\n                minIndex = i;\n            }\n        }\n        if (minIndex === null) return null;\n        const id = this.taskQueue[minIndex];\n        this.taskQueue.splice(minIndex, 1);\n        return id;\n    }\n\n    remove() {\n        this.invoker.remove();\n    }\n}\n\nfunction getPriority({type, isSymbolTile, zoom}: TaskMetadata): number {\n    zoom = zoom || 0;\n    if (type === 'message') return 0;\n    if (type === 'maybePrepare' && !isSymbolTile) return 100 - zoom;\n    if (type === 'parseTile' && !isSymbolTile) return 200 - zoom;\n    if (type === 'parseTile' && isSymbolTile) return 300 - zoom;\n    if (type === 'maybePrepare' && isSymbolTile) return 400 - zoom;\n    return 500;\n}\n\nexport default Scheduler;\n","// @flow\n\nimport {bindAll, isWorker} from './util.js';\nimport {serialize, deserialize} from './web_worker_transfer.js';\nimport Scheduler from './scheduler.js';\n\nimport type {Transferable} from '../types/transferable.js';\nimport type {Cancelable} from '../types/cancelable.js';\n\n/**\n * An implementation of the [Actor design pattern](http://en.wikipedia.org/wiki/Actor_model)\n * that maintains the relationship between asynchronous tasks and the objects\n * that spin them off - in this case, tasks like parsing parts of styles,\n * owned by the styles\n *\n * @param {WebWorker} target\n * @param {WebWorker} parent\n * @param {string|number} mapId A unique identifier for the Map instance using this Actor.\n * @private\n */\nclass Actor {\n    target: any;\n    parent: any;\n    mapId: ?number;\n    callbacks: { number: any };\n    name: string;\n    cancelCallbacks: { number: Cancelable };\n    scheduler: Scheduler;\n\n    constructor(target: any, parent: any, mapId: ?number) {\n        this.target = target;\n        this.parent = parent;\n        this.mapId = mapId;\n        this.callbacks = {};\n        this.cancelCallbacks = {};\n        bindAll(['receive'], this);\n        // $FlowFixMe[method-unbinding]\n        this.target.addEventListener('message', this.receive, false);\n        this.scheduler = new Scheduler();\n    }\n\n    /**\n     * Sends a message from a main-thread map to a Worker or from a Worker back to\n     * a main-thread map instance.\n     *\n     * @param type The name of the target method to invoke or '[source-type].[source-name].name' for a method on a WorkerSource.\n     * @param targetMapId A particular mapId to which to send this message.\n     * @private\n     */\n    send(type: string, data: mixed, callback: ?Function, targetMapId: ?string, mustQueue: boolean = false, callbackMetadata?: Object): ?Cancelable {\n        // We're using a string ID instead of numbers because they are being used as object keys\n        // anyway, and thus stringified implicitly. We use random IDs because an actor may receive\n        // message from multiple other actors which could run in different execution context. A\n        // linearly increasing ID could produce collisions.\n        const id = Math.round((Math.random() * 1e18)).toString(36).substring(0, 10);\n        if (callback) {\n            callback.metadata = callbackMetadata;\n            this.callbacks[id] = callback;\n        }\n        const buffers: Set<Transferable> = new Set();\n        this.target.postMessage({\n            id,\n            type,\n            hasCallback: !!callback,\n            targetMapId,\n            mustQueue,\n            sourceMapId: this.mapId,\n            data: serialize(data, buffers)\n        }, buffers);\n        return {\n            cancel: () => {\n                if (callback) {\n                    // Set the callback to null so that it never fires after the request is aborted.\n                    delete this.callbacks[id];\n                }\n                this.target.postMessage({\n                    id,\n                    type: '<cancel>',\n                    targetMapId,\n                    sourceMapId: this.mapId\n                });\n            }\n        };\n    }\n\n    receive(message: Object) {\n        const data = message.data,\n            id = data.id;\n\n        if (!id) {\n            return;\n        }\n\n        if (data.targetMapId && this.mapId !== data.targetMapId) {\n            return;\n        }\n\n        if (data.type === '<cancel>') {\n            // Remove the original request from the queue. This is only possible if it\n            // hasn't been kicked off yet. The id will remain in the queue, but because\n            // there is no associated task, it will be dropped once it's time to execute it.\n            const cancel = this.cancelCallbacks[id];\n            delete this.cancelCallbacks[id];\n            if (cancel) {\n                cancel.cancel();\n            }\n        } else {\n            if (data.mustQueue || isWorker()) {\n                // for worker tasks that are often cancelled, such as loadTile, store them before actually\n                // processing them. This is necessary because we want to keep receiving <cancel> messages.\n                // Some tasks may take a while in the worker thread, so before executing the next task\n                // in our queue, postMessage preempts this and <cancel> messages can be processed.\n                // We're using a MessageChannel object to get throttle the process() flow to one at a time.\n                const callback = this.callbacks[id];\n                const metadata = (callback && callback.metadata) || {type: \"message\"};\n                const cancel = this.scheduler.add(() => this.processTask(id, data), metadata);\n                if (cancel) this.cancelCallbacks[id] = cancel;\n            } else {\n                // In the main thread, process messages immediately so that other work does not slip in\n                // between getting partial data back from workers.\n                this.processTask(id, data);\n            }\n        }\n    }\n\n    processTask(id: number, task: any) {\n        // Always delete since we are no longer cancellable\n        delete this.cancelCallbacks[id];\n        if (task.type === '<response>') {\n            // The done() function in the counterpart has been called, and we are now\n            // firing the callback in the originating actor, if there is one.\n            const callback = this.callbacks[id];\n            delete this.callbacks[id];\n            if (callback) {\n                // If we get a response, but don't have a callback, the request was canceled.\n                if (task.error) {\n                    callback(deserialize(task.error));\n                } else {\n                    callback(null, deserialize(task.data));\n                }\n            }\n        } else {\n            const buffers: Set<Transferable> = new Set();\n            const done = task.hasCallback ? (err: ?Error, data: mixed) => {\n                this.target.postMessage({\n                    id,\n                    type: '<response>',\n                    sourceMapId: this.mapId,\n                    error: err ? serialize(err) : null,\n                    data: serialize(data, buffers)\n                }, buffers);\n            } : (_) => {\n            };\n\n            const params = (deserialize(task.data): any);\n            if (this.parent[task.type]) {\n                // task.type == 'loadTile', 'removeTile', etc.\n                this.parent[task.type](task.sourceMapId, params, done);\n            } else if (this.parent.getWorkerSource) {\n                // task.type == sourcetype.method\n                const keys = task.type.split('.');\n                const scope = (this.parent: any).getWorkerSource(task.sourceMapId, keys[0], params.source, params.scope);\n                scope[keys[1]](params, done);\n            } else {\n                // No function was found.\n                done(new Error(`Could not find function ${task.type}`));\n            }\n        }\n    }\n\n    remove() {\n        this.scheduler.remove();\n        // $FlowFixMe[method-unbinding]\n        this.target.removeEventListener('message', this.receive, false);\n    }\n}\n\nexport default Actor;\n","// @flow\n\nimport {uniqueId, asyncAll} from './util.js';\nimport Actor from './actor.js';\nimport assert from 'assert';\n\nimport type WorkerPool from './worker_pool.js';\nimport type {Class} from '../types/class.js';\n\n/**\n * Responsible for sending messages from a {@link Source} to an associated\n * {@link WorkerSource}.\n *\n * @private\n */\nclass Dispatcher {\n    workerPool: WorkerPool;\n    actors: Array<Actor>;\n    currentActor: number;\n    id: number;\n    ready: boolean;\n\n    // exposed to allow stubbing in unit tests\n    static Actor: Class<Actor>;\n\n    constructor(workerPool: WorkerPool, parent: any) {\n        this.workerPool = workerPool;\n        this.actors = [];\n        this.currentActor = 0;\n        this.id = uniqueId();\n        const workers = this.workerPool.acquire(this.id);\n        for (let i = 0; i < workers.length; i++) {\n            const worker = workers[i];\n            const actor = new Dispatcher.Actor(worker, parent, this.id);\n            actor.name = `Worker ${i}`;\n            this.actors.push(actor);\n        }\n        assert(this.actors.length);\n\n        // track whether all workers are instantiated and ready to receive messages;\n        // used for optimizations on initial map load\n        this.ready = false;\n        this.broadcast('checkIfReady', null, () => { this.ready = true; });\n    }\n\n    /**\n     * Broadcast a message to all Workers.\n     * @private\n     */\n    broadcast(type: string, data: mixed, cb?: Function) {\n        assert(this.actors.length);\n        cb = cb || function () {};\n        asyncAll(this.actors, (actor, done) => {\n            actor.send(type, data, done);\n        }, cb);\n    }\n\n    /**\n     * Acquires an actor to dispatch messages to. The actors are distributed in round-robin fashion.\n     * @returns {Actor} An actor object backed by a web worker for processing messages.\n     */\n    getActor(): Actor {\n        assert(this.actors.length);\n        this.currentActor = (this.currentActor + 1) % this.actors.length;\n        return this.actors[this.currentActor];\n    }\n\n    remove() {\n        this.actors.forEach((actor) => { actor.remove(); });\n        this.actors = [];\n        this.workerPool.release(this.id);\n    }\n}\n\nDispatcher.Actor = Actor;\n\nexport default Dispatcher;\n","// @flow\n\nexport default {\n    workerUrl: '',\n    workerClass: null,\n    workerParams: undefined,\n};\n","// @flow\n\nimport WorkerClass from './worker_class.js';\nimport type {Class} from '../types/class.js';\nimport type {WorkerSource} from '../source/worker_source.js';\n\ntype MessageListener = ({data: Object}) => mixed;\n\n// The main thread interface. Provided by Worker in a browser environment,\n// and MessageBus below in a node environment.\nexport interface WorkerInterface {\n    addEventListener(type: 'message', listener: MessageListener): void;\n    removeEventListener(type: 'message', listener: MessageListener): void;\n    postMessage(message: any): void;\n    terminate(): void;\n}\n\nexport interface WorkerGlobalScopeInterface {\n    importScripts(...urls: Array<string>): void;\n\n    registerWorkerSource?: (string, Class<WorkerSource>) => void,\n    registerRTLTextPlugin?: (_: any) => void\n}\n\nexport default function (): WorkerInterface {\n    return (WorkerClass.workerClass != null) ? new WorkerClass.workerClass() : (new self.Worker(WorkerClass.workerUrl, WorkerClass.workerParams): any); // eslint-disable-line new-cap\n}\n","// @flow\n\nimport WebWorker from './web_worker.js';\nimport type {WorkerInterface} from './web_worker.js';\n\nexport const PRELOAD_POOL_ID = 'mapboxgl_preloaded_worker_pool';\n\n/**\n * Constructs a worker pool.\n * @private\n */\nexport default class WorkerPool {\n    static workerCount: number;\n\n    active: {[_: number | string]: boolean};\n    workers: Array<WorkerInterface>;\n\n    constructor() {\n        this.active = {};\n    }\n\n    acquire(mapId: number | string): Array<WorkerInterface> {\n        if (!this.workers) {\n            // Lazily look up the value of mapboxgl.workerCount so that\n            // client code has had a chance to set it.\n            this.workers = [];\n            while (this.workers.length < WorkerPool.workerCount) {\n                // $FlowFixMe[invalid-constructor]\n                this.workers.push(new WebWorker());\n            }\n        }\n\n        this.active[mapId] = true;\n        return this.workers.slice();\n    }\n\n    release(mapId: number | string) {\n        delete this.active[mapId];\n        if (this.workers && this.numActive() === 0) {\n            this.workers.forEach((w) => {\n                w.terminate();\n            });\n            this.workers = (null: any);\n        }\n    }\n\n    isPreloaded(): boolean {\n        return !!this.active[PRELOAD_POOL_ID];\n    }\n\n    numActive(): number {\n        return Object.keys(this.active).length;\n    }\n}\n\n// extensive benchmarking showed 2 to be the best default for both desktop and mobile devices;\n// we can't rely on hardwareConcurrency because of wild inconsistency of reported numbers between browsers\nWorkerPool.workerCount = 2;\n","// @flow\n\nimport WorkerPool, {PRELOAD_POOL_ID} from './worker_pool.js';\n\nlet globalWorkerPool: ?WorkerPool;\n\n/**\n * Creates (if necessary) and returns the single, global WorkerPool instance\n * to be shared across each Map\n * @private\n */\nexport default function getGlobalWorkerPool (): WorkerPool {\n    if (!globalWorkerPool) {\n        globalWorkerPool = new WorkerPool();\n    }\n    return globalWorkerPool;\n}\n\nexport function prewarm() {\n    const workerPool = getGlobalWorkerPool();\n    workerPool.acquire(PRELOAD_POOL_ID);\n}\n\nexport function clearPrewarmedResources() {\n    const pool = globalWorkerPool;\n    if (pool) {\n        // Remove the pool only if all maps that referenced the preloaded global worker pool have been removed.\n        if (pool.isPreloaded() && pool.numActive() === 1) {\n            pool.release(PRELOAD_POOL_ID);\n            globalWorkerPool = null;\n        } else {\n            console.warn('Could not clear WebWorkers since there are active Map instances that still reference it. The pre-warmed WebWorker pool can only be cleared when all map instances have been removed with map.remove()');\n        }\n    }\n}\n","// @flow\n/* eslint-disable new-cap */\n\nimport config from '../../src/util/config.js';\nimport browser from '../../src/util/browser.js';\nimport Dispatcher from '../../src/util/dispatcher.js';\nimport getWorkerPool from '../../src/util/global_worker_pool.js';\nimport {Evented} from '../../src/util/evented.js';\nimport {isWorker, warnOnce} from '../../src/util/util.js';\nimport assert from 'assert';\nimport {DracoDecoderModule} from './draco_decoder_gltf.js';\nimport {MeshoptDecoder} from './meshopt_decoder.js';\n\nimport type {Class} from '../../src/types/class.js';\n\nlet dispatcher = null;\n\nlet dracoLoading: Promise<any> | void;\nlet dracoUrl: ?string;\nlet draco: any;\nlet meshoptUrl: ?string;\nlet meshopt: any;\n\nexport function getDracoUrl(): string {\n    if (isWorker() && self.worker && self.worker.dracoUrl) {\n        return self.worker.dracoUrl;\n    }\n\n    return dracoUrl ? dracoUrl : config.DRACO_URL;\n}\n\nexport function setDracoUrl(url: string) {\n    dracoUrl = browser.resolveURL(url);\n\n    if (!dispatcher) {\n        dispatcher = new Dispatcher(getWorkerPool(), new Evented());\n    }\n\n    // Sets the Draco URL in all workers.\n    dispatcher.broadcast('setDracoUrl', dracoUrl);\n}\n\nfunction waitForDraco() {\n    if (draco) return;\n    if (dracoLoading) return dracoLoading;\n\n    dracoLoading = DracoDecoderModule(fetch(getDracoUrl()));\n\n    return dracoLoading.then((module) => {\n        draco = module;\n        dracoLoading = undefined;\n    });\n}\n\nexport function getMeshoptUrl(): string {\n    if (isWorker() && self.worker && self.worker.meshoptUrl) {\n        return self.worker.meshoptUrl;\n    }\n\n    if (meshoptUrl) return meshoptUrl;\n\n    const detector = new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, 0, 3, 3, 2, 0, 0, 5, 3, 1, 0, 1, 12, 1, 0, 10, 22, 2, 12, 0, 65, 0, 65, 0, 65, 0, 252, 10, 0, 0, 11, 7, 0, 65, 0, 253, 15, 26, 11]);\n\n    if (typeof WebAssembly !== 'object') {\n        throw new Error(\"WebAssembly not supported, cannot instantiate meshoptimizer\");\n    }\n\n    meshoptUrl = WebAssembly.validate(detector) ? config.MESHOPT_SIMD_URL : config.MESHOPT_URL;\n\n    return meshoptUrl;\n}\n\nexport function setMeshoptUrl(url: string) {\n    meshoptUrl = browser.resolveURL(url);\n    if (!dispatcher) {\n        dispatcher = new Dispatcher(getWorkerPool(), new Evented());\n    }\n    // Sets the Meshopt URL in all workers.\n    dispatcher.broadcast('setMeshoptUrl', meshoptUrl);\n}\n\nfunction waitForMeshopt() {\n    if (meshopt) return;\n    const decoder = MeshoptDecoder(fetch(getMeshoptUrl()));\n    return decoder.ready.then(() => {\n        meshopt = decoder;\n    });\n}\n\nexport const GLTF_BYTE = 5120;\nexport const GLTF_UBYTE = 5121;\nexport const GLTF_SHORT = 5122;\nexport const GLTF_USHORT = 5123;\nexport const GLTF_UINT = 5125;\nexport const GLTF_FLOAT = 5126;\n\nexport const GLTF_TO_ARRAY_TYPE: {[type: number]: Class<$TypedArray>} = {\n    [GLTF_BYTE]: Int8Array,\n    [GLTF_UBYTE]: Uint8Array,\n    [GLTF_SHORT]: Int16Array,\n    [GLTF_USHORT]: Uint16Array,\n    [GLTF_UINT]: Uint32Array,\n    [GLTF_FLOAT]: Float32Array\n};\n\nconst GLTF_TO_DRACO_TYPE = {\n    [GLTF_BYTE]: 'DT_INT8',\n    [GLTF_UBYTE]: 'DT_UINT8',\n    [GLTF_SHORT]: 'DT_INT16',\n    [GLTF_USHORT]: 'DT_UINT16',\n    [GLTF_UINT]: 'DT_UINT32',\n    [GLTF_FLOAT]: 'DT_FLOAT32'\n};\n\nexport const GLTF_COMPONENTS = {\n    SCALAR: 1,\n    VEC2: 2,\n    VEC3: 3,\n    VEC4: 4,\n    MAT2: 4,\n    MAT3: 9,\n    MAT4: 16\n};\n\ntype GLTFAccessor = {\n    count: number;\n    type: string;\n    componentType: number;\n    bufferView?: number;\n};\n\ntype GLTFPrimitive = {\n    indices: number;\n    attributes: {[id: string]: number};\n    extensions: {\n        KHR_draco_mesh_compression?: {\n            bufferView: number;\n            attributes: {[id: string]: number};\n        }\n    };\n};\n\nfunction setAccessorBuffer(buffer: ArrayBuffer, accessor: GLTFAccessor, gltf: any) {\n    const bufferViewIndex = gltf.json.bufferViews.length;\n    const bufferIndex = gltf.buffers.length;\n\n    accessor.bufferView = bufferViewIndex;\n\n    gltf.json.bufferViews[bufferViewIndex] = {\n        buffer: bufferIndex,\n        byteLength: buffer.byteLength\n    };\n    gltf.buffers[bufferIndex] = buffer;\n}\n\nconst DRACO_EXT = 'KHR_draco_mesh_compression';\n\nfunction loadDracoMesh(primitive: GLTFPrimitive, gltf: any) {\n    const config = primitive.extensions && primitive.extensions[DRACO_EXT];\n    if (!config) return;\n\n    const decoder = new draco.Decoder();\n    const bytes = getGLTFBytes(gltf, config.bufferView);\n\n    const mesh = new draco.Mesh();\n    const ok = decoder.DecodeArrayToMesh(bytes, bytes.byteLength, mesh);\n    if (!ok) throw new Error('Failed to decode Draco mesh');\n\n    const indexAccessor = gltf.json.accessors[primitive.indices];\n    const IndexArrayType = GLTF_TO_ARRAY_TYPE[indexAccessor.componentType];\n    const indicesSize = indexAccessor.count * IndexArrayType.BYTES_PER_ELEMENT;\n\n    const ptr = draco._malloc(indicesSize);\n    if (IndexArrayType === Uint16Array) {\n        decoder.GetTrianglesUInt16Array(mesh, indicesSize, ptr);\n    } else {\n        decoder.GetTrianglesUInt32Array(mesh, indicesSize, ptr);\n    }\n    const indicesBuffer = draco.memory.buffer.slice(ptr, ptr + indicesSize);\n    setAccessorBuffer(indicesBuffer, indexAccessor, gltf);\n    draco._free(ptr);\n\n    for (const attributeId of Object.keys(config.attributes)) {\n        const attribute = decoder.GetAttributeByUniqueId(mesh, config.attributes[attributeId]);\n        const accessor = gltf.json.accessors[primitive.attributes[attributeId]];\n        const ArrayType = GLTF_TO_ARRAY_TYPE[accessor.componentType];\n        const dracoTypeName = GLTF_TO_DRACO_TYPE[accessor.componentType];\n\n        const numComponents = GLTF_COMPONENTS[accessor.type];\n        const numValues = accessor.count * numComponents;\n        const dataSize = numValues * ArrayType.BYTES_PER_ELEMENT;\n\n        const ptr = draco._malloc(dataSize);\n        decoder.GetAttributeDataArrayForAllPoints(mesh, attribute, draco[dracoTypeName], dataSize, ptr);\n        const buffer = draco.memory.buffer.slice(ptr, ptr + dataSize);\n        setAccessorBuffer(buffer, accessor, gltf);\n        draco._free(ptr);\n    }\n\n    decoder.destroy();\n    mesh.destroy();\n\n    delete primitive.extensions[DRACO_EXT];\n}\n\nconst MESHOPT_EXT = 'EXT_meshopt_compression';\n\nfunction loadMeshoptBuffer(bufferView: any, gltf: any) {\n\n    if (!(bufferView.extensions && bufferView.extensions[ MESHOPT_EXT ])) return;\n    const config = bufferView.extensions[ MESHOPT_EXT ];\n    const byteOffset = config.byteOffset || 0;\n    const byteLength = config.byteLength || 0;\n\n    const buffer = gltf.buffers[config.buffer];\n    const source = new Uint8Array(buffer, byteOffset, byteLength);\n    const target = new Uint8Array(config.count * config.byteStride);\n    meshopt.decodeGltfBuffer(target, config.count, config.byteStride, source, config.mode, config.filter);\n    bufferView.buffer = gltf.buffers.length;\n    bufferView.byteOffset = 0;\n    gltf.buffers[bufferView.buffer] = target.buffer;\n\n    delete bufferView.extensions[MESHOPT_EXT];\n}\n\nconst MAGIC_GLTF = 0x46546C67;\nconst GLB_CHUNK_TYPE_JSON = 0x4E4F534A;\nconst GLB_CHUNK_TYPE_BIN = 0x004E4942;\n\nconst textDecoder = new TextDecoder('utf8');\n\nfunction resolveUrl(url: string, baseUrl?: string) {\n    return (new URL(url, baseUrl)).href;\n}\n\nfunction loadBuffer(buffer: {uri: string, byteLength: number}, gltf: any, index: number, baseUrl?: string) {\n    return fetch(resolveUrl(buffer.uri, baseUrl))\n        .then(response => response.arrayBuffer())\n        .then(arrayBuffer => {\n            assert(arrayBuffer.byteLength >= buffer.byteLength);\n            gltf.buffers[index] = arrayBuffer;\n        });\n}\n\nfunction getGLTFBytes(gltf: any, bufferViewIndex: number): Uint8Array {\n    const bufferView = gltf.json.bufferViews[bufferViewIndex];\n    const buffer = gltf.buffers[bufferView.buffer];\n    return new Uint8Array(buffer, bufferView.byteOffset || 0, bufferView.byteLength);\n}\n\nfunction loadImage(img: {uri?: string, bufferView?: number, mimeType: string}, gltf: any, index: number, baseUrl?: string) {\n    if (img.uri) {\n        const uri = resolveUrl(img.uri, baseUrl);\n        return fetch(uri)\n            .then(response => response.blob())\n            // $FlowFixMe https://github.com/facebook/flow/pull/7483\n            .then(blob => createImageBitmap(blob))\n            .then(imageBitmap => {\n                gltf.images[index] = imageBitmap;\n            });\n    } else if (img.bufferView !== undefined) {\n        const bytes = getGLTFBytes(gltf, img.bufferView);\n        const blob = new Blob([bytes], {type: img.mimeType});\n        return createImageBitmap(blob)\n            .then(imageBitmap => {\n                gltf.images[index] = imageBitmap;\n            });\n    }\n}\n\nexport function decodeGLTF(arrayBuffer: ArrayBuffer, byteOffset: number = 0, baseUrl?: string): any {\n    const gltf = {json: null, images: [], buffers: []};\n\n    if (new Uint32Array(arrayBuffer, byteOffset, 1)[0] === MAGIC_GLTF) {\n        const view = new Uint32Array(arrayBuffer, byteOffset);\n        assert(view[1] === 2);\n\n        let pos = 2;\n        const glbLen = (view[pos++] >> 2) - 3;\n        const jsonLen = view[pos++] >> 2;\n        const jsonType = view[pos++];\n        assert(jsonType === GLB_CHUNK_TYPE_JSON);\n\n        gltf.json = JSON.parse(textDecoder.decode(view.subarray(pos, pos + jsonLen)));\n        pos += jsonLen;\n\n        if (pos < glbLen) {\n            const byteLength = view[pos++];\n            const binType = view[pos++];\n            assert(binType === GLB_CHUNK_TYPE_BIN);\n            const start = byteOffset + (pos << 2);\n            gltf.buffers[0] = arrayBuffer.slice(start, start + byteLength);\n        }\n\n    } else {\n        gltf.json = JSON.parse(textDecoder.decode(new Uint8Array(arrayBuffer, byteOffset)));\n    }\n\n    const {buffers, images, meshes, extensionsUsed, bufferViews} = (gltf.json: any);\n    let bufferLoadsPromise: Promise<any> = Promise.resolve();\n    if (buffers) {\n        const bufferLoads = [];\n        for (let i = 0; i < buffers.length; i++) {\n            const buffer = buffers[i];\n            if (buffer.uri) {\n                bufferLoads.push(loadBuffer(buffer, gltf, i, baseUrl));\n\n            } else if (!gltf.buffers[i]) {\n                gltf.buffers[i] = null;\n            }\n        }\n        bufferLoadsPromise = Promise.all(bufferLoads);\n    }\n\n    return bufferLoadsPromise.then(() => {\n        const assetLoads = [];\n\n        const dracoUsed = extensionsUsed && extensionsUsed.includes(DRACO_EXT);\n        const meshoptUsed = extensionsUsed && extensionsUsed.includes(MESHOPT_EXT);\n        if (dracoUsed) {\n            assetLoads.push(waitForDraco());\n        }\n\n        if (meshoptUsed) {\n            assetLoads.push(waitForMeshopt());\n        }\n        if (images) {\n            for (let i = 0; i < images.length; i++) {\n                assetLoads.push(loadImage(images[i], gltf, i, baseUrl));\n            }\n        }\n\n        const assetLoadsPromise = assetLoads.length ?\n            Promise.all(assetLoads) :\n            Promise.resolve();\n\n        return assetLoadsPromise.then(() => {\n            if (dracoUsed && meshes) {\n                for (const {primitives} of meshes) {\n                    for (const primitive of primitives) {\n                        loadDracoMesh(primitive, gltf);\n                    }\n                }\n            }\n\n            if (meshoptUsed && meshes && bufferViews) {\n                for (const bufferView of bufferViews) {\n                    loadMeshoptBuffer(bufferView, gltf);\n                }\n            }\n\n            return gltf;\n        });\n    });\n}\n\nexport function loadGLTF(url: string): Promise<any> {\n    return fetch(url)\n        .then(response => response.arrayBuffer())\n        .then(buffer => decodeGLTF(buffer, 0, url));\n}\n\nexport function load3DTile(data: ArrayBuffer): Promise<any> {\n    const magic = new Uint32Array(data, 0, 1)[0];\n    let gltfOffset = 0;\n    if (magic !== MAGIC_GLTF) {\n        const header = new Uint32Array(data, 0, 7);\n        const [/*magic*/, /*version*/, byteLen, featureTableJsonLen, featureTableBinLen, batchTableJsonLen/*, batchTableBinLen*/] = header;\n        gltfOffset = header.byteLength + featureTableJsonLen + featureTableBinLen + batchTableJsonLen + featureTableBinLen;\n        if (byteLen !== data.byteLength || gltfOffset >= data.byteLength) {\n            warnOnce('Invalid b3dm header information.');\n        }\n    }\n    return decodeGLTF(data, gltfOffset);\n}\n","// @noflow\n/* eslint-disable new-cap */\n\n// Emscripten-based JavaScript wrapper for Google Draco WASM decoder, manually optimized for much smaller size\nexport function DracoDecoderModule(wasmPromise) {\n    let HEAPU8, wasmMemory = null;\n    function updateMemoryViews() {\n        HEAPU8 = new Uint8Array(wasmMemory.buffer);\n    }\n    function abort() {\n        throw new Error(\"Unexpected Draco error.\");\n    }\n    function memcpyBig(dest, src, num) {\n        return HEAPU8.copyWithin(dest, src, src + num);\n    }\n    function resizeHeap(requestedSize) {\n        const oldSize = HEAPU8.length;\n        const newSize = Math.max(requestedSize >>> 0, Math.ceil(oldSize * 1.2));\n        const pages = Math.ceil((newSize - oldSize) / 65536);\n        try {\n            wasmMemory.grow(pages);\n            updateMemoryViews();\n            return true;\n        } catch (e) {\n            return false;\n        }\n    }\n\n    const wasmImports = {\n        a: {\n            a: abort,\n            d: memcpyBig,\n            c: resizeHeap,\n            b: abort\n        }\n    };\n\n    const instantiateWasm = WebAssembly.instantiateStreaming ?\n        WebAssembly.instantiateStreaming(wasmPromise, wasmImports) :\n        wasmPromise.then(wasm => wasm.arrayBuffer()).then(buffer => WebAssembly.instantiate(buffer, wasmImports));\n\n    return instantiateWasm.then(output => {\n        // minified exports values might change when recompiling Draco WASM, to be manually updated on version ugprade\n        const {\n            Rb: _free,\n            Qb: _malloc,\n            P: _Mesh,\n            T: _MeshDestroy,\n            X: _StatusOK,\n            Ja: _Decoder,\n            La: _DecoderDecodeArrayToMesh,\n            Qa: _DecoderGetAttributeByUniqueId,\n            Va: _DecoderGetTrianglesUInt16Array,\n            Wa: _DecoderGetTrianglesUInt32Array,\n            eb: _DecoderGetAttributeDataArrayForAllPoints,\n            jb: _DecoderDestroy,\n            f: initRuntime,\n            e: memory,\n            yb: getINT8,\n            zb: getUINT8,\n            Ab: getINT16,\n            Bb: getUINT16,\n            Db: getUINT32,\n            Gb: getFLOAT32\n        } = output.instance.exports;\n\n        wasmMemory = memory;\n\n        const ensureCache = (() => {\n            let buffer = 0;\n            let size = 0;\n            let needed = 0;\n            let temp = 0;\n\n            return (array) => {\n                if (needed) {\n                    _free(temp);\n                    _free(buffer);\n                    size += needed;\n                    needed = buffer = 0;\n                }\n                if (!buffer) {\n                    size += 128;\n                    buffer = _malloc(size);\n                }\n\n                const len = (array.length + 7) & -8;\n                let offset = buffer;\n                if (len >= size) {\n                    needed = len;\n                    offset = temp = _malloc(len);\n                }\n\n                for (let i = 0; i < array.length; i++) {\n                    HEAPU8[offset + i] = array[i];\n                }\n\n                return offset;\n            };\n        })();\n\n        class Mesh {\n            constructor() {\n                this.ptr = _Mesh();\n            }\n            destroy() {\n                _MeshDestroy(this.ptr);\n            }\n        }\n\n        class Decoder {\n            constructor() {\n                this.ptr = _Decoder();\n            }\n            destroy() {\n                _DecoderDestroy(this.ptr);\n            }\n            DecodeArrayToMesh(data, dataSize, outMesh) {\n                const offset = ensureCache(data);\n                const status = _DecoderDecodeArrayToMesh(this.ptr, offset, dataSize, outMesh.ptr);\n                return !!_StatusOK(status);\n            }\n            GetAttributeByUniqueId(pc, id) {\n                return {ptr: _DecoderGetAttributeByUniqueId(this.ptr, pc.ptr, id)};\n            }\n            GetTrianglesUInt16Array(m, outSize, outValues) {\n                _DecoderGetTrianglesUInt16Array(this.ptr, m.ptr, outSize, outValues);\n            }\n            GetTrianglesUInt32Array(m, outSize, outValues) {\n                _DecoderGetTrianglesUInt32Array(this.ptr, m.ptr, outSize, outValues);\n            }\n            GetAttributeDataArrayForAllPoints(pc, pa, dataType, outSize, outValues) {\n                _DecoderGetAttributeDataArrayForAllPoints(this.ptr, pc.ptr, pa.ptr, dataType, outSize, outValues);\n            }\n        }\n\n        updateMemoryViews();\n        initRuntime();\n\n        return {\n            memory,\n            _free,\n            _malloc,\n            Mesh,\n            Decoder,\n            DT_INT8: getINT8(),\n            DT_UINT8: getUINT8(),\n            DT_INT16: getINT16(),\n            DT_UINT16: getUINT16(),\n            DT_UINT32: getUINT32(),\n            DT_FLOAT32: getFLOAT32()\n        };\n    });\n}\n","// @noflow\n\n// This file is part of meshoptimizer library and is distributed under the terms of MIT License.\n// Copyright (C) 2016-2023, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)\n\nexport function MeshoptDecoder(wasmPromise) {\n\n    let instance;\n\n    const ready =\n        WebAssembly.instantiateStreaming(wasmPromise, {})\n            .then((result) => {\n                instance = result.instance;\n                instance.exports.__wasm_call_ctors();\n            });\n\n    function decode(instance, fun, target, count, size, source, filter) {\n        const sbrk = instance.exports.sbrk;\n        const count4 = (count + 3) & ~3;\n        const tp = sbrk(count4 * size);\n        const sp = sbrk(source.length);\n        const heap = new Uint8Array(instance.exports.memory.buffer);\n        heap.set(source, sp);\n        const res = fun(tp, count, size, sp, source.length);\n        if (res === 0 && filter) {\n            filter(tp, count4, size);\n        }\n        target.set(heap.subarray(tp, tp + count * size));\n        sbrk(tp - sbrk(0));\n        if (res !== 0) {\n            throw new Error(`Malformed buffer data: ${res}`);\n        }\n    }\n\n    const filters = {\n        NONE: \"\",\n        OCTAHEDRAL: \"meshopt_decodeFilterOct\",\n        QUATERNION: \"meshopt_decodeFilterQuat\",\n        EXPONENTIAL: \"meshopt_decodeFilterExp\",\n    };\n\n    const decoders = {\n        ATTRIBUTES: \"meshopt_decodeVertexBuffer\",\n        TRIANGLES: \"meshopt_decodeIndexBuffer\",\n        INDICES: \"meshopt_decodeIndexSequence\",\n    };\n\n    return {\n        ready,\n        supported: true,\n        decodeGltfBuffer(target, count, size, source, mode, filter) {\n            decode(instance, instance.exports[decoders[mode]], target, count, size, source, instance.exports[filters[filter]]);\n        }\n    };\n}\n\n","// @flow\n\nimport {triangleIntersectsTriangle} from \"./intersection_tests.js\";\nimport Point from \"@mapbox/point-geometry\";\nimport {register} from \"./web_worker_transfer.js\";\n\ntype Cell = {\n    start: number;\n    len: number;\n};\n\n/**\n * TriangleGridIndex is a specialized GridIndex data structure optimized\n * for querying potentially intersecting triangles in a 2d plane. Once built,\n * the data structure is immutable.\n *\n * @private\n */\nclass TriangleGridIndex {\n    triangleCount: number;\n    min: Point;\n    max: Point;\n    xScale: number;\n    yScale: number;\n    cellsX: number;\n    cellsY: number;\n    cells: Array<?Cell>;\n    payload: Array<number>\n    lookup: ?Uint8Array;\n\n    constructor(vertices: Array<Point>, indices: Array<number>, cellCount: number, maxCellSize: ?number) {\n        this.triangleCount = indices.length / 3;\n        this.min = new Point(0, 0);\n        this.max = new Point(0, 0);\n        this.xScale = 0;\n        this.yScale = 0;\n        this.cellsX = 0;\n        this.cellsY = 0;\n        this.cells = [];\n        this.payload = [];\n\n        if (this.triangleCount === 0 || vertices.length === 0) {\n            return;\n        }\n\n        // Compute cell size from the input\n\n        const [min, max] = [vertices[0].clone(), vertices[0].clone()];\n        for (let i = 1; i < vertices.length; ++i) {\n            const v = vertices[i];\n            min.x = Math.min(min.x, v.x);\n            min.y = Math.min(min.y, v.y);\n            max.x = Math.max(max.x, v.x);\n            max.y = Math.max(max.y, v.y);\n        }\n\n        if (maxCellSize) {\n            const optimalCellCount = Math.ceil(Math.max(max.x - min.x, max.y - min.y) / maxCellSize);\n            cellCount = Math.max(cellCount, optimalCellCount);\n        }\n\n        if (cellCount === 0) {\n            return;\n        }\n\n        this.min = min;\n        this.max = max;\n\n        const size = this.max.sub(this.min);\n        size.x = Math.max(size.x, 1);\n        size.y = Math.max(size.y, 1);\n\n        const maxExt = Math.max(size.x, size.y);\n        const cellSize = maxExt / cellCount;\n\n        this.cellsX = Math.max(1, Math.ceil(size.x / cellSize));\n        this.cellsY = Math.max(1, Math.ceil(size.y / cellSize));\n        this.xScale = 1.0 / cellSize;\n        this.yScale = 1.0 / cellSize;\n\n        const associatedTriangles = [];\n\n        // For each triangle find all intersecting cells\n        for (let t = 0; t < this.triangleCount; t++) {\n            const v0 = vertices[indices[t * 3 + 0]].sub(this.min);\n            const v1 = vertices[indices[t * 3 + 1]].sub(this.min);\n            const v2 = vertices[indices[t * 3 + 2]].sub(this.min);\n\n            const minx = toCellIdx(Math.floor(Math.min(v0.x, v1.x, v2.x)), this.xScale, this.cellsX);\n            const maxx = toCellIdx(Math.floor(Math.max(v0.x, v1.x, v2.x)), this.xScale, this.cellsX);\n            const miny = toCellIdx(Math.floor(Math.min(v0.y, v1.y, v2.y)), this.yScale, this.cellsY);\n            const maxy = toCellIdx(Math.floor(Math.max(v0.y, v1.y, v2.y)), this.yScale, this.cellsY);\n\n            // Pre-allocate corner points of a cell\n            const c00 = new Point(0, 0);\n            const c10 = new Point(0, 0);\n            const c01 = new Point(0, 0);\n            const c11 = new Point(0, 0);\n\n            for (let y = miny; y <= maxy; ++y) {\n                c00.y = c10.y = y * cellSize;\n                c01.y = c11.y = (y + 1) * cellSize;\n\n                for (let x = minx; x <= maxx; ++x) {\n                    c00.x = c01.x = x * cellSize;\n                    c10.x = c11.x = (x + 1) * cellSize;\n\n                    if (!triangleIntersectsTriangle(v0, v1, v2, c00, c10, c11) &&\n                        !triangleIntersectsTriangle(v0, v1, v2, c00, c11, c01)) {\n                        continue;\n                    }\n\n                    associatedTriangles.push({cellIdx: y * this.cellsX + x, triIdx: t});\n                }\n            }\n        }\n\n        if (associatedTriangles.length === 0) {\n            return;\n        }\n\n        // Store cell payload (a list of contained triangles) in adjacent memory cell by cell\n        associatedTriangles.sort((a, b) => a.cellIdx - b.cellIdx || a.triIdx - b.triIdx);\n\n        let idx = 0;\n        while (idx < associatedTriangles.length) {\n            const cellIdx = associatedTriangles[idx].cellIdx;\n            const cell = {start: this.payload.length, len:0};\n\n            // Find all triangles belonging to the current cell\n            while (idx < associatedTriangles.length && associatedTriangles[idx].cellIdx === cellIdx) {\n                ++cell.len;\n                this.payload.push(associatedTriangles[idx++].triIdx);\n            }\n\n            this.cells[cellIdx] = cell;\n        }\n    }\n\n    query(bbMin: Point, bbMax: Point, out: Array<number>): void {\n        if (this.triangleCount === 0 || this.cells.length === 0) {\n            return;\n        }\n\n        if (bbMin.x > this.max.x || this.min.x > bbMax.x) {\n            return;\n        } else if (bbMin.y > this.max.y || this.min.y > bbMax.y) {\n            return;\n        }\n\n        // Use a bitset for lookups\n        if (!this.lookup) {\n            this.lookup = new Uint8Array(Math.ceil(this.triangleCount / 8));\n        }\n\n        for (let i = 0; i < this.lookup.length; i++) {\n            this.lookup[i] = 0;\n        }\n\n        const mnx = toCellIdx(bbMin.x - this.min.x, this.xScale, this.cellsX);\n        const mxx = toCellIdx(bbMax.x - this.min.x, this.xScale, this.cellsX);\n        const mny = toCellIdx(bbMin.y - this.min.y, this.yScale, this.cellsY);\n        const mxy = toCellIdx(bbMax.y - this.min.y, this.yScale, this.cellsY);\n\n        for (let y = mny; y <= mxy; y++) {\n            for (let x = mnx; x <= mxx; x++) {\n                const cell = this.cells[y * this.cellsX + x];\n\n                if (!cell) {\n                    continue;\n                }\n\n                for (let i = 0; i < cell.len; i++) {\n                    const triIdx = this.payload[cell.start + i];\n\n                    // Check the lookup bitset if the triangle has been visited already\n                    const byte = Math.floor(triIdx / 8);\n                    const bit = 1 << (triIdx % 8);\n\n                    if ((this.lookup: any)[byte] & bit) {\n                        continue;\n                    }\n\n                    (this.lookup: any)[byte] |= bit;\n                    out.push(triIdx);\n\n                    if (out.length === this.triangleCount) {\n                        // All triangles visited already\n                        return;\n                    }\n                }\n            }\n        }\n    }\n}\n\nfunction toCellIdx(p: number, scale: number, cells: number): number {\n    return Math.max(0, Math.min(cells - 1, Math.floor(p * scale)));\n}\n\nregister(TriangleGridIndex, 'TriangleGridIndex');\n\nexport default TriangleGridIndex;\n","// @flow\n\nimport {type Footprint, type Mesh, type Node, type Material, type ModelTexture, type Sampler, type AreaLight, HEIGHTMAP_DIM} from '../data/model.js';\nimport {Aabb} from '../../src/util/primitives.js';\nimport Color from '../../src/style-spec/util/color.js';\nimport {mat4, vec3} from 'gl-matrix';\nimport {TriangleIndexArray,\n    ModelLayoutArray,\n    NormalLayoutArray,\n    TexcoordLayoutArray,\n    Color3fLayoutArray,\n    Color4fLayoutArray\n} from '../../src/data/array_types.js';\nimport {GLTF_TO_ARRAY_TYPE, GLTF_COMPONENTS} from '../util/loaders.js';\n\nimport Point from '@mapbox/point-geometry';\nimport earcut from 'earcut';\n\nimport {base64DecToArr} from '../../src/util/util.js';\nimport assert from 'assert';\nimport TriangleGridIndex from '../../src/util/triangle_grid_index.js';\n\nimport type {Class} from '../../src/types/class.js';\nimport type {Vec2, Vec3, Mat4} from 'gl-matrix';\nimport type {TextureImage} from '../../src/render/texture.js';\n\nfunction convertTextures(gltf: Object, images: Array<TextureImage>): Array<ModelTexture> {\n    const textures: ModelTexture[] = [];\n    const gl = WebGL2RenderingContext;\n    if (gltf.json.textures) {\n        for (const textureDesc of gltf.json.textures) {\n            const sampler: Sampler = {\n                magFilter: gl.LINEAR,\n                minFilter: gl.NEAREST,\n                wrapS: gl.REPEAT,\n                wrapT: gl.REPEAT\n            };\n            if (textureDesc.sampler !== undefined) Object.assign(sampler, gltf.json.samplers[textureDesc.sampler]);\n            textures.push({\n                image: images[textureDesc.source],\n                sampler,\n                uploaded: false\n            });\n        }\n    }\n    return textures;\n}\n\nfunction convertMaterial(materialDesc: Object, textures: Array<ModelTexture>): Material {\n    const {\n        emissiveFactor = [0, 0, 0],\n        alphaMode = 'OPAQUE',\n        alphaCutoff = 0.5,\n        normalTexture,\n        occlusionTexture,\n        emissiveTexture,\n        doubleSided\n    } = materialDesc;\n\n    const {\n        baseColorFactor = [1, 1, 1, 1],\n        metallicFactor = 1.0,\n        roughnessFactor = 1.0,\n        baseColorTexture,\n        metallicRoughnessTexture\n    } = materialDesc.pbrMetallicRoughness || {};\n\n    const modelOcclusionTexture = occlusionTexture ? textures[occlusionTexture.index] : undefined;\n    // Supporting texture transform only for occlusion (mbx landmarks)\n    // Check if KHR_Texture_transform is set.\n    if (occlusionTexture && occlusionTexture.extensions && occlusionTexture.extensions['KHR_texture_transform'] && modelOcclusionTexture) {\n        const transform = occlusionTexture.extensions['KHR_texture_transform'];\n        modelOcclusionTexture.offsetScale = [transform.offset[0], transform.offset[1], transform.scale[0], transform.scale[1]];\n    }\n\n    return {\n        pbrMetallicRoughness: {\n            baseColorFactor: new Color(...baseColorFactor),\n            metallicFactor,\n            roughnessFactor,\n            baseColorTexture: baseColorTexture ? textures[baseColorTexture.index] : undefined,\n            metallicRoughnessTexture: metallicRoughnessTexture ? textures[metallicRoughnessTexture.index] : undefined\n        },\n        doubleSided,\n        emissiveFactor,\n        alphaMode,\n        alphaCutoff,\n        normalTexture: normalTexture ? textures[normalTexture.index] : undefined,\n        occlusionTexture: modelOcclusionTexture,\n        emissionTexture: emissiveTexture ? textures[emissiveTexture.index] : undefined,\n        defined: materialDesc.defined === undefined // just to make the rendertests the same than native\n    };\n}\n\nfunction computeCentroid(indexArray: $TypedArray, vertexArray: $TypedArray): Vec3 {\n    const out = [0.0, 0.0, 0.0];\n    const indexSize = indexArray.length;\n    if (indexSize > 0) {\n        for (let i = 0; i < indexSize; i++) {\n            const index = indexArray[i] * 3;\n            out[0] += vertexArray[index];\n            out[1] += vertexArray[index + 1];\n            out[2] += vertexArray[index + 2];\n        }\n        out[0] /= indexSize;\n        out[1] /= indexSize;\n        out[2] /= indexSize;\n    }\n    return out;\n}\n\nfunction getNormalizedScale(arrayType: Class<$TypedArray>) {\n    switch (arrayType) {\n    case Int8Array:\n        return 1 / 127;\n    case Uint8Array:\n        return 1 / 255;\n    case Int16Array:\n        return 1 / 32767;\n    case Uint16Array:\n        return 1 / 65535;\n    default:\n        return 1;\n    }\n}\n\nfunction getBufferData(gltf: Object, accessor: Object) {\n    const bufferView = gltf.json.bufferViews[accessor.bufferView];\n    const buffer = gltf.buffers[bufferView.buffer];\n    const offset = (accessor.byteOffset || 0) + (bufferView.byteOffset || 0);\n    const ArrayType = GLTF_TO_ARRAY_TYPE[accessor.componentType];\n    const itemBytes = GLTF_COMPONENTS[accessor.type] * ArrayType.BYTES_PER_ELEMENT;\n    const stride = (bufferView.byteStride && bufferView.byteStride !== itemBytes) ? bufferView.byteStride / ArrayType.BYTES_PER_ELEMENT : GLTF_COMPONENTS[accessor.type];\n    const bufferData = new ArrayType(buffer, offset, accessor.count * stride);\n    return bufferData;\n}\n\nfunction setArrayData(gltf: Object, accessor: Object, array: Object, buffer: $TypedArray) {\n    const ArrayType = GLTF_TO_ARRAY_TYPE[accessor.componentType];\n    const norm = getNormalizedScale(ArrayType);\n    const bufferView = gltf.json.bufferViews[accessor.bufferView];\n    const numElements = bufferView.byteStride ? bufferView.byteStride / ArrayType.BYTES_PER_ELEMENT : GLTF_COMPONENTS[accessor.type];\n    const float32Array = (array: any).float32;\n    const components = float32Array.length / array.capacity;\n    for (let i = 0, count = 0;  i < accessor.count * numElements; i += numElements, count += components) {\n        for (let j = 0; j < components; j++) {\n            float32Array[count + j] = buffer[i + j] * norm;\n        }\n    }\n    array._trim();\n}\n\nfunction convertPrimitive(primitive: Object, gltf: Object, textures: Array<ModelTexture>): Mesh {\n    const indicesIdx = primitive.indices;\n    const attributeMap = primitive.attributes;\n\n    const mesh: Mesh = {};\n\n    // eslint-disable-next-line no-warning-comments\n    // TODO: Investigate a better way to pass arrays to StructArrays and avoid the double componentType indices\n    mesh.indexArray = new TriangleIndexArray();\n    // eslint-disable-next-line no-warning-comments\n    // TODO: There might be no need to copy element by element to mesh.indexArray.\n    const indexAccessor = gltf.json.accessors[indicesIdx];\n    const numTriangles = indexAccessor.count / 3;\n    mesh.indexArray.reserve(numTriangles);\n    const indexArrayBuffer = getBufferData(gltf, indexAccessor);\n    for (let i = 0; i < numTriangles; i++) {\n        mesh.indexArray.emplaceBack(indexArrayBuffer[i * 3], indexArrayBuffer[i * 3 + 1], indexArrayBuffer[i * 3 + 2]);\n    }\n    mesh.indexArray._trim();\n    // vertices\n    mesh.vertexArray = new ModelLayoutArray();\n\n    const positionAccessor = gltf.json.accessors[attributeMap.POSITION];\n    mesh.vertexArray.reserve(positionAccessor.count);\n    const vertexArrayBuffer = getBufferData(gltf, positionAccessor);\n    for (let i = 0; i < positionAccessor.count; i++) {\n        mesh.vertexArray.emplaceBack(vertexArrayBuffer[i * 3], vertexArrayBuffer[i * 3 + 1], vertexArrayBuffer[i * 3 + 2]);\n    }\n    mesh.vertexArray._trim();\n    // bounding box\n    mesh.aabb = new Aabb(positionAccessor.min, positionAccessor.max);\n    mesh.centroid = computeCentroid(indexArrayBuffer, vertexArrayBuffer);\n\n    // colors\n    if (attributeMap.COLOR_0 !== undefined) {\n        const colorAccessor = gltf.json.accessors[attributeMap.COLOR_0];\n        const numElements = GLTF_COMPONENTS[colorAccessor.type];\n        const colorArrayBuffer = getBufferData(gltf, colorAccessor);\n        mesh.colorArray = numElements === 3 ? new Color3fLayoutArray() : new Color4fLayoutArray();\n        mesh.colorArray.resize(colorAccessor.count);\n        setArrayData(gltf, colorAccessor, mesh.colorArray, colorArrayBuffer);\n    }\n\n    // normals\n    if (attributeMap.NORMAL !== undefined) {\n        mesh.normalArray = new NormalLayoutArray();\n        const normalAccessor = gltf.json.accessors[attributeMap.NORMAL];\n        mesh.normalArray.resize(normalAccessor.count);\n        const normalArrayBuffer = getBufferData(gltf, normalAccessor);\n        setArrayData(gltf, normalAccessor, mesh.normalArray, normalArrayBuffer);\n    }\n\n    // texcoord\n    if (attributeMap.TEXCOORD_0 !== undefined && textures.length > 0) {\n        mesh.texcoordArray = new TexcoordLayoutArray();\n        const texcoordAccessor = gltf.json.accessors[attributeMap.TEXCOORD_0];\n        mesh.texcoordArray.resize(texcoordAccessor.count);\n        const texcoordArrayBuffer = getBufferData(gltf, texcoordAccessor);\n        setArrayData(gltf, texcoordAccessor, mesh.texcoordArray, texcoordArrayBuffer);\n    }\n\n    // V2 tiles\n    if (attributeMap._FEATURE_ID_RGBA4444 !== undefined) {\n        const featureAccesor = gltf.json.accessors[attributeMap._FEATURE_ID_RGBA4444];\n        if (gltf.json.extensionsUsed && gltf.json.extensionsUsed.includes('EXT_meshopt_compression')) {\n            mesh.featureData = getBufferData(gltf, featureAccesor);\n        }\n    }\n\n    // V1 tiles\n    if (attributeMap._FEATURE_RGBA4444 !== undefined) {\n        const featureAccesor = gltf.json.accessors[attributeMap._FEATURE_RGBA4444];\n        mesh.featureData = new Uint32Array(getBufferData(gltf, featureAccesor).buffer);\n    }\n\n    // Material\n    const materialIdx = primitive.material;\n    const materialDesc = materialIdx !== undefined ? gltf.json.materials[materialIdx] : {defined: false};\n    mesh.material = convertMaterial(materialDesc, textures);\n\n    return mesh;\n}\n\nfunction convertMeshes(gltf: Object, textures: Array<ModelTexture>): Array<Array<Mesh>> {\n    const meshes: Mesh[][] = [];\n    for (const meshDesc of gltf.json.meshes) {\n        const primitives: Mesh[] = [];\n        for (const primitive of meshDesc.primitives) {\n            primitives.push(convertPrimitive(primitive, gltf, textures));\n        }\n        meshes.push(primitives);\n    }\n    return meshes;\n}\n\nfunction convertNode(nodeDesc: Object, gltf: Object, meshes: Array<Array<Mesh>>): Node {\n    const {matrix, rotation, translation, scale, mesh, extras, children} = nodeDesc;\n    const node: Node = {};\n    node.matrix = matrix || mat4.fromRotationTranslationScale([], rotation || [0, 0, 0, 1], translation || [0, 0, 0], scale || [1, 1, 1]);\n    if (mesh !== undefined) {\n        node.meshes = meshes[mesh];\n        const anchor: Vec2 = node.anchor = [0, 0];\n        for (const mesh of node.meshes) {\n            const {min, max} = mesh.aabb;\n            anchor[0] += min[0] + max[0];\n            anchor[1] += min[1] + max[1];\n        }\n        anchor[0] = Math.floor(anchor[0] / node.meshes.length / 2);\n        anchor[1] = Math.floor(anchor[1] / node.meshes.length / 2);\n    }\n    if (extras) {\n        if (extras.id) {\n            node.id = extras.id;\n        }\n        if (extras.lights) {\n            node.lights = decodeLights(extras.lights);\n        }\n    }\n    if (children) {\n        const converted: Node[] = [];\n        for (const childNodeIdx of children) {\n            converted.push(convertNode(gltf.json.nodes[childNodeIdx], gltf, meshes));\n        }\n        node.children = converted;\n    }\n\n    return node;\n}\n\ntype FootprintMesh = {\n    vertices: Array<Point>;\n    indices: Array<number>;\n};\n\nfunction convertFootprint(mesh: FootprintMesh): ?Footprint {\n    if (mesh.vertices.length === 0 || mesh.indices.length === 0) {\n        return null;\n    }\n\n    // Use a fixed size triangle grid (8x8 cells) for acceleration intersection queries\n    // with an exception that the cell size should never be larger than 256 tile units\n    // (equals to 32x32 subdivision).\n    const grid = new TriangleGridIndex(mesh.vertices, mesh.indices, 8, 256);\n    const [min, max] = [grid.min.clone(), grid.max.clone()];\n\n    return {\n        vertices: mesh.vertices,\n        indices: mesh.indices,\n        grid,\n        min,\n        max\n    };\n}\n\nfunction parseLegacyFootprintMesh(gltfNode: Object): ?FootprintMesh {\n    if (!gltfNode.extras || !gltfNode.extras.ground) {\n        return null;\n    }\n\n    const groundContainer = gltfNode.extras.ground;\n    if (!groundContainer || !Array.isArray(groundContainer) || groundContainer.length === 0) {\n        return null;\n    }\n\n    const ground = groundContainer[0];\n    if (!ground || !Array.isArray(ground) || ground.length === 0) {\n        return null;\n    }\n\n    // Populate only the vertex list of the footprint mesh.\n    const vertices: Array<Point> = [];\n\n    for (const point of ground) {\n        if (!Array.isArray(point) || point.length !== 2) {\n            continue;\n        }\n\n        const x = point[0];\n        const y = point[1];\n\n        if (typeof x !== \"number\" || typeof y !== \"number\") {\n            continue;\n        }\n\n        vertices.push(new Point(x, y));\n    }\n\n    if (vertices.length < 3) {\n        return null;\n    }\n\n    if (vertices.length > 1 && vertices[vertices.length - 1].equals(vertices[0])) {\n        vertices.pop();\n    }\n\n    // Ensure that the vertex list is defined in CW order\n    let cross = 0;\n\n    for (let i = 0; i < vertices.length; i++) {\n        const a = vertices[i];\n        const b = vertices[(i + 1) % vertices.length];\n        const c = vertices[(i + 2) % vertices.length];\n\n        cross += (a.x - b.x) * (c.y - b.y) - (c.x - b.x) * (a.y - b.y);\n    }\n\n    if (cross > 0) {\n        vertices.reverse();\n    }\n\n    // Triangulate the footprint and compute grid acceleration structure for\n    // more performant intersection queries.\n    const indices = earcut(vertices.flatMap(v => [v.x, v.y]), []);\n\n    if (indices.length === 0) {\n        return null;\n    }\n\n    return {vertices, indices};\n}\n\nfunction parseNodeFootprintMesh(meshes: Array<Mesh>, matrix: Mat4): ?FootprintMesh {\n    const vertices: Array<Point> = [];\n    const indices: Array<number> = [];\n\n    let baseVertex = 0;\n\n    const tempVertex = [];\n    for (const mesh of meshes) {\n        baseVertex = vertices.length;\n\n        const vArray = mesh.vertexArray.float32;\n        const iArray = mesh.indexArray.uint16;\n\n        for (let i = 0; i < mesh.vertexArray.length; i++) {\n            tempVertex[0] = vArray[i * 3 + 0];\n            tempVertex[1] = vArray[i * 3 + 1];\n            tempVertex[2] = vArray[i * 3 + 2];\n            vec3.transformMat4(tempVertex, tempVertex, matrix);\n            vertices.push(new Point(tempVertex[0], tempVertex[1]));\n        }\n\n        for (let i = 0; i < mesh.indexArray.length * 3; i++) {\n            indices.push(iArray[i] + baseVertex);\n        }\n    }\n\n    if (indices.length % 3 !== 0) {\n        return null;\n    }\n\n    for (let i = 0; i < indices.length; i += 3) {\n        const a = vertices[indices[i + 0]];\n        const b = vertices[indices[i + 1]];\n        const c = vertices[indices[i + 2]];\n\n        if ((a.x - b.x) * (c.y - b.y) - (c.x - b.x) * (a.y - b.y) > 0) {\n            // $FlowIssue[unsupported-syntax]\n            [indices[i + 1], indices[i + 2]] = [indices[i + 2], indices[i + 1]];\n        }\n    }\n\n    return {vertices, indices};\n}\n\nfunction convertFootprints(convertedNodes: Array<Node>, sceneNodes: any, modelNodes: any) {\n    // modelNodes == a list of nodes in the gltf file\n    // sceneNodes == an index array pointing to modelNodes being parsed\n    assert(convertedNodes.length === sceneNodes.length);\n\n    // Two different footprint formats are supported:\n    //  1) Legacy format where footprints are defined as a linestring json\n    //     inside extras-section of the node.\n    //  2) Version \"1\" where footprints are included as regular gltf meshes and\n    //     connected to correct models via matching ids.\n\n    // Find footprint-only nodes from the list.\n    const nodeFootprintLookup = {};\n    const footprintNodeIndices = new Set();\n\n    for (let i = 0; i < convertedNodes.length; i++) {\n        const gltfNode = modelNodes[sceneNodes[i]];\n\n        if (!gltfNode.extras) {\n            continue;\n        }\n\n        const fpVersion = gltfNode.extras[\"mapbox:footprint:version\"];\n        const fpId = gltfNode.extras[\"mapbox:footprint:id\"];\n\n        if (fpVersion || fpId) {\n            footprintNodeIndices.add(i);\n        }\n\n        if (fpVersion !== \"1.0.0\" || !fpId) {\n            continue;\n        }\n\n        nodeFootprintLookup[fpId] = i;\n    }\n\n    // Go through nodes and see if either of the supported footprint formats are defined\n    for (let i = 0; i < convertedNodes.length; i++) {\n        if (footprintNodeIndices.has(i)) {\n            continue;\n        }\n\n        const node = convertedNodes[i];\n        const gltfNode = modelNodes[sceneNodes[i]];\n\n        if (!gltfNode.extras) {\n            continue;\n        }\n\n        // Prefer footprint nodes over the legacy format\n        let fpMesh: ?FootprintMesh = null;\n\n        if (node.id in nodeFootprintLookup) {\n            fpMesh = parseNodeFootprintMesh(convertedNodes[nodeFootprintLookup[node.id]].meshes, node.matrix);\n        }\n\n        if (!fpMesh) {\n            fpMesh = parseLegacyFootprintMesh(gltfNode);\n        }\n\n        if (fpMesh) {\n            node.footprint = convertFootprint(fpMesh);\n        }\n    }\n\n    // Remove footprint nodes as they serve no other purpose\n    if (footprintNodeIndices.size > 0) {\n        const nodesToRemove = Array.from(footprintNodeIndices.values()).sort((a, b) => a - b);\n\n        for (let i = nodesToRemove.length - 1; i >= 0; i--) {\n            convertedNodes.splice(nodesToRemove[i], 1);\n        }\n    }\n}\n\nexport default function convertModel(gltf: Object): Array<Node> {\n    const textures = convertTextures(gltf, gltf.images);\n    const meshes = convertMeshes(gltf, textures);\n\n    // select the correct node hierarchy\n    const {scenes, scene, nodes} = gltf.json;\n    const gltfNodes = scenes ? scenes[scene || 0].nodes : nodes;\n\n    const resultNodes: Node[] = [];\n    for (const nodeIdx of gltfNodes) {\n        resultNodes.push(convertNode(nodes[nodeIdx], gltf, meshes));\n    }\n    convertFootprints(resultNodes, gltfNodes, gltf.json.nodes);\n    return resultNodes;\n}\n\nexport function process3DTile(gltf: Object, zScale: number): Array<Node> {\n    const nodes = convertModel(gltf);\n    for (const node of nodes) {\n        for (const mesh of node.meshes) {\n            parseHeightmap(mesh);\n        }\n        if (node.lights) {\n            node.lightMeshIndex = node.meshes.length;\n            node.meshes.push(createLightsMesh(node.lights, zScale));\n        }\n    }\n    return nodes;\n}\n\nfunction parseHeightmap(mesh: Mesh) {\n    // This is a temporary, best effort approach, implementation that's to be removed, for Mapbox landmarks,\n    // by a implementation in tiler. It would eventually still be used for 3d party models.\n    mesh.heightmap = new Float32Array(HEIGHTMAP_DIM * HEIGHTMAP_DIM);\n    mesh.heightmap.fill(-1);\n\n    const vertices = mesh.vertexArray.float32;\n    // implementation assumes tile coordinates for x and y and -1 and later +2\n    // are to prevent going out of range\n    const xMin = mesh.aabb.min[0] - 1;\n    const yMin = mesh.aabb.min[1] - 1;\n    const xMax = mesh.aabb.max[0];\n    const yMax = mesh.aabb.max[1];\n    const xRange = xMax - xMin + 2;\n    const yRange = yMax - yMin + 2;\n    const xCellInv = HEIGHTMAP_DIM / xRange;\n    const yCellInv = HEIGHTMAP_DIM / yRange;\n\n    for (let i = 0; i < vertices.length; i += 3) {\n        const px = vertices[i + 0];\n        const py = vertices[i + 1];\n        const pz = vertices[i + 2];\n        const x = ((px - xMin) * xCellInv) | 0;\n        const y = ((py - yMin) * yCellInv) | 0;\n        assert(x >= 0 && x < HEIGHTMAP_DIM);\n        assert(y >= 0 && y < HEIGHTMAP_DIM);\n        if (pz > mesh.heightmap[y * HEIGHTMAP_DIM + x]) {\n            mesh.heightmap[y * HEIGHTMAP_DIM + x] = pz;\n        }\n    }\n}\n\nfunction createLightsMesh(lights: Array<AreaLight>, zScale: number): Mesh {\n\n    const mesh: Mesh = {};\n    mesh.indexArray = new TriangleIndexArray();\n    mesh.indexArray.reserve(4 * lights.length);\n    mesh.vertexArray = new ModelLayoutArray();\n    mesh.vertexArray.reserve(10 * lights.length);\n    mesh.colorArray = new Color4fLayoutArray();\n    mesh.vertexArray.reserve(10 * lights.length);\n\n    let currentVertex = 0;\n    // Model layer color4 attribute is used for light offset: first three components are light's offset in tile space (z\n    // also in tile space) and 4th parameter is a decimal number that carries 2 parts: the distance to full light\n    // falloff is in the integer part, and the decimal part represents the ratio of distance where the falloff starts (saturated\n    // until it reaches that part).\n    for (const light of lights) {\n        // fallOff - light range from the door.\n        const fallOff = Math.min(10, Math.max(4, 1.3 * light.height)) * zScale;\n        const tangent = [-light.normal[1], light.normal[0], 0];\n        // 0---3  (at light.height above light.points)\n        // |   |\n        // 1-p-2  (p for light.position at bottom edge)\n\n        // horizontalSpread is tangent of the angle between light geometry and light normal.\n        // Cap it for doors with large inset (depth) to prevent intersecting door posts.\n        const horizontalSpread = Math.min(0.29, 0.1 * light.width / light.depth);\n        // A simple geometry, that starts at door, starts towards the centre of door to prevent intersecting\n        // door posts. Later, additional vertices at depth distance from door could be reconsidered.\n        // 0.01f to prevent intersection with door post.\n        const width = light.width - 2 * light.depth * zScale * (horizontalSpread + 0.01);\n        const v1 = vec3.scaleAndAdd([], light.pos, tangent, width / 2);\n        const v2 = vec3.scaleAndAdd([], light.pos, tangent, -width / 2);\n        const v0 = [v1[0], v1[1], v1[2] + light.height];\n        const v3 = [v2[0], v2[1], v2[2] + light.height];\n\n        const v1extrusion = vec3.scaleAndAdd([], light.normal, tangent, horizontalSpread);\n        vec3.scale(v1extrusion, v1extrusion, fallOff);\n        const v2extrusion = vec3.scaleAndAdd([], light.normal, tangent, -horizontalSpread);\n        vec3.scale(v2extrusion, v2extrusion, fallOff);\n\n        vec3.add(v1extrusion, v1, v1extrusion);\n        vec3.add(v2extrusion, v2, v2extrusion);\n\n        v1[2] += 0.1;\n        v2[2] += 0.1;\n        mesh.vertexArray.emplaceBack(v1extrusion[0], v1extrusion[1], v1extrusion[2]);\n        mesh.vertexArray.emplaceBack(v2extrusion[0], v2extrusion[1], v2extrusion[2]);\n        mesh.vertexArray.emplaceBack(v1[0], v1[1], v1[2]);\n        mesh.vertexArray.emplaceBack(v2[0], v2[1], v2[2]);\n        // side: top\n        mesh.vertexArray.emplaceBack(v0[0], v0[1], v0[2]);\n        mesh.vertexArray.emplaceBack(v3[0], v3[1], v3[2]);\n        // side\n        mesh.vertexArray.emplaceBack(v1[0], v1[1], v1[2]);\n        mesh.vertexArray.emplaceBack(v2[0], v2[1], v2[2]);\n        mesh.vertexArray.emplaceBack(v1extrusion[0], v1extrusion[1], v1extrusion[2]);\n        mesh.vertexArray.emplaceBack(v2extrusion[0], v2extrusion[1], v2extrusion[2]);\n        // Light doesnt include light coordinates - instead it includes offset to light area segment. Distances are\n        // normalized by dividing by fallOff. Normalized lighting coordinate system is used where center of\n        // coord system is on half of door and +Y is direction of extrusion.\n        // z includes half width - this is used to calculate distance to segment.\n\n        // 2 and 3 are bottom of the door, fully lit.\n        const halfWidth = width / fallOff / 2.0;\n        // right ground extruded looking out from door\n        // x Coordinate is used to model angle (for spot)\n        mesh.colorArray.emplaceBack(-halfWidth - horizontalSpread, -1, halfWidth, 0.8);\n        mesh.colorArray.emplaceBack(halfWidth + horizontalSpread, -1, halfWidth, 0.8);\n        // keep shine at bottom of door even for reduced emissive strength\n        mesh.colorArray.emplaceBack(-halfWidth, 0, halfWidth, 1.3);\n        mesh.colorArray.emplaceBack(halfWidth, 0, halfWidth, 1.3);\n        // for all vertices on the side, push the light origin behind the door top\n        mesh.colorArray.emplaceBack(halfWidth + horizontalSpread, -0.8, halfWidth, 0.7);\n        mesh.colorArray.emplaceBack(halfWidth + horizontalSpread, -0.8, halfWidth, 0.7);\n        // side at door, ground\n        mesh.colorArray.emplaceBack(0, 0, halfWidth, 1.3);\n        mesh.colorArray.emplaceBack(0, 0, halfWidth, 1.3);\n        // extruded side\n        mesh.colorArray.emplaceBack(halfWidth + horizontalSpread, -1.2, halfWidth, 0.8);\n        mesh.colorArray.emplaceBack(halfWidth + horizontalSpread, -1.2, halfWidth, 0.8);\n\n        // Finally, the triangle indices\n        mesh.indexArray.emplaceBack(6 + currentVertex, 4 + currentVertex, 8 + currentVertex);\n        mesh.indexArray.emplaceBack(7 + currentVertex, 9 + currentVertex, 5 + currentVertex);\n        mesh.indexArray.emplaceBack(0 + currentVertex, 1 + currentVertex, 2 + currentVertex);\n        mesh.indexArray.emplaceBack(1 + currentVertex, 3 + currentVertex, 2 + currentVertex);\n        currentVertex += 10;\n    }\n    //mesh.featureArray = new FeatureVertexArray();\n    //mesh.featureArray.reserve(10 * lights.length);\n    //for (let i = 0; i < 10 * lights.length; i++) {\n    //    mesh.featureArray.emplaceBack(0xffff, 0xffff, 0xffff, 0xffff, 0, 0, 0);\n    //}\n    const material: Material = {};\n    material.defined = true;\n    material.emissiveFactor = [0, 0, 0];\n    const pbrMetallicRoughness = {};\n    pbrMetallicRoughness.baseColorFactor = Color.white;\n    // $FlowIgnore[prop-missing] don't need all the properties\n    material.pbrMetallicRoughness = pbrMetallicRoughness;\n    mesh.material = material;\n    mesh.aabb = new Aabb([Infinity, Infinity, Infinity], [-Infinity, -Infinity, -Infinity]);\n    return mesh;\n}\n\nfunction decodeLights(base64: string): Array<AreaLight> {\n    if (!base64.length) return [];\n    const decoded = base64DecToArr(base64);\n    const lights: AreaLight[] = [];\n    const lightCount = decoded.length / 24; // 24 bytes (4 uint16 & 4 floats) per light\n    // Each door light is defined by two endpoiunts in tile coordinates, left and bottom right\n    // (where normal is implied from those two), depth and height.\n    // https://github.com/mapbox/mapbox-3dtile-tools/pull/100\n    const lightData = new Uint16Array(decoded.buffer);\n    const lightDataFloat = new Float32Array(decoded.buffer);\n    const stride = 6;\n    for (let i = 0; i < lightCount; i++) {\n        const height = lightData[i * 2 * stride] / 30;\n        const elevation = lightData[i * 2 * stride + 1 ] / 30;\n        const depth = lightData[i * 2 * stride + 10] / 100;\n        const x0 = lightDataFloat[i * stride + 1];\n        const y0 = lightDataFloat[i * stride + 2];\n        const x1 = lightDataFloat[i * stride + 3];\n        const y1 = lightDataFloat[i * stride + 4];\n        const dx = x1 - x0;\n        const dy = y1 - y0;\n        const width = Math.hypot(dx, dy);\n        const normal = [dy / width, -dx / width, 0];\n        const pos = [x0 + dx * 0.5, y0 + dy * 0.5, elevation];\n        const points = [x0, y0, x1, y1];\n        lights.push({pos, normal, width, height, depth, points});\n    }\n    return lights;\n}\n","// @flow strict\n\nimport assert from 'assert';\n\nclass DictionaryCoder {\n    _stringToNumber: {[_: string]: number };\n    _numberToString: Array<string>;\n\n    constructor(strings: Array<string>) {\n        this._stringToNumber = {};\n        this._numberToString = [];\n        for (let i = 0; i < strings.length; i++) {\n            const string = strings[i];\n            this._stringToNumber[string] = i;\n            this._numberToString[i] = string;\n        }\n    }\n\n    encode(string: string): number {\n        assert(string in this._stringToNumber);\n        return this._stringToNumber[string];\n    }\n\n    decode(n: number): string {\n        assert(n < this._numberToString.length);\n        return this._numberToString[n];\n    }\n}\n\nexport default DictionaryCoder;\n","// @flow\nimport type {LayerSpecification, SourceSpecification} from '../style-spec/types.js';\nimport type {GeoJSONGeometry, GeoJSONFeature} from '@mapbox/geojson-types';\nimport type {IVectorTileFeature} from '@mapbox/vector-tile';\n\n// we augment GeoJSON with custom properties in query*Features results\nexport interface QueryFeature extends GeoJSONFeature {\n    layer?: ?LayerSpecification;\n    source?: ?SourceSpecification | ?mixed;\n    sourceLayer?: ?string | ?mixed;\n    state: ?mixed;\n    [key: string]: mixed;\n}\n\nconst customProps = ['tile', 'layer', 'source', 'sourceLayer', 'state'];\n\nclass Feature {\n    type: 'Feature';\n    _geometry: ?GeoJSONGeometry;\n    properties: ?{};\n    id: number | string | void;\n    _vectorTileFeature: IVectorTileFeature;\n    _x: number;\n    _y: number;\n    _z: number;\n\n    tile: ?mixed;\n    layer: ?LayerSpecification;\n    source: ?mixed;\n    sourceLayer: ?mixed;\n    state: ?mixed;\n\n    constructor(vectorTileFeature: IVectorTileFeature, z: number, x: number, y: number, id: string | number | void) {\n        this.type = 'Feature';\n\n        this._vectorTileFeature = vectorTileFeature;\n        this._z = z;\n        this._x = x;\n        this._y = y;\n\n        this.properties = vectorTileFeature.properties;\n        this.id = id;\n    }\n\n    get geometry(): ?GeoJSONGeometry {\n        if (this._geometry === undefined) {\n            this._geometry = this._vectorTileFeature.toGeoJSON(this._x, this._y, this._z).geometry;\n        }\n        return this._geometry;\n    }\n\n    set geometry(g: ?GeoJSONGeometry) {\n        this._geometry = g;\n    }\n\n    toJSON(): QueryFeature {\n        const json: QueryFeature = {\n            type: 'Feature',\n            state: undefined,\n            geometry: this.geometry,\n            properties: this.properties\n        };\n        if (this.id !== undefined) json.id = this.id;\n        for (const key of customProps) {\n            // Flow doesn't support indexed access for classes https://github.com/facebook/flow/issues/1323\n            if ((this: any)[key] !== undefined) json[key] = (this: any)[key];\n        }\n        return json;\n    }\n}\n\nexport default Feature;\n","// @flow\n\nimport Point from '@mapbox/point-geometry';\n\nimport loadGeometry from './load_geometry.js';\nimport toEvaluationFeature from './evaluation_feature.js';\nimport EXTENT from '../style-spec/data/extent.js';\nimport featureFilter from '../style-spec/feature_filter/index.js';\nimport Grid from 'grid-index';\nimport DictionaryCoder from '../util/dictionary_coder.js';\nimport {VectorTile} from '@mapbox/vector-tile';\nimport Protobuf from 'pbf';\nimport GeoJSONFeature from '../util/vectortile_to_geojson.js';\nimport {arraysIntersect, mapObject, extend} from '../util/util.js';\nimport {OverscaledTileID} from '../source/tile_id.js';\nimport {register} from '../util/web_worker_transfer.js';\nimport EvaluationParameters from '../style/evaluation_parameters.js';\nimport SourceFeatureState from '../source/source_state.js';\nimport {polygonIntersectsBox} from '../util/intersection_tests.js';\nimport {PossiblyEvaluated} from '../style/properties.js';\nimport {FeatureIndexArray} from './array_types.js';\nimport {DEMSampler} from '../terrain/elevation.js';\n\nimport type StyleLayer from '../style/style_layer.js';\nimport type {QueryFeature} from '../util/vectortile_to_geojson.js';\nimport type {FeatureStates} from \"../source/source_state\";\nimport type {FeatureFilter} from '../style-spec/feature_filter/index.js';\nimport type Transform from '../geo/transform.js';\nimport type {FilterSpecification, PromoteIdSpecification} from '../style-spec/types.js';\nimport type {TilespaceQueryGeometry} from '../style/query_geometry.js';\nimport type {FeatureIndex as FeatureIndexStruct} from './array_types.js';\nimport type {TileTransform} from '../geo/projection/tile_transform.js';\nimport type {IVectorTileLayer, IVectorTileFeature} from '@mapbox/vector-tile';\nimport type {GridIndex} from '../types/grid-index.js';\n\ntype QueryParameters = {\n    pixelPosMatrix: Float32Array,\n    transform: Transform,\n    tileResult: TilespaceQueryGeometry,\n    tileTransform: TileTransform,\n    params: {\n        filter: FilterSpecification,\n        layers: Array<string>,\n        availableImages: Array<string>\n    }\n}\n\nexport type QueryResult = {[_: string]: Array<{ featureIndex: number, feature: QueryFeature }>};\n\ntype FeatureIndices = {\n    bucketIndex: number,\n    sourceLayerIndex: number,\n    featureIndex: number,\n    layoutVertexArrayOffset: number\n} | FeatureIndexStruct;\n\nclass FeatureIndex {\n    tileID: OverscaledTileID;\n    x: number;\n    y: number;\n    z: number;\n    grid: GridIndex;\n    featureIndexArray: FeatureIndexArray;\n    promoteId: ?PromoteIdSpecification;\n\n    rawTileData: ArrayBuffer;\n    bucketLayerIDs: Array<Array<string>>;\n\n    vtLayers: {[_: string]: IVectorTileLayer};\n    vtFeatures: {[_: string]: IVectorTileFeature[]};\n    sourceLayerCoder: DictionaryCoder;\n    is3DTile: boolean; // no vector source layers\n\n    constructor(tileID: OverscaledTileID, promoteId?: ?PromoteIdSpecification) {\n        this.tileID = tileID;\n        this.x = tileID.canonical.x;\n        this.y = tileID.canonical.y;\n        this.z = tileID.canonical.z;\n        this.grid = new Grid(EXTENT, 16, 0);\n        this.featureIndexArray = new FeatureIndexArray();\n        this.promoteId = promoteId;\n        this.is3DTile = false;\n    }\n\n    insert(feature: IVectorTileFeature, geometry: Array<Array<Point>>, featureIndex: number, sourceLayerIndex: number, bucketIndex: number, layoutVertexArrayOffset: number = 0, envelopePadding: number = 0) {\n        const key = this.featureIndexArray.length;\n        this.featureIndexArray.emplaceBack(featureIndex, sourceLayerIndex, bucketIndex, layoutVertexArrayOffset);\n\n        const grid = this.grid;\n\n        for (let r = 0; r < geometry.length; r++) {\n            const ring = geometry[r];\n\n            const bbox = [Infinity, Infinity, -Infinity, -Infinity];\n            for (let i = 0; i < ring.length; i++) {\n                const p = ring[i];\n                bbox[0] = Math.min(bbox[0], p.x);\n                bbox[1] = Math.min(bbox[1], p.y);\n                bbox[2] = Math.max(bbox[2], p.x);\n                bbox[3] = Math.max(bbox[3], p.y);\n            }\n\n            if (envelopePadding !== 0) {\n                bbox[0] -= envelopePadding;\n                bbox[1] -= envelopePadding;\n                bbox[2] += envelopePadding;\n                bbox[3] += envelopePadding;\n            }\n\n            if (bbox[0] < EXTENT &&\n                bbox[1] < EXTENT &&\n                bbox[2] >= 0 &&\n                bbox[3] >= 0) {\n                grid.insert(key, bbox[0], bbox[1], bbox[2], bbox[3]);\n            }\n        }\n    }\n\n    loadVTLayers(): {[_: string]: IVectorTileLayer} {\n        if (!this.vtLayers) {\n            this.vtLayers = new VectorTile(new Protobuf(this.rawTileData)).layers;\n            this.sourceLayerCoder = new DictionaryCoder(this.vtLayers ? Object.keys(this.vtLayers).sort() : ['_geojsonTileLayer']);\n            this.vtFeatures = {};\n            for (const layer in this.vtLayers) {\n                this.vtFeatures[layer] = [];\n            }\n        }\n        return this.vtLayers;\n    }\n\n    // Finds non-symbol features in this tile at a particular position.\n    query(args: QueryParameters, styleLayers: {[_: string]: StyleLayer}, serializedLayers: {[_: string]: Object}, sourceFeatureState: SourceFeatureState): QueryResult {\n        this.loadVTLayers();\n        const params = args.params || {},\n            filter = featureFilter(params.filter);\n        const tilespaceGeometry = args.tileResult;\n        const transform = args.transform;\n\n        const bounds = tilespaceGeometry.bufferedTilespaceBounds;\n        const queryPredicate = (bx1: number, by1: number, bx2: number, by2: number) => {\n            return polygonIntersectsBox(tilespaceGeometry.bufferedTilespaceGeometry, bx1, by1, bx2, by2);\n        };\n        const matching = this.grid.query(bounds.min.x, bounds.min.y, bounds.max.x, bounds.max.y, queryPredicate);\n        matching.sort(topDownFeatureComparator);\n\n        let elevationHelper = null;\n        if (transform.elevation && matching.length > 0) {\n            elevationHelper = DEMSampler.create(transform.elevation, this.tileID);\n        }\n\n        const result = {};\n        let previousIndex;\n        for (let k = 0; k < matching.length; k++) {\n            const index = matching[k];\n\n            // don't check the same feature more than once\n            if (index === previousIndex) continue;\n            previousIndex = index;\n\n            const match = this.featureIndexArray.get(index);\n            let featureGeometry = null;\n\n            if (this.is3DTile) {\n                // 3D tile is a single bucket tile.\n                const layerID = this.bucketLayerIDs[0][0];\n                const layer = styleLayers[layerID];\n                if (layer.type !== \"model\") continue;\n                const {queryFeature, intersectionZ} = layer.queryIntersectsMatchingFeature(tilespaceGeometry, match.featureIndex, filter, transform);\n                if (queryFeature) {\n                    this.appendToResult(result, layerID, match.featureIndex, queryFeature, intersectionZ);\n                }\n                continue;\n            }\n\n            this.loadMatchingFeature(\n                result,\n                match,\n                filter,\n                params.layers,\n                params.availableImages,\n                styleLayers,\n                serializedLayers,\n                sourceFeatureState,\n                (feature: IVectorTileFeature, styleLayer: StyleLayer, featureState: Object, layoutVertexArrayOffset: number = 0) => {\n                    if (!featureGeometry) {\n                        featureGeometry = loadGeometry(feature, this.tileID.canonical, args.tileTransform);\n                    }\n\n                    return styleLayer.queryIntersectsFeature(tilespaceGeometry, feature, featureState, featureGeometry, this.z, args.transform, args.pixelPosMatrix, elevationHelper, layoutVertexArrayOffset);\n                }\n            );\n        }\n\n        return result;\n    }\n\n    loadMatchingFeature(\n        result: QueryResult,\n        featureIndexData: FeatureIndices,\n        filter: FeatureFilter,\n        filterLayerIDs: Array<string>,\n        availableImages: Array<string>,\n        styleLayers: {[_: string]: StyleLayer},\n        serializedLayers: {[_: string]: Object},\n        sourceFeatureState?: SourceFeatureState,\n        intersectionTest?: (feature: IVectorTileFeature, styleLayer: StyleLayer, featureState: Object, layoutVertexArrayOffset: number) => boolean | number) {\n\n        const {featureIndex, bucketIndex, sourceLayerIndex, layoutVertexArrayOffset} = featureIndexData;\n        const layerIDs = this.bucketLayerIDs[bucketIndex];\n        if (filterLayerIDs && !arraysIntersect(filterLayerIDs, layerIDs))\n            return;\n\n        const sourceLayerName = this.sourceLayerCoder.decode(sourceLayerIndex);\n        const sourceLayer = this.vtLayers[sourceLayerName];\n        const feature = sourceLayer.feature(featureIndex);\n\n        if (filter.needGeometry) {\n            const evaluationFeature = toEvaluationFeature(feature, true);\n            // $FlowFixMe[method-unbinding]\n            if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), evaluationFeature, this.tileID.canonical)) {\n                return;\n            }\n        // $FlowFixMe[method-unbinding]\n        } else if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), feature)) {\n            return;\n        }\n\n        const id = this.getId(feature, sourceLayerName);\n\n        for (let l = 0; l < layerIDs.length; l++) {\n            const layerID = layerIDs[l];\n\n            if (filterLayerIDs && filterLayerIDs.indexOf(layerID) < 0) {\n                continue;\n            }\n\n            const styleLayer = styleLayers[layerID];\n\n            if (!styleLayer) continue;\n\n            let featureState = {};\n            if (id !== undefined && sourceFeatureState) {\n                // `feature-state` expression evaluation requires feature state to be available\n                featureState = sourceFeatureState.getState(styleLayer.sourceLayer || '_geojsonTileLayer', id);\n            }\n\n            const intersectionZ = !intersectionTest || intersectionTest(feature, styleLayer, featureState, layoutVertexArrayOffset);\n            if (!intersectionZ) {\n                // Only applied for non-symbol features\n                continue;\n            }\n\n            const geojsonFeature = new GeoJSONFeature(feature, this.z, this.x, this.y, id);\n\n            const serializedLayer = extend({}, serializedLayers[layerID]);\n\n            serializedLayer.paint = evaluateProperties(serializedLayer.paint, styleLayer.paint, feature, featureState, availableImages);\n            serializedLayer.layout = evaluateProperties(serializedLayer.layout, styleLayer.layout, feature, featureState, availableImages);\n\n            geojsonFeature.layer = serializedLayer;\n            this.appendToResult(result, layerID, featureIndex, geojsonFeature, intersectionZ);\n        }\n    }\n\n    appendToResult(result: QueryResult, layerID: string, featureIndex: number, geojsonFeature: QueryFeature, intersectionZ: boolean | number) {\n        let layerResult = result[layerID];\n        if (layerResult === undefined) {\n            layerResult = result[layerID] = [];\n        }\n\n        layerResult.push({featureIndex, feature: geojsonFeature, intersectionZ});\n    }\n\n    // Given a set of symbol indexes that have already been looked up,\n    // return a matching set of GeoJSONFeatures\n    lookupSymbolFeatures(symbolFeatureIndexes: Array<number>,\n                         serializedLayers: {[string]: StyleLayer},\n                         bucketIndex: number,\n                         sourceLayerIndex: number,\n                         filterSpec: FilterSpecification,\n                         filterLayerIDs: Array<string>,\n                         availableImages: Array<string>,\n                         styleLayers: {[_: string]: StyleLayer}): QueryResult {\n        const result = {};\n        this.loadVTLayers();\n\n        const filter = featureFilter(filterSpec);\n\n        for (const symbolFeatureIndex of symbolFeatureIndexes) {\n            this.loadMatchingFeature(\n                result, {\n                    bucketIndex,\n                    sourceLayerIndex,\n                    featureIndex: symbolFeatureIndex,\n                    layoutVertexArrayOffset: 0\n                },\n                filter,\n                filterLayerIDs,\n                availableImages,\n                styleLayers,\n                serializedLayers\n            );\n\n        }\n        return result;\n    }\n\n    loadFeature(featureIndexData: FeatureIndices): IVectorTileFeature {\n        const {featureIndex, sourceLayerIndex} = featureIndexData;\n\n        this.loadVTLayers();\n        const sourceLayerName = this.sourceLayerCoder.decode(sourceLayerIndex);\n\n        const featureCache = this.vtFeatures[sourceLayerName];\n        if (featureCache[featureIndex]) {\n            return featureCache[featureIndex];\n        }\n        const sourceLayer = this.vtLayers[sourceLayerName];\n        const feature = sourceLayer.feature(featureIndex);\n        featureCache[featureIndex] = feature;\n\n        return feature;\n    }\n\n    hasLayer(id: string): boolean {\n        for (const layerIDs of this.bucketLayerIDs) {\n            for (const layerID of layerIDs) {\n                if (id === layerID) return true;\n            }\n        }\n\n        return false;\n    }\n\n    getId(feature: IVectorTileFeature, sourceLayerId: string): string | number | void {\n        let id = feature.id;\n        if (this.promoteId) {\n            const propName = typeof this.promoteId === 'string' ? this.promoteId : this.promoteId[sourceLayerId];\n            // $FlowFixMe[incompatible-type] - Flow can't narrow the id type from IVectorTileFeature.id\n            if (propName != null) id = feature.properties[propName];\n            if (typeof id === 'boolean') id = Number(id);\n        }\n        return id;\n    }\n}\n\nregister(FeatureIndex, 'FeatureIndex', {omit: ['rawTileData', 'sourceLayerCoder']});\n\nexport default FeatureIndex;\n\nfunction evaluateProperties(serializedProperties: mixed, styleLayerProperties: mixed, feature: IVectorTileFeature, featureState: FeatureStates, availableImages: Array<string>) {\n    return mapObject(serializedProperties, (property, key) => {\n        const prop = styleLayerProperties instanceof PossiblyEvaluated ? styleLayerProperties.get(key) : null;\n        return prop && prop.evaluate ? prop.evaluate(feature, featureState, availableImages) : prop;\n    });\n}\n\nfunction topDownFeatureComparator(a: number, b: number) {\n    return b - a;\n}\n","// @flow\n\nimport assert from 'assert';\nimport Point from '@mapbox/point-geometry';\nimport browser from '../../../src/util/browser.js';\nimport {register} from '../../../src/util/web_worker_transfer.js';\nimport {uploadNode, destroyNodeArrays, destroyBuffers, ModelTraits, HEIGHTMAP_DIM} from '../model.js';\nimport {OverscaledTileID} from '../../../src/source/tile_id.js';\nimport {FeatureVertexArray} from '../../../src/data/array_types.js';\nimport {number as interpolate} from '../../../src/style-spec/util/interpolate.js';\nimport {clamp} from '../../../src/util/util.js';\nimport {DEMSampler} from '../../../src/terrain/elevation.js';\nimport {ZoomConstantExpression} from '../../../src/style-spec/expression/index.js';\nimport {Aabb} from '../../../src/util/primitives.js';\nimport {vec3} from 'gl-matrix';\n\nimport type ModelStyleLayer from '../../style/style_layer/model_style_layer.js';\nimport type {ReplacementSource} from '../../source/replacement_source.js';\nimport type {Bucket} from '../../../src/data/bucket.js';\nimport type {Node} from '../model.js';\nimport type {EvaluationFeature} from '../../../src/data/evaluation_feature.js';\nimport type {CanonicalTileID} from '../../../src/source/tile_id.js';\nimport type Context from '../../../src/gl/context.js';\nimport type {ProjectionSpecification} from '../../../src/style-spec/types.js';\nimport type Painter from '../../../src/render/painter.js';\nimport type {Vec4} from 'gl-matrix';\nimport type {Terrain} from '../../../src/terrain/terrain.js';\nimport FeatureIndex from '../../../src/data/feature_index.js';\nimport type {GridIndex} from '../../../src/types/grid-index.js';\n\nconst lookup = new Float32Array(512 * 512);\nconst passLookup = new Uint8Array(512 * 512);\n\nfunction getNodeHeight(node: Node): number {\n    let height = 0;\n    if (node.meshes) {\n        for (const mesh of node.meshes) {\n            height = Math.max(height, mesh.aabb.max[2]);\n        }\n    }\n    if (node.children) {\n        for (const child of node.children) {\n            height = Math.max(height, getNodeHeight(child));\n        }\n    }\n    return height;\n}\n\nfunction addAABBsToGridIndex(node: Node, key: number, grid: GridIndex) {\n    if (node.meshes) {\n        for (const mesh of node.meshes) {\n            if (mesh.aabb.min[0] === Infinity) continue;\n            grid.insert(key, mesh.aabb.min[0], mesh.aabb.min[1], mesh.aabb.max[0], mesh.aabb.max[1]);\n        }\n    }\n    if (node.children) {\n        for (const child of node.children) {\n            addAABBsToGridIndex(child, key, grid);\n        }\n    }\n}\n\nexport const PartIndices = {\n    wall: 1,\n    door: 2,\n    roof: 3,\n    window: 4,\n    lamp: 5,\n    logo: 6\n};\n\nexport const PartNames = ['', 'wall', 'door', 'roof', 'window', 'lamp', 'logo'];\n\nexport class Tiled3dModelFeature {\n    feature: EvaluationFeature;\n    evaluatedColor: Array<Vec4>;\n    evaluatedRMEA: Array<Vec4>;\n    evaluatedScale: [number, number, number];\n    hiddenByReplacement: boolean;\n    hasTranslucentParts: boolean;\n    node: Node;\n    aabb: Aabb;\n    emissionHeightBasedParams: Array<[number, number, number, number, number]>;\n    constructor(node: Node) {\n        this.node = node;\n        this.evaluatedRMEA = [[1, 0, 0, 1],\n            [1, 0, 0, 1],   // wall\n            [1, 0, 0, 1],   // door\n            [1, 0, 0, 1],   // roof\n            [0.4, 1, 0, 1], // window\n            [1, 0, 0, 1],   // lamp\n            [1, 0, 0, 1]];  // logo\n        this.hiddenByReplacement = false;\n        this.evaluatedScale = [1, 1, 1];\n        this.evaluatedColor = [];\n        this.emissionHeightBasedParams = [];\n        // Needs to calculate geometry\n        this.feature = {type: 'Point', id: node.id, geometry: [], properties: {'height' : getNodeHeight(node)}};\n    }\n    getLocalBounds(): Aabb {\n        if (!this.node.meshes) {\n            return new Aabb([Infinity, Infinity, Infinity], [-Infinity, -Infinity, -Infinity]);\n        }\n        if (!this.aabb) {\n            let i = 0;\n            const aabb = new Aabb([Infinity, Infinity, Infinity], [-Infinity, -Infinity, -Infinity]);\n            for (const mesh of this.node.meshes) {\n                if (this.node.lightMeshIndex !== i) {\n                    aabb.encapsulate(mesh.aabb);\n                }\n                i++;\n            }\n            this.aabb = Aabb.applyTransform(aabb, this.node.matrix);\n        }\n        return this.aabb;\n    }\n}\n\nclass Tiled3dModelBucket implements Bucket {\n    id: OverscaledTileID;\n    uploaded: boolean;\n    modelTraits: number;\n    hasPattern: boolean;\n    layers: Array<ModelStyleLayer>;\n    layerIds: Array<string>;\n    stateDependentLayers: Array<ModelStyleLayer>;\n    stateDependentLayerIds: Array<string>;\n    nodesInfo: Array<Tiled3dModelFeature>;\n    zoom: number;\n    projection: ProjectionSpecification;\n    terrainTile: ?CanonicalTileID;\n    terrainExaggeration: ?number;\n    replacementUpdateTime: number;\n    elevationReadFromZ: number;\n    dirty: boolean;\n    brightness: ?number;\n    needsUpload: boolean;\n    /* $FlowIgnore[incompatible-type-arg] Doesn't need to know about all the implementations */\n    constructor(nodes: Array<Node>, id: OverscaledTileID, hasMbxMeshFeatures: boolean, hasMeshoptCompression: boolean, brightness: ?number, featureIndex: FeatureIndex) {\n        this.id = id;\n        this.modelTraits |= ModelTraits.CoordinateSpaceTile;\n        this.uploaded = false;\n        this.hasPattern = false;\n        if (hasMbxMeshFeatures) {\n            this.modelTraits |= ModelTraits.HasMapboxMeshFeatures;\n        }\n        if (hasMeshoptCompression) {\n            this.modelTraits |= ModelTraits.HasMeshoptCompression;\n        }\n        this.zoom = -1;\n        this.terrainExaggeration = 1;\n        this.projection = {name: 'mercator'};\n        this.replacementUpdateTime = 0;\n        this.elevationReadFromZ = 0xff; // Re-read if underlying DEM zoom changes.\n        this.brightness = brightness;\n        this.dirty = true;\n        this.needsUpload = false;\n\n        this.nodesInfo = [];\n        for (const node of nodes) {\n            this.nodesInfo.push(new Tiled3dModelFeature(node));\n            addAABBsToGridIndex(node, featureIndex.featureIndexArray.length, featureIndex.grid);\n            featureIndex.featureIndexArray.emplaceBack(this.nodesInfo.length - 1, 0 /*sourceLayerIndex*/, featureIndex.bucketLayerIDs.length - 1, 0);\n        }\n    }\n\n    update() {\n        console.log(\"Update 3D model bucket\");\n    }\n    populate() {\n        console.log(\"populate 3D model bucket\");\n    }\n    uploadPending(): boolean {\n        return !this.uploaded || this.needsUpload;\n    }\n\n    upload(context: Context) {\n        if (!this.needsUpload) return;\n        const nodesInfo = this.getNodesInfo();\n        for (const nodeInfo of nodesInfo) {\n            const node = nodeInfo.node;\n            if (this.uploaded) {\n                this.updatePbrBuffer(node);\n                continue;\n            }\n            uploadNode(node, context, true);\n        }\n        // Now destroy all buffers\n        for (const nodeInfo of nodesInfo) {\n            destroyNodeArrays(nodeInfo.node);\n        }\n        this.uploaded = true;\n        this.needsUpload = false;\n    }\n\n    updatePbrBuffer(node: Node): boolean {\n        let result = false;\n        if (!node.meshes) return result;\n        for (const mesh of node.meshes) {\n            if (mesh.pbrBuffer) {\n                mesh.pbrBuffer.updateData(mesh.featureArray);\n                result = true;\n            }\n        }\n        return result;\n    }\n\n    needsReEvaluation(painter: Painter, zoom: number, layer: ModelStyleLayer): boolean {\n        const projection = painter.transform.projectionOptions;\n        const calculatedBrightness = painter.style.getBrightness();\n        const brightnessChanged = this.brightness !== calculatedBrightness;\n        if (!this.uploaded || this.dirty || projection.name !== this.projection.name ||\n            expressionRequiresReevaluation(layer.paint.get('model-color').value, brightnessChanged) ||\n            expressionRequiresReevaluation(layer.paint.get('model-color-mix-intensity').value, brightnessChanged) ||\n            expressionRequiresReevaluation(layer.paint.get('model-roughness').value, brightnessChanged) ||\n            expressionRequiresReevaluation(layer.paint.get('model-emissive-strength').value, brightnessChanged) ||\n            expressionRequiresReevaluation(layer.paint.get('model-height-based-emissive-strength-multiplier').value, brightnessChanged)) {\n            this.projection = projection;\n            this.brightness = calculatedBrightness;\n            return true;\n        }\n        return false;\n    }\n\n    evaluateScale(painter: Painter, layer: ModelStyleLayer) {\n        if (painter.transform.zoom === this.zoom) return;\n        this.zoom = painter.transform.zoom;\n        const nodesInfo = this.getNodesInfo();\n        const canonical = this.id.canonical;\n        for (const nodeInfo of nodesInfo) {\n            const evaluationFeature = nodeInfo.feature;\n            nodeInfo.evaluatedScale = layer.paint.get('model-scale').evaluate(evaluationFeature, {}, canonical);\n        }\n    }\n\n    evaluate(layer: ModelStyleLayer) {\n        const nodesInfo = this.getNodesInfo();\n        for (const nodeInfo of nodesInfo) {\n            if (!nodeInfo.node.meshes) continue;\n            const evaluationFeature = nodeInfo.feature;\n            const hasFeatures = nodeInfo.node.meshes && nodeInfo.node.meshes[0].featureData;\n            const previousDoorColor = nodeInfo.evaluatedColor[PartIndices.door];\n            const previousDoorRMEA = nodeInfo.evaluatedRMEA[PartIndices.door];\n            const canonical = this.id.canonical;\n            nodeInfo.hasTranslucentParts = false;\n\n            if (hasFeatures) {\n                for (let i = 0; i < PartNames.length; i++) {\n                    const part = PartNames[i];\n                    if (part.length) {\n                        evaluationFeature.properties['part'] = part;\n                    }\n                    const color = layer.paint.get('model-color').evaluate(evaluationFeature, {}, canonical);\n                    const colorMixIntensity = layer.paint.get('model-color-mix-intensity').evaluate(evaluationFeature, {}, canonical);\n                    nodeInfo.evaluatedColor[i] = [color.r, color.g, color.b, colorMixIntensity];\n                    nodeInfo.evaluatedRMEA[i][0] = layer.paint.get('model-roughness').evaluate(evaluationFeature, {}, canonical);\n                    // For the first version metallic is not styled\n                    nodeInfo.evaluatedRMEA[i][2] = layer.paint.get('model-emissive-strength').evaluate(evaluationFeature, {}, canonical);\n                    nodeInfo.evaluatedRMEA[i][3] = color.a;\n                    nodeInfo.emissionHeightBasedParams[i] = layer.paint.get('model-height-based-emissive-strength-multiplier').evaluate(evaluationFeature, {}, canonical);\n\n                    if (!nodeInfo.hasTranslucentParts && color.a < 1.0) {\n                        nodeInfo.hasTranslucentParts = true;\n                    }\n                }\n                delete evaluationFeature.properties['part'];\n                const doorLightChanged = previousDoorColor !== nodeInfo.evaluatedColor[PartIndices.door] ||\n                                         previousDoorRMEA !== nodeInfo.evaluatedRMEA[PartIndices.door];\n                updateNodeFeatureVertices(nodeInfo, doorLightChanged, this.modelTraits);\n            } else {\n                nodeInfo.evaluatedRMEA[0][2] = layer.paint.get('model-emissive-strength').evaluate(evaluationFeature, {}, canonical);\n            }\n            nodeInfo.evaluatedScale = layer.paint.get('model-scale').evaluate(evaluationFeature, {}, canonical);\n            if (!this.updatePbrBuffer(nodeInfo.node)) {\n                this.needsUpload = true;\n            }\n        }\n        this.dirty = false;\n    }\n\n    elevationUpdate(terrain: Terrain, exaggeration: number, coord: OverscaledTileID, source: string) {\n        assert(terrain);\n        const demTile = terrain.findDEMTileFor(coord);\n        if (!demTile) return;\n        if (demTile.tileID.canonical === this.terrainTile && exaggeration === this.terrainExaggeration) return;\n\n        if (demTile.dem && demTile.tileID.overscaledZ !== this.elevationReadFromZ) {\n            this.elevationReadFromZ = demTile.tileID.overscaledZ;\n            const dem = DEMSampler.create(terrain, coord, demTile);\n            if (!dem) return;\n            if (this.modelTraits & ModelTraits.HasMapboxMeshFeatures) {\n                this.updateDEM(terrain, dem, coord, source);\n            }\n            for (const nodeInfo of this.getNodesInfo()) {\n                const node = nodeInfo.node;\n                if (!node.footprint || !node.footprint.vertices || !node.footprint.vertices.length) {\n                    continue;\n                }\n                const vertices = node.footprint.vertices;\n                let elevation = dem.getElevationAt(vertices[0].x, vertices[0].y, true, true);\n                for (let i = 1; i < vertices.length; i++) {\n                    elevation = Math.min(elevation, dem.getElevationAt(vertices[i].x, vertices[i].y, true, true));\n                }\n                node.elevation = elevation;\n            }\n        }\n        this.terrainTile = demTile.tileID.canonical;\n        this.terrainExaggeration = exaggeration;\n    }\n\n    updateDEM(terrain: Terrain, dem: DEMSampler, coord: OverscaledTileID, source: string) {\n        let tiles = dem._dem._modifiedForSources[source];\n        if (tiles === undefined) {\n            dem._dem._modifiedForSources[source] = [];\n            tiles = dem._dem._modifiedForSources[source];\n        }\n        if (tiles.includes(coord.canonical)) {\n            return;\n        }\n\n        // Resolution of the DEM data.\n        const demRes = dem._dem.dim;\n\n        tiles.push(coord.canonical);\n        assert(lookup.length <= demRes * demRes);\n\n        let changed = false;\n        for (const nodeInfo of this.getNodesInfo()) {\n            const node = nodeInfo.node;\n            if (!node.footprint || !node.footprint.grid) {\n                continue;\n            }\n\n            // Convert the bounds of the footprint for this node from its tile coordinates to DEM pixel coordinates.\n            const grid = node.footprint.grid;\n            const minDem = dem.tileCoordToPixel(grid.min.x, grid.min.y);\n            const maxDem = dem.tileCoordToPixel(grid.max.x, grid.max.y);\n\n            const distanceToBorder = Math.min(Math.min(demRes - maxDem.y, minDem.x), Math.min(minDem.y, demRes - maxDem.x));\n            if (distanceToBorder < 0) {\n                continue; // don't deal with neighbors and landmarks crossing tile borders, fix terrain only for buildings within the tile\n            }\n            // demAtt is a number of pixels we use to propagate attenuated change to surrounding pixels.\n            // this is clamped further when sampling near tile border.\n            // The footprint covers a certain region of DEM pixels as indicated with 'minDem' and 'maxDem' (region A).\n            // This region is further padded by demAtt pixels to form the region B.\n            // First mark all the DEM pixels in region B as unchanged (using 'passLookup' array).\n            // +------------+\n            // |  +-----+   |\n            // |  |  A  |   |\n            // |  +-----+ B |\n            // +------------+\n            const demAtt = clamp(distanceToBorder, 2, 5);\n            let minx = Math.max(0, minDem.x - demAtt);\n            let miny = Math.max(0, minDem.y - demAtt);\n            let maxx = Math.min(maxDem.x + demAtt, demRes - 1);\n            let maxy = Math.min(maxDem.y + demAtt, demRes - 1);\n            for (let y = miny; y <= maxy; ++y) {\n                for (let x = minx; x <= maxx; ++x) {\n                    passLookup[y * demRes + x] = 255;\n                }\n            }\n\n            // Next go through all eligible DEM pixels in region A, mark them as changed and calculate the average height(elevation).\n            // Some pixels may be skipped (and therefore aren't eligible) because no footprint geometry overlaps them.\n            // This is indicated by the existence of a 'Cell' at a given pixel's position.\n            let heightAcc = 0;\n            let count = 0;\n            for (let celly = 0; celly < grid.cellsY; ++celly) {\n                for (let cellx = 0; cellx < grid.cellsX; ++cellx) {\n                    const cell = grid.cells[celly * grid.cellsX + cellx];\n                    if (!cell) {\n                        continue;\n                    }\n                    const demP = dem.tileCoordToPixel(grid.min.x + cellx / grid.xScale, grid.min.y + celly / grid.yScale);\n                    const demPMax = dem.tileCoordToPixel(grid.min.x + (cellx + 1) / grid.xScale, grid.min.y + (celly + 1) / grid.yScale);\n                    for (let y = demP.y; y <= Math.min(demPMax.y + 1, demRes - 1); ++y) {\n                        for (let x = demP.x; x <= Math.min(demPMax.x + 1, demRes - 1); ++x) {\n                            if (passLookup[y * demRes + x] === 255) {\n                                passLookup[y * demRes + x] = 0;\n                                const height = dem.getElevationAtPixel(x, y);\n                                heightAcc += height;\n                                count++;\n                            }\n                        }\n                    }\n                }\n            }\n\n            assert(count);\n            const avgHeight = heightAcc / count;\n            // See https://github.com/mapbox/mapbox-gl-js-internal/pull/804#issuecomment-1738720351\n            // for explanation why bounds should be clamped to 1 and demRes - 2 respectively.\n            minx = Math.max(1, minDem.x - demAtt);\n            miny = Math.max(1, minDem.y - demAtt);\n            maxx = Math.min(maxDem.x + demAtt, demRes - 2);\n            maxy = Math.min(maxDem.y + demAtt, demRes - 2);\n\n            // Next, update the DEM pixels in region A (which the footprint overlaps with) by the average height.\n            // This effectively flattens the terrain for the given footprint/building.\n            // Store the difference of the original height with the average height in 'lookup' array.\n            changed = true;\n            for (let y = miny; y <= maxy; ++y) {\n                for (let x = minx; x <= maxx; ++x) {\n                    if (passLookup[y * demRes + x] === 0) {\n                        lookup[y * demRes + x] = dem._dem.set(x, y, avgHeight);\n                    }\n                }\n            }\n\n            // Finally propagate the flattened out values to the remaining surrounding pixels (as goverened by demAtt padding) in region B.\n            // This ensures a smooth transition between the flattened and the non-flattened regions.\n            for (let p = 1; p < demAtt; ++p) {\n                minx = Math.max(1, minDem.x - p);\n                miny = Math.max(1, minDem.y - p);\n                maxx = Math.min(maxDem.x + p, demRes - 2);\n                maxy = Math.min(maxDem.y + p, demRes - 2);\n                for (let y = miny; y <= maxy; ++y) {\n                    for (let x = minx; x <= maxx; ++x) {\n                        const indexThis = y * demRes + x;\n                        // If DEM pixel is not modified.\n                        if (passLookup[indexThis] === 255) {\n                            let maxDiff = 0;\n                            let maxDiffAbs = 0;\n                            let xoffset = -1;\n                            let yoffset = -1;\n                            for (let j = -1; j <= 1; ++j) {\n                                for (let i = -1; i <= 1; ++i) {\n                                    const index = (y + j) * demRes + x + i;\n                                    if (passLookup[index] >= p) {\n                                        continue;\n                                    }\n                                    const diff = lookup[index];\n                                    const diffAbs = Math.abs(diff);\n                                    if (diffAbs  > maxDiffAbs) {\n                                        maxDiff = diff;\n                                        maxDiffAbs = diffAbs;\n                                        xoffset = i;\n                                        yoffset = j;\n                                    }\n                                }\n                            }\n\n                            if (maxDiffAbs > 0.1) {\n                                const diagonalAttenuation = Math.abs(xoffset * yoffset) * 0.5;\n                                const attenuation = 1 - (p + diagonalAttenuation) / demAtt;\n                                assert(attenuation > 0);\n                                const prev = dem._dem.get(x, y);\n                                let next = prev + maxDiff * attenuation;\n\n                                // parent - child in the meaning of wave propagation\n                                const parent = dem._dem.get(x + xoffset, y + yoffset);\n                                const child = dem._dem.get(x - xoffset, y - yoffset, true);\n                                // prevent waves\n                                if ((next - parent) * (next - child) > 0) {\n                                    next = (parent + child) / 2;\n                                }\n                                lookup[indexThis] = dem._dem.set(x, y, next);\n                                passLookup[indexThis] = p;\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        if (changed) {\n            dem._demTile.needsDEMTextureUpload = true;\n            dem._dem._timestamp = browser.now();\n        }\n    }\n\n    getNodesInfo(): Array<Tiled3dModelFeature> {\n        return this.nodesInfo;\n    }\n\n    destroy() {\n        const nodesInfo = this.getNodesInfo();\n        for (const nodeInfo of nodesInfo) {\n            destroyNodeArrays(nodeInfo.node);\n            destroyBuffers(nodeInfo.node);\n        }\n    }\n\n    isEmpty(): boolean {\n        return !this.nodesInfo.length;\n    }\n\n    updateReplacement(coord: OverscaledTileID, source: ReplacementSource) {\n        // Replacement has to be re-checked if the source has been updated since last time\n        if (source.updateTime === this.replacementUpdateTime) {\n            return;\n        }\n\n        this.replacementUpdateTime = source.updateTime;\n        const activeReplacements = source.getReplacementRegionsForTile(coord.toUnwrapped());\n        const nodesInfo = this.getNodesInfo();\n\n        for (let i = 0; i < this.nodesInfo.length; i++) {\n            const node = nodesInfo[i].node;\n\n            // Node is visible if its footprint passes the replacement check\n            nodesInfo[i].hiddenByReplacement = !!node.footprint && !activeReplacements.find(region => region.footprint === node.footprint);\n        }\n    }\n\n    getHeightAtTileCoord(x: number, y: number): ?{height: ?number, maxHeight: number, hidden: boolean, verticalScale: number} {\n        const nodesInfo = this.getNodesInfo();\n        const candidates = [];\n\n        const tmpVertex = [0, 0, 0];\n\n        for (let i = 0; i < this.nodesInfo.length; i++) {\n            const nodeInfo = nodesInfo[i];\n            assert(nodeInfo.node.meshes.length > 0);\n            const mesh = nodeInfo.node.meshes[0];\n            const meshAabb = Aabb.applyTransform(mesh.aabb, nodeInfo.node.matrix);\n            if (x < meshAabb.min[0] || y < meshAabb.min[1] || x > meshAabb.max[0] || y > meshAabb.max[1]) continue;\n\n            assert(mesh.heightmap);\n            const xCell = ((x - mesh.aabb.min[0]) / (mesh.aabb.max[0] - mesh.aabb.min[0]) * HEIGHTMAP_DIM) | 0;\n            const yCell = ((y - mesh.aabb.min[1]) / (mesh.aabb.max[1] - mesh.aabb.min[1]) * HEIGHTMAP_DIM) | 0;\n            const heightmapIndex = Math.min(HEIGHTMAP_DIM - 1, yCell) * HEIGHTMAP_DIM + Math.min(HEIGHTMAP_DIM - 1, xCell);\n\n            tmpVertex[2] = mesh.heightmap[heightmapIndex];\n            vec3.transformMat4(tmpVertex, tmpVertex, nodeInfo.node.matrix);\n            if (mesh.heightmap[heightmapIndex] < 0 && nodeInfo.node.footprint) {\n                // unpopulated cell. If it is in the building footprint, return undefined height\n                nodeInfo.node.footprint.grid.query(new Point(x, y), new Point(x, y), candidates);\n                if (candidates.length > 0) {\n                    return {height: undefined, maxHeight: nodeInfo.feature.properties[\"height\"], hidden: nodeInfo.hiddenByReplacement, verticalScale: nodeInfo.evaluatedScale[2]};\n                }\n                continue;\n            }\n            if (nodeInfo.hiddenByReplacement) return; // better luck with the next source\n            return {height: tmpVertex[2], maxHeight: nodeInfo.feature.properties[\"height\"], hidden: false, verticalScale: nodeInfo.evaluatedScale[2]};\n        }\n    }\n}\n\nfunction expressionRequiresReevaluation(e: any, brightnessChanged: boolean): boolean {\n    assert(e.kind === 'constant' || e instanceof ZoomConstantExpression);\n    return !e.isLightConstant && brightnessChanged;\n}\n\nfunction encodeEmissionToByte(emission: number) {\n    const clampedEmission = clamp(emission, 0, 2);\n    return Math.min(Math.round(0.5 * clampedEmission * 255), 255);\n}\n\nfunction addPBRVertex(vertexArray: FeatureVertexArray, color: number, colorMix: Vec4, rmea: Vec4, heightBasedEmissionMultiplierParams: [number, number, number, number, number], zMin: number, zMax: number, lightsFeatureArray: ?FeatureVertexArray) {\n    let r = ((color & 0xF000) | ((color & 0xF000) >> 4)) >> 8;\n    let g = ((color & 0x0F00) | ((color & 0x0F00) >> 4)) >> 4;\n    let b = (color & 0x00F0) | ((color & 0x00F0) >> 4);\n\n    if (colorMix[3] > 0) {\n        r = interpolate(r, 255 * colorMix[0], colorMix[3]);\n        g = interpolate(g, 255 * colorMix[1], colorMix[3]);\n        b = interpolate(b, 255 * colorMix[2], colorMix[3]);\n    }\n\n    const a0 = (r << 8) | g;\n    const a1 = (b << 8) | Math.floor(rmea[3] * 255);\n    const a2 = (encodeEmissionToByte(rmea[2]) << 8) | ((rmea[0] * 15) << 4) | (rmea[1] * 15);\n\n    const emissionMultiplierStart = clamp(heightBasedEmissionMultiplierParams[0], 0, 1);\n    const emissionMultiplierFinish = clamp(heightBasedEmissionMultiplierParams[1], 0, 1);\n    const emissionMultiplierValueStart = clamp(heightBasedEmissionMultiplierParams[2], 0, 1);\n    const emissionMultiplierValueFinish = clamp(heightBasedEmissionMultiplierParams[3], 0, 1);\n\n    let a3, b0, b1, b2;\n\n    if (emissionMultiplierStart !== emissionMultiplierFinish && zMax !== zMin &&\n        emissionMultiplierFinish !== emissionMultiplierStart) {\n        const zRange = zMax - zMin;\n        b0 = 1.0 / (zRange * (emissionMultiplierFinish - emissionMultiplierStart));\n        b1 = -(zMin + zRange * emissionMultiplierStart) /\n                       (zRange * (emissionMultiplierFinish - emissionMultiplierStart));\n        const power = clamp(heightBasedEmissionMultiplierParams[4], -1, 1);\n        b2 = Math.pow(10, power);\n        a3 = (emissionMultiplierValueStart * 255.0 << 8) | (emissionMultiplierValueFinish * 255.0);\n    } else {\n        a3 = (255 << 8) | 255;\n        b0 = 0;\n        b1 = 1;\n        b2 = 1;\n    }\n\n    vertexArray.emplaceBack(a0, a1, a2, a3, b0, b1, b2);\n    if (lightsFeatureArray) {\n        const size = lightsFeatureArray.length;\n        lightsFeatureArray.clear();\n        for (let j = 0; j < size; j++) {\n            lightsFeatureArray.emplaceBack(a0, a1, a2, a3, b0, b1, b2);\n        }\n    }\n}\n\nfunction updateNodeFeatureVertices(nodeInfo: Tiled3dModelFeature, doorLightChanged: boolean, modelTraits: number) {\n    const node = nodeInfo.node;\n    let i = 0;\n    const isV2Tile = modelTraits & ModelTraits.HasMeshoptCompression;\n    for (const mesh of node.meshes) {\n        if (node.lights && node.lightMeshIndex === i) continue;\n        if (!mesh.featureData) continue;\n        // initialize featureArray\n        mesh.featureArray = new FeatureVertexArray();\n        mesh.featureArray.reserve(mesh.featureData.length);\n        let pendingDoorLightUpdate = doorLightChanged;\n        for (const feature of mesh.featureData) {\n            // V1 and V2 tiles have a different bit structure\n            // In V2, meshopt compression forces to use values less than 2^24 to not lose any information\n            // That's why colors are in the least significant bits and use the following LSB to encode\n            // part ids.\n            const featureColor = isV2Tile ? feature & 0xffff : (feature >> 16) & 0xffff;\n            const id = isV2Tile ? (feature >> 16) & 0xffff : feature & 0xffff;\n            const partId = (id & 0xf) < 8 ? (id & 0xf) : 0;\n\n            const rmea = nodeInfo.evaluatedRMEA[partId];\n            const evaluatedColor = nodeInfo.evaluatedColor[partId];\n            const emissionParams = nodeInfo.emissionHeightBasedParams[partId];\n\n            let lightsFeatureArray;\n            if (pendingDoorLightUpdate && partId === PartIndices.door && node.lights) {\n                lightsFeatureArray = new FeatureVertexArray();\n                lightsFeatureArray.resize(node.lights.length * 10);\n            }\n            addPBRVertex(mesh.featureArray, featureColor, evaluatedColor, rmea, emissionParams, mesh.aabb.min[2], mesh.aabb.max[2], lightsFeatureArray);\n            if (lightsFeatureArray && pendingDoorLightUpdate) {\n                pendingDoorLightUpdate = false;\n                const lightsMesh = node.meshes[node.lightMeshIndex];\n                lightsMesh.featureArray = lightsFeatureArray;\n                lightsMesh.featureArray._trim();\n            }\n        }\n        mesh.featureArray._trim();\n        i++;\n    }\n\n}\n\nregister(Tiled3dModelBucket, 'Tiled3dModelBucket', {omit: ['layers']});\nregister(Tiled3dModelFeature, 'Tiled3dModelFeature');\n\nexport default Tiled3dModelBucket;\n","// @flow\n\nimport StyleLayer from '../../../src/style/style_layer.js';\nimport ModelBucket from '../../data/bucket/model_bucket.js';\nimport properties from './model_style_layer_properties.js';\nimport {Transitionable, Transitioning, PossiblyEvaluated, PropertyValue} from '../../../src/style/properties.js';\nimport Point from '@mapbox/point-geometry';\nimport {ZoomDependentExpression} from '../../../src/style-spec/expression/index.js';\nimport {mat4} from 'gl-matrix';\n\nimport type {LayerSpecification} from '../../../src/style-spec/types.js';\nimport type {PaintProps, LayoutProps} from './model_style_layer_properties.js';\nimport type {BucketParameters, Bucket} from '../../../src/data/bucket.js';\nimport type {ConfigOptions} from '../../../src/style/properties.js';\nimport type {TilespaceQueryGeometry} from '../../../src/style/query_geometry.js';\nimport type {FeatureState} from '../../../src/style-spec/expression/index.js';\nimport type Transform from '../../../src/geo/transform.js';\nimport ModelManager from '../../render/model_manager.js';\nimport {calculateModelMatrix} from '../../data/model.js';\nimport type {Node} from '../../data/model.js';\nimport LngLat from '../../../src/geo/lng_lat.js';\nimport type {Mat4} from 'gl-matrix';\n\nimport {latFromMercatorY, lngFromMercatorX} from '../../../src/geo/mercator_coordinate.js';\nimport EXTENT from '../../../src/style-spec/data/extent.js';\nimport {convertModelMatrixForGlobe, queryGeometryIntersectsProjectedAabb} from '../../util/model_util.js';\nimport type {IVectorTileFeature} from '@mapbox/vector-tile';\nimport Tiled3dModelBucket from '../../data/bucket/tiled_3d_model_bucket.js';\nimport type {FeatureFilter} from '../../../src/style-spec/feature_filter/index.js';\nimport type {QueryFeature} from '../../../src/util/vectortile_to_geojson.js';\nimport {CanonicalTileID} from '../../../src/source/tile_id.js';\nimport EvaluationParameters from '../../../src/style/evaluation_parameters.js';\n\nclass ModelStyleLayer extends StyleLayer {\n    _transitionablePaint: Transitionable<PaintProps>;\n    _transitioningPaint: Transitioning<PaintProps>;\n    paint: PossiblyEvaluated<PaintProps>;\n    layout: PossiblyEvaluated<LayoutProps>;\n    modelManager: ModelManager;\n\n    constructor(layer: LayerSpecification, scope: string, options?: ?ConfigOptions) {\n        super(layer, properties, scope, options);\n        this._stats = {numRenderedVerticesInShadowPass : 0, numRenderedVerticesInTransparentPass: 0};\n    }\n\n    createBucket(parameters: BucketParameters<ModelStyleLayer>): ModelBucket {\n        return new ModelBucket(parameters);\n    }\n\n    getProgramIds(): Array<string> {\n        return ['model'];\n    }\n\n    is3D(): boolean {\n        return true;\n    }\n\n    hasShadowPass(): boolean {\n        return true;\n    }\n\n    canCastShadows(): boolean {\n        return true;\n    }\n\n    hasLightBeamPass(): boolean {\n        return true;\n    }\n\n    cutoffRange(): number {\n        return this.paint.get('model-cutoff-fade-range');\n    }\n\n    // $FlowFixMe[method-unbinding]\n    queryRadius(bucket: Bucket): number {\n        return (bucket instanceof Tiled3dModelBucket) ? EXTENT - 1 : 0;\n    }\n\n    // $FlowFixMe[method-unbinding]\n    queryIntersectsFeature(queryGeometry: TilespaceQueryGeometry,\n        feature: IVectorTileFeature,\n        featureState: FeatureState,\n        geometry: Array<Array<Point>>,\n        zoom: number,\n        transform: Transform): number | boolean {\n        if (!this.modelManager) return false;\n        const modelManager = this.modelManager;\n        const b = queryGeometry.tile.getBucket(this);\n        if (!b || !(b instanceof ModelBucket)) return false;\n        const bucket: ModelBucket = (b: any);\n\n        for (const modelId in bucket.instancesPerModel) {\n            const instances = bucket.instancesPerModel[modelId];\n            const featureId = feature.id !== undefined ? feature.id :\n                (feature.properties && feature.properties.hasOwnProperty(\"id\")) ? feature.properties[\"id\"] : undefined;\n            if (instances.idToFeaturesIndex.hasOwnProperty(featureId)) {\n                const modelFeature = instances.features[instances.idToFeaturesIndex[featureId]];\n                const model = modelManager.getModel(modelId, this.scope);\n                if (!model) return false;\n\n                let matrix: Mat4 = mat4.create();\n                const position = new LngLat(0, 0);\n                const id = bucket.canonical;\n                let minDepth = Number.MAX_VALUE;\n                for (let i = 0; i < modelFeature.instancedDataCount; ++i) {\n                    const instanceOffset = modelFeature.instancedDataOffset + i;\n                    const offset = instanceOffset * 16;\n\n                    const va = instances.instancedDataArray.float32;\n                    const translation = [va[offset + 4], va[offset + 5], va[offset + 6]];\n                    const pointX = va[offset];\n                    const pointY = va[offset + 1] | 0; // point.y stored in integer part\n\n                    tileToLngLat(id, position, pointX, pointY);\n\n                    calculateModelMatrix(matrix,\n                                         model,\n                                         transform,\n                                         position,\n                                         modelFeature.rotation,\n                                         modelFeature.scale,\n                                         translation,\n                                         false,\n                                         false,\n                                         false);\n                    if (transform.projection.name === 'globe') {\n                        matrix = convertModelMatrixForGlobe(matrix, transform);\n                    }\n                    const worldViewProjection = mat4.multiply([], transform.projMatrix, matrix);\n                    // Collision checks are performed in screen space. Corners are in ndc space.\n                    const screenQuery = queryGeometry.queryGeometry;\n                    const projectedQueryGeometry = screenQuery.isPointQuery() ? screenQuery.screenBounds : screenQuery.screenGeometry;\n                    const depth = queryGeometryIntersectsProjectedAabb(projectedQueryGeometry, transform, worldViewProjection, model.aabb);\n                    if (depth != null) {\n                        minDepth = Math.min(depth, minDepth);\n                    }\n                }\n                if (minDepth !== Number.MAX_VALUE) {\n                    return minDepth;\n                }\n                return false;\n            }\n        }\n        return false;\n    }\n\n    _handleOverridablePaintPropertyUpdate<T, R>(name: string, oldValue: PropertyValue<T, R>, newValue: PropertyValue<T, R>): boolean {\n        if (!this.layout || oldValue.isDataDriven() || newValue.isDataDriven()) {\n            return false;\n        }\n        // relayout on programatically setPaintProperty for all non-data-driven properties that get baked into vertex data.\n        // Buckets could be updated without relayout later, if needed to optimize.\n        return name === \"model-color\" || name === \"model-color-mix-intensity\" || name === \"model-rotation\" || name === \"model-scale\" || name === \"model-translation\" || name === \"model-emissive-strength\";\n    }\n\n    _isPropertyZoomDependent(name: string): boolean {\n        const prop = this._transitionablePaint._values[name];\n        return prop != null && prop.value != null &&\n            prop.value.expression != null &&\n            prop.value.expression instanceof ZoomDependentExpression;\n    }\n\n    isZoomDependent(): boolean {\n        return this._isPropertyZoomDependent('model-scale') ||\n            this._isPropertyZoomDependent('model-rotation') ||\n            this._isPropertyZoomDependent('model-translation');\n    }\n\n    // $FlowFixMe[method-unbinding]\n    queryIntersectsMatchingFeature(\n        queryGeometry: TilespaceQueryGeometry,\n        featureIndex: number,\n        filter: FeatureFilter,\n        transform: Transform): {queryFeature: ?QueryFeature, intersectionZ: number} {\n\n        const tile = queryGeometry.tile;\n        const b = tile.getBucket(this);\n        let queryFeature = null;\n        let intersectionZ = Number.MAX_VALUE;\n        if (!b || !(b instanceof Tiled3dModelBucket)) return {queryFeature, intersectionZ};\n        const bucket: Tiled3dModelBucket = (b: any);\n\n        const nodeInfo = bucket.getNodesInfo()[featureIndex];\n\n        if (nodeInfo.hiddenByReplacement ||\n            !nodeInfo.node.meshes ||\n            // $FlowFixMe[method-unbinding]\n            !filter.filter(new EvaluationParameters(tile.tileID.overscaledZ), nodeInfo.feature, tile.tileID.canonical)) {\n            return {queryFeature, intersectionZ};\n        }\n\n        // AABB check\n        const node = nodeInfo.node;\n        const tileMatrix = transform.calculatePosMatrix(tile.tileID.toUnwrapped(), transform.worldSize);\n        const modelMatrix = tileMatrix;\n        const scale = nodeInfo.evaluatedScale;\n        let elevation = 0;\n        if (transform.elevation && node.elevation) {\n            elevation = node.elevation * transform.elevation.exaggeration();\n        }\n        const anchorX = node.anchor ? node.anchor[0] : 0;\n        const anchorY = node.anchor ? node.anchor[1] : 0;\n\n        mat4.translate(modelMatrix, modelMatrix, [anchorX * (scale[0] - 1),\n            anchorY * (scale[1] - 1),\n            elevation]);\n        /* $FlowIgnore[incompatible-call] scale should always be an array */\n        mat4.scale(modelMatrix, modelMatrix, scale);\n\n        mat4.multiply(modelMatrix, modelMatrix, node.matrix);\n\n        // Collision checks are performed in screen space. Corners are in ndc space.\n        const screenQuery = queryGeometry.queryGeometry;\n        const projectedQueryGeometry = screenQuery.isPointQuery() ? screenQuery.screenBounds : screenQuery.screenGeometry;\n\n        const checkNode = function(n: Node) {\n            const nodeModelMatrix = mat4.multiply([], modelMatrix, n.matrix);\n            const worldViewProjection = mat4.multiply(nodeModelMatrix, transform.expandedFarZProjMatrix, nodeModelMatrix);\n            for (let i = 0; i < n.meshes.length; ++i) {\n                const mesh = n.meshes[i];\n                if (i === n.lightMeshIndex) {\n                    continue;\n                }\n                const depth = queryGeometryIntersectsProjectedAabb(projectedQueryGeometry, transform, worldViewProjection, mesh.aabb);\n                if (depth != null) {\n                    intersectionZ = Math.min(depth, intersectionZ);\n                }\n            }\n            if (n.children) {\n                for (const child of n.children) {\n                    checkNode(child);\n                }\n            }\n        };\n\n        checkNode(node);\n        if (intersectionZ === Number.MAX_VALUE) {\n            return {queryFeature, intersectionZ};\n        }\n\n        const position = new LngLat(0, 0);\n        tileToLngLat(tile.tileID.canonical, position, nodeInfo.node.anchor[0], nodeInfo.node.anchor[1]);\n        queryFeature = {\n            type: 'Feature',\n            geometry: {type: \"Point\", coordinates: [position.lng, position.lat]},\n            properties: nodeInfo.feature.properties,\n            id: nodeInfo.feature.id,\n            state: {}, // append later\n            layer: this.serialize()\n        };\n        return {queryFeature, intersectionZ};\n    }\n}\n\nexport default ModelStyleLayer;\n\nfunction tileToLngLat(id: CanonicalTileID, position: LngLat, pointX: number, pointY: number) {\n    const tileCount = 1 << id.z;\n    position.lat = latFromMercatorY((pointY / EXTENT + id.y) / tileCount);\n    position.lng = lngFromMercatorX((pointX / EXTENT + id.x) / tileCount);\n}\n","// @flow\n\nimport type StyleLayer from './style_layer.js';\nimport circle from './style_layer/circle_style_layer.js';\nimport heatmap from './style_layer/heatmap_style_layer.js';\nimport hillshade from './style_layer/hillshade_style_layer.js';\nimport fill from './style_layer/fill_style_layer.js';\nimport fillExtrusion from './style_layer/fill_extrusion_style_layer.js';\nimport line from './style_layer/line_style_layer.js';\nimport symbol from './style_layer/symbol_style_layer.js';\nimport background from './style_layer/background_style_layer.js';\nimport raster from './style_layer/raster_style_layer.js';\nimport rasterParticle from './style_layer/raster_particle_style_layer.js';\nimport CustomStyleLayer from './style_layer/custom_style_layer.js';\nimport sky from './style_layer/sky_style_layer.js';\nimport slot from './style_layer/slot_style_layer.js';\nimport type {CustomLayerInterface} from './style_layer/custom_style_layer.js';\nimport model from '../../3d-style/style/style_layer/model_style_layer.js';\n\nimport type {LayerSpecification} from '../style-spec/types.js';\nimport type {ConfigOptions} from './properties.js';\n\nconst subclasses = {\n    circle,\n    heatmap,\n    hillshade,\n    fill,\n    'fill-extrusion': fillExtrusion,\n    line,\n    symbol,\n    background,\n    raster,\n    'raster-particle': rasterParticle,\n    sky,\n    slot,\n    model\n};\n\nexport default function createStyleLayer(layer: LayerSpecification | CustomLayerInterface, scope: string, options?: ?ConfigOptions): StyleLayer | CustomStyleLayer {\n    if (layer.type === 'custom') {\n        return new CustomStyleLayer(layer, scope);\n    } else {\n        return new subclasses[layer.type](layer, scope, options);\n    }\n}\n","// @flow\n\nimport StyleLayer from '../style_layer.js';\n\nimport HeatmapBucket from '../../data/bucket/heatmap_bucket.js';\nimport {RGBAImage} from '../../util/image.js';\nimport properties from './heatmap_style_layer_properties.js';\nimport {renderColorRamp} from '../../util/color_ramp.js';\nimport {Transitionable, Transitioning, PossiblyEvaluated} from '../properties.js';\nimport {queryIntersectsCircle} from './circle_style_layer.js';\nimport {getMaximumPaintValue} from '../query_utils.js';\nimport Point from '@mapbox/point-geometry';\n\nimport type {Bucket, BucketParameters} from '../../data/bucket.js';\nimport type Texture from '../../render/texture.js';\nimport type Framebuffer from '../../gl/framebuffer.js';\nimport type {PaintProps} from './heatmap_style_layer_properties.js';\nimport type {LayerSpecification} from '../../style-spec/types.js';\nimport ProgramConfiguration from '../../data/program_configuration.js';\nimport type {TilespaceQueryGeometry} from '../query_geometry.js';\nimport type {DEMSampler} from '../../terrain/elevation.js';\nimport type {FeatureState} from '../../style-spec/expression/index.js';\nimport type Transform from '../../geo/transform.js';\nimport type CircleBucket from '../../data/bucket/circle_bucket.js';\nimport type {IVectorTileFeature} from '@mapbox/vector-tile';\nimport type {CreateProgramParams} from \"../../render/painter.js\";\nimport type {ConfigOptions} from '../properties.js';\n\nclass HeatmapStyleLayer extends StyleLayer {\n\n    heatmapFbo: ?Framebuffer;\n    colorRamp: RGBAImage;\n    colorRampTexture: ?Texture;\n\n    _transitionablePaint: Transitionable<PaintProps>;\n    _transitioningPaint: Transitioning<PaintProps>;\n    paint: PossiblyEvaluated<PaintProps>;\n\n    createBucket(parameters: BucketParameters<HeatmapStyleLayer>): HeatmapBucket {\n        return new HeatmapBucket(parameters);\n    }\n\n    constructor(layer: LayerSpecification, scope: string, options?: ?ConfigOptions) {\n        super(layer, properties, scope, options);\n\n        // make sure color ramp texture is generated for default heatmap color too\n        this._updateColorRamp();\n    }\n\n    _handleSpecialPaintPropertyUpdate(name: string) {\n        if (name === 'heatmap-color') {\n            this._updateColorRamp();\n        }\n    }\n\n    _updateColorRamp() {\n        const expression = this._transitionablePaint._values['heatmap-color'].value.expression;\n        this.colorRamp = renderColorRamp({\n            expression,\n            evaluationKey: 'heatmapDensity',\n            image: this.colorRamp\n        });\n        this.colorRampTexture = null;\n    }\n\n    resize() {\n        if (this.heatmapFbo) {\n            this.heatmapFbo.destroy();\n            this.heatmapFbo = null;\n        }\n    }\n\n    // $FlowFixMe[method-unbinding]\n    queryRadius(bucket: Bucket): number {\n        return getMaximumPaintValue('heatmap-radius', this, ((bucket: any): CircleBucket<*>));\n    }\n\n    // $FlowFixMe[method-unbinding]\n    queryIntersectsFeature(queryGeometry: TilespaceQueryGeometry,\n                           feature: IVectorTileFeature,\n                           featureState: FeatureState,\n                           geometry: Array<Array<Point>>,\n                           zoom: number,\n                           transform: Transform,\n                           pixelPosMatrix: Float32Array,\n                           elevationHelper: ?DEMSampler): boolean {\n\n        const size = this.paint.get('heatmap-radius').evaluate(feature, featureState);\n        return queryIntersectsCircle(\n            queryGeometry, geometry, transform, pixelPosMatrix, elevationHelper,\n            true, true, new Point(0, 0), size);\n    }\n\n    hasOffscreenPass(): boolean {\n        return this.paint.get('heatmap-opacity') !== 0 && this.visibility !== 'none';\n    }\n\n    getProgramIds(): Array<string> {\n        return ['heatmap', 'heatmapTexture'];\n    }\n\n    getDefaultProgramParams(name: string, zoom: number): CreateProgramParams | null {\n        if (name === 'heatmap') {\n            return {\n                config: new ProgramConfiguration(this, zoom),\n                overrideFog: false\n            };\n        }\n        return {};\n    }\n}\n\nexport default HeatmapStyleLayer;\n","// @flow\n\nimport StyleLayer from '../style_layer.js';\n\nimport properties from './hillshade_style_layer_properties.js';\nimport {Transitionable, Transitioning, PossiblyEvaluated} from '../properties.js';\n\nimport type {PaintProps} from './hillshade_style_layer_properties.js';\nimport type {LayerSpecification} from '../../style-spec/types.js';\nimport type {CreateProgramParams} from \"../../render/painter.js\";\nimport type {ConfigOptions} from '../properties.js';\n\nclass HillshadeStyleLayer extends StyleLayer {\n    _transitionablePaint: Transitionable<PaintProps>;\n    _transitioningPaint: Transitioning<PaintProps>;\n    paint: PossiblyEvaluated<PaintProps>;\n\n    constructor(layer: LayerSpecification, scope: string, options?: ?ConfigOptions) {\n        super(layer, properties, scope, options);\n    }\n\n    hasOffscreenPass(): boolean {\n        return this.paint.get('hillshade-exaggeration') !== 0 && this.visibility !== 'none';\n    }\n\n    getProgramIds(): Array<string> {\n        return ['hillshade', 'hillshadePrepare'];\n    }\n\n    // eslint-disable-next-line no-unused-vars\n    getDefaultProgramParams(name: string, zoom: number): CreateProgramParams | null {\n        return {\n            overrideFog: false\n        };\n    }\n}\n\nexport default HillshadeStyleLayer;\n","// @flow\n\nimport StyleLayer from '../style_layer.js';\n\nimport FillBucket from '../../data/bucket/fill_bucket.js';\nimport {polygonIntersectsMultiPolygon} from '../../util/intersection_tests.js';\nimport {translateDistance, translate} from '../query_utils.js';\nimport properties from './fill_style_layer_properties.js';\nimport {Transitionable, Transitioning, Layout, PossiblyEvaluated} from '../properties.js';\nimport ProgramConfiguration from '../../data/program_configuration.js';\n\nimport type {FeatureState} from '../../style-spec/expression/index.js';\nimport type {BucketParameters} from '../../data/bucket.js';\nimport type Point from '@mapbox/point-geometry';\nimport type {LayoutProps, PaintProps} from './fill_style_layer_properties.js';\nimport type EvaluationParameters from '../evaluation_parameters.js';\nimport type Transform from '../../geo/transform.js';\nimport type {LayerSpecification} from '../../style-spec/types.js';\nimport type {TilespaceQueryGeometry} from '../query_geometry.js';\nimport type {IVectorTileFeature} from '@mapbox/vector-tile';\nimport type {CreateProgramParams} from \"../../render/painter.js\";\nimport type {ConfigOptions} from '../properties.js';\n\nclass FillStyleLayer extends StyleLayer {\n    _unevaluatedLayout: Layout<LayoutProps>;\n    layout: PossiblyEvaluated<LayoutProps>;\n\n    _transitionablePaint: Transitionable<PaintProps>;\n    _transitioningPaint: Transitioning<PaintProps>;\n    paint: PossiblyEvaluated<PaintProps>;\n\n    constructor(layer: LayerSpecification, scope: string, options?: ?ConfigOptions) {\n        super(layer, properties, scope, options);\n    }\n\n    getProgramIds(): string[] {\n        const pattern = this.paint.get('fill-pattern');\n        const image = pattern && pattern.constantOr((1: any));\n\n        const ids = [image ? 'fillPattern' : 'fill'];\n\n        if (this.paint.get('fill-antialias')) {\n            ids.push(image && !this.getPaintProperty('fill-outline-color') ? 'fillOutlinePattern' : 'fillOutline');\n        }\n\n        return ids;\n    }\n\n    getDefaultProgramParams(name: string, zoom: number): CreateProgramParams | null {\n        return {\n            config: new ProgramConfiguration(this, zoom),\n            overrideFog: false\n        };\n    }\n\n    recalculate(parameters: EvaluationParameters, availableImages: Array<string>) {\n        super.recalculate(parameters, availableImages);\n\n        const outlineColor = this.paint._values['fill-outline-color'];\n        if (outlineColor.value.kind === 'constant' && outlineColor.value.value === undefined) {\n            this.paint._values['fill-outline-color'] = this.paint._values['fill-color'];\n        }\n    }\n\n    createBucket(parameters: BucketParameters<FillStyleLayer>): FillBucket {\n        return new FillBucket(parameters);\n    }\n\n    // $FlowFixMe[method-unbinding]\n    queryRadius(): number {\n        return translateDistance(this.paint.get('fill-translate'));\n    }\n\n    // $FlowFixMe[method-unbinding]\n    queryIntersectsFeature(queryGeometry: TilespaceQueryGeometry,\n                           feature: IVectorTileFeature,\n                           featureState: FeatureState,\n                           geometry: Array<Array<Point>>,\n                           zoom: number,\n                           transform: Transform): boolean {\n        if (queryGeometry.queryGeometry.isAboveHorizon) return false;\n\n        const translatedPolygon = translate(queryGeometry.tilespaceGeometry,\n            this.paint.get('fill-translate'),\n            this.paint.get('fill-translate-anchor'),\n            transform.angle, queryGeometry.pixelToTileUnitsFactor);\n        return polygonIntersectsMultiPolygon(translatedPolygon, geometry);\n    }\n\n    isTileClipped(): boolean {\n        return true;\n    }\n}\n\nexport default FillStyleLayer;\n","// @flow\n\nimport StyleLayer from '../style_layer.js';\n\nimport properties from './background_style_layer_properties.js';\nimport {Transitionable, Transitioning, PossiblyEvaluated} from '../properties.js';\n\nimport type {PaintProps} from './background_style_layer_properties.js';\nimport type {LayerSpecification} from '../../style-spec/types.js';\nimport type {CreateProgramParams} from \"../../render/painter.js\";\nimport type {ConfigOptions} from '../properties.js';\n\nclass BackgroundStyleLayer extends StyleLayer {\n    _transitionablePaint: Transitionable<PaintProps>;\n    _transitioningPaint: Transitioning<PaintProps>;\n    paint: PossiblyEvaluated<PaintProps>;\n\n    constructor(layer: LayerSpecification, scope: string, options?: ?ConfigOptions) {\n        super(layer, properties, scope, options);\n    }\n\n    getProgramIds(): Array<string> {\n        const image = this.paint.get('background-pattern');\n        return [image ? 'backgroundPattern' : 'background'];\n    }\n\n    // eslint-disable-next-line no-unused-vars\n    getDefaultProgramParams(name: string, zoom: number): CreateProgramParams | null {\n        return {\n            overrideFog: false\n        };\n    }\n}\n\nexport default BackgroundStyleLayer;\n","// @flow\n\nimport StyleLayer from '../style_layer.js';\n\nimport properties from './slot_style_layer_properties.js';\n\nimport type {LayerSpecification} from '../../style-spec/types.js';\n\nclass SlotStyleLayer extends StyleLayer {\n    constructor(layer: LayerSpecification, scope: string, _: mixed) {\n        super(layer, properties, scope);\n    }\n}\n\nexport default SlotStyleLayer;\n","// @noflow\n/* eslint-disable camelcase */\n/* eslint-disable no-sequences */\n/* eslint-disable no-unused-vars */\n/* eslint-disable no-unreachable */\n/* eslint-disable no-unused-expressions */\n\n/* This code is not entirely auto-generated. It's based on the output of npm run\n * pbf:generate, but it has been hand-modified.\n *\n * There is precisely two section which are customized: A utility function is\n * added at the top, and then at the bottom the NumericData.VariableLengthValues\n * reader is modified to read values into a preallocated typed array in order\n * to avoid the default behavior which reads them into a generic JavaScript\n * array only to then pass them into a typed array.\n *\n * To update this file:\n *   1. run `npm run pbf:generate`\n *   2. copy the contents of the updated `mrt/js/proto/mrt_v2_pb2.js` into this file\n *   3. manually transfer over modified sections\n *   4. delete all `write` methods (they're not used in JS)\n *   5. remove references to `exports`\n */\n\n/********************************************************\n **************** BEGIN EDITED SECTION ******************\n ********************************************************/\nconst Bytes = 2;\n\nfunction readPackedEnd(pbf) {\n    return pbf.type === Bytes ? pbf.readVarint() + pbf.pos : pbf.pos + 1;\n}\n\nfunction createPackedVarintReader(pbf) {\n    if (pbf.type !== Bytes) throw new Error(`Unsupported pbf type \"${pbf.type}\"`);\n    const end = readPackedEnd(pbf);\n    const start = pbf.pos;\n    pbf.pos = end;\n    return function readInto(arr) {\n        pbf.pos = start;\n        let i = 0;\n        while (pbf.pos < end) {\n            const value = pbf.readVarint();\n            arr[i++] = value;\n        }\n        return arr;\n    };\n}\n/********************************************************\n ***************** END EDITED SECTION *******************\n ********************************************************/\n\n// TileHeader ========================================\n\nconst TileHeader = {};\n\nTileHeader.read = function (pbf, end) {\n    return pbf.readFields(\n        TileHeader._readField,\n        {header_length: 0, x: 0, y: 0, z: 0, layers: []},\n        end\n    );\n};\nTileHeader._readField = function (tag, obj, pbf) {\n    if (tag === 1) obj.header_length = pbf.readFixed32();\n    else if (tag === 2) obj.x = pbf.readVarint();\n    else if (tag === 3) obj.y = pbf.readVarint();\n    else if (tag === 4) obj.z = pbf.readVarint();\n    else if (tag === 5)\n        obj.layers.push(TileHeader.Layer.read(pbf, pbf.readVarint() + pbf.pos));\n};\n\nTileHeader.PixelFormat = {\n    PIXEL_FORMAT_UNKNOWN: {\n        value: 0,\n        options: {},\n    },\n    PIXEL_FORMAT_UINT32: {\n        value: 1,\n        options: {},\n    },\n    PIXEL_FORMAT_UINT16: {\n        value: 2,\n        options: {},\n    },\n    PIXEL_FORMAT_UINT8: {\n        value: 3,\n        options: {},\n    },\n};\n\n// TileHeader.Filter ========================================\n\nTileHeader.Filter = {};\n\nTileHeader.Filter.read = function (pbf, end) {\n    return pbf.readFields(\n        TileHeader.Filter._readField,\n        {\n            delta_filter: null,\n            filter: null,\n            zigzag_filter: null,\n            bitshuffle_filter: null,\n            byteshuffle_filter: null,\n        },\n        end\n    );\n};\nTileHeader.Filter._readField = function (tag, obj, pbf) {\n    if (tag === 1)\n        (obj.delta_filter = TileHeader.Filter.Delta.read(\n            pbf,\n            pbf.readVarint() + pbf.pos\n        )),\n        (obj.filter = 'delta_filter');\n    else if (tag === 2)\n        (obj.zigzag_filter = TileHeader.Filter.Zigzag.read(\n            pbf,\n            pbf.readVarint() + pbf.pos\n        )),\n        (obj.filter = 'zigzag_filter');\n    else if (tag === 3)\n        (obj.bitshuffle_filter = TileHeader.Filter.BitShuffle.read(\n            pbf,\n            pbf.readVarint() + pbf.pos\n        )),\n        (obj.filter = 'bitshuffle_filter');\n    else if (tag === 4)\n        (obj.byteshuffle_filter = TileHeader.Filter.ByteShuffle.read(\n            pbf,\n            pbf.readVarint() + pbf.pos\n        )),\n        (obj.filter = 'byteshuffle_filter');\n};\n\n// TileHeader.Filter.Delta ========================================\n\nTileHeader.Filter.Delta = {};\n\nTileHeader.Filter.Delta.read = function (pbf, end) {\n    return pbf.readFields(\n        TileHeader.Filter.Delta._readField,\n        {block_size: 0},\n        end\n    );\n};\nTileHeader.Filter.Delta._readField = function (tag, obj, pbf) {\n    if (tag === 1) obj.block_size = pbf.readVarint();\n};\n\n// TileHeader.Filter.Zigzag ========================================\n\nTileHeader.Filter.Zigzag = {};\n\nTileHeader.Filter.Zigzag.read = function (pbf, end) {\n    return pbf.readFields(TileHeader.Filter.Zigzag._readField, {}, end);\n};\nTileHeader.Filter.Zigzag._readField = function (tag, obj, pbf) {};\n\n// TileHeader.Filter.BitShuffle ========================================\n\nTileHeader.Filter.BitShuffle = {};\n\nTileHeader.Filter.BitShuffle.read = function (pbf, end) {\n    return pbf.readFields(TileHeader.Filter.BitShuffle._readField, {}, end);\n};\nTileHeader.Filter.BitShuffle._readField = function (tag, obj, pbf) {};\n\n// TileHeader.Filter.ByteShuffle ========================================\n\nTileHeader.Filter.ByteShuffle = {};\n\nTileHeader.Filter.ByteShuffle.read = function (pbf, end) {\n    return pbf.readFields(TileHeader.Filter.ByteShuffle._readField, {}, end);\n};\nTileHeader.Filter.ByteShuffle._readField = function (tag, obj, pbf) {};\n\n// TileHeader.Codec ========================================\n\nTileHeader.Codec = {};\n\nTileHeader.Codec.read = function (pbf, end) {\n    return pbf.readFields(\n        TileHeader.Codec._readField,\n        {\n            gzip_data: null,\n            codec: null,\n            jpeg_image: null,\n            webp_image: null,\n            png_image: null,\n        },\n        end\n    );\n};\nTileHeader.Codec._readField = function (tag, obj, pbf) {\n    if (tag === 1)\n        (obj.gzip_data = TileHeader.Codec.GzipData.read(\n            pbf,\n            pbf.readVarint() + pbf.pos\n        )),\n        (obj.codec = 'gzip_data');\n    else if (tag === 2)\n        (obj.jpeg_image = TileHeader.Codec.JpegImage.read(\n            pbf,\n            pbf.readVarint() + pbf.pos\n        )),\n        (obj.codec = 'jpeg_image');\n    else if (tag === 3)\n        (obj.webp_image = TileHeader.Codec.WebpImage.read(\n            pbf,\n            pbf.readVarint() + pbf.pos\n        )),\n        (obj.codec = 'webp_image');\n    else if (tag === 4)\n        (obj.png_image = TileHeader.Codec.PngImage.read(\n            pbf,\n            pbf.readVarint() + pbf.pos\n        )),\n        (obj.codec = 'png_image');\n};\n\n// TileHeader.Codec.GzipData ========================================\n\nTileHeader.Codec.GzipData = {};\n\nTileHeader.Codec.GzipData.read = function (pbf, end) {\n    return pbf.readFields(TileHeader.Codec.GzipData._readField, {}, end);\n};\nTileHeader.Codec.GzipData._readField = function (tag, obj, pbf) {};\n\n// TileHeader.Codec.JpegImage ========================================\n\nTileHeader.Codec.JpegImage = {};\n\nTileHeader.Codec.JpegImage.read = function (pbf, end) {\n    return pbf.readFields(TileHeader.Codec.JpegImage._readField, {}, end);\n};\nTileHeader.Codec.JpegImage._readField = function (tag, obj, pbf) {};\n\n// TileHeader.Codec.WebpImage ========================================\n\nTileHeader.Codec.WebpImage = {};\n\nTileHeader.Codec.WebpImage.read = function (pbf, end) {\n    return pbf.readFields(TileHeader.Codec.WebpImage._readField, {}, end);\n};\nTileHeader.Codec.WebpImage._readField = function (tag, obj, pbf) {};\n\n// TileHeader.Codec.PngImage ========================================\n\nTileHeader.Codec.PngImage = {};\n\nTileHeader.Codec.PngImage.read = function (pbf, end) {\n    return pbf.readFields(TileHeader.Codec.PngImage._readField, {}, end);\n};\nTileHeader.Codec.PngImage._readField = function (tag, obj, pbf) {};\n\n// TileHeader.DataIndexEntry ========================================\n\nTileHeader.DataIndexEntry = {};\n\nTileHeader.DataIndexEntry.read = function (pbf, end) {\n    return pbf.readFields(\n        TileHeader.DataIndexEntry._readField,\n        {\n            first_byte: 0,\n            last_byte: 0,\n            filters: [],\n            codec: null,\n            offset: 0,\n            scale: 0,\n            bands: [],\n        },\n        end\n    );\n};\nTileHeader.DataIndexEntry._readField = function (tag, obj, pbf) {\n    if (tag === 1) obj.first_byte = pbf.readFixed64();\n    else if (tag === 2) obj.last_byte = pbf.readFixed64();\n    else if (tag === 3)\n        obj.filters.push(\n            TileHeader.Filter.read(pbf, pbf.readVarint() + pbf.pos)\n        );\n    else if (tag === 4)\n        obj.codec = TileHeader.Codec.read(pbf, pbf.readVarint() + pbf.pos);\n    else if (tag === 5) obj.offset = pbf.readFloat();\n    else if (tag === 6) obj.scale = pbf.readFloat();\n    else if (tag === 7) obj.bands.push(pbf.readString());\n};\n\n// TileHeader.Layer ========================================\n\nTileHeader.Layer = {};\n\nTileHeader.Layer.read = function (pbf, end) {\n    return pbf.readFields(\n        TileHeader.Layer._readField,\n        {\n            version: 0,\n            name: '',\n            units: '',\n            tilesize: 0,\n            buffer: 0,\n            pixel_format: 0,\n            data_index: [],\n        },\n        end\n    );\n};\nTileHeader.Layer._readField = function (tag, obj, pbf) {\n    if (tag === 1) obj.version = pbf.readVarint();\n    else if (tag === 2) obj.name = pbf.readString();\n    else if (tag === 3) obj.units = pbf.readString();\n    else if (tag === 4) obj.tilesize = pbf.readVarint();\n    else if (tag === 5) obj.buffer = pbf.readVarint();\n    else if (tag === 6) obj.pixel_format = pbf.readVarint();\n    else if (tag === 7)\n        obj.data_index.push(\n            TileHeader.DataIndexEntry.read(pbf, pbf.readVarint() + pbf.pos)\n        );\n};\n\n// NumericData ========================================\n\nconst NumericData = {};\n\nNumericData.read = function (pbf, end) {\n    return pbf.readFields(\n        NumericData._readField,\n        {uint32_values: null, values: null, fixed32_values: null},\n        end\n    );\n};\nNumericData._readField = function (tag, obj, pbf) {\n    if (tag === 2)\n        (obj.uint32_values = NumericData.Uint32Values.read(\n            pbf,\n            pbf.readVarint() + pbf.pos\n        )),\n        (obj.values = 'uint32_values');\n    else if (tag === 3)\n        (obj.fixed32_values = NumericData.Fixed32Values.read(\n            pbf,\n            pbf.readVarint() + pbf.pos\n        )),\n        (obj.values = 'fixed32_values');\n};\n\n// NumericData.Uint32Values ========================================\n\nNumericData.Uint32Values = {};\n\nNumericData.Uint32Values.read = function (pbf, end) {\n    return pbf.readFields(\n        NumericData.Uint32Values._readField,\n        {values: []},\n        end\n    );\n};\nNumericData.Uint32Values._readField = function (tag, obj, pbf) {\n    /********************************************************\n     ***************** BEGIN EDITED SECTION *******************\n     ********************************************************/\n    if (tag === 1) obj.readValuesInto = createPackedVarintReader(pbf);\n    /********************************************************\n     ***************** END EDITED SECTION *******************\n     ********************************************************/\n};\n\n// NumericData.Fixed32Values ========================================\n\nNumericData.Fixed32Values = {};\n\nNumericData.Fixed32Values.read = function (pbf, end) {\n    return pbf.readFields(\n        NumericData.Fixed32Values._readField,\n        {values: []},\n        end\n    );\n};\nNumericData.Fixed32Values._readField = function (tag, obj, pbf) {\n    /********************************************************\n     ***************** BEGIN EDITED SECTION *******************\n     ********************************************************/\n    throw new Error('Not implemented');\n    if (tag === 1) pbf.readPackedFixed32(obj.values);\n    /********************************************************\n     ***************** END EDITED SECTION *******************\n     ********************************************************/\n};\n\nexport {TileHeader, NumericData};\n","/**\n * tiny-lru\n *\n * @copyright 2024 Jason Mulligan <jason.mulligan@avoidwork.com>\n * @license BSD-3-Clause\n * @version 11.2.6\n */\nclass LRU {\r\n\tconstructor (max = 0, ttl = 0, resetTtl = false) {\r\n\t\tthis.first = null;\r\n\t\tthis.items = Object.create(null);\r\n\t\tthis.last = null;\r\n\t\tthis.max = max;\r\n\t\tthis.resetTtl = resetTtl;\r\n\t\tthis.size = 0;\r\n\t\tthis.ttl = ttl;\r\n\t}\r\n\r\n\tclear () {\r\n\t\tthis.first = null;\r\n\t\tthis.items = Object.create(null);\r\n\t\tthis.last = null;\r\n\t\tthis.size = 0;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tdelete (key) {\r\n\t\tif (this.has(key)) {\r\n\t\t\tconst item = this.items[key];\r\n\r\n\t\t\tdelete this.items[key];\r\n\t\t\tthis.size--;\r\n\r\n\t\t\tif (item.prev !== null) {\r\n\t\t\t\titem.prev.next = item.next;\r\n\t\t\t}\r\n\r\n\t\t\tif (item.next !== null) {\r\n\t\t\t\titem.next.prev = item.prev;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.first === item) {\r\n\t\t\t\tthis.first = item.next;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.last === item) {\r\n\t\t\t\tthis.last = item.prev;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tentries (keys = this.keys()) {\r\n\t\treturn keys.map(key => [key, this.get(key)]);\r\n\t}\r\n\r\n\tevict (bypass = false) {\r\n\t\tif (bypass || this.size > 0) {\r\n\t\t\tconst item = this.first;\r\n\r\n\t\t\tdelete this.items[item.key];\r\n\r\n\t\t\tif (--this.size === 0) {\r\n\t\t\t\tthis.first = null;\r\n\t\t\t\tthis.last = null;\r\n\t\t\t} else {\r\n\t\t\t\tthis.first = item.next;\r\n\t\t\t\tthis.first.prev = null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\texpiresAt (key) {\r\n\t\tlet result;\r\n\r\n\t\tif (this.has(key)) {\r\n\t\t\tresult = this.items[key].expiry;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tget (key) {\r\n\t\tlet result;\r\n\r\n\t\tif (this.has(key)) {\r\n\t\t\tconst item = this.items[key];\r\n\r\n\t\t\tif (this.ttl > 0 && item.expiry <= Date.now()) {\r\n\t\t\t\tthis.delete(key);\r\n\t\t\t} else {\r\n\t\t\t\tresult = item.value;\r\n\t\t\t\tthis.set(key, result, true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\thas (key) {\r\n\t\treturn key in this.items;\r\n\t}\r\n\r\n\tkeys () {\r\n\t\tconst result = [];\r\n\t\tlet x = this.first;\r\n\r\n\t\twhile (x !== null) {\r\n\t\t\tresult.push(x.key);\r\n\t\t\tx = x.next;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tset (key, value, bypass = false, resetTtl = this.resetTtl) {\r\n\t\tlet item;\r\n\r\n\t\tif (bypass || this.has(key)) {\r\n\t\t\titem = this.items[key];\r\n\t\t\titem.value = value;\r\n\r\n\t\t\tif (bypass === false && resetTtl) {\r\n\t\t\t\titem.expiry = this.ttl > 0 ? Date.now() + this.ttl : this.ttl;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.last !== item) {\r\n\t\t\t\tconst last = this.last,\r\n\t\t\t\t\tnext = item.next,\r\n\t\t\t\t\tprev = item.prev;\r\n\r\n\t\t\t\tif (this.first === item) {\r\n\t\t\t\t\tthis.first = item.next;\r\n\t\t\t\t}\r\n\r\n\t\t\t\titem.next = null;\r\n\t\t\t\titem.prev = this.last;\r\n\t\t\t\tlast.next = item;\r\n\r\n\t\t\t\tif (prev !== null) {\r\n\t\t\t\t\tprev.next = next;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (next !== null) {\r\n\t\t\t\t\tnext.prev = prev;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (this.max > 0 && this.size === this.max) {\r\n\t\t\t\tthis.evict(true);\r\n\t\t\t}\r\n\r\n\t\t\titem = this.items[key] = {\r\n\t\t\t\texpiry: this.ttl > 0 ? Date.now() + this.ttl : this.ttl,\r\n\t\t\t\tkey: key,\r\n\t\t\t\tprev: this.last,\r\n\t\t\t\tnext: null,\r\n\t\t\t\tvalue\r\n\t\t\t};\r\n\r\n\t\t\tif (++this.size === 1) {\r\n\t\t\t\tthis.first = item;\r\n\t\t\t} else {\r\n\t\t\t\tthis.last.next = item;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.last = item;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tvalues (keys = this.keys()) {\r\n\t\treturn keys.map(key => this.get(key));\r\n\t}\r\n}\r\n\r\nfunction lru (max = 1000, ttl = 0, resetTtl = false) {\r\n\tif (isNaN(max) || max < 0) {\r\n\t\tthrow new TypeError(\"Invalid max value\");\r\n\t}\r\n\r\n\tif (isNaN(ttl) || ttl < 0) {\r\n\t\tthrow new TypeError(\"Invalid ttl value\");\r\n\t}\r\n\r\n\tif (typeof resetTtl !== \"boolean\") {\r\n\t\tthrow new TypeError(\"Invalid resetTtl value\");\r\n\t}\r\n\r\n\treturn new LRU(max, ttl, resetTtl);\r\n}export{LRU,lru};","// @noflow\n\n/** @typedef { import(\"../types/types\").TArrayLike } TArrayLike; */\n\n/**\n * Decode difference-encoded data using a cumulative sum operation along\n * the last two (raster row and column) axes.\n *\n * @param {TArrayLike} data - flat array of input data\n * @param {number[]} shape - array dimensions, *including* the pixel dimension,\n *                           i.e. 1, 2, or 4 reflecting whether the data is\n *                           uint32, uint16, or uint8, respectively.\n * @return {TArrayLike} - differenced ndarray\n */\nfunction deltaDecode(data, shape) {\n    if (shape.length !== 4) {\n        throw new Error(\n            `Expected data of dimension 4 but got ${shape.length}.`\n        );\n    }\n\n    // Sum over dimensions 1 and 2 of 0, 1, 2, 3\n    let axisOffset = shape[3];\n    for (let axis = 2; axis >= 1; axis--) {\n        const start1 = axis === 1 ? 1 : 0;\n        const start2 = axis === 2 ? 1 : 0;\n\n        for (let i0 = 0; i0 < shape[0]; i0++) {\n            const offset0 = shape[1] * i0;\n\n            for (let i1 = start1; i1 < shape[1]; i1++) {\n                const offset1 = shape[2] * (i1 + offset0);\n\n                for (let i2 = start2; i2 < shape[2]; i2++) {\n                    const offset2 = shape[3] * (i2 + offset1);\n\n                    for (let i3 = 0; i3 < shape[3]; i3++) {\n                        const offset3 = offset2 + i3;\n\n                        data[offset3] += data[offset3 - axisOffset];\n                    }\n                }\n            }\n        }\n        axisOffset *= shape[axis];\n    }\n\n    return data;\n}\n\nexport default deltaDecode;\n","// @noflow\n\n/** @typedef { import(\"../types/types\").TArrayLike } TArrayLike; */\n\n/**\n * Perform zigzag decoding.\n *\n * The purpose of this operation is to turn two's complement signed 32-bit\n * integers into small positive integers. It does this by performing a\n * circular shift and rotating the sign bit all the way over to the least\n * significant bit. At the same time, it inverts the bits of negative numbers\n * so that all those two's complement ones turn into zeros.\n *\n * This operation is a bitwise equivalent of the mathematical operation\n *\n *     x % 2 === 1\n *       ? (x + 1) / -2\n *       : x / 2\n *\n * Unlike the bitwise version though, it works throughout the entire 32-bit\n * unsigned range without overflow.\n *\n * Note that this imlementation works on Uint32Array, Uint16Array, and\n * Uint8Array input without needing to specially handle the different types.\n *\n * @param {TArrayLike} data - flat array of input data\n * @return {TArrayLike} - zigzag-decoded array\n */\nfunction zigzagDecode(data) {\n    for (let i = 0, n = data.length; i < n; i++) {\n        data[i] = (data[i] >>> 1) ^ -(data[i] & 1);\n    }\n    return data;\n}\n\nexport default zigzagDecode;\n","// @noflow\n\n/** @typedef { import(\"../types/types\").TArrayLike } TArrayLike; */\n/** @typedef { import(\"../types/types\").TPixelFormat } TPixelFormat; */\n\n/**\n * Perform bitshuffle decoding.\n *\n * @param {TArrayLike} data - flat array of input data\n * @param {TPixelFormat} pixelFormat - pixel format of data\n * @return {TArrayLike} - zigzag-decoded array\n */\nfunction bitshuffleDecode(data, pixelFormat) {\n    switch (pixelFormat) {\n    case 'uint32':\n        return data;\n    case 'uint16':\n        for (let i = 0; i < data.length; i += 2) {\n            const a = data[i];\n            const b = data[i + 1];\n            data[i] = ((a & 0xF0) >> 4) | ((a & 0xF000) >> 8) | ((b & 0xF0) << 4) | (b & 0xF000);\n            data[i + 1] = (a & 0xF) | ((a & 0xF00) >> 4) | ((b & 0xF) << 8) | ((b & 0xF00) << 4);\n        }\n        return data;\n    case 'uint8':\n        for (let i = 0; i < data.length; i += 4) {\n            const a = data[i];\n            const b = data[i + 1];\n            const c = data[i + 2];\n            const d = data[i + 3];\n\n            data[i + 0] = ((a & 0xC0) >> 6) | ((b & 0xC0) >> 4) | ((c & 0xC0) >> 2) | ((d & 0xC0) >> 0);\n            data[i + 1] = ((a & 0x30) >> 4) | ((b & 0x30) >> 2) | ((c & 0x30) >> 0) | ((d & 0x30) << 2);\n            data[i + 2] = ((a & 0x0C) >> 2) | ((b & 0x0C) >> 0) | ((c & 0x0C) << 2) | ((d & 0x0C) << 4);\n            data[i + 3] = ((a & 0x03) >> 0) | ((b & 0x03) << 2) | ((c & 0x03) << 4) | ((d & 0x03) << 6);\n        }\n        return data;\n    default:\n        throw new Error(`Invalid pixel format, \"${pixelFormat}\"`);\n    }\n}\n\nexport default bitshuffleDecode;\n","// @noflow\nclass MRTError extends Error {\n    /**\n     * @param {string} message - error message\n     */\n    constructor(message) {\n        super(message);\n        this.name = 'MRTError';\n    }\n}\n\nexport default MRTError;\n\nexport {MRTError};\n","// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n    var w = new Worker(ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([\n        c + ';addEventListener(\"error\",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'\n    ], { type: 'text/javascript' }))));\n    w.onmessage = function (e) {\n        var d = e.data, ed = d.$e$;\n        if (ed) {\n            var err = new Error(ed[0]);\n            err['code'] = ed[1];\n            err.stack = ed[2];\n            cb(err, null);\n        }\n        else\n            cb(null, d);\n    };\n    w.postMessage(msg, transfer);\n    return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n    var b = new u16(31);\n    for (var i = 0; i < 31; ++i) {\n        b[i] = start += 1 << eb[i - 1];\n    }\n    // numbers here are at max 18 bits\n    var r = new i32(b[30]);\n    for (var i = 1; i < 30; ++i) {\n        for (var j = b[i]; j < b[i + 1]; ++j) {\n            r[j] = ((j - b[i]) << 5) | i;\n        }\n    }\n    return { b: b, r: r };\n};\nvar _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r;\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n    // reverse table algorithm from SO\n    var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);\n    x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2);\n    x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4);\n    rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n    var s = cd.length;\n    // index\n    var i = 0;\n    // u16 \"map\": index -> # of codes with bit length = index\n    var l = new u16(mb);\n    // length of cd must be 288 (total # of codes)\n    for (; i < s; ++i) {\n        if (cd[i])\n            ++l[cd[i] - 1];\n    }\n    // u16 \"map\": index -> minimum code for bit length = index\n    var le = new u16(mb);\n    for (i = 1; i < mb; ++i) {\n        le[i] = (le[i - 1] + l[i - 1]) << 1;\n    }\n    var co;\n    if (r) {\n        // u16 \"map\": index -> number of actual bits, symbol for code\n        co = new u16(1 << mb);\n        // bits to remove for reverser\n        var rvb = 15 - mb;\n        for (i = 0; i < s; ++i) {\n            // ignore 0 lengths\n            if (cd[i]) {\n                // num encoding both symbol and bits read\n                var sv = (i << 4) | cd[i];\n                // free bits\n                var r_1 = mb - cd[i];\n                // start value\n                var v = le[cd[i] - 1]++ << r_1;\n                // m is end value\n                for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n                    // every 16 bit value starting with the code yields the same result\n                    co[rev[v] >> rvb] = sv;\n                }\n            }\n        }\n    }\n    else {\n        co = new u16(s);\n        for (i = 0; i < s; ++i) {\n            if (cd[i]) {\n                co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);\n            }\n        }\n    }\n    return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n    flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n    flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n    flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n    flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n    fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n    var m = a[0];\n    for (var i = 1; i < a.length; ++i) {\n        if (a[i] > m)\n            m = a[i];\n    }\n    return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n    var o = (p / 8) | 0;\n    return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n    var o = (p / 8) | 0;\n    return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n    if (s == null || s < 0)\n        s = 0;\n    if (e == null || e > v.length)\n        e = v.length;\n    // can't use .constructor in case user-supplied\n    return new u8(v.subarray(s, e));\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n    UnexpectedEOF: 0,\n    InvalidBlockType: 1,\n    InvalidLengthLiteral: 2,\n    InvalidDistance: 3,\n    StreamFinished: 4,\n    NoStreamHandler: 5,\n    InvalidHeader: 6,\n    NoCallback: 7,\n    InvalidUTF8: 8,\n    ExtraFieldTooLong: 9,\n    InvalidDate: 10,\n    FilenameTooLong: 11,\n    StreamFinishing: 12,\n    InvalidZipData: 13,\n    UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n    'unexpected EOF',\n    'invalid block type',\n    'invalid length/literal',\n    'invalid distance',\n    'stream finished',\n    'no stream handler',\n    ,\n    'no callback',\n    'invalid UTF-8 data',\n    'extra field too long',\n    'date not in range 1980-2099',\n    'filename too long',\n    'stream finishing',\n    'invalid zip data'\n    // determined by unknown compression method\n];\n;\nvar err = function (ind, msg, nt) {\n    var e = new Error(msg || ec[ind]);\n    e.code = ind;\n    if (Error.captureStackTrace)\n        Error.captureStackTrace(e, err);\n    if (!nt)\n        throw e;\n    return e;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, st, buf, dict) {\n    // source length       dict length\n    var sl = dat.length, dl = dict ? dict.length : 0;\n    if (!sl || st.f && !st.l)\n        return buf || new u8(0);\n    var noBuf = !buf;\n    // have to estimate size\n    var resize = noBuf || st.i != 2;\n    // no state\n    var noSt = st.i;\n    // Assumes roughly 33% compression ratio average\n    if (noBuf)\n        buf = new u8(sl * 3);\n    // ensure buffer can fit at least l elements\n    var cbuf = function (l) {\n        var bl = buf.length;\n        // need to increase size to fit\n        if (l > bl) {\n            // Double or set to necessary, whichever is greater\n            var nbuf = new u8(Math.max(bl * 2, l));\n            nbuf.set(buf);\n            buf = nbuf;\n        }\n    };\n    //  last chunk         bitpos           bytes\n    var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n    // total bits\n    var tbts = sl * 8;\n    do {\n        if (!lm) {\n            // BFINAL - this is only 1 when last chunk is next\n            final = bits(dat, pos, 1);\n            // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n            var type = bits(dat, pos + 1, 3);\n            pos += 3;\n            if (!type) {\n                // go to end of byte boundary\n                var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n                if (t > sl) {\n                    if (noSt)\n                        err(0);\n                    break;\n                }\n                // ensure size\n                if (resize)\n                    cbuf(bt + l);\n                // Copy over uncompressed data\n                buf.set(dat.subarray(s, t), bt);\n                // Get new bitpos, update byte count\n                st.b = bt += l, st.p = pos = t * 8, st.f = final;\n                continue;\n            }\n            else if (type == 1)\n                lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n            else if (type == 2) {\n                //  literal                            lengths\n                var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n                var tl = hLit + bits(dat, pos + 5, 31) + 1;\n                pos += 14;\n                // length+distance tree\n                var ldt = new u8(tl);\n                // code length tree\n                var clt = new u8(19);\n                for (var i = 0; i < hcLen; ++i) {\n                    // use index map to get real code\n                    clt[clim[i]] = bits(dat, pos + i * 3, 7);\n                }\n                pos += hcLen * 3;\n                // code lengths bits\n                var clb = max(clt), clbmsk = (1 << clb) - 1;\n                // code lengths map\n                var clm = hMap(clt, clb, 1);\n                for (var i = 0; i < tl;) {\n                    var r = clm[bits(dat, pos, clbmsk)];\n                    // bits read\n                    pos += r & 15;\n                    // symbol\n                    var s = r >> 4;\n                    // code length to copy\n                    if (s < 16) {\n                        ldt[i++] = s;\n                    }\n                    else {\n                        //  copy   count\n                        var c = 0, n = 0;\n                        if (s == 16)\n                            n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n                        else if (s == 17)\n                            n = 3 + bits(dat, pos, 7), pos += 3;\n                        else if (s == 18)\n                            n = 11 + bits(dat, pos, 127), pos += 7;\n                        while (n--)\n                            ldt[i++] = c;\n                    }\n                }\n                //    length tree                 distance tree\n                var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n                // max length bits\n                lbt = max(lt);\n                // max dist bits\n                dbt = max(dt);\n                lm = hMap(lt, lbt, 1);\n                dm = hMap(dt, dbt, 1);\n            }\n            else\n                err(1);\n            if (pos > tbts) {\n                if (noSt)\n                    err(0);\n                break;\n            }\n        }\n        // Make sure the buffer can hold this + the largest possible addition\n        // Maximum chunk size (practically, theoretically infinite) is 2^17\n        if (resize)\n            cbuf(bt + 131072);\n        var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n        var lpos = pos;\n        for (;; lpos = pos) {\n            // bits read, code\n            var c = lm[bits16(dat, pos) & lms], sym = c >> 4;\n            pos += c & 15;\n            if (pos > tbts) {\n                if (noSt)\n                    err(0);\n                break;\n            }\n            if (!c)\n                err(2);\n            if (sym < 256)\n                buf[bt++] = sym;\n            else if (sym == 256) {\n                lpos = pos, lm = null;\n                break;\n            }\n            else {\n                var add = sym - 254;\n                // no extra bits needed if less\n                if (sym > 264) {\n                    // index\n                    var i = sym - 257, b = fleb[i];\n                    add = bits(dat, pos, (1 << b) - 1) + fl[i];\n                    pos += b;\n                }\n                // dist\n                var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;\n                if (!d)\n                    err(3);\n                pos += d & 15;\n                var dt = fd[dsym];\n                if (dsym > 3) {\n                    var b = fdeb[dsym];\n                    dt += bits16(dat, pos) & (1 << b) - 1, pos += b;\n                }\n                if (pos > tbts) {\n                    if (noSt)\n                        err(0);\n                    break;\n                }\n                if (resize)\n                    cbuf(bt + 131072);\n                var end = bt + add;\n                if (bt < dt) {\n                    var shift = dl - dt, dend = Math.min(dt, end);\n                    if (shift + bt < 0)\n                        err(3);\n                    for (; bt < dend; ++bt)\n                        buf[bt] = dict[shift + bt];\n                }\n                for (; bt < end; ++bt)\n                    buf[bt] = buf[bt - dt];\n            }\n        }\n        st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n        if (lm)\n            final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n    } while (!final);\n    // don't reallocate for streams or user buffers\n    return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n    v <<= p & 7;\n    var o = (p / 8) | 0;\n    d[o] |= v;\n    d[o + 1] |= v >> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n    v <<= p & 7;\n    var o = (p / 8) | 0;\n    d[o] |= v;\n    d[o + 1] |= v >> 8;\n    d[o + 2] |= v >> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n    // Need extra info to make a tree\n    var t = [];\n    for (var i = 0; i < d.length; ++i) {\n        if (d[i])\n            t.push({ s: i, f: d[i] });\n    }\n    var s = t.length;\n    var t2 = t.slice();\n    if (!s)\n        return { t: et, l: 0 };\n    if (s == 1) {\n        var v = new u8(t[0].s + 1);\n        v[t[0].s] = 1;\n        return { t: v, l: 1 };\n    }\n    t.sort(function (a, b) { return a.f - b.f; });\n    // after i2 reaches last ind, will be stopped\n    // freq must be greater than largest possible number of symbols\n    t.push({ s: -1, f: 25001 });\n    var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n    t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n    // efficient algorithm from UZIP.js\n    // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n    // symbols that combined have high freq, will start processing i2 (high-freq,\n    // non-composite) symbols instead\n    // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n    while (i1 != s - 1) {\n        l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n        r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n        t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n    }\n    var maxSym = t2[0].s;\n    for (var i = 1; i < s; ++i) {\n        if (t2[i].s > maxSym)\n            maxSym = t2[i].s;\n    }\n    // code lengths\n    var tr = new u16(maxSym + 1);\n    // max bits in tree\n    var mbt = ln(t[i1 - 1], tr, 0);\n    if (mbt > mb) {\n        // more algorithms from UZIP.js\n        // TODO: find out how this code works (debt)\n        //  ind    debt\n        var i = 0, dt = 0;\n        //    left            cost\n        var lft = mbt - mb, cst = 1 << lft;\n        t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n        for (; i < s; ++i) {\n            var i2_1 = t2[i].s;\n            if (tr[i2_1] > mb) {\n                dt += cst - (1 << (mbt - tr[i2_1]));\n                tr[i2_1] = mb;\n            }\n            else\n                break;\n        }\n        dt >>= lft;\n        while (dt > 0) {\n            var i2_2 = t2[i].s;\n            if (tr[i2_2] < mb)\n                dt -= 1 << (mb - tr[i2_2]++ - 1);\n            else\n                ++i;\n        }\n        for (; i >= 0 && dt; --i) {\n            var i2_3 = t2[i].s;\n            if (tr[i2_3] == mb) {\n                --tr[i2_3];\n                ++dt;\n            }\n        }\n        mbt = mb;\n    }\n    return { t: new u8(tr), l: mbt };\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n    return n.s == -1\n        ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n        : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n    var s = c.length;\n    // Note that the semicolon was intentional\n    while (s && !c[--s])\n        ;\n    var cl = new u16(++s);\n    //  ind      num         streak\n    var cli = 0, cln = c[0], cls = 1;\n    var w = function (v) { cl[cli++] = v; };\n    for (var i = 1; i <= s; ++i) {\n        if (c[i] == cln && i != s)\n            ++cls;\n        else {\n            if (!cln && cls > 2) {\n                for (; cls > 138; cls -= 138)\n                    w(32754);\n                if (cls > 2) {\n                    w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n                    cls = 0;\n                }\n            }\n            else if (cls > 3) {\n                w(cln), --cls;\n                for (; cls > 6; cls -= 6)\n                    w(8304);\n                if (cls > 2)\n                    w(((cls - 3) << 5) | 8208), cls = 0;\n            }\n            while (cls--)\n                w(cln);\n            cls = 1;\n            cln = c[i];\n        }\n    }\n    return { c: cl.subarray(0, cli), n: s };\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n    var l = 0;\n    for (var i = 0; i < cl.length; ++i)\n        l += cf[i] * cl[i];\n    return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n    // no need to write 00 as type: TypedArray defaults to 0\n    var s = dat.length;\n    var o = shft(pos + 2);\n    out[o] = s & 255;\n    out[o + 1] = s >> 8;\n    out[o + 2] = out[o] ^ 255;\n    out[o + 3] = out[o + 1] ^ 255;\n    for (var i = 0; i < s; ++i)\n        out[o + i + 4] = dat[i];\n    return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n    wbits(out, p++, final);\n    ++lf[256];\n    var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l;\n    var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l;\n    var _c = lc(dlt), lclt = _c.c, nlc = _c.n;\n    var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;\n    var lcfreq = new u16(19);\n    for (var i = 0; i < lclt.length; ++i)\n        ++lcfreq[lclt[i] & 31];\n    for (var i = 0; i < lcdt.length; ++i)\n        ++lcfreq[lcdt[i] & 31];\n    var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;\n    var nlcc = 19;\n    for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n        ;\n    var flen = (bl + 5) << 3;\n    var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n    var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];\n    if (bs >= 0 && flen <= ftlen && flen <= dtlen)\n        return wfblk(out, p, dat.subarray(bs, bs + bl));\n    var lm, ll, dm, dl;\n    wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n    if (dtlen < ftlen) {\n        lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n        var llm = hMap(lct, mlcb, 0);\n        wbits(out, p, nlc - 257);\n        wbits(out, p + 5, ndc - 1);\n        wbits(out, p + 10, nlcc - 4);\n        p += 14;\n        for (var i = 0; i < nlcc; ++i)\n            wbits(out, p + 3 * i, lct[clim[i]]);\n        p += 3 * nlcc;\n        var lcts = [lclt, lcdt];\n        for (var it = 0; it < 2; ++it) {\n            var clct = lcts[it];\n            for (var i = 0; i < clct.length; ++i) {\n                var len = clct[i] & 31;\n                wbits(out, p, llm[len]), p += lct[len];\n                if (len > 15)\n                    wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12;\n            }\n        }\n    }\n    else {\n        lm = flm, ll = flt, dm = fdm, dl = fdt;\n    }\n    for (var i = 0; i < li; ++i) {\n        var sym = syms[i];\n        if (sym > 255) {\n            var len = (sym >> 18) & 31;\n            wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n            if (len > 7)\n                wbits(out, p, (sym >> 23) & 31), p += fleb[len];\n            var dst = sym & 31;\n            wbits16(out, p, dm[dst]), p += dl[dst];\n            if (dst > 3)\n                wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst];\n        }\n        else {\n            wbits16(out, p, lm[sym]), p += ll[sym];\n        }\n    }\n    wbits16(out, p, lm[256]);\n    return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, st) {\n    var s = st.z || dat.length;\n    var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n    // writing to this writes to the output buffer\n    var w = o.subarray(pre, o.length - post);\n    var lst = st.l;\n    var pos = (st.r || 0) & 7;\n    if (lvl) {\n        if (pos)\n            w[0] = st.r >> 3;\n        var opt = deo[lvl - 1];\n        var n = opt >> 13, c = opt & 8191;\n        var msk_1 = (1 << plvl) - 1;\n        //    prev 2-byte val map    curr 2-byte val map\n        var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);\n        var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n        var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n        // 24576 is an arbitrary number of maximum symbols per block\n        // 424 buffer for last block\n        var syms = new i32(25000);\n        // length/literal freq   distance freq\n        var lf = new u16(288), df = new u16(32);\n        //  l/lcnt  exbits  index          l/lind  waitdx          blkpos\n        var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;\n        for (; i + 2 < s; ++i) {\n            // hash value\n            var hv = hsh(i);\n            // index mod 32768    previous index mod\n            var imod = i & 32767, pimod = head[hv];\n            prev[imod] = pimod;\n            head[hv] = imod;\n            // We always should modify head and prev, but only add symbols if\n            // this data is not yet processed (\"wait\" for wait index)\n            if (wi <= i) {\n                // bytes remaining\n                var rem = s - i;\n                if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) {\n                    pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n                    li = lc_1 = eb = 0, bs = i;\n                    for (var j = 0; j < 286; ++j)\n                        lf[j] = 0;\n                    for (var j = 0; j < 30; ++j)\n                        df[j] = 0;\n                }\n                //  len    dist   chain\n                var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;\n                if (rem > 2 && hv == hsh(i - dif)) {\n                    var maxn = Math.min(n, rem) - 1;\n                    var maxd = Math.min(32767, i);\n                    // max possible length\n                    // not capped at dif because decompressors implement \"rolling\" index population\n                    var ml = Math.min(258, rem);\n                    while (dif <= maxd && --ch_1 && imod != pimod) {\n                        if (dat[i + l] == dat[i + l - dif]) {\n                            var nl = 0;\n                            for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n                                ;\n                            if (nl > l) {\n                                l = nl, d = dif;\n                                // break out early when we reach \"nice\" (we are satisfied enough)\n                                if (nl > maxn)\n                                    break;\n                                // now, find the rarest 2-byte sequence within this\n                                // length of literals and search for that instead.\n                                // Much faster than just using the start\n                                var mmd = Math.min(dif, nl - 2);\n                                var md = 0;\n                                for (var j = 0; j < mmd; ++j) {\n                                    var ti = i - dif + j & 32767;\n                                    var pti = prev[ti];\n                                    var cd = ti - pti & 32767;\n                                    if (cd > md)\n                                        md = cd, pimod = ti;\n                                }\n                            }\n                        }\n                        // check the previous match\n                        imod = pimod, pimod = prev[imod];\n                        dif += imod - pimod & 32767;\n                    }\n                }\n                // d will be nonzero only when a match was found\n                if (d) {\n                    // store both dist and len data in one int32\n                    // Make sure this is recognized as a len/dist with 28th bit (2^28)\n                    syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n                    var lin = revfl[l] & 31, din = revfd[d] & 31;\n                    eb += fleb[lin] + fdeb[din];\n                    ++lf[257 + lin];\n                    ++df[din];\n                    wi = i + l;\n                    ++lc_1;\n                }\n                else {\n                    syms[li++] = dat[i];\n                    ++lf[dat[i]];\n                }\n            }\n        }\n        for (i = Math.max(i, wi); i < s; ++i) {\n            syms[li++] = dat[i];\n            ++lf[dat[i]];\n        }\n        pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n        if (!lst) {\n            st.r = (pos & 7) | w[(pos / 8) | 0] << 3;\n            // shft(pos) now 1 less if pos & 7 != 0\n            pos -= 7;\n            st.h = head, st.p = prev, st.i = i, st.w = wi;\n        }\n    }\n    else {\n        for (var i = st.w || 0; i < s + lst; i += 65535) {\n            // end\n            var e = i + 65535;\n            if (e >= s) {\n                // write final block\n                w[(pos / 8) | 0] = lst;\n                e = s;\n            }\n            pos = wfblk(w, pos + 1, dat.subarray(i, e));\n        }\n        st.i = s;\n    }\n    return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n    var t = new Int32Array(256);\n    for (var i = 0; i < 256; ++i) {\n        var c = i, k = 9;\n        while (--k)\n            c = ((c & 1) && -306674912) ^ (c >>> 1);\n        t[i] = c;\n    }\n    return t;\n})();\n// CRC32\nvar crc = function () {\n    var c = -1;\n    return {\n        p: function (d) {\n            // closures have awful performance\n            var cr = c;\n            for (var i = 0; i < d.length; ++i)\n                cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n            c = cr;\n        },\n        d: function () { return ~c; }\n    };\n};\n// Adler32\nvar adler = function () {\n    var a = 1, b = 0;\n    return {\n        p: function (d) {\n            // closures have awful performance\n            var n = a, m = b;\n            var l = d.length | 0;\n            for (var i = 0; i != l;) {\n                var e = Math.min(i + 2655, l);\n                for (; i < e; ++i)\n                    m += n += d[i];\n                n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n            }\n            a = n, b = m;\n        },\n        d: function () {\n            a %= 65521, b %= 65521;\n            return (a & 255) << 24 | (a & 0xFF00) << 8 | (b & 255) << 8 | (b >> 8);\n        }\n    };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n    if (!st) {\n        st = { l: 1 };\n        if (opt.dictionary) {\n            var dict = opt.dictionary.subarray(-32768);\n            var newDat = new u8(dict.length + dat.length);\n            newDat.set(dict);\n            newDat.set(dat, dict.length);\n            dat = newDat;\n            st.w = dict.length;\n        }\n    }\n    return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n    var o = {};\n    for (var k in a)\n        o[k] = a[k];\n    for (var k in b)\n        o[k] = b[k];\n    return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n    var dt = fn();\n    var st = fn.toString();\n    var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n    for (var i = 0; i < dt.length; ++i) {\n        var v = dt[i], k = ks[i];\n        if (typeof v == 'function') {\n            fnStr += ';' + k + '=';\n            var st_1 = v.toString();\n            if (v.prototype) {\n                // for global objects\n                if (st_1.indexOf('[native code]') != -1) {\n                    var spInd = st_1.indexOf(' ', 8) + 1;\n                    fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n                }\n                else {\n                    fnStr += st_1;\n                    for (var t in v.prototype)\n                        fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n                }\n            }\n            else\n                fnStr += st_1;\n        }\n        else\n            td[k] = v;\n    }\n    return fnStr;\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n    var tl = [];\n    for (var k in v) {\n        if (v[k].buffer) {\n            tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n        }\n    }\n    return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n    if (!ch[id]) {\n        var fnStr = '', td_1 = {}, m = fns.length - 1;\n        for (var i = 0; i < m; ++i)\n            fnStr = wcln(fns[i], fnStr, td_1);\n        ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 };\n    }\n    var td = mrg({}, ch[id].e);\n    return wk(ch[id].c + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, i32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gopt]; };\nvar bDflt = function () { return [u8, u16, i32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zls]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get opts\nvar gopt = function (o) { return o && {\n    out: o.size && new u8(o.size),\n    dictionary: o.dictionary\n}; };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n    var w = wrkr(fns, init, id, function (err, dat) {\n        w.terminate();\n        cb(err, dat);\n    });\n    w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n    return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n    strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n    return function (ev) {\n        if (ev.data.length) {\n            strm.push(ev.data[0], ev.data[1]);\n            postMessage([ev.data[0].length]);\n        }\n        else\n            strm.flush();\n    };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id, flush, ext) {\n    var t;\n    var w = wrkr(fns, init, id, function (err, dat) {\n        if (err)\n            w.terminate(), strm.ondata.call(strm, err);\n        else if (!Array.isArray(dat))\n            ext(dat);\n        else if (dat.length == 1) {\n            strm.queuedSize -= dat[0];\n            if (strm.ondrain)\n                strm.ondrain(dat[0]);\n        }\n        else {\n            if (dat[1])\n                w.terminate();\n            strm.ondata.call(strm, err, dat[0], dat[1]);\n        }\n    });\n    w.postMessage(opts);\n    strm.queuedSize = 0;\n    strm.push = function (d, f) {\n        if (!strm.ondata)\n            err(5);\n        if (t)\n            strm.ondata(err(4, 0, 1), null, !!f);\n        strm.queuedSize += d.length;\n        w.postMessage([d, t = f], [d.buffer]);\n    };\n    strm.terminate = function () { w.terminate(); };\n    if (flush) {\n        strm.flush = function () { w.postMessage([]); };\n    }\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n    for (; v; ++b)\n        d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n    var fn = o.filename;\n    c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n    if (o.mtime != 0)\n        wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n    if (fn) {\n        c[3] = 8;\n        for (var i = 0; i <= fn.length; ++i)\n            c[i + 10] = fn.charCodeAt(i);\n    }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n    if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n        err(6, 'invalid gzip data');\n    var flg = d[3];\n    var st = 10;\n    if (flg & 4)\n        st += (d[10] | d[11] << 8) + 2;\n    for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n        ;\n    return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n    var l = d.length;\n    return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + (o.filename ? o.filename.length + 1 : 0); };\n// zlib header\nvar zlh = function (c, o) {\n    var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n    c[0] = 120, c[1] = (fl << 6) | (o.dictionary && 32);\n    c[1] |= 31 - ((c[0] << 8) | c[1]) % 31;\n    if (o.dictionary) {\n        var h = adler();\n        h.p(o.dictionary);\n        wbytes(c, 2, h.d());\n    }\n};\n// zlib start\nvar zls = function (d, dict) {\n    if ((d[0] & 15) != 8 || (d[0] >> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n        err(6, 'invalid zlib data');\n    if ((d[1] >> 5 & 1) == +!dict)\n        err(6, 'invalid zlib data: ' + (d[1] & 32 ? 'need' : 'unexpected') + ' dictionary');\n    return (d[1] >> 3 & 4) + 2;\n};\nfunction StrmOpt(opts, cb) {\n    if (typeof opts == 'function')\n        cb = opts, opts = {};\n    this.ondata = cb;\n    return opts;\n}\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n    function Deflate(opts, cb) {\n        if (typeof opts == 'function')\n            cb = opts, opts = {};\n        this.ondata = cb;\n        this.o = opts || {};\n        this.s = { l: 0, i: 32768, w: 32768, z: 32768 };\n        // Buffer length must always be 0 mod 32768 for index calculations to be correct when modifying head and prev\n        // 98304 = 32768 (lookback) + 65536 (common chunk size)\n        this.b = new u8(98304);\n        if (this.o.dictionary) {\n            var dict = this.o.dictionary.subarray(-32768);\n            this.b.set(dict, 32768 - dict.length);\n            this.s.i = 32768 - dict.length;\n        }\n    }\n    Deflate.prototype.p = function (c, f) {\n        this.ondata(dopt(c, this.o, 0, 0, this.s), f);\n    };\n    /**\n     * Pushes a chunk to be deflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Deflate.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        if (this.s.l)\n            err(4);\n        var endLen = chunk.length + this.s.z;\n        if (endLen > this.b.length) {\n            if (endLen > 2 * this.b.length - 32768) {\n                var newBuf = new u8(endLen & -32768);\n                newBuf.set(this.b.subarray(0, this.s.z));\n                this.b = newBuf;\n            }\n            var split = this.b.length - this.s.z;\n            this.b.set(chunk.subarray(0, split), this.s.z);\n            this.s.z = this.b.length;\n            this.p(this.b, false);\n            this.b.set(this.b.subarray(-32768));\n            this.b.set(chunk.subarray(split), 32768);\n            this.s.z = chunk.length - split + 32768;\n            this.s.i = 32766, this.s.w = 32768;\n        }\n        else {\n            this.b.set(chunk, this.s.z);\n            this.s.z += chunk.length;\n        }\n        this.s.l = final & 1;\n        if (this.s.z > this.s.w + 8191 || final) {\n            this.p(this.b, final || false);\n            this.s.w = this.s.i, this.s.i -= 2;\n        }\n    };\n    /**\n     * Flushes buffered uncompressed data. Useful to immediately retrieve the\n     * deflated output for small inputs.\n     */\n    Deflate.prototype.flush = function () {\n        if (!this.ondata)\n            err(5);\n        if (this.s.l)\n            err(4);\n        this.p(this.b, false);\n        this.s.w = this.s.i, this.s.i -= 2;\n    };\n    return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n    function AsyncDeflate(opts, cb) {\n        astrmify([\n            bDflt,\n            function () { return [astrm, Deflate]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Deflate(ev.data);\n            onmessage = astrm(strm);\n        }, 6, 1);\n    }\n    return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bDflt,\n    ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n    return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n    function Inflate(opts, cb) {\n        // no StrmOpt here to avoid adding to workerizer\n        if (typeof opts == 'function')\n            cb = opts, opts = {};\n        this.ondata = cb;\n        var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);\n        this.s = { i: 0, b: dict ? dict.length : 0 };\n        this.o = new u8(32768);\n        this.p = new u8(0);\n        if (dict)\n            this.o.set(dict);\n    }\n    Inflate.prototype.e = function (c) {\n        if (!this.ondata)\n            err(5);\n        if (this.d)\n            err(4);\n        if (!this.p.length)\n            this.p = c;\n        else if (c.length) {\n            var n = new u8(this.p.length + c.length);\n            n.set(this.p), n.set(c, this.p.length), this.p = n;\n        }\n    };\n    Inflate.prototype.c = function (final) {\n        this.s.i = +(this.d = final || false);\n        var bts = this.s.b;\n        var dt = inflt(this.p, this.s, this.o);\n        this.ondata(slc(dt, bts, this.s.b), this.d);\n        this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n        this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n    };\n    /**\n     * Pushes a chunk to be inflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the final chunk\n     */\n    Inflate.prototype.push = function (chunk, final) {\n        this.e(chunk), this.c(final);\n    };\n    return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n    function AsyncInflate(opts, cb) {\n        astrmify([\n            bInflt,\n            function () { return [astrm, Inflate]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Inflate(ev.data);\n            onmessage = astrm(strm);\n        }, 7, 0);\n    }\n    return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bInflt\n    ], function (ev) { return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); }, 1, cb);\n}\n/**\n * Expands DEFLATE data with no wrapper\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function inflateSync(data, opts) {\n    return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n    function Gzip(opts, cb) {\n        this.c = crc();\n        this.l = 0;\n        this.v = 1;\n        Deflate.call(this, opts, cb);\n    }\n    /**\n     * Pushes a chunk to be GZIPped\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Gzip.prototype.push = function (chunk, final) {\n        this.c.p(chunk);\n        this.l += chunk.length;\n        Deflate.prototype.push.call(this, chunk, final);\n    };\n    Gzip.prototype.p = function (c, f) {\n        var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s);\n        if (this.v)\n            gzh(raw, this.o), this.v = 0;\n        if (f)\n            wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n        this.ondata(raw, f);\n    };\n    /**\n     * Flushes buffered uncompressed data. Useful to immediately retrieve the\n     * GZIPped output for small inputs.\n     */\n    Gzip.prototype.flush = function () {\n        Deflate.prototype.flush.call(this);\n    };\n    return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n    function AsyncGzip(opts, cb) {\n        astrmify([\n            bDflt,\n            gze,\n            function () { return [astrm, Deflate, Gzip]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Gzip(ev.data);\n            onmessage = astrm(strm);\n        }, 8, 1);\n    }\n    return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bDflt,\n        gze,\n        function () { return [gzipSync]; }\n    ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n    if (!opts)\n        opts = {};\n    var c = crc(), l = data.length;\n    c.p(data);\n    var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n    return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming single or multi-member GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n    function Gunzip(opts, cb) {\n        this.v = 1;\n        this.r = 0;\n        Inflate.call(this, opts, cb);\n    }\n    /**\n     * Pushes a chunk to be GUNZIPped\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Gunzip.prototype.push = function (chunk, final) {\n        Inflate.prototype.e.call(this, chunk);\n        this.r += chunk.length;\n        if (this.v) {\n            var p = this.p.subarray(this.v - 1);\n            var s = p.length > 3 ? gzs(p) : 4;\n            if (s > p.length) {\n                if (!final)\n                    return;\n            }\n            else if (this.v > 1 && this.onmember) {\n                this.onmember(this.r - p.length);\n            }\n            this.p = p.subarray(s), this.v = 0;\n        }\n        // necessary to prevent TS from using the closure value\n        // This allows for workerization to function correctly\n        Inflate.prototype.c.call(this, final);\n        // process concatenated GZIP\n        if (this.s.f && !this.s.l && !final) {\n            this.v = shft(this.s.p) + 9;\n            this.s = { i: 0 };\n            this.o = new u8(0);\n            this.push(new u8(0), final);\n        }\n    };\n    return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming single or multi-member GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n    function AsyncGunzip(opts, cb) {\n        var _this = this;\n        astrmify([\n            bInflt,\n            guze,\n            function () { return [astrm, Inflate, Gunzip]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Gunzip(ev.data);\n            strm.onmember = function (offset) { return postMessage(offset); };\n            onmessage = astrm(strm);\n        }, 9, 0, function (offset) { return _this.onmember && _this.onmember(offset); });\n    }\n    return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bInflt,\n        guze,\n        function () { return [gunzipSync]; }\n    ], function (ev) { return pbf(gunzipSync(ev.data[0], ev.data[1])); }, 3, cb);\n}\n/**\n * Expands GZIP data\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function gunzipSync(data, opts) {\n    var st = gzs(data);\n    if (st + 8 > data.length)\n        err(6, 'invalid gzip data');\n    return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary);\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n    function Zlib(opts, cb) {\n        this.c = adler();\n        this.v = 1;\n        Deflate.call(this, opts, cb);\n    }\n    /**\n     * Pushes a chunk to be zlibbed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Zlib.prototype.push = function (chunk, final) {\n        this.c.p(chunk);\n        Deflate.prototype.push.call(this, chunk, final);\n    };\n    Zlib.prototype.p = function (c, f) {\n        var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s);\n        if (this.v)\n            zlh(raw, this.o), this.v = 0;\n        if (f)\n            wbytes(raw, raw.length - 4, this.c.d());\n        this.ondata(raw, f);\n    };\n    /**\n     * Flushes buffered uncompressed data. Useful to immediately retrieve the\n     * zlibbed output for small inputs.\n     */\n    Zlib.prototype.flush = function () {\n        Deflate.prototype.flush.call(this);\n    };\n    return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n    function AsyncZlib(opts, cb) {\n        astrmify([\n            bDflt,\n            zle,\n            function () { return [astrm, Deflate, Zlib]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Zlib(ev.data);\n            onmessage = astrm(strm);\n        }, 10, 1);\n    }\n    return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bDflt,\n        zle,\n        function () { return [zlibSync]; }\n    ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n    if (!opts)\n        opts = {};\n    var a = adler();\n    a.p(data);\n    var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4);\n    return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n    function Unzlib(opts, cb) {\n        Inflate.call(this, opts, cb);\n        this.v = opts && opts.dictionary ? 2 : 1;\n    }\n    /**\n     * Pushes a chunk to be unzlibbed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Unzlib.prototype.push = function (chunk, final) {\n        Inflate.prototype.e.call(this, chunk);\n        if (this.v) {\n            if (this.p.length < 6 && !final)\n                return;\n            this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0;\n        }\n        if (final) {\n            if (this.p.length < 4)\n                err(6, 'invalid zlib data');\n            this.p = this.p.subarray(0, -4);\n        }\n        // necessary to prevent TS from using the closure value\n        // This allows for workerization to function correctly\n        Inflate.prototype.c.call(this, final);\n    };\n    return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n    function AsyncUnzlib(opts, cb) {\n        astrmify([\n            bInflt,\n            zule,\n            function () { return [astrm, Inflate, Unzlib]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Unzlib(ev.data);\n            onmessage = astrm(strm);\n        }, 11, 0);\n    }\n    return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bInflt,\n        zule,\n        function () { return [unzlibSync]; }\n    ], function (ev) { return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); }, 5, cb);\n}\n/**\n * Expands Zlib data\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function unzlibSync(data, opts) {\n    return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n    function Decompress(opts, cb) {\n        this.o = StrmOpt.call(this, opts, cb) || {};\n        this.G = Gunzip;\n        this.I = Inflate;\n        this.Z = Unzlib;\n    }\n    // init substream\n    // overriden by AsyncDecompress\n    Decompress.prototype.i = function () {\n        var _this = this;\n        this.s.ondata = function (dat, final) {\n            _this.ondata(dat, final);\n        };\n    };\n    /**\n     * Pushes a chunk to be decompressed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Decompress.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        if (!this.s) {\n            if (this.p && this.p.length) {\n                var n = new u8(this.p.length + chunk.length);\n                n.set(this.p), n.set(chunk, this.p.length);\n            }\n            else\n                this.p = chunk;\n            if (this.p.length > 2) {\n                this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n                    ? new this.G(this.o)\n                    : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n                        ? new this.I(this.o)\n                        : new this.Z(this.o);\n                this.i();\n                this.s.push(this.p, final);\n                this.p = null;\n            }\n        }\n        else\n            this.s.push(chunk, final);\n    };\n    return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n    function AsyncDecompress(opts, cb) {\n        Decompress.call(this, opts, cb);\n        this.queuedSize = 0;\n        this.G = AsyncGunzip;\n        this.I = AsyncInflate;\n        this.Z = AsyncUnzlib;\n    }\n    AsyncDecompress.prototype.i = function () {\n        var _this = this;\n        this.s.ondata = function (err, dat, final) {\n            _this.ondata(err, dat, final);\n        };\n        this.s.ondrain = function (size) {\n            _this.queuedSize -= size;\n            if (_this.ondrain)\n                _this.ondrain(size);\n        };\n    };\n    /**\n     * Pushes a chunk to be decompressed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    AsyncDecompress.prototype.push = function (chunk, final) {\n        this.queuedSize += chunk.length;\n        Decompress.prototype.push.call(this, chunk, final);\n    };\n    return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n        ? gunzip(data, opts, cb)\n        : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n            ? inflate(data, opts, cb)\n            : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, opts) {\n    return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n        ? gunzipSync(data, opts)\n        : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n            ? inflateSync(data, opts)\n            : unzlibSync(data, opts);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n    for (var k in d) {\n        var val = d[k], n = p + k, op = o;\n        if (Array.isArray(val))\n            op = mrg(o, val[1]), val = val[0];\n        if (val instanceof u8)\n            t[n] = [val, op];\n        else {\n            t[n += '/'] = [new u8(0), op];\n            fltn(val, n, t, o);\n        }\n    }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n    td.decode(et, { stream: true });\n    tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n    for (var r = '', i = 0;;) {\n        var c = d[i++];\n        var eb = (c > 127) + (c > 223) + (c > 239);\n        if (i + eb > d.length)\n            return { s: r, r: slc(d, i - 1) };\n        if (!eb)\n            r += String.fromCharCode(c);\n        else if (eb == 3) {\n            c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n                r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n        }\n        else if (eb & 1)\n            r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n        else\n            r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n    }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n    /**\n     * Creates a UTF-8 decoding stream\n     * @param cb The callback to call whenever data is decoded\n     */\n    function DecodeUTF8(cb) {\n        this.ondata = cb;\n        if (tds)\n            this.t = new TextDecoder();\n        else\n            this.p = et;\n    }\n    /**\n     * Pushes a chunk to be decoded from UTF-8 binary\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    DecodeUTF8.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        final = !!final;\n        if (this.t) {\n            this.ondata(this.t.decode(chunk, { stream: true }), final);\n            if (final) {\n                if (this.t.decode().length)\n                    err(8);\n                this.t = null;\n            }\n            return;\n        }\n        if (!this.p)\n            err(4);\n        var dat = new u8(this.p.length + chunk.length);\n        dat.set(this.p);\n        dat.set(chunk, this.p.length);\n        var _a = dutf8(dat), s = _a.s, r = _a.r;\n        if (final) {\n            if (r.length)\n                err(8);\n            this.p = null;\n        }\n        else\n            this.p = r;\n        this.ondata(s, final);\n    };\n    return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n    /**\n     * Creates a UTF-8 decoding stream\n     * @param cb The callback to call whenever data is encoded\n     */\n    function EncodeUTF8(cb) {\n        this.ondata = cb;\n    }\n    /**\n     * Pushes a chunk to be encoded to UTF-8\n     * @param chunk The string data to push\n     * @param final Whether this is the last chunk\n     */\n    EncodeUTF8.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        if (this.d)\n            err(4);\n        this.ondata(strToU8(chunk), this.d = final || false);\n    };\n    return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n *               not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n    if (latin1) {\n        var ar_1 = new u8(str.length);\n        for (var i = 0; i < str.length; ++i)\n            ar_1[i] = str.charCodeAt(i);\n        return ar_1;\n    }\n    if (te)\n        return te.encode(str);\n    var l = str.length;\n    var ar = new u8(str.length + (str.length >> 1));\n    var ai = 0;\n    var w = function (v) { ar[ai++] = v; };\n    for (var i = 0; i < l; ++i) {\n        if (ai + 5 > ar.length) {\n            var n = new u8(ai + 8 + ((l - i) << 1));\n            n.set(ar);\n            ar = n;\n        }\n        var c = str.charCodeAt(i);\n        if (c < 128 || latin1)\n            w(c);\n        else if (c < 2048)\n            w(192 | (c >> 6)), w(128 | (c & 63));\n        else if (c > 55295 && c < 57344)\n            c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n                w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n        else\n            w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n    }\n    return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n *               not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n    if (latin1) {\n        var r = '';\n        for (var i = 0; i < dat.length; i += 16384)\n            r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n        return r;\n    }\n    else if (td) {\n        return td.decode(dat);\n    }\n    else {\n        var _a = dutf8(dat), s = _a.s, r = _a.r;\n        if (r.length)\n            err(8);\n        return s;\n    }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n    var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl, bs = b4(d, b + 20);\n    var _a = z && bs == 4294967295 ? z64e(d, es) : [bs, b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];\n    return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];\n};\n// read zip64 extra field\nvar z64e = function (d, b) {\n    for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))\n        ;\n    return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)];\n};\n// extra field length\nvar exfl = function (ex) {\n    var le = 0;\n    if (ex) {\n        for (var k in ex) {\n            var l = ex[k].length;\n            if (l > 65535)\n                err(9);\n            le += l + 4;\n        }\n    }\n    return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n    var fl = fn.length, ex = f.extra, col = co && co.length;\n    var exl = exfl(ex);\n    wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n    if (ce != null)\n        d[b++] = 20, d[b++] = f.os;\n    d[b] = 20, b += 2; // spec compliance? what's that?\n    d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8;\n    d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n    var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n    if (y < 0 || y > 119)\n        err(10);\n    wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4;\n    if (c != -1) {\n        wbytes(d, b, f.crc);\n        wbytes(d, b + 4, c < 0 ? -c - 2 : c);\n        wbytes(d, b + 8, f.size);\n    }\n    wbytes(d, b + 12, fl);\n    wbytes(d, b + 14, exl), b += 16;\n    if (ce != null) {\n        wbytes(d, b, col);\n        wbytes(d, b + 6, f.attrs);\n        wbytes(d, b + 10, ce), b += 14;\n    }\n    d.set(fn, b);\n    b += fl;\n    if (exl) {\n        for (var k in ex) {\n            var exf = ex[k], l = exf.length;\n            wbytes(d, b, +k);\n            wbytes(d, b + 2, l);\n            d.set(exf, b + 4), b += 4 + l;\n        }\n    }\n    if (col)\n        d.set(co, b), b += col;\n    return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n    wbytes(o, b, 0x6054B50); // skip disk\n    wbytes(o, b + 8, c);\n    wbytes(o, b + 10, c);\n    wbytes(o, b + 12, d);\n    wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n    /**\n     * Creates a pass-through stream that can be added to ZIP archives\n     * @param filename The filename to associate with this data stream\n     */\n    function ZipPassThrough(filename) {\n        this.filename = filename;\n        this.c = crc();\n        this.size = 0;\n        this.compression = 0;\n    }\n    /**\n     * Processes a chunk and pushes to the output stream. You can override this\n     * method in a subclass for custom behavior, but by default this passes\n     * the data through. You must call this.ondata(err, chunk, final) at some\n     * point in this method.\n     * @param chunk The chunk to process\n     * @param final Whether this is the last chunk\n     */\n    ZipPassThrough.prototype.process = function (chunk, final) {\n        this.ondata(null, chunk, final);\n    };\n    /**\n     * Pushes a chunk to be added. If you are subclassing this with a custom\n     * compression algorithm, note that you must push data from the source\n     * file only, pre-compression.\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    ZipPassThrough.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        this.c.p(chunk);\n        this.size += chunk.length;\n        if (final)\n            this.crc = this.c.d();\n        this.process(chunk, final || false);\n    };\n    return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates a DEFLATE stream that can be added to ZIP archives\n     * @param filename The filename to associate with this data stream\n     * @param opts The compression options\n     */\n    function ZipDeflate(filename, opts) {\n        var _this = this;\n        if (!opts)\n            opts = {};\n        ZipPassThrough.call(this, filename);\n        this.d = new Deflate(opts, function (dat, final) {\n            _this.ondata(null, dat, final);\n        });\n        this.compression = 8;\n        this.flag = dbf(opts.level);\n    }\n    ZipDeflate.prototype.process = function (chunk, final) {\n        try {\n            this.d.push(chunk, final);\n        }\n        catch (e) {\n            this.ondata(e, null, final);\n        }\n    };\n    /**\n     * Pushes a chunk to be deflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    ZipDeflate.prototype.push = function (chunk, final) {\n        ZipPassThrough.prototype.push.call(this, chunk, final);\n    };\n    return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates an asynchronous DEFLATE stream that can be added to ZIP archives\n     * @param filename The filename to associate with this data stream\n     * @param opts The compression options\n     */\n    function AsyncZipDeflate(filename, opts) {\n        var _this = this;\n        if (!opts)\n            opts = {};\n        ZipPassThrough.call(this, filename);\n        this.d = new AsyncDeflate(opts, function (err, dat, final) {\n            _this.ondata(err, dat, final);\n        });\n        this.compression = 8;\n        this.flag = dbf(opts.level);\n        this.terminate = this.d.terminate;\n    }\n    AsyncZipDeflate.prototype.process = function (chunk, final) {\n        this.d.push(chunk, final);\n    };\n    /**\n     * Pushes a chunk to be deflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    AsyncZipDeflate.prototype.push = function (chunk, final) {\n        ZipPassThrough.prototype.push.call(this, chunk, final);\n    };\n    return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n    /**\n     * Creates an empty ZIP archive to which files can be added\n     * @param cb The callback to call whenever data for the generated ZIP archive\n     *           is available\n     */\n    function Zip(cb) {\n        this.ondata = cb;\n        this.u = [];\n        this.d = 1;\n    }\n    /**\n     * Adds a file to the ZIP archive\n     * @param file The file stream to add\n     */\n    Zip.prototype.add = function (file) {\n        var _this = this;\n        if (!this.ondata)\n            err(5);\n        // finishing or finished\n        if (this.d & 2)\n            this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n        else {\n            var f = strToU8(file.filename), fl_1 = f.length;\n            var com = file.comment, o = com && strToU8(com);\n            var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n            var hl_1 = fl_1 + exfl(file.extra) + 30;\n            if (fl_1 > 65535)\n                this.ondata(err(11, 0, 1), null, false);\n            var header = new u8(hl_1);\n            wzh(header, 0, file, f, u, -1);\n            var chks_1 = [header];\n            var pAll_1 = function () {\n                for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n                    var chk = chks_2[_i];\n                    _this.ondata(null, chk, false);\n                }\n                chks_1 = [];\n            };\n            var tr_1 = this.d;\n            this.d = 0;\n            var ind_1 = this.u.length;\n            var uf_1 = mrg(file, {\n                f: f,\n                u: u,\n                o: o,\n                t: function () {\n                    if (file.terminate)\n                        file.terminate();\n                },\n                r: function () {\n                    pAll_1();\n                    if (tr_1) {\n                        var nxt = _this.u[ind_1 + 1];\n                        if (nxt)\n                            nxt.r();\n                        else\n                            _this.d = 1;\n                    }\n                    tr_1 = 1;\n                }\n            });\n            var cl_1 = 0;\n            file.ondata = function (err, dat, final) {\n                if (err) {\n                    _this.ondata(err, dat, final);\n                    _this.terminate();\n                }\n                else {\n                    cl_1 += dat.length;\n                    chks_1.push(dat);\n                    if (final) {\n                        var dd = new u8(16);\n                        wbytes(dd, 0, 0x8074B50);\n                        wbytes(dd, 4, file.crc);\n                        wbytes(dd, 8, cl_1);\n                        wbytes(dd, 12, file.size);\n                        chks_1.push(dd);\n                        uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n                        if (tr_1)\n                            uf_1.r();\n                        tr_1 = 1;\n                    }\n                    else if (tr_1)\n                        pAll_1();\n                }\n            };\n            this.u.push(uf_1);\n        }\n    };\n    /**\n     * Ends the process of adding files and prepares to emit the final chunks.\n     * This *must* be called after adding all desired files for the resulting\n     * ZIP file to work properly.\n     */\n    Zip.prototype.end = function () {\n        var _this = this;\n        if (this.d & 2) {\n            this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n            return;\n        }\n        if (this.d)\n            this.e();\n        else\n            this.u.push({\n                r: function () {\n                    if (!(_this.d & 1))\n                        return;\n                    _this.u.splice(-1, 1);\n                    _this.e();\n                },\n                t: function () { }\n            });\n        this.d = 3;\n    };\n    Zip.prototype.e = function () {\n        var bt = 0, l = 0, tl = 0;\n        for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n            var f = _a[_i];\n            tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n        }\n        var out = new u8(tl + 22);\n        for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n            var f = _c[_b];\n            wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o);\n            bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n        }\n        wzf(out, bt, this.u.length, tl, l);\n        this.ondata(null, out, true);\n        this.d = 2;\n    };\n    /**\n     * A method to terminate any internal workers used by the stream. Subsequent\n     * calls to add() will fail.\n     */\n    Zip.prototype.terminate = function () {\n        for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n            var f = _a[_i];\n            f.t();\n        }\n        this.d = 2;\n    };\n    return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    var r = {};\n    fltn(data, '', r, opts);\n    var k = Object.keys(r);\n    var lft = k.length, o = 0, tot = 0;\n    var slft = lft, files = new Array(lft);\n    var term = [];\n    var tAll = function () {\n        for (var i = 0; i < term.length; ++i)\n            term[i]();\n    };\n    var cbd = function (a, b) {\n        mt(function () { cb(a, b); });\n    };\n    mt(function () { cbd = cb; });\n    var cbf = function () {\n        var out = new u8(tot + 22), oe = o, cdl = tot - o;\n        tot = 0;\n        for (var i = 0; i < slft; ++i) {\n            var f = files[i];\n            try {\n                var l = f.c.length;\n                wzh(out, tot, f, f.f, f.u, l);\n                var badd = 30 + f.f.length + exfl(f.extra);\n                var loc = tot + badd;\n                out.set(f.c, loc);\n                wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n            }\n            catch (e) {\n                return cbd(e, null);\n            }\n        }\n        wzf(out, o, files.length, cdl, oe);\n        cbd(null, out);\n    };\n    if (!lft)\n        cbf();\n    var _loop_1 = function (i) {\n        var fn = k[i];\n        var _a = r[fn], file = _a[0], p = _a[1];\n        var c = crc(), size = file.length;\n        c.p(file);\n        var f = strToU8(fn), s = f.length;\n        var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n        var exl = exfl(p.extra);\n        var compression = p.level == 0 ? 0 : 8;\n        var cbl = function (e, d) {\n            if (e) {\n                tAll();\n                cbd(e, null);\n            }\n            else {\n                var l = d.length;\n                files[i] = mrg(p, {\n                    size: size,\n                    crc: c.d(),\n                    c: d,\n                    f: f,\n                    m: m,\n                    u: s != fn.length || (m && (com.length != ms)),\n                    compression: compression\n                });\n                o += 30 + s + exl + l;\n                tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n                if (!--lft)\n                    cbf();\n            }\n        };\n        if (s > 65535)\n            cbl(err(11, 0, 1), null);\n        if (!compression)\n            cbl(null, file);\n        else if (size < 160000) {\n            try {\n                cbl(null, deflateSync(file, p));\n            }\n            catch (e) {\n                cbl(e, null);\n            }\n        }\n        else\n            term.push(deflate(file, p, cbl));\n    };\n    // Cannot use lft because it can decrease\n    for (var i = 0; i < slft; ++i) {\n        _loop_1(i);\n    }\n    return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n    if (!opts)\n        opts = {};\n    var r = {};\n    var files = [];\n    fltn(data, '', r, opts);\n    var o = 0;\n    var tot = 0;\n    for (var fn in r) {\n        var _a = r[fn], file = _a[0], p = _a[1];\n        var compression = p.level == 0 ? 0 : 8;\n        var f = strToU8(fn), s = f.length;\n        var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n        var exl = exfl(p.extra);\n        if (s > 65535)\n            err(11);\n        var d = compression ? deflateSync(file, p) : file, l = d.length;\n        var c = crc();\n        c.p(file);\n        files.push(mrg(p, {\n            size: file.length,\n            crc: c.d(),\n            c: d,\n            f: f,\n            m: m,\n            u: s != fn.length || (m && (com.length != ms)),\n            o: o,\n            compression: compression\n        }));\n        o += 30 + s + exl + l;\n        tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n    }\n    var out = new u8(tot + 22), oe = o, cdl = tot - o;\n    for (var i = 0; i < files.length; ++i) {\n        var f = files[i];\n        wzh(out, f.o, f, f.f, f.u, f.c.length);\n        var badd = 30 + f.f.length + exfl(f.extra);\n        out.set(f.c, f.o + badd);\n        wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n    }\n    wzf(out, o, files.length, cdl, oe);\n    return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n    function UnzipPassThrough() {\n    }\n    UnzipPassThrough.prototype.push = function (data, final) {\n        this.ondata(null, data, final);\n    };\n    UnzipPassThrough.compression = 0;\n    return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates a DEFLATE decompression that can be used in ZIP archives\n     */\n    function UnzipInflate() {\n        var _this = this;\n        this.i = new Inflate(function (dat, final) {\n            _this.ondata(null, dat, final);\n        });\n    }\n    UnzipInflate.prototype.push = function (data, final) {\n        try {\n            this.i.push(data, final);\n        }\n        catch (e) {\n            this.ondata(e, null, final);\n        }\n    };\n    UnzipInflate.compression = 8;\n    return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates a DEFLATE decompression that can be used in ZIP archives\n     */\n    function AsyncUnzipInflate(_, sz) {\n        var _this = this;\n        if (sz < 320000) {\n            this.i = new Inflate(function (dat, final) {\n                _this.ondata(null, dat, final);\n            });\n        }\n        else {\n            this.i = new AsyncInflate(function (err, dat, final) {\n                _this.ondata(err, dat, final);\n            });\n            this.terminate = this.i.terminate;\n        }\n    }\n    AsyncUnzipInflate.prototype.push = function (data, final) {\n        if (this.i.terminate)\n            data = slc(data, 0);\n        this.i.push(data, final);\n    };\n    AsyncUnzipInflate.compression = 8;\n    return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n    /**\n     * Creates a ZIP decompression stream\n     * @param cb The callback to call whenever a file in the ZIP archive is found\n     */\n    function Unzip(cb) {\n        this.onfile = cb;\n        this.k = [];\n        this.o = {\n            0: UnzipPassThrough\n        };\n        this.p = et;\n    }\n    /**\n     * Pushes a chunk to be unzipped\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Unzip.prototype.push = function (chunk, final) {\n        var _this = this;\n        if (!this.onfile)\n            err(5);\n        if (!this.p)\n            err(4);\n        if (this.c > 0) {\n            var len = Math.min(this.c, chunk.length);\n            var toAdd = chunk.subarray(0, len);\n            this.c -= len;\n            if (this.d)\n                this.d.push(toAdd, !this.c);\n            else\n                this.k[0].push(toAdd);\n            chunk = chunk.subarray(len);\n            if (chunk.length)\n                return this.push(chunk, final);\n        }\n        else {\n            var f = 0, i = 0, is = void 0, buf = void 0;\n            if (!this.p.length)\n                buf = chunk;\n            else if (!chunk.length)\n                buf = this.p;\n            else {\n                buf = new u8(this.p.length + chunk.length);\n                buf.set(this.p), buf.set(chunk, this.p.length);\n            }\n            var l = buf.length, oc = this.c, add = oc && this.d;\n            var _loop_2 = function () {\n                var _a;\n                var sig = b4(buf, i);\n                if (sig == 0x4034B50) {\n                    f = 1, is = i;\n                    this_1.d = null;\n                    this_1.c = 0;\n                    var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n                    if (l > i + 30 + fnl + es) {\n                        var chks_3 = [];\n                        this_1.k.unshift(chks_3);\n                        f = 2;\n                        var sc_1 = b4(buf, i + 18), su_1 = b4(buf, i + 22);\n                        var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n                        if (sc_1 == 4294967295) {\n                            _a = dd ? [-2] : z64e(buf, i), sc_1 = _a[0], su_1 = _a[1];\n                        }\n                        else if (dd)\n                            sc_1 = -1;\n                        i += es;\n                        this_1.c = sc_1;\n                        var d_1;\n                        var file_1 = {\n                            name: fn_1,\n                            compression: cmp_1,\n                            start: function () {\n                                if (!file_1.ondata)\n                                    err(5);\n                                if (!sc_1)\n                                    file_1.ondata(null, et, true);\n                                else {\n                                    var ctr = _this.o[cmp_1];\n                                    if (!ctr)\n                                        file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n                                    d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n                                    d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n                                    for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n                                        var dat = chks_4[_i];\n                                        d_1.push(dat, false);\n                                    }\n                                    if (_this.k[0] == chks_3 && _this.c)\n                                        _this.d = d_1;\n                                    else\n                                        d_1.push(et, true);\n                                }\n                            },\n                            terminate: function () {\n                                if (d_1 && d_1.terminate)\n                                    d_1.terminate();\n                            }\n                        };\n                        if (sc_1 >= 0)\n                            file_1.size = sc_1, file_1.originalSize = su_1;\n                        this_1.onfile(file_1);\n                    }\n                    return \"break\";\n                }\n                else if (oc) {\n                    if (sig == 0x8074B50) {\n                        is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n                        return \"break\";\n                    }\n                    else if (sig == 0x2014B50) {\n                        is = i -= 4, f = 3, this_1.c = 0;\n                        return \"break\";\n                    }\n                }\n            };\n            var this_1 = this;\n            for (; i < l - 4; ++i) {\n                var state_1 = _loop_2();\n                if (state_1 === \"break\")\n                    break;\n            }\n            this.p = et;\n            if (oc < 0) {\n                var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n                if (add)\n                    add.push(dat, !!f);\n                else\n                    this.k[+(f == 2)].push(dat);\n            }\n            if (f & 2)\n                return this.push(buf.subarray(i), final);\n            this.p = buf.subarray(i);\n        }\n        if (final) {\n            if (this.c)\n                err(13);\n            this.p = null;\n        }\n    };\n    /**\n     * Registers a decoder with the stream, allowing for files compressed with\n     * the compression type provided to be expanded correctly\n     * @param decoder The decoder constructor\n     */\n    Unzip.prototype.register = function (decoder) {\n        this.o[decoder.compression] = decoder;\n    };\n    return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    var term = [];\n    var tAll = function () {\n        for (var i = 0; i < term.length; ++i)\n            term[i]();\n    };\n    var files = {};\n    var cbd = function (a, b) {\n        mt(function () { cb(a, b); });\n    };\n    mt(function () { cbd = cb; });\n    var e = data.length - 22;\n    for (; b4(data, e) != 0x6054B50; --e) {\n        if (!e || data.length - e > 65558) {\n            cbd(err(13, 0, 1), null);\n            return tAll;\n        }\n    }\n    ;\n    var lft = b2(data, e + 8);\n    if (lft) {\n        var c = lft;\n        var o = b4(data, e + 16);\n        var z = o == 4294967295 || c == 65535;\n        if (z) {\n            var ze = b4(data, e - 12);\n            z = b4(data, ze) == 0x6064B50;\n            if (z) {\n                c = lft = b4(data, ze + 32);\n                o = b4(data, ze + 48);\n            }\n        }\n        var fltr = opts && opts.filter;\n        var _loop_3 = function (i) {\n            var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n            o = no;\n            var cbl = function (e, d) {\n                if (e) {\n                    tAll();\n                    cbd(e, null);\n                }\n                else {\n                    if (d)\n                        files[fn] = d;\n                    if (!--lft)\n                        cbd(null, files);\n                }\n            };\n            if (!fltr || fltr({\n                name: fn,\n                size: sc,\n                originalSize: su,\n                compression: c_1\n            })) {\n                if (!c_1)\n                    cbl(null, slc(data, b, b + sc));\n                else if (c_1 == 8) {\n                    var infl = data.subarray(b, b + sc);\n                    // Synchronously decompress under 512KB, or barely-compressed data\n                    if (su < 524288 || sc > 0.8 * su) {\n                        try {\n                            cbl(null, inflateSync(infl, { out: new u8(su) }));\n                        }\n                        catch (e) {\n                            cbl(e, null);\n                        }\n                    }\n                    else\n                        term.push(inflate(infl, { size: su }, cbl));\n                }\n                else\n                    cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n            }\n            else\n                cbl(null, null);\n        };\n        for (var i = 0; i < c; ++i) {\n            _loop_3(i);\n        }\n    }\n    else\n        cbd(null, {});\n    return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n    var files = {};\n    var e = data.length - 22;\n    for (; b4(data, e) != 0x6054B50; --e) {\n        if (!e || data.length - e > 65558)\n            err(13);\n    }\n    ;\n    var c = b2(data, e + 8);\n    if (!c)\n        return {};\n    var o = b4(data, e + 16);\n    var z = o == 4294967295 || c == 65535;\n    if (z) {\n        var ze = b4(data, e - 12);\n        z = b4(data, ze) == 0x6064B50;\n        if (z) {\n            c = b4(data, ze + 32);\n            o = b4(data, ze + 48);\n        }\n    }\n    var fltr = opts && opts.filter;\n    for (var i = 0; i < c; ++i) {\n        var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n        o = no;\n        if (!fltr || fltr({\n            name: fn,\n            size: sc,\n            originalSize: su,\n            compression: c_2\n        })) {\n            if (!c_2)\n                files[fn] = slc(data, b, b + sc);\n            else if (c_2 == 8)\n                files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });\n            else\n                err(14, 'unknown compression type ' + c_2);\n        }\n    }\n    return files;\n}\n","// @noflow\n/* eslint-disable no-undef */\n/* eslint-disable camelcase */\nimport {gunzipSync} from 'fflate';\n\n/** @typedef { import(\"./types/types\").TCodec } TCodec */\n\n/** @type { { [key: string]: string } } */\nconst DS_TYPES = {gzip_data: 'gzip'};\n\n/**\n * Decompress a n array of bytes\n *\n * @param {Buffer | Uint8Array} bytes - input bytes\n * @param {TCodec} codec - codec with which data is compressed\n * @return {Promise<Uint8Array | ArrayBuffer>} Promise which resolves with unzipped data\n */\nexport default function decompress(bytes, codec) {\n    // @ts-ignore\n    if (!globalThis.DecompressionStream) {\n        switch (codec) {\n        case 'gzip_data':\n            return Promise.resolve(gunzipSync(bytes));\n        }\n    }\n\n    const decompressionStreamType = DS_TYPES[codec];\n    if (!decompressionStreamType) {\n        throw new Error(`Unhandled codec: ${codec}`);\n    }\n\n    /** @ts-ignore */\n    const ds = new globalThis.DecompressionStream(decompressionStreamType);\n\n    return new Response(new Blob([bytes]).stream().pipeThrough(ds))\n        .arrayBuffer()\n        .then((buf) => new Uint8Array(buf));\n}\n","// @noflow\n/* eslint-disable camelcase */\n\nimport {TileHeader, NumericData} from './mrt_pbf_decoder.js';\nimport {lru} from 'tiny-lru';\nimport deltaDecode from './filters/delta.js';\nimport zigzagDecode from './filters/zigzag.js';\nimport bitshuffleDecode from './filters/bitshuffle.js';\n// eslint-disable-next-line import/no-named-as-default\nimport MRTError from './error.js';\n\nimport decompress from './decompress.js';\nimport Pbf from 'pbf';\n\n/** @typedef { import(\"pbf\") } Pbf; */\n/** @typedef { import(\"./types/types\").TArrayLike } TArrayLike; */\n/** @typedef { import(\"./types/types\").TDataRange } TDataRange; */\n/** @typedef { import(\"./types/types\").TBlockReference } TBlockReference; */\n/** @typedef { import(\"./types/types\").TRasterLayerConfig } TRasterLayerConfig; */\n/** @typedef { import(\"./types/types\").TBandViewRGBA } TBandViewRGBA; */\n/** @typedef { import(\"./types/types\").TPbfRasterTileData } TPbfRasterTileData */\n/** @typedef { import(\"./types/types\").TProcessingTask } TProcessingTask */\n/** @typedef { import(\"./types/types\").TProcessingBatch } TProcessingBatch */\n/** @typedef { import(\"./types/types\").TDecodingResult } TDecodingResult */\n/** @typedef { import(\"./types/types\").TPbfDataIndexEntry } TPbfDataIndexEntry */\n/** @typedef { import(\"./types/types\").TPixelFormat } TPixelFormat */\n\nconst MRT_VERSION = 1;\n\n/** @type { { [key: number]: TPixelFormat } } */\nconst PIXEL_FORMAT = {\n    0: 'uint32',\n    1: 'uint32',\n    2: 'uint16',\n    3: 'uint8',\n};\n\nconst PIXEL_FORMAT_TO_DIM_LEN = {\n    uint32: 1,\n    uint16: 2,\n    uint8: 4,\n};\n\nconst PIXEL_FORMAT_TO_CTOR = {\n    uint32: Uint32Array,\n    uint16: Uint16Array,\n    uint8: Uint8Array,\n};\n\nclass MapboxRasterTile {\n    /**\n     * @param {number} cacheSize - number of decoded data chunks cached\n     */\n    constructor(cacheSize = 1) {\n        this.x = NaN;\n        this.y = NaN;\n        this.z = NaN;\n\n        /** @type { { [key: string]: RasterLayer } } */\n        this.layers = {};\n\n        this._cacheSize = cacheSize;\n    }\n\n    /**\n     * Get a layer instance by name\n     * @param {string} layerName - name of requested layer\n     * @return {RasterLayer?} layer instance\n     */\n    getLayer(layerName) {\n        return this.layers[layerName];\n    }\n\n    getHeaderLength(buf) {\n        const bytes = new Uint8Array(buf);\n        const view = new DataView(buf);\n        if (bytes[0] !== 0x0d) throw new MRTError('File is not a valid MRT.');\n        return view.getUint32(1, true);\n    }\n\n    /**\n     * @param {ArrayBuffer} buf - data buffer\n     * @return {MapboxRasterTile} raster tile instance\n     */\n    parseHeader(buf) {\n        // Validate the magic number\n        const bytes = new Uint8Array(buf);\n        // const view = new DataView(buf);\n\n        const headerLength = this.getHeaderLength(buf);\n\n        if (bytes.length < headerLength) {\n            throw new MRTError(\n                `Expected header with length >= ${headerLength} but got buffer of length ${bytes.length}`\n            );\n        }\n\n        /** @type {Pbf} */\n        const pbf = new Pbf(bytes.subarray(0, headerLength));\n\n        /** @type {TPbfRasterTileData} */\n        const meta = TileHeader.read(pbf);\n\n        // Validate the incoming tile z/x/y matches, if already initialized\n        if (\n            !isNaN(this.x) &&\n            (this.x !== meta.x || this.y !== meta.y || this.z !== meta.z)\n        ) {\n            throw new MRTError(\n                `Invalid attempt to parse header ${meta.z}/${meta.x}/${meta.y} for tile ${this.z}/${this.x}/${this.y}`\n            );\n        }\n\n        this.x = meta.x;\n        this.y = meta.y;\n        this.z = meta.z;\n\n        for (const layer of meta.layers) {\n            this.layers[layer.name] = new RasterLayer(layer, {\n                cacheSize: this._cacheSize,\n            });\n        }\n\n        return this;\n    }\n\n    /**\n     * Create a serializable representation of a data parsing task\n     * @param {TDataRange} range - range of fetched data\n     * @return {MRTDecodingBatch} processing task description\n     */\n    createDecodingTask(range) {\n        /** @type {TProcessingTask[]} */\n        const tasks = [];\n        const layer = this.getLayer(range.layerName);\n\n        for (let i = 0; i < layer.dataIndex.length; i++) {\n            const block = layer.dataIndex[i];\n            const firstByte = block.first_byte - range.firstByte;\n            const lastByte = block.last_byte + 1 - range.firstByte;\n            if (i < range.firstBlock || i > range.lastBlock) continue;\n            if (layer._blocksInProgress.has(i)) continue;\n\n            const task = {\n                layerName: layer.name,\n                firstByte,\n                lastByte,\n                pixelFormat: layer.pixelFormat,\n                blockIndex: i,\n                blockShape: [block.bands.length].concat(layer.bandShape),\n                buffer: layer.buffer,\n                codec: block.codec.codec,\n                filters: block.filters.map((f) => f.filter),\n            };\n            layer._blocksInProgress.add(i);\n            tasks.push(task);\n        }\n        const onCancel = () => {\n            tasks.forEach((task) =>\n                layer._blocksInProgress.delete(task.blockIndex)\n            );\n        };\n\n        /** @type {(err: Error, results: TDecodingResult[]) => void} */\n        const onComplete = (err, results) => {\n            tasks.forEach((task) =>\n                layer._blocksInProgress.delete(task.blockIndex)\n            );\n            if (err) throw err;\n            results.forEach((result) => {\n                this.getLayer(result.layerName).processDecodedData(result);\n            });\n        };\n\n        return new MRTDecodingBatch(tasks, onCancel, onComplete);\n    }\n}\n\nclass RasterLayer {\n    /**\n     * @param {object} pbf - layer configuration\n     * @param {number} pbf.version - major version of MRT specification with which tile was encoded\n     * @param {string} pbf.name - layer name\n     * @param {string} pbf.units - layer units\n     * @param {number} pbf.tilesize - number of rows and columns in raster data\n     * @param {number} pbf.buffer - number of pixels around the edge of each tile\n     * @param {number} pbf.pixel_format - encoded pixel format enum indicating uint32, uint16, or uint8\n     * @param {TPbfDataIndexEntry[]} pbf.data_index - index of data chunk byte offsets\n     * @param {TRasterLayerConfig} [config] - Additional configuration parameters\n     */\n    constructor(\n        {version, name, units, tilesize, pixel_format, buffer, data_index},\n        config\n    ) {\n        // Take these directly from decoded Pbf\n        this.version = version;\n        if (this.version !== MRT_VERSION) {\n            throw new MRTError(\n                `Cannot parse raster layer encoded with MRT version ${version}`\n            );\n        }\n        this.name = name;\n        this.units = units;\n        this.tileSize = tilesize;\n        this.buffer = buffer;\n        this.pixelFormat = PIXEL_FORMAT[pixel_format];\n        this.dataIndex = data_index;\n\n        this.bandShape = [\n            tilesize + 2 * buffer,\n            tilesize + 2 * buffer,\n            PIXEL_FORMAT_TO_DIM_LEN[this.pixelFormat],\n        ];\n\n        // Type script is creating more problems than it solves here:\n        const cacheSize = config ? config.cacheSize : 5;\n        this._decodedBlocks = lru(cacheSize);\n\n        this._blocksInProgress = new Set();\n    }\n\n    /**\n     * Assimilate results of data loading task\n     * @param {TDecodingResult} result - result of processing task\n     */\n    processDecodedData(result) {\n        const key = result.blockIndex.toString();\n        if (this._decodedBlocks.get(key)) return;\n        this._decodedBlocks.set(key, result.data);\n    }\n\n    /**\n     * Find block for a band sequence index\n     * @param {string|number} band - label or integer index of desired band\n     * @return {TBlockReference} - index of block and index of band within block\n     */\n    getBlockForBand(band) {\n        let blockBandStart = 0;\n        switch (typeof band) {\n        case 'string':\n            for (const [blockIndex, block] of this.dataIndex.entries()) {\n                for (const [\n                    blockBandIndex,\n                    bandName,\n                ] of block.bands.entries()) {\n                    if (bandName !== band) continue;\n                    return {\n                        bandIndex: blockBandStart + blockBandIndex,\n                        blockIndex,\n                        blockBandIndex,\n                    };\n                }\n                blockBandStart += block.bands.length;\n            }\n            break;\n        case 'number':\n            for (const [blockIndex, block] of this.dataIndex.entries()) {\n                if (\n                    band >= blockBandStart &&\n                        band < blockBandStart + block.bands.length\n                ) {\n                    return {\n                        bandIndex: band,\n                        blockIndex,\n                        blockBandIndex: band - blockBandStart,\n                    };\n                }\n                blockBandStart += block.bands.length;\n            }\n            break;\n        default:\n            throw new MRTError(\n                    `Invalid band \\`${JSON.stringify(\n                        band\n                    )}\\`. Expected string or integer.`\n            );\n        }\n        throw new MRTError(`Band not found: ${JSON.stringify(band)}`);\n    }\n\n    /**\n     * Get the byte range of a data slice, for performing a HTTP Range fetch\n     * @param {number[]} bandList - list of slices to be covered\n     * @return {TDataRange} range of data\n     */\n    getDataRange(bandList) {\n        let firstByte = Infinity;\n        let lastByte = -Infinity;\n        let firstBlock = Infinity;\n        let lastBlock = -Infinity;\n        for (const band of bandList) {\n            const {blockIndex} = this.getBlockForBand(band);\n            if (blockIndex < 0) {\n                throw new MRTError(`Invalid band: ${JSON.stringify(band)}`);\n            }\n            const block = this.dataIndex[blockIndex];\n            firstBlock = Math.min(firstBlock, blockIndex);\n            lastBlock = Math.max(lastBlock, blockIndex);\n            firstByte = Math.min(firstByte, block.first_byte);\n            lastByte = Math.max(lastByte, block.last_byte);\n        }\n        return {\n            layerName: this.name,\n            firstByte,\n            lastByte,\n            firstBlock,\n            lastBlock,\n        };\n    }\n\n    hasBand(band) {\n        const {blockIndex} = this.getBlockForBand(band);\n        return blockIndex >= 0;\n    }\n\n    /**\n     * Check if the layer has data for a given sequence band\n     * @param {number} band - sequence band\n     * @return {boolean} true if data is already available\n     */\n    hasDataForBand(band) {\n        const {blockIndex} = this.getBlockForBand(band);\n        return blockIndex >= 0 && !!this._decodedBlocks.get(blockIndex.toString());\n    }\n\n    /**\n     * Get a typed array view of data\n     * @param {number} band - sequence band\n     * @return {TBandViewRGBA} view of raster layer\n     */\n    getBandView(band) {\n        const {blockIndex, blockBandIndex} = this.getBlockForBand(band);\n\n        /** @type {Uint8Array} */\n        const data = this._decodedBlocks.get(blockIndex.toString());\n\n        if (!data) {\n            throw new MRTError(\n                `Data for band ${JSON.stringify(band)} of layer \"${\n                    this.name\n                }\" not decoded.`\n            );\n        }\n\n        const block = this.dataIndex[blockIndex];\n        const bandDataLength = this.bandShape.reduce((a, b) => a * b, 1);\n        const start = blockBandIndex * bandDataLength;\n        const view = data.subarray(start, start + bandDataLength);\n        const bytes = new Uint8Array(view.buffer).subarray(view.byteOffset, view.byteOffset + view.byteLength);\n        return {\n            data: view,\n            bytes,\n            tileSize: this.tileSize,\n            buffer: this.buffer,\n            offset: block.offset,\n            scale: block.scale,\n        };\n    }\n}\n\nclass MRTDecodingBatch {\n    /**\n     * @param {TProcessingTask[]} tasks - processing tasks\n     * @param {() => void} onCancel - callback invoked on cancel\n     * @param {(err: Error, results: TDecodingResult[]) => void} onComplete - callback invoked on completion\n     */\n    constructor(tasks, onCancel, onComplete) {\n        this.tasks = tasks;\n        this._onCancel = onCancel;\n        this._onComplete = onComplete;\n        this._finalized = false;\n    }\n\n    /**\n     * Cancel a processing task\n     * return {void}\n     */\n    cancel() {\n        if (this._finalized) return;\n        this._onCancel();\n        this._finalized = true;\n    }\n\n    /**\n     * Complete a processing task\n     * @param {Error} err - processing error, if encountered\n     * @param {TDecodingResult[]} result - result of processing\n     * return {void}\n     */\n    complete(err, result) {\n        if (this._finalized) return;\n        this._onComplete(err, result);\n        this._finalized = true;\n    }\n}\n\n/**\n * Process a data parsing task\n * @param {ArrayBufferLike} buf - data buffer\n * @param {TProcessingBatch} decodingBatch - data processing task\n * @return {Promise<TDecodingResult[]>} output of processing task\n */\nMapboxRasterTile.performDecoding = function (buf, decodingBatch) {\n    return Promise.all(\n        decodingBatch.tasks.map((task) => {\n            const {\n                layerName,\n                firstByte,\n                lastByte,\n                pixelFormat,\n                blockShape,\n                blockIndex,\n                filters,\n                codec,\n            } = task;\n\n            const bytes = new Uint8Array(buf);\n            const taskBuf = bytes.subarray(firstByte, lastByte + 1);\n            const dataLength = blockShape[0] * blockShape[1] * blockShape[2];\n            const values = new Uint32Array(dataLength);\n\n            let decoded;\n\n            switch (codec) {\n            case 'gzip_data': {\n                decoded = decompress(taskBuf, codec).then((bytes) => {\n                    const pbf = NumericData.read(new Pbf(bytes));\n                    switch (pbf.values) {\n                    case 'uint32_values': {\n                        pbf.uint32_values.readValuesInto(values);\n                        const Ctor = PIXEL_FORMAT_TO_CTOR[pixelFormat];\n                        return new Ctor(values.buffer);\n                    }\n                    default:\n                        throw new Error(\n                                    `Unhandled numeric data \"${pbf.values}\"`\n                        );\n                    }\n                });\n                break;\n            }\n            default:\n                throw new Error(`Unhandled codec: ${codec}`);\n            }\n\n            return decoded\n                .then((data) => {\n                    // Decode filters, one at a time, in reverse order\n                    for (let i = filters.length - 1; i >= 0; i--) {\n                        switch (filters[i]) {\n                        case 'delta_filter':\n                            deltaDecode(data, blockShape);\n                            break;\n                        case 'zigzag_filter':\n                            zigzagDecode(data);\n                            break;\n                        case 'bitshuffle_filter':\n                            bitshuffleDecode(data, pixelFormat);\n                            break;\n                        default:\n                            throw new Error(\n                                    `Unhandled filter \"${filters[i]}\"`\n                            );\n                        }\n                    }\n\n                    return {\n                        layerName,\n                        blockIndex,\n                        data,\n                    };\n                })\n                .catch((err) => {\n                    throw err;\n                });\n        })\n    );\n};\n\nexport {\n    MapboxRasterTile,\n    MRTError,\n    RasterLayer,\n    deltaDecode,\n    MRTDecodingBatch\n};\n","// @flow\n\nimport {register} from '../util/web_worker_transfer.js';\nimport {MRTDecodingBatch} from './mrt/mrt.js';\n\nregister(MRTDecodingBatch, 'MRTDecodingBatch', {omit: ['_onCancel', '_onComplete']});\n","\nconst ARRAY_TYPES = [\n    Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array,\n    Int32Array, Uint32Array, Float32Array, Float64Array\n];\n\n/** @typedef {Int8ArrayConstructor | Uint8ArrayConstructor | Uint8ClampedArrayConstructor | Int16ArrayConstructor | Uint16ArrayConstructor | Int32ArrayConstructor | Uint32ArrayConstructor | Float32ArrayConstructor | Float64ArrayConstructor} TypedArrayConstructor */\n\nconst VERSION = 1; // serialized format version\nconst HEADER_SIZE = 8;\n\nexport default class KDBush {\n\n    /**\n     * Creates an index from raw `ArrayBuffer` data.\n     * @param {ArrayBuffer} data\n     */\n    static from(data) {\n        if (!(data instanceof ArrayBuffer)) {\n            throw new Error('Data must be an instance of ArrayBuffer.');\n        }\n        const [magic, versionAndType] = new Uint8Array(data, 0, 2);\n        if (magic !== 0xdb) {\n            throw new Error('Data does not appear to be in a KDBush format.');\n        }\n        const version = versionAndType >> 4;\n        if (version !== VERSION) {\n            throw new Error(`Got v${version} data when expected v${VERSION}.`);\n        }\n        const ArrayType = ARRAY_TYPES[versionAndType & 0x0f];\n        if (!ArrayType) {\n            throw new Error('Unrecognized array type.');\n        }\n        const [nodeSize] = new Uint16Array(data, 2, 1);\n        const [numItems] = new Uint32Array(data, 4, 1);\n\n        return new KDBush(numItems, nodeSize, ArrayType, data);\n    }\n\n    /**\n     * Creates an index that will hold a given number of items.\n     * @param {number} numItems\n     * @param {number} [nodeSize=64] Size of the KD-tree node (64 by default).\n     * @param {TypedArrayConstructor} [ArrayType=Float64Array] The array type used for coordinates storage (`Float64Array` by default).\n     * @param {ArrayBuffer} [data] (For internal use only)\n     */\n    constructor(numItems, nodeSize = 64, ArrayType = Float64Array, data) {\n        if (isNaN(numItems) || numItems < 0) throw new Error(`Unpexpected numItems value: ${numItems}.`);\n\n        this.numItems = +numItems;\n        this.nodeSize = Math.min(Math.max(+nodeSize, 2), 65535);\n        this.ArrayType = ArrayType;\n        this.IndexArrayType = numItems < 65536 ? Uint16Array : Uint32Array;\n\n        const arrayTypeIndex = ARRAY_TYPES.indexOf(this.ArrayType);\n        const coordsByteSize = numItems * 2 * this.ArrayType.BYTES_PER_ELEMENT;\n        const idsByteSize = numItems * this.IndexArrayType.BYTES_PER_ELEMENT;\n        const padCoords = (8 - idsByteSize % 8) % 8;\n\n        if (arrayTypeIndex < 0) {\n            throw new Error(`Unexpected typed array class: ${ArrayType}.`);\n        }\n\n        if (data && (data instanceof ArrayBuffer)) { // reconstruct an index from a buffer\n            this.data = data;\n            this.ids = new this.IndexArrayType(this.data, HEADER_SIZE, numItems);\n            this.coords = new this.ArrayType(this.data, HEADER_SIZE + idsByteSize + padCoords, numItems * 2);\n            this._pos = numItems * 2;\n            this._finished = true;\n        } else { // initialize a new index\n            this.data = new ArrayBuffer(HEADER_SIZE + coordsByteSize + idsByteSize + padCoords);\n            this.ids = new this.IndexArrayType(this.data, HEADER_SIZE, numItems);\n            this.coords = new this.ArrayType(this.data, HEADER_SIZE + idsByteSize + padCoords, numItems * 2);\n            this._pos = 0;\n            this._finished = false;\n\n            // set header\n            new Uint8Array(this.data, 0, 2).set([0xdb, (VERSION << 4) + arrayTypeIndex]);\n            new Uint16Array(this.data, 2, 1)[0] = nodeSize;\n            new Uint32Array(this.data, 4, 1)[0] = numItems;\n        }\n    }\n\n    /**\n     * Add a point to the index.\n     * @param {number} x\n     * @param {number} y\n     * @returns {number} An incremental index associated with the added item (starting from `0`).\n     */\n    add(x, y) {\n        const index = this._pos >> 1;\n        this.ids[index] = index;\n        this.coords[this._pos++] = x;\n        this.coords[this._pos++] = y;\n        return index;\n    }\n\n    /**\n     * Perform indexing of the added points.\n     */\n    finish() {\n        const numAdded = this._pos >> 1;\n        if (numAdded !== this.numItems) {\n            throw new Error(`Added ${numAdded} items when expected ${this.numItems}.`);\n        }\n        // kd-sort both arrays for efficient search\n        sort(this.ids, this.coords, this.nodeSize, 0, this.numItems - 1, 0);\n\n        this._finished = true;\n        return this;\n    }\n\n    /**\n     * Search the index for items within a given bounding box.\n     * @param {number} minX\n     * @param {number} minY\n     * @param {number} maxX\n     * @param {number} maxY\n     * @returns {number[]} An array of indices correponding to the found items.\n     */\n    range(minX, minY, maxX, maxY) {\n        if (!this._finished) throw new Error('Data not yet indexed - call index.finish().');\n\n        const {ids, coords, nodeSize} = this;\n        const stack = [0, ids.length - 1, 0];\n        const result = [];\n\n        // recursively search for items in range in the kd-sorted arrays\n        while (stack.length) {\n            const axis = stack.pop() || 0;\n            const right = stack.pop() || 0;\n            const left = stack.pop() || 0;\n\n            // if we reached \"tree node\", search linearly\n            if (right - left <= nodeSize) {\n                for (let i = left; i <= right; i++) {\n                    const x = coords[2 * i];\n                    const y = coords[2 * i + 1];\n                    if (x >= minX && x <= maxX && y >= minY && y <= maxY) result.push(ids[i]);\n                }\n                continue;\n            }\n\n            // otherwise find the middle index\n            const m = (left + right) >> 1;\n\n            // include the middle item if it's in range\n            const x = coords[2 * m];\n            const y = coords[2 * m + 1];\n            if (x >= minX && x <= maxX && y >= minY && y <= maxY) result.push(ids[m]);\n\n            // queue search in halves that intersect the query\n            if (axis === 0 ? minX <= x : minY <= y) {\n                stack.push(left);\n                stack.push(m - 1);\n                stack.push(1 - axis);\n            }\n            if (axis === 0 ? maxX >= x : maxY >= y) {\n                stack.push(m + 1);\n                stack.push(right);\n                stack.push(1 - axis);\n            }\n        }\n\n        return result;\n    }\n\n    /**\n     * Search the index for items within a given radius.\n     * @param {number} qx\n     * @param {number} qy\n     * @param {number} r Query radius.\n     * @returns {number[]} An array of indices correponding to the found items.\n     */\n    within(qx, qy, r) {\n        if (!this._finished) throw new Error('Data not yet indexed - call index.finish().');\n\n        const {ids, coords, nodeSize} = this;\n        const stack = [0, ids.length - 1, 0];\n        const result = [];\n        const r2 = r * r;\n\n        // recursively search for items within radius in the kd-sorted arrays\n        while (stack.length) {\n            const axis = stack.pop() || 0;\n            const right = stack.pop() || 0;\n            const left = stack.pop() || 0;\n\n            // if we reached \"tree node\", search linearly\n            if (right - left <= nodeSize) {\n                for (let i = left; i <= right; i++) {\n                    if (sqDist(coords[2 * i], coords[2 * i + 1], qx, qy) <= r2) result.push(ids[i]);\n                }\n                continue;\n            }\n\n            // otherwise find the middle index\n            const m = (left + right) >> 1;\n\n            // include the middle item if it's in range\n            const x = coords[2 * m];\n            const y = coords[2 * m + 1];\n            if (sqDist(x, y, qx, qy) <= r2) result.push(ids[m]);\n\n            // queue search in halves that intersect the query\n            if (axis === 0 ? qx - r <= x : qy - r <= y) {\n                stack.push(left);\n                stack.push(m - 1);\n                stack.push(1 - axis);\n            }\n            if (axis === 0 ? qx + r >= x : qy + r >= y) {\n                stack.push(m + 1);\n                stack.push(right);\n                stack.push(1 - axis);\n            }\n        }\n\n        return result;\n    }\n}\n\n/**\n * @param {Uint16Array | Uint32Array} ids\n * @param {InstanceType<TypedArrayConstructor>} coords\n * @param {number} nodeSize\n * @param {number} left\n * @param {number} right\n * @param {number} axis\n */\nfunction sort(ids, coords, nodeSize, left, right, axis) {\n    if (right - left <= nodeSize) return;\n\n    const m = (left + right) >> 1; // middle index\n\n    // sort ids and coords around the middle index so that the halves lie\n    // either left/right or top/bottom correspondingly (taking turns)\n    select(ids, coords, m, left, right, axis);\n\n    // recursively kd-sort first half and second half on the opposite axis\n    sort(ids, coords, nodeSize, left, m - 1, 1 - axis);\n    sort(ids, coords, nodeSize, m + 1, right, 1 - axis);\n}\n\n/**\n * Custom Floyd-Rivest selection algorithm: sort ids and coords so that\n * [left..k-1] items are smaller than k-th item (on either x or y axis)\n * @param {Uint16Array | Uint32Array} ids\n * @param {InstanceType<TypedArrayConstructor>} coords\n * @param {number} k\n * @param {number} left\n * @param {number} right\n * @param {number} axis\n */\nfunction select(ids, coords, k, left, right, axis) {\n\n    while (right > left) {\n        if (right - left > 600) {\n            const n = right - left + 1;\n            const m = k - left + 1;\n            const z = Math.log(n);\n            const s = 0.5 * Math.exp(2 * z / 3);\n            const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);\n            const newLeft = Math.max(left, Math.floor(k - m * s / n + sd));\n            const newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));\n            select(ids, coords, k, newLeft, newRight, axis);\n        }\n\n        const t = coords[2 * k + axis];\n        let i = left;\n        let j = right;\n\n        swapItem(ids, coords, left, k);\n        if (coords[2 * right + axis] > t) swapItem(ids, coords, left, right);\n\n        while (i < j) {\n            swapItem(ids, coords, i, j);\n            i++;\n            j--;\n            while (coords[2 * i + axis] < t) i++;\n            while (coords[2 * j + axis] > t) j--;\n        }\n\n        if (coords[2 * left + axis] === t) swapItem(ids, coords, left, j);\n        else {\n            j++;\n            swapItem(ids, coords, j, right);\n        }\n\n        if (j <= k) left = j + 1;\n        if (k <= j) right = j - 1;\n    }\n}\n\n/**\n * @param {Uint16Array | Uint32Array} ids\n * @param {InstanceType<TypedArrayConstructor>} coords\n * @param {number} i\n * @param {number} j\n */\nfunction swapItem(ids, coords, i, j) {\n    swap(ids, i, j);\n    swap(coords, 2 * i, 2 * j);\n    swap(coords, 2 * i + 1, 2 * j + 1);\n}\n\n/**\n * @param {InstanceType<TypedArrayConstructor>} arr\n * @param {number} i\n * @param {number} j\n */\nfunction swap(arr, i, j) {\n    const tmp = arr[i];\n    arr[i] = arr[j];\n    arr[j] = tmp;\n}\n\n/**\n * @param {number} ax\n * @param {number} ay\n * @param {number} bx\n * @param {number} by\n */\nfunction sqDist(ax, ay, bx, by) {\n    const dx = ax - bx;\n    const dy = ay - by;\n    return dx * dx + dy * dy;\n}\n","// @flow\n\nimport {VectorTile} from '@mapbox/vector-tile';\nimport Protobuf from 'pbf';\nimport {getArrayBuffer} from '../util/ajax.js';\n\nimport type {IVectorTile} from '@mapbox/vector-tile';\nimport type {Callback} from '../types/callback.js';\nimport type {RequestedTileParameters} from './worker_source.js';\nimport type Scheduler from '../util/scheduler.js';\n\nexport type LoadVectorTileResult = {\n    rawData: ArrayBuffer;\n    vectorTile?: IVectorTile;\n    expires?: any;\n    cacheControl?: any;\n    resourceTiming?: Array<PerformanceResourceTiming>;\n};\n\n/**\n * @callback LoadVectorDataCallback\n * @param error\n * @param vectorTile\n * @private\n */\nexport type LoadVectorDataCallback = Callback<?LoadVectorTileResult>;\n\nexport type AbortVectorData = () => void;\nexport type LoadVectorData = (params: RequestedTileParameters, callback: LoadVectorDataCallback) => ?AbortVectorData;\nexport class DedupedRequest {\n    entries: { [string]: Object };\n    scheduler: ?Scheduler;\n\n    constructor(scheduler?: Scheduler) {\n        this.entries = {};\n        this.scheduler = scheduler;\n    }\n\n    request(key: string, metadata: Object, request: any, callback: LoadVectorDataCallback): (() => void) {\n        const entry = this.entries[key] = this.entries[key] || {callbacks: []};\n\n        if (entry.result) {\n            const [err, result] = entry.result;\n            if (this.scheduler) {\n                this.scheduler.add(() => {\n                    callback(err, result);\n                }, metadata);\n            } else {\n                callback(err, result);\n            }\n            return () => {};\n        }\n\n        entry.callbacks.push(callback);\n\n        if (!entry.cancel) {\n            entry.cancel = request((err, result) => {\n                entry.result = [err, result];\n                for (const cb of entry.callbacks) {\n                    if (this.scheduler) {\n                        this.scheduler.add(() => {\n                            cb(err, result);\n                        }, metadata);\n                    } else {\n                        cb(err, result);\n                    }\n                }\n                setTimeout(() => delete this.entries[key], 1000 * 3);\n            });\n        }\n\n        return () => {\n            if (entry.result) return;\n            entry.callbacks = entry.callbacks.filter(cb => cb !== callback);\n            if (!entry.callbacks.length) {\n                entry.cancel();\n                delete this.entries[key];\n            }\n        };\n    }\n}\n\n/**\n * @private\n */\n// $FlowFixMe[missing-this-annot]\nexport function loadVectorTile(params: RequestedTileParameters, callback: LoadVectorDataCallback, skipParse?: boolean): (() => void) {\n    const key = JSON.stringify(params.request);\n\n    const makeRequest = (callback: LoadVectorDataCallback) => {\n        const request = getArrayBuffer(params.request, (err: ?Error, data: ?ArrayBuffer, cacheControl: ?string, expires: ?string) => {\n            if (err) {\n                callback(err);\n            } else if (data) {\n                callback(null, {\n                    vectorTile: skipParse ? undefined : new VectorTile(new Protobuf(data)),\n                    rawData: data,\n                    cacheControl,\n                    expires\n                });\n            }\n        });\n        return () => {\n            request.cancel();\n            callback();\n        };\n    };\n\n    if (params.data) {\n        // if we already got the result earlier (on the main thread), return it directly\n        (this.deduped: DedupedRequest).entries[key] = {result: [null, params.data]};\n    }\n\n    const callbackMetadata = {type: 'parseTile', isSymbolTile: params.isSymbolTile, zoom: params.tileZoom};\n    return (this.deduped: DedupedRequest).request(key, callbackMetadata, makeRequest, callback);\n}\n","// @flow\nexport default ['type', 'source', 'source-layer', 'minzoom', 'maxzoom', 'filter', 'layout'];\n","// @flow\n\nimport {\n    PerformanceMarkers,\n    LivePerformanceUtils\n} from '../util/live_performance.js';\n\nperformance.mark('library-evaluate');\n\nimport {isWorker} from '../util/util.js';\nimport type {RequestParameters} from '../util/ajax.js';\n\nexport type PerformanceMetrics = {\n    loadTime: number,\n    fullLoadTime: number,\n    percentDroppedFrames: number,\n    parseTile: number,\n    parseTile1: number,\n    parseTile2: number,\n    workerTask: number,\n    workerInitialization: number,\n    workerEvaluateScript: number,\n    workerIdle: number,\n    workerIdlePercent: number,\n    placementTime: number,\n    timelines: Array<Object>\n};\n\nexport type PerformanceMark = {mark: string, name: string};\n\nlet fullLoadFinished = false;\nlet placementTime = 0;\n\nexport const PerformanceUtils = {\n    mark(marker: $Keys<typeof PerformanceMarkers>) {\n        LivePerformanceUtils.mark(marker);\n\n        if (marker === PerformanceMarkers.fullLoad) {\n            fullLoadFinished = true;\n        }\n    },\n    measure(name: string, begin?: string, end?: string) {\n        LivePerformanceUtils.measure(name, begin, end);\n    },\n    beginMeasure(name: string): PerformanceMark {\n        const mark = name;\n        performance.mark(mark);\n        return {\n            mark,\n            name\n        };\n    },\n    endMeasure(m: PerformanceMark) {\n        performance.measure(m.name, m.mark);\n    },\n    recordPlacementTime(time: number) {\n        // Ignore placementTimes during loading\n        if (!fullLoadFinished) {\n            return;\n        }\n\n        placementTime += time;\n    },\n    frame(timestamp: number, isRenderFrame: boolean) {\n        // $FlowFixMe[extra-arg]\n        performance.mark('frame', {\n            detail: {\n                timestamp,\n                isRenderFrame\n            }\n        });\n    },\n    clearMetrics() {\n        placementTime = 0;\n        fullLoadFinished = false;\n\n        performance.clearMeasures('loadTime');\n        performance.clearMeasures('fullLoadTime');\n\n        for (const marker in PerformanceMarkers) {\n            performance.clearMarks(PerformanceMarkers[marker]);\n        }\n    },\n\n    getPerformanceMetrics(): PerformanceMetrics {\n        const metrics = {};\n\n        performance.measure('loadTime', PerformanceMarkers.create, PerformanceMarkers.load);\n        performance.measure('fullLoadTime', PerformanceMarkers.create, PerformanceMarkers.fullLoad);\n\n        const measures = performance.getEntriesByType('measure');\n        for (const measure of measures) {\n            metrics[measure.name] = (metrics[measure.name] || 0) + measure.duration;\n        }\n\n        metrics.placementTime = placementTime;\n\n        return metrics;\n    },\n\n    getWorkerPerformanceMetrics(): { timeOrigin: string, entries: Array<Object>, scope: string } {\n        const entries = performance.getEntries().map(entry => {\n            const result = entry.toJSON();\n            // $FlowFixMe[prop-missing]\n            if (entry.detail) {\n                // $FlowFixMe[incompatible-use]\n                Object.assign(result, {\n                    detail: entry.detail\n                });\n            }\n            return result;\n        });\n        return {\n            scope: isWorker() ? 'Worker' : 'Window',\n            // $FlowFixMe[prop-missing]\n            timeOrigin: performance.timeOrigin,\n            entries\n        };\n    }\n};\n\nexport function getPerformanceMeasurement(request: ?RequestParameters): Array<PerformanceEntry> {\n    const url = request ? request.url.toString() : undefined;\n    if (!url) {\n        return [];\n    }\n    return performance.getEntriesByName(url);\n}\n\nexport default performance;\n","// @flow\n\nimport type {LayerSpecification} from './types.js';\n\nimport refProperties from './util/ref_properties.js';\n\nfunction stringify(obj: any) {\n    if (typeof obj === 'number' || typeof obj === 'boolean' || typeof obj === 'string' || obj === undefined || obj === null)\n        return JSON.stringify(obj);\n\n    if (Array.isArray(obj)) {\n        let str = '[';\n        for (const val of obj) {\n            str += `${stringify(val)},`;\n        }\n        return `${str}]`;\n    }\n\n    let str = '{';\n    for (const key of Object.keys(obj).sort()) {\n        str += `${key}:${stringify((obj: any)[key])},`;\n    }\n    return `${str}}`;\n}\n\nfunction getKey(layer: LayerSpecification) {\n    let key = '';\n    for (const k of refProperties) {\n        key += `/${stringify((layer: any)[k])}`;\n    }\n    return key;\n}\n\n/**\n * Given an array of layers, return an array of arrays of layers where all\n * layers in each group have identical layout-affecting properties. These\n * are the properties that were formerly used by explicit `ref` mechanism\n * for layers: 'type', 'source', 'source-layer', 'minzoom', 'maxzoom',\n * 'filter', and 'layout'.\n *\n * The input is not modified. The output layers are references to the\n * input layers.\n *\n * @private\n * @param {Array<Layer>} layers\n * @param {Object} [cachedKeys] - an object to keep already calculated keys.\n * @returns {Array<Array<Layer>>}\n */\nexport default function groupByLayout(layers: Array<LayerSpecification>, cachedKeys: {[id: string]: string}): Array<Array<LayerSpecification>> {\n    const groups = {};\n\n    for (let i = 0; i < layers.length; i++) {\n\n        const k = (cachedKeys && cachedKeys[layers[i].id]) || getKey(layers[i]);\n        // update the cache if there is one\n        if (cachedKeys)\n            cachedKeys[layers[i].id] = k;\n\n        let group = groups[k];\n        if (!group) {\n            group = groups[k] = [];\n        }\n        group.push(layers[i]);\n    }\n\n    const result = [];\n\n    for (const k in groups) {\n        result.push(groups[k]);\n    }\n\n    return result;\n}\n","// @flow\n\nimport createStyleLayer from './create_style_layer.js';\n\nimport {values} from '../util/util.js';\nimport groupByLayout from '../style-spec/group_by_layout.js';\n\nimport type {TypedStyleLayer} from './style_layer/typed_style_layer.js';\nimport type {LayerSpecification} from '../style-spec/types.js';\nimport type {ConfigOptions} from './properties.js';\n\nexport type LayerConfigs = {[_: string]: LayerSpecification };\nexport type Family<Layer: TypedStyleLayer> = Array<Layer>;\n\nclass StyleLayerIndex {\n    scope: string;\n    familiesBySource: { [source: string]: { [sourceLayer: string]: Array<Family<TypedStyleLayer>> } };\n    keyCache: { [source: string]: string };\n\n    _layerConfigs: LayerConfigs;\n    _layers: {[_: string]: TypedStyleLayer };\n    _options: ?ConfigOptions;\n\n    constructor(layerConfigs: ?Array<LayerSpecification>) {\n        this.keyCache = {};\n        this._layers = {};\n        this._layerConfigs = {};\n        if (layerConfigs) {\n            this.replace(layerConfigs);\n        }\n    }\n\n    replace(layerConfigs: Array<LayerSpecification>, options?: ?ConfigOptions) {\n        this._layerConfigs = {};\n        this._layers = {};\n        this.update(layerConfigs, [], options);\n    }\n\n    update(layerConfigs: Array<LayerSpecification>, removedIds: Array<string>, options: ?ConfigOptions) {\n        this._options = options;\n\n        for (const layerConfig of layerConfigs) {\n            this._layerConfigs[layerConfig.id] = layerConfig;\n\n            const layer = this._layers[layerConfig.id] = ((createStyleLayer(layerConfig, this.scope, this._options): any): TypedStyleLayer);\n            layer.compileFilter();\n            if (this.keyCache[layerConfig.id])\n                delete this.keyCache[layerConfig.id];\n        }\n        for (const id of removedIds) {\n            delete this.keyCache[id];\n            delete this._layerConfigs[id];\n            delete this._layers[id];\n        }\n\n        this.familiesBySource = {};\n\n        const groups = groupByLayout(values(this._layerConfigs), this.keyCache);\n\n        for (const layerConfigs of groups) {\n            const layers = layerConfigs.map((layerConfig) => this._layers[layerConfig.id]);\n\n            const layer = layers[0];\n            if (layer.visibility === 'none') {\n                continue;\n            }\n\n            const sourceId = layer.source || '';\n            let sourceGroup = this.familiesBySource[sourceId];\n            if (!sourceGroup) {\n                sourceGroup = this.familiesBySource[sourceId] = {};\n            }\n\n            const sourceLayerId = layer.sourceLayer || '_geojsonTileLayer';\n            let sourceLayerFamilies = sourceGroup[sourceLayerId];\n            if (!sourceLayerFamilies) {\n                sourceLayerFamilies = sourceGroup[sourceLayerId] = [];\n            }\n\n            sourceLayerFamilies.push(layers);\n        }\n    }\n}\n\nexport default StyleLayerIndex;\n","// @flow\n\nimport {SDF_SCALE} from '../render/glyph_manager.js';\nimport {AlphaImage} from '../util/image.js';\nimport {register} from '../util/web_worker_transfer.js';\nimport potpack from 'potpack';\n\nimport type {StyleGlyph} from '../style/style_glyph.js';\n\nconst glyphPadding = 1;\n/*\n    The glyph padding is just to prevent sampling errors at the boundaries between\n    glyphs in the atlas texture, and for that purpose there's no need to make it\n    bigger with high-res SDFs. However, layout is done based on the glyph size\n    including this padding, so scaling this padding is the easiest way to keep\n    layout exactly the same as the SDF_SCALE changes.\n*/\nconst localGlyphPadding = glyphPadding * SDF_SCALE;\n\nexport type GlyphRect = {\n    x: number,\n    y: number,\n    w: number,\n    h: number\n};\n// {glyphID: glyphRect}\nexport type GlyphPositionMap = { [_: number]: GlyphRect };\n\n// {fontStack: glyphPoistionMap}\nexport type GlyphPositions = { [_: string]: GlyphPositionMap };\n\nexport default class GlyphAtlas {\n    image: AlphaImage;\n    positions: GlyphPositions;\n    constructor(stacks: {[_: string]: {glyphs: {[_: number]: ?StyleGlyph }, ascender?: number, descender?: number }}) {\n        const positions = {};\n        const bins = [];\n\n        for (const stack in stacks) {\n            const glyphData = stacks[stack];\n            const glyphPositionMap = positions[stack] = {};\n\n            for (const id in glyphData.glyphs) {\n                const src = glyphData.glyphs[+id];\n                if (!src || src.bitmap.width === 0 || src.bitmap.height === 0) continue;\n\n                const padding = src.metrics.localGlyph ? localGlyphPadding : glyphPadding;\n                const bin = {\n                    x: 0,\n                    y: 0,\n                    w: src.bitmap.width + 2 * padding,\n                    h: src.bitmap.height + 2 * padding\n                };\n                bins.push(bin);\n                glyphPositionMap[id] = bin;\n            }\n        }\n\n        const {w, h} = potpack(bins);\n        const image = new AlphaImage({width: w || 1, height: h || 1});\n\n        for (const stack in stacks) {\n            const glyphData = stacks[stack];\n\n            for (const id in glyphData.glyphs) {\n                const src = glyphData.glyphs[+id];\n                if (!src || src.bitmap.width === 0 || src.bitmap.height === 0) continue;\n                const bin = positions[stack][id];\n                const padding = src.metrics.localGlyph ? localGlyphPadding : glyphPadding;\n                AlphaImage.copy(src.bitmap, image, {x: 0, y: 0}, {x: bin.x + padding, y: bin.y + padding}, src.bitmap);\n            }\n        }\n\n        this.image = image;\n        this.positions = positions;\n    }\n}\n\nregister(GlyphAtlas, 'GlyphAtlas');\n","// @flow\n\nimport FeatureIndex from '../data/feature_index.js';\n\nimport {performSymbolLayout} from '../symbol/symbol_layout.js';\nimport {CollisionBoxArray} from '../data/array_types.js';\nimport DictionaryCoder from '../util/dictionary_coder.js';\nimport SymbolBucket from '../data/bucket/symbol_bucket.js';\nimport LineBucket from '../data/bucket/line_bucket.js';\nimport FillBucket from '../data/bucket/fill_bucket.js';\nimport FillExtrusionBucket from '../data/bucket/fill_extrusion_bucket.js';\nimport {warnOnce, mapObject, values} from '../util/util.js';\nimport assert from 'assert';\nimport LineAtlas from '../render/line_atlas.js';\nimport ImageAtlas from '../render/image_atlas.js';\nimport GlyphAtlas from '../render/glyph_atlas.js';\nimport EvaluationParameters from '../style/evaluation_parameters.js';\nimport {CanonicalTileID, OverscaledTileID} from './tile_id.js';\nimport {PerformanceUtils} from '../util/performance.js';\nimport tileTransform from '../geo/projection/tile_transform.js';\nimport type Projection from '../geo/projection/projection.js';\nimport type {Bucket} from '../data/bucket.js';\nimport type Actor from '../util/actor.js';\nimport type StyleLayer from '../style/style_layer.js';\nimport type StyleLayerIndex from '../style/style_layer_index.js';\nimport type {StyleImage} from '../style/style_image.js';\nimport type {StyleGlyph} from '../style/style_glyph.js';\nimport type {SpritePositions} from '../util/image.js';\nimport type {\n    WorkerTileParameters,\n    WorkerTileCallback,\n} from '../source/worker_source.js';\nimport type {PromoteIdSpecification} from '../style-spec/types.js';\nimport type {TileTransform} from '../geo/projection/tile_transform.js';\nimport type {IVectorTile} from '@mapbox/vector-tile';\n\nclass WorkerTile {\n    tileID: OverscaledTileID;\n    uid: number;\n    zoom: number;\n    tileZoom: number;\n    canonical: CanonicalTileID;\n    pixelRatio: number;\n    tileSize: number;\n    source: string;\n    scope: string;\n    promoteId: ?PromoteIdSpecification;\n    overscaling: number;\n    showCollisionBoxes: boolean;\n    collectResourceTiming: boolean;\n    isSymbolTile: ?boolean;\n    extraShadowCaster: ?boolean;\n    projection: Projection;\n    tileTransform: TileTransform;\n    brightness: number;\n\n    status: 'parsing' | 'done';\n    data: IVectorTile;\n    collisionBoxArray: CollisionBoxArray;\n\n    abort: ?() => void;\n    reloadCallback: ?WorkerTileCallback;\n    vectorTile: IVectorTile;\n\n    constructor(params: WorkerTileParameters) {\n        this.tileID = new OverscaledTileID(params.tileID.overscaledZ, params.tileID.wrap, params.tileID.canonical.z, params.tileID.canonical.x, params.tileID.canonical.y);\n        this.tileZoom = params.tileZoom;\n        this.uid = params.uid;\n        this.zoom = params.zoom;\n        this.canonical = params.tileID.canonical;\n        this.pixelRatio = params.pixelRatio;\n        this.tileSize = params.tileSize;\n        this.source = params.source;\n        this.scope = params.scope;\n        this.overscaling = this.tileID.overscaleFactor();\n        this.showCollisionBoxes = params.showCollisionBoxes;\n        this.collectResourceTiming = !!params.collectResourceTiming;\n        this.promoteId = params.promoteId;\n        this.isSymbolTile = params.isSymbolTile;\n        this.tileTransform = tileTransform(params.tileID.canonical, params.projection);\n        this.projection = params.projection;\n        this.brightness = params.brightness;\n        this.extraShadowCaster = !!params.extraShadowCaster;\n    }\n\n    parse(data: IVectorTile, layerIndex: StyleLayerIndex, availableImages: Array<string>, actor: Actor, callback: WorkerTileCallback) {\n        const m = PerformanceUtils.beginMeasure('parseTile1');\n        this.status = 'parsing';\n        this.data = data;\n\n        this.collisionBoxArray = new CollisionBoxArray();\n        const sourceLayerCoder = new DictionaryCoder(Object.keys(data.layers).sort());\n\n        const featureIndex = new FeatureIndex(this.tileID, this.promoteId);\n        featureIndex.bucketLayerIDs = [];\n\n        const buckets: {[_: string]: Bucket} = {};\n\n        // we initially reserve space for a 256x256 atlas, but trim it after processing all line features\n        const lineAtlas = new LineAtlas(256, 256);\n\n        const options = {\n            featureIndex,\n            iconDependencies: {},\n            patternDependencies: {},\n            glyphDependencies: {},\n            lineAtlas,\n            availableImages,\n            brightness: this.brightness\n        };\n\n        const layerFamilies = layerIndex.familiesBySource[this.source];\n        for (const sourceLayerId in layerFamilies) {\n            const sourceLayer = data.layers[sourceLayerId];\n            if (!sourceLayer) {\n                continue;\n            }\n\n            let anySymbolLayers = false;\n            let anyOtherLayers = false;\n            let any3DLayer = false;\n\n            for (const family of layerFamilies[sourceLayerId]) {\n                if (family[0].type === 'symbol') {\n                    anySymbolLayers = true;\n                } else {\n                    anyOtherLayers = true;\n                }\n                if (family[0].is3D() && family[0].type !== 'model') {\n                    any3DLayer = true;\n                }\n            }\n\n            if (this.extraShadowCaster && !any3DLayer) {\n                continue;\n            }\n\n            if (this.isSymbolTile === true && !anySymbolLayers) {\n                continue;\n            } else if (this.isSymbolTile === false && !anyOtherLayers) {\n                continue;\n            }\n\n            if (sourceLayer.version === 1) {\n                warnOnce(`Vector tile source \"${this.source}\" layer \"${sourceLayerId}\" ` +\n                    `does not use vector tile spec v2 and therefore may have some rendering errors.`);\n            }\n\n            const sourceLayerIndex = sourceLayerCoder.encode(sourceLayerId);\n            const features = [];\n            for (let index = 0; index < sourceLayer.length; index++) {\n                const feature = sourceLayer.feature(index);\n                const id = featureIndex.getId(feature, sourceLayerId);\n                features.push({feature, id, index, sourceLayerIndex});\n            }\n\n            for (const family of layerFamilies[sourceLayerId]) {\n                const layer = family[0];\n\n                if (this.extraShadowCaster && (!layer.is3D() || layer.type === 'model')) {\n                    // avoid to spend resources in 2D layers or 3D model layers (trees) for extra shadow casters\n                    continue;\n                }\n                if (this.isSymbolTile !== undefined && (layer.type === 'symbol') !== this.isSymbolTile) continue;\n                assert(layer.source === this.source);\n                if (layer.minzoom && this.zoom < Math.floor(layer.minzoom)) continue;\n                if (layer.maxzoom && this.zoom >= layer.maxzoom) continue;\n                if (layer.visibility === 'none') continue;\n\n                recalculateLayers(family, this.zoom, options.brightness, availableImages);\n\n                const bucket = buckets[layer.id] = layer.createBucket({\n                    index: featureIndex.bucketLayerIDs.length,\n                    // $FlowFixMe[incompatible-call] - Flow can't infer proper `family` type from `layer` above\n                    layers: family,\n                    zoom: this.zoom,\n                    canonical: this.canonical,\n                    pixelRatio: this.pixelRatio,\n                    overscaling: this.overscaling,\n                    collisionBoxArray: this.collisionBoxArray,\n                    sourceLayerIndex,\n                    sourceID: this.source,\n                    projection: this.projection.spec\n                });\n\n                assert(this.tileTransform.projection.name === this.projection.name);\n                bucket.populate(features, options, this.tileID.canonical, this.tileTransform);\n                featureIndex.bucketLayerIDs.push(family.map((l) => l.id));\n            }\n        }\n\n        lineAtlas.trim();\n\n        let error: ?Error;\n        let glyphMap: {[_: string]: {glyphs: {[_: number]: ?StyleGlyph}, ascender?: number, descender?: number}};\n        let iconMap: {[_: string]: StyleImage};\n        let patternMap: {[_: string]: StyleImage};\n        const taskMetadata = {type: 'maybePrepare', isSymbolTile: this.isSymbolTile, zoom: this.zoom};\n\n        const maybePrepare = () => {\n            if (error) {\n                this.status = 'done';\n                return callback(error);\n            } else if (this.extraShadowCaster) {\n                const m = PerformanceUtils.beginMeasure('parseTile2');\n                this.status = 'done';\n                // $FlowIgnore[incompatible-call]\n                callback(null, {\n                    buckets: values(buckets).filter(b => !b.isEmpty()),\n                    featureIndex,\n                    // $FlowIgnore[incompatible-call] setting null on purpose\n                    collisionBoxArray: null,\n                    // $FlowIgnore[incompatible-call] setting null on purpose\n                    glyphAtlasImage: null,\n                    // $FlowIgnore[incompatible-call] setting null on purpose\n                    lineAtlas: null,\n                    // $FlowIgnore[incompatible-call] setting null on purpose\n                    imageAtlas: null,\n                    brightness: options.brightness,\n                    // Only used for benchmarking:\n                    glyphMap: null,\n                    iconMap: null,\n                    glyphPositions: null\n                });\n                PerformanceUtils.endMeasure(m);\n            } else if (glyphMap && iconMap && patternMap) {\n                const m = PerformanceUtils.beginMeasure('parseTile2');\n                const glyphAtlas = new GlyphAtlas(glyphMap);\n                const imageAtlas = new ImageAtlas(iconMap, patternMap);\n\n                for (const key in buckets) {\n                    const bucket = buckets[key];\n                    if (bucket instanceof SymbolBucket) {\n                        recalculateLayers(bucket.layers, this.zoom, options.brightness, availableImages);\n                        performSymbolLayout(bucket,\n                                glyphMap,\n                                glyphAtlas.positions,\n                                iconMap,\n                                imageAtlas.iconPositions,\n                                this.showCollisionBoxes,\n                                availableImages,\n                                this.tileID.canonical,\n                                this.tileZoom,\n                                this.projection,\n                                this.brightness);\n                    } else if (bucket.hasPattern &&\n                            (bucket instanceof LineBucket ||\n                             bucket instanceof FillBucket ||\n                             bucket instanceof FillExtrusionBucket)) {\n                        recalculateLayers(bucket.layers, this.zoom, options.brightness, availableImages);\n                        // $FlowFixMe[incompatible-type] Flow can't interpret ImagePosition as SpritePosition for some reason here\n                        const imagePositions: SpritePositions = imageAtlas.patternPositions;\n                        bucket.addFeatures(options, this.tileID.canonical, imagePositions, availableImages, this.tileTransform, this.brightness);\n                    }\n                }\n                this.status = 'done';\n                callback(null, {\n                    buckets: values(buckets).filter(b => !b.isEmpty()),\n                    featureIndex,\n                    collisionBoxArray: this.collisionBoxArray,\n                    glyphAtlasImage: glyphAtlas.image,\n                    lineAtlas,\n                    imageAtlas,\n                    brightness: options.brightness\n                });\n                PerformanceUtils.endMeasure(m);\n            }\n        };\n\n        if (!this.extraShadowCaster) {\n            const stacks = mapObject(options.glyphDependencies, (glyphs) => Object.keys(glyphs).map(Number));\n            if (Object.keys(stacks).length) {\n                actor.send('getGlyphs', {uid: this.uid, stacks, scope: this.scope}, (err, result) => {\n                    if (!error) {\n                        error = err;\n                        glyphMap = result;\n                        maybePrepare();\n                    }\n                }, undefined, false, taskMetadata);\n            } else {\n                glyphMap = {};\n            }\n\n            const icons = Object.keys(options.iconDependencies);\n            if (icons.length) {\n                actor.send('getImages', {icons, source: this.source, scope: this.scope, tileID: this.tileID, type: 'icons'}, (err, result) => {\n                    if (!error) {\n                        error = err;\n                        iconMap = result;\n                        maybePrepare();\n                    }\n                }, undefined, false, taskMetadata);\n            } else {\n                iconMap = {};\n            }\n\n            const patterns = Object.keys(options.patternDependencies);\n            if (patterns.length) {\n                actor.send('getImages', {icons: patterns, source: this.source, scope: this.scope, tileID: this.tileID, type: 'patterns'}, (err, result) => {\n                    if (!error) {\n                        error = err;\n                        patternMap = result;\n                        maybePrepare();\n                    }\n                }, undefined, false, taskMetadata);\n            } else {\n                patternMap = {};\n            }\n        }\n\n        PerformanceUtils.endMeasure(m);\n\n        maybePrepare();\n\n    }\n}\n\nfunction recalculateLayers(layers: $ReadOnlyArray<StyleLayer>, zoom: number, brightness: number, availableImages: Array<string>) {\n    // Layers are shared and may have been used by a WorkerTile with a different zoom.\n    const parameters = new EvaluationParameters(zoom, {brightness});\n    for (const layer of layers) {\n        layer.recalculate(parameters, availableImages);\n    }\n}\n\nexport default WorkerTile;\n","// @flow\n\nimport {VectorTile} from '@mapbox/vector-tile';\nimport Protobuf from 'pbf';\nimport WorkerTile from './worker_tile.js';\nimport {extend} from '../util/util.js';\nimport {getPerformanceMeasurement} from '../util/performance.js';\nimport {Evented} from '../util/evented.js';\nimport tileTransform from '../geo/projection/tile_transform.js';\nimport {loadVectorTile, DedupedRequest} from './load_vector_tile.js';\n\nimport type {\n    WorkerSource,\n    WorkerTileResult,\n    WorkerTileParameters,\n    WorkerTileCallback,\n    TileParameters\n} from './worker_source.js';\n\nimport type Actor from '../util/actor.js';\nimport type StyleLayerIndex from '../style/style_layer_index.js';\nimport type Scheduler from '../util/scheduler.js';\nimport type {LoadVectorData} from './load_vector_tile.js';\n\n/**\n * The {@link WorkerSource} implementation that supports {@link VectorTileSource}.\n * This class is designed to be easily reused to support custom source types\n * for data formats that can be parsed/converted into an in-memory VectorTile\n * representation.  To do so, create it with\n * `new VectorTileWorkerSource(actor, styleLayers, customLoadVectorDataFunction)`.\n *\n * @private\n */\nclass VectorTileWorkerSource extends Evented implements WorkerSource {\n    actor: Actor;\n    layerIndex: StyleLayerIndex;\n    availableImages: Array<string>;\n    loadVectorData: LoadVectorData;\n    loading: {[_: number]: WorkerTile };\n    loaded: {[_: number]: WorkerTile };\n    deduped: DedupedRequest;\n    isSpriteLoaded: boolean;\n    scheduler: ?Scheduler;\n    brightness: ?number;\n\n    /**\n     * @param [loadVectorData] Optional method for custom loading of a VectorTile\n     * object based on parameters passed from the main-thread Source. See\n     * {@link VectorTileWorkerSource#loadTile}. The default implementation simply\n     * loads the pbf at `params.url`.\n     * @private\n     */\n    constructor(actor: Actor, layerIndex: StyleLayerIndex, availableImages: Array<string>, isSpriteLoaded: boolean, loadVectorData: ?LoadVectorData, brightness: ?number) {\n        super();\n        this.actor = actor;\n        this.layerIndex = layerIndex;\n        this.availableImages = availableImages;\n        this.loadVectorData = loadVectorData || loadVectorTile;\n        this.loading = {};\n        this.loaded = {};\n        this.deduped = new DedupedRequest(actor.scheduler);\n        this.isSpriteLoaded = isSpriteLoaded;\n        this.scheduler = actor.scheduler;\n        this.brightness = brightness;\n    }\n\n    /**\n     * Implements {@link WorkerSource#loadTile}. Delegates to\n     * {@link VectorTileWorkerSource#loadVectorData} (which by default expects\n     * a `params.url` property) for fetching and producing a VectorTile object.\n     * @private\n     */\n    loadTile(params: WorkerTileParameters, callback: WorkerTileCallback) {\n        const uid = params.uid;\n\n        const requestParam = params && params.request;\n        const perf = requestParam && requestParam.collectResourceTiming;\n\n        const workerTile = this.loading[uid] = new WorkerTile(params);\n        workerTile.abort = this.loadVectorData(params, (err, response) => {\n\n            const aborted = !this.loading[uid];\n\n            delete this.loading[uid];\n\n            if (aborted || err || !response) {\n                workerTile.status = 'done';\n                if (!aborted) this.loaded[uid] = workerTile;\n                return callback(err);\n            }\n\n            const rawTileData = response.rawData;\n            const cacheControl = {};\n            if (response.expires) cacheControl.expires = response.expires;\n            if (response.cacheControl) cacheControl.cacheControl = response.cacheControl;\n\n            // response.vectorTile will be present in the GeoJSON worker case (which inherits from this class)\n            // because we stub the vector tile interface around JSON data instead of parsing it directly\n            workerTile.vectorTile = response.vectorTile || new VectorTile(new Protobuf(rawTileData));\n            const parseTile = () => {\n                const workerTileCallback = (err: ?Error, result: ?WorkerTileResult) => {\n                    if (err || !result) return callback(err);\n\n                    const resourceTiming = {};\n                    if (perf) {\n                        // Transferring a copy of rawTileData because the worker needs to retain its copy.\n                        const resourceTimingData = getPerformanceMeasurement(requestParam);\n                        // it's necessary to eval the result of getEntriesByName() here via parse/stringify\n                        // late evaluation in the main thread causes TypeError: illegal invocation\n                        if (resourceTimingData.length > 0) {\n                            resourceTiming.resourceTiming = JSON.parse(JSON.stringify(resourceTimingData));\n                        }\n                    }\n                    callback(null, extend({rawTileData: rawTileData.slice(0)}, result, cacheControl, resourceTiming));\n                };\n                workerTile.parse(workerTile.vectorTile, this.layerIndex, this.availableImages, this.actor, workerTileCallback);\n            };\n\n            if (this.isSpriteLoaded) {\n                parseTile();\n            } else {\n                this.once('isSpriteLoaded', () => {\n                    if (this.scheduler) {\n                        const metadata = {type: 'parseTile', isSymbolTile: params.isSymbolTile, zoom: params.tileZoom};\n                        this.scheduler.add(parseTile, metadata);\n                    } else {\n                        parseTile();\n                    }\n                });\n            }\n\n            this.loaded = this.loaded || {};\n            this.loaded[uid] = workerTile;\n        });\n    }\n\n    /**\n     * Implements {@link WorkerSource#reloadTile}.\n     * @private\n     */\n    reloadTile(params: WorkerTileParameters, callback: WorkerTileCallback) {\n        const loaded = this.loaded,\n            uid = params.uid,\n            vtSource = this;\n        if (loaded && loaded[uid]) {\n            const workerTile = loaded[uid];\n            workerTile.showCollisionBoxes = params.showCollisionBoxes;\n            workerTile.projection = params.projection;\n            workerTile.brightness = params.brightness;\n            workerTile.tileTransform = tileTransform(params.tileID.canonical, params.projection);\n            workerTile.extraShadowCaster = params.extraShadowCaster;\n            const done = (err: ?Error, data: ?WorkerTileResult) => {\n                const reloadCallback = workerTile.reloadCallback;\n                if (reloadCallback) {\n                    delete workerTile.reloadCallback;\n                    workerTile.parse(workerTile.vectorTile, vtSource.layerIndex, this.availableImages, vtSource.actor, reloadCallback);\n                }\n                callback(err, data);\n            };\n\n            if (workerTile.status === 'parsing') {\n                workerTile.reloadCallback = done;\n            } else if (workerTile.status === 'done') {\n                // if there was no vector tile data on the initial load, don't try and re-parse tile\n                if (workerTile.vectorTile) {\n                    workerTile.parse(workerTile.vectorTile, this.layerIndex, this.availableImages, this.actor, done);\n                } else {\n                    done();\n                }\n            }\n        } else {\n            callback(null, undefined);\n        }\n    }\n\n    /**\n     * Implements {@link WorkerSource#abortTile}.\n     *\n     * @param params\n     * @param params.uid The UID for this tile.\n     * @private\n     */\n    abortTile(params: TileParameters, callback: WorkerTileCallback) {\n        const uid = params.uid;\n        const tile = this.loading[uid];\n        if (tile) {\n            if (tile.abort) tile.abort();\n            delete this.loading[uid];\n        }\n        callback();\n    }\n\n    /**\n     * Implements {@link WorkerSource#removeTile}.\n     *\n     * @param params\n     * @param params.uid The UID for this tile.\n     * @private\n     */\n    removeTile(params: TileParameters, callback: WorkerTileCallback) {\n        const loaded = this.loaded,\n            uid = params.uid;\n        if (loaded && loaded[uid]) {\n            delete loaded[uid];\n        }\n        callback();\n    }\n}\n\nexport default VectorTileWorkerSource;\n","// @flow\n\nimport DEMData from '../data/dem_data.js';\n\nimport type Actor from '../util/actor.js';\nimport type {WorkerDEMTileParameters, WorkerDEMTileCallback} from './worker_source.js';\n\nclass RasterDEMTileWorkerSource {\n    actor: Actor;\n    offscreenCanvas: OffscreenCanvas;\n    offscreenCanvasContext: CanvasRenderingContext2D;\n\n    loadTile(params: WorkerDEMTileParameters, callback: WorkerDEMTileCallback) {\n        const {uid, encoding, rawImageData, padding} = params;\n        // Main thread will transfer ImageBitmap if offscreen decode with OffscreenCanvas is supported, else it will transfer an already decoded image.\n        // Flow struggles to refine ImageBitmap type\n        const imagePixels = ImageBitmap && rawImageData instanceof ImageBitmap ? this.getImageData(rawImageData, padding) : ((rawImageData: any): ImageData);\n        const dem = new DEMData(uid, imagePixels, encoding, padding < 1);\n        callback(null, dem);\n    }\n\n    getImageData(imgBitmap: ImageBitmap, padding: number): ImageData {\n        // Lazily initialize OffscreenCanvas\n        if (!this.offscreenCanvas || !this.offscreenCanvasContext) {\n            // Dem tiles are typically 256x256\n            this.offscreenCanvas = new OffscreenCanvas(imgBitmap.width, imgBitmap.height);\n            // $FlowIssue[extra-arg]: internal Flow types don't yet know about willReadFrequently\n            this.offscreenCanvasContext = this.offscreenCanvas.getContext('2d', {willReadFrequently: true});\n        }\n\n        this.offscreenCanvas.width = imgBitmap.width;\n        this.offscreenCanvas.height = imgBitmap.height;\n\n        this.offscreenCanvasContext.drawImage(imgBitmap, 0, 0, imgBitmap.width, imgBitmap.height);\n        // Insert or remove defined padding around the image to allow backfilling for neighboring data.\n        const imgData = this.offscreenCanvasContext.getImageData(-padding, -padding, imgBitmap.width + 2 * padding, imgBitmap.height + 2 * padding);\n        this.offscreenCanvasContext.clearRect(0, 0, this.offscreenCanvas.width, this.offscreenCanvas.height);\n        return imgData;\n    }\n}\n\nexport default RasterDEMTileWorkerSource;\n","// @flow\n\nimport '../data/mrt_data.js';\nimport {MapboxRasterTile} from '../data/mrt/mrt.js';\n\nimport type Actor from '../util/actor.js';\nimport type {WorkerRasterArrayTileParameters, WorkerRasterArrayTileCallback} from './worker_source.js';\n\nclass RasterArrayTileWorkerSource {\n    actor: Actor;\n\n    decodeRasterArray({task, buffer}: WorkerRasterArrayTileParameters, callback: WorkerRasterArrayTileCallback) {\n        MapboxRasterTile.performDecoding(buffer, task)\n            .then(result => {\n                callback(null, result);\n            }, error => {\n                callback(error);\n            });\n    }\n}\n\nexport default RasterArrayTileWorkerSource;\n","// @flow\n\nimport Point from '@mapbox/point-geometry';\n\nimport {VectorTileFeature} from '@mapbox/vector-tile';\n// $FlowFixMe[method-unbinding]\nconst toGeoJSON = VectorTileFeature.prototype.toGeoJSON;\nimport EXTENT from '../style-spec/data/extent.js';\n\nimport type {GeoJSONFeature} from '@mapbox/geojson-types';\nimport type {IVectorTile, IVectorTileLayer, IVectorTileFeature} from '@mapbox/vector-tile';\n\n// The feature type used by geojson-vt and supercluster. Should be extracted to\n// global type and used in module definitions for those two modules.\ntype Feature = {\n    type: 1,\n    id: mixed,\n    tags: {[_: string]: string | number | boolean},\n    geometry: Array<[number, number]>,\n} | {\n    type: 2 | 3,\n    id: mixed,\n    tags: {[_: string]: string | number | boolean},\n    geometry: Array<Array<[number, number]>>,\n}\n\nclass FeatureWrapper implements IVectorTileFeature {\n    _feature: Feature;\n\n    extent: number;\n    type: 1 | 2 | 3;\n    id: number;\n    properties: {[_: string]: string | number | boolean};\n\n    constructor(feature: Feature) {\n        this._feature = feature;\n\n        this.extent = EXTENT;\n        this.type = feature.type;\n        this.properties = feature.tags;\n\n        // If the feature has a top-level `id` property, copy it over, but only\n        // if it can be coerced to an integer, because this wrapper is used for\n        // serializing geojson feature data into vector tile PBF data, and the\n        // vector tile spec only supports integer values for feature ids --\n        // allowing non-integer values here results in a non-compliant PBF\n        // that causes an exception when it is parsed with vector-tile-js\n        if ('id' in feature && !isNaN(feature.id)) {\n            this.id = parseInt(feature.id, 10);\n        }\n    }\n\n    loadGeometry(): Array<Array<Point>> {\n        if (this._feature.type === 1) {\n            const geometry = [];\n            for (const point of this._feature.geometry) {\n                geometry.push([new Point(point[0], point[1])]);\n            }\n            return geometry;\n        } else {\n            const geometry = [];\n            for (const ring of this._feature.geometry) {\n                const newRing = [];\n                for (const point of ring) {\n                    newRing.push(new Point(point[0], point[1]));\n                }\n                geometry.push(newRing);\n            }\n            return geometry;\n        }\n    }\n\n    toGeoJSON(x: number, y: number, z: number): GeoJSONFeature {\n        return toGeoJSON.call(this, x, y, z);\n    }\n}\n\nclass GeoJSONWrapper implements IVectorTile, IVectorTileLayer {\n    layers: {[_: string]: IVectorTileLayer};\n    name: string;\n    extent: number;\n    length: number;\n    _features: Array<Feature>;\n\n    constructor(features: Array<Feature>) {\n        this.layers = {'_geojsonTileLayer': this};\n        this.name = '_geojsonTileLayer';\n        this.extent = EXTENT;\n        this.length = features.length;\n        this._features = features;\n    }\n\n    feature(i: number): IVectorTileFeature {\n        return new FeatureWrapper(this._features[i]);\n    }\n}\n\nexport default GeoJSONWrapper;\n","'use strict'\n\nvar Point = require('@mapbox/point-geometry')\nvar VectorTileFeature = require('@mapbox/vector-tile').VectorTileFeature\n\nmodule.exports = GeoJSONWrapper\n\n// conform to vectortile api\nfunction GeoJSONWrapper (features, options) {\n  this.options = options || {}\n  this.features = features\n  this.length = features.length\n}\n\nGeoJSONWrapper.prototype.feature = function (i) {\n  return new FeatureWrapper(this.features[i], this.options.extent)\n}\n\nfunction FeatureWrapper (feature, extent) {\n  this.id = typeof feature.id === 'number' ? feature.id : undefined\n  this.type = feature.type\n  this.rawGeometry = feature.type === 1 ? [feature.geometry] : feature.geometry\n  this.properties = feature.tags\n  this.extent = extent || 4096\n}\n\nFeatureWrapper.prototype.loadGeometry = function () {\n  var rings = this.rawGeometry\n  this.geometry = []\n\n  for (var i = 0; i < rings.length; i++) {\n    var ring = rings[i]\n    var newRing = []\n    for (var j = 0; j < ring.length; j++) {\n      newRing.push(new Point(ring[j][0], ring[j][1]))\n    }\n    this.geometry.push(newRing)\n  }\n  return this.geometry\n}\n\nFeatureWrapper.prototype.bbox = function () {\n  if (!this.geometry) this.loadGeometry()\n\n  var rings = this.geometry\n  var x1 = Infinity\n  var x2 = -Infinity\n  var y1 = Infinity\n  var y2 = -Infinity\n\n  for (var i = 0; i < rings.length; i++) {\n    var ring = rings[i]\n\n    for (var j = 0; j < ring.length; j++) {\n      var coord = ring[j]\n\n      x1 = Math.min(x1, coord.x)\n      x2 = Math.max(x2, coord.x)\n      y1 = Math.min(y1, coord.y)\n      y2 = Math.max(y2, coord.y)\n    }\n  }\n\n  return [x1, y1, x2, y2]\n}\n\nFeatureWrapper.prototype.toGeoJSON = VectorTileFeature.prototype.toGeoJSON\n","var Pbf = require('pbf')\nvar GeoJSONWrapper = require('./lib/geojson_wrapper')\n\nmodule.exports = fromVectorTileJs\nmodule.exports.fromVectorTileJs = fromVectorTileJs\nmodule.exports.fromGeojsonVt = fromGeojsonVt\nmodule.exports.GeoJSONWrapper = GeoJSONWrapper\n\n/**\n * Serialize a vector-tile-js-created tile to pbf\n *\n * @param {Object} tile\n * @return {Buffer} uncompressed, pbf-serialized tile data\n */\nfunction fromVectorTileJs (tile) {\n  var out = new Pbf()\n  writeTile(tile, out)\n  return out.finish()\n}\n\n/**\n * Serialized a geojson-vt-created tile to pbf.\n *\n * @param {Object} layers - An object mapping layer names to geojson-vt-created vector tile objects\n * @param {Object} [options] - An object specifying the vector-tile specification version and extent that were used to create `layers`.\n * @param {Number} [options.version=1] - Version of vector-tile spec used\n * @param {Number} [options.extent=4096] - Extent of the vector tile\n * @return {Buffer} uncompressed, pbf-serialized tile data\n */\nfunction fromGeojsonVt (layers, options) {\n  options = options || {}\n  var l = {}\n  for (var k in layers) {\n    l[k] = new GeoJSONWrapper(layers[k].features, options)\n    l[k].name = k\n    l[k].version = options.version\n    l[k].extent = options.extent\n  }\n  return fromVectorTileJs({ layers: l })\n}\n\nfunction writeTile (tile, pbf) {\n  for (var key in tile.layers) {\n    pbf.writeMessage(3, writeLayer, tile.layers[key])\n  }\n}\n\nfunction writeLayer (layer, pbf) {\n  pbf.writeVarintField(15, layer.version || 1)\n  pbf.writeStringField(1, layer.name || '')\n  pbf.writeVarintField(5, layer.extent || 4096)\n\n  var i\n  var context = {\n    keys: [],\n    values: [],\n    keycache: {},\n    valuecache: {}\n  }\n\n  for (i = 0; i < layer.length; i++) {\n    context.feature = layer.feature(i)\n    pbf.writeMessage(2, writeFeature, context)\n  }\n\n  var keys = context.keys\n  for (i = 0; i < keys.length; i++) {\n    pbf.writeStringField(3, keys[i])\n  }\n\n  var values = context.values\n  for (i = 0; i < values.length; i++) {\n    pbf.writeMessage(4, writeValue, values[i])\n  }\n}\n\nfunction writeFeature (context, pbf) {\n  var feature = context.feature\n\n  if (feature.id !== undefined) {\n    pbf.writeVarintField(1, feature.id)\n  }\n\n  pbf.writeMessage(2, writeProperties, context)\n  pbf.writeVarintField(3, feature.type)\n  pbf.writeMessage(4, writeGeometry, feature)\n}\n\nfunction writeProperties (context, pbf) {\n  var feature = context.feature\n  var keys = context.keys\n  var values = context.values\n  var keycache = context.keycache\n  var valuecache = context.valuecache\n\n  for (var key in feature.properties) {\n    var value = feature.properties[key]\n\n    var keyIndex = keycache[key]\n    if (value === null) continue // don't encode null value properties\n\n    if (typeof keyIndex === 'undefined') {\n      keys.push(key)\n      keyIndex = keys.length - 1\n      keycache[key] = keyIndex\n    }\n    pbf.writeVarint(keyIndex)\n\n    var type = typeof value\n    if (type !== 'string' && type !== 'boolean' && type !== 'number') {\n      value = JSON.stringify(value)\n    }\n    var valueKey = type + ':' + value\n    var valueIndex = valuecache[valueKey]\n    if (typeof valueIndex === 'undefined') {\n      values.push(value)\n      valueIndex = values.length - 1\n      valuecache[valueKey] = valueIndex\n    }\n    pbf.writeVarint(valueIndex)\n  }\n}\n\nfunction command (cmd, length) {\n  return (length << 3) + (cmd & 0x7)\n}\n\nfunction zigzag (num) {\n  return (num << 1) ^ (num >> 31)\n}\n\nfunction writeGeometry (feature, pbf) {\n  var geometry = feature.loadGeometry()\n  var type = feature.type\n  var x = 0\n  var y = 0\n  var rings = geometry.length\n  for (var r = 0; r < rings; r++) {\n    var ring = geometry[r]\n    var count = 1\n    if (type === 1) {\n      count = ring.length\n    }\n    pbf.writeVarint(command(1, count)) // moveto\n    // do not write polygon closing path as lineto\n    var lineCount = type === 3 ? ring.length - 1 : ring.length\n    for (var i = 0; i < lineCount; i++) {\n      if (i === 1 && type !== 1) {\n        pbf.writeVarint(command(2, lineCount - 1)) // lineto\n      }\n      var dx = ring[i].x - x\n      var dy = ring[i].y - y\n      pbf.writeVarint(zigzag(dx))\n      pbf.writeVarint(zigzag(dy))\n      x += dx\n      y += dy\n    }\n    if (type === 3) {\n      pbf.writeVarint(command(7, 1)) // closepath\n    }\n  }\n}\n\nfunction writeValue (value, pbf) {\n  var type = typeof value\n  if (type === 'string') {\n    pbf.writeStringField(1, value)\n  } else if (type === 'boolean') {\n    pbf.writeBooleanField(7, value)\n  } else if (type === 'number') {\n    if (value % 1 !== 0) {\n      pbf.writeDoubleField(3, value)\n    } else if (value < 0) {\n      pbf.writeSVarintField(6, value)\n    } else {\n      pbf.writeVarintField(5, value)\n    }\n  }\n}\n","\nimport KDBush from 'kdbush';\n\nconst defaultOptions = {\n    minZoom: 0,   // min zoom to generate clusters on\n    maxZoom: 16,  // max zoom level to cluster the points on\n    minPoints: 2, // minimum points to form a cluster\n    radius: 40,   // cluster radius in pixels\n    extent: 512,  // tile extent (radius is calculated relative to it)\n    nodeSize: 64, // size of the KD-tree leaf node, affects performance\n    log: false,   // whether to log timing info\n\n    // whether to generate numeric ids for input features (in vector tiles)\n    generateId: false,\n\n    // a reduce function for calculating custom cluster properties\n    reduce: null, // (accumulated, props) => { accumulated.sum += props.sum; }\n\n    // properties to use for individual points when running the reducer\n    map: props => props // props => ({sum: props.my_value})\n};\n\nconst fround = Math.fround || (tmp => ((x) => { tmp[0] = +x; return tmp[0]; }))(new Float32Array(1));\n\nconst OFFSET_ZOOM = 2;\nconst OFFSET_ID = 3;\nconst OFFSET_PARENT = 4;\nconst OFFSET_NUM = 5;\nconst OFFSET_PROP = 6;\n\nexport default class Supercluster {\n    constructor(options) {\n        this.options = Object.assign(Object.create(defaultOptions), options);\n        this.trees = new Array(this.options.maxZoom + 1);\n        this.stride = this.options.reduce ? 7 : 6;\n        this.clusterProps = [];\n    }\n\n    load(points) {\n        const {log, minZoom, maxZoom} = this.options;\n\n        if (log) console.time('total time');\n\n        const timerId = `prepare ${  points.length  } points`;\n        if (log) console.time(timerId);\n\n        this.points = points;\n\n        // generate a cluster object for each point and index input points into a KD-tree\n        const data = [];\n\n        for (let i = 0; i < points.length; i++) {\n            const p = points[i];\n            if (!p.geometry) continue;\n\n            const [lng, lat] = p.geometry.coordinates;\n            const x = fround(lngX(lng));\n            const y = fround(latY(lat));\n            // store internal point/cluster data in flat numeric arrays for performance\n            data.push(\n                x, y, // projected point coordinates\n                Infinity, // the last zoom the point was processed at\n                i, // index of the source feature in the original input array\n                -1, // parent cluster id\n                1 // number of points in a cluster\n            );\n            if (this.options.reduce) data.push(0); // noop\n        }\n        let tree = this.trees[maxZoom + 1] = this._createTree(data);\n\n        if (log) console.timeEnd(timerId);\n\n        // cluster points on max zoom, then cluster the results on previous zoom, etc.;\n        // results in a cluster hierarchy across zoom levels\n        for (let z = maxZoom; z >= minZoom; z--) {\n            const now = +Date.now();\n\n            // create a new set of clusters for the zoom and index them with a KD-tree\n            tree = this.trees[z] = this._createTree(this._cluster(tree, z));\n\n            if (log) console.log('z%d: %d clusters in %dms', z, tree.numItems, +Date.now() - now);\n        }\n\n        if (log) console.timeEnd('total time');\n\n        return this;\n    }\n\n    getClusters(bbox, zoom) {\n        let minLng = ((bbox[0] + 180) % 360 + 360) % 360 - 180;\n        const minLat = Math.max(-90, Math.min(90, bbox[1]));\n        let maxLng = bbox[2] === 180 ? 180 : ((bbox[2] + 180) % 360 + 360) % 360 - 180;\n        const maxLat = Math.max(-90, Math.min(90, bbox[3]));\n\n        if (bbox[2] - bbox[0] >= 360) {\n            minLng = -180;\n            maxLng = 180;\n        } else if (minLng > maxLng) {\n            const easternHem = this.getClusters([minLng, minLat, 180, maxLat], zoom);\n            const westernHem = this.getClusters([-180, minLat, maxLng, maxLat], zoom);\n            return easternHem.concat(westernHem);\n        }\n\n        const tree = this.trees[this._limitZoom(zoom)];\n        const ids = tree.range(lngX(minLng), latY(maxLat), lngX(maxLng), latY(minLat));\n        const data = tree.data;\n        const clusters = [];\n        for (const id of ids) {\n            const k = this.stride * id;\n            clusters.push(data[k + OFFSET_NUM] > 1 ? getClusterJSON(data, k, this.clusterProps) : this.points[data[k + OFFSET_ID]]);\n        }\n        return clusters;\n    }\n\n    getChildren(clusterId) {\n        const originId = this._getOriginId(clusterId);\n        const originZoom = this._getOriginZoom(clusterId);\n        const errorMsg = 'No cluster with the specified id.';\n\n        const tree = this.trees[originZoom];\n        if (!tree) throw new Error(errorMsg);\n\n        const data = tree.data;\n        if (originId * this.stride >= data.length) throw new Error(errorMsg);\n\n        const r = this.options.radius / (this.options.extent * Math.pow(2, originZoom - 1));\n        const x = data[originId * this.stride];\n        const y = data[originId * this.stride + 1];\n        const ids = tree.within(x, y, r);\n        const children = [];\n        for (const id of ids) {\n            const k = id * this.stride;\n            if (data[k + OFFSET_PARENT] === clusterId) {\n                children.push(data[k + OFFSET_NUM] > 1 ? getClusterJSON(data, k, this.clusterProps) : this.points[data[k + OFFSET_ID]]);\n            }\n        }\n\n        if (children.length === 0) throw new Error(errorMsg);\n\n        return children;\n    }\n\n    getLeaves(clusterId, limit, offset) {\n        limit = limit || 10;\n        offset = offset || 0;\n\n        const leaves = [];\n        this._appendLeaves(leaves, clusterId, limit, offset, 0);\n\n        return leaves;\n    }\n\n    getTile(z, x, y) {\n        const tree = this.trees[this._limitZoom(z)];\n        const z2 = Math.pow(2, z);\n        const {extent, radius} = this.options;\n        const p = radius / extent;\n        const top = (y - p) / z2;\n        const bottom = (y + 1 + p) / z2;\n\n        const tile = {\n            features: []\n        };\n\n        this._addTileFeatures(\n            tree.range((x - p) / z2, top, (x + 1 + p) / z2, bottom),\n            tree.data, x, y, z2, tile);\n\n        if (x === 0) {\n            this._addTileFeatures(\n                tree.range(1 - p / z2, top, 1, bottom),\n                tree.data, z2, y, z2, tile);\n        }\n        if (x === z2 - 1) {\n            this._addTileFeatures(\n                tree.range(0, top, p / z2, bottom),\n                tree.data, -1, y, z2, tile);\n        }\n\n        return tile.features.length ? tile : null;\n    }\n\n    getClusterExpansionZoom(clusterId) {\n        let expansionZoom = this._getOriginZoom(clusterId) - 1;\n        while (expansionZoom <= this.options.maxZoom) {\n            const children = this.getChildren(clusterId);\n            expansionZoom++;\n            if (children.length !== 1) break;\n            clusterId = children[0].properties.cluster_id;\n        }\n        return expansionZoom;\n    }\n\n    _appendLeaves(result, clusterId, limit, offset, skipped) {\n        const children = this.getChildren(clusterId);\n\n        for (const child of children) {\n            const props = child.properties;\n\n            if (props && props.cluster) {\n                if (skipped + props.point_count <= offset) {\n                    // skip the whole cluster\n                    skipped += props.point_count;\n                } else {\n                    // enter the cluster\n                    skipped = this._appendLeaves(result, props.cluster_id, limit, offset, skipped);\n                    // exit the cluster\n                }\n            } else if (skipped < offset) {\n                // skip a single point\n                skipped++;\n            } else {\n                // add a single point\n                result.push(child);\n            }\n            if (result.length === limit) break;\n        }\n\n        return skipped;\n    }\n\n    _createTree(data) {\n        const tree = new KDBush(data.length / this.stride | 0, this.options.nodeSize, Float32Array);\n        for (let i = 0; i < data.length; i += this.stride) tree.add(data[i], data[i + 1]);\n        tree.finish();\n        tree.data = data;\n        return tree;\n    }\n\n    _addTileFeatures(ids, data, x, y, z2, tile) {\n        for (const i of ids) {\n            const k = i * this.stride;\n            const isCluster = data[k + OFFSET_NUM] > 1;\n\n            let tags, px, py;\n            if (isCluster) {\n                tags = getClusterProperties(data, k, this.clusterProps);\n                px = data[k];\n                py = data[k + 1];\n            } else {\n                const p = this.points[data[k + OFFSET_ID]];\n                tags = p.properties;\n                const [lng, lat] = p.geometry.coordinates;\n                px = lngX(lng);\n                py = latY(lat);\n            }\n\n            const f = {\n                type: 1,\n                geometry: [[\n                    Math.round(this.options.extent * (px * z2 - x)),\n                    Math.round(this.options.extent * (py * z2 - y))\n                ]],\n                tags\n            };\n\n            // assign id\n            let id;\n            if (isCluster || this.options.generateId) {\n                // optionally generate id for points\n                id = data[k + OFFSET_ID];\n            } else {\n                // keep id if already assigned\n                id = this.points[data[k + OFFSET_ID]].id;\n            }\n\n            if (id !== undefined) f.id = id;\n\n            tile.features.push(f);\n        }\n    }\n\n    _limitZoom(z) {\n        return Math.max(this.options.minZoom, Math.min(Math.floor(+z), this.options.maxZoom + 1));\n    }\n\n    _cluster(tree, zoom) {\n        const {radius, extent, reduce, minPoints} = this.options;\n        const r = radius / (extent * Math.pow(2, zoom));\n        const data = tree.data;\n        const nextData = [];\n        const stride = this.stride;\n\n        // loop through each point\n        for (let i = 0; i < data.length; i += stride) {\n            // if we've already visited the point at this zoom level, skip it\n            if (data[i + OFFSET_ZOOM] <= zoom) continue;\n            data[i + OFFSET_ZOOM] = zoom;\n\n            // find all nearby points\n            const x = data[i];\n            const y = data[i + 1];\n            const neighborIds = tree.within(data[i], data[i + 1], r);\n\n            const numPointsOrigin = data[i + OFFSET_NUM];\n            let numPoints = numPointsOrigin;\n\n            // count the number of points in a potential cluster\n            for (const neighborId of neighborIds) {\n                const k = neighborId * stride;\n                // filter out neighbors that are already processed\n                if (data[k + OFFSET_ZOOM] > zoom) numPoints += data[k + OFFSET_NUM];\n            }\n\n            // if there were neighbors to merge, and there are enough points to form a cluster\n            if (numPoints > numPointsOrigin && numPoints >= minPoints) {\n                let wx = x * numPointsOrigin;\n                let wy = y * numPointsOrigin;\n\n                let clusterProperties;\n                let clusterPropIndex = -1;\n\n                // encode both zoom and point index on which the cluster originated -- offset by total length of features\n                const id = ((i / stride | 0) << 5) + (zoom + 1) + this.points.length;\n\n                for (const neighborId of neighborIds) {\n                    const k = neighborId * stride;\n\n                    if (data[k + OFFSET_ZOOM] <= zoom) continue;\n                    data[k + OFFSET_ZOOM] = zoom; // save the zoom (so it doesn't get processed twice)\n\n                    const numPoints2 = data[k + OFFSET_NUM];\n                    wx += data[k] * numPoints2; // accumulate coordinates for calculating weighted center\n                    wy += data[k + 1] * numPoints2;\n\n                    data[k + OFFSET_PARENT] = id;\n\n                    if (reduce) {\n                        if (!clusterProperties) {\n                            clusterProperties = this._map(data, i, true);\n                            clusterPropIndex = this.clusterProps.length;\n                            this.clusterProps.push(clusterProperties);\n                        }\n                        reduce(clusterProperties, this._map(data, k));\n                    }\n                }\n\n                data[i + OFFSET_PARENT] = id;\n                nextData.push(wx / numPoints, wy / numPoints, Infinity, id, -1, numPoints);\n                if (reduce) nextData.push(clusterPropIndex);\n\n            } else { // left points as unclustered\n                for (let j = 0; j < stride; j++) nextData.push(data[i + j]);\n\n                if (numPoints > 1) {\n                    for (const neighborId of neighborIds) {\n                        const k = neighborId * stride;\n                        if (data[k + OFFSET_ZOOM] <= zoom) continue;\n                        data[k + OFFSET_ZOOM] = zoom;\n                        for (let j = 0; j < stride; j++) nextData.push(data[k + j]);\n                    }\n                }\n            }\n        }\n\n        return nextData;\n    }\n\n    // get index of the point from which the cluster originated\n    _getOriginId(clusterId) {\n        return (clusterId - this.points.length) >> 5;\n    }\n\n    // get zoom of the point from which the cluster originated\n    _getOriginZoom(clusterId) {\n        return (clusterId - this.points.length) % 32;\n    }\n\n    _map(data, i, clone) {\n        if (data[i + OFFSET_NUM] > 1) {\n            const props = this.clusterProps[data[i + OFFSET_PROP]];\n            return clone ? Object.assign({}, props) : props;\n        }\n        const original = this.points[data[i + OFFSET_ID]].properties;\n        const result = this.options.map(original);\n        return clone && result === original ? Object.assign({}, result) : result;\n    }\n}\n\nfunction getClusterJSON(data, i, clusterProps) {\n    return {\n        type: 'Feature',\n        id: data[i + OFFSET_ID],\n        properties: getClusterProperties(data, i, clusterProps),\n        geometry: {\n            type: 'Point',\n            coordinates: [xLng(data[i]), yLat(data[i + 1])]\n        }\n    };\n}\n\nfunction getClusterProperties(data, i, clusterProps) {\n    const count = data[i + OFFSET_NUM];\n    const abbrev =\n        count >= 10000 ? `${Math.round(count / 1000)  }k` :\n        count >= 1000 ? `${Math.round(count / 100) / 10  }k` : count;\n    const propIndex = data[i + OFFSET_PROP];\n    const properties = propIndex === -1 ? {} : Object.assign({}, clusterProps[propIndex]);\n    return Object.assign(properties, {\n        cluster: true,\n        cluster_id: data[i + OFFSET_ID],\n        point_count: count,\n        point_count_abbreviated: abbrev\n    });\n}\n\n// longitude/latitude to spherical mercator in [0..1] range\nfunction lngX(lng) {\n    return lng / 360 + 0.5;\n}\nfunction latY(lat) {\n    const sin = Math.sin(lat * Math.PI / 180);\n    const y = (0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI);\n    return y < 0 ? 0 : y > 1 ? 1 : y;\n}\n\n// spherical mercator to longitude/latitude\nfunction xLng(x) {\n    return (x - 0.5) * 360;\n}\nfunction yLat(y) {\n    const y2 = (180 - y * 360) * Math.PI / 180;\n    return 360 * Math.atan(Math.exp(y2)) / Math.PI - 90;\n}\n","(function (global, factory) {\ntypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\ntypeof define === 'function' && define.amd ? define(factory) :\n(global.geojsonvt = factory());\n}(this, (function () { 'use strict';\n\n// calculate simplification data using optimized Douglas-Peucker algorithm\n\nfunction simplify(coords, first, last, sqTolerance) {\n    var maxSqDist = sqTolerance;\n    var mid = (last - first) >> 1;\n    var minPosToMid = last - first;\n    var index;\n\n    var ax = coords[first];\n    var ay = coords[first + 1];\n    var bx = coords[last];\n    var by = coords[last + 1];\n\n    for (var i = first + 3; i < last; i += 3) {\n        var d = getSqSegDist(coords[i], coords[i + 1], ax, ay, bx, by);\n\n        if (d > maxSqDist) {\n            index = i;\n            maxSqDist = d;\n\n        } else if (d === maxSqDist) {\n            // a workaround to ensure we choose a pivot close to the middle of the list,\n            // reducing recursion depth, for certain degenerate inputs\n            // https://github.com/mapbox/geojson-vt/issues/104\n            var posToMid = Math.abs(i - mid);\n            if (posToMid < minPosToMid) {\n                index = i;\n                minPosToMid = posToMid;\n            }\n        }\n    }\n\n    if (maxSqDist > sqTolerance) {\n        if (index - first > 3) simplify(coords, first, index, sqTolerance);\n        coords[index + 2] = maxSqDist;\n        if (last - index > 3) simplify(coords, index, last, sqTolerance);\n    }\n}\n\n// square distance from a point to a segment\nfunction getSqSegDist(px, py, x, y, bx, by) {\n\n    var dx = bx - x;\n    var dy = by - y;\n\n    if (dx !== 0 || dy !== 0) {\n\n        var t = ((px - x) * dx + (py - y) * dy) / (dx * dx + dy * dy);\n\n        if (t > 1) {\n            x = bx;\n            y = by;\n\n        } else if (t > 0) {\n            x += dx * t;\n            y += dy * t;\n        }\n    }\n\n    dx = px - x;\n    dy = py - y;\n\n    return dx * dx + dy * dy;\n}\n\nfunction createFeature(id, type, geom, tags) {\n    var feature = {\n        id: typeof id === 'undefined' ? null : id,\n        type: type,\n        geometry: geom,\n        tags: tags,\n        minX: Infinity,\n        minY: Infinity,\n        maxX: -Infinity,\n        maxY: -Infinity\n    };\n    calcBBox(feature);\n    return feature;\n}\n\nfunction calcBBox(feature) {\n    var geom = feature.geometry;\n    var type = feature.type;\n\n    if (type === 'Point' || type === 'MultiPoint' || type === 'LineString') {\n        calcLineBBox(feature, geom);\n\n    } else if (type === 'Polygon' || type === 'MultiLineString') {\n        for (var i = 0; i < geom.length; i++) {\n            calcLineBBox(feature, geom[i]);\n        }\n\n    } else if (type === 'MultiPolygon') {\n        for (i = 0; i < geom.length; i++) {\n            for (var j = 0; j < geom[i].length; j++) {\n                calcLineBBox(feature, geom[i][j]);\n            }\n        }\n    }\n}\n\nfunction calcLineBBox(feature, geom) {\n    for (var i = 0; i < geom.length; i += 3) {\n        feature.minX = Math.min(feature.minX, geom[i]);\n        feature.minY = Math.min(feature.minY, geom[i + 1]);\n        feature.maxX = Math.max(feature.maxX, geom[i]);\n        feature.maxY = Math.max(feature.maxY, geom[i + 1]);\n    }\n}\n\n// converts GeoJSON feature into an intermediate projected JSON vector format with simplification data\n\nfunction convert(data, options) {\n    var features = [];\n    if (data.type === 'FeatureCollection') {\n        for (var i = 0; i < data.features.length; i++) {\n            convertFeature(features, data.features[i], options, i);\n        }\n\n    } else if (data.type === 'Feature') {\n        convertFeature(features, data, options);\n\n    } else {\n        // single geometry or a geometry collection\n        convertFeature(features, {geometry: data}, options);\n    }\n\n    return features;\n}\n\nfunction convertFeature(features, geojson, options, index) {\n    if (!geojson.geometry) return;\n\n    var coords = geojson.geometry.coordinates;\n    var type = geojson.geometry.type;\n    var tolerance = Math.pow(options.tolerance / ((1 << options.maxZoom) * options.extent), 2);\n    var geometry = [];\n    var id = geojson.id;\n    if (options.promoteId) {\n        id = geojson.properties[options.promoteId];\n    } else if (options.generateId) {\n        id = index || 0;\n    }\n    if (type === 'Point') {\n        convertPoint(coords, geometry);\n\n    } else if (type === 'MultiPoint') {\n        for (var i = 0; i < coords.length; i++) {\n            convertPoint(coords[i], geometry);\n        }\n\n    } else if (type === 'LineString') {\n        convertLine(coords, geometry, tolerance, false);\n\n    } else if (type === 'MultiLineString') {\n        if (options.lineMetrics) {\n            // explode into linestrings to be able to track metrics\n            for (i = 0; i < coords.length; i++) {\n                geometry = [];\n                convertLine(coords[i], geometry, tolerance, false);\n                features.push(createFeature(id, 'LineString', geometry, geojson.properties));\n            }\n            return;\n        } else {\n            convertLines(coords, geometry, tolerance, false);\n        }\n\n    } else if (type === 'Polygon') {\n        convertLines(coords, geometry, tolerance, true);\n\n    } else if (type === 'MultiPolygon') {\n        for (i = 0; i < coords.length; i++) {\n            var polygon = [];\n            convertLines(coords[i], polygon, tolerance, true);\n            geometry.push(polygon);\n        }\n    } else if (type === 'GeometryCollection') {\n        for (i = 0; i < geojson.geometry.geometries.length; i++) {\n            convertFeature(features, {\n                id: id,\n                geometry: geojson.geometry.geometries[i],\n                properties: geojson.properties\n            }, options, index);\n        }\n        return;\n    } else {\n        throw new Error('Input data is not a valid GeoJSON object.');\n    }\n\n    features.push(createFeature(id, type, geometry, geojson.properties));\n}\n\nfunction convertPoint(coords, out) {\n    out.push(projectX(coords[0]));\n    out.push(projectY(coords[1]));\n    out.push(0);\n}\n\nfunction convertLine(ring, out, tolerance, isPolygon) {\n    var x0, y0;\n    var size = 0;\n\n    for (var j = 0; j < ring.length; j++) {\n        var x = projectX(ring[j][0]);\n        var y = projectY(ring[j][1]);\n\n        out.push(x);\n        out.push(y);\n        out.push(0);\n\n        if (j > 0) {\n            if (isPolygon) {\n                size += (x0 * y - x * y0) / 2; // area\n            } else {\n                size += Math.sqrt(Math.pow(x - x0, 2) + Math.pow(y - y0, 2)); // length\n            }\n        }\n        x0 = x;\n        y0 = y;\n    }\n\n    var last = out.length - 3;\n    out[2] = 1;\n    simplify(out, 0, last, tolerance);\n    out[last + 2] = 1;\n\n    out.size = Math.abs(size);\n    out.start = 0;\n    out.end = out.size;\n}\n\nfunction convertLines(rings, out, tolerance, isPolygon) {\n    for (var i = 0; i < rings.length; i++) {\n        var geom = [];\n        convertLine(rings[i], geom, tolerance, isPolygon);\n        out.push(geom);\n    }\n}\n\nfunction projectX(x) {\n    return x / 360 + 0.5;\n}\n\nfunction projectY(y) {\n    var sin = Math.sin(y * Math.PI / 180);\n    var y2 = 0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI;\n    return y2 < 0 ? 0 : y2 > 1 ? 1 : y2;\n}\n\n/* clip features between two axis-parallel lines:\n *     |        |\n *  ___|___     |     /\n * /   |   \\____|____/\n *     |        |\n */\n\nfunction clip(features, scale, k1, k2, axis, minAll, maxAll, options) {\n\n    k1 /= scale;\n    k2 /= scale;\n\n    if (minAll >= k1 && maxAll < k2) return features; // trivial accept\n    else if (maxAll < k1 || minAll >= k2) return null; // trivial reject\n\n    var clipped = [];\n\n    for (var i = 0; i < features.length; i++) {\n\n        var feature = features[i];\n        var geometry = feature.geometry;\n        var type = feature.type;\n\n        var min = axis === 0 ? feature.minX : feature.minY;\n        var max = axis === 0 ? feature.maxX : feature.maxY;\n\n        if (min >= k1 && max < k2) { // trivial accept\n            clipped.push(feature);\n            continue;\n        } else if (max < k1 || min >= k2) { // trivial reject\n            continue;\n        }\n\n        var newGeometry = [];\n\n        if (type === 'Point' || type === 'MultiPoint') {\n            clipPoints(geometry, newGeometry, k1, k2, axis);\n\n        } else if (type === 'LineString') {\n            clipLine(geometry, newGeometry, k1, k2, axis, false, options.lineMetrics);\n\n        } else if (type === 'MultiLineString') {\n            clipLines(geometry, newGeometry, k1, k2, axis, false);\n\n        } else if (type === 'Polygon') {\n            clipLines(geometry, newGeometry, k1, k2, axis, true);\n\n        } else if (type === 'MultiPolygon') {\n            for (var j = 0; j < geometry.length; j++) {\n                var polygon = [];\n                clipLines(geometry[j], polygon, k1, k2, axis, true);\n                if (polygon.length) {\n                    newGeometry.push(polygon);\n                }\n            }\n        }\n\n        if (newGeometry.length) {\n            if (options.lineMetrics && type === 'LineString') {\n                for (j = 0; j < newGeometry.length; j++) {\n                    clipped.push(createFeature(feature.id, type, newGeometry[j], feature.tags));\n                }\n                continue;\n            }\n\n            if (type === 'LineString' || type === 'MultiLineString') {\n                if (newGeometry.length === 1) {\n                    type = 'LineString';\n                    newGeometry = newGeometry[0];\n                } else {\n                    type = 'MultiLineString';\n                }\n            }\n            if (type === 'Point' || type === 'MultiPoint') {\n                type = newGeometry.length === 3 ? 'Point' : 'MultiPoint';\n            }\n\n            clipped.push(createFeature(feature.id, type, newGeometry, feature.tags));\n        }\n    }\n\n    return clipped.length ? clipped : null;\n}\n\nfunction clipPoints(geom, newGeom, k1, k2, axis) {\n    for (var i = 0; i < geom.length; i += 3) {\n        var a = geom[i + axis];\n\n        if (a >= k1 && a <= k2) {\n            newGeom.push(geom[i]);\n            newGeom.push(geom[i + 1]);\n            newGeom.push(geom[i + 2]);\n        }\n    }\n}\n\nfunction clipLine(geom, newGeom, k1, k2, axis, isPolygon, trackMetrics) {\n\n    var slice = newSlice(geom);\n    var intersect = axis === 0 ? intersectX : intersectY;\n    var len = geom.start;\n    var segLen, t;\n\n    for (var i = 0; i < geom.length - 3; i += 3) {\n        var ax = geom[i];\n        var ay = geom[i + 1];\n        var az = geom[i + 2];\n        var bx = geom[i + 3];\n        var by = geom[i + 4];\n        var a = axis === 0 ? ax : ay;\n        var b = axis === 0 ? bx : by;\n        var exited = false;\n\n        if (trackMetrics) segLen = Math.sqrt(Math.pow(ax - bx, 2) + Math.pow(ay - by, 2));\n\n        if (a < k1) {\n            // ---|-->  | (line enters the clip region from the left)\n            if (b > k1) {\n                t = intersect(slice, ax, ay, bx, by, k1);\n                if (trackMetrics) slice.start = len + segLen * t;\n            }\n        } else if (a > k2) {\n            // |  <--|--- (line enters the clip region from the right)\n            if (b < k2) {\n                t = intersect(slice, ax, ay, bx, by, k2);\n                if (trackMetrics) slice.start = len + segLen * t;\n            }\n        } else {\n            addPoint(slice, ax, ay, az);\n        }\n        if (b < k1 && a >= k1) {\n            // <--|---  | or <--|-----|--- (line exits the clip region on the left)\n            t = intersect(slice, ax, ay, bx, by, k1);\n            exited = true;\n        }\n        if (b > k2 && a <= k2) {\n            // |  ---|--> or ---|-----|--> (line exits the clip region on the right)\n            t = intersect(slice, ax, ay, bx, by, k2);\n            exited = true;\n        }\n\n        if (!isPolygon && exited) {\n            if (trackMetrics) slice.end = len + segLen * t;\n            newGeom.push(slice);\n            slice = newSlice(geom);\n        }\n\n        if (trackMetrics) len += segLen;\n    }\n\n    // add the last point\n    var last = geom.length - 3;\n    ax = geom[last];\n    ay = geom[last + 1];\n    az = geom[last + 2];\n    a = axis === 0 ? ax : ay;\n    if (a >= k1 && a <= k2) addPoint(slice, ax, ay, az);\n\n    // close the polygon if its endpoints are not the same after clipping\n    last = slice.length - 3;\n    if (isPolygon && last >= 3 && (slice[last] !== slice[0] || slice[last + 1] !== slice[1])) {\n        addPoint(slice, slice[0], slice[1], slice[2]);\n    }\n\n    // add the final slice\n    if (slice.length) {\n        newGeom.push(slice);\n    }\n}\n\nfunction newSlice(line) {\n    var slice = [];\n    slice.size = line.size;\n    slice.start = line.start;\n    slice.end = line.end;\n    return slice;\n}\n\nfunction clipLines(geom, newGeom, k1, k2, axis, isPolygon) {\n    for (var i = 0; i < geom.length; i++) {\n        clipLine(geom[i], newGeom, k1, k2, axis, isPolygon, false);\n    }\n}\n\nfunction addPoint(out, x, y, z) {\n    out.push(x);\n    out.push(y);\n    out.push(z);\n}\n\nfunction intersectX(out, ax, ay, bx, by, x) {\n    var t = (x - ax) / (bx - ax);\n    out.push(x);\n    out.push(ay + (by - ay) * t);\n    out.push(1);\n    return t;\n}\n\nfunction intersectY(out, ax, ay, bx, by, y) {\n    var t = (y - ay) / (by - ay);\n    out.push(ax + (bx - ax) * t);\n    out.push(y);\n    out.push(1);\n    return t;\n}\n\nfunction wrap(features, options) {\n    var buffer = options.buffer / options.extent;\n    var merged = features;\n    var left  = clip(features, 1, -1 - buffer, buffer,     0, -1, 2, options); // left world copy\n    var right = clip(features, 1,  1 - buffer, 2 + buffer, 0, -1, 2, options); // right world copy\n\n    if (left || right) {\n        merged = clip(features, 1, -buffer, 1 + buffer, 0, -1, 2, options) || []; // center world copy\n\n        if (left) merged = shiftFeatureCoords(left, 1).concat(merged); // merge left into center\n        if (right) merged = merged.concat(shiftFeatureCoords(right, -1)); // merge right into center\n    }\n\n    return merged;\n}\n\nfunction shiftFeatureCoords(features, offset) {\n    var newFeatures = [];\n\n    for (var i = 0; i < features.length; i++) {\n        var feature = features[i],\n            type = feature.type;\n\n        var newGeometry;\n\n        if (type === 'Point' || type === 'MultiPoint' || type === 'LineString') {\n            newGeometry = shiftCoords(feature.geometry, offset);\n\n        } else if (type === 'MultiLineString' || type === 'Polygon') {\n            newGeometry = [];\n            for (var j = 0; j < feature.geometry.length; j++) {\n                newGeometry.push(shiftCoords(feature.geometry[j], offset));\n            }\n        } else if (type === 'MultiPolygon') {\n            newGeometry = [];\n            for (j = 0; j < feature.geometry.length; j++) {\n                var newPolygon = [];\n                for (var k = 0; k < feature.geometry[j].length; k++) {\n                    newPolygon.push(shiftCoords(feature.geometry[j][k], offset));\n                }\n                newGeometry.push(newPolygon);\n            }\n        }\n\n        newFeatures.push(createFeature(feature.id, type, newGeometry, feature.tags));\n    }\n\n    return newFeatures;\n}\n\nfunction shiftCoords(points, offset) {\n    var newPoints = [];\n    newPoints.size = points.size;\n\n    if (points.start !== undefined) {\n        newPoints.start = points.start;\n        newPoints.end = points.end;\n    }\n\n    for (var i = 0; i < points.length; i += 3) {\n        newPoints.push(points[i] + offset, points[i + 1], points[i + 2]);\n    }\n    return newPoints;\n}\n\n// Transforms the coordinates of each feature in the given tile from\n// mercator-projected space into (extent x extent) tile space.\nfunction transformTile(tile, extent) {\n    if (tile.transformed) return tile;\n\n    var z2 = 1 << tile.z,\n        tx = tile.x,\n        ty = tile.y,\n        i, j, k;\n\n    for (i = 0; i < tile.features.length; i++) {\n        var feature = tile.features[i],\n            geom = feature.geometry,\n            type = feature.type;\n\n        feature.geometry = [];\n\n        if (type === 1) {\n            for (j = 0; j < geom.length; j += 2) {\n                feature.geometry.push(transformPoint(geom[j], geom[j + 1], extent, z2, tx, ty));\n            }\n        } else {\n            for (j = 0; j < geom.length; j++) {\n                var ring = [];\n                for (k = 0; k < geom[j].length; k += 2) {\n                    ring.push(transformPoint(geom[j][k], geom[j][k + 1], extent, z2, tx, ty));\n                }\n                feature.geometry.push(ring);\n            }\n        }\n    }\n\n    tile.transformed = true;\n\n    return tile;\n}\n\nfunction transformPoint(x, y, extent, z2, tx, ty) {\n    return [\n        Math.round(extent * (x * z2 - tx)),\n        Math.round(extent * (y * z2 - ty))];\n}\n\nfunction createTile(features, z, tx, ty, options) {\n    var tolerance = z === options.maxZoom ? 0 : options.tolerance / ((1 << z) * options.extent);\n    var tile = {\n        features: [],\n        numPoints: 0,\n        numSimplified: 0,\n        numFeatures: 0,\n        source: null,\n        x: tx,\n        y: ty,\n        z: z,\n        transformed: false,\n        minX: 2,\n        minY: 1,\n        maxX: -1,\n        maxY: 0\n    };\n    for (var i = 0; i < features.length; i++) {\n        tile.numFeatures++;\n        addFeature(tile, features[i], tolerance, options);\n\n        var minX = features[i].minX;\n        var minY = features[i].minY;\n        var maxX = features[i].maxX;\n        var maxY = features[i].maxY;\n\n        if (minX < tile.minX) tile.minX = minX;\n        if (minY < tile.minY) tile.minY = minY;\n        if (maxX > tile.maxX) tile.maxX = maxX;\n        if (maxY > tile.maxY) tile.maxY = maxY;\n    }\n    return tile;\n}\n\nfunction addFeature(tile, feature, tolerance, options) {\n\n    var geom = feature.geometry,\n        type = feature.type,\n        simplified = [];\n\n    if (type === 'Point' || type === 'MultiPoint') {\n        for (var i = 0; i < geom.length; i += 3) {\n            simplified.push(geom[i]);\n            simplified.push(geom[i + 1]);\n            tile.numPoints++;\n            tile.numSimplified++;\n        }\n\n    } else if (type === 'LineString') {\n        addLine(simplified, geom, tile, tolerance, false, false);\n\n    } else if (type === 'MultiLineString' || type === 'Polygon') {\n        for (i = 0; i < geom.length; i++) {\n            addLine(simplified, geom[i], tile, tolerance, type === 'Polygon', i === 0);\n        }\n\n    } else if (type === 'MultiPolygon') {\n\n        for (var k = 0; k < geom.length; k++) {\n            var polygon = geom[k];\n            for (i = 0; i < polygon.length; i++) {\n                addLine(simplified, polygon[i], tile, tolerance, true, i === 0);\n            }\n        }\n    }\n\n    if (simplified.length) {\n        var tags = feature.tags || null;\n        if (type === 'LineString' && options.lineMetrics) {\n            tags = {};\n            for (var key in feature.tags) tags[key] = feature.tags[key];\n            tags['mapbox_clip_start'] = geom.start / geom.size;\n            tags['mapbox_clip_end'] = geom.end / geom.size;\n        }\n        var tileFeature = {\n            geometry: simplified,\n            type: type === 'Polygon' || type === 'MultiPolygon' ? 3 :\n                type === 'LineString' || type === 'MultiLineString' ? 2 : 1,\n            tags: tags\n        };\n        if (feature.id !== null) {\n            tileFeature.id = feature.id;\n        }\n        tile.features.push(tileFeature);\n    }\n}\n\nfunction addLine(result, geom, tile, tolerance, isPolygon, isOuter) {\n    var sqTolerance = tolerance * tolerance;\n\n    if (tolerance > 0 && (geom.size < (isPolygon ? sqTolerance : tolerance))) {\n        tile.numPoints += geom.length / 3;\n        return;\n    }\n\n    var ring = [];\n\n    for (var i = 0; i < geom.length; i += 3) {\n        if (tolerance === 0 || geom[i + 2] > sqTolerance) {\n            tile.numSimplified++;\n            ring.push(geom[i]);\n            ring.push(geom[i + 1]);\n        }\n        tile.numPoints++;\n    }\n\n    if (isPolygon) rewind(ring, isOuter);\n\n    result.push(ring);\n}\n\nfunction rewind(ring, clockwise) {\n    var area = 0;\n    for (var i = 0, len = ring.length, j = len - 2; i < len; j = i, i += 2) {\n        area += (ring[i] - ring[j]) * (ring[i + 1] + ring[j + 1]);\n    }\n    if (area > 0 === clockwise) {\n        for (i = 0, len = ring.length; i < len / 2; i += 2) {\n            var x = ring[i];\n            var y = ring[i + 1];\n            ring[i] = ring[len - 2 - i];\n            ring[i + 1] = ring[len - 1 - i];\n            ring[len - 2 - i] = x;\n            ring[len - 1 - i] = y;\n        }\n    }\n}\n\nfunction geojsonvt(data, options) {\n    return new GeoJSONVT(data, options);\n}\n\nfunction GeoJSONVT(data, options) {\n    options = this.options = extend(Object.create(this.options), options);\n\n    var debug = options.debug;\n\n    if (debug) console.time('preprocess data');\n\n    if (options.maxZoom < 0 || options.maxZoom > 24) throw new Error('maxZoom should be in the 0-24 range');\n    if (options.promoteId && options.generateId) throw new Error('promoteId and generateId cannot be used together.');\n\n    var features = convert(data, options);\n\n    this.tiles = {};\n    this.tileCoords = [];\n\n    if (debug) {\n        console.timeEnd('preprocess data');\n        console.log('index: maxZoom: %d, maxPoints: %d', options.indexMaxZoom, options.indexMaxPoints);\n        console.time('generate tiles');\n        this.stats = {};\n        this.total = 0;\n    }\n\n    features = wrap(features, options);\n\n    // start slicing from the top tile down\n    if (features.length) this.splitTile(features, 0, 0, 0);\n\n    if (debug) {\n        if (features.length) console.log('features: %d, points: %d', this.tiles[0].numFeatures, this.tiles[0].numPoints);\n        console.timeEnd('generate tiles');\n        console.log('tiles generated:', this.total, JSON.stringify(this.stats));\n    }\n}\n\nGeoJSONVT.prototype.options = {\n    maxZoom: 14,            // max zoom to preserve detail on\n    indexMaxZoom: 5,        // max zoom in the tile index\n    indexMaxPoints: 100000, // max number of points per tile in the tile index\n    tolerance: 3,           // simplification tolerance (higher means simpler)\n    extent: 4096,           // tile extent\n    buffer: 64,             // tile buffer on each side\n    lineMetrics: false,     // whether to calculate line metrics\n    promoteId: null,        // name of a feature property to be promoted to feature.id\n    generateId: false,      // whether to generate feature ids. Cannot be used with promoteId\n    debug: 0                // logging level (0, 1 or 2)\n};\n\nGeoJSONVT.prototype.splitTile = function (features, z, x, y, cz, cx, cy) {\n\n    var stack = [features, z, x, y],\n        options = this.options,\n        debug = options.debug;\n\n    // avoid recursion by using a processing queue\n    while (stack.length) {\n        y = stack.pop();\n        x = stack.pop();\n        z = stack.pop();\n        features = stack.pop();\n\n        var z2 = 1 << z,\n            id = toID(z, x, y),\n            tile = this.tiles[id];\n\n        if (!tile) {\n            if (debug > 1) console.time('creation');\n\n            tile = this.tiles[id] = createTile(features, z, x, y, options);\n            this.tileCoords.push({z: z, x: x, y: y});\n\n            if (debug) {\n                if (debug > 1) {\n                    console.log('tile z%d-%d-%d (features: %d, points: %d, simplified: %d)',\n                        z, x, y, tile.numFeatures, tile.numPoints, tile.numSimplified);\n                    console.timeEnd('creation');\n                }\n                var key = 'z' + z;\n                this.stats[key] = (this.stats[key] || 0) + 1;\n                this.total++;\n            }\n        }\n\n        // save reference to original geometry in tile so that we can drill down later if we stop now\n        tile.source = features;\n\n        // if it's the first-pass tiling\n        if (!cz) {\n            // stop tiling if we reached max zoom, or if the tile is too simple\n            if (z === options.indexMaxZoom || tile.numPoints <= options.indexMaxPoints) continue;\n\n        // if a drilldown to a specific tile\n        } else {\n            // stop tiling if we reached base zoom or our target tile zoom\n            if (z === options.maxZoom || z === cz) continue;\n\n            // stop tiling if it's not an ancestor of the target tile\n            var m = 1 << (cz - z);\n            if (x !== Math.floor(cx / m) || y !== Math.floor(cy / m)) continue;\n        }\n\n        // if we slice further down, no need to keep source geometry\n        tile.source = null;\n\n        if (features.length === 0) continue;\n\n        if (debug > 1) console.time('clipping');\n\n        // values we'll use for clipping\n        var k1 = 0.5 * options.buffer / options.extent,\n            k2 = 0.5 - k1,\n            k3 = 0.5 + k1,\n            k4 = 1 + k1,\n            tl, bl, tr, br, left, right;\n\n        tl = bl = tr = br = null;\n\n        left  = clip(features, z2, x - k1, x + k3, 0, tile.minX, tile.maxX, options);\n        right = clip(features, z2, x + k2, x + k4, 0, tile.minX, tile.maxX, options);\n        features = null;\n\n        if (left) {\n            tl = clip(left, z2, y - k1, y + k3, 1, tile.minY, tile.maxY, options);\n            bl = clip(left, z2, y + k2, y + k4, 1, tile.minY, tile.maxY, options);\n            left = null;\n        }\n\n        if (right) {\n            tr = clip(right, z2, y - k1, y + k3, 1, tile.minY, tile.maxY, options);\n            br = clip(right, z2, y + k2, y + k4, 1, tile.minY, tile.maxY, options);\n            right = null;\n        }\n\n        if (debug > 1) console.timeEnd('clipping');\n\n        stack.push(tl || [], z + 1, x * 2,     y * 2);\n        stack.push(bl || [], z + 1, x * 2,     y * 2 + 1);\n        stack.push(tr || [], z + 1, x * 2 + 1, y * 2);\n        stack.push(br || [], z + 1, x * 2 + 1, y * 2 + 1);\n    }\n};\n\nGeoJSONVT.prototype.getTile = function (z, x, y) {\n    var options = this.options,\n        extent = options.extent,\n        debug = options.debug;\n\n    if (z < 0 || z > 24) return null;\n\n    var z2 = 1 << z;\n    x = ((x % z2) + z2) % z2; // wrap tile x coordinate\n\n    var id = toID(z, x, y);\n    if (this.tiles[id]) return transformTile(this.tiles[id], extent);\n\n    if (debug > 1) console.log('drilling down to z%d-%d-%d', z, x, y);\n\n    var z0 = z,\n        x0 = x,\n        y0 = y,\n        parent;\n\n    while (!parent && z0 > 0) {\n        z0--;\n        x0 = Math.floor(x0 / 2);\n        y0 = Math.floor(y0 / 2);\n        parent = this.tiles[toID(z0, x0, y0)];\n    }\n\n    if (!parent || !parent.source) return null;\n\n    // if we found a parent tile containing the original geometry, we can drill down from it\n    if (debug > 1) console.log('found parent tile z%d-%d-%d', z0, x0, y0);\n\n    if (debug > 1) console.time('drilling down');\n    this.splitTile(parent.source, z0, x0, y0, z, x, y);\n    if (debug > 1) console.timeEnd('drilling down');\n\n    return this.tiles[id] ? transformTile(this.tiles[id], extent) : null;\n};\n\nfunction toID(z, x, y) {\n    return (((1 << z) * y + x) * 32) + z;\n}\n\nfunction extend(dest, src) {\n    for (var i in src) dest[i] = src[i];\n    return dest;\n}\n\nreturn geojsonvt;\n\n})));\n","// @flow\n\nimport {getJSON} from '../util/ajax.js';\n\nimport {getPerformanceMeasurement} from '../util/performance.js';\nimport GeoJSONWrapper from './geojson_wrapper.js';\nimport vtpbf from 'vt-pbf';\nimport Supercluster from 'supercluster';\nimport geojsonvt from 'geojson-vt';\nimport assert from 'assert';\nimport VectorTileWorkerSource from './vector_tile_worker_source.js';\nimport {createExpression} from '../style-spec/expression/index.js';\n\nimport type {\n    RequestedTileParameters,\n    WorkerTileParameters,\n    WorkerTileCallback,\n} from '../source/worker_source.js';\n\nimport type Actor from '../util/actor.js';\nimport type StyleLayerIndex from '../style/style_layer_index.js';\n\nimport type {LoadVectorDataCallback} from './load_vector_tile.js';\nimport type {RequestParameters, ResponseCallback} from '../util/ajax.js';\nimport type {Callback} from '../types/callback.js';\nimport type {GeoJSONFeature} from '@mapbox/geojson-types';\n\nexport type GeoJSONWorkerOptions = {\n    source: string,\n    cluster: boolean,\n    superclusterOptions?: Object,\n    geojsonVtOptions?: Object,\n    clusterProperties?: Object,\n    filter?: Array<mixed>,\n    dynamic?: boolean\n};\n\nexport type LoadGeoJSONParameters = GeoJSONWorkerOptions & {\n    request?: RequestParameters,\n    data?: string,\n    append?: boolean\n};\n\nexport type LoadGeoJSON = (params: LoadGeoJSONParameters, callback: ResponseCallback<Object>) => void;\n\nexport interface GeoJSONIndex {\n    getTile(z: number, x: number, y: number): Object;\n\n    // supercluster methods\n    getClusterExpansionZoom(clusterId: number): number;\n    getChildren(clusterId: number): Array<GeoJSONFeature>;\n    getLeaves(clusterId: number, limit: number, offset: number): Array<GeoJSONFeature>;\n}\n\n// $FlowFixMe[missing-this-annot]\nfunction loadGeoJSONTile(params: RequestedTileParameters, callback: LoadVectorDataCallback) {\n    const canonical = params.tileID.canonical;\n\n    if (!this._geoJSONIndex) {\n        return callback(null, null);  // we couldn't load the file\n    }\n\n    const geoJSONTile = this._geoJSONIndex.getTile(canonical.z, canonical.x, canonical.y);\n    if (!geoJSONTile) {\n        return callback(null, null); // nothing in the given tile\n    }\n\n    const geojsonWrapper = new GeoJSONWrapper(geoJSONTile.features);\n\n    // Encode the geojson-vt tile into binary vector tile form.  This\n    // is a convenience that allows `FeatureIndex` to operate the same way\n    // across `VectorTileSource` and `GeoJSONSource` data.\n    let pbf = vtpbf(geojsonWrapper);\n    if (pbf.byteOffset !== 0 || pbf.byteLength !== pbf.buffer.byteLength) {\n        // Compatibility with node Buffer (https://github.com/mapbox/pbf/issues/35)\n        pbf = new Uint8Array(pbf);\n    }\n\n    callback(null, {\n        vectorTile: geojsonWrapper,\n        rawData: pbf.buffer\n    });\n}\n\n/**\n * The {@link WorkerSource} implementation that supports {@link GeoJSONSource}.\n * This class is designed to be easily reused to support custom source types\n * for data formats that can be parsed/converted into an in-memory GeoJSON\n * representation.  To do so, create it with\n * `new GeoJSONWorkerSource(actor, layerIndex, customLoadGeoJSONFunction)`.\n * For a full example, see [mapbox-gl-topojson](https://github.com/developmentseed/mapbox-gl-topojson).\n *\n * @private\n */\nclass GeoJSONWorkerSource extends VectorTileWorkerSource {\n    loadGeoJSON: LoadGeoJSON;\n    _geoJSONIndex: GeoJSONIndex;\n    _featureMap: Map<number | string, mixed>;\n\n    /**\n     * @param [loadGeoJSON] Optional method for custom loading/parsing of\n     * GeoJSON based on parameters passed from the main-thread Source.\n     * See {@link GeoJSONWorkerSource#loadGeoJSON}.\n     * @private\n     */\n    constructor(actor: Actor, layerIndex: StyleLayerIndex, availableImages: Array<string>, isSpriteLoaded: boolean, loadGeoJSON: ?LoadGeoJSON, brightness: ?number) {\n        super(actor, layerIndex, availableImages, isSpriteLoaded, loadGeoJSONTile, brightness);\n        if (loadGeoJSON) {\n            this.loadGeoJSON = loadGeoJSON;\n        }\n        this._featureMap = new Map();\n    }\n\n    /**\n     * Fetches (if appropriate), parses, and index geojson data into tiles. This\n     * preparatory method must be called before {@link GeoJSONWorkerSource#loadTile}\n     * can correctly serve up tiles.\n     *\n     * Defers to {@link GeoJSONWorkerSource#loadGeoJSON} for the fetching/parsing,\n     * expecting `callback(error, data)` to be called with either an error or a\n     * parsed GeoJSON object.\n     *\n     * When `loadData` requests come in faster than they can be processed,\n     * they are coalesced into a single request using the latest data.\n     * See {@link GeoJSONWorkerSource#coalesce}\n     *\n     * @param params\n     * @param callback\n     * @private\n     */\n    loadData(params: LoadGeoJSONParameters, callback: Callback<{resourceTiming?: {[_: string]: Array<PerformanceResourceTiming>}}>) {\n        const requestParam = params && params.request;\n        const perf = requestParam && requestParam.collectResourceTiming;\n\n        this.loadGeoJSON(params, (err: ?Error, data: ?Object) => {\n            if (err || !data) {\n                return callback(err);\n\n            } else if (typeof data !== 'object') {\n                return callback(new Error(`Input data given to '${params.source}' is not a valid GeoJSON object.`));\n\n            } else {\n                try {\n                    if (params.filter) {\n                        const compiled = createExpression(params.filter, {type: 'boolean', 'property-type': 'data-driven', overridable: false, transition: false});\n                        if (compiled.result === 'error')\n                            throw new Error(compiled.value.map(err => `${err.key}: ${err.message}`).join(', '));\n\n                        data.features = data.features.filter(feature => compiled.value.evaluate({zoom: 0}, feature));\n                    }\n\n                    // for GeoJSON sources that are marked as dynamic, we retain the GeoJSON data\n                    // as a id-to-feature map so that we can later update features by id individually\n                    if (params.dynamic) {\n                        if (data.type === 'Feature') data = {type: 'FeatureCollection', features: [data]};\n\n                        if (!params.append) {\n                            this._featureMap.clear();\n                        }\n\n                        for (const feature of (data.features || [])) {\n                            const id = feature.id;\n                            if (id !== undefined) {\n                                if (!feature.geometry) {\n                                    this._featureMap.delete(id);\n                                } else {\n                                    this._featureMap.set(id, feature);\n                                }\n                            }\n                        }\n                        data.features = [...this._featureMap.values()];\n                    }\n\n                    this._geoJSONIndex = params.cluster ?\n                        new Supercluster(getSuperclusterOptions(params)).load(data.features) :\n                        geojsonvt(data, params.geojsonVtOptions);\n\n                } catch (err) {\n                    return callback(err);\n                }\n\n                this.loaded = {};\n\n                const result = {};\n                if (perf) {\n                    const resourceTimingData = getPerformanceMeasurement(requestParam);\n                    // it's necessary to eval the result of getEntriesByName() here via parse/stringify\n                    // late evaluation in the main thread causes TypeError: illegal invocation\n                    if (resourceTimingData) {\n                        result.resourceTiming = {};\n                        result.resourceTiming[params.source] = JSON.parse(JSON.stringify(resourceTimingData));\n                    }\n                }\n                callback(null, result);\n            }\n        });\n    }\n\n    /**\n    * Implements {@link WorkerSource#reloadTile}.\n    *\n    * If the tile is loaded, uses the implementation in VectorTileWorkerSource.\n    * Otherwise, such as after a setData() call, we load the tile fresh.\n    *\n    * @param params\n    * @param params.uid The UID for this tile.\n    * @private\n    */\n    reloadTile(params: WorkerTileParameters, callback: WorkerTileCallback): void {\n        const loaded = this.loaded,\n            uid = params.uid;\n\n        if (loaded && loaded[uid]) {\n            return super.reloadTile(params, callback);\n        } else {\n            return this.loadTile(params, callback);\n        }\n    }\n\n    /**\n     * Fetch and parse GeoJSON according to the given params.  Calls `callback`\n     * with `(err, data)`, where `data` is a parsed GeoJSON object.\n     *\n     * GeoJSON is loaded and parsed from `params.url` if it exists, or else\n     * expected as a literal (string or object) `params.data`.\n     *\n     * @param params\n     * @param [params.url] A URL to the remote GeoJSON data.\n     * @param [params.data] Literal GeoJSON data. Must be provided if `params.url` is not.\n     * @private\n     */\n    // $FlowFixMe[duplicate-class-member]\n    loadGeoJSON(params: LoadGeoJSONParameters, callback: ResponseCallback<Object>): void {\n        // Because of same origin issues, urls must either include an explicit\n        // origin or absolute path.\n        // ie: /foo/bar.json or http://example.com/bar.json\n        // but not ../foo/bar.json\n        if (params.request) {\n            getJSON(params.request, callback);\n        } else if (typeof params.data === 'string') {\n            try {\n                return callback(null, JSON.parse(params.data));\n            } catch (e) {\n                return callback(new Error(`Input data given to '${params.source}' is not a valid GeoJSON object.`));\n            }\n        } else {\n            return callback(new Error(`Input data given to '${params.source}' is not a valid GeoJSON object.`));\n        }\n    }\n\n    getClusterExpansionZoom(params: {clusterId: number}, callback: Callback<number>) {\n        try {\n            callback(null, this._geoJSONIndex.getClusterExpansionZoom(params.clusterId));\n        } catch (e) {\n            callback(e);\n        }\n    }\n\n    getClusterChildren(params: {clusterId: number}, callback: Callback<Array<GeoJSONFeature>>) {\n        try {\n            callback(null, this._geoJSONIndex.getChildren(params.clusterId));\n        } catch (e) {\n            callback(e);\n        }\n    }\n\n    getClusterLeaves(params: {clusterId: number, limit: number, offset: number}, callback: Callback<Array<GeoJSONFeature>>) {\n        try {\n            callback(null, this._geoJSONIndex.getLeaves(params.clusterId, params.limit, params.offset));\n        } catch (e) {\n            callback(e);\n        }\n    }\n}\n\nfunction getSuperclusterOptions({superclusterOptions, clusterProperties}: LoadGeoJSONParameters) {\n    if (!clusterProperties || !superclusterOptions) return superclusterOptions;\n\n    const mapExpressions = {};\n    const reduceExpressions = {};\n    const globals = {accumulated: null, zoom: 0};\n    const feature = {properties: null};\n    const propertyNames = Object.keys(clusterProperties);\n\n    for (const key of propertyNames) {\n        const [operator, mapExpression] = clusterProperties[key];\n\n        const mapExpressionParsed = createExpression(mapExpression);\n        const reduceExpressionParsed = createExpression(\n            typeof operator === 'string' ? [operator, ['accumulated'], ['get', key]] : operator);\n\n        assert(mapExpressionParsed.result === 'success');\n        assert(reduceExpressionParsed.result === 'success');\n\n        mapExpressions[key] = mapExpressionParsed.value;\n        reduceExpressions[key] = reduceExpressionParsed.value;\n    }\n\n    superclusterOptions.map = (pointProperties) => {\n        feature.properties = pointProperties;\n        const properties = {};\n        for (const key of propertyNames) {\n            properties[key] = mapExpressions[key].evaluate(globals, feature);\n        }\n        return properties;\n    };\n    superclusterOptions.reduce = (accumulated, clusterProperties) => {\n        feature.properties = clusterProperties;\n        for (const key of propertyNames) {\n            globals.accumulated = accumulated[key];\n            accumulated[key] = reduceExpressions[key].evaluate(globals, feature);\n        }\n    };\n\n    return superclusterOptions;\n}\n\nexport default GeoJSONWorkerSource;\n","// @flow\n\nimport {getArrayBuffer} from '../../src/util/ajax.js';\nimport FeatureIndex from '../../src/data/feature_index.js';\nimport {process3DTile} from './model_loader.js';\nimport {tileToMeter} from '../../src/geo/mercator_coordinate.js';\nimport Tiled3dModelBucket from '../data/bucket/tiled_3d_model_bucket.js';\nimport {CanonicalTileID, OverscaledTileID} from '../../src/source/tile_id.js';\nimport {load3DTile} from '../util/loaders.js';\nimport EvaluationParameters from '../../src/style/evaluation_parameters.js';\n\nimport type Actor from '../../src/util/actor.js';\nimport type StyleLayerIndex from '../../src/style/style_layer_index.js';\nimport type {\n    WorkerSource,\n    WorkerTileParameters,\n    WorkerTileCallback,\n    TileParameters,\n    WorkerTileResult\n} from '../../src/source/worker_source.js';\nimport type {Bucket} from '../../src/data/bucket.js';\nimport type Projection from '../../src/geo/projection/projection.js';\n\nclass Tiled3dWorkerTile {\n    tileID: OverscaledTileID;\n    uid: number;\n    zoom: number;\n    tileZoom: number;\n    canonical: CanonicalTileID;\n    pixelRatio: number;\n    tileSize: number;\n    source: string;\n    overscaling: number;\n    projection: Projection;\n    status: 'parsing' | 'done';\n    reloadCallback: ?WorkerTileCallback;\n    brightness: ?number;\n\n    constructor(params: WorkerTileParameters, brightness: ?number) {\n        this.tileID = new OverscaledTileID(params.tileID.overscaledZ, params.tileID.wrap, params.tileID.canonical.z, params.tileID.canonical.x, params.tileID.canonical.y);\n        this.tileZoom = params.tileZoom;\n        this.uid = params.uid;\n        this.zoom = params.zoom;\n        this.canonical = params.tileID.canonical;\n        this.pixelRatio = params.pixelRatio;\n        this.tileSize = params.tileSize;\n        this.source = params.source;\n        this.overscaling = this.tileID.overscaleFactor();\n        this.projection = params.projection;\n        this.brightness = brightness;\n    }\n\n    parse(data: ArrayBuffer, layerIndex: StyleLayerIndex, params: WorkerTileParameters, callback: WorkerTileCallback): Promise<void> {\n        this.status = 'parsing';\n        const tileID = new OverscaledTileID(params.tileID.overscaledZ, params.tileID.wrap, params.tileID.canonical.z, params.tileID.canonical.x, params.tileID.canonical.y);\n        const buckets: {[_: string]: Bucket} = {};\n        const layerFamilies = layerIndex.familiesBySource[params.source];\n        const featureIndex = new FeatureIndex(tileID, params.promoteId);\n        featureIndex.bucketLayerIDs = [];\n        featureIndex.is3DTile = true;\n\n        return load3DTile(data)\n            .then(gltf => {\n                if (!gltf) return callback(new Error('Could not parse tile'));\n                const nodes = process3DTile(gltf, 1.0 / tileToMeter(params.tileID.canonical));\n                const hasMapboxMeshFeatures = (gltf.json.extensionsUsed && gltf.json.extensionsUsed.includes('MAPBOX_mesh_features')) ||\n                                            (gltf.json.asset.extras && gltf.json.asset.extras['MAPBOX_mesh_features']);\n                const hasMeshoptCompression = gltf.json.extensionsUsed && gltf.json.extensionsUsed.includes('EXT_meshopt_compression');\n\n                const parameters = new EvaluationParameters(this.zoom, {brightness: this.brightness});\n                for (const sourceLayerId in layerFamilies) {\n                    for (const family of layerFamilies[sourceLayerId]) {\n                        const layer = family[0];\n                        featureIndex.bucketLayerIDs.push(family.map((l) => l.id));\n                        layer.recalculate(parameters, []);\n                        const bucket = new Tiled3dModelBucket(nodes, tileID, hasMapboxMeshFeatures, hasMeshoptCompression, this.brightness, featureIndex);\n                        // Upload to GPU without waiting for evaluation if we are in diffuse path\n                        if (!hasMapboxMeshFeatures) bucket.needsUpload = true;\n                        buckets[layer.fqid] = bucket;\n                        // do the first evaluation in the worker to avoid stuttering\n                        // $FlowIgnore[incompatible-call] layer here is always a ModelStyleLayer\n                        bucket.evaluate(layer);\n                    }\n                }\n                this.status = 'done';\n                // $FlowFixMe flow is complaining about missing properties and buckets not being of type Array\n                callback(null, {buckets, featureIndex});\n            })\n            .catch((err) => callback(new Error(err.message)));\n    }\n}\n\n// $FlowIgnore[prop-missing] we don't need all Worker source properties\nclass Tiled3dModelWorkerSource implements WorkerSource {\n    actor: Actor;\n    layerIndex: StyleLayerIndex;\n\n    loading: {[_: number]: Tiled3dWorkerTile };\n    loaded: {[_: number]: Tiled3dWorkerTile };\n    brightness: ?number;\n    constructor(actor: Actor, layerIndex: StyleLayerIndex, availableImages: Array<string>, isSpriteLoaded: boolean, loadVectorData: ?any, brightness: ?number) {\n        this.actor = actor;\n        this.layerIndex = layerIndex;\n        this.brightness = brightness;\n        this.loading = {};\n        this.loaded = {};\n    }\n\n    loadTile(params: WorkerTileParameters, callback: WorkerTileCallback) {\n        const uid = params.uid;\n        const workerTile = this.loading[uid] = new Tiled3dWorkerTile(params, this.brightness);\n        getArrayBuffer(params.request, (err: ?Error, data: ?ArrayBuffer) => {\n            const aborted = !this.loading[uid];\n            delete this.loading[uid];\n\n            if (aborted || err) {\n                workerTile.status = 'done';\n                if (!aborted) this.loaded[uid] = workerTile;\n                return callback(err);\n            }\n\n            if (!data || data.byteLength === 0) {\n                workerTile.status = 'done';\n                this.loaded[uid] = workerTile;\n                return callback();\n            }\n\n            const workerTileCallback = (err: ?Error, result: ?WorkerTileResult) => {\n                workerTile.status = 'done';\n                this.loaded = this.loaded || {};\n                this.loaded[uid] = workerTile;\n\n                if (err || !result) callback(err);\n                else callback(null, result);\n            };\n\n            workerTile.parse(data, this.layerIndex, params, workerTileCallback);\n        });\n    }\n\n    /**\n     * Re-parses a tile that has already been loaded.  Yields the same data as\n     * {@link WorkerSource#loadTile}.\n     */\n    // eslint-disable-next-line no-unused-vars\n    reloadTile(params: WorkerTileParameters, callback: WorkerTileCallback) {\n        const loaded = this.loaded;\n        const uid = params.uid;\n        if (loaded && loaded[uid]) {\n            const workerTile = loaded[uid];\n            workerTile.projection = params.projection;\n            workerTile.brightness = params.brightness;\n\n            const done = (err: ?Error, data: ?WorkerTileResult) => {\n                const reloadCallback = workerTile.reloadCallback;\n                if (reloadCallback) {\n                    delete workerTile.reloadCallback;\n                    this.loadTile(params, callback);\n                }\n                callback(err, data);\n            };\n\n            if (workerTile.status === 'parsing') {\n                workerTile.reloadCallback = done;\n            } else if (workerTile.status === 'done') {\n                // do the request again\n                this.loadTile(params, callback);\n            }\n        }\n    }\n\n    /**\n     * Aborts loading a tile that is in progress.\n     */\n    // eslint-disable-next-line no-unused-vars\n    abortTile(params: TileParameters, callback: WorkerTileCallback) {\n        const uid = params.uid;\n        const tile = this.loading[uid];\n        if (tile) {\n            delete this.loading[uid];\n        }\n        callback();\n    }\n\n    /**\n     * Removes this tile from any local caches.\n     */\n    // eslint-disable-next-line no-unused-vars\n    removeTile(params: TileParameters, callback: WorkerTileCallback) {\n        const loaded = this.loaded,\n            uid = params.uid;\n        if (loaded && loaded[uid]) {\n            delete loaded[uid];\n        }\n        callback();\n    }\n\n}\n\nexport default Tiled3dModelWorkerSource;\n","// @flow\n\nimport Actor from '../util/actor.js';\n\nimport StyleLayerIndex from '../style/style_layer_index.js';\nimport VectorTileWorkerSource from './vector_tile_worker_source.js';\nimport RasterDEMTileWorkerSource from './raster_dem_tile_worker_source.js';\nimport RasterArrayTileWorkerSource from './raster_array_tile_worker_source.js';\nimport GeoJSONWorkerSource from './geojson_worker_source.js';\nimport Tiled3dModelWorkerSource from '../../3d-style/source/tiled_3d_model_worker_source.js';\nimport assert from 'assert';\nimport {plugin as globalRTLTextPlugin} from './rtl_text_plugin.js';\nimport {enforceCacheSizeLimit} from '../util/tile_request_cache.js';\nimport {PerformanceUtils} from '../util/performance.js';\nimport {Event} from '../util/evented.js';\nimport {getProjection} from '../geo/projection/index.js';\n\nimport type {Class} from '../types/class.js';\n\nimport type {\n    WorkerSource,\n    WorkerTileParameters,\n    WorkerDEMTileParameters,\n    WorkerTileCallback,\n    WorkerDEMTileCallback,\n    TileParameters,\n    WorkerRasterArrayTileParameters,\n    WorkerRasterArrayTileCallback\n} from '../source/worker_source.js';\n\nimport type {WorkerGlobalScopeInterface} from '../util/web_worker.js';\nimport type {Callback} from '../types/callback.js';\nimport type {LayerSpecification, ProjectionSpecification} from '../style-spec/types.js';\nimport type {ConfigOptions} from '../style/properties.js';\nimport type {PluginState} from './rtl_text_plugin.js';\nimport type Projection from '../geo/projection/projection.js';\n\n/**\n * @private\n */\nexport default class Worker {\n    self: WorkerGlobalScopeInterface;\n    actor: Actor;\n    layerIndexes: {[mapId: string]: {[scope: string]: StyleLayerIndex }};\n    availableImages: {[mapId: string]: {[scope: string]: Array<string>}};\n    workerSourceTypes: {[_: string]: Class<WorkerSource> };\n    workerSources: {[mapId: string]: {[scope: string]: {[sourceType: string]: {[sourceId: string]: WorkerSource}}}};\n    demWorkerSources: {[mapId: string]: {[scope: string]: {[sourceId: string]: RasterDEMTileWorkerSource }}};\n    rasterArrayWorkerSource: ?RasterArrayTileWorkerSource;\n    projections: {[_: string]: Projection };\n    defaultProjection: Projection;\n    isSpriteLoaded: {[mapId: string]: {[scope: string]: boolean}};\n    referrer: ?string;\n    dracoUrl: ?string\n    brightness: ?number;\n\n    constructor(self: WorkerGlobalScopeInterface) {\n        PerformanceUtils.measure('workerEvaluateScript');\n        this.self = self;\n        this.actor = new Actor(self, this);\n\n        this.layerIndexes = {};\n        this.availableImages = {};\n        this.isSpriteLoaded = {};\n\n        this.projections = {};\n        this.defaultProjection = getProjection({name: 'mercator'});\n\n        this.workerSourceTypes = {\n            vector: VectorTileWorkerSource,\n            geojson: GeoJSONWorkerSource,\n            'batched-model': Tiled3dModelWorkerSource\n        };\n\n        // [mapId][scope][sourceType][sourceName] => worker source instance\n        this.workerSources = {};\n        this.demWorkerSources = {};\n\n        this.self.registerWorkerSource = (name: string, WorkerSource: Class<WorkerSource>) => {\n            if (this.workerSourceTypes[name]) {\n                throw new Error(`Worker source with name \"${name}\" already registered.`);\n            }\n            this.workerSourceTypes[name] = WorkerSource;\n        };\n\n        // This is invoked by the RTL text plugin when the download via the `importScripts` call has finished, and the code has been parsed.\n        this.self.registerRTLTextPlugin = (rtlTextPlugin: {applyArabicShaping: Function, processBidirectionalText: Function, processStyledBidirectionalText?: Function}) => {\n            if (globalRTLTextPlugin.isParsed()) {\n                throw new Error('RTL text plugin already registered.');\n            }\n            globalRTLTextPlugin['applyArabicShaping'] = rtlTextPlugin.applyArabicShaping;\n            globalRTLTextPlugin['processBidirectionalText'] = rtlTextPlugin.processBidirectionalText;\n            globalRTLTextPlugin['processStyledBidirectionalText'] = rtlTextPlugin.processStyledBidirectionalText;\n        };\n    }\n\n    clearCaches(mapId: string, unused: mixed, callback: WorkerTileCallback) {\n        delete this.layerIndexes[mapId];\n        delete this.availableImages[mapId];\n        delete this.workerSources[mapId];\n        delete this.demWorkerSources[mapId];\n        delete this.rasterArrayWorkerSource;\n        callback();\n    }\n\n    checkIfReady(mapID: string, unused: mixed, callback: WorkerTileCallback) {\n        // noop, used to check if a worker is fully set up and ready to receive messages\n        callback();\n    }\n\n    setReferrer(mapID: string, referrer: string) {\n        this.referrer = referrer;\n    }\n\n    spriteLoaded(mapId: string, {scope, isLoaded}: {scope: string, isLoaded: boolean}) {\n        if (!this.isSpriteLoaded[mapId])\n            this.isSpriteLoaded[mapId] = {};\n\n        this.isSpriteLoaded[mapId][scope] = isLoaded;\n\n        if (!this.workerSources[mapId] || !this.workerSources[mapId][scope]) {\n            return;\n        }\n\n        for (const workerSource in this.workerSources[mapId][scope]) {\n            const ws = this.workerSources[mapId][scope][workerSource];\n            for (const source in ws) {\n                if (ws[source] instanceof VectorTileWorkerSource) {\n                    ws[source].isSpriteLoaded = isLoaded;\n                    ws[source].fire(new Event('isSpriteLoaded'));\n                }\n            }\n        }\n    }\n\n    setImages(mapId: string, {scope, images}: {scope: string, images: Array<string>}, callback: WorkerTileCallback) {\n        if (!this.availableImages[mapId]) {\n            this.availableImages[mapId] = {};\n        }\n\n        this.availableImages[mapId][scope] = images;\n\n        if (!this.workerSources[mapId] || !this.workerSources[mapId][scope]) {\n            callback();\n            return;\n        }\n\n        for (const workerSource in this.workerSources[mapId][scope]) {\n            const ws = this.workerSources[mapId][scope][workerSource];\n            for (const source in ws) {\n                ws[source].availableImages = images;\n            }\n        }\n\n        callback();\n    }\n\n    setProjection(mapId: string, config: ProjectionSpecification) {\n        this.projections[mapId] = getProjection(config);\n    }\n\n    setBrightness(mapId: string, brightness: ?number, callback: WorkerTileCallback) {\n        this.brightness = brightness;\n        callback();\n    }\n\n    setLayers(mapId: string, params: {layers: Array<LayerSpecification>, scope: string, options: ConfigOptions}, callback: WorkerTileCallback) {\n        this.getLayerIndex(mapId, params.scope).replace(params.layers, params.options);\n        callback();\n    }\n\n    updateLayers(mapId: string, params: {layers: Array<LayerSpecification>, scope: string, removedIds: Array<string>, options: ConfigOptions}, callback: WorkerTileCallback) {\n        this.getLayerIndex(mapId, params.scope).update(params.layers, params.removedIds, params.options);\n        callback();\n    }\n\n    loadTile(mapId: string, params: WorkerTileParameters & {type: string}, callback: WorkerTileCallback) {\n        assert(params.type);\n        params.projection = this.projections[mapId] || this.defaultProjection;\n        this.getWorkerSource(mapId, params.type, params.source, params.scope).loadTile(params, callback);\n    }\n\n    loadDEMTile(mapId: string, params: WorkerDEMTileParameters, callback: WorkerDEMTileCallback) {\n        this.getDEMWorkerSource(mapId, params.source, params.scope).loadTile(params, callback);\n    }\n\n    decodeRasterArray(mapId: string, params: WorkerRasterArrayTileParameters, callback: WorkerRasterArrayTileCallback) {\n        this.getRasterArrayWorkerSource().decodeRasterArray(params, callback);\n    }\n\n    reloadTile(mapId: string, params: WorkerTileParameters & {type: string}, callback: WorkerTileCallback) {\n        assert(params.type);\n        params.projection = this.projections[mapId] || this.defaultProjection;\n        this.getWorkerSource(mapId, params.type, params.source, params.scope).reloadTile(params, callback);\n    }\n\n    abortTile(mapId: string, params: TileParameters & {type: string}, callback: WorkerTileCallback) {\n        assert(params.type);\n        this.getWorkerSource(mapId, params.type, params.source, params.scope).abortTile(params, callback);\n    }\n\n    removeTile(mapId: string, params: TileParameters & {type: string}, callback: WorkerTileCallback) {\n        assert(params.type);\n        this.getWorkerSource(mapId, params.type, params.source, params.scope).removeTile(params, callback);\n    }\n\n    removeSource(mapId: string, params: {source: string, scope: string, type: string}, callback: WorkerTileCallback) {\n        assert(params.type);\n        assert(params.scope);\n        assert(params.source);\n\n        if (!this.workerSources[mapId] ||\n            !this.workerSources[mapId][params.scope] ||\n            !this.workerSources[mapId][params.scope][params.type] ||\n            !this.workerSources[mapId][params.scope][params.type][params.source]) {\n            return;\n        }\n\n        const worker = this.workerSources[mapId][params.scope][params.type][params.source];\n        delete this.workerSources[mapId][params.scope][params.type][params.source];\n\n        if (worker.removeSource !== undefined) {\n            worker.removeSource(params, callback);\n        } else {\n            callback();\n        }\n    }\n\n    /**\n     * Load a {@link WorkerSource} script at params.url.  The script is run\n     * (using importScripts) with `registerWorkerSource` in scope, which is a\n     * function taking `(name, workerSourceObject)`.\n     *  @private\n     */\n    loadWorkerSource(map: string, params: { url: string }, callback: Callback<void>) {\n        try {\n            this.self.importScripts(params.url);\n            callback();\n        } catch (e) {\n            callback(e.toString());\n        }\n    }\n\n    syncRTLPluginState(map: string, state: PluginState, callback: Callback<boolean>) {\n        try {\n            globalRTLTextPlugin.setState(state);\n            const pluginURL = globalRTLTextPlugin.getPluginURL();\n            if (\n                globalRTLTextPlugin.isLoaded() &&\n                !globalRTLTextPlugin.isParsed() &&\n                pluginURL != null // Not possible when `isLoaded` is true, but keeps flow happy\n            ) {\n                this.self.importScripts(pluginURL);\n                const complete = globalRTLTextPlugin.isParsed();\n                const error = complete ? undefined : new Error(`RTL Text Plugin failed to import scripts from ${pluginURL}`);\n                callback(error, complete);\n            }\n        } catch (e) {\n            callback(e.toString());\n        }\n    }\n\n    setDracoUrl(map: string, dracoUrl: string) {\n        this.dracoUrl = dracoUrl;\n    }\n\n    getAvailableImages(mapId: string, scope: string): Array<string> {\n        if (!this.availableImages[mapId]) {\n            this.availableImages[mapId] = {};\n        }\n\n        let availableImages = this.availableImages[mapId][scope];\n\n        if (!availableImages) {\n            availableImages = [];\n        }\n\n        return availableImages;\n    }\n\n    getLayerIndex(mapId: string, scope: string): StyleLayerIndex {\n        if (!this.layerIndexes[mapId]) {\n            this.layerIndexes[mapId] = {};\n        }\n\n        let layerIndex = this.layerIndexes[mapId][scope];\n\n        if (!layerIndex) {\n            layerIndex = this.layerIndexes[mapId][scope] = new StyleLayerIndex();\n            layerIndex.scope = scope;\n        }\n\n        return layerIndex;\n    }\n\n    getWorkerSource(mapId: string, type: string, source: string, scope: string): WorkerSource {\n        if (!this.workerSources[mapId])\n            this.workerSources[mapId] = {};\n        if (!this.workerSources[mapId][scope])\n            this.workerSources[mapId][scope] = {};\n        if (!this.workerSources[mapId][scope][type])\n            this.workerSources[mapId][scope][type] = {};\n        if (!this.isSpriteLoaded[mapId])\n            this.isSpriteLoaded[mapId] = {};\n\n        if (!this.workerSources[mapId][scope][type][source]) {\n            // use a wrapped actor so that we can attach a target mapId param\n            // to any messages invoked by the WorkerSource\n            const actor = {\n                send: (type: string, data: mixed, callback: any, _: any, mustQueue: boolean, metadata: any) => {\n                    this.actor.send(type, data, callback, mapId, mustQueue, metadata);\n                },\n                scheduler: this.actor.scheduler\n            };\n            this.workerSources[mapId][scope][type][source] = new (this.workerSourceTypes[type]: any)(\n                (actor: any),\n                this.getLayerIndex(mapId, scope),\n                this.getAvailableImages(mapId, scope),\n                this.isSpriteLoaded[mapId][scope],\n                undefined,\n                this.brightness);\n        }\n\n        return this.workerSources[mapId][scope][type][source];\n    }\n\n    getDEMWorkerSource(mapId: string, source: string, scope: string): RasterDEMTileWorkerSource {\n        if (!this.demWorkerSources[mapId])\n            this.demWorkerSources[mapId] = {};\n\n        if (!this.demWorkerSources[mapId][scope])\n            this.demWorkerSources[mapId][scope] = {};\n\n        if (!this.demWorkerSources[mapId][scope][source]) {\n            this.demWorkerSources[mapId][scope][source] = new RasterDEMTileWorkerSource();\n        }\n\n        return this.demWorkerSources[mapId][scope][source];\n    }\n\n    getRasterArrayWorkerSource(): RasterArrayTileWorkerSource {\n        if (!this.rasterArrayWorkerSource) {\n            this.rasterArrayWorkerSource = new RasterArrayTileWorkerSource();\n        }\n\n        return this.rasterArrayWorkerSource;\n    }\n\n    enforceCacheSizeLimit(mapId: string, limit: number) {\n        enforceCacheSizeLimit(limit);\n    }\n\n    getWorkerPerformanceMetrics(mapId: string, params: any, callback: (error: ?Error, result: ?Object) => void) {\n        callback(undefined, PerformanceUtils.getWorkerPerformanceMetrics());\n    }\n}\n\n/* global WorkerGlobalScope */\nif (typeof WorkerGlobalScope !== 'undefined' &&\n    typeof self !== 'undefined' &&\n    self instanceof WorkerGlobalScope) {\n    // $FlowFixMe[prop-missing]\n    self.worker = new Worker(self);\n}\n","// @flow\n\n/**\n * Deeply compares two object literals.\n *\n * @private\n */\nfunction deepEqual(a: ?mixed, b: ?mixed): boolean {\n    if (Array.isArray(a)) {\n        if (!Array.isArray(b) || a.length !== b.length) return false;\n        for (let i = 0; i < a.length; i++) {\n            if (!deepEqual(a[i], b[i])) return false;\n        }\n        return true;\n    }\n    if (typeof a === 'object' && a !== null && b !== null) {\n        if (!(typeof b === 'object')) return false;\n        const keys = Object.keys(a);\n        if (keys.length !== Object.keys(b).length) return false;\n        for (const key in a) {\n            if (!deepEqual(a[key], b[key])) return false;\n        }\n        return true;\n    }\n    return a === b;\n}\n\nexport default deepEqual;\n","'use strict';\n\nexports.supported = isSupported;\nexports.notSupportedReason = notSupportedReason;\n\n/**\n * Test whether the current browser supports Mapbox GL JS\n * @param {Object} options\n * @param {boolean} [options.failIfMajorPerformanceCaveat=false] Return `false`\n *   if the performance of Mapbox GL JS would be dramatically worse than\n *   expected (i.e. a software renderer is would be used)\n * @return {boolean}\n */\nfunction isSupported(options) {\n    return !notSupportedReason(options);\n}\n\nfunction notSupportedReason(options) {\n    if (!isBrowser()) return 'not a browser';\n    if (!isWorkerSupported()) return 'insufficient worker support';\n    if (!isCanvasGetImageDataSupported()) return 'insufficient Canvas/getImageData support';\n    if (!isWebGLSupportedCached(options && options.failIfMajorPerformanceCaveat)) return 'insufficient WebGL2 support';\n    if (!isNotIE()) return 'insufficient ECMAScript 6 support';\n}\n\nfunction isBrowser() {\n    return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nfunction isWorkerSupported() {\n    if (!('Worker' in window && 'Blob' in window && 'URL' in window)) {\n        return false;\n    }\n\n    var blob = new Blob([''], { type: 'text/javascript' });\n    var workerURL = URL.createObjectURL(blob);\n    var supported;\n    var worker;\n\n    try {\n        worker = new Worker(workerURL);\n        supported = true;\n    } catch (e) {\n        supported = false;\n    }\n\n    if (worker) {\n        worker.terminate();\n    }\n    URL.revokeObjectURL(workerURL);\n\n    return supported;\n}\n\n// Some browsers or browser extensions block access to canvas data to prevent fingerprinting.\n// Mapbox GL uses this API to load sprites and images in general.\nfunction isCanvasGetImageDataSupported() {\n    var canvas = document.createElement('canvas');\n    canvas.width = canvas.height = 1;\n    var context = canvas.getContext('2d');\n    if (!context) {\n        return false;\n    }\n    var imageData = context.getImageData(0, 0, 1, 1);\n    return imageData && imageData.width === canvas.width;\n}\n\nvar isWebGLSupportedCache = {};\nfunction isWebGLSupportedCached(failIfMajorPerformanceCaveat) {\n\n    if (isWebGLSupportedCache[failIfMajorPerformanceCaveat] === undefined) {\n        isWebGLSupportedCache[failIfMajorPerformanceCaveat] = isWebGLSupported(failIfMajorPerformanceCaveat);\n    }\n\n    return isWebGLSupportedCache[failIfMajorPerformanceCaveat];\n}\n\nisSupported.webGLContextAttributes = {\n    antialias: false,\n    alpha: true,\n    stencil: true,\n    depth: true\n};\n\nfunction getWebGLContext(failIfMajorPerformanceCaveat) {\n    var canvas = document.createElement('canvas');\n\n    var attributes = Object.create(isSupported.webGLContextAttributes);\n    attributes.failIfMajorPerformanceCaveat = failIfMajorPerformanceCaveat;\n\n    return canvas.getContext('webgl2', attributes);\n}\n\nfunction isWebGLSupported(failIfMajorPerformanceCaveat) {\n    var gl = getWebGLContext(failIfMajorPerformanceCaveat);\n    if (!gl) {\n        return false;\n    }\n\n    // Try compiling a shader and get its compile status. Some browsers like Brave block this API\n    // to prevent fingerprinting. Unfortunately, this also means that Mapbox GL won't work.\n    var shader;\n    try {\n        shader = gl.createShader(gl.VERTEX_SHADER);\n    } catch (e) {\n        // some older browsers throw an exception that `createShader` is not defined\n        // so handle this separately from the case where browsers block `createShader`\n        // for security reasons\n        return false;\n    }\n\n    if (!shader || gl.isContextLost()) {\n        return false;\n    }\n    gl.shaderSource(shader, 'void main() {}');\n    gl.compileShader(shader);\n    return gl.getShaderParameter(shader, gl.COMPILE_STATUS) === true;\n}\n\nfunction isNotIE() {\n    return !document.documentMode;\n}\n","// @flow strict\n\nimport Point from '@mapbox/point-geometry';\nimport assert from 'assert';\n\n// refine the return type based on tagName, e.g. 'button' -> HTMLButtonElement\n// $FlowFixMe[method-unbinding]\nexport function create<T: string>(tagName: T, className: ?string, container?: HTMLElement): $Call<typeof document.createElement, T> {\n    const el = document.createElement(tagName);\n    if (className !== undefined && className !== null) el.className = className;\n    if (container) container.appendChild(el);\n    return el;\n}\n\nexport function createSVG(tagName: string, attributes: {[string]: string | number}, container?: Element): Element {\n    const el = document.createElementNS('http://www.w3.org/2000/svg', tagName);\n    for (const name of Object.keys(attributes)) {\n        el.setAttributeNS(null, name, String(attributes[name]));\n    }\n    if (container) container.appendChild(el);\n    return el;\n}\n\nconst docStyle = typeof document !== 'undefined' ? document.documentElement && document.documentElement.style : null;\nconst selectProp = docStyle && docStyle.userSelect !== undefined ? 'userSelect' : 'WebkitUserSelect';\nlet userSelect;\n\nexport function disableDrag() {\n    if (docStyle && selectProp) {\n        // $FlowFixMe[incompatible-type]\n        userSelect = docStyle[selectProp];\n        // $FlowFixMe[incompatible-type]\n        docStyle[selectProp] = 'none';\n    }\n}\n\nexport function enableDrag() {\n    if (docStyle && selectProp) {\n        // $FlowFixMe[incompatible-type]\n        docStyle[selectProp] = userSelect;\n    }\n}\n\n// Suppress the next click, but only if it's immediate.\nfunction suppressClickListener(e: Event) {\n    e.preventDefault();\n    e.stopPropagation();\n    window.removeEventListener('click', suppressClickListener, true);\n}\n\nexport function suppressClick() {\n    window.addEventListener('click', suppressClickListener, true);\n    window.setTimeout(() => {\n        window.removeEventListener('click', suppressClickListener, true);\n    }, 0);\n}\n\nexport function mousePos(el: HTMLElement, e: MouseEvent | WheelEvent): Point {\n    const rect = el.getBoundingClientRect();\n    return getScaledPoint(el, rect, e);\n}\n\nexport function touchPos(el: HTMLElement, touches: TouchList): Array<Point> {\n    const rect = el.getBoundingClientRect(),\n        points = [];\n\n    for (let i = 0; i < touches.length; i++) {\n        points.push(getScaledPoint(el, rect, touches[i]));\n    }\n    return points;\n}\n\nexport function mouseButton(e: MouseEvent): number {\n    assert(e.type === 'mousedown' || e.type === 'mouseup');\n    if (typeof window.InstallTrigger !== 'undefined' && e.button === 2 && e.ctrlKey &&\n        window.navigator.platform.toUpperCase().indexOf('MAC') >= 0) {\n        // Fix for https://github.com/mapbox/mapbox-gl-js/issues/3131:\n        // Firefox (detected by InstallTrigger) on Mac determines e.button = 2 when\n        // using Control + left click\n        return 0;\n    }\n    return e.button;\n}\n\nfunction getScaledPoint(el: HTMLElement, rect: ClientRect, e: MouseEvent | WheelEvent | Touch) {\n    // Until we get support for pointer events (https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent)\n    // we use this dirty trick which would not work for the case of rotated transforms, but works well for\n    // the case of simple scaling.\n    // Note: `el.offsetWidth === rect.width` eliminates the `0/0` case.\n    const scaling = el.offsetWidth === rect.width ? 1 : el.offsetWidth / rect.width;\n    return new Point(\n        (e.clientX - rect.left) * scaling,\n        (e.clientY - rect.top) * scaling\n    );\n}\n","// @flow\n\nimport type StyleLayer from './style_layer.js';\n\n/**\n * Class for tracking style changes by scope, shared between all style instances.\n */\nclass StyleChanges {\n    _changed: boolean;\n    _updatedLayers: {[_: string]: Set<string>;};\n    _removedLayers: {[_: string]: {[_: string]: StyleLayer}};\n    _updatedPaintProps: Set<string>;\n    _updatedImages: Set<string>;\n    _updatedSourceCaches: {[_: string]: 'clear' | 'reload'};\n\n    constructor() {\n        this._changed = false;\n\n        this._updatedLayers = {};\n        this._removedLayers = {};\n\n        this._updatedSourceCaches = {};\n        this._updatedPaintProps = new Set();\n\n        this._updatedImages = new Set();\n    }\n\n    isDirty(): boolean {\n        return this._changed;\n    }\n\n    /**\n     * Mark changes as dirty.\n     */\n    setDirty() {\n        this._changed = true;\n    }\n\n    getUpdatedSourceCaches(): {[_: string]: 'clear' | 'reload'} {\n        return this._updatedSourceCaches;\n    }\n\n    /**\n     * Mark that a source cache needs to be cleared or reloaded.\n     * @param {string} id\n     * @param {'clear' | 'reload'} action\n     */\n    updateSourceCache(id: string, action: 'clear' | 'reload') {\n        this._updatedSourceCaches[id] = action;\n        this.setDirty();\n    }\n\n    /**\n     * Discards updates to the source cache with the given id.\n     * @param {string} id\n     */\n    discardSourceCacheUpdate(id: string) {\n        delete this._updatedSourceCaches[id];\n    }\n\n    /**\n     * Mark a layer as having changes and needs to be rerendered.\n     * @param {StyleLayer} layer\n     */\n    updateLayer(layer: StyleLayer) {\n        const scope = layer.scope;\n        this._updatedLayers[scope] = this._updatedLayers[scope] || new Set();\n        this._updatedLayers[scope].add(layer.id);\n        this.setDirty();\n    }\n\n    /**\n     * Mark a layer as having been removed and needing to be cleaned up.\n     * @param {StyleLayer} layer\n     */\n    removeLayer(layer: StyleLayer) {\n        const scope = layer.scope;\n        this._removedLayers[scope] = this._removedLayers[scope] || {};\n        this._updatedLayers[scope] = this._updatedLayers[scope] || new Set();\n\n        this._removedLayers[scope][layer.id] = layer;\n        this._updatedLayers[scope].delete(layer.id);\n        this._updatedPaintProps.delete(layer.fqid);\n\n        this.setDirty();\n    }\n\n    /**\n     * Returns StyleLayer if layer needs to be removed.\n     * @param {StyleLayer} layer\n     */\n    getRemovedLayer(layer: StyleLayer): ?StyleLayer {\n        if (!this._removedLayers[layer.scope]) return null;\n        return this._removedLayers[layer.scope][layer.id];\n    }\n\n    /**\n     * Eliminate layer from the list of layers that need to be removed.\n     * @param {StyleLayer} layer\n     */\n    discardLayerRemoval(layer: StyleLayer) {\n        if (!this._removedLayers[layer.scope]) return;\n        delete this._removedLayers[layer.scope][layer.id];\n    }\n\n    /**\n     * Returns a list of layer ids that have been updated or removed grouped by the scope.\n     * @returns {{[scope: string]: {updatedIds: Array<string>, removedIds: Array<string>}}}}\n     */\n    getLayerUpdatesByScope(): {[_: string]: {updatedIds?: Array<string>, removedIds?: Array<string>}} {\n        const updatesByScope = {};\n\n        for (const scope in this._updatedLayers) {\n            updatesByScope[scope] = updatesByScope[scope] || {};\n            updatesByScope[scope].updatedIds = Array.from(this._updatedLayers[scope].values());\n        }\n\n        for (const scope in this._removedLayers) {\n            updatesByScope[scope] = updatesByScope[scope] || {};\n            updatesByScope[scope].removedIds = Object.keys(this._removedLayers[scope]);\n        }\n\n        return updatesByScope;\n    }\n\n    getUpdatedPaintProperties(): Set<string> {\n        return this._updatedPaintProps;\n    }\n\n    /**\n     * Mark a layer as having a changed paint properties.\n     * @param {StyleLayer} layer\n     */\n    updatePaintProperties(layer: StyleLayer) {\n        this._updatedPaintProps.add(layer.fqid);\n        this.setDirty();\n    }\n\n    getUpdatedImages(): Array<string> {\n        return Array.from(this._updatedImages.values());\n    }\n\n    /**\n     * Mark an image as having changed.\n     * @param {string} id\n     */\n    updateImage(id: string) {\n        this._updatedImages.add(id);\n        this.setDirty();\n    }\n\n    resetUpdatedImages() {\n        this._updatedImages.clear();\n    }\n\n    /**\n     * Reset all style changes.\n     */\n    reset() {\n        this._changed = false;\n\n        this._updatedLayers = {};\n        this._removedLayers = {};\n\n        this._updatedSourceCaches = {};\n        this._updatedPaintProps.clear();\n\n        this._updatedImages.clear();\n    }\n}\n\nexport default StyleChanges;\n","// @flow\n\nimport {Event, ErrorEvent, Evented} from '../../src/util/evented.js';\n\nimport Model from '../data/model.js';\nimport convertModel from '../source/model_loader.js';\n\nimport {RequestManager} from '../../src/util/mapbox.js';\nimport {ResourceType} from '../../src/util/ajax.js';\n\nimport {loadGLTF} from '../util/loaders.js';\n\nimport type Painter from '../../src/render/painter.js';\nimport type {ModelsSpecification} from '../../src/style-spec/types.js';\n\n// Keep the number of references to each model\n// to avoid deleting models in use\ntype ReferencedModel = {\n    model: Model;\n    numReferences: number;\n};\n\nclass ModelManager extends Evented {\n    models: {[scope: string]: {[id: string]: ReferencedModel }};\n    numModelsLoading: {[scope: string]: number};\n    requestManager: RequestManager;\n\n    constructor(requestManager: RequestManager) {\n        super();\n        this.requestManager = requestManager;\n        this.models = {'': {}};\n        this.numModelsLoading = {};\n    }\n\n    loadModel(id: string, url: string): Promise<?Model> {\n        return loadGLTF(this.requestManager.transformRequest(url, ResourceType.Model).url)\n            .then(gltf => {\n                if (!gltf) return;\n\n                const nodes = convertModel(gltf);\n                const model = new Model(id, undefined, undefined, nodes);\n                model.computeBoundsAndApplyParent();\n                return model;\n            })\n            .catch((err) => {\n                // $FlowFixMe[prop-missing] - generic Error type doesn't have status\n                if (err && err.status === 404) {\n                    return null;\n                }\n                this.fire(new ErrorEvent(new Error(`Could not load model ${id} from ${url}: ${err.message}`)));\n            });\n    }\n\n    load(modelUris: {[string]: string}, scope: string) {\n        if (!this.models[scope]) this.models[scope] = {};\n\n        const modelIds = Object.keys(modelUris);\n        this.numModelsLoading[scope] = (this.numModelsLoading[scope] || 0) + modelIds.length;\n\n        const modelLoads = [];\n        for (const modelId of modelIds) {\n            modelLoads.push(this.loadModel(modelId, modelUris[modelId]));\n        }\n\n        Promise.allSettled(modelLoads)\n            .then(results => {\n                for (let i = 0; i < results.length; i++) {\n                    const {status, value} = results[i];\n                    if (status === 'fulfilled' && value) {\n                        this.models[scope][modelIds[i]] = {model: value, numReferences : 1};\n                    }\n                }\n                this.numModelsLoading[scope] -= modelIds.length;\n                this.fire(new Event('data', {dataType: 'style'}));\n            })\n            .catch((err) => {\n                this.fire(new ErrorEvent(new Error(`Could not load models: ${err.message}`)));\n            });\n    }\n\n    isLoaded(): boolean {\n        for (const scope in this.numModelsLoading) {\n            if (this.numModelsLoading[scope] > 0) return false;\n        }\n        return true;\n    }\n\n    hasModel(id: string, scope: string): boolean {\n        return !!this.getModel(id, scope);\n    }\n\n    getModel(id: string, scope: string): ?Model {\n        if (!this.models[scope]) this.models[scope] = {};\n        return this.models[scope][id] ? this.models[scope][id].model : undefined;\n    }\n\n    addModel(id: string, url: string, scope: string) {\n        if (!this.models[scope]) this.models[scope] = {};\n        // update num references if the model exists\n        if (this.hasModel(id, scope)) {\n            this.models[scope][id].numReferences++;\n        }\n        this.load({[id]: this.requestManager.normalizeModelURL(url)}, scope);\n    }\n\n    addModels(models: ModelsSpecification, scope: string) {\n        if (!this.models[scope]) this.models[scope] = {};\n\n        const modelUris = {};\n        for (const modelId in models) {\n            // Add a void object so we mark this model as requested\n            this.models[scope][modelId] = {};\n            modelUris[modelId] = this.requestManager.normalizeModelURL(models[modelId]);\n        }\n        this.load(modelUris, scope);\n    }\n\n    addModelsFromBucket(modelUris: Array<string>, scope: string) {\n        if (!this.models[scope]) this.models[scope] = {};\n\n        const modelsRequests = {};\n        for (const modelUri of modelUris) {\n            if (this.hasModel(modelUri, scope)) {\n                this.models[scope][modelUri].numReferences++;\n            } else {\n                modelsRequests[modelUri] = this.requestManager.normalizeModelURL(modelUri);\n            }\n        }\n        this.load(modelsRequests, scope);\n    }\n\n    removeModel(id: string, scope: string) {\n        if (!this.models[scope] || !this.models[scope][id]) return;\n        this.models[scope][id].numReferences--;\n        if (this.models[scope][id].numReferences === 0) {\n            const model = this.models[scope][id].model;\n            delete this.models[scope][id];\n            model.destroy();\n        }\n    }\n\n    listModels(scope: string): Array<string> {\n        if (!this.models[scope]) this.models[scope] = {};\n        return Object.keys(this.models[scope]);\n    }\n\n    upload(painter: Painter, scope: string) {\n        if (!this.models[scope]) this.models[scope] = {};\n        for (const modelId in this.models[scope]) {\n            if (this.models[scope][modelId].model) {\n                this.models[scope][modelId].model.upload(painter.context);\n            }\n        }\n    }\n}\n\nexport default ModelManager;\n","// @flow\n\nimport {extend} from '../util/util.js';\nimport type Tile from './tile.js';\nimport type {FeatureState} from '../style-spec/expression/index.js';\nimport type Painter from '../render/painter.js';\n\nexport type FeatureStates = {[feature_id: string]: FeatureState};\nexport type LayerFeatureStates = {[layer: string]: FeatureStates};\n\n/**\n * SourceFeatureState manages the state and pending changes\n * to features in a source, separated by source layer.\n * stateChanges and deletedStates batch all changes to the tile (updates and removes, respectively)\n * between coalesce() events. addFeatureState() and removeFeatureState() also update their counterpart's\n * list of changes, such that coalesce() can apply the proper state changes while agnostic to the order of operations.\n * In deletedStates, all null's denote complete removal of state at that scope\n * @private\n*/\nclass SourceFeatureState {\n    state: LayerFeatureStates;\n    stateChanges: LayerFeatureStates;\n    deletedStates: {};\n\n    constructor() {\n        this.state = {};\n        this.stateChanges = {};\n        this.deletedStates = {};\n    }\n\n    updateState(sourceLayer: string, featureId: number | string, newState: Object) {\n        const feature = String(featureId);\n        this.stateChanges[sourceLayer] = this.stateChanges[sourceLayer] || {};\n        this.stateChanges[sourceLayer][feature] = this.stateChanges[sourceLayer][feature] || {};\n        extend(this.stateChanges[sourceLayer][feature], newState);\n\n        if (this.deletedStates[sourceLayer] === null) {\n            this.deletedStates[sourceLayer] = {};\n            for (const ft in this.state[sourceLayer]) {\n                if (ft !== feature) this.deletedStates[sourceLayer][ft] = null;\n            }\n        } else {\n            const featureDeletionQueued = this.deletedStates[sourceLayer] && this.deletedStates[sourceLayer][feature] === null;\n            if (featureDeletionQueued) {\n                this.deletedStates[sourceLayer][feature] = {};\n                for (const prop in this.state[sourceLayer][feature]) {\n                    if (!newState[prop]) this.deletedStates[sourceLayer][feature][prop] = null;\n                }\n            } else {\n                for (const key in newState) {\n                    const deletionInQueue = this.deletedStates[sourceLayer] && this.deletedStates[sourceLayer][feature] && this.deletedStates[sourceLayer][feature][key] === null;\n                    if (deletionInQueue) delete this.deletedStates[sourceLayer][feature][key];\n                }\n            }\n        }\n    }\n\n    removeFeatureState(sourceLayer: string, featureId?: number | string, key?: string) {\n        const sourceLayerDeleted = this.deletedStates[sourceLayer] === null;\n        if (sourceLayerDeleted) return;\n\n        const feature = String(featureId);\n\n        this.deletedStates[sourceLayer] = this.deletedStates[sourceLayer] || {};\n\n        if (key && featureId !== undefined) {\n            if (this.deletedStates[sourceLayer][feature] !== null) {\n                this.deletedStates[sourceLayer][feature] = this.deletedStates[sourceLayer][feature] || {};\n                this.deletedStates[sourceLayer][feature][key] = null;\n            }\n        } else if (featureId !== undefined) {\n            const updateInQueue = this.stateChanges[sourceLayer] && this.stateChanges[sourceLayer][feature];\n            if (updateInQueue) {\n                this.deletedStates[sourceLayer][feature] = {};\n                for (key in this.stateChanges[sourceLayer][feature]) this.deletedStates[sourceLayer][feature][key] = null;\n\n            } else {\n                this.deletedStates[sourceLayer][feature] = null;\n            }\n        } else {\n            this.deletedStates[sourceLayer] = null;\n        }\n    }\n\n    getState(sourceLayer: string, featureId: number | string): FeatureStates {\n        const feature = String(featureId);\n        const base = this.state[sourceLayer] || {};\n        const changes = this.stateChanges[sourceLayer] || {};\n\n        const reconciledState = extend({}, base[feature], changes[feature]);\n\n        //return empty object if the whole source layer is awaiting deletion\n        if (this.deletedStates[sourceLayer] === null) return {};\n        else if (this.deletedStates[sourceLayer]) {\n            const featureDeletions = this.deletedStates[sourceLayer][featureId];\n            if (featureDeletions === null) return {};\n            for (const prop in featureDeletions) delete reconciledState[prop];\n        }\n        return reconciledState;\n    }\n\n    initializeTileState(tile: Tile, painter: ?Painter) {\n        tile.setFeatureState(this.state, painter);\n    }\n\n    coalesceChanges(tiles: {[_: any]: Tile}, painter: any) {\n        //track changes with full state objects, but only for features that got modified\n        const featuresChanged: LayerFeatureStates = {};\n\n        for (const sourceLayer in this.stateChanges) {\n            this.state[sourceLayer]  = this.state[sourceLayer] || {};\n            const layerStates = {};\n            for (const feature in this.stateChanges[sourceLayer]) {\n                if (!this.state[sourceLayer][feature]) this.state[sourceLayer][feature] = {};\n                extend(this.state[sourceLayer][feature], this.stateChanges[sourceLayer][feature]);\n                layerStates[feature] = this.state[sourceLayer][feature];\n            }\n            featuresChanged[sourceLayer] = layerStates;\n        }\n\n        for (const sourceLayer in this.deletedStates) {\n            this.state[sourceLayer]  = this.state[sourceLayer] || {};\n            const layerStates = {};\n\n            if (this.deletedStates[sourceLayer] === null) {\n                for (const ft in this.state[sourceLayer]) {\n                    layerStates[ft] = {};\n                    this.state[sourceLayer][ft] = {};\n                }\n            } else {\n                for (const feature in this.deletedStates[sourceLayer]) {\n                    const deleteWholeFeatureState = this.deletedStates[sourceLayer][feature] === null;\n                    if (deleteWholeFeatureState) this.state[sourceLayer][feature] = {};\n                    else if (this.state[sourceLayer][feature]) {\n                        for (const key of Object.keys(this.deletedStates[sourceLayer][feature])) {\n                            delete this.state[sourceLayer][feature][key];\n                        }\n                    }\n                    layerStates[feature] = this.state[sourceLayer][feature];\n                }\n            }\n\n            featuresChanged[sourceLayer] = featuresChanged[sourceLayer] || {};\n            extend(featuresChanged[sourceLayer], layerStates);\n        }\n\n        this.stateChanges = {};\n        this.deletedStates = {};\n\n        if (Object.keys(featuresChanged).length === 0) return;\n\n        for (const id in tiles) {\n            const tile = tiles[id];\n            tile.setFeatureState(featuresChanged, painter);\n        }\n    }\n}\n\nexport default SourceFeatureState;\n","// @flow\n\nimport {RGBAImage} from '../util/image.js';\n\nimport type {Map} from '../ui/map.js';\n\nexport type StyleImageData = {\n    data: RGBAImage,\n    version: number,\n    hasRenderCallback?: boolean,\n    userImage?: StyleImageInterface\n};\n\nexport type StyleImageMetadata = {\n    pixelRatio: number,\n    sdf: boolean,\n    stretchX?: Array<[number, number]>,\n    stretchY?: Array<[number, number]>,\n    content?: [number, number, number, number]\n};\n\nexport type StyleImage = StyleImageData & StyleImageMetadata;\n\nexport type StyleImageInterface = {\n    width: number,\n    height: number,\n    data: Uint8Array | Uint8ClampedArray,\n    render?: () => boolean,\n    onAdd?: (map: Map, id: string) => void,\n    onRemove?: () => void\n};\n\nexport function renderStyleImage(image: StyleImage): boolean {\n    const {userImage} = image;\n    if (userImage && userImage.render) {\n        const updated = userImage.render();\n        if (updated) {\n            image.data.replace(new Uint8Array(userImage.data.buffer));\n            return true;\n        }\n    }\n    return false;\n}\n\n/**\n * Interface for dynamically generated style images. This is a specification for\n * implementers to model: it is not an exported method or class.\n *\n * Images implementing this interface can be redrawn for every frame. They can be used to animate\n * icons and patterns or make them respond to user input. Style images can implement a\n * {@link StyleImageInterface#render} method. The method is called every frame and\n * can be used to update the image.\n *\n * @interface StyleImageInterface\n * @property {number} width Width in pixels.\n * @property {number} height Height in pixels.\n * @property {Uint8Array | Uint8ClampedArray} data Byte array representing the image. To ensure space for all four channels in an RGBA color, size must be width × height × 4.\n *\n * @see [Example: Add an animated icon to the map.](https://docs.mapbox.com/mapbox-gl-js/example/add-image-animated/)\n *\n * @example\n * const flashingSquare = {\n *     width: 64,\n *     height: 64,\n *     data: new Uint8Array(64 * 64 * 4),\n *\n *     onAdd(map) {\n *         this.map = map;\n *     },\n *\n *     render() {\n *         // keep repainting while the icon is on the map\n *         this.map.triggerRepaint();\n *\n *         // alternate between black and white based on the time\n *         const value = Math.round(Date.now() / 1000) % 2 === 0  ? 255 : 0;\n *\n *         // check if image needs to be changed\n *         if (value !== this.previousValue) {\n *             this.previousValue = value;\n *\n *             const bytesPerPixel = 4;\n *             for (let x = 0; x < this.width; x++) {\n *                 for (let y = 0; y < this.height; y++) {\n *                     const offset = (y * this.width + x) * bytesPerPixel;\n *                     this.data[offset + 0] = value;\n *                     this.data[offset + 1] = value;\n *                     this.data[offset + 2] = value;\n *                     this.data[offset + 3] = 255;\n *                 }\n *             }\n *\n *             // return true to indicate that the image changed\n *             return true;\n *         }\n *     }\n * };\n *\n * map.addImage('flashing_square', flashingSquare);\n */\n\n/**\n * This method is called once before every frame where the icon will be used.\n * The method can optionally update the image's `data` member with a new image.\n *\n * If the method updates the image it must return `true` to commit the change.\n * If the method returns `false` or nothing the image is assumed to not have changed.\n *\n * If updates are infrequent it maybe easier to use {@link Map#updateImage} to update\n * the image instead of implementing this method.\n *\n * @function\n * @memberof StyleImageInterface\n * @instance\n * @name render\n * @return {boolean} `true` if this method updated the image. `false` if the image was not changed.\n */\n\n/**\n * Optional method called when the layer has been added to the Map with {@link Map#addImage}.\n *\n * @function\n * @memberof StyleImageInterface\n * @instance\n * @name onAdd\n * @param {Map} map The Map this custom layer was just added to.\n */\n\n/**\n * Optional method called when the icon is removed from the map with {@link Map#removeImage}.\n * This gives the image a chance to clean up resources and event listeners.\n *\n * @function\n * @memberof StyleImageInterface\n * @instance\n * @name onRemove\n */\n","// @flow\n\nimport potpack from 'potpack';\n\nimport {Event, ErrorEvent, Evented} from '../util/evented.js';\nimport {RGBAImage} from '../util/image.js';\nimport {ImagePosition} from './image_atlas.js';\nimport Texture from './texture.js';\nimport assert from 'assert';\nimport {renderStyleImage} from '../style/style_image.js';\nimport {warnOnce} from '../util/util.js';\n\nimport type {StyleImage} from '../style/style_image.js';\nimport type Context from '../gl/context.js';\nimport type {Bin as PotpackBox} from 'potpack';\nimport type {Callback} from '../types/callback.js';\nimport type {Size} from '../util/image.js';\n\ntype Pattern = {\n    bin: PotpackBox,\n    position: ImagePosition\n};\n\n// When copied into the atlas texture, image data is padded by one pixel on each side. Icon\n// images are padded with fully transparent pixels, while pattern images are padded with a\n// copy of the image data wrapped from the opposite side. In both cases, this ensures the\n// correct behavior of GL_LINEAR texture sampling mode.\nconst padding = 1;\n\n/*\n    ImageManager does three things:\n\n        1. Tracks requests for icon images from tile workers and sends responses when the requests are fulfilled.\n        2. Builds a texture atlas for pattern images.\n        3. Rerenders renderable images once per frame\n\n    These are disparate responsibilities and should eventually be handled by different classes. When we implement\n    data-driven support for `*-pattern`, we'll likely use per-bucket pattern atlases, and that would be a good time\n    to refactor this.\n*/\nclass ImageManager extends Evented {\n    images: {[scope: string]: {[id: string]: StyleImage}};\n    updatedImages: {[scope: string]: {[id: string]: boolean}};\n    callbackDispatchedThisFrame: {[scope: string]: {[id: string]: boolean}};\n    loaded: {[scope: string]: boolean};\n    requestors: Array<{ids: Array<string>, scope: string, callback: Callback<{[id: string]: StyleImage}>}>;\n\n    patterns: {[scope: string]: {[id: string]: Pattern}};\n    atlasImage: {[scope: string]: RGBAImage};\n    atlasTexture: {[scope: string]: ?Texture};\n    dirty: boolean;\n\n    constructor() {\n        super();\n        this.images = {};\n        this.updatedImages = {};\n        this.callbackDispatchedThisFrame = {};\n        this.loaded = {};\n        this.requestors = [];\n\n        this.patterns = {};\n        this.atlasImage = {};\n        this.atlasTexture = {};\n        this.dirty = true;\n    }\n\n    createScope(scope: string) {\n        this.images[scope] = {};\n        this.loaded[scope] = false;\n        this.updatedImages[scope] = {};\n        this.patterns[scope] = {};\n        this.callbackDispatchedThisFrame[scope] = {};\n        this.atlasImage[scope] = new RGBAImage({width: 1, height: 1});\n    }\n\n    isLoaded(): boolean {\n        for (const scope in this.loaded) {\n            if (!this.loaded[scope]) return false;\n        }\n        return true;\n    }\n\n    setLoaded(loaded: boolean, scope: string) {\n        if (this.loaded[scope] === loaded) {\n            return;\n        }\n\n        this.loaded[scope] = loaded;\n\n        if (loaded) {\n            for (const {ids, callback} of this.requestors) {\n                this._notify(ids, scope, callback);\n            }\n            this.requestors = [];\n        }\n    }\n\n    hasImage(id: string, scope: string): boolean {\n        return !!this.getImage(id, scope);\n    }\n\n    getImage(id: string, scope: string): ?StyleImage {\n        return this.images[scope][id];\n    }\n\n    addImage(id: string, scope: string, image: StyleImage) {\n        assert(!this.images[scope][id]);\n        if (this._validate(id, image)) {\n            this.images[scope][id] = image;\n        }\n    }\n\n    _validate(id: string, image: StyleImage): boolean {\n        let valid = true;\n        if (!this._validateStretch(image.stretchX, image.data && image.data.width)) {\n            this.fire(new ErrorEvent(new Error(`Image \"${id}\" has invalid \"stretchX\" value`)));\n            valid = false;\n        }\n        if (!this._validateStretch(image.stretchY, image.data && image.data.height)) {\n            this.fire(new ErrorEvent(new Error(`Image \"${id}\" has invalid \"stretchY\" value`)));\n            valid = false;\n        }\n        if (!this._validateContent(image.content, image)) {\n            this.fire(new ErrorEvent(new Error(`Image \"${id}\" has invalid \"content\" value`)));\n            valid = false;\n        }\n        return valid;\n    }\n\n    _validateStretch(stretch: ?Array<[number, number]> | void, size: number): boolean {\n        if (!stretch) return true;\n        let last = 0;\n        for (const part of stretch) {\n            if (part[0] < last || part[1] < part[0] || size < part[1]) return false;\n            last = part[1];\n        }\n        return true;\n    }\n\n    _validateContent(content: ?[number, number, number, number] | void, image: StyleImage): boolean {\n        if (!content) return true;\n        if (content.length !== 4) return false;\n        if (content[0] < 0 || image.data.width < content[0]) return false;\n        if (content[1] < 0 || image.data.height < content[1]) return false;\n        if (content[2] < 0 || image.data.width < content[2]) return false;\n        if (content[3] < 0 || image.data.height < content[3]) return false;\n        if (content[2] < content[0]) return false;\n        if (content[3] < content[1]) return false;\n        return true;\n    }\n\n    updateImage(id: string, scope: string, image: StyleImage) {\n        const oldImage = this.images[scope][id];\n        assert(oldImage);\n        assert(oldImage.data.width === image.data.width);\n        assert(oldImage.data.height === image.data.height);\n        image.version = oldImage.version + 1;\n        this.images[scope][id] = image;\n        this.updatedImages[scope][id] = true;\n    }\n\n    removeImage(id: string, scope: string) {\n        assert(this.images[scope][id]);\n        const image = this.images[scope][id];\n        delete this.images[scope][id];\n        delete this.patterns[scope][id];\n\n        if (image.userImage && image.userImage.onRemove) {\n            image.userImage.onRemove();\n        }\n    }\n\n    listImages(scope: string): Array<string> {\n        return Object.keys(this.images[scope]);\n    }\n\n    getImages(ids: Array<string>, scope: string, callback: Callback<{[_: string]: StyleImage}>) {\n        // If the sprite has been loaded, or if all the icon dependencies are already present\n        // (i.e. if they've been added via runtime styling), then notify the requestor immediately.\n        // Otherwise, delay notification until the sprite is loaded. At that point, if any of the\n        // dependencies are still unavailable, we'll just assume they are permanently missing.\n        let hasAllDependencies = true;\n        const isLoaded = !!this.loaded[scope];\n        if (!isLoaded) {\n            for (const id of ids) {\n                if (!this.images[scope][id]) {\n                    hasAllDependencies = false;\n                }\n            }\n        }\n        if (isLoaded || hasAllDependencies) {\n            this._notify(ids, scope, callback);\n        } else {\n            this.requestors.push({ids, scope, callback});\n        }\n    }\n\n    getUpdatedImages(scope: string): {[_: string]: boolean} {\n        return this.updatedImages[scope];\n    }\n\n    _notify(ids: Array<string>, scope: string, callback: Callback<{[_: string]: StyleImage}>) {\n        const response = {};\n\n        for (const id of ids) {\n            if (!this.images[scope][id]) {\n                this.fire(new Event('styleimagemissing', {id}));\n            }\n            const image = this.images[scope][id];\n            if (image) {\n                // Clone the image so that our own copy of its ArrayBuffer doesn't get transferred.\n                response[id] = {\n                    data: image.data.clone(),\n                    pixelRatio: image.pixelRatio,\n                    sdf: image.sdf,\n                    version: image.version,\n                    stretchX: image.stretchX,\n                    stretchY: image.stretchY,\n                    content: image.content,\n                    hasRenderCallback: Boolean(image.userImage && image.userImage.render)\n                };\n            } else {\n                warnOnce(`Image \"${id}\" could not be loaded. Please make sure you have added the image with map.addImage() or a \"sprite\" property in your style. You can provide missing images by listening for the \"styleimagemissing\" map event.`);\n            }\n        }\n\n        callback(null, response);\n    }\n\n    // Pattern stuff\n\n    getPixelSize(scope: string): Size {\n        const {width, height} = this.atlasImage[scope];\n        return {width, height};\n    }\n\n    getPattern(id: string, scope: string): ?ImagePosition {\n        const pattern = this.patterns[scope][id];\n\n        const image = this.getImage(id, scope);\n        if (!image) {\n            return null;\n        }\n\n        if (pattern && pattern.position.version === image.version) {\n            return pattern.position;\n        }\n\n        if (!pattern) {\n            const w = image.data.width + padding * 2;\n            const h = image.data.height + padding * 2;\n            const bin = {w, h, x: 0, y: 0};\n            const position = new ImagePosition(bin, image);\n            this.patterns[scope][id] = {bin, position};\n        } else {\n            pattern.position.version = image.version;\n        }\n\n        this._updatePatternAtlas(scope);\n\n        return this.patterns[scope][id].position;\n    }\n\n    bind(context: Context, scope: string) {\n        const gl = context.gl;\n        let atlasTexture = this.atlasTexture[scope];\n\n        if (!atlasTexture) {\n            atlasTexture = new Texture(context, this.atlasImage[scope], gl.RGBA);\n            this.atlasTexture[scope] = atlasTexture;\n        } else if (this.dirty) {\n            atlasTexture.update(this.atlasImage[scope]);\n            this.dirty = false;\n        }\n\n        atlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n    }\n\n    _updatePatternAtlas(scope: string) {\n        const bins = [];\n        for (const id in this.patterns[scope]) {\n            bins.push(this.patterns[scope][id].bin);\n        }\n\n        const {w, h} = potpack(bins);\n\n        const dst = this.atlasImage[scope];\n        dst.resize({width: w || 1, height: h || 1});\n\n        for (const id in this.patterns[scope]) {\n            const {bin} = this.patterns[scope][id];\n            const x = bin.x + padding;\n            const y = bin.y + padding;\n            const src = this.images[scope][id].data;\n            const w = src.width;\n            const h = src.height;\n\n            RGBAImage.copy(src, dst, {x: 0, y: 0}, {x, y}, {width: w, height: h});\n\n            // Add 1 pixel wrapped padding on each side of the image.\n            RGBAImage.copy(src, dst, {x: 0, y: h - 1}, {x, y: y - 1}, {width: w, height: 1}); // T\n            RGBAImage.copy(src, dst, {x: 0, y:     0}, {x, y: y + h}, {width: w, height: 1}); // B\n            RGBAImage.copy(src, dst, {x: w - 1, y: 0}, {x: x - 1, y}, {width: 1, height: h}); // L\n            RGBAImage.copy(src, dst, {x: 0,     y: 0}, {x: x + w, y}, {width: 1, height: h}); // R\n        }\n\n        this.dirty = true;\n    }\n\n    beginFrame() {\n        for (const scope in this.images) {\n            this.callbackDispatchedThisFrame[scope] = {};\n        }\n    }\n\n    dispatchRenderCallbacks(ids: Array<string>, scope: string) {\n        for (const id of ids) {\n            // the callback for the image was already dispatched for a different frame\n            if (this.callbackDispatchedThisFrame[scope][id]) continue;\n            this.callbackDispatchedThisFrame[scope][id] = true;\n\n            const image = this.images[scope][id];\n            assert(image);\n\n            const updated = renderStyleImage(image);\n            if (updated) {\n                this.updateImage(id, scope, image);\n            }\n        }\n    }\n}\n\nexport default ImageManager;\n","// @flow\n\nimport {default as ValidationError, ValidationWarning} from '../error/validation_error.js';\nimport getType from '../util/get_type.js';\nimport validateSpec from './validate.js';\n\nimport type {ValidationOptions} from './validate.js';\n\ntype Options = ValidationOptions & {\n    objectElementValidators?: Function;\n};\n\nexport default function validateObject(options: Options): Array<ValidationError> {\n    const key = options.key;\n    const object = options.value;\n    const elementSpecs = options.valueSpec || {};\n    const elementValidators = options.objectElementValidators || {};\n    const style = options.style;\n    const styleSpec = options.styleSpec;\n    let errors = [];\n\n    const type = getType(object);\n    if (type !== 'object') {\n        return [new ValidationError(key, object, `object expected, ${type} found`)];\n    }\n\n    for (const objectKey in object) {\n        const elementSpecKey = objectKey.split('.')[0]; // treat 'paint.*' as 'paint'\n        const elementSpec = elementSpecs[elementSpecKey] || elementSpecs['*'];\n\n        let validateElement;\n        if (elementValidators[elementSpecKey]) {\n            validateElement = elementValidators[elementSpecKey];\n        } else if (elementSpecs[elementSpecKey]) {\n            validateElement = validateSpec;\n        } else if (elementValidators['*']) {\n            validateElement = elementValidators['*'];\n        } else if (elementSpecs['*']) {\n            validateElement = validateSpec;\n        }\n\n        if (!validateElement) {\n            errors.push(new ValidationWarning(key, object[objectKey], `unknown property \"${objectKey}\"`));\n            continue;\n        }\n\n        errors = errors.concat(validateElement({\n            key: (key ? `${key}.` : key) + objectKey,\n            value: object[objectKey],\n            valueSpec: elementSpec,\n            style,\n            styleSpec,\n            object,\n            objectKey\n        // $FlowFixMe[extra-arg]\n        }, object));\n    }\n\n    for (const elementSpecKey in elementSpecs) {\n        // Don't check `required` when there's a custom validator for that property.\n        if (elementValidators[elementSpecKey]) {\n            continue;\n        }\n\n        if (elementSpecs[elementSpecKey].required && elementSpecs[elementSpecKey]['default'] === undefined && object[elementSpecKey] === undefined) {\n            errors.push(new ValidationError(key, object, `missing required property \"${elementSpecKey}\"`));\n        }\n    }\n\n    return errors;\n}\n","// @flow\n\nimport getType from '../util/get_type.js';\nimport validate from './validate.js';\nimport ValidationError from '../error/validation_error.js';\n\nimport type {ValidationOptions} from './validate.js';\n\ntype Options = ValidationOptions & {\n    arrayElementValidator: Function;\n};\n\nexport default function validateArray(options: Options): Array<ValidationError> {\n    const array = options.value;\n    const arraySpec = options.valueSpec;\n    const style = options.style;\n    const styleSpec = options.styleSpec;\n    const key = options.key;\n    const validateArrayElement = options.arrayElementValidator || validate;\n\n    if (getType(array) !== 'array') {\n        return [new ValidationError(key, array, `array expected, ${getType(array)} found`)];\n    }\n\n    if (arraySpec.length && array.length !== arraySpec.length) {\n        return [new ValidationError(key, array, `array length ${arraySpec.length} expected, length ${array.length} found`)];\n    }\n\n    if (arraySpec['min-length'] && array.length < arraySpec['min-length']) {\n        return [new ValidationError(key, array, `array length at least ${arraySpec['min-length']} expected, length ${array.length} found`)];\n    }\n\n    let arrayElementSpec = {\n        \"type\": arraySpec.value,\n        \"values\": arraySpec.values,\n        \"minimum\": arraySpec.minimum,\n        \"maximum\": arraySpec.maximum,\n        function: undefined\n    };\n\n    if (styleSpec.$version < 7) {\n        arrayElementSpec.function = arraySpec.function;\n    }\n\n    if (getType(arraySpec.value) === 'object') {\n        arrayElementSpec = arraySpec.value;\n    }\n\n    let errors = [];\n    for (let i = 0; i < array.length; i++) {\n        errors = errors.concat(validateArrayElement({\n            array,\n            arrayIndex: i,\n            value: array[i],\n            valueSpec: arrayElementSpec,\n            style,\n            styleSpec,\n            key: `${key}[${i}]`\n        }, true));\n    }\n    return errors;\n}\n","// @flow\n\nimport getType from '../util/get_type.js';\nimport ValidationError from '../error/validation_error.js';\n\nimport type {ValidationOptions} from './validate.js';\n\ntype Options = ValidationOptions & {\n    arrayIndex: number;\n}\n\nexport default function validateNumber(options: Options): Array<ValidationError> {\n    const key = options.key;\n    const value = options.value;\n    const valueSpec = options.valueSpec;\n    let type = getType(value);\n\n    // eslint-disable-next-line no-self-compare\n    if (type === 'number' && value !== value) {\n        type = 'NaN';\n    }\n\n    if (type !== 'number') {\n        return [new ValidationError(key, value, `number expected, ${type} found`)];\n    }\n\n    if ('minimum' in valueSpec) {\n        let specMin = valueSpec.minimum;\n        if (getType(valueSpec.minimum) === 'array') {\n            const i = options.arrayIndex;\n            specMin = valueSpec.minimum[i];\n        }\n        if (value < specMin) {\n            return [new ValidationError(key, value, `${value} is less than the minimum value ${specMin}`)];\n        }\n    }\n\n    if ('maximum' in valueSpec) {\n        let specMax = valueSpec.maximum;\n        if (getType(valueSpec.maximum) === 'array') {\n            const i = options.arrayIndex;\n            specMax = valueSpec.maximum[i];\n        }\n        if (value > specMax) {\n            return [new ValidationError(key, value, `${value} is greater than the maximum value ${specMax}`)];\n        }\n    }\n\n    return [];\n}\n","// @flow\n\nimport ValidationError from '../error/validation_error.js';\nimport getType from '../util/get_type.js';\nimport validate from './validate.js';\nimport validateObject from './validate_object.js';\nimport validateArray from './validate_array.js';\nimport validateNumber from './validate_number.js';\nimport {isExpression} from '../expression/index.js';\nimport {unbundle, deepUnbundle} from '../util/unbundle_jsonlint.js';\nimport {\n    supportsPropertyExpression,\n    supportsZoomExpression,\n    supportsInterpolation\n} from '../util/properties.js';\n\nimport type {ValidationOptions} from './validate.js';\n\nexport default function validateFunction(options: ValidationOptions): any {\n    const functionValueSpec = options.valueSpec;\n    const functionType = unbundle(options.value.type);\n    let stopKeyType;\n    let stopDomainValues: {[string | number]: boolean} = {};\n    let previousStopDomainValue: ?mixed;\n    let previousStopDomainZoom;\n\n    const isZoomFunction = functionType !== 'categorical' && options.value.property === undefined;\n    const isPropertyFunction = !isZoomFunction;\n    const isZoomAndPropertyFunction =\n        getType(options.value.stops) === 'array' &&\n        getType(options.value.stops[0]) === 'array' &&\n        getType(options.value.stops[0][0]) === 'object';\n\n    const errors = validateObject({\n        key: options.key,\n        value: options.value,\n        valueSpec: options.styleSpec.function,\n        style: options.style,\n        styleSpec: options.styleSpec,\n        objectElementValidators: {\n            stops: validateFunctionStops,\n            default: validateFunctionDefault\n        }\n    });\n\n    if (functionType === 'identity' && isZoomFunction) {\n        errors.push(new ValidationError(options.key, options.value, 'missing required property \"property\"'));\n    }\n\n    if (functionType !== 'identity' && !options.value.stops) {\n        errors.push(new ValidationError(options.key, options.value, 'missing required property \"stops\"'));\n    }\n\n    if (functionType === 'exponential' && options.valueSpec.expression && !supportsInterpolation(options.valueSpec)) {\n        errors.push(new ValidationError(options.key, options.value, 'exponential functions not supported'));\n    }\n\n    if (options.styleSpec.$version >= 8) {\n        if (isPropertyFunction && !supportsPropertyExpression(options.valueSpec)) {\n            errors.push(new ValidationError(options.key, options.value, 'property functions not supported'));\n        } else if (isZoomFunction && !supportsZoomExpression(options.valueSpec)) {\n            errors.push(new ValidationError(options.key, options.value, 'zoom functions not supported'));\n        }\n    }\n\n    if ((functionType === 'categorical' || isZoomAndPropertyFunction) && options.value.property === undefined) {\n        errors.push(new ValidationError(options.key, options.value, '\"property\" property is required'));\n    }\n\n    return errors;\n\n    function validateFunctionStops(options: ValidationOptions) {\n        if (functionType === 'identity') {\n            return [new ValidationError(options.key, options.value, 'identity function may not have a \"stops\" property')];\n        }\n\n        let errors = [];\n        const value = options.value;\n\n        errors = errors.concat(validateArray({\n            key: options.key,\n            value,\n            valueSpec: options.valueSpec,\n            style: options.style,\n            styleSpec: options.styleSpec,\n            arrayElementValidator: validateFunctionStop\n        }));\n\n        if (getType(value) === 'array' && value.length === 0) {\n            errors.push(new ValidationError(options.key, value, 'array must have at least one stop'));\n        }\n\n        return errors;\n    }\n\n    function validateFunctionStop(options: ValidationOptions) {\n        let errors = [];\n        const value = options.value;\n        const key = options.key;\n\n        if (getType(value) !== 'array') {\n            return [new ValidationError(key, value, `array expected, ${getType(value)} found`)];\n        }\n\n        if (value.length !== 2) {\n            return [new ValidationError(key, value, `array length 2 expected, length ${value.length} found`)];\n        }\n\n        if (isZoomAndPropertyFunction) {\n            if (getType(value[0]) !== 'object') {\n                return [new ValidationError(key, value, `object expected, ${getType(value[0])} found`)];\n            }\n            if (value[0].zoom === undefined) {\n                return [new ValidationError(key, value, 'object stop key must have zoom')];\n            }\n            if (value[0].value === undefined) {\n                return [new ValidationError(key, value, 'object stop key must have value')];\n            }\n\n            const nextStopDomainZoom = unbundle(value[0].zoom);\n            if (typeof nextStopDomainZoom !== 'number') {\n                return [new ValidationError(key, value[0].zoom, 'stop zoom values must be numbers')];\n            }\n\n            if (previousStopDomainZoom && previousStopDomainZoom > nextStopDomainZoom) {\n                return [new ValidationError(key, value[0].zoom, 'stop zoom values must appear in ascending order')];\n            }\n            if (nextStopDomainZoom !== previousStopDomainZoom) {\n                previousStopDomainZoom = nextStopDomainZoom;\n                previousStopDomainValue = undefined;\n                stopDomainValues = {};\n            }\n            errors = errors.concat(validateObject({\n                key: `${key}[0]`,\n                value: value[0],\n                valueSpec: {zoom: {}},\n                style: options.style,\n                styleSpec: options.styleSpec,\n                objectElementValidators: {zoom: validateNumber, value: validateStopDomainValue}\n            }));\n        } else {\n            errors = errors.concat(validateStopDomainValue({\n                key: `${key}[0]`,\n                value: value[0],\n                valueSpec: {},\n                style: options.style,\n                styleSpec: options.styleSpec\n            }, value));\n        }\n\n        if (isExpression(deepUnbundle(value[1]))) {\n            return errors.concat([new ValidationError(`${key}[1]`, value[1], 'expressions are not allowed in function stops.')]);\n        }\n\n        return errors.concat(validate({\n            key: `${key}[1]`,\n            value: value[1],\n            valueSpec: functionValueSpec,\n            style: options.style,\n            styleSpec: options.styleSpec\n        }));\n    }\n\n    function validateStopDomainValue(options: ValidationOptions, stop: any) {\n        const type = getType(options.value);\n        const value = unbundle(options.value);\n\n        const reportValue = options.value !== null ? options.value : stop;\n\n        if (!stopKeyType) {\n            stopKeyType = type;\n        } else if (type !== stopKeyType) {\n            return [new ValidationError(options.key, reportValue, `${type} stop domain type must match previous stop domain type ${stopKeyType}`)];\n        }\n\n        if (type !== 'number' && type !== 'string' && type !== 'boolean' && typeof value !== 'number' && typeof value !== 'string' && typeof value !== 'boolean') {\n            return [new ValidationError(options.key, reportValue, 'stop domain value must be a number, string, or boolean')];\n        }\n\n        if (type !== 'number' && functionType !== 'categorical') {\n            let message = `number expected, ${type} found`;\n            if (supportsPropertyExpression(functionValueSpec) && functionType === undefined) {\n                message += '\\nIf you intended to use a categorical function, specify `\"type\": \"categorical\"`.';\n            }\n            return [new ValidationError(options.key, reportValue, message)];\n        }\n\n        if (functionType === 'categorical' && type === 'number' && (typeof value !== 'number' || !isFinite(value) || Math.floor(value) !== value)) {\n            return [new ValidationError(options.key, reportValue, `integer expected, found ${String(value)}`)];\n        }\n\n        if (functionType !== 'categorical' && type === 'number' && typeof value === 'number' && typeof previousStopDomainValue === 'number' && previousStopDomainValue !== undefined && value < previousStopDomainValue) {\n            return [new ValidationError(options.key, reportValue, 'stop domain values must appear in ascending order')];\n        } else {\n            previousStopDomainValue = value;\n        }\n\n        if (functionType === 'categorical' && (value: any) in stopDomainValues) {\n            return [new ValidationError(options.key, reportValue, 'stop domain values must be unique')];\n        } else {\n            stopDomainValues[(value: any)] = true;\n        }\n\n        return [];\n    }\n\n    function validateFunctionDefault(options: ValidationOptions) {\n        return validate({\n            key: options.key,\n            value: options.value,\n            valueSpec: functionValueSpec,\n            style: options.style,\n            styleSpec: options.styleSpec\n        });\n    }\n}\n","// @flow\n\nimport ValidationError from '../error/validation_error.js';\n\nimport {createExpression, createPropertyExpression} from '../expression/index.js';\nimport {deepUnbundle} from '../util/unbundle_jsonlint.js';\nimport {isStateConstant, isGlobalPropertyConstant, isFeatureConstant} from '../expression/is_constant.js';\nimport CompoundExpression from '../expression/compound_expression.js';\n\nimport type {Expression} from '../expression/expression.js';\n\nexport default function validateExpression(options: any): Array<ValidationError> {\n    const expression = (options.expressionContext === 'property' ? createPropertyExpression : createExpression)(deepUnbundle(options.value), options.valueSpec);\n    if (expression.result === 'error') {\n        return expression.value.map((error) => {\n            return new ValidationError(`${options.key}${error.key}`, options.value, error.message);\n        });\n    }\n\n    const expressionObj = (expression.value: any).expression || (expression.value: any)._styleExpression.expression;\n\n    if (options.expressionContext === 'property' && (options.propertyKey === 'text-font') &&\n        !expressionObj.outputDefined()) {\n        return [new ValidationError(options.key, options.value, `Invalid data expression for \"${options.propertyKey}\". Output values must be contained as literals within the expression.`)];\n    }\n\n    if (options.expressionContext === 'property' && options.propertyType === 'layout' &&\n        (!isStateConstant(expressionObj))) {\n        return [new ValidationError(options.key, options.value, '\"feature-state\" data expressions are not supported with layout properties.')];\n    }\n\n    if (options.expressionContext === 'filter') {\n        return disallowedFilterParameters(expressionObj, options);\n    }\n\n    if (options.expressionContext && options.expressionContext.indexOf('cluster') === 0) {\n        if (!isGlobalPropertyConstant(expressionObj, ['zoom', 'feature-state'])) {\n            return [new ValidationError(options.key, options.value, '\"zoom\" and \"feature-state\" expressions are not supported with cluster properties.')];\n        }\n        if (options.expressionContext === 'cluster-initial' && !isFeatureConstant(expressionObj)) {\n            return [new ValidationError(options.key, options.value, 'Feature data expressions are not supported with initial expression part of cluster properties.')];\n        }\n    }\n\n    return [];\n}\n\nexport function disallowedFilterParameters(e: Expression, options: any): Array<ValidationError> {\n    const disallowedParameters = new Set([\n        'zoom',\n        'feature-state',\n        'pitch',\n        'distance-from-center'\n    ]);\n\n    if (options.valueSpec && options.valueSpec.expression) {\n        for (const param of options.valueSpec.expression.parameters) {\n            disallowedParameters.delete(param);\n        }\n    }\n\n    if (disallowedParameters.size === 0) {\n        return [];\n    }\n    const errors = [];\n\n    if (e instanceof CompoundExpression) {\n        if (disallowedParameters.has(e.name)) {\n            return [new ValidationError(options.key, options.value, `[\"${e.name}\"] expression is not supported in a filter for a ${options.object.type} layer with id: ${options.object.id}`)];\n        }\n    }\n    e.eachChild((arg) => {\n        errors.push(...disallowedFilterParameters(arg, options));\n    });\n\n    return errors;\n}\n","// @flow\n\nimport ValidationError from '../error/validation_error.js';\nimport {unbundle} from '../util/unbundle_jsonlint.js';\n\nimport type {ValidationOptions} from './validate.js';\n\nexport default function validateEnum(options: ValidationOptions): Array<ValidationError> {\n    const key = options.key;\n    const value = options.value;\n    const valueSpec = options.valueSpec;\n    const errors = [];\n\n    if (Array.isArray(valueSpec.values)) { // <=v7\n        if (valueSpec.values.indexOf(unbundle(value)) === -1) {\n            errors.push(new ValidationError(key, value, `expected one of [${valueSpec.values.join(', ')}], ${JSON.stringify(value)} found`));\n        }\n    } else { // >=v8\n        if (Object.keys(valueSpec.values).indexOf(unbundle(value)) === -1) {\n            errors.push(new ValidationError(key, value, `expected one of [${Object.keys(valueSpec.values).join(', ')}], ${JSON.stringify(value)} found`));\n        }\n    }\n    return errors;\n}\n","// @flow\n\nimport ValidationError from '../error/validation_error.js';\nimport validateExpression from './validate_expression.js';\nimport validateEnum from './validate_enum.js';\nimport getType from '../util/get_type.js';\nimport {unbundle, deepUnbundle} from '../util/unbundle_jsonlint.js';\nimport extend from '../util/extend.js';\nimport {isExpressionFilter} from '../feature_filter/index.js';\n\nimport type {ValidationOptions} from './validate.js';\n\ntype Options = ValidationOptions & {\n    layerType?: string;\n}\n\nexport default function validateFilter(options: Options): Array<ValidationError> {\n    if (isExpressionFilter(deepUnbundle(options.value))) {\n        // We default to a layerType of `fill` because that points to a non-dynamic filter definition within the style-spec.\n        const layerType = options.layerType || 'fill';\n\n        return validateExpression(extend({}, options, {\n            expressionContext: 'filter',\n            valueSpec: options.styleSpec[`filter_${layerType}`]\n        }));\n    } else {\n        return validateNonExpressionFilter(options);\n    }\n}\n\nfunction validateNonExpressionFilter(options: Options) {\n    const value = options.value;\n    const key = options.key;\n\n    if (getType(value) !== 'array') {\n        return [new ValidationError(key, value, `array expected, ${getType(value)} found`)];\n    }\n\n    const styleSpec = options.styleSpec;\n    let type;\n\n    let errors = [];\n\n    if (value.length < 1) {\n        return [new ValidationError(key, value, 'filter array must have at least 1 element')];\n    }\n\n    errors = errors.concat(validateEnum({\n        key: `${key}[0]`,\n        value: value[0],\n        valueSpec: styleSpec.filter_operator,\n        style: options.style,\n        styleSpec: options.styleSpec\n    }));\n\n    switch (unbundle(value[0])) {\n    case '<':\n    case '<=':\n    case '>':\n    case '>=':\n        if (value.length >= 2 && unbundle(value[1]) === '$type') {\n            errors.push(new ValidationError(key, value, `\"$type\" cannot be use with operator \"${value[0]}\"`));\n        }\n        /* falls through */\n    case '==':\n    case '!=':\n        if (value.length !== 3) {\n            errors.push(new ValidationError(key, value, `filter array for operator \"${value[0]}\" must have 3 elements`));\n        }\n        /* falls through */\n    case 'in':\n    case '!in':\n        if (value.length >= 2) {\n            type = getType(value[1]);\n            if (type !== 'string') {\n                errors.push(new ValidationError(`${key}[1]`, value[1], `string expected, ${type} found`));\n            }\n        }\n        for (let i = 2; i < value.length; i++) {\n            type = getType(value[i]);\n            if (unbundle(value[1]) === '$type') {\n                errors = errors.concat(validateEnum({\n                    key: `${key}[${i}]`,\n                    value: value[i],\n                    valueSpec: styleSpec.geometry_type,\n                    style: options.style,\n                    styleSpec: options.styleSpec\n                }));\n            } else if (type !== 'string' && type !== 'number' && type !== 'boolean') {\n                errors.push(new ValidationError(`${key}[${i}]`, value[i], `string, number, or boolean expected, ${type} found`));\n            }\n        }\n        break;\n\n    case 'any':\n    case 'all':\n    case 'none':\n        for (let i = 1; i < value.length; i++) {\n            errors = errors.concat(validateNonExpressionFilter(({\n                key: `${key}[${i}]`,\n                value: value[i],\n                style: options.style,\n                styleSpec: options.styleSpec\n            }: any)));\n        }\n        break;\n\n    case 'has':\n    case '!has':\n        type = getType(value[1]);\n        if (value.length !== 2) {\n            errors.push(new ValidationError(key, value, `filter array for \"${value[0]}\" operator must have 2 elements`));\n        } else if (type !== 'string') {\n            errors.push(new ValidationError(`${key}[1]`, value[1], `string expected, ${type} found`));\n        }\n        break;\n    }\n    return errors;\n}\n","// @flow\n\nimport validate from './validate.js';\nimport {default as ValidationError, ValidationWarning} from '../error/validation_error.js';\nimport getType from '../util/get_type.js';\nimport {isFunction} from '../function/index.js';\nimport {unbundle, deepUnbundle} from '../util/unbundle_jsonlint.js';\nimport {supportsLightExpression, supportsPropertyExpression, supportsZoomExpression} from '../util/properties.js';\nimport {isGlobalPropertyConstant, isFeatureConstant, isStateConstant} from '../expression/is_constant.js';\n\nimport type {ValidationOptions} from './validate.js';\nimport {createPropertyExpression} from '../expression/index.js';\n\nexport type PropertyValidationOptions = ValidationOptions & {\n    objectKey: string;\n    layerType: string;\n    layer: Object;\n}\n\nexport default function validateProperty(options: PropertyValidationOptions, propertyType: string): Array<ValidationError> {\n    const key = options.key;\n    const style = options.style;\n    const layer = options.layer;\n    const styleSpec = options.styleSpec;\n    const value = options.value;\n    const propertyKey = options.objectKey;\n    const layerSpec = styleSpec[`${propertyType}_${options.layerType}`];\n\n    if (!layerSpec) return [];\n\n    const transitionMatch = propertyKey.match(/^(.*)-transition$/);\n    if (propertyType === 'paint' && transitionMatch && layerSpec[transitionMatch[1]] && layerSpec[transitionMatch[1]].transition) {\n        return validate({\n            key,\n            value,\n            valueSpec: styleSpec.transition,\n            style,\n            styleSpec\n        });\n    }\n\n    const valueSpec = options.valueSpec || layerSpec[propertyKey];\n    if (!valueSpec) {\n        return [new ValidationWarning(key, value, `unknown property \"${propertyKey}\"`)];\n    }\n\n    let tokenMatch: ?RegExp$matchResult;\n    if (getType(value) === 'string' && supportsPropertyExpression(valueSpec) && !valueSpec.tokens && (tokenMatch = /^{([^}]+)}$/.exec(value))) {\n        const example = `\\`{ \"type\": \"identity\", \"property\": ${tokenMatch ? JSON.stringify(tokenMatch[1]) : '\"_\"'} }\\``;\n        return [new ValidationError(\n            key, value,\n            `\"${propertyKey}\" does not support interpolation syntax\\n` +\n                `Use an identity property function instead: ${example}.`)];\n    }\n\n    const errors = [];\n\n    if (options.layerType === 'symbol') {\n        if (propertyKey === 'text-field' && style && !style.glyphs && !style.imports) {\n            errors.push(new ValidationError(key, value, 'use of \"text-field\" requires a style \"glyphs\" property'));\n        }\n        if (propertyKey === 'text-font' && isFunction(deepUnbundle(value)) && unbundle(value.type) === 'identity') {\n            errors.push(new ValidationError(key, value, '\"text-font\" does not support identity functions'));\n        }\n    } else if (options.layerType === 'model' && propertyType === 'paint' && layer && layer.layout && layer.layout.hasOwnProperty('model-id')) {\n        if (supportsPropertyExpression(valueSpec) && (supportsLightExpression(valueSpec) || supportsZoomExpression(valueSpec))) {\n            // Performance related style spec limitation: zoom and light expressions are not allowed for e.g. trees.\n            const expression = createPropertyExpression(deepUnbundle(value), valueSpec);\n            const expressionObj = (expression.value: any).expression || (expression.value: any)._styleExpression.expression;\n\n            if (expressionObj && !isGlobalPropertyConstant(expressionObj, ['measure-light'])) {\n                if (propertyKey !== 'model-emissive-strength' || (!isFeatureConstant(expressionObj) || !isStateConstant(expressionObj))) {\n                    errors.push(new ValidationError(key, value, `${propertyKey} does not support measure-light expressions when the model layer source is vector tile or GeoJSON.`));\n                }\n            }\n        }\n    }\n\n    return errors.concat(validate({\n        key: options.key,\n        value,\n        valueSpec,\n        style,\n        styleSpec,\n        expressionContext: 'property',\n        propertyType,\n        propertyKey\n    }));\n}\n","// @flow\n\nimport validateProperty from './validate_property.js';\n\nimport type ValidationError from '../error/validation_error.js';\nimport type {PropertyValidationOptions} from './validate_property.js';\n\nexport default function validatePaintProperty(options: PropertyValidationOptions): Array<ValidationError> {\n    return validateProperty(options, 'paint');\n}\n","// @flow\n\nimport validateProperty from './validate_property.js';\n\nimport type ValidationError from '../error/validation_error.js';\nimport type {PropertyValidationOptions} from './validate_property.js';\n\nexport default function validateLayoutProperty(options: PropertyValidationOptions): Array<ValidationError> {\n    return validateProperty(options, 'layout');\n}\n","// @flow\n\nimport ValidationError from '../error/validation_error.js';\nimport {unbundle} from '../util/unbundle_jsonlint.js';\nimport validateObject from './validate_object.js';\nimport validateFilter from './validate_filter.js';\nimport validatePaintProperty from './validate_paint_property.js';\nimport validateLayoutProperty from './validate_layout_property.js';\nimport validateSpec from './validate.js';\nimport extend from '../util/extend.js';\n\nimport type {ValidationOptions} from './validate.js';\nimport type {LayerSpecification} from '../types.js';\n\ntype Options = ValidationOptions & {\n    value: LayerSpecification;\n    arrayIndex: number;\n}\n\nexport default function validateLayer(options: Options): Array<ValidationError> {\n    let errors = [];\n\n    const layer = options.value;\n    const key = options.key;\n    const style = options.style;\n    const styleSpec = options.styleSpec;\n\n    if (!layer.type && !layer.ref) {\n        errors.push(new ValidationError(key, layer, 'either \"type\" or \"ref\" is required'));\n    }\n    let type = unbundle(layer.type);\n    const ref = unbundle(layer.ref);\n\n    if (layer.id) {\n        const layerId = unbundle(layer.id);\n        for (let i = 0; i < options.arrayIndex; i++) {\n            const otherLayer = style.layers[i];\n            if (unbundle(otherLayer.id) === layerId) {\n                // $FlowFixMe[prop-missing] - id.__line__ is added dynamically during the readStyle step\n                errors.push(new ValidationError(key, layer.id, `duplicate layer id \"${layer.id}\", previously used at line ${otherLayer.id.__line__}`));\n            }\n        }\n    }\n\n    if ('ref' in layer) {\n        ['type', 'source', 'source-layer', 'filter', 'layout'].forEach((p) => {\n            if (p in layer) {\n                errors.push(new ValidationError(key, layer[p], `\"${p}\" is prohibited for ref layers`));\n            }\n        });\n\n        let parent;\n\n        style.layers.forEach((layer) => {\n            if (unbundle(layer.id) === ref) parent = layer;\n        });\n\n        if (!parent) {\n            if (typeof ref === 'string')\n                errors.push(new ValidationError(key, layer.ref, `ref layer \"${ref}\" not found`));\n        // $FlowFixMe[prop-missing] - ref is not defined on the LayerSpecification subtypes\n        } else if (parent.ref) {\n            errors.push(new ValidationError(key, layer.ref, 'ref cannot reference another ref layer'));\n        } else {\n            type = unbundle(parent.type);\n        }\n    } else if (!(type === 'background' || type === 'sky' || type === 'slot')) {\n        if (!layer.source) {\n            errors.push(new ValidationError(key, layer, 'missing required property \"source\"'));\n        } else {\n            const source = style.sources && style.sources[layer.source];\n            const sourceType = source && unbundle(source.type);\n            if (!source) {\n                errors.push(new ValidationError(key, layer.source, `source \"${layer.source}\" not found`));\n            } else if (sourceType === 'vector' && type === 'raster') {\n                errors.push(new ValidationError(key, layer.source, `layer \"${layer.id}\" requires a raster source`));\n            } else if (sourceType === 'raster' && type !== 'raster') {\n                errors.push(new ValidationError(key, layer.source, `layer \"${layer.id}\" requires a vector source`));\n            } else if (sourceType === 'vector' && !layer['source-layer']) {\n                errors.push(new ValidationError(key, layer, `layer \"${layer.id}\" must specify a \"source-layer\"`));\n            } else if (sourceType === 'raster-dem' && type !== 'hillshade') {\n                errors.push(new ValidationError(key, layer.source, 'raster-dem source can only be used with layer type \\'hillshade\\'.'));\n            } else if (sourceType === 'raster-array' && !['raster', 'raster-particle'].includes(type)) {\n                errors.push(new ValidationError(key, layer.source, `raster-array source can only be used with layer type \\'raster\\'.`));\n            } else if (type === 'line' && layer.paint && (layer.paint['line-gradient'] || layer.paint['line-trim-offset']) &&\n                       (sourceType !== 'geojson' || !source.lineMetrics)) {\n                errors.push(new ValidationError(key, layer, `layer \"${layer.id}\" specifies a line-gradient, which requires a GeoJSON source with \\`lineMetrics\\` enabled.`));\n            } else if (type === 'raster-particle' && sourceType !== 'raster-array') {\n                errors.push(new ValidationError(key, layer.source, `layer \"${layer.id}\" requires a \\'raster-array\\' source.`));\n            }\n        }\n    }\n\n    errors = errors.concat(validateObject({\n        key,\n        value: layer,\n        valueSpec: styleSpec.layer,\n        style: options.style,\n        styleSpec: options.styleSpec,\n        objectElementValidators: {\n            '*'() {\n                return [];\n            },\n            // We don't want to enforce the spec's `\"requires\": true` for backward compatibility with refs;\n            // the actual requirement is validated above. See https://github.com/mapbox/mapbox-gl-js/issues/5772.\n            type() {\n                return validateSpec({\n                    key: `${key}.type`,\n                    value: layer.type,\n                    valueSpec: styleSpec.layer.type,\n                    style: options.style,\n                    styleSpec: options.styleSpec,\n                    object: layer,\n                    objectKey: 'type'\n                });\n            },\n            filter(options) {\n                return validateFilter(extend({layerType: type}, options));\n            },\n            layout(options) {\n                return validateObject({\n                    layer,\n                    key: options.key,\n                    value: options.value,\n                    valueSpec: {},\n                    style: options.style,\n                    styleSpec: options.styleSpec,\n                    objectElementValidators: {\n                        '*'(options) {\n                            return validateLayoutProperty(extend({layerType: type}, options));\n                        }\n                    }\n                });\n            },\n            paint(options) {\n                return validateObject({\n                    layer,\n                    key: options.key,\n                    value: options.value,\n                    valueSpec: {},\n                    style: options.style,\n                    styleSpec: options.styleSpec,\n                    objectElementValidators: {\n                        '*'(options) {\n                            return validatePaintProperty(extend({layerType: type, layer}, options));\n                        }\n                    }\n                });\n            }\n        }\n    }));\n\n    return errors;\n}\n","// @flow\n\nimport getType from '../util/get_type.js';\nimport ValidationError from '../error/validation_error.js';\n\nimport type {ValidationOptions} from './validate.js';\n\nexport default function validateString(options: $Shape<ValidationOptions>): Array<ValidationError> {\n    const value = options.value;\n    const key = options.key;\n    const type = getType(value);\n\n    if (type !== 'string') {\n        return [new ValidationError(key, value, `string expected, ${type} found`)];\n    }\n\n    return [];\n}\n","// @flow\n\nimport {default as ValidationError, ValidationWarning} from '../error/validation_error.js';\nimport {unbundle} from '../util/unbundle_jsonlint.js';\nimport validateObject from './validate_object.js';\nimport validateEnum from './validate_enum.js';\nimport validateExpression from './validate_expression.js';\nimport validateString from './validate_string.js';\nimport getType from '../util/get_type.js';\n\nimport type {StyleReference} from '../reference/latest.js';\nimport type {ValidationOptions} from './validate.js';\n\nconst objectElementValidators = {\n    promoteId: validatePromoteId\n};\n\nexport default function validateSource(options: ValidationOptions): Array<ValidationError> {\n    const value = options.value;\n    const key = options.key;\n    const styleSpec = options.styleSpec;\n    const style = options.style;\n\n    if (!value.type) {\n        return [new ValidationError(key, value, '\"type\" is required')];\n    }\n\n    const type = unbundle(value.type);\n    let errors = [];\n\n    if (['vector', 'raster', 'raster-dem', 'raster-array'].includes(type)) {\n        if (!value.url && !value.tiles) {\n            errors.push(new ValidationWarning(key, value, 'Either \"url\" or \"tiles\" is required.'));\n        }\n    }\n\n    switch (type) {\n    case 'vector':\n    case 'raster':\n    case 'raster-dem':\n    case 'raster-array':\n        errors = errors.concat(validateObject({\n            key,\n            value,\n            valueSpec: styleSpec[`source_${type.replace('-', '_')}`],\n            style: options.style,\n            styleSpec,\n            objectElementValidators\n        }));\n        return errors;\n\n    case 'geojson':\n        errors = validateObject({\n            key,\n            value,\n            valueSpec: styleSpec.source_geojson,\n            style,\n            styleSpec,\n            objectElementValidators\n        });\n        if (value.cluster) {\n            for (const prop in value.clusterProperties) {\n                const [operator, mapExpr] = value.clusterProperties[prop];\n                const reduceExpr = typeof operator === 'string' ? [operator, ['accumulated'], ['get', prop]] : operator;\n\n                errors.push(...validateExpression({\n                    key: `${key}.${prop}.map`,\n                    value: mapExpr,\n                    expressionContext: 'cluster-map'\n                }));\n                errors.push(...validateExpression({\n                    key: `${key}.${prop}.reduce`,\n                    value: reduceExpr,\n                    expressionContext: 'cluster-reduce'\n                }));\n            }\n        }\n        return errors;\n\n    case 'video':\n        return validateObject({\n            key,\n            value,\n            valueSpec: styleSpec.source_video,\n            style,\n            styleSpec\n        });\n\n    case 'image':\n        return validateObject({\n            key,\n            value,\n            valueSpec: styleSpec.source_image,\n            style,\n            styleSpec\n        });\n\n    case 'canvas':\n        return [new ValidationError(key, null, `Please use runtime APIs to add canvas sources, rather than including them in stylesheets.`, 'source.canvas')];\n\n    default:\n        return validateEnum({\n            key: `${key}.type`,\n            value: value.type,\n            valueSpec: {values: getSourceTypeValues(styleSpec)},\n            style,\n            styleSpec\n        });\n    }\n}\n\nfunction getSourceTypeValues(styleSpec: StyleReference) {\n    return styleSpec.source.reduce((memo, source) => {\n        const sourceType = styleSpec[source];\n        if (sourceType.type.type === 'enum') {\n            memo = memo.concat(Object.keys(sourceType.type.values));\n        }\n        return memo;\n    }, []);\n}\n\nfunction validatePromoteId({key, value}: $Shape<ValidationOptions>) {\n    if (getType(value) === 'string') {\n        return validateString({key, value});\n    } else {\n        const errors = [];\n        for (const prop in value) {\n            errors.push(...validateString({key: `${key}.${prop}`, value: value[prop]}));\n        }\n        return errors;\n    }\n}\n","// @flow\n\nimport ValidationError from '../error/validation_error.js';\nimport getType from '../util/get_type.js';\nimport validate from './validate.js';\n\nimport type {ValidationOptions} from './validate.js';\n\nexport default function validateLight(options: ValidationOptions): Array<ValidationError> {\n    const light = options.value;\n    const styleSpec = options.styleSpec;\n    const lightSpec = styleSpec.light;\n    const style = options.style;\n\n    let errors = [];\n\n    const rootType = getType(light);\n    if (light === undefined) {\n        return errors;\n    } else if (rootType !== 'object') {\n        errors = errors.concat([new ValidationError('light', light, `object expected, ${rootType} found`)]);\n        return errors;\n    }\n\n    for (const key in light) {\n        const transitionMatch = key.match(/^(.*)-transition$/);\n\n        if (transitionMatch && lightSpec[transitionMatch[1]] && lightSpec[transitionMatch[1]].transition) {\n            errors = errors.concat(validate({\n                key,\n                value: light[key],\n                valueSpec: styleSpec.transition,\n                style,\n                styleSpec\n            }));\n        } else if (lightSpec[key]) {\n            errors = errors.concat(validate({\n                key,\n                value: light[key],\n                valueSpec: lightSpec[key],\n                style,\n                styleSpec\n            }));\n        } else {\n            errors = errors.concat([new ValidationError(key, light[key], `unknown property \"${key}\"`)]);\n        }\n    }\n\n    return errors;\n}\n","// @flow\n\nimport {default as ValidationError, ValidationWarning} from '../error/validation_error.js';\nimport getType from '../util/get_type.js';\nimport validate from './validate.js';\nimport {unbundle} from '../util/unbundle_jsonlint.js';\n\nimport type {ValidationOptions} from './validate.js';\n\ntype Options = ValidationOptions & {\n    arrayIndex: number;\n}\n\nexport default function validateLights(options: Options): Array<ValidationError> {\n    const light = options.value;\n    let errors = [];\n\n    if (!light) {\n        return errors;\n    }\n\n    const type = getType(light);\n    if (type !== 'object') {\n        errors = errors.concat([new ValidationError('light-3d', light, `object expected, ${type} found`)]);\n        return errors;\n    }\n\n    const styleSpec = options.styleSpec;\n    const lightSpec = styleSpec['light-3d'];\n    const key = options.key;\n    const style = options.style;\n    const lights = options.style.lights;\n\n    for (const key of ['type', 'id']) {\n        if (!(key in light)) {\n            errors = errors.concat([new ValidationError('light-3d', light, `missing property ${key} on light`)]);\n            return errors;\n        }\n    }\n\n    if (light.type && lights) {\n        for (let i = 0; i < options.arrayIndex; i++) {\n            const lightType = unbundle(light.type);\n            const otherLight = lights[i];\n            if (unbundle(otherLight.type) === lightType) {\n                // $FlowFixMe[prop-missing] - id.__line__ is added dynamically during the readStyle step\n                errors.push(new ValidationError(key, light.id, `duplicate light type \"${light.type}\", previously defined at line ${otherLight.id.__line__}`));\n            }\n        }\n    }\n\n    const lightType = `properties_light_${light['type']}`;\n    if (!(lightType in styleSpec)) {\n        errors = errors.concat([new ValidationError('light-3d', light, `Invalid light type ${light['type']}`)]);\n        return errors;\n    }\n\n    const lightPropertySpec = styleSpec[lightType];\n\n    for (const key in light) {\n        if (key === 'properties') {\n            const properties = light[key];\n            const propertiesType = getType(properties);\n            if (propertiesType !== 'object') {\n                errors = errors.concat([new ValidationError('properties', properties, `object expected, ${propertiesType} found`)]);\n                return errors;\n            }\n            for (const propertyKey in properties) {\n                if (!lightPropertySpec[propertyKey]) {\n                    errors = errors.concat([new ValidationWarning(options.key, properties[propertyKey], `unknown property \"${propertyKey}\"`)]);\n                } else {\n                    errors = errors.concat(validate({\n                        key: propertyKey,\n                        value: properties[propertyKey],\n                        valueSpec: lightPropertySpec[propertyKey],\n                        style,\n                        styleSpec\n                    }));\n                }\n            }\n        } else {\n            const transitionMatch = key.match(/^(.*)-transition$/);\n            if (transitionMatch && lightSpec[transitionMatch[1]] && lightSpec[transitionMatch[1]].transition) {\n                errors = errors.concat(validate({\n                    key,\n                    value: light[key],\n                    valueSpec: styleSpec.transition,\n                    style,\n                    styleSpec\n                }));\n            } else if (lightSpec[key]) {\n                errors = errors.concat(validate({\n                    key,\n                    value: light[key],\n                    valueSpec: lightSpec[key],\n                    style,\n                    styleSpec\n                }));\n            } else {\n                errors = errors.concat([new ValidationWarning(key, light[key], `unknown property \"${key}\"`)]);\n            }\n        }\n    }\n\n    return errors;\n}\n","// @flow\n\nimport {default as ValidationError, ValidationWarning} from '../error/validation_error.js';\nimport validate from './validate.js';\nimport getType from '../util/get_type.js';\nimport {unbundle} from '../util/unbundle_jsonlint.js';\n\nimport type {ValidationOptions} from './validate.js';\n\nexport default function validateTerrain(options: ValidationOptions): Array<ValidationError> {\n    const terrain = options.value;\n    const key = options.key;\n    const style = options.style;\n    const styleSpec = options.styleSpec;\n    const terrainSpec = styleSpec.terrain;\n    let errors = [];\n\n    const rootType = getType(terrain);\n    if (terrain === undefined) {\n        return errors;\n    } else if (rootType === 'null') {\n        return errors;\n    } else if (rootType !== 'object') {\n        errors = errors.concat([new ValidationError('terrain', terrain, `object expected, ${rootType} found`)]);\n        return errors;\n    }\n\n    for (const key in terrain) {\n        const transitionMatch = key.match(/^(.*)-transition$/);\n\n        if (transitionMatch && terrainSpec[transitionMatch[1]] && terrainSpec[transitionMatch[1]].transition) {\n            errors = errors.concat(validate({\n                key,\n                value: terrain[key],\n                valueSpec: styleSpec.transition,\n                style,\n                styleSpec\n            }));\n        } else if (terrainSpec[key]) {\n            errors = errors.concat(validate({\n                key,\n                value: terrain[key],\n                valueSpec: terrainSpec[key],\n                style,\n                styleSpec\n            }));\n        } else {\n            errors = errors.concat([new ValidationWarning(key, terrain[key], `unknown property \"${key}\"`)]);\n        }\n    }\n\n    if (!terrain.source) {\n        errors.push(new ValidationError(key, terrain, `terrain is missing required property \"source\"`));\n    } else {\n        const source = style.sources && style.sources[terrain.source];\n        const sourceType = source && unbundle(source.type);\n        if (!source) {\n            errors.push(new ValidationError(key, terrain.source, `source \"${terrain.source}\" not found`));\n        } else if (sourceType !== 'raster-dem') {\n            errors.push(new ValidationError(key, terrain.source, `terrain cannot be used with a source of type ${String(sourceType)}, it only be used with a \"raster-dem\" source type`));\n        }\n    }\n\n    return errors;\n}\n","// @flow\n\nimport {default as ValidationError, ValidationWarning} from '../error/validation_error.js';\nimport validate from './validate.js';\nimport getType from '../util/get_type.js';\n\nimport type {ValidationOptions} from './validate.js';\n\nexport default function validateFog(options: ValidationOptions): Array<ValidationError> {\n    const fog = options.value;\n    const style = options.style;\n    const styleSpec = options.styleSpec;\n    const fogSpec = styleSpec.fog;\n    let errors = [];\n\n    const rootType = getType(fog);\n    if (fog === undefined) {\n        return errors;\n    } else if (rootType !== 'object') {\n        errors = errors.concat([new ValidationError('fog', fog, `object expected, ${rootType} found`)]);\n        return errors;\n    }\n\n    for (const key in fog) {\n        const transitionMatch = key.match(/^(.*)-transition$/);\n\n        if (transitionMatch && fogSpec[transitionMatch[1]] && fogSpec[transitionMatch[1]].transition) {\n            errors = errors.concat(validate({\n                key,\n                value: fog[key],\n                valueSpec: styleSpec.transition,\n                style,\n                styleSpec\n            }));\n        } else if (fogSpec[key]) {\n            errors = errors.concat(validate({\n                key,\n                value: fog[key],\n                valueSpec: fogSpec[key],\n                style,\n                styleSpec\n            }));\n        } else {\n            errors = errors.concat([new ValidationWarning(key, fog[key], `unknown property \"${key}\"`)]);\n        }\n    }\n\n    return errors;\n}\n","// @flow\n\nimport extend from '../util/extend.js';\nimport ValidationError from '../error/validation_error.js';\nimport {unbundle, deepUnbundle} from '../util/unbundle_jsonlint.js';\nimport {isExpression} from '../expression/index.js';\nimport {isFunction} from '../function/index.js';\n\nimport validateImport from './validate_import.js';\nimport validateFunction from './validate_function.js';\nimport validateExpression from './validate_expression.js';\nimport validateObject from './validate_object.js';\nimport validateArray from './validate_array.js';\nimport validateBoolean from './validate_boolean.js';\nimport validateNumber from './validate_number.js';\nimport validateColor from './validate_color.js';\nimport validateEnum from './validate_enum.js';\nimport validateFilter from './validate_filter.js';\nimport validateLayer from './validate_layer.js';\nimport validateSource from './validate_source.js';\nimport validateModel from './validate_model.js';\nimport validateLight from './validate_light.js';\nimport validateLights from './validate_lights.js';\nimport validateTerrain from './validate_terrain.js';\nimport validateFog from './validate_fog.js';\nimport validateString from './validate_string.js';\nimport validateFormatted from './validate_formatted.js';\nimport validateImage from './validate_image.js';\nimport validateProjection from './validate_projection.js';\n\nimport type {StyleReference} from '../reference/latest.js';\nimport type {StyleSpecification} from '../types.js';\nimport getType from '../util/get_type.js';\n\nconst VALIDATORS = {\n    '*'() {\n        return [];\n    },\n    'array': validateArray,\n    'boolean': validateBoolean,\n    'number': validateNumber,\n    'color': validateColor,\n    'enum': validateEnum,\n    'filter': validateFilter,\n    'function': validateFunction,\n    'layer': validateLayer,\n    'object': validateObject,\n    'source': validateSource,\n    'model': validateModel,\n    'light': validateLight,\n    'light-3d': validateLights,\n    'terrain': validateTerrain,\n    'fog': validateFog,\n    'string': validateString,\n    'formatted': validateFormatted,\n    'resolvedImage': validateImage,\n    'projection': validateProjection,\n    'import': validateImport\n};\n\n// Main recursive validation function. Tracks:\n//\n// - key: string representing location of validation in style tree. Used only\n//   for more informative error reporting.\n// - value: current value from style being evaluated. May be anything from a\n//   high level object that needs to be descended into deeper or a simple\n//   scalar value.\n// - valueSpec: current spec being evaluated. Tracks value.\n// - styleSpec: current full spec being evaluated.\nexport type ValidationOptions = {\n    key: string;\n    value: Object;\n    valueSpec: Object;\n    style: $Shape<StyleSpecification>;\n    styleSpec: StyleReference;\n}\n\nexport default function validate(options: ValidationOptions, arrayAsExpression: boolean = false): Array<ValidationError> {\n    const value = options.value;\n    const valueSpec = options.valueSpec;\n    const styleSpec = options.styleSpec;\n\n    if (valueSpec.expression && isFunction(unbundle(value))) {\n        return validateFunction(options);\n    } else if (valueSpec.expression && isExpression(deepUnbundle(value))) {\n        return validateExpression(options);\n    } else if (valueSpec.type && VALIDATORS[valueSpec.type]) {\n        const valid = VALIDATORS[valueSpec.type](options);\n        if (arrayAsExpression === true && valid.length > 0 && getType(options.value) === \"array\") {\n            // Try to validate as an expression\n            return validateExpression(options);\n        } else {\n            return valid;\n        }\n    } else {\n        const valid = validateObject(extend({}, options, {\n            valueSpec: valueSpec.type ? styleSpec[valueSpec.type] : valueSpec\n        }));\n        return valid;\n    }\n}\n","// @flow\n\nimport getType from '../util/get_type.js';\nimport ValidationError from '../error/validation_error.js';\n\nimport type {ValidationOptions} from './validate.js';\n\nexport default function validateBoolean(options: ValidationOptions): Array<ValidationError> {\n    const value = options.value;\n    const key = options.key;\n    const type = getType(value);\n\n    if (type !== 'boolean') {\n        return [new ValidationError(key, value, `boolean expected, ${type} found`)];\n    }\n\n    return [];\n}\n","// @flow\n\nimport ValidationError from '../error/validation_error.js';\nimport getType from '../util/get_type.js';\nimport {parseCSSColor} from 'csscolorparser';\n\nimport type {ValidationOptions} from './validate.js';\n\nexport default function validateColor(options: ValidationOptions): Array<ValidationError> {\n    const key = options.key;\n    const value = options.value;\n    const type = getType(value);\n\n    if (type !== 'string') {\n        return [new ValidationError(key, value, `color expected, ${type} found`)];\n    }\n\n    if (parseCSSColor(value) === null) {\n        return [new ValidationError(key, value, `color expected, \"${value}\" found`)];\n    }\n\n    return [];\n}\n","// @flow\n\nimport validateExpression from './validate_expression.js';\nimport validateString from './validate_string.js';\n\nimport type {ValidationOptions} from './validate.js';\nimport type ValidationError from '../error/validation_error.js';\n\nexport default function validateFormatted(options: ValidationOptions): Array<ValidationError> {\n    if (validateString(options).length === 0) {\n        return [];\n    }\n\n    return validateExpression(options);\n}\n","// @flow\n\nimport validateExpression from './validate_expression.js';\nimport validateString from './validate_string.js';\n\nimport type {ValidationOptions} from './validate.js';\nimport type ValidationError from '../error/validation_error.js';\n\nexport default function validateImage(options: ValidationOptions): Array<ValidationError> {\n    if (validateString(options).length === 0) {\n        return [];\n    }\n\n    return validateExpression(options);\n}\n","// @flow\n\nimport ValidationError from '../error/validation_error.js';\nimport getType from '../util/get_type.js';\nimport validate from './validate.js';\n\nimport type {ValidationOptions} from './validate.js';\n\nexport default function validateProjection(options: ValidationOptions): Array<ValidationError> {\n    const projection = options.value;\n    const styleSpec = options.styleSpec;\n    const projectionSpec = styleSpec.projection;\n    const style = options.style;\n\n    let errors = [];\n\n    const rootType = getType(projection);\n\n    if (rootType === 'object') {\n        for (const key in projection) {\n            errors = errors.concat(validate({\n                key,\n                value: projection[key],\n                valueSpec: projectionSpec[key],\n                style,\n                styleSpec\n            }));\n        }\n    } else if (rootType !== 'string') {\n        errors = errors.concat([new ValidationError('projection', projection, `object or string expected, ${rootType} found`)]);\n    }\n\n    return errors;\n}\n","// @flow\n\nimport extend from '../util/extend.js';\nimport validateStyle from './validate_style.js';\nimport validateObject from './validate_object.js';\nimport ValidationError from '../error/validation_error.js';\nimport {unbundle} from '../util/unbundle_jsonlint.js';\n\nimport type {ValidationOptions} from './validate.js';\n\nexport default function validateImport(options: ValidationOptions): ValidationError[] {\n    const {value, styleSpec} = options;\n    const {data, ...importSpec} = value;\n\n    // Preserve __line__ from the value\n    Object.defineProperty(importSpec, '__line__', {\n        value: value.__line__,\n        enumerable: false\n    });\n\n    let errors = validateObject(extend({}, options, {\n        value: importSpec,\n        valueSpec: styleSpec.import\n    }));\n\n    // Empty string is reserved for the root style id\n    if (unbundle(importSpec.id) === '') {\n        const key = `${options.key}.id`;\n        errors.push(new ValidationError(key, importSpec, `import id can't be an empty string`));\n    }\n\n    if (data) {\n        const key = `${options.key}.data`;\n        errors = errors.concat(validateStyle(data, styleSpec, {key}));\n    }\n\n    return errors;\n}\n","// @flow\n\nimport ValidationError from '../error/validation_error.js';\nimport validateString from './validate_string.js';\n\nimport type {ValidationOptions} from './validate.js';\n\nexport default function(options: ValidationOptions): Array<ValidationError> {\n    const value = options.value;\n    const key = options.key;\n\n    const errors = validateString(options);\n    if (errors.length) return errors;\n\n    if (value.indexOf('{fontstack}') === -1) {\n        errors.push(new ValidationError(key, value, '\"glyphs\" url must include a \"{fontstack}\" token'));\n    }\n\n    if (value.indexOf('{range}') === -1) {\n        errors.push(new ValidationError(key, value, '\"glyphs\" url must include a \"{range}\" token'));\n    }\n\n    return errors;\n}\n","// @flow\nimport validate from './validate.js';\nimport latestStyleSpec from '../reference/latest.js';\nimport validateGlyphsURL from './validate_glyphs_url.js';\n\nimport ValidationError from '../error/validation_error.js';\n\nimport type {ValidationOptions} from './validate.js';\nimport type {StyleSpecification} from '../types.js';\n\ntype StyleValidationOptions = {\n    key?: $PropertyType<ValidationOptions, 'key'>\n}\n\nexport default function validateStyle(style: StyleSpecification, styleSpec: Object = latestStyleSpec, options: StyleValidationOptions = {}): ValidationError[] {\n    const errors = validate({\n        key: options.key || '',\n        value: style,\n        valueSpec: styleSpec.$root,\n        styleSpec,\n        style,\n        objectElementValidators: {\n            glyphs: validateGlyphsURL,\n            '*': () => []\n        }\n    });\n\n    return errors;\n}\n","// @flow\nimport latestStyleSpec from './reference/latest.js';\n\nimport _validateStyle from './validate/validate_style.js';\nimport _validateSource from './validate/validate_source.js';\nimport _validateLight from './validate/validate_light.js';\nimport _validateLights from './validate/validate_lights.js';\nimport _validateTerrain from './validate/validate_terrain.js';\nimport _validateFog from './validate/validate_fog.js';\nimport _validateLayer from './validate/validate_layer.js';\nimport _validateFilter from './validate/validate_filter.js';\nimport _validatePaintProperty from './validate/validate_paint_property.js';\nimport _validateLayoutProperty from './validate/validate_layout_property.js';\nimport _validateModel from './validate/validate_model.js';\n\nimport type {StyleSpecification} from './types.js';\n\nexport type ValidationError = interface {\n    message: string,\n    identifier?: ?string,\n    line?: ?number,\n};\nexport type ValidationErrors = $ReadOnlyArray<ValidationError>;\nexport type Validator = (Object) => ValidationErrors;\n\n/**\n * Validate a Mapbox GL style against the style specification. This entrypoint,\n * `mapbox-gl-style-spec/lib/validate_style.min`, is designed to produce as\n * small a browserify bundle as possible by omitting unnecessary functionality\n * and legacy style specifications.\n *\n * @private\n * @param {Object} style The style to be validated.\n * @param {Object} [styleSpec] The style specification to validate against.\n *     If omitted, the latest style spec is used.\n * @returns {Array<ValidationError>}\n * @example\n *   var validate = require('mapbox-gl-style-spec/lib/validate_style.min');\n *   var errors = validate(style);\n */\nexport function validateStyle(style: StyleSpecification, styleSpec: Object = latestStyleSpec): ValidationErrors {\n    const errors = _validateStyle(style, styleSpec);\n    return sortErrors(errors);\n}\n\nexport const validateSource: Validator = opts => sortErrors(_validateSource(opts));\nexport const validateLight: Validator = opts => sortErrors(_validateLight(opts));\nexport const validateLights: Validator = opts => sortErrors(_validateLights(opts));\nexport const validateTerrain: Validator = opts => sortErrors(_validateTerrain(opts));\nexport const validateFog: Validator = opts => sortErrors(_validateFog(opts));\nexport const validateLayer: Validator = opts => sortErrors(_validateLayer(opts));\nexport const validateFilter: Validator = opts => sortErrors(_validateFilter(opts));\nexport const validatePaintProperty: Validator = opts => sortErrors(_validatePaintProperty(opts));\nexport const validateLayoutProperty: Validator = opts => sortErrors(_validateLayoutProperty(opts));\nexport const validateModel: Validator = opts => sortErrors(_validateModel(opts));\n\nfunction sortErrors(errors: ValidationErrors) {\n    return errors.slice().sort((a, b) => a.line && b.line ? a.line - b.line : 0);\n}\n","// @flow\nimport {ErrorEvent} from '../util/evented.js';\nimport {warnOnce} from '../util/util.js';\nimport {ValidationWarning} from '../style-spec/error/validation_error.js';\n\nimport type {Evented} from '../util/evented.js';\nimport type {ValidationErrors as _ValidationErrors} from '../style-spec/validate_style.min.js';\n\nexport type {Validator, ValidationErrors} from '../style-spec/validate_style.min.js';\n\nexport function emitValidationErrors(emitter: Evented, errors: ?_ValidationErrors): boolean {\n    let hasErrors = false;\n    if (errors && errors.length) {\n        for (const error of errors) {\n            // do not fail rendering when seeing unknown properties, just skip them\n            if (error instanceof ValidationWarning) {\n                warnOnce(error.message);\n            } else {\n                emitter.fire(new ErrorEvent(new Error(error.message)));\n                hasErrors = true;\n            }\n        }\n    }\n    return hasErrors;\n}\n\nexport {\n    validateStyle,\n    validateSource,\n    validateLight,\n    validateTerrain,\n    validateLights,\n    validateModel,\n    validateFog,\n    validateLayer,\n    validateFilter,\n    validatePaintProperty,\n    validateLayoutProperty\n} from '../style-spec/validate_style.min.js';\n","// @flow\n\nimport styleSpec from '../style-spec/reference/latest.js';\n\nimport {extend} from '../util/util.js';\nimport {Evented} from '../util/evented.js';\nimport {\n    validateStyle,\n    validateLight,\n    emitValidationErrors\n} from './validate_style.js';\nimport Color from '../style-spec/util/color.js';\nimport {\n    Properties,\n    Transitionable,\n    Transitioning,\n    PossiblyEvaluated,\n    DataConstantProperty,\n    PositionProperty\n} from './properties.js';\n\nimport type EvaluationParameters from './evaluation_parameters.js';\nimport type {StyleSetterOptions} from '../style/style.js';\nimport type {TransitionParameters} from './properties.js';\n\nimport type {LightSpecification} from '../style-spec/types.js';\n\ntype Props = {|\n    \"anchor\": DataConstantProperty<\"map\" | \"viewport\">,\n    \"position\": PositionProperty,\n    \"color\": DataConstantProperty<Color>,\n    \"intensity\": DataConstantProperty<number>,\n|};\n\nconst properties: Properties<Props> = new Properties({\n    \"anchor\": new DataConstantProperty(styleSpec.light.anchor),\n    \"position\": new PositionProperty(styleSpec.light.position),\n    \"color\": new DataConstantProperty(styleSpec.light.color),\n    \"intensity\": new DataConstantProperty(styleSpec.light.intensity),\n});\n\n/*\n * Represents the light used to light extruded features.\n * Note that these lights are part of the legacy light API.\n */\nclass Light extends Evented {\n    _transitionable: Transitionable<Props>;\n    _transitioning: Transitioning<Props>;\n    properties: PossiblyEvaluated<Props>;\n    id: string;\n\n    constructor(lightOptions?: LightSpecification, id: string = \"flat\") {\n        super();\n        this._transitionable = new Transitionable(properties);\n        this.setLight(lightOptions, id);\n        this._transitioning = this._transitionable.untransitioned();\n    }\n\n    getLight(): LightSpecification {\n        return (this._transitionable.serialize(): any);\n    }\n\n    setLight(light?: LightSpecification, id: string, options: StyleSetterOptions = {}) {\n        if (this._validate(validateLight, light, options)) {\n            return;\n        }\n        this._transitionable.setTransitionOrValue<LightSpecification>(light);\n        this.id = id;\n    }\n\n    updateTransitions(parameters: TransitionParameters) {\n        this._transitioning = this._transitionable.transitioned(parameters, this._transitioning);\n    }\n\n    hasTransition(): boolean {\n        return this._transitioning.hasTransition();\n    }\n\n    recalculate(parameters: EvaluationParameters) {\n        this.properties = this._transitioning.possiblyEvaluate(parameters);\n    }\n\n    _validate(validate: Function, value: mixed, options?: {validate?: boolean}): boolean {\n        if (options && options.validate === false) {\n            return false;\n        }\n\n        return emitValidationErrors(this, validate.call(validateStyle, extend({\n            value,\n            // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407\n            style: {glyphs: true, sprite: true},\n            styleSpec\n        })));\n    }\n}\n\nexport default Light;\n","// @flow\n\nimport styleSpec from '../style-spec/reference/latest.js';\nimport {Evented} from '../util/evented.js';\nimport {Properties, Transitionable, Transitioning, PossiblyEvaluated, DataConstantProperty} from './properties.js';\n\nimport EvaluationParameters from './evaluation_parameters.js';\nimport type {ConfigOptions, TransitionParameters} from './properties.js';\nimport type {TerrainSpecification} from '../style-spec/types.js';\nimport {ZoomDependentExpression} from '../style-spec/expression/index.js';\n\ntype Props = {|\n    \"source\": DataConstantProperty<string>,\n    \"exaggeration\": DataConstantProperty<number>,\n|};\n\nexport const DrapeRenderMode = {\n    deferred: 0,\n    elevated: 1\n};\n\nconst properties: Properties<Props> = new Properties({\n    \"source\": new DataConstantProperty(styleSpec.terrain.source),\n    \"exaggeration\": new DataConstantProperty(styleSpec.terrain.exaggeration),\n});\n\nclass Terrain extends Evented {\n    scope: string;\n    _transitionable: Transitionable<Props>;\n    _transitioning: Transitioning<Props>;\n    properties: PossiblyEvaluated<Props>;\n    drapeRenderMode: number;\n\n    constructor(terrainOptions: TerrainSpecification, drapeRenderMode: number, scope: string, configOptions?: ?ConfigOptions) {\n        super();\n        this.scope = scope;\n        this._transitionable = new Transitionable(properties, scope, configOptions);\n        this._transitionable.setTransitionOrValue<TerrainSpecification>(terrainOptions, configOptions);\n        this._transitioning = this._transitionable.untransitioned();\n        this.drapeRenderMode = drapeRenderMode;\n    }\n\n    get(): TerrainSpecification {\n        return (this._transitionable.serialize(): any);\n    }\n\n    set(terrain: TerrainSpecification, configOptions?: ?ConfigOptions) {\n        this._transitionable.setTransitionOrValue<TerrainSpecification>(terrain, configOptions);\n    }\n\n    updateTransitions(parameters: TransitionParameters) {\n        this._transitioning = this._transitionable.transitioned(parameters, this._transitioning);\n    }\n\n    hasTransition(): boolean {\n        return this._transitioning.hasTransition();\n    }\n\n    recalculate(parameters: EvaluationParameters) {\n        this.properties = this._transitioning.possiblyEvaluate(parameters);\n    }\n\n    getExaggeration(atZoom: number): number {\n        return this._transitioning.possiblyEvaluate(new EvaluationParameters(atZoom)).get('exaggeration');\n    }\n\n    isZoomDependent(): boolean {\n        const exaggeration = this._transitionable._values['exaggeration'];\n        return exaggeration != null && exaggeration.value != null &&\n            exaggeration.value.expression != null &&\n            exaggeration.value.expression instanceof ZoomDependentExpression;\n    }\n}\n\nexport default Terrain;\n","// @flow\nimport {vec3} from 'gl-matrix';\nimport MercatorCoordinate from '../geo/mercator_coordinate.js';\nimport {smoothstep} from '../util/util.js';\nimport type LngLat from '../geo/lng_lat.js';\nimport type {UnwrappedTileID} from '../source/tile_id.js';\nimport type Transform from '../geo/transform.js';\nimport type {Mat4} from 'gl-matrix';\n\nexport const FOG_PITCH_START = 45;\nexport const FOG_PITCH_END = 65;\nexport const FOG_SYMBOL_CLIPPING_THRESHOLD = 0.9;\nexport const FOG_OPACITY_THRESHOLD = 0.05;  // Minimum opacity for the fog to be enabled for a tile\n\nexport type FogState = {\n    range: [number, number],\n    horizonBlend: number,\n    alpha: number\n};\n\n// As defined in _prelude_fog.fragment.glsl#fog_opacity\nexport function getFogOpacity(state: FogState, depth: number, pitch: number, fov: number): number {\n    const fogPitchOpacity = smoothstep(FOG_PITCH_START, FOG_PITCH_END, pitch);\n    const [start, end] = getFovAdjustedFogRange(state, fov);\n\n    // The output of this function must match _prelude_fog.fragment.glsl\n    // For further details, refer to the implementation in the shader code\n    const decay = 6;\n    const fogRange = (depth - start) / (end - start);\n    let falloff = 1.0 - Math.min(1, Math.exp(-decay * fogRange));\n\n    falloff *= falloff * falloff;\n    falloff = Math.min(1.0, 1.00747 * falloff);\n\n    return falloff * fogPitchOpacity * state.alpha;\n}\n\nexport function getFovAdjustedFogRange(state: FogState, fov: number): [number, number] {\n    // This function computes a shifted fog range so that the appearance is unchanged\n    // when the fov changes. We define range=0 starting at the camera position given\n    // the default fov. We avoid starting the fog range at the camera center so that\n    // ranges aren't generally negative unless the FOV is modified.\n    const shift = 0.5 / Math.tan(fov * 0.5);\n    return [state.range[0] + shift, state.range[1] + shift];\n}\n\nexport function getFogOpacityAtTileCoord(state: FogState, x: number, y: number, z: number, tileId: UnwrappedTileID, transform: Transform): number {\n    const mat = transform.calculateFogTileMatrix(tileId);\n    const pos = [x, y, z];\n    vec3.transformMat4(pos, pos, mat);\n\n    return getFogOpacity(state, vec3.length(pos), transform.pitch, transform._fov);\n}\n\nexport function getFogOpacityAtLngLat(state: FogState, lngLat: LngLat, transform: Transform): number {\n    const meters = MercatorCoordinate.fromLngLat(lngLat);\n    const elevation = transform.elevation ? transform.elevation.getAtPointOrZero(meters) : 0;\n    return getFogOpacityAtMercCoord(state, meters.x, meters.y, elevation, transform);\n}\n\nexport function getFogOpacityAtMercCoord(state: FogState, x: number, y: number, elevation: number, transform: Transform): number {\n    const pos = vec3.transformMat4([], [x, y, elevation], transform.mercatorFogMatrix);\n    return getFogOpacity(state, vec3.length(pos), transform.pitch, transform._fov);\n}\n\nexport function getFogOpacityForBounds(state: FogState, matrix: Mat4, x0: number, y0: number, x1: number, y1: number, transform: Transform): [number, number] {\n    const points = [\n        [x0, y0, 0],\n        [x1, y0, 0],\n        [x1, y1, 0],\n        [x0, y1, 0]\n    ];\n\n    let min = Number.MAX_VALUE;\n    let max = -Number.MAX_VALUE;\n\n    for (const point of points) {\n        const transformedPoint = vec3.transformMat4([], point, matrix);\n        const distance = vec3.length(transformedPoint);\n\n        min = Math.min(min, distance);\n        max = Math.max(max, distance);\n    }\n\n    return [getFogOpacity(state, min, transform.pitch, transform._fov), getFogOpacity(state, max, transform.pitch, transform._fov)];\n}\n","// @flow\n\nimport styleSpec from '../style-spec/reference/latest.js';\nimport {extend, smoothstep} from '../util/util.js';\nimport {Evented} from '../util/evented.js';\nimport {validateStyle, validateFog, emitValidationErrors} from './validate_style.js';\nimport {Properties, Transitionable, Transitioning, PossiblyEvaluated, DataConstantProperty} from './properties.js';\nimport Color from '../style-spec/util/color.js';\nimport {FOG_PITCH_START, FOG_PITCH_END, FOG_OPACITY_THRESHOLD, getFogOpacityAtLngLat, getFogOpacityAtMercCoord, getFovAdjustedFogRange, getFogOpacityForBounds} from './fog_helpers.js';\nimport {number as interpolate, array as vecInterpolate} from '../style-spec/util/interpolate.js';\nimport {globeToMercatorTransition} from '../geo/projection/globe_util.js';\nimport {Frustum} from '../util/primitives.js';\nimport {OverscaledTileID} from '../source/tile_id.js';\nimport EXTENT from '../style-spec/data/extent.js';\n\nimport type {FogSpecification} from '../style-spec/types.js';\nimport type EvaluationParameters from './evaluation_parameters.js';\nimport type {TransitionParameters, ConfigOptions} from './properties.js';\nimport type LngLat from '../geo/lng_lat.js';\nimport type Transform from '../geo/transform.js';\nimport type {StyleSetterOptions} from '../style/style.js';\nimport type {FogState} from './fog_helpers.js';\nimport type {Mat4, Vec3} from 'gl-matrix';\n\ntype Props = {|\n    \"range\": DataConstantProperty<[number, number]>,\n    \"color\": DataConstantProperty<Color>,\n    \"high-color\": DataConstantProperty<Color>,\n    \"space-color\": DataConstantProperty<Color>,\n    \"horizon-blend\": DataConstantProperty<number>,\n    \"star-intensity\": DataConstantProperty<number>,\n    \"vertical-range\": DataConstantProperty<[number, number]>,\n|};\n\nconst fogProperties: Properties<Props> = new Properties({\n    \"range\": new DataConstantProperty(styleSpec.fog.range),\n    \"color\": new DataConstantProperty(styleSpec.fog.color),\n    \"high-color\": new DataConstantProperty(styleSpec.fog[\"high-color\"]),\n    \"space-color\": new DataConstantProperty(styleSpec.fog[\"space-color\"]),\n    \"horizon-blend\": new DataConstantProperty(styleSpec.fog[\"horizon-blend\"]),\n    \"star-intensity\": new DataConstantProperty(styleSpec.fog[\"star-intensity\"]),\n    \"vertical-range\": new DataConstantProperty(styleSpec.fog[\"vertical-range\"]),\n});\n\nclass Fog extends Evented {\n    _transitionable: Transitionable<Props>;\n    _transitioning: Transitioning<Props>;\n    properties: PossiblyEvaluated<Props>;\n    _options: FogSpecification;\n\n    // Alternate projections do not yet support fog.\n    // Hold on to transform so that we know whether a projection is set.\n    _transform: Transform;\n\n    constructor(fogOptions?: FogSpecification, transform: Transform, scope: string, configOptions?: ?ConfigOptions) {\n        super();\n        this._transitionable = new Transitionable(fogProperties, scope, new Map(configOptions));\n        this.set(fogOptions, configOptions);\n        this._transitioning = this._transitionable.untransitioned();\n        this._transform = transform;\n        this.properties = new PossiblyEvaluated(fogProperties);\n    }\n\n    get state(): FogState {\n        const tr = this._transform;\n        const isGlobe = tr.projection.name === 'globe';\n        const transitionT = globeToMercatorTransition(tr.zoom);\n        const range = this.properties.get('range');\n        const globeFixedFogRange = [0.5, 3];\n        return {\n            range: isGlobe ? [\n                interpolate(globeFixedFogRange[0], range[0], transitionT),\n                interpolate(globeFixedFogRange[1], range[1], transitionT)\n            ] : range,\n            horizonBlend: this.properties.get('horizon-blend'),\n            alpha: this.properties.get('color').a\n        };\n    }\n\n    get(): FogSpecification {\n        return (this._transitionable.serialize(): any);\n    }\n\n    set(fog?: FogSpecification, configOptions?: ?ConfigOptions, options: StyleSetterOptions = {}) {\n        if (this._validate(validateFog, fog, options)) {\n            return;\n        }\n\n        const properties = extend({}, fog);\n        for (const name of Object.keys(styleSpec.fog)) {\n            // Fallback to use default style specification when the properties wasn't set\n            if (properties[name] === undefined) {\n                properties[name] = styleSpec.fog[name].default;\n            }\n        }\n\n        this._options = properties;\n        this._transitionable.setTransitionOrValue<FogSpecification>(this._options, configOptions);\n    }\n\n    getOpacity(pitch: number): number {\n        if (!this._transform.projection.supportsFog) return 0;\n\n        const fogColor = (this.properties && this.properties.get('color')) || 1.0;\n        const isGlobe = this._transform.projection.name === 'globe';\n        const pitchFactor = isGlobe ? 1.0 : smoothstep(FOG_PITCH_START, FOG_PITCH_END, pitch);\n        return pitchFactor * fogColor.a;\n    }\n\n    getOpacityAtLatLng(lngLat: LngLat, transform: Transform): number {\n        if (!this._transform.projection.supportsFog) return 0;\n\n        return getFogOpacityAtLngLat(this.state, lngLat, transform);\n    }\n\n    getOpacityForTile(id: OverscaledTileID): [number, number] {\n        if (!this._transform.projection.supportsFog) return [1, 1];\n\n        const fogMatrix = this._transform.calculateFogTileMatrix(id.toUnwrapped());\n        return getFogOpacityForBounds(this.state, fogMatrix, 0, 0, EXTENT, EXTENT, this._transform);\n    }\n\n    getOpacityForBounds(matrix: Mat4, x0: number, y0: number, x1: number, y1: number): [number, number] {\n        if (!this._transform.projection.supportsFog) return [1, 1];\n\n        return getFogOpacityForBounds(this.state, matrix, x0, y0, x1, y1, this._transform);\n    }\n\n    getFovAdjustedRange(fov: number): [number, number] {\n        // We can return any arbitrary range because we expect opacity=0 to clean it up\n        if (!this._transform.projection.supportsFog) return [0, 1];\n\n        return getFovAdjustedFogRange(this.state, fov);\n    }\n\n    isVisibleOnFrustum(frustum: Frustum): boolean {\n        if (!this._transform.projection.supportsFog) return false;\n\n        // Compute locations where frustum edges intersects with the ground plane\n        // and determine if all of these points are closer to the camera than\n        // the starting point (near range) of the fog.\n        const farPoints = [4, 5, 6, 7];\n\n        for (const pointIdx of farPoints) {\n            const farPoint = frustum.points[pointIdx];\n            let flatPoint: ?Vec3;\n\n            if (farPoint[2] >= 0.0) {\n                flatPoint = farPoint;\n            } else {\n                const nearPoint = frustum.points[pointIdx - 4];\n                flatPoint = vecInterpolate((nearPoint: any), (farPoint: any), nearPoint[2] / (nearPoint[2] - farPoint[2]));\n            }\n\n            if (getFogOpacityAtMercCoord(this.state, flatPoint[0], flatPoint[1], 0, this._transform) >= FOG_OPACITY_THRESHOLD) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    updateConfig(configOptions?: ?ConfigOptions) {\n        this._transitionable.setTransitionOrValue<FogSpecification>(this._options, new Map(configOptions));\n    }\n\n    updateTransitions(parameters: TransitionParameters) {\n        this._transitioning = this._transitionable.transitioned(parameters, this._transitioning);\n    }\n\n    hasTransition(): boolean {\n        return this._transitioning.hasTransition();\n    }\n\n    recalculate(parameters: EvaluationParameters) {\n        this.properties = this._transitioning.possiblyEvaluate(parameters);\n    }\n\n    _validate(validate: Function, value: mixed, options?: {validate?: boolean}): boolean {\n        if (options && options.validate === false) {\n            return false;\n        }\n\n        return emitValidationErrors(this, validate.call(validateStyle, extend({\n            value,\n            style: {glyphs: true, sprite: true},\n            styleSpec\n        })));\n    }\n}\n\nexport default Fog;\n","// @flow\n\nimport {Evented} from '../../src/util/evented.js';\nimport {Properties, Transitionable, Transitioning, PossiblyEvaluated} from '../../src/style/properties.js';\n\nimport type {LightsSpecification} from '../../src/style-spec/types.js';\nimport type {TransitionParameters, ConfigOptions} from '../../src/style/properties.js';\nimport type EvaluationParameters from '../../src/style/evaluation_parameters.js';\n\nclass Lights<P: Object> extends Evented {\n    scope: string;\n    properties: PossiblyEvaluated<P>;\n    _transitionable: Transitionable<P>;\n    _transitioning: Transitioning<P>;\n    _options: LightsSpecification;\n\n    constructor(options: LightsSpecification, properties: Properties<P>, scope: string, configOptions?: ?ConfigOptions) {\n        super();\n        this.scope = scope;\n        this._options = options;\n        this.properties = new PossiblyEvaluated(properties);\n\n        this._transitionable = new Transitionable(properties, scope, new Map(configOptions));\n        this._transitionable.setTransitionOrValue<$PropertyType<LightsSpecification, 'properties'>>(options.properties);\n        this._transitioning = this._transitionable.untransitioned();\n    }\n\n    updateConfig(configOptions?: ?ConfigOptions) {\n        this._transitionable.setTransitionOrValue<$PropertyType<LightsSpecification, 'properties'>>(this._options.properties, new Map(configOptions));\n    }\n\n    updateTransitions(parameters: TransitionParameters) {\n        this._transitioning = this._transitionable.transitioned(parameters, this._transitioning);\n    }\n\n    hasTransition(): boolean {\n        return this._transitioning.hasTransition();\n    }\n\n    recalculate(parameters: EvaluationParameters) {\n        this.properties = this._transitioning.possiblyEvaluate(parameters);\n    }\n\n    get(): LightsSpecification {\n        this._options.properties = this._transitionable.serialize();\n        return this._options;\n    }\n\n    set(options: LightsSpecification, configOptions?: ?ConfigOptions) {\n        this._options = options;\n        this._transitionable.setTransitionOrValue<$PropertyType<LightsSpecification, 'properties'>>(options.properties, configOptions);\n    }\n\n    shadowsEnabled(): boolean {\n        if (!this.properties) return false;\n        return this.properties.get('cast-shadows') === true;\n    }\n}\n\nexport default Lights;\n","// This file is generated. Edit build/generate-style-code.js, then run `npm run codegen`.\n// @flow\n/* eslint-disable */\n\nimport styleSpec from '../../src/style-spec/reference/latest.js';\n\nimport {\n    Properties,\n    DataConstantProperty,\n    DirectionProperty,\n} from '../../src/style/properties.js';\n\nimport type Color from '../../src/style-spec/util/color.js';\n\nexport type LightProps = {|\n    \"color\": DataConstantProperty<Color>,\n    \"intensity\": DataConstantProperty<number>,\n|};\n\nconst properties: Properties<LightProps> = new Properties({\n    \"color\": new DataConstantProperty(styleSpec[\"properties_light_ambient\"][\"color\"]),\n    \"intensity\": new DataConstantProperty(styleSpec[\"properties_light_ambient\"][\"intensity\"]),\n});\n\nexport {properties}\n","// This file is generated. Edit build/generate-style-code.js, then run `npm run codegen`.\n// @flow\n/* eslint-disable */\n\nimport styleSpec from '../../src/style-spec/reference/latest.js';\n\nimport {\n    Properties,\n    DataConstantProperty,\n    DirectionProperty,\n} from '../../src/style/properties.js';\n\nimport type Color from '../../src/style-spec/util/color.js';\n\nexport type LightProps = {|\n    \"direction\": DirectionProperty,\n    \"color\": DataConstantProperty<Color>,\n    \"intensity\": DataConstantProperty<number>,\n    \"cast-shadows\": DataConstantProperty<boolean>,\n    \"shadow-intensity\": DataConstantProperty<number>,\n|};\n\nconst properties: Properties<LightProps> = new Properties({\n    \"direction\": new DirectionProperty(styleSpec[\"properties_light_directional\"][\"direction\"]),\n    \"color\": new DataConstantProperty(styleSpec[\"properties_light_directional\"][\"color\"]),\n    \"intensity\": new DataConstantProperty(styleSpec[\"properties_light_directional\"][\"intensity\"]),\n    \"cast-shadows\": new DataConstantProperty(styleSpec[\"properties_light_directional\"][\"cast-shadows\"]),\n    \"shadow-intensity\": new DataConstantProperty(styleSpec[\"properties_light_directional\"][\"shadow-intensity\"]),\n});\n\nexport {properties}\n","// @flow\n\nimport Point from '@mapbox/point-geometry';\nimport {getBounds, clamp, polygonizeBounds, bufferConvexPolygon} from '../util/util.js';\nimport {polygonIntersectsBox, polygonContainsPoint} from '../util/intersection_tests.js';\nimport EXTENT from '../style-spec/data/extent.js';\nimport pixelsToTileUnits from '../source/pixels_to_tile_units.js';\nimport {vec3, vec4, mat4} from 'gl-matrix';\nimport {Ray} from '../util/primitives.js';\nimport MercatorCoordinate, {mercatorXfromLng} from '../geo/mercator_coordinate.js';\nimport {getTilePoint, getTileVec3} from '../geo/projection/tile_transform.js';\nimport resample from '../geo/projection/resample.js';\nimport {GLOBE_RADIUS} from '../geo/projection/globe_constants.js';\nimport {number as interpolate} from '../style-spec/util/interpolate.js';\n\nimport type Transform from '../geo/transform.js';\nimport type Tile from '../source/tile.js';\nimport type {PointLike} from '../types/point-like.js';\nimport type {OverscaledTileID} from '../source/tile_id.js';\n\ntype CachedPolygon = {\n    // Query rectangle projected on the map plane\n    polygon: MercatorCoordinate[];\n\n    // A flag tellingwhether the query polygon might span across mercator boundaries [0, 1]\n    unwrapped: boolean;\n};\n\n/**\n * A data-class that represents a screenspace query from `Map#queryRenderedFeatures`.\n * All the internal geometries and data are intented to be immutable and read-only.\n * Its lifetime is only for the duration of the query and fixed state of the map while the query is being processed.\n *\n * @class QueryGeometry\n */\nexport class QueryGeometry {\n    screenBounds: Point[];\n    cameraPoint: Point;\n    screenGeometry: Point[];\n    screenGeometryMercator: CachedPolygon;\n\n    _screenRaycastCache: { [_: number]: CachedPolygon};\n    _cameraRaycastCache: { [_: number]: CachedPolygon};\n\n    isAboveHorizon: boolean;\n\n    constructor(screenBounds: Point[], cameraPoint: Point, aboveHorizon: boolean, transform: Transform) {\n        this.screenBounds = screenBounds;\n        this.cameraPoint = cameraPoint;\n        this._screenRaycastCache = {};\n        this._cameraRaycastCache = {};\n        this.isAboveHorizon = aboveHorizon;\n\n        this.screenGeometry = this.bufferedScreenGeometry(0);\n        this.screenGeometryMercator = this._bufferedScreenMercator(0, transform);\n    }\n\n    /**\n     * Factory method to help contruct an instance  while accounting for current map state.\n     *\n     * @static\n     * @param {(PointLike | [PointLike, PointLike])} geometry The query geometry.\n     * @param {Transform} transform The current map transform.\n     * @returns {QueryGeometry} An instance of the QueryGeometry class.\n     */\n    static createFromScreenPoints(geometry: PointLike | [PointLike, PointLike], transform: Transform): QueryGeometry {\n        let screenGeometry;\n        let aboveHorizon;\n\n        // $FlowFixMe: Flow can't refine that this will be PointLike but we can\n        if (geometry instanceof Point || typeof geometry[0] === 'number') {\n            // $FlowFixMe\n            const pt = Point.convert(geometry);\n            screenGeometry = [pt];\n            aboveHorizon = transform.isPointAboveHorizon(pt);\n        } else {\n            // $FlowFixMe\n            const tl = Point.convert(geometry[0]);\n            // $FlowFixMe\n            const br = Point.convert(geometry[1]);\n            screenGeometry = [tl, br];\n            aboveHorizon = polygonizeBounds(tl, br).every((p) => transform.isPointAboveHorizon(p));\n        }\n\n        return new QueryGeometry(screenGeometry, transform.getCameraPoint(), aboveHorizon, transform);\n    }\n\n    /**\n     * Returns true if the initial query by the user was a single point.\n     *\n     * @returns {boolean} Returns `true` if the initial query geometry was a single point.\n     */\n    isPointQuery(): boolean {\n        return this.screenBounds.length === 1;\n    }\n\n    /**\n     * Due to data-driven styling features do not uniform size(eg `circle-radius`) and can be offset differntly\n     * from their original location(for example with `*-translate`). This means we have to expand our query region for\n     * each tile to account for variation in these properties.\n     * Each tile calculates a tile level max padding value (in screenspace pixels) when its parsed, this function\n     * lets us calculate a buffered version of the screenspace query geometry for each tile.\n     *\n     * @param {number} buffer The tile padding in screenspace pixels.\n     * @returns {Point[]} The buffered query geometry.\n     */\n    bufferedScreenGeometry(buffer: number): Point[] {\n        return polygonizeBounds(\n            this.screenBounds[0],\n            this.screenBounds.length === 1 ? this.screenBounds[0] : this.screenBounds[1],\n            buffer\n        );\n    }\n\n    /**\n     * When the map is pitched, some of the 3D features that intersect a query will not intersect\n     * the query at the surface of the earth. Instead the feature may be closer and only intersect\n     * the query because it extrudes into the air.\n     *\n     * This returns a geometry that is a convex polygon that encompasses the query frustum and the point underneath the camera.\n     * Similar to `bufferedScreenGeometry`, buffering is added to account for variation in paint properties.\n     *\n     * Case 1: point underneath camera is exactly behind query volume\n     *              +----------+\n     *              |          |\n     *              |          |\n     *              |          |\n     *              +          +\n     *               X        X\n     *                X      X\n     *                 X    X\n     *                  X  X\n     *                   XX.\n     *\n     * Case 2: point is behind and to the right\n     *              +----------+\n     *              |          X\n     *              |           X\n     *              |           XX\n     *              +            X\n     *              XXX          XX\n     *                 XXXX       X\n     *                    XXX     XX\n     *                        XX   X\n     *                           XXX.\n     *\n     * Case 3: point is behind and to the left\n     *              +----------+\n     *             X           |\n     *             X           |\n     *            XX           |\n     *            X            +\n     *           X          XXXX\n     *          XX       XXX\n     *          X    XXXX\n     *         X XXXX\n     *         XXX.\n     *\n     * @param {number} buffer The tile padding in screenspace pixels.\n     * @returns {Point[]} The buffered query geometry.\n     */\n    bufferedCameraGeometry(buffer: number): Point[] {\n        const min = this.screenBounds[0];\n        const max = this.screenBounds.length === 1 ? this.screenBounds[0].add(new Point(1, 1)) : this.screenBounds[1];\n        const cameraPolygon = polygonizeBounds(min, max, 0, false);\n\n        // Only need to account for point underneath camera if its behind query volume\n        if (this.cameraPoint.y > max.y) {\n            //case 1: insert point in the middle\n            if (this.cameraPoint.x > min.x && this.cameraPoint.x < max.x) {\n                cameraPolygon.splice(3, 0, this.cameraPoint);\n            //case 2: replace btm right point\n            } else if (this.cameraPoint.x >= max.x) {\n                cameraPolygon[2] = this.cameraPoint;\n            //case 3: replace btm left point\n            } else if (this.cameraPoint.x <= min.x) {\n                cameraPolygon[3] = this.cameraPoint;\n            }\n        }\n\n        return bufferConvexPolygon(cameraPolygon, buffer);\n    }\n\n    // Creates a convex polygon in screen coordinates that encompasses the query frustum and\n    // the camera location at globe's surface. Camera point can be at any side of the query polygon as\n    // opposed to `bufferedCameraGeometry` which restricts the location to underneath the polygon.\n    bufferedCameraGeometryGlobe(buffer: number): Point[] {\n        const min = this.screenBounds[0];\n        const max = this.screenBounds.length === 1 ? this.screenBounds[0].add(new Point(1, 1)) : this.screenBounds[1];\n\n        // Padding is added to the query polygon before inclusion of the camera location.\n        // Otherwise the buffered (narrow) polygon could penetrate the globe creating a lot of false positives\n        const cameraPolygon = polygonizeBounds(min, max, buffer);\n\n        const camPos = this.cameraPoint.clone();\n        const column = (camPos.x > min.x) + (camPos.x > max.x);\n        const row = (camPos.y > min.y) + (camPos.y > max.y);\n        const sector = row * 3 + column;\n\n        switch (sector) {\n        case 0:     // replace top-left point (closed polygon)\n            cameraPolygon[0] = camPos;\n            cameraPolygon[4] = camPos.clone();\n            break;\n        case 1:     // insert point in the middle of top-left and top-right\n            cameraPolygon.splice(1, 0, camPos);\n            break;\n        case 2:     // replace top-right point\n            cameraPolygon[1] = camPos;\n            break;\n        case 3:     // insert point in the middle of top-left and bottom-left\n            cameraPolygon.splice(4, 0, camPos);\n            break;\n        case 5:     // insert point in the middle of top-right and bottom-right\n            cameraPolygon.splice(2, 0, camPos);\n            break;\n        case 6:     // replace bottom-left point\n            cameraPolygon[3] = camPos;\n            break;\n        case 7:     // insert point in the middle of bottom-left and bottom-right\n            cameraPolygon.splice(3, 0, camPos);\n            break;\n        case 8:     // replace bottom-right point\n            cameraPolygon[2] = camPos;\n            break;\n        }\n\n        return cameraPolygon;\n    }\n\n    /**\n     * Checks if a tile is contained within this query geometry.\n     *\n     * @param {Tile} tile The tile to check.\n     * @param {Transform} transform The current map transform.\n     * @param {boolean} use3D A boolean indicating whether to query 3D features.\n     * @param {number} cameraWrap A wrap value for offsetting the camera position.\n     * @returns {?TilespaceQueryGeometry} Returns `undefined` if the tile does not intersect.\n     */\n    containsTile(tile: Tile, transform: Transform, use3D: boolean, cameraWrap: number = 0): ?TilespaceQueryGeometry {\n        // The buffer around the query geometry is applied in screen-space.\n        // transform._pixelsPerMercatorPixel is used to compensate any extra scaling applied from the currently active projection.\n        // Floating point errors when projecting into tilespace could leave a feature\n        // outside the query volume even if it looks like it overlaps visually, a 1px bias value overcomes that.\n        const bias = 1;\n        const padding = tile.queryPadding / transform._pixelsPerMercatorPixel + bias;\n\n        const cachedQuery = use3D ?\n            this._bufferedCameraMercator(padding, transform) :\n            this._bufferedScreenMercator(padding, transform);\n\n        let wrap = tile.tileID.wrap + (cachedQuery.unwrapped ? cameraWrap : 0);\n        const geometryForTileCheck = cachedQuery.polygon.map((p) => getTilePoint(tile.tileTransform, p, wrap));\n\n        if (!polygonIntersectsBox(geometryForTileCheck, 0, 0, EXTENT, EXTENT)) {\n            return undefined;\n        }\n\n        wrap = tile.tileID.wrap + (this.screenGeometryMercator.unwrapped ? cameraWrap : 0);\n        const tilespaceVec3s = this.screenGeometryMercator.polygon.map((p) => getTileVec3(tile.tileTransform, p, wrap));\n        const tilespaceGeometry = tilespaceVec3s.map((v) => new Point(v[0], v[1]));\n\n        const cameraMercator = transform.getFreeCameraOptions().position || new MercatorCoordinate(0, 0, 0);\n        const tilespaceCameraPosition = getTileVec3(tile.tileTransform, cameraMercator, wrap);\n        const tilespaceRays = tilespaceVec3s.map((tileVec) => {\n            const dir = vec3.sub(tileVec, tileVec, tilespaceCameraPosition);\n            vec3.normalize(dir, dir);\n            return new Ray(tilespaceCameraPosition, dir);\n        });\n        const pixelToTileUnitsFactor = pixelsToTileUnits(tile, 1, transform.zoom) * transform._pixelsPerMercatorPixel;\n\n        return {\n            queryGeometry: this,\n            tilespaceGeometry,\n            tilespaceRays,\n            bufferedTilespaceGeometry: geometryForTileCheck,\n            bufferedTilespaceBounds: clampBoundsToTileExtents(getBounds(geometryForTileCheck)),\n            tile,\n            tileID: tile.tileID,\n            pixelToTileUnitsFactor\n        };\n    }\n\n    /**\n     * These methods add caching on top of the terrain raycasting provided by `Transform#pointCoordinate3d`.\n     * Tiles come with different values of padding, however its very likely that multiple tiles share the same value of padding\n     * based on the style. In that case we want to reuse the result from a previously computed terrain raycast.\n     */\n\n    _bufferedScreenMercator(padding: number, transform: Transform): CachedPolygon {\n        const key = cacheKey(padding);\n        if (this._screenRaycastCache[key]) {\n            return this._screenRaycastCache[key];\n        } else {\n            let poly: CachedPolygon;\n\n            if (transform.projection.name === 'globe') {\n                poly = this._projectAndResample(this.bufferedScreenGeometry(padding), transform);\n            } else {\n                poly = {\n                    polygon: this.bufferedScreenGeometry(padding).map((p) => transform.pointCoordinate3D(p)),\n                    unwrapped: true\n                };\n            }\n\n            this._screenRaycastCache[key] = poly;\n            return poly;\n        }\n    }\n\n    _bufferedCameraMercator(padding: number, transform: Transform): CachedPolygon {\n        const key = cacheKey(padding);\n        if (this._cameraRaycastCache[key]) {\n            return this._cameraRaycastCache[key];\n        } else {\n            let poly: CachedPolygon;\n\n            if (transform.projection.name === 'globe') {\n                poly = this._projectAndResample(this.bufferedCameraGeometryGlobe(padding), transform);\n            } else {\n                poly = {\n                    polygon: this.bufferedCameraGeometry(padding).map((p) => transform.pointCoordinate3D(p)),\n                    unwrapped: true\n                };\n            }\n\n            this._cameraRaycastCache[key] = poly;\n            return poly;\n        }\n    }\n\n    _projectAndResample(polygon: Point[], transform: Transform): CachedPolygon {\n        // Handle a special case where either north or south pole is inside the query polygon\n        const polePolygon: ?CachedPolygon = projectPolygonCoveringPoles(polygon, transform);\n\n        if (polePolygon) {\n            return polePolygon;\n        }\n\n        // Resample the polygon by adding intermediate points so that straight lines of the shape\n        // are correctly projected on the surface of the globe.\n        const resampled = unwrapQueryPolygon(resamplePolygon(polygon, transform).map(p => new Point(wrap(p.x), p.y)), transform);\n\n        return {\n            polygon: resampled.polygon.map(p => new MercatorCoordinate(p.x, p.y)),\n            unwrapped: resampled.unwrapped\n        };\n    }\n}\n\n// Checks whether the provided polygon is crossing the antimeridian line and unwraps it if necessary.\n// The resulting polygon is continuous\nexport function unwrapQueryPolygon(polygon: Point[], tr: Transform): {polygon: Point[], unwrapped: boolean} {\n    let unwrapped = false;\n\n    // Traverse edges of the polygon and unwrap vertices that are crossing the antimeridian.\n    let maxX = -Infinity;\n    let startEdge = 0;\n\n    for (let e = 0; e < polygon.length - 1; e++) {\n        if (polygon[e].x > maxX) {\n            maxX = polygon[e].x;\n            startEdge = e;\n        }\n    }\n\n    for (let i = 0; i < polygon.length - 1; i++) {\n        const edge = (startEdge + i) % (polygon.length - 1);\n        const a = polygon[edge];\n        const b = polygon[edge + 1];\n\n        if (Math.abs(a.x - b.x) > 0.5) {\n            // A straight line drawn on the globe can't have longer length than 0.5 on the x-axis\n            // without crossing the antimeridian\n            if (a.x < b.x) {\n                a.x += 1;\n\n                if (edge === 0) {\n                    // First and last points are duplicate for closed polygons\n                    polygon[polygon.length - 1].x += 1;\n                }\n            } else {\n                b.x += 1;\n\n                if (edge + 1 === polygon.length - 1) {\n                    polygon[0].x += 1;\n                }\n            }\n\n            unwrapped = true;\n        }\n    }\n\n    const cameraX = mercatorXfromLng(tr.center.lng);\n    if (unwrapped && cameraX < Math.abs(cameraX - 1)) {\n        polygon.forEach(p => { p.x -= 1; });\n    }\n\n    return {\n        polygon,\n        unwrapped\n    };\n}\n\n// Special function for handling scenarios where one of the poles is inside the query polygon.\n// Finding projection of these kind of polygons is more involving as projecting just the corners will\n// produce a degenerate (self-intersecting, non-continuous, etc.) polygon in mercator coordinates\nexport function projectPolygonCoveringPoles(polygon: Point[], tr: Transform): ?CachedPolygon {\n    const matrix = mat4.multiply([], tr.pixelMatrix, tr.globeMatrix);\n\n    // Transform north and south pole coordinates to the screen to see if they're\n    // inside the query polygon\n    const northPole = [0, -GLOBE_RADIUS, 0, 1];\n    const southPole = [0, GLOBE_RADIUS, 0, 1];\n    const center = [0, 0, 0, 1];\n\n    vec4.transformMat4(northPole, northPole, matrix);\n    vec4.transformMat4(southPole, southPole, matrix);\n    vec4.transformMat4(center, center, matrix);\n\n    const screenNp = new Point(northPole[0] / northPole[3], northPole[1] / northPole[3]);\n    const screenSp = new Point(southPole[0] / southPole[3], southPole[1] / southPole[3]);\n    const containsNp = polygonContainsPoint(polygon, screenNp) && northPole[3] < center[3];\n    const containsSp = polygonContainsPoint(polygon, screenSp) && southPole[3] < center[3];\n\n    if (!containsNp && !containsSp) {\n        return null;\n    }\n\n    // Project corner points of the polygon and traverse the ring to find the edge that's\n    // crossing the zero longitude border.\n    const result = findEdgeCrossingAntimeridian(polygon, tr, containsNp ? -1 : 1);\n\n    if (!result) {\n        return null;\n    }\n\n    // Start constructing the new polygon by resampling edges until the crossing edge\n    const {idx, t} = result;\n    let partA = idx > 1 ? resamplePolygon(polygon.slice(0, idx), tr) : [];\n    let partB = idx < polygon.length ? resamplePolygon(polygon.slice(idx), tr) : [];\n\n    partA = partA.map(p => new Point(wrap(p.x), p.y));\n    partB = partB.map(p => new Point(wrap(p.x), p.y));\n\n    // Resample first section of the ring (up to the edge that crosses the 0-line)\n    const resampled = [...partA];\n\n    if (resampled.length === 0) {\n        resampled.push(partB[partB.length - 1]);\n    }\n\n    // Find location of the crossing by interpolating mercator coordinates.\n    // This will produce slightly off result as the crossing edge is not actually\n    // linear on the globe.\n    const a = resampled[resampled.length - 1];\n    const b = partB.length === 0 ? partA[0] : partB[0];\n    const intersectionY = interpolate(a.y, b.y, t);\n\n    let mid;\n\n    if (containsNp) {\n        mid = [\n            new Point(0, intersectionY),\n            new Point(0, 0),\n            new Point(1, 0),\n            new Point(1, intersectionY)\n        ];\n    } else {\n        mid = [\n            new Point(1, intersectionY),\n            new Point(1, 1),\n            new Point(0, 1),\n            new Point(0, intersectionY)\n        ];\n    }\n\n    resampled.push(...mid);\n\n    // Resample to the second section of the ring\n    if (partB.length === 0) {\n        resampled.push(partA[0]);\n    } else {\n        resampled.push(...partB);\n    }\n\n    return {\n        polygon: resampled.map(p => new MercatorCoordinate(p.x, p.y)),\n        unwrapped: false\n    };\n}\n\nfunction resamplePolygon(polygon: Point[], transform: Transform): Point[] {\n    // Choose a tolerance value for the resampling logic that produces sufficiently\n    // accurate polygons without creating too many points. The value 1 / 256 was chosen\n    // based on empirical testing\n    const tolerance = 1.0 / 256.0;\n    return resample(\n        polygon,\n        p => {\n            const mc = transform.pointCoordinate3D(p);\n            p.x = mc.x;\n            p.y = mc.y;\n        },\n        tolerance);\n}\n\nfunction wrap(mercatorX: number): number {\n    return mercatorX < 0 ? 1 + (mercatorX % 1) : mercatorX % 1;\n}\n\nfunction findEdgeCrossingAntimeridian(polygon: Point[], tr: Transform, direction: number): ?{idx: number, t: number} {\n    for (let i = 1; i < polygon.length; i++) {\n        const a = wrap(tr.pointCoordinate3D(polygon[i - 1]).x);\n        const b = wrap(tr.pointCoordinate3D(polygon[i]).x);\n\n        // direction < 0: mercator coordinate 0 will be crossed from left\n        // direction > 0: mercator coordinate 1 will be crossed from right\n        if (direction < 0) {\n            if (a < b) {\n                return {idx: i, t: -a / (b - 1 - a)};\n            }\n        } else {\n            if (b < a) {\n                return {idx: i, t: (1 - a) / (b + 1 - a)};\n            }\n        }\n    }\n\n    return null;\n}\n\n//Padding is in screen pixels and is only used as a coarse check, so 2 decimal places of precision should be good enough for a cache.\nfunction cacheKey(padding: number): number  {\n    return (padding * 100) | 0;\n}\n\nexport type TilespaceQueryGeometry = {\n    queryGeometry: QueryGeometry,\n    tilespaceGeometry: Point[],\n    tilespaceRays: Ray[],\n    bufferedTilespaceGeometry: Point[],\n    bufferedTilespaceBounds: { min: Point, max: Point},\n    tile: Tile,\n    tileID: OverscaledTileID,\n    pixelToTileUnitsFactor: number\n};\n\nfunction clampBoundsToTileExtents(bounds: {min: Point, max: Point}): {min: Point, max: Point} {\n    bounds.min.x = clamp(bounds.min.x, 0, EXTENT);\n    bounds.min.y = clamp(bounds.min.y, 0, EXTENT);\n\n    bounds.max.x = clamp(bounds.max.x, 0, EXTENT);\n    bounds.max.y = clamp(bounds.max.y, 0, EXTENT);\n    return bounds;\n}\n","// @flow\n\nimport {pick, extend} from '../util/util.js';\n\nimport {getJSON, ResourceType} from '../util/ajax.js';\nimport browser from '../util/browser.js';\n\nimport type {RequestManager} from '../util/mapbox.js';\nimport type {Callback} from '../types/callback.js';\nimport type {TileJSON} from '../types/tilejson.js';\nimport type {Cancelable} from '../types/cancelable.js';\nimport type {SourceVectorLayer, SourceRasterLayer} from './source.js';\n\ntype ExtendedTileJSON = TileJSON & {\n    vectorLayers?: Array<SourceVectorLayer>;\n    vectorLayerIds?: Array<string>;\n    rasterLayers?: Array<SourceRasterLayer>;\n    rasterLayerIds?: Array<string>;\n};\n\nexport default function(options: any, requestManager: RequestManager, language: ?string, worldview: ?string, callback: Callback<ExtendedTileJSON>): Cancelable {\n    const loaded = function(err: ?Error, tileJSON: ?TileJSON) {\n        if (err) {\n            return callback(err);\n        } else if (tileJSON) {\n            // Prefer TileJSON tiles, if both URL and tiles options are set\n            if (options.url && tileJSON.tiles && options.tiles) delete options.tiles;\n\n            const result: ExtendedTileJSON = pick(\n                // explicit source options take precedence over TileJSON\n                extend(tileJSON, options),\n                ['tiles', 'minzoom', 'maxzoom', 'attribution', 'mapbox_logo', 'bounds', 'scheme', 'tileSize', 'encoding']\n            );\n\n            if (tileJSON.vector_layers) {\n                result.vectorLayers = tileJSON.vector_layers;\n                result.vectorLayerIds = result.vectorLayers.map((layer) => { return layer.id; });\n            }\n\n            if (tileJSON.raster_layers) {\n                result.rasterLayers = tileJSON.raster_layers;\n                result.rasterLayerIds = result.rasterLayers.map((layer) => { return layer.id; });\n            }\n\n            result.tiles = requestManager.canonicalizeTileset(result, options.url);\n            callback(null, result);\n        }\n    };\n\n    if (options.url) {\n        return getJSON(requestManager.transformRequest(requestManager.normalizeSourceURL(options.url, null, language, worldview), ResourceType.Source), loaded);\n    } else {\n        return browser.frame(() => loaded(null, options));\n    }\n}\n","// @flow\n\nimport {LngLatBounds} from '../geo/lng_lat.js';\nimport {mercatorXfromLng, mercatorYfromLat} from '../geo/mercator_coordinate.js';\n\nimport type {CanonicalTileID} from './tile_id.js';\n\nclass TileBounds {\n    bounds: LngLatBounds;\n    minzoom: number;\n    maxzoom: number;\n\n    constructor(bounds: [number, number, number, number], minzoom: ?number, maxzoom: ?number) {\n        this.bounds = LngLatBounds.convert(this.validateBounds(bounds));\n        this.minzoom = minzoom || 0;\n        this.maxzoom = maxzoom || 24;\n    }\n\n    validateBounds(bounds: [number, number, number, number]): [number, number, number, number] {\n        // make sure the bounds property contains valid longitude and latitudes\n        if (!Array.isArray(bounds) || bounds.length !== 4) return [-180, -90, 180, 90];\n        return [Math.max(-180, bounds[0]), Math.max(-90, bounds[1]), Math.min(180, bounds[2]), Math.min(90, bounds[3])];\n    }\n\n    contains(tileID: CanonicalTileID): boolean {\n        const worldSize = Math.pow(2, tileID.z);\n        const level = {\n            minX: Math.floor(mercatorXfromLng(this.bounds.getWest()) * worldSize),\n            minY: Math.floor(mercatorYfromLat(this.bounds.getNorth()) * worldSize),\n            maxX: Math.ceil(mercatorXfromLng(this.bounds.getEast()) * worldSize),\n            maxY: Math.ceil(mercatorYfromLat(this.bounds.getSouth()) * worldSize)\n        };\n        const hit = tileID.x >= level.minX && tileID.x < level.maxX && tileID.y >= level.minY && tileID.y < level.maxY;\n        return hit;\n    }\n}\n\nexport default TileBounds;\n","// @flow\n\nimport {Event, ErrorEvent, Evented} from '../util/evented.js';\n\nimport {extend, pick} from '../util/util.js';\nimport loadTileJSON from './load_tilejson.js';\nimport {postTurnstileEvent} from '../util/mapbox.js';\nimport TileBounds from './tile_bounds.js';\nimport {ResourceType} from '../util/ajax.js';\nimport browser from '../util/browser.js';\nimport {cacheEntryPossiblyAdded} from '../util/tile_request_cache.js';\nimport {DedupedRequest, loadVectorTile} from './load_vector_tile.js';\nimport {makeFQID} from '../util/fqid.js';\n\nimport type {Source} from './source.js';\nimport type {OverscaledTileID} from './tile_id.js';\nimport type {Map} from '../ui/map.js';\nimport type Dispatcher from '../util/dispatcher.js';\nimport type Tile from './tile.js';\nimport type {Callback} from '../types/callback.js';\nimport type {Cancelable} from '../types/cancelable.js';\nimport type {VectorSourceSpecification, PromoteIdSpecification} from '../style-spec/types.js';\nimport type Actor from '../util/actor.js';\nimport type {LoadVectorTileResult} from './load_vector_tile.js';\nimport type {WorkerTileResult} from './worker_source.js';\n\n/**\n * A source containing vector tiles in [Mapbox Vector Tile format](https://docs.mapbox.com/vector-tiles/reference/).\n * See the [Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/#vector) for detailed documentation of options.\n *\n * @example\n * map.addSource('some id', {\n *     type: 'vector',\n *     url: 'mapbox://mapbox.mapbox-streets-v8'\n * });\n *\n * @example\n * map.addSource('some id', {\n *     type: 'vector',\n *     tiles: ['https://d25uarhxywzl1j.cloudfront.net/v0.1/{z}/{x}/{y}.mvt'],\n *     minzoom: 6,\n *     maxzoom: 14\n * });\n *\n * @example\n * map.getSource('some id').setUrl(\"mapbox://mapbox.mapbox-streets-v8\");\n *\n * @example\n * map.getSource('some id').setTiles(['https://d25uarhxywzl1j.cloudfront.net/v0.1/{z}/{x}/{y}.mvt']);\n * @see [Example: Add a vector tile source](https://docs.mapbox.com/mapbox-gl-js/example/vector-source/)\n * @see [Example: Add a third party vector tile source](https://docs.mapbox.com/mapbox-gl-js/example/third-party/)\n */\nclass VectorTileSource extends Evented implements Source {\n    type: 'vector';\n    id: string;\n    scope: string;\n    minzoom: number;\n    maxzoom: number;\n    url: string;\n    scheme: string;\n    tileSize: number;\n    promoteId: ?PromoteIdSpecification;\n\n    _options: VectorSourceSpecification;\n    _collectResourceTiming: boolean;\n    dispatcher: Dispatcher;\n    map: Map;\n    bounds: ?[number, number, number, number];\n    tiles: Array<string>;\n    tileBounds: TileBounds;\n    reparseOverscaled: boolean | void;\n    isTileClipped: boolean | void;\n    _tileJSONRequest: ?Cancelable;\n    _loaded: boolean;\n    _tileWorkers: {[string]: Actor};\n    _deduped: DedupedRequest;\n\n    constructor(id: string, options: VectorSourceSpecification & {collectResourceTiming: boolean}, dispatcher: Dispatcher, eventedParent: Evented) {\n        super();\n        this.id = id;\n        this.dispatcher = dispatcher;\n\n        this.type = 'vector';\n        this.minzoom = 0;\n        this.maxzoom = 22;\n        this.scheme = 'xyz';\n        this.tileSize = 512;\n        this.reparseOverscaled = true;\n        this.isTileClipped = true;\n        this._loaded = false;\n\n        extend(this, pick(options, ['url', 'scheme', 'tileSize', 'promoteId']));\n        this._options = extend({type: 'vector'}, options);\n\n        this._collectResourceTiming = !!options.collectResourceTiming;\n\n        if (this.tileSize !== 512) {\n            throw new Error('vector tile sources must have a tileSize of 512');\n        }\n\n        this.setEventedParent(eventedParent);\n\n        this._tileWorkers = {};\n        this._deduped = new DedupedRequest();\n    }\n\n    load(callback?: Callback<void>) {\n        this._loaded = false;\n        this.fire(new Event('dataloading', {dataType: 'source'}));\n        const language = Array.isArray(this.map._language) ? this.map._language.join() : this.map._language;\n        const worldview = this.map._worldview;\n        this._tileJSONRequest = loadTileJSON(this._options, this.map._requestManager, language, worldview, (err, tileJSON) => {\n            this._tileJSONRequest = null;\n            this._loaded = true;\n            if (err) {\n                if (language) console.warn(`Ensure that your requested language string is a valid BCP-47 code or list of codes. Found: ${language}`);\n                if (worldview && worldview.length !== 2) console.warn(`Requested worldview strings must be a valid ISO alpha-2 code. Found: ${worldview}`);\n\n                this.fire(new ErrorEvent(err));\n            } else if (tileJSON) {\n                extend(this, tileJSON);\n                if (tileJSON.bounds) this.tileBounds = new TileBounds(tileJSON.bounds, this.minzoom, this.maxzoom);\n                postTurnstileEvent(tileJSON.tiles, this.map._requestManager._customAccessToken);\n\n                // `content` is included here to prevent a race condition where `Style#updateSources` is called\n                // before the TileJSON arrives. this makes sure the tiles needed are loaded once TileJSON arrives\n                // ref: https://github.com/mapbox/mapbox-gl-js/pull/4347#discussion_r104418088\n                this.fire(new Event('data', {dataType: 'source', sourceDataType: 'metadata'}));\n                this.fire(new Event('data', {dataType: 'source', sourceDataType: 'content'}));\n            }\n\n            if (callback) callback(err);\n        });\n    }\n\n    loaded(): boolean {\n        return this._loaded;\n    }\n\n    // $FlowFixMe[method-unbinding]\n    hasTile(tileID: OverscaledTileID): boolean {\n        return !this.tileBounds || this.tileBounds.contains(tileID.canonical);\n    }\n\n    // $FlowFixMe[method-unbinding]\n    onAdd(map: Map) {\n        this.map = map;\n        this.load();\n    }\n\n    /**\n     * Reloads the source data and re-renders the map.\n     *\n     * @example\n     * map.getSource('source-id').reload();\n     */\n    // $FlowFixMe[method-unbinding]\n    reload() {\n        this.cancelTileJSONRequest();\n        const fqid = makeFQID(this.id, this.scope);\n        this.load(() => this.map.style.clearSource(fqid));\n    }\n\n    /**\n     * Sets the source `tiles` property and re-renders the map.\n     *\n     * @param {string[]} tiles An array of one or more tile source URLs, as in the TileJSON spec.\n     * @returns {VectorTileSource} Returns itself to allow for method chaining.\n     * @example\n     * map.addSource('source-id', {\n     *     type: 'vector',\n     *     tiles: ['https://some_end_point.net/{z}/{x}/{y}.mvt'],\n     *     minzoom: 6,\n     *     maxzoom: 14\n     * });\n     *\n     * // Set the endpoint associated with a vector tile source.\n     * map.getSource('source-id').setTiles(['https://another_end_point.net/{z}/{x}/{y}.mvt']);\n     */\n    setTiles(tiles: Array<string>): this {\n        this._options.tiles = tiles;\n        this.reload();\n\n        return this;\n    }\n\n    /**\n     * Sets the source `url` property and re-renders the map.\n     *\n     * @param {string} url A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<Tileset ID>`.\n     * @returns {VectorTileSource} Returns itself to allow for method chaining.\n     * @example\n     * map.addSource('source-id', {\n     *     type: 'vector',\n     *     url: 'mapbox://mapbox.mapbox-streets-v7'\n     * });\n     *\n     * // Update vector tile source to a new URL endpoint\n     * map.getSource('source-id').setUrl(\"mapbox://mapbox.mapbox-streets-v8\");\n     */\n    setUrl(url: string): this {\n        this.url = url;\n        this._options.url = url;\n        this.reload();\n\n        return this;\n    }\n\n    // $FlowFixMe[method-unbinding]\n    onRemove() {\n        this.cancelTileJSONRequest();\n    }\n\n    serialize(): VectorSourceSpecification {\n        return extend({}, this._options);\n    }\n\n    loadTile(tile: Tile, callback: Callback<void>) {\n        const url = this.map._requestManager.normalizeTileURL(tile.tileID.canonical.url(this.tiles, this.scheme));\n        const request = this.map._requestManager.transformRequest(url, ResourceType.Tile);\n\n        const params = {\n            request,\n            data: undefined,\n            uid: tile.uid,\n            tileID: tile.tileID,\n            tileZoom: tile.tileZoom,\n            zoom: tile.tileID.overscaledZ,\n            tileSize: this.tileSize * tile.tileID.overscaleFactor(),\n            type: this.type,\n            source: this.id,\n            scope: this.scope,\n            pixelRatio: browser.devicePixelRatio,\n            showCollisionBoxes: this.map.showCollisionBoxes,\n            promoteId: this.promoteId,\n            isSymbolTile: tile.isSymbolTile,\n            brightness: this.map.style ? (this.map.style.getBrightness() || 0.0) : 0.0,\n            extraShadowCaster: tile.isExtraShadowCaster\n        };\n        params.request.collectResourceTiming = this._collectResourceTiming;\n\n        if (!tile.actor || tile.state === 'expired') {\n            tile.actor = this._tileWorkers[url] = this._tileWorkers[url] || this.dispatcher.getActor();\n\n            // if workers are not ready to receive messages yet, use the idle time to preemptively\n            // load tiles on the main thread and pass the result instead of requesting a worker to do so\n            if (!this.dispatcher.ready) {\n                const cancel = loadVectorTile.call({deduped: this._deduped}, params, (err: ?Error, data: ?LoadVectorTileResult) => {\n                    if (err || !data) {\n                        done.call(this, err);\n                    } else {\n                        // the worker will skip the network request if the data is already there\n                        params.data = {\n                            cacheControl: data.cacheControl,\n                            expires: data.expires,\n                            rawData: data.rawData.slice(0)\n                        };\n                        if (tile.actor) tile.actor.send('loadTile', params, done.bind(this), undefined, true);\n                    }\n                }, true);\n                tile.request = {cancel};\n\n            } else {\n                tile.request = tile.actor.send('loadTile', params, done.bind(this), undefined, true);\n            }\n\n        } else if (tile.state === 'loading') {\n            // schedule tile reloading after it has been loaded\n            tile.reloadCallback = callback;\n\n        } else {\n            tile.request = tile.actor.send('reloadTile', params, done.bind(this));\n        }\n\n        // $FlowFixMe[missing-this-annot]\n        function done(err: ?Error, data: ?WorkerTileResult) {\n            delete tile.request;\n\n            if (tile.aborted)\n                return callback(null);\n\n            // $FlowFixMe[prop-missing] - generic Error type doesn't have status\n            if (err && err.status !== 404) {\n                return callback(err);\n            }\n\n            if (data && data.resourceTiming)\n                tile.resourceTiming = data.resourceTiming;\n\n            if (this.map._refreshExpiredTiles && data) tile.setExpiryData(data);\n            tile.loadVectorData(data, this.map.painter);\n\n            cacheEntryPossiblyAdded(this.dispatcher);\n\n            callback(null);\n\n            if (tile.reloadCallback) {\n                this.loadTile(tile, tile.reloadCallback);\n                tile.reloadCallback = null;\n            }\n        }\n    }\n\n    // $FlowFixMe[method-unbinding]\n    abortTile(tile: Tile) {\n        if (tile.request) {\n            tile.request.cancel();\n            delete tile.request;\n        }\n        if (tile.actor) {\n            tile.actor.send('abortTile', {uid: tile.uid, type: this.type, source: this.id, scope: this.scope});\n        }\n    }\n\n    // $FlowFixMe[method-unbinding]\n    unloadTile(tile: Tile) {\n        if (tile.actor) {\n            tile.actor.send('removeTile', {uid: tile.uid, type: this.type, source: this.id, scope: this.scope});\n        }\n        tile.destroy();\n    }\n\n    hasTransition(): boolean {\n        return false;\n    }\n\n    // $FlowFixMe[method-unbinding]\n    afterUpdate() {\n        this._tileWorkers = {};\n    }\n\n    cancelTileJSONRequest() {\n        if (!this._tileJSONRequest) return;\n        this._tileJSONRequest.cancel();\n        this._tileJSONRequest = null;\n    }\n}\n\nexport default VectorTileSource;\n","// @flow\n\nimport {extend, pick} from '../util/util.js';\n\nimport {getImage, ResourceType} from '../util/ajax.js';\nimport {Event, ErrorEvent, Evented} from '../util/evented.js';\nimport loadTileJSON from './load_tilejson.js';\nimport {postTurnstileEvent} from '../util/mapbox.js';\nimport TileBounds from './tile_bounds.js';\nimport browser from '../util/browser.js';\nimport {cacheEntryPossiblyAdded} from '../util/tile_request_cache.js';\nimport {makeFQID} from '../util/fqid.js';\n\nimport type {Source} from './source.js';\nimport type {OverscaledTileID} from './tile_id.js';\nimport type {Map} from '../ui/map.js';\nimport type Dispatcher from '../util/dispatcher.js';\nimport type Tile from './tile.js';\nimport type {Callback} from '../types/callback.js';\nimport type {Cancelable} from '../types/cancelable.js';\nimport type {\n    RasterSourceSpecification,\n    RasterDEMSourceSpecification,\n    RasterArraySourceSpecification\n} from '../style-spec/types.js';\nimport Texture from '../render/texture.js';\n\n/**\n * A source containing raster tiles.\n * See the [Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/#raster) for detailed documentation of options.\n *\n * @example\n * map.addSource('some id', {\n *     type: 'raster',\n *     url: 'mapbox://mapbox.satellite',\n *     tileSize: 256\n * });\n *\n * @example\n * map.addSource('some id', {\n *     type: 'raster',\n *     tiles: ['https://img.nj.gov/imagerywms/Natural2015?bbox={bbox-epsg-3857}&format=image/png&service=WMS&version=1.1.1&request=GetMap&srs=EPSG:3857&transparent=true&width=256&height=256&layers=Natural2015'],\n *     tileSize: 256\n * });\n *\n * @see [Example: Add a raster tile source](https://docs.mapbox.com/mapbox-gl-js/example/map-tiles/)\n * @see [Example: Add a WMS source](https://docs.mapbox.com/mapbox-gl-js/example/wms/)\n */\nclass RasterTileSource extends Evented implements Source {\n    type: 'raster' | 'raster-dem' | 'raster-array';\n    id: string;\n    scope: string;\n    minzoom: number;\n    maxzoom: number;\n    url: string;\n    scheme: string;\n    tileSize: number;\n\n    bounds: ?[number, number, number, number];\n    tileBounds: TileBounds;\n    roundZoom: boolean | void;\n    dispatcher: Dispatcher;\n    map: Map;\n    tiles: Array<string>;\n\n    _loaded: boolean;\n    _options: RasterSourceSpecification | RasterDEMSourceSpecification | RasterArraySourceSpecification;\n    _tileJSONRequest: ?Cancelable;\n\n    constructor(id: string, options: RasterSourceSpecification | RasterDEMSourceSpecification | RasterArraySourceSpecification, dispatcher: Dispatcher, eventedParent: Evented) {\n        super();\n        this.id = id;\n        this.dispatcher = dispatcher;\n        this.setEventedParent(eventedParent);\n\n        this.type = 'raster';\n        this.minzoom = 0;\n        this.maxzoom = 22;\n        this.roundZoom = true;\n        this.scheme = 'xyz';\n        this.tileSize = 512;\n        this._loaded = false;\n\n        this._options = extend({type: 'raster'}, options);\n        extend(this, pick(options, ['url', 'scheme', 'tileSize']));\n    }\n\n    load(callback?: Callback<void>) {\n        this._loaded = false;\n        this.fire(new Event('dataloading', {dataType: 'source'}));\n        this._tileJSONRequest = loadTileJSON(this._options, this.map._requestManager, null, null, (err, tileJSON) => {\n            this._tileJSONRequest = null;\n            this._loaded = true;\n            if (err) {\n                this.fire(new ErrorEvent(err));\n            } else if (tileJSON) {\n                extend(this, tileJSON);\n                if (tileJSON.bounds) this.tileBounds = new TileBounds(tileJSON.bounds, this.minzoom, this.maxzoom);\n\n                postTurnstileEvent(tileJSON.tiles);\n\n                // `content` is included here to prevent a race condition where `Style#updateSources` is called\n                // before the TileJSON arrives. this makes sure the tiles needed are loaded once TileJSON arrives\n                // ref: https://github.com/mapbox/mapbox-gl-js/pull/4347#discussion_r104418088\n                this.fire(new Event('data', {dataType: 'source', sourceDataType: 'metadata'}));\n                this.fire(new Event('data', {dataType: 'source', sourceDataType: 'content'}));\n            }\n\n            if (callback) callback(err);\n        });\n    }\n\n    loaded(): boolean {\n        return this._loaded;\n    }\n\n    // $FlowFixMe[method-unbinding]\n    onAdd(map: Map) {\n        this.map = map;\n        this.load();\n    }\n\n    /**\n     * Reloads the source data and re-renders the map.\n     *\n     * @example\n     * map.getSource('source-id').reload();\n     */\n    // $FlowFixMe[method-unbinding]\n    reload() {\n        this.cancelTileJSONRequest();\n        const fqid = makeFQID(this.id, this.scope);\n        this.load(() => this.map.style.clearSource(fqid));\n    }\n\n    /**\n     * Sets the source `tiles` property and re-renders the map.\n     *\n     * @param {string[]} tiles An array of one or more tile source URLs, as in the TileJSON spec.\n     * @returns {RasterTileSource} Returns itself to allow for method chaining.\n     * @example\n     * map.addSource('source-id', {\n     *     type: 'raster',\n     *     tiles: ['https://some_end_point.net/{z}/{x}/{y}.png'],\n     *     tileSize: 256\n     * });\n     *\n     * // Set the endpoint associated with a raster tile source.\n     * map.getSource('source-id').setTiles(['https://another_end_point.net/{z}/{x}/{y}.png']);\n     */\n    setTiles(tiles: Array<string>): this {\n        this._options.tiles = tiles;\n        this.reload();\n\n        return this;\n    }\n\n    /**\n     * Sets the source `url` property and re-renders the map.\n     *\n     * @param {string} url A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<Tileset ID>`.\n     * @returns {RasterTileSource} Returns itself to allow for method chaining.\n     * @example\n     * map.addSource('source-id', {\n     *     type: 'raster',\n     *     url: 'mapbox://mapbox.satellite'\n     * });\n     *\n     * // Update raster tile source to a new URL endpoint\n     * map.getSource('source-id').setUrl('mapbox://mapbox.satellite');\n     */\n    setUrl(url: string): this {\n        this.url = url;\n        this._options.url = url;\n        this.reload();\n\n        return this;\n    }\n\n    // $FlowFixMe[method-unbinding]\n    onRemove() {\n        this.cancelTileJSONRequest();\n    }\n\n    serialize(): RasterSourceSpecification | RasterDEMSourceSpecification {\n        return extend({}, this._options);\n    }\n\n    // $FlowFixMe[method-unbinding]\n    hasTile(tileID: OverscaledTileID): boolean {\n        return !this.tileBounds || this.tileBounds.contains(tileID.canonical);\n    }\n\n    loadTile(tile: Tile, callback: Callback<void>) {\n        const use2x = browser.devicePixelRatio >= 2;\n        const url = this.map._requestManager.normalizeTileURL(tile.tileID.canonical.url(this.tiles, this.scheme), use2x, this.tileSize);\n        tile.request = getImage(this.map._requestManager.transformRequest(url, ResourceType.Tile), (error, data, cacheControl, expires) => {\n            delete tile.request;\n\n            if (tile.aborted) {\n                tile.state = 'unloaded';\n                return callback(null);\n            }\n\n            if (error) {\n                tile.state = 'errored';\n                return callback(error);\n            }\n\n            if (!data) return callback(null);\n\n            if (this.map._refreshExpiredTiles) tile.setExpiryData({cacheControl, expires});\n            tile.setTexture(data, this.map.painter);\n            tile.state = 'loaded';\n\n            cacheEntryPossiblyAdded(this.dispatcher);\n            callback(null);\n        });\n    }\n\n    // $FlowFixMe[method-unbinding]\n    abortTile(tile: Tile, callback: Callback<void>) {\n        if (tile.request) {\n            tile.request.cancel();\n            delete tile.request;\n        }\n        callback();\n    }\n\n    // $FlowFixMe[method-unbinding]\n    unloadTile(tile: Tile, callback: Callback<void>) {\n        // Cache the tile texture to avoid re-allocating Textures if they'll just be reloaded\n        if (tile.texture && tile.texture instanceof Texture) {\n            // Clean everything else up owned by the tile, but preserve the texture.\n            // Destroy first to prevent racing with the texture cache being popped.\n            tile.destroy(true);\n\n            // Save the texture to the cache\n            if (tile.texture && tile.texture instanceof Texture) {\n                this.map.painter.saveTileTexture(tile.texture);\n            }\n        } else {\n            tile.destroy();\n        }\n\n        callback();\n    }\n\n    hasTransition(): boolean {\n        return false;\n    }\n\n    cancelTileJSONRequest() {\n        if (!this._tileJSONRequest) return;\n        this._tileJSONRequest.cancel();\n        this._tileJSONRequest = null;\n    }\n}\n\nexport default RasterTileSource;\n","// @flow\n\nimport Texture from '../render/texture.js';\nimport RasterTileSource from './raster_tile_source.js';\nimport {extend} from '../util/util.js';\nimport {ResourceType} from '../util/ajax.js';\nimport {Evented, ErrorEvent} from '../util/evented.js';\nimport RasterStyleLayer from '../style/style_layer/raster_style_layer.js';\nimport RasterParticleStyleLayer from '../style/style_layer/raster_particle_style_layer.js';\n\n// Import MRTData as a module with side effects to ensure\n// it's registered as a serializable class on the main thread\nimport '../data/mrt_data.js';\n\nimport type {Map} from '../ui/map.js';\nimport type Dispatcher from '../util/dispatcher.js';\nimport type RasterArrayTile from './raster_array_tile.js';\nimport type {Callback} from '../types/callback.js';\nimport type {TextureDescriptor} from './raster_array_tile.js';\nimport type {Source, SourceRasterLayer} from './source.js';\nimport type {RasterArraySourceSpecification} from '../style-spec/types.js';\n\n// $FlowFixMe[method-unbinding]\nclass RasterArrayTileSource extends RasterTileSource implements Source {\n    map: Map;\n    rasterLayers: Array<SourceRasterLayer> | void;\n    rasterLayerIds: Array<string> | void;\n\n    constructor(id: string, options: RasterArraySourceSpecification, dispatcher: Dispatcher, eventedParent: Evented) {\n        super(id, options, dispatcher, eventedParent);\n        this.type = 'raster-array';\n        this.maxzoom = 22;\n        this._options = extend({type: 'raster-array'}, options);\n    }\n\n    triggerRepaint(tile: RasterArrayTile) {\n        const terrain = this.map.painter._terrain;\n        const sourceCache = this.map.style.getSourceCache(this.id);\n        if (terrain && terrain.enabled && sourceCache) {\n            terrain._clearRenderCacheForTile(sourceCache.id, tile.tileID);\n        }\n\n        // eslint-disable-next-line no-warning-comments\n        // TODO: trigger repaint only if all tiles have the requested band\n        this.map.triggerRepaint();\n    }\n\n    // $FlowFixMe[incompatible-type]\n    // $FlowFixMe[incompatible-extend]\n    loadTile(tile: RasterArrayTile, callback: Callback<void>) {\n        const url = this.map._requestManager.normalizeTileURL(tile.tileID.canonical.url(this.tiles, this.scheme), false, this.tileSize);\n        const requestParams = this.map._requestManager.transformRequest(url, ResourceType.Tile);\n\n        tile.requestParams = requestParams;\n        if (!tile.actor) tile.actor = this.dispatcher.getActor();\n\n        tile.request = tile.fetchHeader(undefined, (error: ?Error, dataBuffer: ?ArrayBuffer, cacheControl: ?string, expires: ?string) => {\n            delete tile.request;\n\n            if (tile.aborted) {\n                tile.state = 'unloaded';\n                return callback(null);\n            }\n\n            if (error) {\n                // silence AbortError\n                // $FlowFixMe[prop-missing]\n                if (error.code === 20) return;\n                tile.state = 'errored';\n                return callback(error);\n            }\n\n            if (this.map._refreshExpiredTiles) tile.setExpiryData({cacheControl, expires});\n\n            tile.state = 'empty';\n            callback(null);\n        });\n    }\n\n    // $FlowFixMe[method-unbinding]\n    // $FlowFixMe[incompatible-type]\n    // $FlowFixMe[incompatible-extend]\n    unloadTile(tile: RasterArrayTile) {\n        const texture = tile.texture;\n        if (texture && texture instanceof Texture) {\n            // Clean everything else up owned by the tile, but preserve the texture.\n            // Destroy first to prevent racing with the texture cache being popped.\n            tile.destroy(true);\n\n            // Save the texture to the cache\n            this.map.painter.saveTileTexture(texture);\n        } else {\n            tile.destroy();\n\n            tile.flushQueues();\n            tile._isHeaderLoaded = false;\n\n            delete tile._mrt;\n            delete tile.textureDescriptor;\n        }\n\n        if (tile.fbo) {\n            tile.fbo.destroy();\n            delete tile.fbo;\n        }\n\n        delete tile.request;\n        delete tile.requestParams;\n\n        delete tile.neighboringTiles;\n        tile.state = 'unloaded';\n    }\n\n    /**\n     * Prepare RasterArrayTile for the rendering. If tile doesn't have data\n     * for the requested band, fetch and repaint once it's acquired.\n     * @private\n     */\n    prepareTile(tile: RasterArrayTile, sourceLayer: string, band: string | number) {\n        // Skip if tile is not yet loaded or if no update is needed\n        if (!tile._isHeaderLoaded) return;\n\n        // Don't mark tile as reloading if it was empty.\n        if (tile.state !== 'empty') tile.state = 'reloading';\n\n        // Fetch data for band and then repaint once data is acquired.\n        tile.fetchBand(sourceLayer, band, (error, data) => {\n            if (error) {\n                tile.state = 'errored';\n                this.fire(new ErrorEvent(error));\n                this.triggerRepaint(tile);\n                return;\n            }\n\n            if (data) {\n                tile.setTexture(data, this.map.painter);\n                tile.state = 'loaded';\n                this.triggerRepaint(tile);\n            }\n        });\n    }\n\n    /**\n     * Get the initial band for a source layer.\n     * @private\n     */\n    getInitialBand(sourceLayer: string): string | number | void {\n        if (!this.rasterLayers) return 0;\n        const rasterLayer = this.rasterLayers.find(({id}) => id === sourceLayer);\n        const fields = rasterLayer && rasterLayer.fields;\n        const bands = fields && fields.bands && fields.bands;\n        return bands ? bands[0] : 0;\n    }\n\n    /**\n     * Get a texture descriptor for a source layer and a band.\n     * @private\n     * @param {RasterArrayTile} tile\n     * @param {RasterStyleLayer} layer\n     * @param {boolean} fallbackToPrevious If true, return previous texture even if update is needed\n     * @returns {TextureDescriptor} Texture descriptor with texture if available\n     */\n    getTextureDescriptor(tile: RasterArrayTile, layer: RasterStyleLayer | RasterParticleStyleLayer, fallbackToPrevious: boolean): TextureDescriptor & {texture: ?Texture} | void {\n        if (!tile) return;\n\n        const sourceLayer = layer.sourceLayer || (this.rasterLayerIds && this.rasterLayerIds[0]);\n        if (!sourceLayer) return;\n\n        let layerBand = null;\n        if (layer instanceof RasterStyleLayer) {\n            layerBand = layer.paint.get('raster-array-band');\n        } else if (layer instanceof RasterParticleStyleLayer) {\n            layerBand = layer.paint.get('raster-particle-array-band');\n        }\n        const band = layerBand || this.getInitialBand(sourceLayer);\n        if (band == null) return;\n\n        if (!tile.textureDescriptor) {\n            this.prepareTile(tile, sourceLayer, band);\n            return;\n        }\n\n        // Fallback to previous texture even if update is needed\n        if (tile.updateNeeded(sourceLayer, band) && !fallbackToPrevious) return;\n\n        return Object.assign({}, tile.textureDescriptor, {texture: tile.texture});\n    }\n}\n\nexport default RasterArrayTileSource;\n","// @flow\n// logic for generating non-Mercator adaptive raster tile reprojection meshes with MARTINI\n\nimport tileTransform from '../geo/projection/tile_transform.js';\nimport EXTENT from '../style-spec/data/extent.js';\nimport {lngFromMercatorX, latFromMercatorY} from '../geo/mercator_coordinate.js';\nimport {TileBoundsArray, TriangleIndexArray} from '../data/array_types.js';\n\nimport type {CanonicalTileID} from './tile_id.js';\nimport type Projection from '../geo/projection/projection.js';\n\nconst meshSize = 32;\nconst gridSize = meshSize + 1;\n\nconst numTriangles = meshSize * meshSize * 2 - 2;\nconst numParentTriangles = numTriangles - meshSize * meshSize;\n\nconst coords = new Uint16Array(numTriangles * 4);\n\n// precalculate RTIN triangle coordinates\nfor (let i = 0; i < numTriangles; i++) {\n    let id = i + 2;\n    let ax = 0, ay = 0, bx = 0, by = 0, cx = 0, cy = 0;\n\n    if (id & 1) {\n        bx = by = cx = meshSize; // bottom-left triangle\n\n    } else {\n        ax = ay = cy = meshSize; // top-right triangle\n    }\n\n    while ((id >>= 1) > 1) {\n        const mx = (ax + bx) >> 1;\n        const my = (ay + by) >> 1;\n\n        if (id & 1) { // left half\n            bx = ax; by = ay;\n            ax = cx; ay = cy;\n\n        } else { // right half\n            ax = bx; ay = by;\n            bx = cx; by = cy;\n        }\n\n        cx = mx; cy = my;\n    }\n\n    const k = i * 4;\n    coords[k + 0] = ax;\n    coords[k + 1] = ay;\n    coords[k + 2] = bx;\n    coords[k + 3] = by;\n}\n\n// temporary arrays we'll reuse for MARTINI mesh code\nconst reprojectedCoords = new Uint16Array(gridSize * gridSize * 2);\nconst used = new Uint8Array(gridSize * gridSize);\nconst indexMap = new Uint16Array(gridSize * gridSize);\n\ntype TileMesh = {\n    vertices: TileBoundsArray,\n    indices: TriangleIndexArray\n};\n\n// There can be visible seams between neighbouring tiles because of precision issues\n// and resampling differences. Adding a bit of padding around the edges of tiles hides\n// most of these issues.\nconst commonRasterTileSize = 256;\nconst paddingSize = meshSize / commonRasterTileSize / 4;\nfunction seamPadding(n: number) {\n    if (n === 0) return -paddingSize;\n    else if (n === gridSize - 1) return paddingSize;\n    else return 0;\n}\n\nexport default function getTileMesh(canonical: CanonicalTileID, projection: Projection): TileMesh {\n    const cs = tileTransform(canonical, projection);\n    const z2 = Math.pow(2, canonical.z);\n\n    for (let y = 0; y < gridSize; y++) {\n        for (let x = 0; x < gridSize; x++) {\n            const lng = lngFromMercatorX((canonical.x + (x + seamPadding(x)) / meshSize) / z2);\n            const lat = latFromMercatorY((canonical.y + (y + seamPadding(y)) / meshSize) / z2);\n            const p = projection.project(lng, lat);\n            const k = y * gridSize + x;\n            reprojectedCoords[2 * k + 0] = Math.round((p.x * cs.scale - cs.x) * EXTENT);\n            reprojectedCoords[2 * k + 1] = Math.round((p.y * cs.scale - cs.y) * EXTENT);\n        }\n    }\n\n    used.fill(0);\n    indexMap.fill(0);\n\n    // iterate over all possible triangles, starting from the smallest level\n    for (let i = numTriangles - 1; i >= 0; i--) {\n        const k = i * 4;\n        const ax = coords[k + 0];\n        const ay = coords[k + 1];\n        const bx = coords[k + 2];\n        const by = coords[k + 3];\n        const mx = (ax + bx) >> 1;\n        const my = (ay + by) >> 1;\n        const cx = mx + my - ay;\n        const cy = my + ax - mx;\n\n        const aIndex = ay * gridSize + ax;\n        const bIndex = by * gridSize + bx;\n        const mIndex = my * gridSize + mx;\n\n        // calculate error in the middle of the long edge of the triangle\n        const rax = reprojectedCoords[2 * aIndex + 0];\n        const ray = reprojectedCoords[2 * aIndex + 1];\n        const rbx = reprojectedCoords[2 * bIndex + 0];\n        const rby = reprojectedCoords[2 * bIndex + 1];\n        const rmx = reprojectedCoords[2 * mIndex + 0];\n        const rmy = reprojectedCoords[2 * mIndex + 1];\n\n        // raster tiles are typically 512px, and we use 1px as an error threshold; 8192 / 512 = 16\n        const isUsed = Math.hypot((rax + rbx) / 2 - rmx, (ray + rby) / 2 - rmy) >= 16;\n\n        used[mIndex] = used[mIndex] || (isUsed ? 1 : 0);\n\n        if (i < numParentTriangles) { // bigger triangles; accumulate error with children\n            const leftChildIndex = ((ay + cy) >> 1) * gridSize + ((ax + cx) >> 1);\n            const rightChildIndex = ((by + cy) >> 1) * gridSize + ((bx + cx) >> 1);\n            used[mIndex] = used[mIndex] || used[leftChildIndex] || used[rightChildIndex];\n        }\n    }\n\n    const vertices = new TileBoundsArray();\n    const indices = new TriangleIndexArray();\n\n    let numVertices = 0;\n\n    function addVertex(x: number, y: number) {\n        const k = y * gridSize + x;\n\n        if (indexMap[k] === 0) {\n            vertices.emplaceBack(\n                reprojectedCoords[2 * k + 0],\n                reprojectedCoords[2 * k + 1],\n                x * EXTENT / meshSize,\n                y * EXTENT / meshSize);\n\n            // save new vertex index so that we can reuse it\n            indexMap[k] = ++numVertices;\n        }\n\n        return indexMap[k] - 1;\n    }\n\n    function addTriangles(ax: number, ay: number, bx: number, by: number, cx: number, cy: number) {\n        const mx = (ax + bx) >> 1;\n        const my = (ay + by) >> 1;\n\n        if (Math.abs(ax - cx) + Math.abs(ay - cy) > 1 && used[my * gridSize + mx]) {\n            // triangle doesn't approximate the surface well enough; drill down further\n            addTriangles(cx, cy, ax, ay, mx, my);\n            addTriangles(bx, by, cx, cy, mx, my);\n\n        } else {\n            const ai = addVertex(ax, ay);\n            const bi = addVertex(bx, by);\n            const ci = addVertex(cx, cy);\n            indices.emplaceBack(ai, bi, ci);\n        }\n    }\n\n    addTriangles(0, 0, meshSize, meshSize, meshSize, 0);\n    addTriangles(meshSize, meshSize, 0, 0, 0, meshSize);\n\n    return {vertices, indices};\n}\n","// @flow\nimport assert from 'assert';\n\nimport type {StructArray} from '../util/struct_array.js';\nimport type {TriangleIndexArray, LineIndexArray, LineStripIndexArray} from '../data/index_array_type.js';\nimport type Context from '../gl/context.js';\n\nclass IndexBuffer {\n    context: Context;\n    buffer: ?WebGLBuffer;\n    dynamicDraw: boolean;\n    id: number; // Unique ID, iterated on construction and data upload\n\n    static uniqueIdxCounter: number;\n    constructor(context: Context, array: TriangleIndexArray | LineIndexArray | LineStripIndexArray, dynamicDraw?: boolean, noDestroy?: boolean) {\n        this.id = IndexBuffer.uniqueIdxCounter;\n        IndexBuffer.uniqueIdxCounter++;\n\n        this.context = context;\n        const gl = context.gl;\n        this.buffer = gl.createBuffer();\n        this.dynamicDraw = Boolean(dynamicDraw);\n\n        // The bound index buffer is part of vertex array object state. We don't want to\n        // modify whatever VAO happens to be currently bound, so make sure the default\n        // vertex array provided by the context is bound instead.\n        this.context.unbindVAO();\n\n        context.bindElementBuffer.set(this.buffer);\n        gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, array.arrayBuffer, this.dynamicDraw ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW);\n\n        if (!this.dynamicDraw && !noDestroy) {\n            array.destroy();\n        }\n    }\n\n    bind() {\n        this.context.bindElementBuffer.set(this.buffer);\n    }\n\n    updateData(array: StructArray) {\n        this.id = IndexBuffer.uniqueIdxCounter;\n        IndexBuffer.uniqueIdxCounter++;\n\n        const gl = this.context.gl;\n        assert(this.dynamicDraw);\n        // The right VAO will get this buffer re-bound later in VertexArrayObject#bind\n        // See https://github.com/mapbox/mapbox-gl-js/issues/5620\n        this.context.unbindVAO();\n        this.bind();\n        gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, array.arrayBuffer);\n    }\n\n    destroy() {\n        const gl = this.context.gl;\n        if (this.buffer) {\n            gl.deleteBuffer(this.buffer);\n            delete this.buffer;\n        }\n    }\n}\n\nIndexBuffer.uniqueIdxCounter = 0;\n\nexport default IndexBuffer;\n","// @flow\n\nimport assert from 'assert';\n\nimport type {\n    StructArray,\n    StructArrayMember\n} from '../util/struct_array.js';\n\nimport type Program from '../render/program.js';\nimport type Context from '../gl/context.js';\n\n/**\n * @enum {string} AttributeType\n * @private\n * @readonly\n */\nconst AttributeType = {\n    Int8:   'BYTE',\n    Uint8:  'UNSIGNED_BYTE',\n    Int16:  'SHORT',\n    Uint16: 'UNSIGNED_SHORT',\n    Int32:  'INT',\n    Uint32: 'UNSIGNED_INT',\n    Float32: 'FLOAT'\n};\n\n/**\n * The `VertexBuffer` class turns a `StructArray` into a WebGL buffer. Each member of the StructArray's\n * Struct type is converted to a WebGL atribute.\n * @private\n */\nclass VertexBuffer {\n    length: number;\n    attributes: $ReadOnlyArray<StructArrayMember>;\n    itemSize: number;\n    dynamicDraw: ?boolean;\n    context: Context;\n    buffer: ?WebGLBuffer;\n    instanceCount: ?number;\n\n    /**\n     * @param dynamicDraw Whether this buffer will be repeatedly updated.\n     * @private\n     */\n    constructor(context: Context, array: StructArray, attributes: $ReadOnlyArray<StructArrayMember>, dynamicDraw?: boolean, noDestroy?: boolean, instanceCount?: number) {\n        this.length = array.length;\n        this.attributes = attributes;\n        this.itemSize = array.bytesPerElement;\n        this.dynamicDraw = dynamicDraw;\n        this.instanceCount = instanceCount;\n        this.context = context;\n        const gl = context.gl;\n        this.buffer = gl.createBuffer();\n        context.bindVertexBuffer.set(this.buffer);\n        gl.bufferData(gl.ARRAY_BUFFER, array.arrayBuffer, this.dynamicDraw ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW);\n\n        if (!this.dynamicDraw && !noDestroy) {\n            array.destroy();\n        }\n    }\n\n    bind() {\n        this.context.bindVertexBuffer.set(this.buffer);\n    }\n\n    updateData(array: StructArray) {\n        assert(array.length === this.length);\n        const gl = this.context.gl;\n        this.bind();\n        gl.bufferSubData(gl.ARRAY_BUFFER, 0, array.arrayBuffer);\n    }\n\n    enableAttributes(gl: WebGL2RenderingContext, program: Program<*>) {\n        for (let j = 0; j < this.attributes.length; j++) {\n            const member = this.attributes[j];\n            const attribIndex: number | void = program.attributes[member.name];\n            if (attribIndex !== undefined) {\n                gl.enableVertexAttribArray(attribIndex);\n            }\n        }\n    }\n\n    /**\n     * Set the attribute pointers in a WebGL context.\n     * @param gl The WebGL context.\n     * @param program The active WebGL program.\n     * @param vertexOffset Index of the starting vertex of the segment.\n     */\n    setVertexAttribPointers(gl: WebGL2RenderingContext, program: Program<*>, vertexOffset: ?number) {\n        for (let j = 0; j < this.attributes.length; j++) {\n            const member = this.attributes[j];\n            const attribIndex: number | void = program.attributes[member.name];\n\n            if (attribIndex !== undefined) {\n                gl.vertexAttribPointer(\n                    attribIndex,\n                    member.components,\n                    (gl: any)[AttributeType[member.type]],\n                    false,\n                    this.itemSize,\n                    member.offset + (this.itemSize * (vertexOffset || 0))\n                );\n            }\n        }\n    }\n\n    setVertexAttribDivisor(gl: WebGL2RenderingContext, program: Program<*>, value: number) {\n        for (let j = 0; j < this.attributes.length; j++) {\n            const member = this.attributes[j];\n            const attribIndex: number | void = program.attributes[member.name];\n\n            if (attribIndex !== undefined && this.instanceCount && this.instanceCount > 0) {\n                gl.vertexAttribDivisor(attribIndex, value);\n            }\n        }\n    }\n\n    /**\n     * Destroy the GL buffer bound to the given WebGL context.\n     */\n    destroy() {\n        const gl = this.context.gl;\n        if (this.buffer) {\n            gl.deleteBuffer(this.buffer);\n            delete this.buffer;\n        }\n    }\n}\n\nexport default VertexBuffer;\n","// @flow\n\nimport Color from '../style-spec/util/color.js';\nimport assert from 'assert';\n\nimport type Context from './context.js';\nimport type {\n    BlendFuncType,\n    BlendEquationType,\n    ColorMaskType,\n    DepthRangeType,\n    DepthMaskType,\n    StencilFuncType,\n    StencilOpType,\n    DepthFuncType,\n    TextureUnitType,\n    ViewportType,\n    CullFaceModeType,\n    FrontFaceType,\n} from './types.js';\n\nexport interface Value<T> {\n    current: T;\n    default: T;\n    dirty: boolean;\n    get(): T;\n    setDefault(): void;\n    set(value: T): void;\n}\n\nclass BaseValue<T> implements Value<T> {\n    gl: WebGL2RenderingContext;\n    current: T;\n    default: T;\n    dirty: boolean;\n\n    constructor(context: Context) {\n        this.gl = context.gl;\n        this.default = this.getDefault();\n        this.current = this.default;\n        this.dirty = false;\n    }\n\n    get(): T {\n        return this.current;\n    }\n    set(value: T) { // eslint-disable-line\n        // overridden in child classes;\n    }\n\n    getDefault(): T {\n        return this.default; // overriden in child classes\n    }\n    setDefault() {\n        this.set(this.default);\n    }\n}\n\nexport class ClearColor extends BaseValue<Color> {\n    getDefault(): Color {\n        return Color.transparent;\n    }\n    set(v: Color) {\n        const c = this.current;\n        if (v.r === c.r && v.g === c.g && v.b === c.b && v.a === c.a && !this.dirty) return;\n        this.gl.clearColor(v.r, v.g, v.b, v.a);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class ClearDepth extends BaseValue<number> {\n    getDefault(): number {\n        return 1;\n    }\n    set(v: number) {\n        if (v === this.current && !this.dirty) return;\n        this.gl.clearDepth(v);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class ClearStencil extends BaseValue<number> {\n    getDefault(): number {\n        return 0;\n    }\n    set(v: number) {\n        if (v === this.current && !this.dirty) return;\n        this.gl.clearStencil(v);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class ColorMask extends BaseValue<ColorMaskType> {\n    getDefault(): ColorMaskType {\n        return [true, true, true, true];\n    }\n    set(v: ColorMaskType) {\n        const c = this.current;\n        if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && v[3] === c[3] && !this.dirty) return;\n        this.gl.colorMask(v[0], v[1], v[2], v[3]);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class DepthMask extends BaseValue<DepthMaskType> {\n    getDefault(): DepthMaskType {\n        return true;\n    }\n    set(v: DepthMaskType): void {\n        if (v === this.current && !this.dirty) return;\n        this.gl.depthMask(v);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class StencilMask extends BaseValue<number> {\n    getDefault(): number {\n        return 0xFF;\n    }\n    set(v: number): void {\n        if (v === this.current && !this.dirty) return;\n        this.gl.stencilMask(v);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class StencilFunc extends BaseValue<StencilFuncType> {\n    getDefault(): StencilFuncType {\n        return {\n            func: this.gl.ALWAYS,\n            ref: 0,\n            mask: 0xFF\n        };\n    }\n    set(v: StencilFuncType): void {\n        const c = this.current;\n        if (v.func === c.func && v.ref === c.ref && v.mask === c.mask && !this.dirty) return;\n        // Assume UNSIGNED_INT_24_8 storage, with 8 bits dedicated to stencil.\n        // Please revise your stencil values if this threshold is triggered.\n        assert(v.ref >= 0 && v.ref <= 255);\n        this.gl.stencilFunc(v.func, v.ref, v.mask);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class StencilOp extends BaseValue<StencilOpType> {\n    getDefault(): StencilOpType {\n        const gl = this.gl;\n        return [gl.KEEP, gl.KEEP, gl.KEEP];\n    }\n    set(v: StencilOpType) {\n        const c = this.current;\n        if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && !this.dirty) return;\n        this.gl.stencilOp(v[0], v[1], v[2]);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class StencilTest extends BaseValue<boolean> {\n    getDefault(): boolean {\n        return false;\n    }\n    set(v: boolean) {\n        if (v === this.current && !this.dirty) return;\n        const gl = this.gl;\n        if (v) {\n            gl.enable(gl.STENCIL_TEST);\n        } else {\n            gl.disable(gl.STENCIL_TEST);\n        }\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class DepthRange extends BaseValue<DepthRangeType> {\n    getDefault(): DepthRangeType {\n        return [0, 1];\n    }\n    set(v: DepthRangeType) {\n        const c = this.current;\n        if (v[0] === c[0] && v[1] === c[1] && !this.dirty) return;\n        this.gl.depthRange(v[0], v[1]);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class DepthTest extends BaseValue<boolean> {\n    getDefault(): boolean {\n        return false;\n    }\n    set(v: boolean) {\n        if (v === this.current && !this.dirty) return;\n        const gl = this.gl;\n        if (v) {\n            gl.enable(gl.DEPTH_TEST);\n        } else {\n            gl.disable(gl.DEPTH_TEST);\n        }\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class DepthFunc extends BaseValue<DepthFuncType> {\n    getDefault(): DepthFuncType {\n        return this.gl.LESS;\n    }\n    set(v: DepthFuncType) {\n        if (v === this.current && !this.dirty) return;\n        this.gl.depthFunc(v);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class Blend extends BaseValue<boolean> {\n    getDefault(): boolean {\n        return false;\n    }\n    set(v: boolean) {\n        if (v === this.current && !this.dirty) return;\n        const gl = this.gl;\n        if (v) {\n            gl.enable(gl.BLEND);\n        } else {\n            gl.disable(gl.BLEND);\n        }\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class BlendFunc extends BaseValue<BlendFuncType> {\n    getDefault(): BlendFuncType {\n        const gl = this.gl;\n        return [gl.ONE, gl.ZERO, gl.ONE, gl.ZERO];\n    }\n    set(v: BlendFuncType) {\n        const c = this.current;\n        if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && v[3] === c[3] && !this.dirty) return;\n        this.gl.blendFuncSeparate(v[0], v[1], v[2], v[3]);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class BlendColor extends BaseValue<Color> {\n    getDefault(): Color {\n        return Color.transparent;\n    }\n    set(v: Color) {\n        const c = this.current;\n        if (v.r === c.r && v.g === c.g && v.b === c.b && v.a === c.a && !this.dirty) return;\n        this.gl.blendColor(v.r, v.g, v.b, v.a);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class BlendEquation extends BaseValue<BlendEquationType> {\n    getDefault(): BlendEquationType {\n        return this.gl.FUNC_ADD;\n    }\n    set(v: BlendEquationType) {\n        if (v === this.current && !this.dirty) return;\n        this.gl.blendEquationSeparate(v, v);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class CullFace extends BaseValue<boolean> {\n    getDefault(): boolean {\n        return false;\n    }\n    set(v: boolean) {\n        if (v === this.current && !this.dirty) return;\n        const gl = this.gl;\n        if (v) {\n            gl.enable(gl.CULL_FACE);\n        } else {\n            gl.disable(gl.CULL_FACE);\n        }\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class CullFaceSide extends BaseValue<CullFaceModeType> {\n    getDefault(): CullFaceModeType {\n        return this.gl.BACK;\n    }\n    set(v: CullFaceModeType) {\n        if (v === this.current && !this.dirty) return;\n        this.gl.cullFace(v);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class FrontFace extends BaseValue<FrontFaceType> {\n    getDefault(): FrontFaceType {\n        return this.gl.CCW;\n    }\n    set(v: FrontFaceType) {\n        if (v === this.current && !this.dirty) return;\n        this.gl.frontFace(v);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class Program extends BaseValue<?WebGLProgram> {\n    getDefault(): WebGLProgram | null {\n        return null;\n    }\n    set(v: ?WebGLProgram) {\n        if (v === this.current && !this.dirty) return;\n        this.gl.useProgram(v);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class ActiveTextureUnit extends BaseValue<TextureUnitType> {\n    getDefault(): TextureUnitType {\n        return this.gl.TEXTURE0;\n    }\n    set(v: TextureUnitType) {\n        if (v === this.current && !this.dirty) return;\n        this.gl.activeTexture(v);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class Viewport extends BaseValue<ViewportType> {\n    getDefault(): ViewportType {\n        const gl = this.gl;\n        return [0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight];\n    }\n    set(v: ViewportType) {\n        const c = this.current;\n        if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && v[3] === c[3] && !this.dirty) return;\n        this.gl.viewport(v[0], v[1], v[2], v[3]);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class BindFramebuffer extends BaseValue<?WebGLFramebuffer> {\n    getDefault(): WebGLFramebuffer | null {\n        return null;\n    }\n    set(v: ?WebGLFramebuffer) {\n        if (v === this.current && !this.dirty) return;\n        const gl = this.gl;\n        gl.bindFramebuffer(gl.FRAMEBUFFER, v);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class BindRenderbuffer extends BaseValue<?WebGLRenderbuffer> {\n    getDefault(): WebGLRenderbuffer | null {\n        return null;\n    }\n    set(v: ?WebGLRenderbuffer) {\n        if (v === this.current && !this.dirty) return;\n        const gl = this.gl;\n        gl.bindRenderbuffer(gl.RENDERBUFFER, v);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class BindTexture extends BaseValue<?WebGLTexture> {\n    getDefault(): WebGLTexture | null {\n        return null;\n    }\n    set(v: ?WebGLTexture) {\n        if (v === this.current && !this.dirty) return;\n        const gl = this.gl;\n        gl.bindTexture(gl.TEXTURE_2D, v);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class BindVertexBuffer extends BaseValue<?WebGLBuffer> {\n    getDefault(): WebGLBuffer | null {\n        return null;\n    }\n    set(v: ?WebGLBuffer) {\n        if (v === this.current && !this.dirty) return;\n        const gl = this.gl;\n        gl.bindBuffer(gl.ARRAY_BUFFER, v);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class BindElementBuffer extends BaseValue<?WebGLBuffer> {\n    getDefault(): WebGLBuffer | null {\n        return null;\n    }\n    set(v: ?WebGLBuffer) {\n        // Always rebind\n        const gl = this.gl;\n        gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, v);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class BindVertexArrayOES extends BaseValue<any> {\n    getDefault(): any {\n        return null;\n    }\n    set(v: any) {\n        if (!this.gl || (v === this.current && !this.dirty)) return;\n        this.gl.bindVertexArray(v);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class PixelStoreUnpack extends BaseValue<number> {\n    getDefault(): number {\n        return 4;\n    }\n    set(v: number) {\n        if (v === this.current && !this.dirty) return;\n        const gl = this.gl;\n        gl.pixelStorei(gl.UNPACK_ALIGNMENT, v);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class PixelStoreUnpackPremultiplyAlpha extends BaseValue<boolean> {\n    getDefault(): boolean {\n        return false;\n    }\n    set(v: boolean): void {\n        if (v === this.current && !this.dirty) return;\n        const gl = this.gl;\n        gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, (v: any));\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class PixelStoreUnpackFlipY extends BaseValue<boolean> {\n    getDefault(): boolean {\n        return false;\n    }\n    set(v: boolean): void {\n        if (v === this.current && !this.dirty) return;\n        const gl = this.gl;\n        gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, (v: any));\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nclass FramebufferAttachment<T> extends BaseValue<?T> {\n    parent: WebGLFramebuffer;\n    context: Context;\n\n    constructor(context: Context, parent: WebGLFramebuffer) {\n        super(context);\n        this.context = context;\n        this.parent = parent;\n    }\n    getDefault(): null {\n        return null;\n    }\n}\n\nexport class ColorAttachment extends FramebufferAttachment<WebGLTexture> {\n    setDirty() {\n        this.dirty = true;\n    }\n    set(v: ?WebGLTexture): void {\n        if (v === this.current && !this.dirty) return;\n        this.context.bindFramebuffer.set(this.parent);\n        // note: it's possible to attach a renderbuffer to the color\n        // attachment point, but thus far MBGL only uses textures for color\n        const gl = this.gl;\n        gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, v, 0);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class DepthRenderbufferAttachment extends FramebufferAttachment<WebGLRenderbuffer> {\n    attachment(): number { return this.gl.DEPTH_ATTACHMENT; }\n    set(v: ?WebGLRenderbuffer | ?WebGLTexture): void {\n        if (v === this.current && !this.dirty) return;\n        this.context.bindFramebuffer.set(this.parent);\n        const gl = this.gl;\n        gl.framebufferRenderbuffer(gl.FRAMEBUFFER, this.attachment(), gl.RENDERBUFFER, v);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class DepthTextureAttachment extends FramebufferAttachment<WebGLTexture> {\n    attachment(): number { return this.gl.DEPTH_ATTACHMENT; }\n    set(v: ?WebGLTexture): void {\n        if (v === this.current && !this.dirty) return;\n        this.context.bindFramebuffer.set(this.parent);\n        const gl = this.gl;\n        gl.framebufferTexture2D(gl.FRAMEBUFFER, this.attachment(), gl.TEXTURE_2D, v, 0);\n        this.current = v;\n        this.dirty = false;\n    }\n}\n\nexport class DepthStencilAttachment extends DepthRenderbufferAttachment {\n    attachment(): number { return this.gl.DEPTH_STENCIL_ATTACHMENT; }\n}\n","// @flow\nimport {ColorAttachment, DepthRenderbufferAttachment, DepthTextureAttachment} from './value.js';\n\nimport type Context from './context.js';\nimport type {DepthBufferType} from './types.js';\n\nclass Framebuffer {\n    context: Context;\n    width: number;\n    height: number;\n    framebuffer: WebGLFramebuffer;\n    colorAttachment: ColorAttachment;\n    depthAttachment: DepthRenderbufferAttachment | DepthTextureAttachment;\n    depthAttachmentType: ?DepthBufferType\n\n    constructor(context: Context, width: number, height: number, hasColor: boolean, depthType: ?DepthBufferType) {\n        this.context = context;\n        this.width = width;\n        this.height = height;\n        const gl = context.gl;\n        const fbo = this.framebuffer = ((gl.createFramebuffer(): any): WebGLFramebuffer);\n\n        if (hasColor) {\n            this.colorAttachment = new ColorAttachment(context, fbo);\n        }\n        if (depthType) {\n            this.depthAttachmentType = depthType;\n\n            if (depthType === 'renderbuffer') {\n                this.depthAttachment = new DepthRenderbufferAttachment(context, fbo);\n            } else {\n                this.depthAttachment = new DepthTextureAttachment(context, fbo);\n            }\n        }\n    }\n\n    destroy() {\n        const gl = this.context.gl;\n\n        if (this.colorAttachment) {\n            const texture = this.colorAttachment.get();\n            if (texture) gl.deleteTexture(texture);\n        }\n\n        if (this.depthAttachment && this.depthAttachmentType) {\n            if (this.depthAttachmentType === 'renderbuffer') {\n                const renderbuffer = this.depthAttachment.get();\n                if (renderbuffer) gl.deleteRenderbuffer(renderbuffer);\n            } else {\n                const texture = this.depthAttachment.get();\n                if (texture) gl.deleteTexture(texture);\n            }\n        }\n\n        gl.deleteFramebuffer(this.framebuffer);\n    }\n}\n\nexport default Framebuffer;\n","// @flow\nimport type {DepthFuncType, DepthMaskType, DepthRangeType} from './types.js';\n\nconst ALWAYS = 0x0207;\n\nclass DepthMode {\n    func: DepthFuncType;\n    mask: DepthMaskType;\n    range: DepthRangeType;\n\n    // DepthMask enums\n    static ReadOnly: boolean;\n    static ReadWrite: boolean;\n\n    constructor(depthFunc: DepthFuncType, depthMask: DepthMaskType, depthRange: DepthRangeType) {\n        this.func = depthFunc;\n        this.mask = depthMask;\n        this.range = depthRange;\n    }\n\n    static disabled: $ReadOnly<DepthMode>;\n}\n\nDepthMode.ReadOnly = false;\nDepthMode.ReadWrite = true;\n\nDepthMode.disabled = new DepthMode(ALWAYS, DepthMode.ReadOnly, [0, 1]);\n\nexport default DepthMode;\n","// @flow\nimport type {StencilOpConstant, StencilTest} from './types.js';\n\nconst ALWAYS = 0x0207;\nconst KEEP = 0x1E00;\n\nclass StencilMode {\n    test: StencilTest;\n    ref: number;\n    mask: number;\n    fail: StencilOpConstant;\n    depthFail: StencilOpConstant;\n    pass: StencilOpConstant;\n\n    constructor(test: StencilTest, ref: number, mask: number, fail: StencilOpConstant,\n        depthFail: StencilOpConstant, pass: StencilOpConstant) {\n        this.test = test;\n        this.ref = ref;\n        this.mask = mask;\n        this.fail = fail;\n        this.depthFail = depthFail;\n        this.pass = pass;\n    }\n\n    static disabled: $ReadOnly<StencilMode>;\n}\n\nStencilMode.disabled = new StencilMode({func: ALWAYS, mask: 0}, 0, 0, KEEP, KEEP, KEEP);\n\nexport default StencilMode;\n","// @flow\nimport Color from '../style-spec/util/color.js';\n\nimport type {BlendEquationType, BlendFuncType, ColorMaskType} from './types.js';\n\nexport const ZERO = 0x0000;\nexport const ONE = 0x0001;\nexport const ONE_MINUS_SRC_ALPHA = 0x0303;\nexport const DST_COLOR = 0x0306;\n\nexport default class ColorMode {\n    blendFunction: BlendFuncType;\n    blendColor: Color;\n    mask: ColorMaskType;\n    blendEquation: ?BlendEquationType;\n\n    constructor(blendFunction: BlendFuncType, blendColor: Color, mask: ColorMaskType, blendEquation: ?BlendEquationType) {\n        this.blendFunction = blendFunction;\n        this.blendColor = blendColor;\n        this.mask = mask;\n        this.blendEquation = blendEquation;\n    }\n\n    static Replace: BlendFuncType;\n\n    static disabled: $ReadOnly<ColorMode>;\n    static unblended: $ReadOnly<ColorMode>;\n    static alphaBlended: $ReadOnly<ColorMode>;\n    static multiply: $ReadOnly<ColorMode>;\n}\n\nColorMode.Replace = [ONE, ZERO, ONE, ZERO];\n\nColorMode.disabled = new ColorMode(ColorMode.Replace, Color.transparent, [false, false, false, false]);\nColorMode.unblended = new ColorMode(ColorMode.Replace, Color.transparent, [true, true, true, true]);\nColorMode.alphaBlended = new ColorMode([ONE, ONE_MINUS_SRC_ALPHA, ONE, ONE_MINUS_SRC_ALPHA], Color.transparent, [true, true, true, true]);\nColorMode.multiply = new ColorMode([DST_COLOR, ZERO, DST_COLOR, ZERO], Color.transparent, [true, true, true, true]);\n","// @flow\n\nimport type {CullFaceModeType, FrontFaceType} from './types.js';\n\nconst BACK = 0x0405;\nconst FRONT = 0x0404;\nconst CCW = 0x0901;\nconst CW = 0x0900;\n\nclass CullFaceMode {\n    enable: boolean;\n    mode: CullFaceModeType;\n    frontFace: FrontFaceType;\n\n    constructor(enable: boolean, mode: CullFaceModeType, frontFace: FrontFaceType) {\n        this.enable = enable;\n        this.mode = mode;\n        this.frontFace = frontFace;\n    }\n\n    static disabled: $ReadOnly<CullFaceMode>;\n    static backCCW: $ReadOnly<CullFaceMode>;\n    static backCW: $ReadOnly<CullFaceMode>;\n    static frontCW: $ReadOnly<CullFaceMode>;\n    static frontCCW: $ReadOnly<CullFaceMode>;\n}\n\nCullFaceMode.disabled = new CullFaceMode(false, BACK, CCW);\nCullFaceMode.backCCW = new CullFaceMode(true, BACK, CCW);\nCullFaceMode.backCW = new CullFaceMode(true, BACK, CW);\nCullFaceMode.frontCW = new CullFaceMode(true, FRONT, CW);\nCullFaceMode.frontCCW = new CullFaceMode(true, FRONT, CCW);\n\nexport default CullFaceMode;\n","// @flow\nimport IndexBuffer from './index_buffer.js';\n\nimport VertexBuffer from './vertex_buffer.js';\nimport Framebuffer from './framebuffer.js';\nimport DepthMode from './depth_mode.js';\nimport StencilMode from './stencil_mode.js';\nimport ColorMode from './color_mode.js';\nimport CullFaceMode from './cull_face_mode.js';\nimport {deepEqual} from '../util/util.js';\nimport {ClearColor, ClearDepth, ClearStencil, ColorMask, DepthMask, StencilMask, StencilFunc, StencilOp, StencilTest, DepthRange, DepthTest, DepthFunc, Blend, BlendFunc, BlendColor, BlendEquation, CullFace, CullFaceSide, FrontFace, Program, ActiveTextureUnit, Viewport, BindFramebuffer, BindRenderbuffer, BindTexture, BindVertexBuffer, BindElementBuffer, BindVertexArrayOES, PixelStoreUnpack, PixelStoreUnpackPremultiplyAlpha, PixelStoreUnpackFlipY} from './value.js';\nimport type {DepthBufferType, ColorMaskType} from './types.js';\n\nimport type {TriangleIndexArray, LineIndexArray, LineStripIndexArray} from '../data/index_array_type.js';\nimport type {\n    StructArray,\n    StructArrayMember\n} from '../util/struct_array.js';\nimport type Color from '../style-spec/util/color.js';\n\ntype ClearArgs = {\n    color?: Color,\n    depth?: number,\n    stencil?: number,\n    colorMask?: ColorMaskType\n};\n\nexport type ContextOptions = {\n    extTextureFilterAnisotropicForceOff?: boolean;\n    extTextureFloatLinearForceOff?: boolean;\n    extStandardDerivativesForceOff?: boolean;\n};\n\nclass Context {\n    gl: WebGL2RenderingContext;\n    currentNumAttributes: ?number;\n    maxTextureSize: number;\n\n    clearColor: ClearColor;\n    clearDepth: ClearDepth;\n    clearStencil: ClearStencil;\n    colorMask: ColorMask;\n    depthMask: DepthMask;\n    stencilMask: StencilMask;\n    stencilFunc: StencilFunc;\n    stencilOp: StencilOp;\n    stencilTest: StencilTest;\n    depthRange: DepthRange;\n    depthTest: DepthTest;\n    depthFunc: DepthFunc;\n    blend: Blend;\n    blendFunc: BlendFunc;\n    blendColor: BlendColor;\n    blendEquation: BlendEquation;\n    cullFace: CullFace;\n    cullFaceSide: CullFaceSide;\n    frontFace: FrontFace;\n    program: Program;\n    activeTexture: ActiveTextureUnit;\n    viewport: Viewport;\n    bindFramebuffer: BindFramebuffer;\n    bindRenderbuffer: BindRenderbuffer;\n    bindTexture: BindTexture;\n    bindVertexBuffer: BindVertexBuffer;\n    bindElementBuffer: BindElementBuffer;\n    bindVertexArrayOES: BindVertexArrayOES;\n    pixelStoreUnpack: PixelStoreUnpack;\n    pixelStoreUnpackPremultiplyAlpha: PixelStoreUnpackPremultiplyAlpha;\n    pixelStoreUnpackFlipY: PixelStoreUnpackFlipY;\n    renderer: ?string;\n    vendor: ?string;\n\n    extTextureFilterAnisotropic: any;\n    extTextureFilterAnisotropicMax: any;\n    extTextureHalfFloat: any;\n    extRenderToTextureHalfFloat: any;\n    extDebugRendererInfo: any;\n    extTimerQuery: any;\n    extTextureFloatLinear: any;\n    options: ContextOptions;\n    maxPointSize: number;\n\n    constructor(gl: WebGL2RenderingContext, options?: ContextOptions) {\n        this.gl = gl;\n\n        this.clearColor = new ClearColor(this);\n        this.clearDepth = new ClearDepth(this);\n        this.clearStencil = new ClearStencil(this);\n        this.colorMask = new ColorMask(this);\n        this.depthMask = new DepthMask(this);\n        this.stencilMask = new StencilMask(this);\n        this.stencilFunc = new StencilFunc(this);\n        this.stencilOp = new StencilOp(this);\n        this.stencilTest = new StencilTest(this);\n        this.depthRange = new DepthRange(this);\n        this.depthTest = new DepthTest(this);\n        this.depthFunc = new DepthFunc(this);\n        this.blend = new Blend(this);\n        this.blendFunc = new BlendFunc(this);\n        this.blendColor = new BlendColor(this);\n        this.blendEquation = new BlendEquation(this);\n        this.cullFace = new CullFace(this);\n        this.cullFaceSide = new CullFaceSide(this);\n        this.frontFace = new FrontFace(this);\n        this.program = new Program(this);\n        this.activeTexture = new ActiveTextureUnit(this);\n        this.viewport = new Viewport(this);\n        this.bindFramebuffer = new BindFramebuffer(this);\n        this.bindRenderbuffer = new BindRenderbuffer(this);\n        this.bindTexture = new BindTexture(this);\n        this.bindVertexBuffer = new BindVertexBuffer(this);\n        this.bindElementBuffer = new BindElementBuffer(this);\n        this.bindVertexArrayOES = new BindVertexArrayOES(this);\n        this.pixelStoreUnpack = new PixelStoreUnpack(this);\n        this.pixelStoreUnpackPremultiplyAlpha = new PixelStoreUnpackPremultiplyAlpha(this);\n        this.pixelStoreUnpackFlipY = new PixelStoreUnpackFlipY(this);\n        this.options = options ? {...options} : {};\n\n        if (!this.options.extTextureFilterAnisotropicForceOff) {\n            this.extTextureFilterAnisotropic = (\n                gl.getExtension('EXT_texture_filter_anisotropic') ||\n            gl.getExtension('MOZ_EXT_texture_filter_anisotropic') ||\n            gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic')\n            );\n            if (this.extTextureFilterAnisotropic) {\n                this.extTextureFilterAnisotropicMax = gl.getParameter(this.extTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT);\n            }\n        }\n\n        this.extDebugRendererInfo = gl.getExtension('WEBGL_debug_renderer_info');\n        if (this.extDebugRendererInfo) {\n            this.renderer = gl.getParameter(this.extDebugRendererInfo.UNMASKED_RENDERER_WEBGL);\n            this.vendor = gl.getParameter(this.extDebugRendererInfo.UNMASKED_VENDOR_WEBGL);\n        }\n\n        if (!this.options.extTextureFloatLinearForceOff) {\n            this.extTextureFloatLinear = gl.getExtension('OES_texture_float_linear');\n        }\n        this.extRenderToTextureHalfFloat = gl.getExtension('EXT_color_buffer_half_float');\n\n        this.extTimerQuery = gl.getExtension('EXT_disjoint_timer_query_webgl2');\n        this.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n        this.maxPointSize = gl.getParameter(gl.ALIASED_POINT_SIZE_RANGE)[1];\n    }\n\n    setDefault() {\n        this.unbindVAO();\n\n        this.clearColor.setDefault();\n        this.clearDepth.setDefault();\n        this.clearStencil.setDefault();\n        this.colorMask.setDefault();\n        this.depthMask.setDefault();\n        this.stencilMask.setDefault();\n        this.stencilFunc.setDefault();\n        this.stencilOp.setDefault();\n        this.stencilTest.setDefault();\n        this.depthRange.setDefault();\n        this.depthTest.setDefault();\n        this.depthFunc.setDefault();\n        this.blend.setDefault();\n        this.blendFunc.setDefault();\n        this.blendColor.setDefault();\n        this.blendEquation.setDefault();\n        this.cullFace.setDefault();\n        this.cullFaceSide.setDefault();\n        this.frontFace.setDefault();\n        this.program.setDefault();\n        this.activeTexture.setDefault();\n        this.bindFramebuffer.setDefault();\n        this.pixelStoreUnpack.setDefault();\n        this.pixelStoreUnpackPremultiplyAlpha.setDefault();\n        this.pixelStoreUnpackFlipY.setDefault();\n    }\n\n    setDirty() {\n        this.clearColor.dirty = true;\n        this.clearDepth.dirty = true;\n        this.clearStencil.dirty = true;\n        this.colorMask.dirty = true;\n        this.depthMask.dirty = true;\n        this.stencilMask.dirty = true;\n        this.stencilFunc.dirty = true;\n        this.stencilOp.dirty = true;\n        this.stencilTest.dirty = true;\n        this.depthRange.dirty = true;\n        this.depthTest.dirty = true;\n        this.depthFunc.dirty = true;\n        this.blend.dirty = true;\n        this.blendFunc.dirty = true;\n        this.blendColor.dirty = true;\n        this.blendEquation.dirty = true;\n        this.cullFace.dirty = true;\n        this.cullFaceSide.dirty = true;\n        this.frontFace.dirty = true;\n        this.program.dirty = true;\n        this.activeTexture.dirty = true;\n        this.viewport.dirty = true;\n        this.bindFramebuffer.dirty = true;\n        this.bindRenderbuffer.dirty = true;\n        this.bindTexture.dirty = true;\n        this.bindVertexBuffer.dirty = true;\n        this.bindElementBuffer.dirty = true;\n        this.bindVertexArrayOES.dirty = true;\n        this.pixelStoreUnpack.dirty = true;\n        this.pixelStoreUnpackPremultiplyAlpha.dirty = true;\n        this.pixelStoreUnpackFlipY.dirty = true;\n    }\n\n    createIndexBuffer(array: TriangleIndexArray | LineIndexArray | LineStripIndexArray, dynamicDraw?: boolean, noDestroy?: boolean): IndexBuffer {\n        return new IndexBuffer(this, array, dynamicDraw, noDestroy);\n    }\n\n    createVertexBuffer(array: StructArray, attributes: $ReadOnlyArray<StructArrayMember>, dynamicDraw?: boolean, noDestroy?: boolean, instanceCount?: number): VertexBuffer {\n        return new VertexBuffer(this, array, attributes, dynamicDraw, noDestroy, instanceCount);\n    }\n\n    createRenderbuffer(storageFormat: number, width: number, height: number): ?WebGLRenderbuffer {\n        const gl = this.gl;\n\n        const rbo = gl.createRenderbuffer();\n        this.bindRenderbuffer.set(rbo);\n        gl.renderbufferStorage(gl.RENDERBUFFER, storageFormat, width, height);\n        this.bindRenderbuffer.set(null);\n\n        return rbo;\n    }\n\n    createFramebuffer(width: number, height: number, hasColor: boolean, depthType: ?DepthBufferType): Framebuffer {\n        return new Framebuffer(this, width, height, hasColor, depthType);\n    }\n\n    clear({color, depth, stencil, colorMask}: ClearArgs) {\n        const gl = this.gl;\n        let mask = 0;\n\n        if (color) {\n            mask |= gl.COLOR_BUFFER_BIT;\n            this.clearColor.set(color);\n            if (colorMask) {\n                this.colorMask.set(colorMask);\n            } else {\n                this.colorMask.set([true, true, true, true]);\n            }\n        }\n\n        if (typeof depth !== 'undefined') {\n            mask |= gl.DEPTH_BUFFER_BIT;\n\n            // Workaround for platforms where clearDepth doesn't seem to work\n            // without reseting the depthRange. See https://github.com/mapbox/mapbox-gl-js/issues/3437\n            this.depthRange.set([0, 1]);\n\n            this.clearDepth.set(depth);\n            this.depthMask.set(true);\n        }\n\n        if (typeof stencil !== 'undefined') {\n            mask |= gl.STENCIL_BUFFER_BIT;\n            this.clearStencil.set(stencil);\n            this.stencilMask.set(0xFF);\n        }\n\n        gl.clear(mask);\n    }\n\n    setCullFace(cullFaceMode: $ReadOnly<CullFaceMode>) {\n        if (cullFaceMode.enable === false) {\n            this.cullFace.set(false);\n        } else {\n            this.cullFace.set(true);\n            this.cullFaceSide.set(cullFaceMode.mode);\n            this.frontFace.set(cullFaceMode.frontFace);\n        }\n    }\n\n    setDepthMode(depthMode: $ReadOnly<DepthMode>) {\n        if (depthMode.func === this.gl.ALWAYS && !depthMode.mask) {\n            this.depthTest.set(false);\n        } else {\n            this.depthTest.set(true);\n            this.depthFunc.set(depthMode.func);\n            this.depthMask.set(depthMode.mask);\n            this.depthRange.set(depthMode.range);\n        }\n    }\n\n    setStencilMode(stencilMode: $ReadOnly<StencilMode>) {\n        if (stencilMode.test.func === this.gl.ALWAYS && !stencilMode.mask) {\n            this.stencilTest.set(false);\n        } else {\n            this.stencilTest.set(true);\n            this.stencilMask.set(stencilMode.mask);\n            this.stencilOp.set([stencilMode.fail, stencilMode.depthFail, stencilMode.pass]);\n            this.stencilFunc.set({\n                func: stencilMode.test.func,\n                ref: stencilMode.ref,\n                mask: stencilMode.test.mask\n            });\n        }\n    }\n\n    setColorMode(colorMode: $ReadOnly<ColorMode>) {\n        if (deepEqual(colorMode.blendFunction, ColorMode.Replace)) {\n            this.blend.set(false);\n        } else {\n            this.blend.set(true);\n            this.blendFunc.set(colorMode.blendFunction);\n            this.blendColor.set(colorMode.blendColor);\n            if (colorMode.blendEquation) {\n                this.blendEquation.set(colorMode.blendEquation);\n            } else {\n                this.blendEquation.setDefault();\n            }\n        }\n\n        this.colorMask.set(colorMode.mask);\n    }\n\n    unbindVAO() {\n        // Unbinding the VAO prevents other things (custom layers, new buffer creation) from\n        // unintentionally changing the state of the last VAO used.\n        this.bindVertexArrayOES.set(null);\n    }\n}\n\nexport default Context;\n","// @flow\n\nimport {createLayout} from '../util/struct_array.js';\nimport type {StructArrayLayout} from '../util/struct_array.js';\n\nexport default (createLayout([\n    {name: 'a_index', type: 'Int16', components: 1}\n]): StructArrayLayout);\n","// @flow\n\nimport browser from '../util/browser.js';\nimport Context from '../gl/context.js';\nimport {mulberry32} from '../style-spec/util/random.js';\nimport {ParticleIndexLayoutArray} from '../data/array_types.js';\nimport particleAttributes from '../data/particle_attributes.js';\nimport {RGBAImage} from '../util/image.js';\nimport SegmentVector from '../data/segment.js';\nimport Texture from './texture.js';\nimport assert from 'assert';\n\nimport type {OverscaledTileID} from \"../source/tile_id\";\nimport type {TextureImage} from './texture.js';\nimport type VertexBuffer from '../gl/vertex_buffer.js';\n\nexport const PARTICLE_POS_SCALE = 1.3;\nexport const PARTICLE_POS_OFFSET = 0.5 * (PARTICLE_POS_SCALE - 1.0);\n\nclass RasterParticleState {\n    context: Context;\n    particleTexture0: Texture;\n    particleTexture1: Texture;\n    particleIndexBuffer: VertexBuffer;\n    particleSegment: SegmentVector;\n    targetColorTexture: Texture;\n    backgroundColorTexture: Texture;\n    particleTextureDimension: number;\n    lastInvalidatedAt: number;\n\n    constructor(context: Context, id: OverscaledTileID, textureSize: [number, number], particleTextureDimension: number): void {\n        const emptyImage: TextureImage = {\n            width: textureSize[0],\n            height: textureSize[1],\n            data: null\n        };\n        const gl = context.gl;\n        this.targetColorTexture = new Texture(context, emptyImage, gl.RGBA, {useMipmap: false});\n        this.backgroundColorTexture = new Texture(context, emptyImage, gl.RGBA, {useMipmap: false});\n        this.context = context;\n\n        this.setParticleTextureDimension(id, particleTextureDimension);\n        this.lastInvalidatedAt = 0;\n    }\n\n    setParticleTextureDimension(id: OverscaledTileID, particleTextureDimension: number) {\n        if (this.particleTextureDimension === particleTextureDimension) {\n            return;\n        }\n\n        if (this.particleTexture0 || this.particleTexture1 || this.particleIndexBuffer || this.particleSegment) {\n            assert(this.particleTexture0 && this.particleTexture1 && this.particleIndexBuffer && this.particleSegment);\n            this.particleTexture0.destroy();\n            this.particleTexture1.destroy();\n            this.particleIndexBuffer.destroy();\n            this.particleSegment.destroy();\n        }\n\n        const gl = this.context.gl;\n\n        const numParticles = particleTextureDimension * particleTextureDimension;\n        const particlePositions = new Uint8Array(numParticles * 4);\n\n        const invScale = 1.0 / PARTICLE_POS_SCALE;\n        const srand = mulberry32(id.key);\n        // Pack random positions in [0, 1] into RGBA pixels. Matches the GLSL\n        // `pack_pos_to_rgba` behavior.\n        for (let i = 0; i < particlePositions.length; i += 4) {\n            const x = invScale * (srand() + PARTICLE_POS_OFFSET);\n            const y = invScale * (srand() + PARTICLE_POS_OFFSET);\n\n            const rx = x;\n            const ry = (x * 255.0) % 1;\n            const rz = y;\n            const rw = (y * 255.0) % 1;\n\n            const px = rx - ry / 255.0;\n            const py = ry;\n            const pz = rz - rw / 255.0;\n            const pw = rw;\n\n            particlePositions[i + 0] = Math.floor(255.0 * px);\n            particlePositions[i + 1] = Math.floor(255.0 * py);\n            particlePositions[i + 2] = Math.floor(255.0 * pz);\n            particlePositions[i + 3] = Math.floor(255.0 * pw);\n        }\n        const particleImage = new RGBAImage({width: particleTextureDimension, height: particleTextureDimension}, particlePositions);\n        this.particleTexture0 = new Texture(this.context, particleImage, gl.RGBA, {premultiply: false, useMipmap: false});\n        this.particleTexture1 = new Texture(this.context, particleImage, gl.RGBA, {premultiply: false, useMipmap: false});\n\n        const particleIndices = new ParticleIndexLayoutArray();\n        particleIndices.reserve(numParticles);\n        for (let i = 0; i < numParticles; i++) {\n            particleIndices.emplaceBack(i);\n        }\n        this.particleIndexBuffer = this.context.createVertexBuffer(particleIndices, particleAttributes.members, true);\n\n        this.particleSegment = SegmentVector.simpleSegment(0, 0, this.particleIndexBuffer.length, 0);\n        this.particleTextureDimension = particleTextureDimension;\n    }\n\n    update(layerLastInvalidatedAt: number): boolean {\n        if (this.lastInvalidatedAt < layerLastInvalidatedAt) {\n            this.lastInvalidatedAt = browser.now();\n            return false;\n        }\n\n        return true;\n    }\n\n    destroy() {\n        this.targetColorTexture.destroy();\n        this.backgroundColorTexture.destroy();\n        this.particleIndexBuffer.destroy();\n        this.particleTexture0.destroy();\n        this.particleTexture1.destroy();\n        this.particleSegment.destroy();\n    }\n}\n\nexport default RasterParticleState;\n","// @flow\n\nimport {uniqueId, parseCacheControl} from '../util/util.js';\nimport {deserialize as deserializeBucket} from '../data/bucket.js';\nimport FeatureIndex from '../data/feature_index.js';\nimport GeoJSONFeature from '../util/vectortile_to_geojson.js';\nimport featureFilter from '../style-spec/feature_filter/index.js';\nimport SymbolBucket from '../data/bucket/symbol_bucket.js';\nimport FillBucket from '../data/bucket/fill_bucket.js';\nimport LineBucket from '../data/bucket/line_bucket.js';\nimport {CollisionBoxArray, TileBoundsArray, PosArray, TriangleIndexArray, LineStripIndexArray, PosGlobeExtArray} from '../data/array_types.js';\nimport Texture from '../render/texture.js';\nimport browser from '../util/browser.js';\nimport {Debug} from '../util/debug.js';\nimport toEvaluationFeature from '../data/evaluation_feature.js';\nimport EvaluationParameters from '../style/evaluation_parameters.js';\nimport SourceFeatureState from '../source/source_state.js';\nimport {lazyLoadRTLTextPlugin} from './rtl_text_plugin.js';\nimport {TileSpaceDebugBuffer} from '../data/debug_viz.js';\nimport Color from '../style-spec/util/color.js';\nimport loadGeometry from '../data/load_geometry.js';\nimport earcut from 'earcut';\nimport getTileMesh from './tile_mesh.js';\nimport tileTransform from '../geo/projection/tile_transform.js';\nimport {mercatorXfromLng, mercatorYfromLat} from '../geo/mercator_coordinate.js';\nimport boundsAttributes from '../data/bounds_attributes.js';\nimport posAttributes, {posAttributesGlobeExt} from '../data/pos_attributes.js';\nimport EXTENT from '../style-spec/data/extent.js';\nimport Point from '@mapbox/point-geometry';\nimport RasterParticleState from '../render/raster_particle_state.js';\nimport SegmentVector from '../data/segment.js';\nimport {transitionTileAABBinECEF, globeNormalizeECEF, tileCoordToECEF, globeToMercatorTransition, interpolateVec3} from '../geo/projection/globe_util.js';\nimport {vec3, mat4} from 'gl-matrix';\n\nimport type {Bucket} from '../data/bucket.js';\nimport type StyleLayer from '../style/style_layer.js';\nimport type {WorkerTileResult} from './worker_source.js';\nimport type Actor from '../util/actor.js';\nimport type DEMData from '../data/dem_data.js';\nimport type {AlphaImage, SpritePositions} from '../util/image.js';\nimport type ImageAtlas from '../render/image_atlas.js';\nimport type LineAtlas from '../render/line_atlas.js';\nimport type ImageManager from '../render/image_manager.js';\nimport type Context from '../gl/context.js';\nimport type {CanonicalTileID, OverscaledTileID} from './tile_id.js';\nimport type Framebuffer from '../gl/framebuffer.js';\nimport type Transform from '../geo/transform.js';\nimport type {LayerFeatureStates} from './source_state.js';\nimport type {Cancelable} from '../types/cancelable.js';\nimport type {FilterSpecification} from '../style-spec/types.js';\nimport type {TilespaceQueryGeometry} from '../style/query_geometry.js';\nimport type VertexBuffer from '../gl/vertex_buffer.js';\nimport type IndexBuffer from '../gl/index_buffer.js';\nimport type Projection from '../geo/projection/projection.js';\nimport type {TileTransform} from '../geo/projection/tile_transform.js';\nimport type {QueryResult} from '../data/feature_index.js';\nimport type Painter from '../render/painter.js';\nimport type {QueryFeature} from '../util/vectortile_to_geojson.js';\nimport type {Vec3} from 'gl-matrix';\nimport type {UserManagedTexture, TextureImage} from '../render/texture.js';\nimport type {VectorTileLayer} from '@mapbox/vector-tile';\n\nconst CLOCK_SKEW_RETRY_TIMEOUT = 30000;\nexport type TileState =\n    | 'loading'   // Tile data is in the process of loading.\n    | 'loaded'    // Tile data has been loaded. Tile can be rendered.\n    | 'empty'     // Tile data has been loaded but has no content for rendering.\n    | 'reloading' // Tile data has been loaded and is being updated. Tile can be rendered.\n    | 'unloaded'  // Tile data has been deleted.\n    | 'errored'   // Tile data was not loaded because of an error.\n    | 'expired';  /* Tile data was previously loaded, but has expired per its\n                   * HTTP headers and is in the process of refreshing. */\n\n// a tile bounds outline used for getting reprojected tile geometry in non-mercator projections\nconst BOUNDS_FEATURE = (() => {\n    return {\n        type: 2,\n        extent: EXTENT,\n        loadGeometry() {\n            return [[\n                new Point(0, 0),\n                new Point(EXTENT + 1, 0),\n                new Point(EXTENT + 1, EXTENT + 1),\n                new Point(0, EXTENT + 1),\n                new Point(0, 0)\n            ]];\n        }\n    };\n})();\n\n/**\n * A tile object is the combination of a Coordinate, which defines\n * its place, as well as a unique ID and data tracking for its content\n *\n * @private\n */\nclass Tile {\n    tileID: OverscaledTileID;\n    uid: number;\n    uses: number;\n    tileSize: number;\n    tileZoom: number;\n    buckets: {[_: string]: Bucket};\n    latestFeatureIndex: ?FeatureIndex;\n    latestRawTileData: ?ArrayBuffer;\n    imageAtlas: ?ImageAtlas;\n    imageAtlasTexture: ?Texture;\n    lineAtlas: ?LineAtlas;\n    lineAtlasTexture: ?Texture;\n    glyphAtlasImage: ?AlphaImage;\n    glyphAtlasTexture: ?Texture;\n    expirationTime: any;\n    expiredRequestCount: number;\n    state: TileState;\n    timeAdded: any;\n    fadeEndTime: any;\n    collisionBoxArray: ?CollisionBoxArray;\n    redoWhenDone: boolean;\n    showCollisionBoxes: boolean;\n    placementSource: any;\n    actor: ?Actor;\n    vtLayers: {[_: string]: VectorTileLayer};\n    isSymbolTile: ?boolean;\n    isExtraShadowCaster: ?boolean;\n    isRaster: ?boolean;\n    _tileTransform: TileTransform;\n\n    neighboringTiles: ?Object;\n    dem: ?DEMData;\n    aborted: ?boolean;\n    needsHillshadePrepare: ?boolean;\n    needsDEMTextureUpload: ?boolean;\n    request: ?Cancelable;\n    texture: ?Texture | ?UserManagedTexture;\n    hillshadeFBO: ?Framebuffer;\n    demTexture: ?Texture;\n    refreshedUponExpiration: boolean;\n    reloadCallback: any;\n    resourceTiming: ?Array<PerformanceResourceTiming>;\n    queryPadding: number;\n    rasterParticleState: ?RasterParticleState;\n\n    symbolFadeHoldUntil: ?number;\n    hasSymbolBuckets: boolean;\n    hasRTLText: boolean;\n    dependencies: Object;\n    projection: Projection;\n\n    queryGeometryDebugViz: ?TileSpaceDebugBuffer;\n    queryBoundsDebugViz: ?TileSpaceDebugBuffer;\n\n    _tileDebugBuffer: ?VertexBuffer;\n    _tileBoundsBuffer: ?VertexBuffer;\n    _tileDebugIndexBuffer: ?IndexBuffer;\n    _tileBoundsIndexBuffer: IndexBuffer;\n    _tileDebugSegments: SegmentVector;\n    _tileBoundsSegments: SegmentVector;\n    _globeTileDebugBorderBuffer: ?VertexBuffer;\n    _tileDebugTextBuffer: ?VertexBuffer;\n    _tileDebugTextSegments: SegmentVector;\n    _tileDebugTextIndexBuffer: IndexBuffer;\n    _globeTileDebugTextBuffer: ?VertexBuffer;\n    _lastUpdatedBrightness: ?number;\n\n    /**\n     * @param {OverscaledTileID} tileID\n     * @param size\n     * @private\n     */\n    constructor(tileID: OverscaledTileID, size: number, tileZoom: number, painter: ?Painter, isRaster?: boolean) {\n        this.tileID = tileID;\n        this.uid = uniqueId();\n        this.uses = 0;\n        this.tileSize = size;\n        this.tileZoom = tileZoom;\n        this.buckets = {};\n        this.expirationTime = null;\n        this.queryPadding = 0;\n        this.hasSymbolBuckets = false;\n        this.hasRTLText = false;\n        this.dependencies = {};\n        this.isRaster = isRaster;\n        if (painter && painter.style) {\n            this._lastUpdatedBrightness = painter.style.getBrightness();\n        }\n\n        // Counts the number of times a response was already expired when\n        // received. We're using this to add a delay when making a new request\n        // so we don't have to keep retrying immediately in case of a server\n        // serving expired tiles.\n        this.expiredRequestCount = 0;\n\n        this.state = 'loading';\n\n        if (painter && painter.transform) {\n            this.projection = painter.transform.projection;\n        }\n    }\n\n    registerFadeDuration(duration: number) {\n        const fadeEndTime = duration + this.timeAdded;\n        if (fadeEndTime < browser.now()) return;\n        if (this.fadeEndTime && fadeEndTime < this.fadeEndTime) return;\n\n        this.fadeEndTime = fadeEndTime;\n    }\n\n    wasRequested(): boolean {\n        return this.state === 'errored' || this.state === 'loaded' || this.state === 'reloading';\n    }\n\n    get tileTransform(): TileTransform {\n        if (!this._tileTransform) {\n            this._tileTransform = tileTransform(this.tileID.canonical, this.projection);\n        }\n        return this._tileTransform;\n    }\n\n    /**\n     * Given a data object with a 'buffers' property, load it into\n     * this tile's elementGroups and buffers properties and set loaded\n     * to true. If the data is null, like in the case of an empty\n     * GeoJSON tile, no-op but still set loaded to true.\n     * @param {Object} data\n     * @param painter\n     * @returns {undefined}\n     * @private\n     */\n    loadVectorData(data: ?WorkerTileResult, painter: Painter, justReloaded: ?boolean) {\n        this.unloadVectorData();\n\n        this.state = 'loaded';\n\n        // empty GeoJSON tile\n        if (!data) {\n            this.collisionBoxArray = new CollisionBoxArray();\n            return;\n        }\n\n        if (data.featureIndex) {\n            this.latestFeatureIndex = data.featureIndex;\n            if (data.rawTileData) {\n                // Only vector tiles have rawTileData, and they won't update it for\n                // 'reloadTile'\n                this.latestRawTileData = data.rawTileData;\n                this.latestFeatureIndex.rawTileData = data.rawTileData;\n            } else if (this.latestRawTileData) {\n                // If rawTileData hasn't updated, hold onto a pointer to the last\n                // one we received\n                this.latestFeatureIndex.rawTileData = this.latestRawTileData;\n            }\n        }\n        this.collisionBoxArray = data.collisionBoxArray;\n        this.buckets = deserializeBucket(data.buckets, painter.style);\n\n        this.hasSymbolBuckets = false;\n        for (const id in this.buckets) {\n            const bucket = this.buckets[id];\n            if (bucket instanceof SymbolBucket) {\n                this.hasSymbolBuckets = true;\n                if (justReloaded) {\n                    bucket.justReloaded = true;\n                } else {\n                    break;\n                }\n            }\n        }\n\n        this.hasRTLText = false;\n        if (this.hasSymbolBuckets) {\n            for (const id in this.buckets) {\n                const bucket = this.buckets[id];\n                if (bucket instanceof SymbolBucket) {\n                    if (bucket.hasRTLText) {\n                        this.hasRTLText = true;\n                        lazyLoadRTLTextPlugin();\n                        break;\n                    }\n                }\n            }\n        }\n\n        this.queryPadding = 0;\n        for (const id in this.buckets) {\n            const bucket = this.buckets[id];\n            const layer = painter.style.getOwnLayer(id);\n            if (!layer) continue;\n            const queryRadius = layer.queryRadius(bucket);\n            this.queryPadding = Math.max(this.queryPadding, queryRadius);\n        }\n\n        if (data.imageAtlas) {\n            this.imageAtlas = data.imageAtlas;\n        }\n        if (data.glyphAtlasImage) {\n            this.glyphAtlasImage = data.glyphAtlasImage;\n        }\n        if (data.lineAtlas) {\n            this.lineAtlas = data.lineAtlas;\n        }\n        this._lastUpdatedBrightness = data.brightness;\n    }\n\n    /**\n     * Release any data or WebGL resources referenced by this tile.\n     * @returns {undefined}\n     * @private\n     */\n    unloadVectorData() {\n        if (!this.hasData()) return;\n\n        for (const id in this.buckets) {\n            this.buckets[id].destroy();\n        }\n        this.buckets = {};\n\n        if (this.imageAtlas) {\n            this.imageAtlas = null;\n        }\n\n        if (this.lineAtlas) {\n            this.lineAtlas = null;\n        }\n\n        if (this.imageAtlasTexture) {\n            this.imageAtlasTexture.destroy();\n        }\n\n        if (this.glyphAtlasTexture) {\n            this.glyphAtlasTexture.destroy();\n        }\n\n        if (this.lineAtlasTexture) {\n            this.lineAtlasTexture.destroy();\n        }\n\n        if (this._tileBoundsBuffer) {\n            this._tileBoundsBuffer.destroy();\n            this._tileBoundsIndexBuffer.destroy();\n            this._tileBoundsSegments.destroy();\n            this._tileBoundsBuffer = null;\n        }\n\n        if (this._tileDebugBuffer) {\n            this._tileDebugBuffer.destroy();\n            this._tileDebugSegments.destroy();\n            this._tileDebugBuffer = null;\n        }\n\n        if (this._tileDebugIndexBuffer) {\n            this._tileDebugIndexBuffer.destroy();\n            this._tileDebugIndexBuffer = null;\n        }\n\n        if (this._globeTileDebugBorderBuffer) {\n            this._globeTileDebugBorderBuffer.destroy();\n            this._globeTileDebugBorderBuffer = null;\n        }\n\n        if (this._tileDebugTextBuffer) {\n            this._tileDebugTextBuffer.destroy();\n            this._tileDebugTextSegments.destroy();\n            this._tileDebugTextIndexBuffer.destroy();\n            this._tileDebugTextBuffer = null;\n        }\n\n        if (this._globeTileDebugTextBuffer) {\n            this._globeTileDebugTextBuffer.destroy();\n            this._globeTileDebugTextBuffer = null;\n        }\n\n        Debug.run(() => {\n            if (this.queryGeometryDebugViz) {\n                this.queryGeometryDebugViz.unload();\n                delete this.queryGeometryDebugViz;\n            }\n            if (this.queryBoundsDebugViz) {\n                this.queryBoundsDebugViz.unload();\n                delete this.queryBoundsDebugViz;\n            }\n        });\n        this.latestFeatureIndex = null;\n        this.state = 'unloaded';\n    }\n\n    getBucket(layer: StyleLayer): Bucket {\n        return this.buckets[layer.fqid];\n    }\n\n    upload(context: Context) {\n        for (const id in this.buckets) {\n            const bucket = this.buckets[id];\n            if (bucket.uploadPending()) {\n                bucket.upload(context);\n            }\n        }\n\n        const gl = context.gl;\n        const atlas = this.imageAtlas;\n        if (atlas && !atlas.uploaded) {\n            const hasPattern = !!Object.keys(atlas.patternPositions).length;\n            this.imageAtlasTexture = new Texture(context, atlas.image, gl.RGBA, {useMipmap: hasPattern});\n            ((this.imageAtlas: any): ImageAtlas).uploaded = true;\n        }\n\n        if (this.glyphAtlasImage) {\n            this.glyphAtlasTexture = new Texture(context, this.glyphAtlasImage, gl.R8);\n            this.glyphAtlasImage = null;\n        }\n\n        if (this.lineAtlas && !this.lineAtlas.uploaded) {\n            this.lineAtlasTexture = new Texture(context, this.lineAtlas.image, gl.R8);\n            ((this.lineAtlas: any): LineAtlas).uploaded = true;\n        }\n    }\n\n    prepare(imageManager: ImageManager, painter: ?Painter, scope: string) {\n        if (this.imageAtlas && this.imageAtlasTexture) {\n            this.imageAtlas.patchUpdatedImages(imageManager, this.imageAtlasTexture, scope);\n        }\n\n        if (!painter || !this.latestFeatureIndex || !this.latestFeatureIndex.rawTileData) {\n            return;\n        }\n        const brightness = painter.style.getBrightness();\n        if (!this._lastUpdatedBrightness && !brightness) {\n            return;\n        }\n        if (this._lastUpdatedBrightness && brightness && Math.abs(this._lastUpdatedBrightness - brightness) < 0.001) {\n            return;\n        }\n        this._lastUpdatedBrightness = brightness;\n        this.updateBuckets(undefined, painter);\n    }\n\n    // Queries non-symbol features rendered for this tile.\n    // Symbol features are queried globally\n    queryRenderedFeatures(layers: {[_: string]: StyleLayer},\n                          serializedLayers: {[string]: Object},\n                          sourceFeatureState: SourceFeatureState,\n                          tileResult: TilespaceQueryGeometry,\n                          params: { filter: FilterSpecification, layers: Array<string>, availableImages: Array<string> },\n                          transform: Transform,\n                          pixelPosMatrix: Float32Array,\n                          visualizeQueryGeometry: boolean): QueryResult {\n        Debug.run(() => {\n            if (visualizeQueryGeometry) {\n                let geometryViz = this.queryGeometryDebugViz;\n                let boundsViz = this.queryBoundsDebugViz;\n                if (!geometryViz) {\n                    geometryViz = this.queryGeometryDebugViz = new TileSpaceDebugBuffer(this.tileSize);\n                }\n                if (!boundsViz) {\n                    boundsViz = this.queryBoundsDebugViz = new TileSpaceDebugBuffer(this.tileSize, Color.blue);\n                }\n\n                geometryViz.addPoints(tileResult.tilespaceGeometry);\n                boundsViz.addPoints(tileResult.bufferedTilespaceGeometry);\n            }\n        });\n\n        if (!this.latestFeatureIndex || !(this.latestFeatureIndex.rawTileData || this.latestFeatureIndex.is3DTile))\n            return {};\n\n        return this.latestFeatureIndex.query({\n            tileResult,\n            pixelPosMatrix,\n            transform,\n            params,\n            tileTransform: this.tileTransform\n        }, layers, serializedLayers, sourceFeatureState);\n    }\n\n    querySourceFeatures(result: Array<QueryFeature>, params: any) {\n        const featureIndex = this.latestFeatureIndex;\n        if (!featureIndex || !featureIndex.rawTileData) return;\n\n        const vtLayers = featureIndex.loadVTLayers();\n\n        const sourceLayer = params ? params.sourceLayer : '';\n        const layer = vtLayers._geojsonTileLayer || vtLayers[sourceLayer];\n\n        if (!layer) return;\n\n        const filter = featureFilter(params && params.filter);\n        const {z, x, y} = this.tileID.canonical;\n        const coord = {z, x, y};\n\n        for (let i = 0; i < layer.length; i++) {\n            const feature = layer.feature(i);\n            if (filter.needGeometry) {\n                const evaluationFeature = toEvaluationFeature(feature, true);\n                // $FlowFixMe[method-unbinding]\n                if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), evaluationFeature, this.tileID.canonical)) continue;\n            // $FlowFixMe[method-unbinding]\n            } else if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), feature)) {\n                continue;\n            }\n            const id = featureIndex.getId(feature, sourceLayer);\n            const geojsonFeature = new GeoJSONFeature(feature, z, x, y, id);\n            geojsonFeature.tile = coord;\n\n            result.push(geojsonFeature);\n        }\n    }\n\n    hasData(): boolean {\n        return this.state === 'loaded' || this.state === 'reloading' || this.state === 'expired';\n    }\n\n    bucketsLoaded(): boolean {\n        for (const id in this.buckets) {\n            if (this.buckets[id].uploadPending())\n                return false;\n        }\n\n        return true;\n    }\n\n    patternsLoaded(): boolean {\n        return !!this.imageAtlas && !!Object.keys(this.imageAtlas.patternPositions).length;\n    }\n\n    setExpiryData(data: any) {\n        const prior = this.expirationTime;\n\n        if (data.cacheControl) {\n            const parsedCC = parseCacheControl(data.cacheControl);\n            if (parsedCC['max-age']) this.expirationTime = Date.now() + parsedCC['max-age'] * 1000;\n        } else if (data.expires) {\n            this.expirationTime = new Date(data.expires).getTime();\n        }\n\n        if (this.expirationTime) {\n            const now = Date.now();\n            let isExpired = false;\n\n            if (this.expirationTime > now) {\n                isExpired = false;\n            } else if (!prior) {\n                isExpired = true;\n            } else if (this.expirationTime < prior) {\n                // Expiring date is going backwards:\n                // fall back to exponential backoff\n                isExpired = true;\n\n            } else {\n                const delta = this.expirationTime - prior;\n\n                if (!delta) {\n                    // Server is serving the same expired resource over and over: fall\n                    // back to exponential backoff.\n                    isExpired = true;\n\n                } else {\n                    // Assume that either the client or the server clock is wrong and\n                    // try to interpolate a valid expiration date (from the client POV)\n                    // observing a minimum timeout.\n                    this.expirationTime = now + Math.max(delta, CLOCK_SKEW_RETRY_TIMEOUT);\n\n                }\n            }\n\n            if (isExpired) {\n                this.expiredRequestCount++;\n                this.state = 'expired';\n            } else {\n                this.expiredRequestCount = 0;\n            }\n        }\n    }\n\n    getExpiryTimeout(): void | number {\n        if (this.expirationTime) {\n            if (this.expiredRequestCount) {\n                return 1000 * (1 << Math.min(this.expiredRequestCount - 1, 31));\n            } else {\n                // Max value for `setTimeout` implementations is a 32 bit integer; cap this accordingly\n                return Math.min(this.expirationTime - new Date().getTime(), Math.pow(2, 31) - 1);\n            }\n        }\n    }\n\n    setFeatureState(states: LayerFeatureStates, painter: ?Painter) {\n        if (!this.latestFeatureIndex ||\n            !this.latestFeatureIndex.rawTileData ||\n            Object.keys(states).length === 0 ||\n            !painter) {\n            return;\n        }\n\n        this.updateBuckets(states, painter);\n    }\n\n    updateBuckets(states: ?LayerFeatureStates, painter: Painter) {\n        if (!this.latestFeatureIndex) return;\n        const vtLayers = this.latestFeatureIndex.loadVTLayers();\n        const availableImages = painter.style.listImages();\n        const brightness = painter.style.getBrightness();\n\n        for (const id in this.buckets) {\n            if (!painter.style.hasLayer(id)) continue;\n\n            const bucket = this.buckets[id];\n            // Buckets are grouped by common source-layer\n            const sourceLayerId = bucket.layers[0]['sourceLayer'] || '_geojsonTileLayer';\n            const sourceLayer = vtLayers[sourceLayerId];\n            let sourceLayerStates = {};\n            if (states) {\n                sourceLayerStates = states[sourceLayerId];\n                if (!sourceLayer || !sourceLayerStates || Object.keys(sourceLayerStates).length === 0) continue;\n            }\n\n            // $FlowFixMe[incompatible-type] Flow can't interpret ImagePosition as SpritePosition for some reason here\n            const imagePositions: SpritePositions = (this.imageAtlas && this.imageAtlas.patternPositions) || {};\n            bucket.update(sourceLayerStates, sourceLayer, availableImages, imagePositions, brightness);\n            if (bucket instanceof LineBucket || bucket instanceof FillBucket) {\n                const sourceCache = painter.style.getOwnSourceCache(bucket.layers[0].source);\n                if (painter._terrain && painter._terrain.enabled && sourceCache && bucket.programConfigurations.needsUpload) {\n                    painter._terrain._clearRenderCacheForTile(sourceCache.id, this.tileID);\n                }\n            }\n            const layer = painter && painter.style && painter.style.getOwnLayer(id);\n            if (layer) {\n                this.queryPadding = Math.max(this.queryPadding, layer.queryRadius(bucket));\n            }\n        }\n    }\n\n    holdingForFade(): boolean {\n        return this.symbolFadeHoldUntil !== undefined;\n    }\n\n    symbolFadeFinished(): boolean {\n        return !this.symbolFadeHoldUntil || this.symbolFadeHoldUntil < browser.now();\n    }\n\n    clearFadeHold() {\n        this.symbolFadeHoldUntil = undefined;\n    }\n\n    setHoldDuration(duration: number) {\n        this.symbolFadeHoldUntil = browser.now() + duration;\n    }\n\n    setTexture(img: TextureImage, painter: Painter) {\n        const context = painter.context;\n        const gl = context.gl;\n        this.texture = this.texture || painter.getTileTexture(img.width);\n        if (this.texture && this.texture instanceof Texture) {\n            this.texture.update(img, {useMipmap: true});\n        } else {\n            this.texture = new Texture(context, img, gl.RGBA, {useMipmap: true});\n            this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n        }\n    }\n\n    setDependencies(namespace: string, dependencies: Array<string>) {\n        const index = {};\n        for (const dep of dependencies) {\n            index[dep] = true;\n        }\n        this.dependencies[namespace] = index;\n    }\n\n    hasDependency(namespaces: Array<string>, keys: Array<string>): boolean {\n        for (const namespace of namespaces) {\n            const dependencies = this.dependencies[namespace];\n            if (dependencies) {\n                for (const key of keys) {\n                    if (dependencies[key]) {\n                        return true;\n                    }\n                }\n            }\n        }\n        return false;\n    }\n\n    clearQueryDebugViz() {\n        Debug.run(() => {\n            if (this.queryGeometryDebugViz) {\n                this.queryGeometryDebugViz.clearPoints();\n            }\n            if (this.queryBoundsDebugViz) {\n                this.queryBoundsDebugViz.clearPoints();\n            }\n        });\n    }\n\n    _makeDebugTileBoundsBuffers(context: Context, projection: Projection) {\n        if (!projection || projection.name === 'mercator' || this._tileDebugBuffer) return;\n\n        // reproject tile outline with adaptive resampling\n        const boundsLine = loadGeometry(BOUNDS_FEATURE, this.tileID.canonical, this.tileTransform)[0];\n\n        // generate vertices for debugging tile boundaries\n        const debugVertices = new PosArray();\n        const debugIndices = new LineStripIndexArray();\n\n        for (let i = 0; i < boundsLine.length; i++) {\n            const {x, y} = boundsLine[i];\n            debugVertices.emplaceBack(x, y);\n            debugIndices.emplaceBack(i);\n        }\n        debugIndices.emplaceBack(0);\n\n        this._tileDebugIndexBuffer = context.createIndexBuffer(debugIndices);\n        this._tileDebugBuffer = context.createVertexBuffer(debugVertices, posAttributes.members);\n        this._tileDebugSegments = SegmentVector.simpleSegment(0, 0, debugVertices.length, debugIndices.length);\n    }\n\n    _makeTileBoundsBuffers(context: Context, projection: Projection) {\n        if (this._tileBoundsBuffer || !projection || projection.name === 'mercator') return;\n\n        // reproject tile outline with adaptive resampling\n        const boundsLine = loadGeometry(BOUNDS_FEATURE, this.tileID.canonical, this.tileTransform)[0];\n\n        let boundsVertices, boundsIndices;\n        if (this.isRaster) {\n            // for raster tiles, generate an adaptive MARTINI mesh\n            const mesh = getTileMesh(this.tileID.canonical, projection);\n            boundsVertices = mesh.vertices;\n            boundsIndices = mesh.indices;\n\n        } else {\n            // for vector tiles, generate an Earcut triangulation of the outline\n            boundsVertices = new TileBoundsArray();\n            boundsIndices = new TriangleIndexArray();\n\n            for (const {x, y} of boundsLine) {\n                boundsVertices.emplaceBack(x, y, 0, 0);\n            }\n            const indices = earcut(boundsVertices.int16, undefined, 4);\n            for (let i = 0; i < indices.length; i += 3) {\n                boundsIndices.emplaceBack(indices[i], indices[i + 1], indices[i + 2]);\n            }\n        }\n        this._tileBoundsBuffer = context.createVertexBuffer(boundsVertices, boundsAttributes.members);\n        this._tileBoundsIndexBuffer = context.createIndexBuffer(boundsIndices);\n        this._tileBoundsSegments = SegmentVector.simpleSegment(0, 0, boundsVertices.length, boundsIndices.length);\n    }\n\n    _makeGlobeTileDebugBuffers(context: Context, transform: Transform) {\n        const projection = transform.projection;\n        if (!projection || projection.name !== 'globe' || transform.freezeTileCoverage) return;\n\n        const id = this.tileID.canonical;\n        const bounds = transitionTileAABBinECEF(id, transform);\n        const normalizationMatrix = globeNormalizeECEF(bounds);\n\n        const phase = globeToMercatorTransition(transform.zoom);\n        let worldToECEFMatrix;\n        if (phase > 0.0) {\n            worldToECEFMatrix = mat4.invert(new Float64Array(16), transform.globeMatrix);\n        }\n\n        this._makeGlobeTileDebugBorderBuffer(context, id, transform, normalizationMatrix, worldToECEFMatrix, phase);\n        this._makeGlobeTileDebugTextBuffer(context, id, transform, normalizationMatrix, worldToECEFMatrix, phase);\n    }\n\n    _globePoint(x: number, y: number, id: CanonicalTileID, tr: Transform, normalizationMatrix: Float64Array, worldToECEFMatrix?: Float64Array, phase: number): Vec3 {\n        // The following is equivalent to doing globe.projectTilePoint.\n        // This way we don't recompute the normalization matrix everytime since it remains the same for all points.\n        let ecef = tileCoordToECEF(x, y, id);\n        if (worldToECEFMatrix) {\n            // When in globe-to-Mercator transition, interpolate between globe and Mercator positions in ECEF\n            const tileCount = 1 << id.z;\n\n            // Wrap tiles to ensure that that Mercator interpolation is in the right direction\n            const camX = mercatorXfromLng(tr.center.lng);\n            const camY = mercatorYfromLat(tr.center.lat);\n\n            const tileCenterX = (id.x + .5) / tileCount;\n            const dx = tileCenterX - camX;\n            let wrap = 0;\n            if (dx > .5) {\n                wrap = -1;\n            } else if (dx < -.5) {\n                wrap = 1;\n            }\n\n            let mercatorX = (x / EXTENT + id.x) / tileCount + wrap;\n            let mercatorY = (y / EXTENT + id.y) / tileCount;\n            mercatorX = (mercatorX - camX) * tr._pixelsPerMercatorPixel + camX;\n            mercatorY = (mercatorY - camY) * tr._pixelsPerMercatorPixel + camY;\n            const mercatorPos = [mercatorX * tr.worldSize, mercatorY * tr.worldSize, 0];\n            vec3.transformMat4(mercatorPos, mercatorPos, worldToECEFMatrix);\n            ecef = interpolateVec3(ecef, mercatorPos, phase);\n        }\n        const gp = vec3.transformMat4(ecef, ecef, normalizationMatrix);\n        return gp;\n    }\n\n    _makeGlobeTileDebugBorderBuffer(context: Context, id: CanonicalTileID, tr: Transform, normalizationMatrix: Float64Array, worldToECEFMatrix?: Float64Array, phase: number) {\n        const vertices = new PosArray();\n        const indices = new LineStripIndexArray();\n        const extraGlobe = new PosGlobeExtArray();\n\n        const addLine = (sx: number, sy: number, ex: number, ey: number, pointCount: number) => {\n            const stepX = (ex - sx) / (pointCount - 1);\n            const stepY = (ey - sy) / (pointCount - 1);\n\n            const vOffset = vertices.length;\n\n            for (let i = 0; i < pointCount; i++) {\n                const x = sx + i * stepX;\n                const y = sy + i * stepY;\n                vertices.emplaceBack(x, y);\n\n                const gp = this._globePoint(x, y, id, tr, normalizationMatrix, worldToECEFMatrix, phase);\n\n                extraGlobe.emplaceBack(gp[0], gp[1], gp[2]);\n                indices.emplaceBack(vOffset + i);\n            }\n        };\n\n        const e = EXTENT;\n        addLine(0, 0, e, 0, 16);\n        addLine(e, 0, e, e, 16);\n        addLine(e, e, 0, e, 16);\n        addLine(0, e, 0, 0, 16);\n\n        this._tileDebugIndexBuffer = context.createIndexBuffer(indices);\n        this._tileDebugBuffer = context.createVertexBuffer(vertices, posAttributes.members);\n        this._globeTileDebugBorderBuffer = context.createVertexBuffer(extraGlobe, posAttributesGlobeExt.members);\n        this._tileDebugSegments = SegmentVector.simpleSegment(0, 0, vertices.length, indices.length);\n    }\n\n    _makeGlobeTileDebugTextBuffer(context: Context, id: CanonicalTileID, tr: Transform, normalizationMatrix: Float64Array, worldToECEFMatrix?: Float64Array, phase: number) {\n        const SEGMENTS = 4;\n        const numVertices = SEGMENTS + 1;\n        const step = EXTENT / SEGMENTS;\n\n        const vertices = new PosArray();\n        const indices = new TriangleIndexArray();\n        const extraGlobe = new PosGlobeExtArray();\n\n        const totalVertices = numVertices * numVertices;\n        const totalTriangles = SEGMENTS * SEGMENTS * 2;\n        indices.reserve(totalTriangles);\n        vertices.reserve(totalVertices);\n        extraGlobe.reserve(totalVertices);\n\n        const toIndex = (j: number, i: number): number => {\n            return totalVertices * j + i;\n        };\n\n        // add vertices.\n        for (let j = 0; j < totalVertices; j++) {\n            const y = j * step;\n            for (let i = 0; i < totalVertices; i++) {\n                const x = i * step;\n                vertices.emplaceBack(x, y);\n\n                const gp = this._globePoint(x, y, id, tr, normalizationMatrix, worldToECEFMatrix, phase);\n                extraGlobe.emplaceBack(gp[0], gp[1], gp[2]);\n            }\n        }\n\n        // add indices.\n        for (let j = 0; j < SEGMENTS; j++) {\n            for (let i = 0; i < SEGMENTS; i++) {\n                const tl = toIndex(j, i);\n                const tr = toIndex(j, i + 1);\n                const bl = toIndex(j + 1, i);\n                const br = toIndex(j + 1, i + 1);\n\n                // first triangle of the sub-patch.\n                indices.emplaceBack(tl, tr, bl);\n\n                // second triangle of the sub-patch.\n                indices.emplaceBack(bl, tr, br);\n            }\n        }\n\n        this._tileDebugTextIndexBuffer = context.createIndexBuffer(indices);\n        this._tileDebugTextBuffer = context.createVertexBuffer(vertices, posAttributes.members);\n        this._globeTileDebugTextBuffer = context.createVertexBuffer(extraGlobe, posAttributesGlobeExt.members);\n        this._tileDebugTextSegments = SegmentVector.simpleSegment(0, 0, totalVertices, totalTriangles);\n    }\n\n    /**\n     * Release data and WebGL resources referenced by this tile.\n     * @returns {undefined}\n     * @private\n     */\n    destroy(preserveTexture: boolean = false) {\n        for (const id in this.buckets) {\n            this.buckets[id].destroy();\n        }\n\n        this.buckets = {};\n\n        if (this.imageAtlas) {\n            this.imageAtlas = null;\n        }\n\n        if (this.lineAtlas) {\n            this.lineAtlas = null;\n        }\n\n        if (this.imageAtlasTexture) {\n            this.imageAtlasTexture.destroy();\n            delete this.imageAtlasTexture;\n        }\n\n        if (this.glyphAtlasTexture) {\n            this.glyphAtlasTexture.destroy();\n            delete this.glyphAtlasTexture;\n        }\n\n        if (this.lineAtlasTexture) {\n            this.lineAtlasTexture.destroy();\n            delete this.lineAtlasTexture;\n        }\n\n        if (this._tileBoundsBuffer) {\n            this._tileBoundsBuffer.destroy();\n            this._tileBoundsIndexBuffer.destroy();\n            this._tileBoundsSegments.destroy();\n            this._tileBoundsBuffer = null;\n        }\n\n        if (this._tileDebugBuffer) {\n            this._tileDebugBuffer.destroy();\n            this._tileDebugSegments.destroy();\n            this._tileDebugBuffer = null;\n        }\n\n        if (this._tileDebugIndexBuffer) {\n            this._tileDebugIndexBuffer.destroy();\n            this._tileDebugIndexBuffer = null;\n        }\n\n        if (this._globeTileDebugBorderBuffer) {\n            this._globeTileDebugBorderBuffer.destroy();\n            this._globeTileDebugBorderBuffer = null;\n        }\n\n        if (this._tileDebugTextBuffer) {\n            this._tileDebugTextBuffer.destroy();\n            this._tileDebugTextSegments.destroy();\n            this._tileDebugTextIndexBuffer.destroy();\n            this._tileDebugTextBuffer = null;\n        }\n\n        if (this._globeTileDebugTextBuffer) {\n            this._globeTileDebugTextBuffer.destroy();\n            this._globeTileDebugTextBuffer = null;\n        }\n\n        if (!preserveTexture && this.texture && this.texture instanceof Texture) {\n            this.texture.destroy();\n            delete this.texture;\n        }\n\n        if (this.hillshadeFBO) {\n            this.hillshadeFBO.destroy();\n            delete this.hillshadeFBO;\n        }\n\n        if (this.dem) {\n            delete this.dem;\n        }\n\n        if (this.neighboringTiles) {\n            delete this.neighboringTiles;\n        }\n\n        if (this.demTexture) {\n            this.demTexture.destroy();\n            delete this.demTexture;\n        }\n\n        if (this.rasterParticleState) {\n            this.rasterParticleState.destroy();\n            delete this.rasterParticleState;\n        }\n\n        Debug.run(() => {\n            if (this.queryGeometryDebugViz) {\n                this.queryGeometryDebugViz.unload();\n                delete this.queryGeometryDebugViz;\n            }\n            if (this.queryBoundsDebugViz) {\n                this.queryBoundsDebugViz.unload();\n                delete this.queryBoundsDebugViz;\n            }\n        });\n        this.latestFeatureIndex = null;\n        this.state = 'unloaded';\n    }\n}\n\nexport default Tile;\n","// @flow\n\n// Import FeatureIndex as a module with side effects to ensure\n// it's registered as a serializable class on the main thread\nimport './feature_index.js';\n\nimport type {CollisionBoxArray} from './array_types.js';\nimport type Style from '../style/style.js';\nimport type {TypedStyleLayer} from '../style/style_layer/typed_style_layer.js';\nimport type FeatureIndex from './feature_index.js';\nimport type Context from '../gl/context.js';\nimport type {FeatureStates} from '../source/source_state.js';\nimport type {SpritePositions} from '../util/image.js';\nimport type LineAtlas from '../render/line_atlas.js';\nimport type {CanonicalTileID} from '../source/tile_id.js';\nimport type {TileTransform} from '../geo/projection/tile_transform.js';\nimport type Point from '@mapbox/point-geometry';\nimport type {ProjectionSpecification} from '../style-spec/types.js';\nimport type {IVectorTileFeature, IVectorTileLayer} from '@mapbox/vector-tile';\n\nexport type BucketParameters<Layer: TypedStyleLayer> = {\n    index: number,\n    layers: Array<Layer>,\n    zoom: number,\n    canonical: CanonicalTileID,\n    pixelRatio: number,\n    overscaling: number,\n    collisionBoxArray: CollisionBoxArray,\n    sourceLayerIndex: number,\n    sourceID: string,\n    projection: ProjectionSpecification\n}\n\nexport type PopulateParameters = {\n    featureIndex: FeatureIndex,\n    iconDependencies: {},\n    patternDependencies: {},\n    glyphDependencies: {},\n    availableImages: Array<string>,\n    lineAtlas: LineAtlas,\n    brightness: ?number,\n}\n\nexport type IndexedFeature = {\n    feature: IVectorTileFeature,\n    id: number | string | void,\n    index: number,\n    sourceLayerIndex: number,\n}\n\nexport type BucketFeature = {|\n    index: number,\n    sourceLayerIndex: number,\n    geometry: Array<Array<Point>>,\n    properties: Object,\n    type: 1 | 2 | 3,\n    id?: any,\n    +patterns: {[_: string]: string},\n    sortKey?: number\n|};\n\n/**\n * The `Bucket` interface is the single point of knowledge about turning vector\n * tiles into WebGL buffers.\n *\n * `Bucket` is an abstract interface. An implementation exists for each style layer type.\n * Create a bucket via the `StyleLayer#createBucket` method.\n *\n * The concrete bucket types, using layout options from the style layer,\n * transform feature geometries into vertex and index data for use by the\n * vertex shader.  They also (via `ProgramConfiguration`) use feature\n * properties and the zoom level to populate the attributes needed for\n * data-driven styling.\n *\n * Buckets are designed to be built on a worker thread and then serialized and\n * transferred back to the main thread for rendering.  On the worker side, a\n * bucket's vertex, index, and attribute data is stored in `bucket.arrays:\n * ArrayGroup`.  When a bucket's data is serialized and sent back to the main\n * thread, is gets deserialized (using `new Bucket(serializedBucketData)`, with\n * the array data now stored in `bucket.buffers: BufferGroup`.  BufferGroups\n * hold the same data as ArrayGroups, but are tuned for consumption by WebGL.\n *\n * @private\n */\nexport interface Bucket {\n    layerIds: Array<string>;\n    hasPattern: boolean;\n    +layers: Array<any>;\n    +stateDependentLayers: Array<any>;\n    +stateDependentLayerIds: Array<string>;\n    populate(features: Array<IndexedFeature>, options: PopulateParameters, canonical: CanonicalTileID, tileTransform: TileTransform): void;\n    update(states: FeatureStates, vtLayer: IVectorTileLayer, availableImages: Array<string>, imagePositions: SpritePositions, brightness: ?number): void;\n    isEmpty(): boolean;\n\n    upload(context: Context): void;\n    uploadPending(): boolean;\n\n    /**\n     * Release the WebGL resources associated with the buffers. Note that because\n     * buckets are shared between layers having the same layout properties, they\n     * must be destroyed in groups (all buckets for a tile, or all symbol buckets).\n     *\n     * @private\n     */\n    destroy(): void;\n}\n\nexport function deserialize(input: Array<Bucket>, style: Style): {[_: string]: Bucket} {\n    const output = {};\n\n    // Guard against the case where the map's style has been set to null while\n    // this bucket has been parsing.\n    if (!style) return output;\n\n    for (const bucket of input) {\n        const layers = bucket.layerIds\n            .map((id) => style.getLayer(id))\n            .filter(Boolean);\n\n        if (layers.length === 0) {\n            continue;\n        }\n\n        // look up StyleLayer objects from layer ids (since we don't\n        // want to waste time serializing/copying them from the worker)\n        (bucket: any).layers = layers;\n        if (bucket.stateDependentLayerIds) {\n            (bucket: any).stateDependentLayers = bucket.stateDependentLayerIds.map((lId) => layers.filter((l) => l.id === lId)[0]);\n        }\n        for (const layer of layers) {\n            output[layer.fqid] = bucket;\n        }\n    }\n\n    return output;\n}\n","// @flow\n\nimport {bindAll} from '../util/util.js';\n\nimport type Dispatcher from '../util/dispatcher.js';\nimport type {Event, Evented} from '../util/evented.js';\nimport type {Map} from '../ui/map.js';\nimport type Tile from './tile.js';\nimport type {OverscaledTileID} from './tile_id.js';\nimport type {Callback} from '../types/callback.js';\nimport type {MapEvent} from '../ui/events.js';\nimport {CanonicalTileID} from './tile_id.js';\n\nimport type {Class} from '../types/class.js';\n\nexport type SourceRasterLayer = {\n    id: string;\n    maxzoom?: number;\n    minzoom?: number;\n    fields?: {\n        bands?: Array<string | number>;\n        range?: [number, number];\n    };\n};\n\nexport type SourceVectorLayer = {\n    id: string;\n    maxzoom?: number;\n    minzoom?: number;\n};\n\n/**\n * The `Source` interface must be implemented by each source type, including \"core\" types like `vector`, `raster`,\n * or `video`) and all custom, third-party types.\n *\n * @private\n *\n * @param {string} id The id for the source. Must not be used by any existing source.\n * @param {Object} options Source options, specific to the source type (except for `options.type`, which is always\n * required).\n * @param {string} options.type The source type, matching the value of `name` used in {@link Style#addSourceType}.\n * @param {Dispatcher} dispatcher A {@link Dispatcher} instance, which can be used to send messages to the workers.\n *\n * @fires Map.event:data Fires `data` with `{dataType: 'source', sourceDataType: 'metadata'}`\n * to indicate that any necessary metadata has been loaded so that it's okay to call `loadTile`;\n * fires `data` with `{dataType: 'source', sourceDataType: 'content'}`\n * to indicate that the source data has changed, so that any current caches should be flushed.\n * @property {string} id The id for the source.  Must match the id passed to the constructor.\n * @property {number} minzoom\n * @property {number} maxzoom\n * @property {boolean} isTileClipped `false` if tiles can be drawn outside their boundaries, `true` if they cannot.\n * @property {boolean} reparseOverscaled `true` if tiles should be sent back to the worker for each overzoomed zoom\n * level, `false` if not.\n * @property {boolean} roundZoom `true` if zoom levels are rounded to the nearest integer in the source data, `false`\n * if they are floor-ed to the nearest integer.\n */\nexport interface Source {\n    +type: string;\n    id: string;\n    scope: string;\n    minzoom: number,\n    maxzoom: number,\n    tileSize: number,\n    attribution?: string,\n\n    roundZoom?: boolean,\n    isTileClipped?: boolean,\n    mapbox_logo?: boolean,\n    tileID?: CanonicalTileID;\n    reparseOverscaled?: boolean,\n    minTileCacheSize?: ?number;\n    maxTileCacheSize?: ?number;\n    language?: ?string;\n    worldview?: ?string;\n    +usedInConflation?: boolean;\n\n    vectorLayers?: Array<SourceVectorLayer>;\n    vectorLayerIds?: Array<string>;\n    rasterLayers?: Array<SourceRasterLayer>;\n    rasterLayerIds?: Array<string>;\n\n    hasTransition(): boolean;\n    loaded(): boolean;\n\n    fire(event: Event): mixed;\n    on(type: MapEvent, listener: (Object) => any): Evented;\n    off(type: MapEvent, listener: (Object) => any): Evented;\n    setEventedParent(parent: ?Evented, data?: Object | () => Object): Evented;\n\n    +onAdd?: (map: Map) => void;\n    +onRemove?: (map: Map) => void;\n\n    loadTile(tile: Tile, callback: Callback<void>, tileWorkers?: {[string]: Actor}): void;\n    +hasTile?: (tileID: OverscaledTileID) => boolean;\n    +abortTile?: (tile: Tile, callback: Callback<void>) => void;\n    +unloadTile?: (tile: Tile, callback: Callback<void>) => void;\n    +reload?: () => void;\n\n    /**\n     * @returns A plain (stringifiable) JS object representing the current state of the source.\n     * Creating a source using the returned object as the `options` should result in a Source that is\n     * equivalent to this one.\n     * @private\n     */\n    serialize(): Object;\n\n    +prepare?: () => void;\n\n    +afterUpdate?: () => void;\n    +_clear?: () => void;\n}\n\ntype SourceStatics = {\n    /*\n     * An optional URL to a script which, when run by a Worker, registers a {@link WorkerSource}\n     * implementation for this Source type by calling `self.registerWorkerSource(workerSource: WorkerSource)`.\n     */\n    workerSourceURL?: URL;\n};\n\nexport type SourceClass = Class<Source> & SourceStatics;\n\nimport vector from '../source/vector_tile_source.js';\nimport raster from '../source/raster_tile_source.js';\nimport rasterDem from '../source/raster_dem_tile_source.js';\nimport rasterArray from '../source/raster_array_tile_source.js';\nimport geojson from '../source/geojson_source.js';\nimport video from '../source/video_source.js';\nimport image from '../source/image_source.js';\nimport canvas from '../source/canvas_source.js';\nimport custom from '../source/custom_source.js';\nimport model from '../../3d-style/source/model_source.js';\nimport tiled3DModel from '../../3d-style/source/tiled_3d_model_source.js';\nimport type {SourceSpecification} from '../style-spec/types.js';\n\nconst sourceTypes: {[string]: Class<Source>} = {\n    vector,\n    raster,\n    'raster-dem': rasterDem,\n    'raster-array': rasterArray,\n    geojson,\n    video,\n    image,\n    model,\n    'batched-model': tiled3DModel,\n    canvas,\n    custom\n};\n\n/*\n * Creates a tiled data source instance given an options object.\n *\n * @param id\n * @param {Object} source A source definition object compliant with\n * [`mapbox-gl-style-spec`](https://www.mapbox.com/mapbox-gl-style-spec/#sources) or, for a third-party source type,\n  * with that type's requirements.\n * @param {Dispatcher} dispatcher\n * @returns {Source}\n */\nexport const create = function(id: string, specification: SourceSpecification, dispatcher: Dispatcher, eventedParent: Evented): Source {\n    // $FlowFixMe[prop-missing]\n    const source = new sourceTypes[specification.type](id, specification, dispatcher, eventedParent);\n\n    if (source.id !== id) {\n        throw new Error(`Expected Source id to be ${id} instead of ${source.id}`);\n    }\n\n    bindAll(['load', 'abort', 'unload', 'serialize', 'prepare'], source);\n    return source;\n};\n\nexport const getType = function (name: string): Class<Source> {\n    return sourceTypes[name];\n};\n\nexport const setType = function (name: string, type: Class<Source>) {\n    sourceTypes[name] = type;\n};\n\nexport interface Actor {\n    send(type: string, data: Object, callback: Callback<any>): void;\n}\n","// @flow\n\nimport {getImage, ResourceType} from '../util/ajax.js';\nimport {extend, prevPowerOfTwo} from '../util/util.js';\nimport {Evented} from '../util/evented.js';\nimport browser from '../util/browser.js';\nimport offscreenCanvasSupported from '../util/offscreen_canvas_supported.js';\nimport {OverscaledTileID} from './tile_id.js';\nimport RasterTileSource from './raster_tile_source.js';\n\n// Import DEMData as a module with side effects to ensure\n// it's registered as a serializable class on the main thread\nimport '../data/dem_data.js';\n\nimport type DEMData from '../data/dem_data.js';\nimport type {Source} from './source.js';\nimport type Dispatcher from '../util/dispatcher.js';\nimport type Tile from './tile.js';\nimport type {Callback} from '../types/callback.js';\nimport type {TextureImage} from '../render/texture.js';\nimport type {RasterDEMSourceSpecification} from '../style-spec/types.js';\n\n// $FlowFixMe[method-unbinding]\nclass RasterDEMTileSource extends RasterTileSource implements Source {\n    encoding: \"mapbox\" | \"terrarium\";\n\n    constructor(id: string, options: RasterDEMSourceSpecification, dispatcher: Dispatcher, eventedParent: Evented) {\n        super(id, options, dispatcher, eventedParent);\n        this.type = 'raster-dem';\n        this.maxzoom = 22;\n        this._options = extend({type: 'raster-dem'}, options);\n        this.encoding = options.encoding || \"mapbox\";\n    }\n\n    loadTile(tile: Tile, callback: Callback<void>) {\n        const url = this.map._requestManager.normalizeTileURL(tile.tileID.canonical.url(this.tiles, this.scheme), false, this.tileSize);\n        tile.request = getImage(this.map._requestManager.transformRequest(url, ResourceType.Tile), imageLoaded.bind(this));\n\n        // $FlowFixMe[missing-this-annot]\n        function imageLoaded(err: ?Error, img: ?TextureImage, cacheControl: ?string, expires: ?string) {\n            delete tile.request;\n            if (tile.aborted) {\n                tile.state = 'unloaded';\n                callback(null);\n            } else if (err) {\n                tile.state = 'errored';\n                callback(err);\n            } else if (img) {\n                if (this.map._refreshExpiredTiles) tile.setExpiryData({cacheControl, expires});\n                const transfer = ImageBitmap && img instanceof ImageBitmap && offscreenCanvasSupported();\n                // DEMData uses 1px padding. Handle cases with image buffer of 1 and 2 pxs, the rest assume default buffer 0\n                // in order to keep the previous implementation working (no validation against tileSize).\n                const buffer = (img.width - prevPowerOfTwo(img.width)) / 2;\n                // padding is used in getImageData. As DEMData has 1px padding, if DEM tile buffer is 2px, discard outermost pixels.\n                const padding = 1 - buffer;\n                const borderReady = padding < 1;\n                if (!borderReady && !tile.neighboringTiles) {\n                    tile.neighboringTiles = this._getNeighboringTiles(tile.tileID);\n                }\n\n                // $FlowFixMe[incompatible-call]\n                const rawImageData = transfer ? img : browser.getImageData(img, padding);\n                const params = {\n                    uid: tile.uid,\n                    coord: tile.tileID,\n                    source: this.id,\n                    scope: this.scope,\n                    rawImageData,\n                    encoding: this.encoding,\n                    padding\n                };\n\n                if (!tile.actor || tile.state === 'expired') {\n                    tile.actor = this.dispatcher.getActor();\n                    tile.actor.send('loadDEMTile', params, done.bind(this), undefined, true);\n                }\n            }\n        }\n\n        // $FlowFixMe[missing-this-annot]\n        function done(err: ?Error, dem: ?DEMData) {\n            if (err) {\n                tile.state = 'errored';\n                callback(err);\n            }\n\n            if (dem) {\n                tile.dem = dem;\n                tile.dem.onDeserialize();\n                tile.needsHillshadePrepare = true;\n                tile.needsDEMTextureUpload = true;\n                tile.state = 'loaded';\n                callback(null);\n            }\n        }\n    }\n\n    _getNeighboringTiles(tileID: OverscaledTileID): {[number]: {backfilled: boolean}} {\n        const canonical = tileID.canonical;\n        const dim = Math.pow(2, canonical.z);\n\n        const px = (canonical.x - 1 + dim) % dim;\n        const pxw = canonical.x === 0 ? tileID.wrap - 1 : tileID.wrap;\n        const nx = (canonical.x + 1 + dim) % dim;\n        const nxw = canonical.x + 1 === dim ? tileID.wrap + 1 : tileID.wrap;\n\n        const neighboringTiles = {};\n        // add adjacent tiles\n        neighboringTiles[new OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y).key] = {backfilled: false};\n        neighboringTiles[new OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y).key] = {backfilled: false};\n\n        // Add upper neighboringTiles\n        if (canonical.y > 0) {\n            neighboringTiles[new OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y - 1).key] = {backfilled: false};\n            neighboringTiles[new OverscaledTileID(tileID.overscaledZ, tileID.wrap, canonical.z, canonical.x, canonical.y - 1).key] = {backfilled: false};\n            neighboringTiles[new OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y - 1).key] = {backfilled: false};\n        }\n        // Add lower neighboringTiles\n        if (canonical.y + 1 < dim) {\n            neighboringTiles[new OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y + 1).key] = {backfilled: false};\n            neighboringTiles[new OverscaledTileID(tileID.overscaledZ, tileID.wrap, canonical.z, canonical.x, canonical.y + 1).key] = {backfilled: false};\n            neighboringTiles[new OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y + 1).key] = {backfilled: false};\n        }\n\n        return neighboringTiles;\n    }\n}\n\nexport default RasterDEMTileSource;\n","// @flow\n\nimport {Event, ErrorEvent, Evented} from '../util/evented.js';\n\nimport {extend} from '../util/util.js';\nimport EXTENT from '../style-spec/data/extent.js';\nimport {ResourceType} from '../util/ajax.js';\nimport browser from '../util/browser.js';\n\nimport type {Source} from './source.js';\nimport type {Map} from '../ui/map.js';\nimport type Dispatcher from '../util/dispatcher.js';\nimport type Tile from './tile.js';\nimport type Actor from '../util/actor.js';\nimport type {Callback} from '../types/callback.js';\nimport type {GeoJSONWorkerOptions} from './geojson_worker_source.js';\nimport type {GeoJSON, GeoJSONFeature} from '@mapbox/geojson-types';\nimport type {GeoJSONSourceSpecification, PromoteIdSpecification} from '../style-spec/types.js';\nimport type {Cancelable} from '../types/cancelable.js';\n\n/**\n * A source containing GeoJSON.\n * See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-geojson) for detailed documentation of options.\n *\n * @example\n * map.addSource('some id', {\n *     type: 'geojson',\n *     data: 'https://d2ad6b4ur7yvpq.cloudfront.net/naturalearth-3.3.0/ne_10m_ports.geojson'\n * });\n *\n * @example\n * map.addSource('some id', {\n *     type: 'geojson',\n *     data: {\n *         \"type\": \"FeatureCollection\",\n *         \"features\": [{\n *             \"type\": \"Feature\",\n *             \"properties\": {},\n *             \"geometry\": {\n *                 \"type\": \"Point\",\n *                 \"coordinates\": [\n *                     -76.53063297271729,\n *                     39.18174077994108\n *                 ]\n *             }\n *         }]\n *     }\n * });\n *\n * @example\n * map.getSource('some id').setData({\n *     \"type\": \"FeatureCollection\",\n *     \"features\": [{\n *         \"type\": \"Feature\",\n *         \"properties\": {\"name\": \"Null Island\"},\n *         \"geometry\": {\n *             \"type\": \"Point\",\n *             \"coordinates\": [ 0, 0 ]\n *         }\n *     }]\n * });\n * @see [Example: Draw GeoJSON points](https://www.mapbox.com/mapbox-gl-js/example/geojson-markers/)\n * @see [Example: Add a GeoJSON line](https://www.mapbox.com/mapbox-gl-js/example/geojson-line/)\n * @see [Example: Create a heatmap from points](https://www.mapbox.com/mapbox-gl-js/example/heatmap/)\n * @see [Example: Create and style clusters](https://www.mapbox.com/mapbox-gl-js/example/cluster/)\n */\nclass GeoJSONSource extends Evented implements Source {\n    type: 'geojson';\n    id: string;\n    scope: string;\n    minzoom: number;\n    maxzoom: number;\n    tileSize: number;\n    attribution: string | void;\n    promoteId: ?PromoteIdSpecification;\n\n    isTileClipped: boolean | void;\n    reparseOverscaled: boolean | void;\n    _data: GeoJSON | string;\n    _options: GeoJSONSourceSpecification;\n    workerOptions: GeoJSONWorkerOptions;\n    map: Map;\n    actor: Actor;\n    _loaded: boolean;\n    _coalesce: ?boolean;\n    _metadataFired: ?boolean;\n    _collectResourceTiming: boolean;\n    _pendingLoad: ?Cancelable;\n\n    /**\n     * @private\n     */\n    constructor(id: string, options: GeoJSONSourceSpecification & {workerOptions?: GeoJSONWorkerOptions, collectResourceTiming: boolean}, dispatcher: Dispatcher, eventedParent: Evented) {\n        super();\n\n        this.id = id;\n\n        // `type` is a property rather than a constant to make it easy for 3rd\n        // parties to use GeoJSONSource to build their own source types.\n        this.type = 'geojson';\n\n        this.minzoom = 0;\n        this.maxzoom = 18;\n        this.tileSize = 512;\n        this.isTileClipped = true;\n        this.reparseOverscaled = true;\n        this._loaded = false;\n\n        this.actor = dispatcher.getActor();\n        this.setEventedParent(eventedParent);\n\n        this._data = (options.data: any);\n        this._options = extend({}, options);\n\n        this._collectResourceTiming = options.collectResourceTiming;\n\n        if (options.maxzoom !== undefined) this.maxzoom = options.maxzoom;\n        if (options.minzoom !== undefined) this.minzoom = options.minzoom;\n        if (options.type) this.type = options.type;\n        if (options.attribution) this.attribution = options.attribution;\n        this.promoteId = options.promoteId;\n\n        const scale = EXTENT / this.tileSize;\n\n        // sent to the worker, along with `url: ...` or `data: literal geojson`,\n        // so that it can load/parse/index the geojson data\n        // extending with `options.workerOptions` helps to make it easy for\n        // third-party sources to hack/reuse GeoJSONSource.\n        this.workerOptions = extend({\n            source: this.id,\n            scope: this.scope,\n            cluster: options.cluster || false,\n            geojsonVtOptions: {\n                buffer: (options.buffer !== undefined ? options.buffer : 128) * scale,\n                tolerance: (options.tolerance !== undefined ? options.tolerance : 0.375) * scale,\n                extent: EXTENT,\n                maxZoom: this.maxzoom,\n                lineMetrics: options.lineMetrics || false,\n                generateId: options.generateId || false\n            },\n            superclusterOptions: {\n                maxZoom: options.clusterMaxZoom !== undefined ? options.clusterMaxZoom : this.maxzoom - 1,\n                minPoints: Math.max(2, options.clusterMinPoints || 2),\n                extent: EXTENT,\n                radius: (options.clusterRadius !== undefined ? options.clusterRadius : 50) * scale,\n                log: false,\n                generateId: options.generateId || false\n            },\n            clusterProperties: options.clusterProperties,\n            filter: options.filter,\n            dynamic: options.dynamic\n        }, options.workerOptions);\n    }\n\n    // $FlowFixMe[method-unbinding]\n    onAdd(map: Map) {\n        this.map = map;\n        this.setData(this._data);\n    }\n\n    /**\n     * Sets the GeoJSON data and re-renders the map.\n     *\n     * @param {Object | string} data A GeoJSON data object or a URL to one. The latter is preferable in the case of large GeoJSON files.\n     * @returns {GeoJSONSource} Returns itself to allow for method chaining.\n     * @example\n     * map.addSource('source_id', {\n     *     type: 'geojson',\n     *     data: {\n     *         type: 'FeatureCollection',\n     *         features: []\n     *     }\n     * });\n     * const geojsonSource = map.getSource('source_id');\n     * // Update the data after the GeoJSON source was created\n     * geojsonSource.setData({\n     *     \"type\": \"FeatureCollection\",\n     *     \"features\": [{\n     *         \"type\": \"Feature\",\n     *         \"properties\": {\"name\": \"Null Island\"},\n     *         \"geometry\": {\n     *             \"type\": \"Point\",\n     *             \"coordinates\": [ 0, 0 ]\n     *         }\n     *     }]\n     * });\n     */\n    setData(data: GeoJSON | string): this {\n        this._data = data;\n        this._updateWorkerData();\n        return this;\n    }\n\n    /**\n     * Updates the existing GeoJSON data with new features and re-renders the map.\n     * Can only be used on sources with `dynamic: true` in options.\n     * Updates features by their IDs:\n     *\n     * - If there's a feature with the same ID, overwrite it.\n     * - If there's a feature with the same ID but the new one's geometry is `null`, remove it\n     * - If there's no such ID in existing data, add it as a new feature.\n     *\n     * @param {Object | string} data A GeoJSON data object or a URL to one.\n     * @returns {GeoJSONSource} Returns itself to allow for method chaining.\n     * @example\n     * // Update the feature with ID=123 in the existing GeoJSON source\n     * map.getSource('source_id').updateData({\n     *     \"type\": \"FeatureCollection\",\n     *     \"features\": [{\n     *         \"id\": 123,\n     *         \"type\": \"Feature\",\n     *         \"properties\": {\"name\": \"Null Island\"},\n     *         \"geometry\": {\n     *             \"type\": \"Point\",\n     *             \"coordinates\": [ 0, 0 ]\n     *         }\n     *     }]\n     * });\n     */\n    updateData(data: GeoJSON | string): this {\n        if (!this._options.dynamic) {\n            return this.fire(new ErrorEvent(new Error(\"Can't call updateData on a GeoJSON source with dynamic set to false.\")));\n        }\n        this._data = data;\n        this._updateWorkerData(true);\n        return this;\n    }\n\n    /**\n     * For clustered sources, fetches the zoom at which the given cluster expands.\n     *\n     * @param {number} clusterId The value of the cluster's `cluster_id` property.\n     * @param {Function} callback A callback to be called when the zoom value is retrieved (`(error, zoom) => { ... }`).\n     * @returns {GeoJSONSource} Returns itself to allow for method chaining.\n     * @example\n     * // Assuming the map has a layer named 'clusters' and a source 'earthquakes'\n     * // The following creates a camera animation on cluster feature click\n     * // the clicked layer should be filtered to only include clusters, e.g. `filter: ['has', 'point_count']`\n     * map.on('click', 'clusters', (e) => {\n     *     const features = map.queryRenderedFeatures(e.point, {\n     *         layers: ['clusters']\n     *     });\n     *\n     *     const clusterId = features[0].properties.cluster_id;\n     *\n     *     // Ease the camera to the next cluster expansion\n     *     map.getSource('earthquakes').getClusterExpansionZoom(\n     *         clusterId,\n     *         (err, zoom) => {\n     *             if (!err) {\n     *                 map.easeTo({\n     *                     center: features[0].geometry.coordinates,\n     *                     zoom\n     *                 });\n     *             }\n     *         }\n     *     );\n     * });\n     */\n    getClusterExpansionZoom(clusterId: number, callback: Callback<number>): this {\n        this.actor.send('geojson.getClusterExpansionZoom', {clusterId, source: this.id, scope: this.scope}, callback);\n        return this;\n    }\n\n    /**\n     * For clustered sources, fetches the children of the given cluster on the next zoom level (as an array of GeoJSON features).\n     *\n     * @param {number} clusterId The value of the cluster's `cluster_id` property.\n     * @param {Function} callback A callback to be called when the features are retrieved (`(error, features) => { ... }`).\n     * @returns {GeoJSONSource} Returns itself to allow for method chaining.\n     * @example\n     * // Retrieve cluster children on click\n     * // the clicked layer should be filtered to only include clusters, e.g. `filter: ['has', 'point_count']`\n     * map.on('click', 'clusters', (e) => {\n     *     const features = map.queryRenderedFeatures(e.point, {\n     *         layers: ['clusters']\n     *     });\n     *\n     *     const clusterId = features[0].properties.cluster_id;\n     *\n     *     clusterSource.getClusterChildren(clusterId, (error, features) => {\n     *         if (!error) {\n     *             console.log('Cluster children:', features);\n     *         }\n     *     });\n     * });\n     */\n    getClusterChildren(clusterId: number, callback: Callback<Array<GeoJSONFeature>>): this {\n        this.actor.send('geojson.getClusterChildren', {clusterId, source: this.id, scope: this.scope}, callback);\n        return this;\n    }\n\n    /**\n     * For clustered sources, fetches the original points that belong to the cluster (as an array of GeoJSON features).\n     *\n     * @param {number} clusterId The value of the cluster's `cluster_id` property.\n     * @param {number} limit The maximum number of features to return. Defaults to `10` if a falsy value is given.\n     * @param {number} offset The number of features to skip (for example, for pagination). Defaults to `0` if a falsy value is given.\n     * @param {Function} callback A callback to be called when the features are retrieved (`(error, features) => { ... }`).\n     * @returns {GeoJSONSource} Returns itself to allow for method chaining.\n     * @example\n     * // Retrieve cluster leaves on click\n     * // the clicked layer should be filtered to only include clusters, e.g. `filter: ['has', 'point_count']`\n     * map.on('click', 'clusters', (e) => {\n     *     const features = map.queryRenderedFeatures(e.point, {\n     *         layers: ['clusters']\n     *     });\n     *\n     *     const clusterId = features[0].properties.cluster_id;\n     *     const pointCount = features[0].properties.point_count;\n     *     const clusterSource = map.getSource('clusters');\n     *\n     *     clusterSource.getClusterLeaves(clusterId, pointCount, 0, (error, features) => {\n     *     // Print cluster leaves in the console\n     *         console.log('Cluster leaves:', error, features);\n     *     });\n     * });\n     */\n    getClusterLeaves(clusterId: number, limit: number, offset: number, callback: Callback<Array<GeoJSONFeature>>): this {\n        this.actor.send('geojson.getClusterLeaves', {\n            source: this.id,\n            scope: this.scope,\n            clusterId,\n            limit,\n            offset\n        }, callback);\n        return this;\n    }\n\n    /*\n     * Responsible for invoking WorkerSource's geojson.loadData target, which\n     * handles loading the geojson data and preparing to serve it up as tiles,\n     * using geojson-vt or supercluster as appropriate.\n     */\n    _updateWorkerData(append: boolean = false) {\n        // if there's an earlier loadData to finish, wait until it finishes and then do another update\n        if (this._pendingLoad) {\n            this._coalesce = true;\n            return;\n        }\n\n        this.fire(new Event('dataloading', {dataType: 'source'}));\n\n        this._loaded = false;\n        const options = extend({append}, this.workerOptions);\n        options.scope = this.scope;\n        const data = this._data;\n        if (typeof data === 'string') {\n            options.request = this.map._requestManager.transformRequest(browser.resolveURL(data), ResourceType.Source);\n            options.request.collectResourceTiming = this._collectResourceTiming;\n        } else {\n            options.data = JSON.stringify(data);\n        }\n\n        // target {this.type}.loadData rather than literally geojson.loadData,\n        // so that other geojson-like source types can easily reuse this\n        // implementation\n        this._pendingLoad = this.actor.send(`${this.type}.loadData`, options, (err, result) => {\n            this._loaded = true;\n            this._pendingLoad = null;\n\n            if (err) {\n                this.fire(new ErrorEvent(err));\n\n            } else {\n                // although GeoJSON sources contain no metadata, we fire this event at first\n                // to let the SourceCache know its ok to start requesting tiles.\n                const data: Object = {dataType: 'source', sourceDataType: this._metadataFired ? 'content' : 'metadata'};\n                if (this._collectResourceTiming && result && result.resourceTiming && result.resourceTiming[this.id]) {\n                    data.resourceTiming = result.resourceTiming[this.id];\n                }\n                this.fire(new Event('data', data));\n                this._metadataFired = true;\n            }\n\n            if (this._coalesce) {\n                this._updateWorkerData(append);\n                this._coalesce = false;\n            }\n        });\n    }\n\n    loaded(): boolean {\n        return this._loaded;\n    }\n\n    loadTile(tile: Tile, callback: Callback<void>) {\n        const message = !tile.actor ? 'loadTile' : 'reloadTile';\n        tile.actor = this.actor;\n        const params = {\n            type: this.type,\n            uid: tile.uid,\n            tileID: tile.tileID,\n            tileZoom: tile.tileZoom,\n            zoom: tile.tileID.overscaledZ,\n            maxZoom: this.maxzoom,\n            tileSize: this.tileSize,\n            source: this.id,\n            scope: this.scope,\n            pixelRatio: browser.devicePixelRatio,\n            showCollisionBoxes: this.map.showCollisionBoxes,\n            promoteId: this.promoteId,\n            brightness: this.map.style ? (this.map.style.getBrightness() || 0.0) : 0.0\n        };\n\n        tile.request = this.actor.send(message, params, (err, data) => {\n            delete tile.request;\n            tile.destroy();\n\n            if (tile.aborted) {\n                return callback(null);\n            }\n\n            if (err) {\n                return callback(err);\n            }\n\n            tile.loadVectorData(data, this.map.painter, message === 'reloadTile');\n\n            return callback(null);\n        }, undefined, message === 'loadTile');\n    }\n\n    // $FlowFixMe[method-unbinding]\n    abortTile(tile: Tile) {\n        if (tile.request) {\n            tile.request.cancel();\n            delete tile.request;\n        }\n        tile.aborted = true;\n    }\n\n    // $FlowFixMe[method-unbinding]\n    unloadTile(tile: Tile) {\n        this.actor.send('removeTile', {uid: tile.uid, type: this.type, source: this.id, scope: this.scope});\n        tile.destroy();\n    }\n\n    // $FlowFixMe[method-unbinding]\n    onRemove() {\n        if (this._pendingLoad) {\n            this._pendingLoad.cancel();\n        }\n    }\n\n    serialize(): GeoJSONSourceSpecification {\n        return extend({}, this._options, {\n            type: this.type,\n            data: this._data\n        });\n    }\n\n    hasTransition(): boolean {\n        return false;\n    }\n}\n\nexport default GeoJSONSource;\n","// @flow\n\nimport {getVideo, ResourceType} from '../util/ajax.js';\n\nimport ImageSource from './image_source.js';\nimport Texture from '../render/texture.js';\nimport {ErrorEvent} from '../util/evented.js';\nimport ValidationError from '../style-spec/error/validation_error.js';\n\nimport type {Map} from '../ui/map.js';\nimport type Dispatcher from '../util/dispatcher.js';\nimport type {Evented} from '../util/evented.js';\nimport type {VideoSourceSpecification} from '../style-spec/types.js';\n\n/**\n * A data source containing video.\n * See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-video) for detailed documentation of options.\n *\n * @example\n * // add to map\n * map.addSource('some id', {\n *     type: 'video',\n *     url: [\n *         'https://www.mapbox.com/blog/assets/baltimore-smoke.mp4',\n *         'https://www.mapbox.com/blog/assets/baltimore-smoke.webm'\n *     ],\n *     coordinates: [\n *         [-76.54, 39.18],\n *         [-76.52, 39.18],\n *         [-76.52, 39.17],\n *         [-76.54, 39.17]\n *     ]\n * });\n *\n * // update\n * const mySource = map.getSource('some id');\n * mySource.setCoordinates([\n *     [-76.54335737228394, 39.18579907229748],\n *     [-76.52803659439087, 39.1838364847587],\n *     [-76.5295386314392, 39.17683392507606],\n *     [-76.54520273208618, 39.17876344106642]\n * ]);\n *\n * map.removeSource('some id');  // remove\n * @see [Example: Add a video](https://www.mapbox.com/mapbox-gl-js/example/video-on-a-map/)\n */\nclass VideoSource extends ImageSource {\n    options: VideoSourceSpecification;\n    urls: Array<string>;\n    video: HTMLVideoElement;\n    roundZoom: boolean;\n\n    /**\n     * @private\n     */\n    constructor(id: string, options: VideoSourceSpecification, dispatcher: Dispatcher, eventedParent: Evented) {\n        super(id, options, dispatcher, eventedParent);\n        this.roundZoom = true;\n        this.type = 'video';\n        this.options = options;\n    }\n\n    load() {\n        this._loaded = false;\n        const options = this.options;\n\n        this.urls = [];\n        for (const url of options.urls) {\n            this.urls.push(this.map._requestManager.transformRequest(url, ResourceType.Source).url);\n        }\n\n        getVideo(this.urls, (err, video) => {\n            this._loaded = true;\n            if (err) {\n                this.fire(new ErrorEvent(err));\n            } else if (video) {\n                this.video = video;\n                this.video.loop = true;\n\n                // Prevent the video from taking over the screen in iOS\n                this.video.setAttribute('playsinline', '');\n\n                // Start repainting when video starts playing. hasTransition() will then return\n                // true to trigger additional frames as long as the videos continues playing.\n                this.video.addEventListener('playing', () => {\n                    this.map.triggerRepaint();\n                });\n\n                if (this.map) {\n                    this.video.play();\n                }\n\n                this._finishLoading();\n            }\n        });\n    }\n\n    /**\n     * Pauses the video.\n     *\n     * @example\n     * // Assuming a video source identified by video_source_id was added to the map\n     * const videoSource = map.getSource('video_source_id');\n     *\n     * // Pauses the video\n     * videoSource.pause();\n     */\n    pause() {\n        if (this.video) {\n            this.video.pause();\n        }\n    }\n\n    /**\n     * Plays the video.\n     *\n     * @example\n     * // Assuming a video source identified by video_source_id was added to the map\n     * const videoSource = map.getSource('video_source_id');\n     *\n     * // Starts the video\n     * videoSource.play();\n     */\n    play() {\n        if (this.video) {\n            this.video.play();\n        }\n    }\n\n    /**\n     * Sets playback to a timestamp, in seconds.\n     * @private\n     */\n    seek(seconds: number) {\n        if (this.video) {\n            const seekableRange = this.video.seekable;\n            if (seconds < seekableRange.start(0) || seconds > seekableRange.end(0)) {\n                this.fire(new ErrorEvent(new ValidationError(`sources.${this.id}`, null, `Playback for this video can be set only between the ${seekableRange.start(0)} and ${seekableRange.end(0)}-second mark.`)));\n            } else this.video.currentTime = seconds;\n        }\n    }\n\n    /**\n     * Returns the HTML `video` element.\n     *\n     * @returns {HTMLVideoElement} The HTML `video` element.\n     * @example\n     * // Assuming a video source identified by video_source_id was added to the map\n     * const videoSource = map.getSource('video_source_id');\n     *\n     * videoSource.getVideo(); // <video crossorigin=\"Anonymous\" loop=\"\">...</video>\n     */\n    getVideo(): HTMLVideoElement {\n        return this.video;\n    }\n\n    onAdd(map: Map) {\n        if (this.map) return;\n        this.map = map;\n        this.load();\n        if (this.video) {\n            this.video.play();\n            this.setCoordinates(this.coordinates);\n        }\n    }\n\n    /**\n     * Sets the video's coordinates and re-renders the map.\n     *\n     * @method setCoordinates\n     * @instance\n     * @memberof VideoSource\n     * @returns {VideoSource} Returns itself to allow for method chaining.\n     * @example\n     * // Add a video source to the map to map\n     * map.addSource('video_source_id', {\n     *     type: 'video',\n     *     urls: [\n     *         'https://www.mapbox.com/blog/assets/baltimore-smoke.mp4',\n     *         'https://www.mapbox.com/blog/assets/baltimore-smoke.webm'\n     *     ],\n     *     coordinates: [\n     *         [-76.54, 39.18],\n     *         [-76.52, 39.18],\n     *         [-76.52, 39.17],\n     *         [-76.54, 39.17]\n     *     ]\n     * });\n     *\n     * // Then update the video source coordinates by new coordinates\n     * const videoSource = map.getSource('video_source_id');\n     * videoSource.setCoordinates([\n     *     [-76.5433, 39.1857],\n     *     [-76.5280, 39.1838],\n     *     [-76.5295, 39.1768],\n     *     [-76.5452, 39.1787]\n     * ]);\n     */\n    // setCoordinates inherited from ImageSource\n\n    prepare() {\n        if (Object.keys(this.tiles).length === 0 || this.video.readyState < 2) {\n            return; // not enough data for current position\n        }\n\n        const context = this.map.painter.context;\n        const gl = context.gl;\n\n        if (!this.texture) {\n            this.texture = new Texture(context, this.video, gl.RGBA);\n            this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n            this.width = this.video.videoWidth;\n            this.height = this.video.videoHeight;\n\n        } else if (!this.video.paused) {\n            this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n            gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.video);\n        }\n\n        this._prepareData(context);\n    }\n\n    serialize(): VideoSourceSpecification {\n        return {\n            type: 'video',\n            urls: this.urls,\n            coordinates: this.coordinates\n        };\n    }\n\n    hasTransition(): boolean {\n        return this.video && !this.video.paused;\n    }\n}\n\nexport default VideoSource;\n","// @flow\n\nimport {Evented, ErrorEvent, Event} from '../../src/util/evented.js';\nimport {ResourceType} from '../../src/util/ajax.js';\n\nimport Model from '../data/model.js';\nimport convertModel from './model_loader.js';\nimport {loadGLTF} from '../util/loaders.js';\n\nimport type {Source} from '../../src/source/source.js';\nimport type Tile from '../../src/source/tile.js';\nimport type {Callback} from '../../src/types/callback.js';\nimport type Dispatcher from '../../src/util/dispatcher.js';\nimport type {Map} from '../../src/ui/map.js';\nimport type {ModelSourceSpecification} from '../../src/style-spec/types.js';\n\n/**\n * A source containing single models.\n */\n// Important Note: ModelSource is legacy and should not be offered in the API, as the only valid official sources to add models\n// are batched-models and via GeoJson/vector sources. We keep this one (for now) just for ease development and get the render-tests\n// passing.\nclass ModelSource extends Evented implements Source {\n    type: 'model';\n    id: string;\n    scope: string;\n    minzoom: number;\n    maxzoom: number;\n    tileSize: number;\n    map: Map;\n    uri: string;\n    models: Array<Model>;\n    _options: ModelSourceSpecification;\n    _loaded: boolean;\n    /**\n     * @private\n     */\n    // eslint-disable-next-line no-unused-vars\n    constructor(id: string, options: ModelSourceSpecification, dispatcher: Dispatcher, eventedParent: Evented) {\n        super();\n        this.id = id;\n        this.type = 'model';\n        this.models = [];\n        this._loaded = false;\n        this._options = options;\n    }\n\n    load(): Promise<void> {\n        const modelPromises = [];\n\n        /* $FlowIgnore[prop-missing] we don't need the full spec of model_source as it's only used for testing */\n        for (const modelId in this._options.models) {\n            const modelSpec = this._options.models[modelId];\n\n            const modelPromise = loadGLTF(this.map._requestManager.transformRequest(modelSpec.uri, ResourceType.Model).url).then(gltf => {\n                if (!gltf) return;\n                const nodes = convertModel(gltf);\n                const model = new Model(modelId, modelSpec.position, modelSpec.orientation, nodes);\n                model.computeBoundsAndApplyParent();\n                this.models.push(model);\n            }).catch((err) => {\n                this.fire(new ErrorEvent(new Error(`Could not load model ${modelId} from ${modelSpec.uri}: ${err.message}`)));\n            });\n\n            modelPromises.push(modelPromise);\n        }\n\n        return Promise.allSettled(modelPromises).then(() => {\n            this._loaded = true;\n            this.fire(new Event('data', {dataType: 'source', sourceDataType: 'metadata'}));\n        }).catch((err) => {\n            this.fire(new ErrorEvent(new Error(`Could not load models: ${err.message}`)));\n        });\n    }\n\n    // $FlowFixMe[method-unbinding]\n    onAdd(map: Map) {\n        this.map = map;\n        this.load();\n    }\n\n    hasTransition(): boolean {\n        return false;\n    }\n\n    loaded(): boolean {\n        return this._loaded;\n    }\n\n    getModels(): Array<Model> {\n        return this.models;\n    }\n    // eslint-disable-next-line no-unused-vars\n    loadTile(tile: Tile, callback: Callback<void>) {}\n\n    serialize(): Object {\n        return {\n            type: 'model'\n        };\n    }\n}\n\nexport default ModelSource;\n","// @flow\n\nimport {Evented, ErrorEvent, Event} from '../../src/util/evented.js';\nimport {ResourceType} from '../../src/util/ajax.js';\nimport loadTileJSON from '../../src/source/load_tilejson.js';\nimport TileBounds from '../../src/source/tile_bounds.js';\nimport {extend} from '../../src/util/util.js';\nimport {postTurnstileEvent} from '../../src/util/mapbox.js';\n\n// Import Tiled3dModelBucket as a module with side effects to ensure\n// it's registered as a serializable class on the main thread\nimport '../data/bucket/tiled_3d_model_bucket.js';\n\nimport type Tiled3dModelBucket from '../data/bucket/tiled_3d_model_bucket.js';\nimport type {Source} from '../../src/source/source.js';\nimport type Tile from '../../src/source/tile.js';\nimport type {Callback} from '../../src/types/callback.js';\nimport type {Cancelable} from '../../src/types/cancelable.js';\nimport type Dispatcher from '../../src/util/dispatcher.js';\nimport type {ModelSourceSpecification} from '../../src/style-spec/types.js';\nimport type {Map} from '../../src/ui/map.js';\nimport type {OverscaledTileID} from '../../src/source/tile_id.js';\n\nclass Tiled3DModelSource extends Evented implements Source {\n    type: 'batched-model';\n    id: string;\n    scope: string;\n    minzoom: number;\n    maxzoom: number;\n    tileBounds: TileBounds;\n    roundZoom: boolean | void;\n    reparseOverscaled: boolean | void;\n    usedInConflation: boolean;\n    tileSize: number;\n    tiles: Array<string>;\n    dispatcher: Dispatcher;\n    scheme: string;\n    _loaded: boolean;\n    _options: ModelSourceSpecification;\n    _tileJSONRequest: ?Cancelable;\n    map: Map;\n\n    /**\n     * @private\n     */\n    constructor(id: string, options: ModelSourceSpecification, dispatcher: Dispatcher, eventedParent: Evented) {\n        super();\n        this.type = 'batched-model';\n        this.id = id;\n        this.tileSize = 512;\n\n        this._options = options;\n        this.tiles = (this._options.tiles: any);\n        this.maxzoom = options.maxzoom || 19;\n        this.minzoom = options.minzoom || 0;\n        this.roundZoom = true;\n        this.usedInConflation = true;\n        this.dispatcher = dispatcher;\n        this.reparseOverscaled = false;\n        this.scheme = 'xyz';\n        this._loaded = false;\n        this.setEventedParent(eventedParent);\n    }\n    // $FlowFixMe[method-unbinding]\n    onAdd(map: Map) {\n        this.map = map;\n        this.load();\n    }\n\n    load(callback?: Callback<void>) {\n        this._loaded = false;\n        this.fire(new Event('dataloading', {dataType: 'source'}));\n        const language = Array.isArray(this.map._language) ? this.map._language.join() : this.map._language;\n        const worldview = this.map._worldview;\n        this._tileJSONRequest = loadTileJSON(this._options, this.map._requestManager, language, worldview, (err, tileJSON) => {\n            this._tileJSONRequest = null;\n            this._loaded = true;\n            if (err) {\n                if (language) console.warn(`Ensure that your requested language string is a valid BCP-47 code or list of codes. Found: ${language}`);\n                if (worldview && worldview.length !== 2) console.warn(`Requested worldview strings must be a valid ISO alpha-2 code. Found: ${worldview}`);\n\n                this.fire(new ErrorEvent(err));\n            } else if (tileJSON) {\n                extend(this, tileJSON);\n                if (tileJSON.bounds) this.tileBounds = new TileBounds(tileJSON.bounds, this.minzoom, this.maxzoom);\n                postTurnstileEvent(tileJSON.tiles, this.map._requestManager._customAccessToken);\n\n                // `content` is included here to prevent a race condition where `Style#_updateSources` is called\n                // before the TileJSON arrives. this makes sure the tiles needed are loaded once TileJSON arrives\n                // ref: https://github.com/mapbox/mapbox-gl-js/pull/4347#discussion_r104418088\n                this.fire(new Event('data', {dataType: 'source', sourceDataType: 'metadata'}));\n                this.fire(new Event('data', {dataType: 'source', sourceDataType: 'content'}));\n            }\n\n            if (callback) callback(err);\n        });\n    }\n\n    hasTransition(): boolean {\n        return false;\n    }\n\n    // $FlowFixMe[method-unbinding]\n    hasTile(tileID: OverscaledTileID): boolean {\n        return !this.tileBounds || this.tileBounds.contains(tileID.canonical);\n    }\n\n    loaded(): boolean {\n        return this._loaded;\n    }\n\n    loadTile(tile: Tile, callback: Callback<void>) {\n        const url = this.map._requestManager.normalizeTileURL(tile.tileID.canonical.url((this.tiles: any), this.scheme));\n        const request = this.map._requestManager.transformRequest(url, ResourceType.Tile);\n        const params = {\n            request,\n            data: undefined,\n            uid: tile.uid,\n            tileID: tile.tileID,\n            tileZoom: tile.tileZoom,\n            zoom: tile.tileID.overscaledZ,\n            tileSize: this.tileSize * tile.tileID.overscaleFactor(),\n            type: this.type,\n            source: this.id,\n            scope: this.scope,\n            showCollisionBoxes: this.map.showCollisionBoxes,\n            isSymbolTile: tile.isSymbolTile,\n            brightness: this.map.style ? (this.map.style.getBrightness() || 0.0) : 0.0\n        };\n        if (!tile.actor || tile.state === 'expired') {\n            tile.actor = this.dispatcher.getActor();\n            tile.request = tile.actor.send('loadTile', params, done.bind(this), undefined, true);\n        } else if (tile.state === 'loading') {\n            // schedule tile reloading after it has been loaded\n            tile.reloadCallback = callback;\n        } else {\n            // If the tile has already been parsed we may just need to reevaluate\n            if (tile.buckets) {\n                const buckets: Tiled3dModelBucket[] = (Object.values(tile.buckets): any[]);\n                for (const bucket of buckets) {\n                    bucket.dirty = true;\n                }\n                tile.state = 'loaded';\n                return;\n            }\n            tile.request = tile.actor.send('reloadTile', params, done.bind(this));\n        }\n\n        // $FlowFixMe[missing-this-annot]\n        function done(err: ?Error, data: any) {\n            if (tile.aborted) return callback(null);\n\n            // $FlowFixMe[prop-missing] - generic Error type doesn't have status\n            if (err && err.status !== 404) {\n                return callback(err);\n            }\n\n            if (data) {\n                if (data.resourceTiming) tile.resourceTiming = data.resourceTiming;\n                if (this.map._refreshExpiredTiles) tile.setExpiryData(data);\n                tile.buckets = {...tile.buckets, ...data.buckets};\n                if (data.featureIndex) {\n                    tile.latestFeatureIndex = data.featureIndex;\n                }\n            }\n\n            tile.state = 'loaded';\n            callback(null);\n        }\n    }\n\n    serialize(): ModelSourceSpecification {\n        return extend({}, this._options);\n    }\n}\n\nexport default Tiled3DModelSource;\n","// @flow\n\nimport ImageSource from './image_source.js';\n\nimport Texture, {UserManagedTexture} from '../render/texture.js';\nimport {ErrorEvent} from '../util/evented.js';\nimport ValidationError from '../style-spec/error/validation_error.js';\n\nimport type {Map} from '../ui/map.js';\nimport type Dispatcher from '../util/dispatcher.js';\nimport type {Evented} from '../util/evented.js';\n\nexport type CanvasSourceSpecification = {|\n    \"type\": \"canvas\",\n    \"coordinates\": [[number, number], [number, number], [number, number], [number, number]],\n    \"animate\"?: boolean,\n    \"canvas\": string | HTMLCanvasElement\n|};\n\n/**\n * Options to add a canvas source type to the map.\n *\n * @typedef {Object} CanvasSourceOptions\n * @property {string} type Source type. Must be `\"canvas\"`.\n * @property {string|HTMLCanvasElement} canvas Canvas source from which to read pixels. Can be a string representing the ID of the canvas element, or the `HTMLCanvasElement` itself.\n * @property {Array<Array<number>>} coordinates Four geographical coordinates denoting where to place the corners of the canvas, specified in `[longitude, latitude]` pairs.\n * @property {boolean} [animate=true] Whether the canvas source is animated. If the canvas is static (pixels do not need to be re-read on every frame), `animate` should be set to `false` to improve performance.\n */\n\n/**\n * A data source containing the contents of an HTML canvas. See {@link CanvasSourceOptions} for detailed documentation of options.\n *\n * @example\n * // add to map\n * map.addSource('some id', {\n *     type: 'canvas',\n *     canvas: 'idOfMyHTMLCanvas',\n *     animate: true,\n *     coordinates: [\n *         [-76.54, 39.18],\n *         [-76.52, 39.18],\n *         [-76.52, 39.17],\n *         [-76.54, 39.17]\n *     ]\n * });\n *\n * // update\n * const mySource = map.getSource('some id');\n * mySource.setCoordinates([\n *     [-76.54335737228394, 39.18579907229748],\n *     [-76.52803659439087, 39.1838364847587],\n *     [-76.5295386314392, 39.17683392507606],\n *     [-76.54520273208618, 39.17876344106642]\n * ]);\n *\n * map.removeSource('some id');  // remove\n * @see [Example: Add a canvas source](https://docs.mapbox.com/mapbox-gl-js/example/canvas-source/)\n */\nclass CanvasSource extends ImageSource {\n    options: CanvasSourceSpecification;\n    animate: boolean;\n    canvas: HTMLCanvasElement;\n    play: () => void;\n    pause: () => void;\n    _playing: boolean;\n\n    /**\n     * @private\n     */\n    constructor(id: string, options: CanvasSourceSpecification, dispatcher: Dispatcher, eventedParent: Evented) {\n        super(id, options, dispatcher, eventedParent);\n\n        // We build in some validation here, since canvas sources aren't included in the style spec:\n        if (!options.coordinates) {\n            this.fire(new ErrorEvent(new ValidationError(`sources.${id}`, null, 'missing required property \"coordinates\"')));\n        } else if (!Array.isArray(options.coordinates) || options.coordinates.length !== 4 ||\n                options.coordinates.some(c => !Array.isArray(c) || c.length !== 2 || c.some(l => typeof l !== 'number'))) {\n            this.fire(new ErrorEvent(new ValidationError(`sources.${id}`, null, '\"coordinates\" property must be an array of 4 longitude/latitude array pairs')));\n        }\n\n        if (options.animate && typeof options.animate !== 'boolean') {\n            this.fire(new ErrorEvent(new ValidationError(`sources.${id}`, null, 'optional \"animate\" property must be a boolean value')));\n        }\n\n        if (!options.canvas) {\n            this.fire(new ErrorEvent(new ValidationError(`sources.${id}`, null, 'missing required property \"canvas\"')));\n        } else if (typeof options.canvas !== 'string' && !(options.canvas instanceof HTMLCanvasElement)) {\n            this.fire(new ErrorEvent(new ValidationError(`sources.${id}`, null, '\"canvas\" must be either a string representing the ID of the canvas element from which to read, or an HTMLCanvasElement instance')));\n        }\n\n        this.options = options;\n        this.animate = options.animate !== undefined ? options.animate : true;\n    }\n\n    /**\n     * Enables animation. The image will be copied from the canvas to the map on each frame.\n     *\n     * @method play\n     * @instance\n     * @memberof CanvasSource\n     */\n\n    /**\n     * Disables animation. The map will display a static copy of the canvas image.\n     *\n     * @method pause\n     * @instance\n     * @memberof CanvasSource\n     */\n\n    load() {\n        this._loaded = true;\n        if (!this.canvas) {\n            this.canvas = (this.options.canvas instanceof HTMLCanvasElement) ?\n                this.options.canvas :\n                ((document.getElementById(this.options.canvas): any): HTMLCanvasElement);\n        }\n        this.width = this.canvas.width;\n        this.height = this.canvas.height;\n\n        if (this._hasInvalidDimensions()) {\n            this.fire(new ErrorEvent(new Error('Canvas dimensions cannot be less than or equal to zero.')));\n            return;\n        }\n\n        // $FlowFixMe[missing-this-annot]\n        this.play = function() {\n            this._playing = true;\n            this.map.triggerRepaint();\n        };\n\n        // $FlowFixMe[missing-this-annot]\n        this.pause = function() {\n            if (this._playing) {\n                this.prepare();\n                this._playing = false;\n            }\n        };\n\n        this._finishLoading();\n    }\n\n    /**\n     * Returns the HTML `canvas` element.\n     *\n     * @returns {HTMLCanvasElement} The HTML `canvas` element.\n     * @example\n     * // Assuming the following canvas is added to your page\n     * // <canvas id=\"canvasID\" width=\"400\" height=\"400\"></canvas>\n     * map.addSource('canvas-source', {\n     *     type: 'canvas',\n     *     canvas: 'canvasID',\n     *     coordinates: [\n     *         [91.4461, 21.5006],\n     *         [100.3541, 21.5006],\n     *         [100.3541, 13.9706],\n     *         [91.4461, 13.9706]\n     *     ]\n     * });\n     * map.getSource('canvas-source').getCanvas(); // <canvas id=\"canvasID\" width=\"400\" height=\"400\"></canvas>\n     */\n    getCanvas(): HTMLCanvasElement {\n        return this.canvas;\n    }\n\n    // $FlowFixMe[method-unbinding]\n    onAdd(map: Map) {\n        this.map = map;\n        this.load();\n        if (this.canvas) {\n            if (this.animate) this.play();\n        }\n    }\n\n    // $FlowFixMe[method-unbinding]\n    onRemove() {\n        this.pause();\n    }\n\n    /**\n     * Sets the canvas's coordinates and re-renders the map.\n     *\n     * @method setCoordinates\n     * @instance\n     * @memberof CanvasSource\n     * @param {Array<Array<number>>} coordinates Four geographical coordinates,\n     * represented as arrays of longitude and latitude numbers, which define the corners of the canvas.\n     * The coordinates start at the top left corner of the canvas and proceed in clockwise order.\n     * They do not have to represent a rectangle.\n     * @returns {CanvasSource} Returns itself to allow for method chaining.\n     */\n\n    // setCoordinates inherited from ImageSource\n\n    // $FlowFixMe[method-unbinding]\n    prepare() {\n        let resize = false;\n        if (this.canvas.width !== this.width) {\n            this.width = this.canvas.width;\n            resize = true;\n        }\n        if (this.canvas.height !== this.height) {\n            this.height = this.canvas.height;\n            resize = true;\n        }\n\n        if (this._hasInvalidDimensions()) return;\n\n        if (Object.keys(this.tiles).length === 0) return; // not enough data for current position\n\n        const context = this.map.painter.context;\n\n        if (!this.texture) {\n            this.texture = new Texture(context, this.canvas, context.gl.RGBA, {premultiply: true});\n        } else if ((resize || this._playing) && !(this.texture instanceof UserManagedTexture)) {\n            this.texture.update(this.canvas, {premultiply: true});\n        }\n\n        this._prepareData(context);\n    }\n\n    serialize(): Object {\n        return {\n            type: 'canvas',\n            coordinates: this.coordinates\n        };\n    }\n\n    hasTransition(): boolean {\n        return this._playing;\n    }\n\n    _hasInvalidDimensions(): boolean {\n        for (const x of [this.canvas.width, this.canvas.height]) {\n            if (isNaN(x) || x <= 0) return true;\n        }\n        return false;\n    }\n}\n\nexport default CanvasSource;\n","// @flow\n\nimport Tile from './tile.js';\nimport Texture from '../render/texture.js';\nimport TileBounds from './tile_bounds.js';\nimport {extend, pick} from '../util/util.js';\nimport {Event, ErrorEvent, Evented} from '../util/evented.js';\nimport {makeFQID} from '../util/fqid.js';\n\nimport type {Map} from '../ui/map.js';\nimport type Dispatcher from '../util/dispatcher.js';\nimport type {Source} from './source.js';\nimport type {Callback} from '../types/callback.js';\nimport type {OverscaledTileID} from './tile_id.js';\n\ntype DataType = 'raster';\n\nfunction isRaster(data: any): boolean {\n    return data instanceof ImageData ||\n        data instanceof HTMLCanvasElement ||\n        data instanceof ImageBitmap ||\n        data instanceof HTMLImageElement;\n}\n\n/* eslint-disable jsdoc/check-examples */\n/**\n * Interface for custom sources. This is a specification for\n * implementers to model: it is not an exported method or class.\n *\n * Custom sources allow a user to load and modify their own tiles.\n * These sources can be added between any regular sources using {@link Map#addSource}.\n *\n * Custom sources must have a unique `id` and must have the `type` of `\"custom\"`.\n * They must implement `loadTile` and may implement `unloadTile`, `onAdd` and `onRemove`.\n * They can trigger rendering using {@link Map#triggerRepaint}.\n *\n * @interface CustomSourceInterface\n * @property {string} id A unique source id.\n * @property {string} type The source's type. Must be `\"custom\"`.\n * @example\n * // Custom source implemented as ES6 class\n * class CustomSource {\n *     constructor() {\n *         this.id = 'custom-source';\n *         this.type = 'custom';\n *         this.tileSize = 256;\n *         this.tilesUrl = 'https://stamen-tiles.a.ssl.fastly.net/watercolor/{z}/{x}/{y}.jpg';\n *         this.attribution = 'Map tiles by Stamen Design, under CC BY 3.0';\n *     }\n *\n *     async loadTile(tile, {signal}) {\n *         const url = this.tilesUrl\n *             .replace('{z}', String(tile.z))\n *             .replace('{x}', String(tile.x))\n *             .replace('{y}', String(tile.y));\n *\n *         const response = await fetch(url, {signal});\n *         const data = await response.arrayBuffer();\n *\n *         const blob = new window.Blob([new Uint8Array(data)], {type: 'image/png'});\n *         const imageBitmap = await window.createImageBitmap(blob);\n *\n *         return imageBitmap;\n *     }\n * }\n *\n * map.on('load', () => {\n *     map.addSource('custom-source', new CustomSource());\n *     map.addLayer({\n *         id: 'layer',\n *         type: 'raster',\n *         source: 'custom-source'\n *     });\n * });\n */\n/* eslint-enable jsdoc/check-examples */\n\n/**\n * Optional method called when the source has been added to the Map with {@link Map#addSource}.\n * This gives the source a chance to initialize resources and register event listeners.\n *\n * @function\n * @memberof CustomSourceInterface\n * @instance\n * @name onAdd\n * @param {Map} map The Map this custom source was just added to.\n */\n\n/**\n * Optional method called when the source has been removed from the Map with {@link Map#removeSource}.\n * This gives the source a chance to clean up resources and event listeners.\n *\n * @function\n * @memberof CustomSourceInterface\n * @instance\n * @name onRemove\n * @param {Map} map The Map this custom source was added to.\n */\n\n/**\n * Optional method called after the tile is unloaded from the map viewport. This\n * gives the source a chance to clean up resources and event listeners.\n *\n * @function\n * @memberof CustomSourceInterface\n * @instance\n * @name unloadTile\n * @param {{ z: number, x: number, y: number }} tile Tile name to unload in the XYZ scheme format.\n */\n\n/**\n * Optional method called during a render frame to check if there is a tile to render.\n *\n * @function\n * @memberof CustomSourceInterface\n * @instance\n * @name hasTile\n * @param {{ z: number, x: number, y: number }} tile Tile name to prepare in the XYZ scheme format.\n * @returns {boolean} True if tile exists, otherwise false.\n */\n\n/**\n * Called when the map starts loading tile for the current animation frame.\n *\n * @function\n * @memberof CustomSourceInterface\n * @instance\n * @name loadTile\n * @param {{ z: number, x: number, y: number }} tile Tile name to load in the XYZ scheme format.\n * @param {Object} options Options.\n * @param {AbortSignal} options.signal A signal object that communicates when the map cancels the tile loading request.\n * @returns {Promise<TextureImage | undefined | null>} The promise that resolves to the tile image data as an `HTMLCanvasElement`, `HTMLImageElement`, `ImageData`, `ImageBitmap` or object with `width`, `height`, and `data`.\n * If `loadTile` resolves to `undefined`, a map will render an overscaled parent tile in the tile’s space. If `loadTile` resolves to `null`, a map will render nothing in the tile’s space.\n */\nexport type CustomSourceInterface<T> = {\n    id: string;\n    type: 'custom',\n    dataType: ?DataType,\n    minzoom: ?number,\n    maxzoom: ?number,\n    scheme: ?string;\n    tileSize: ?number,\n    attribution: ?string,\n    bounds: ?[number, number, number, number];\n    hasTile: ?(tileID: { z: number, x: number, y: number }) => boolean,\n    loadTile: (tileID: { z: number, x: number, y: number }, options: { signal: AbortSignal }) => Promise<?T>,\n    unloadTile: ?(tileID: { z: number, x: number, y: number }) => void,\n    onAdd: ?(map: Map) => void,\n    onRemove: ?(map: Map) => void,\n}\n\nclass CustomSource<T> extends Evented implements Source {\n    id: string;\n    scope: string;\n    type: 'custom';\n    scheme: string;\n    minzoom: number;\n    maxzoom: number;\n    tileSize: number;\n    attribution: string | void;\n\n    roundZoom: boolean | void;\n    tileBounds: ?TileBounds;\n    minTileCacheSize: ?number;\n    maxTileCacheSize: ?number;\n\n    _map: Map;\n    _loaded: boolean;\n    _dispatcher: Dispatcher;\n    _dataType: ?DataType;\n    _implementation: CustomSourceInterface<T>;\n\n    constructor(id: string, implementation: CustomSourceInterface<T>, dispatcher: Dispatcher, eventedParent: Evented) {\n        super();\n        this.id = id;\n        this.type = 'custom';\n        this._dataType = 'raster';\n        this._dispatcher = dispatcher;\n        this._implementation = implementation;\n        this.setEventedParent(eventedParent);\n\n        this.scheme = 'xyz';\n        this.minzoom = 0;\n        this.maxzoom = 22;\n        this.tileSize = 512;\n\n        this._loaded = false;\n        this.roundZoom = true;\n\n        if (!this._implementation) {\n            this.fire(new ErrorEvent(new Error(`Missing implementation for ${this.id} custom source`)));\n        }\n\n        if (!this._implementation.loadTile) {\n            this.fire(new ErrorEvent(new Error(`Missing loadTile implementation for ${this.id} custom source`)));\n        }\n\n        if (this._implementation.bounds) {\n            this.tileBounds = new TileBounds(this._implementation.bounds, this.minzoom, this.maxzoom);\n        }\n\n        // $FlowFixMe[prop-missing]\n        // $FlowFixMe[method-unbinding]\n        implementation.update = this._update.bind(this);\n\n        // $FlowFixMe[prop-missing]\n        // $FlowFixMe[method-unbinding]\n        implementation.clearTiles = this._clearTiles.bind(this);\n\n        // $FlowFixMe[prop-missing]\n        // $FlowFixMe[method-unbinding]\n        implementation.coveringTiles = this._coveringTiles.bind(this);\n\n        extend(this, pick(implementation, ['dataType', 'scheme', 'minzoom', 'maxzoom', 'tileSize', 'attribution', 'minTileCacheSize', 'maxTileCacheSize']));\n    }\n\n    serialize(): Source {\n        return pick(this, ['type', 'scheme', 'minzoom', 'maxzoom', 'tileSize', 'attribution']);\n    }\n\n    load() {\n        this._loaded = true;\n        this.fire(new Event('data', {dataType: 'source', sourceDataType: 'metadata'}));\n        this.fire(new Event('data', {dataType: 'source', sourceDataType: 'content'}));\n    }\n\n    loaded(): boolean {\n        return this._loaded;\n    }\n\n    // $FlowFixMe[method-unbinding]\n    onAdd(map: Map): void {\n        this._map = map;\n        this._loaded = false;\n        this.fire(new Event('dataloading', {dataType: 'source'}));\n        if (this._implementation.onAdd) this._implementation.onAdd(map);\n        this.load();\n    }\n\n    // $FlowFixMe[method-unbinding]\n    onRemove(map: Map): void {\n        if (this._implementation.onRemove) {\n            this._implementation.onRemove(map);\n        }\n    }\n\n    // $FlowFixMe[method-unbinding]\n    hasTile(tileID: OverscaledTileID): boolean {\n        if (this._implementation.hasTile) {\n            const {x, y, z} = tileID.canonical;\n            return this._implementation.hasTile({x, y, z});\n        }\n\n        return !this.tileBounds || this.tileBounds.contains(tileID.canonical);\n    }\n\n    loadTile(tile: Tile, callback: Callback<void>): void {\n        const {x, y, z} = tile.tileID.canonical;\n        const controller = new AbortController();\n        const signal = controller.signal;\n\n        // $FlowFixMe[prop-missing]\n        tile.request = Promise\n            .resolve(this._implementation.loadTile({x, y, z}, {signal}))\n            .then(tileLoaded.bind(this))\n            .catch(error => {\n                // silence AbortError\n                if (error.code === 20) return;\n                tile.state = 'errored';\n                callback(error);\n            });\n\n        // $FlowFixMe[prop-missing]\n        tile.request.cancel = () => controller.abort();\n\n        // $FlowFixMe[missing-this-annot]\n        function tileLoaded(data: ?T) {\n            delete tile.request;\n\n            if (tile.aborted) {\n                tile.state = 'unloaded';\n                return callback(null);\n            }\n\n            // If the implementation returned `undefined` as tile data,\n            // mark the tile as `errored` to indicate that we have no data for it.\n            // A map will render an overscaled parent tile in the tile’s space.\n            if (data === undefined) {\n                tile.state = 'errored';\n                return callback(null);\n            }\n\n            // If the implementation returned `null` as tile data,\n            // mark the tile as `loaded` and use an an empty image as tile data.\n            // A map will render nothing in the tile’s space.\n            if (data === null) {\n                const emptyImage = {width: this.tileSize, height: this.tileSize, data: null};\n                this.loadTileData(tile, (emptyImage: any));\n                tile.state = 'loaded';\n                return callback(null);\n            }\n\n            if (!isRaster(data)) {\n                tile.state = 'errored';\n                return callback(new Error(`Can't infer data type for ${this.id}, only raster data supported at the moment`));\n            }\n\n            this.loadTileData(tile, data);\n            tile.state = 'loaded';\n            callback(null);\n        }\n    }\n\n    loadTileData(tile: Tile, data: T): void {\n        // Only raster data supported at the moment\n        tile.setTexture((data: any), this._map.painter);\n    }\n\n    // $FlowFixMe[method-unbinding]\n    unloadTile(tile: Tile, callback: Callback<void>): void {\n        // Only raster data supported at the moment\n        // Cache the tile texture to avoid re-allocating Textures if they'll just be reloaded\n        if (tile.texture && tile.texture instanceof Texture) {\n            // Clean everything else up owned by the tile, but preserve the texture.\n            // Destroy first to prevent racing with the texture cache being popped.\n            tile.destroy(true);\n\n            // Save the texture to the cache\n            if (tile.texture && tile.texture instanceof Texture) {\n                this._map.painter.saveTileTexture(tile.texture);\n            }\n        } else {\n            tile.destroy();\n        }\n\n        if (this._implementation.unloadTile) {\n            const {x, y, z} = tile.tileID.canonical;\n            this._implementation.unloadTile({x, y, z});\n        }\n\n        callback();\n    }\n\n    // $FlowFixMe[method-unbinding]\n    abortTile(tile: Tile, callback: Callback<void>): void {\n        if (tile.request && tile.request.cancel) {\n            tile.request.cancel();\n            delete tile.request;\n        }\n\n        callback();\n    }\n\n    hasTransition(): boolean {\n        return false;\n    }\n\n    _coveringTiles(): { z: number, x: number, y: number }[] {\n        const tileIDs = this._map.transform.coveringTiles({\n            tileSize: this.tileSize,\n            minzoom: this.minzoom,\n            maxzoom: this.maxzoom,\n            roundZoom: this.roundZoom\n        });\n\n        return tileIDs.map(tileID => ({x: tileID.canonical.x, y: tileID.canonical.y, z: tileID.canonical.z}));\n    }\n\n    _clearTiles() {\n        const fqid = makeFQID(this.id, this.scope);\n        this._map.style.clearSource(fqid);\n    }\n\n    _update() {\n        this.fire(new Event('data', {dataType: 'source', sourceDataType: 'content'}));\n    }\n}\n\nexport default CustomSource;\n","// @flow\n\nimport type {OverscaledTileID} from './tile_id.js';\nimport type SourceCache from './source_cache.js';\nimport type StyleLayer from '../style/style_layer.js';\nimport type CollisionIndex from '../symbol/collision_index.js';\nimport type Transform from '../geo/transform.js';\nimport type {RetainedQueryData} from '../symbol/placement.js';\nimport type {FilterSpecification} from '../style-spec/types.js';\nimport type {QueryGeometry, TilespaceQueryGeometry} from '../style/query_geometry.js';\nimport assert from 'assert';\nimport {mat4} from 'gl-matrix';\n\nimport type Point from '@mapbox/point-geometry';\nimport type {QueryResult} from '../data/feature_index.js';\nimport type {QueryFeature} from '../util/vectortile_to_geojson.js';\n\nexport type RenderedFeatureLayers = Array<{\n    wrappedTileID: number;\n    queryResults: QueryResult\n}>;\n\nexport type QueryRenderedFeaturesParams = {\n    scope?: string;\n    layers?: string[];\n    filter?: FilterSpecification;\n    validate?: boolean;\n    availableImages?: string[];\n    serializedLayers?: {[string]: StyleLayer}\n};\n\n/*\n * Returns a matrix that can be used to convert from tile coordinates to viewport pixel coordinates.\n */\nfunction getPixelPosMatrix(transform: Transform, tileID: OverscaledTileID) {\n    const t = mat4.identity([]);\n    mat4.scale(t, t, [transform.width * 0.5, -transform.height * 0.5, 1]);\n    mat4.translate(t, t, [1, -1, 0]);\n    mat4.multiply(t, t, transform.calculateProjMatrix(tileID.toUnwrapped()));\n    return Float32Array.from(t);\n}\n\nexport function queryRenderedFeatures(sourceCache: SourceCache,\n                            styleLayers: {[_: string]: StyleLayer},\n                            serializedLayers: {[_: string]: Object},\n                            queryGeometry: QueryGeometry,\n                            params: { filter: FilterSpecification, layers: Array<string>, availableImages: Array<string> },\n                            transform: Transform,\n                            use3DQuery: boolean,\n                            visualizeQueryGeometry: boolean = false): QueryResult {\n    const tileResults = sourceCache.tilesIn(queryGeometry, use3DQuery, visualizeQueryGeometry);\n    tileResults.sort(sortTilesIn);\n    const renderedFeatureLayers = [];\n    for (const tileResult of tileResults) {\n        renderedFeatureLayers.push({\n            wrappedTileID: tileResult.tile.tileID.wrapped().key,\n            queryResults: tileResult.tile.queryRenderedFeatures(\n                styleLayers,\n                serializedLayers,\n                sourceCache._state,\n                tileResult,\n                params,\n                transform,\n                getPixelPosMatrix(sourceCache.transform, tileResult.tile.tileID),\n                visualizeQueryGeometry)\n        });\n    }\n\n    const result = mergeRenderedFeatureLayers(renderedFeatureLayers);\n\n    // Merge state from SourceCache into the results\n    for (const layerID in result) {\n        result[layerID].forEach((featureWrapper) => {\n            const feature = featureWrapper.feature;\n            const layer = feature.layer;\n\n            if (!layer || layer.type === 'background' || layer.type === 'sky' || layer.type === 'slot') return;\n\n            feature.source = layer.source;\n            if (layer['source-layer']) {\n                feature.sourceLayer = layer['source-layer'];\n            }\n            feature.state = feature.id !== undefined ? sourceCache.getFeatureState(layer['source-layer'], feature.id) : {};\n        });\n    }\n    return result;\n}\n\nexport function queryRenderedSymbols(styleLayers: {[_: string]: StyleLayer},\n                            serializedLayers: {[_: string]: StyleLayer},\n                            getLayerSourceCache: (layer: StyleLayer) => SourceCache | void,\n                            queryGeometry: Array<Point>,\n                            params: { filter: FilterSpecification, layers: Array<string>, availableImages: Array<string> },\n                            collisionIndex: CollisionIndex,\n                            retainedQueryData: {[_: number]: RetainedQueryData}): QueryResult {\n    const result = {};\n    const renderedSymbols = collisionIndex.queryRenderedSymbols(queryGeometry);\n    const bucketQueryData = [];\n    for (const bucketInstanceId of Object.keys(renderedSymbols).map(Number)) {\n        bucketQueryData.push(retainedQueryData[bucketInstanceId]);\n    }\n    bucketQueryData.sort(sortTilesIn);\n\n    for (const queryData of bucketQueryData) {\n        const bucketSymbols = queryData.featureIndex.lookupSymbolFeatures(\n                renderedSymbols[queryData.bucketInstanceId],\n                serializedLayers,\n                queryData.bucketIndex,\n                queryData.sourceLayerIndex,\n                params.filter,\n                params.layers,\n                params.availableImages,\n                styleLayers);\n\n        for (const layerID in bucketSymbols) {\n            const resultFeatures = result[layerID] = result[layerID] || [];\n            const layerSymbols = bucketSymbols[layerID];\n            layerSymbols.sort((a, b) => {\n                // Match topDownFeatureComparator from FeatureIndex, but using\n                // most recent sorting of features from bucket.sortFeatures\n                const featureSortOrder = queryData.featureSortOrder;\n                if (featureSortOrder) {\n                    // queryRenderedSymbols documentation says we'll return features in\n                    // \"top-to-bottom\" rendering order (aka last-to-first).\n                    // Actually there can be multiple symbol instances per feature, so\n                    // we sort each feature based on the first matching symbol instance.\n                    const sortedA = featureSortOrder.indexOf(a.featureIndex);\n                    const sortedB = featureSortOrder.indexOf(b.featureIndex);\n                    assert(sortedA >= 0);\n                    assert(sortedB >= 0);\n                    return sortedB - sortedA;\n                } else {\n                    // Bucket hasn't been re-sorted based on angle, so use the\n                    // reverse of the order the features appeared in the data.\n                    return b.featureIndex - a.featureIndex;\n                }\n            });\n            for (const symbolFeature of layerSymbols) {\n                resultFeatures.push(symbolFeature);\n            }\n        }\n    }\n\n    // Merge state from SourceCache into the results\n    for (const layerName in result) {\n        result[layerName].forEach((featureWrapper) => {\n            const feature = featureWrapper.feature;\n            const layer = styleLayers[layerName];\n            const sourceCache = getLayerSourceCache(layer);\n            if (!sourceCache) return;\n\n            const state = sourceCache.getFeatureState(feature.layer['source-layer'], feature.id);\n            feature.source = feature.layer.source;\n            if (feature.layer['source-layer']) {\n                feature.sourceLayer = feature.layer['source-layer'];\n            }\n            feature.state = state;\n        });\n    }\n    return result;\n}\n\nexport function querySourceFeatures(sourceCache: SourceCache, params: any): Array<QueryFeature> {\n    const tiles = sourceCache.getRenderableIds().map((id) => {\n        return sourceCache.getTileByID(id);\n    });\n\n    const result = [];\n\n    const dataTiles = {};\n    for (let i = 0; i < tiles.length; i++) {\n        const tile = tiles[i];\n        const dataID = tile.tileID.canonical.key;\n        if (!dataTiles[dataID]) {\n            dataTiles[dataID] = true;\n            tile.querySourceFeatures(result, params);\n        }\n    }\n\n    return result;\n}\n\nfunction sortTilesIn(a: TilespaceQueryGeometry | RetainedQueryData, b: TilespaceQueryGeometry | RetainedQueryData) {\n    const idA = a.tileID;\n    const idB = b.tileID;\n    return (idA.overscaledZ - idB.overscaledZ) || (idA.canonical.y - idB.canonical.y) || (idA.wrap - idB.wrap) || (idA.canonical.x - idB.canonical.x);\n}\n\nfunction mergeRenderedFeatureLayers(tiles: RenderedFeatureLayers): QueryResult {\n    // Merge results from all tiles, but if two tiles share the same\n    // wrapped ID, don't duplicate features between the two tiles\n    const result = {};\n    const wrappedIDLayerMap = {};\n    for (const tile of tiles) {\n        const queryResults = tile.queryResults;\n        const wrappedID = tile.wrappedTileID;\n        const wrappedIDLayers = wrappedIDLayerMap[wrappedID] = wrappedIDLayerMap[wrappedID] || {};\n        for (const layerID in queryResults) {\n            const tileFeatures = queryResults[layerID];\n            const wrappedIDFeatures = wrappedIDLayers[layerID] = wrappedIDLayers[layerID] || {};\n            const resultFeatures = result[layerID] = result[layerID] || [];\n            for (const tileFeature of tileFeatures) {\n                if (!wrappedIDFeatures[tileFeature.featureIndex]) {\n                    wrappedIDFeatures[tileFeature.featureIndex] = true;\n                    resultFeatures.push(tileFeature);\n                }\n            }\n        }\n    }\n    return result;\n}\n","// @flow\n\nimport Tile from './tile.js';\nimport Texture from '../render/texture.js';\nimport {getArrayBuffer} from '../util/ajax.js';\nimport {MapboxRasterTile} from '../data/mrt/mrt.js';\n\nimport type Painter from '../render/painter.js';\nimport type Framebuffer from '../gl/framebuffer.js';\nimport type {Callback} from '../types/callback.js';\nimport type {Cancelable} from '../types/cancelable.js';\nimport type {TextureImage} from '../render/texture.js';\nimport type {OverscaledTileID} from './tile_id.js';\nimport type {RequestParameters, ResponseCallback} from '../util/ajax.js';\n\nexport type TextureDescriptor = {\n    img: TextureImage,\n    layer: string,\n    band: string | number,\n    tileSize: number,\n    buffer: number,\n    mix: [number, number, number, number],\n    offset: number,\n    format?: 'uint8' | 'uint16' | 'uint32',\n};\n\nexport type MRTLayer = {\n    version: number;\n    name: string;\n    units: string;\n    tilesize: number;\n    buffer: number;\n    pixelFormat: 'uint8' | 'uint16' | 'uint32';\n    dataIndex: {[string | number]: any};\n    hasBand: (string | number) => boolean;\n    hasDataForBand: (string | number) => boolean;\n    getDataRange: (Array<string | number>) => MRTDataRange;\n    getBandView: (string | number) => MRTBandView;\n}\n\nexport type MRTBandView = {\n    data: any,\n    bytes: any,\n    tileSize: number,\n    buffer: number,\n    offset: number,\n    scale: number,\n};\n\nexport type MRTDataRange = {\n    layerName: string;\n    firstByte: number;\n    lastByte: number;\n    firstBlock: number;\n    lastBlock: number;\n};\n\nexport type MRTDecodingBatch = {\n    tasks: Array<MRTDecodingTask>;\n    cancel: () => void;\n    complete: (?Error, ?ArrayBuffer) => void;\n};\n\nexport type MRTDecodingTask = {\n    layerName: string;\n    firstByte: number;\n    lastByte: number;\n    pixelFormat: 'uint8' | 'uint16' | 'uint32';\n    blockIndex: number;\n    blockShape: Array<number>;\n    buffer: number;\n    codec: string;\n    filters: Array<string>;\n};\n\nexport type MRT = {\n    x: number;\n    y: number;\n    z: number;\n    _cacheSize: number;\n\n    layers: {[_: string]: MRTLayer};\n    getLayer(string): ?MRTLayer;\n    parseHeader(ArrayBuffer): MRT;\n    getHeaderLength(ArrayBuffer): number;\n    createDecodingTask(MRTDataRange): MRTDecodingBatch;\n};\n\nconst FIRST_TRY_HEADER_LENGTH = 16384;\nconst MRT_DECODED_BAND_CACHE_SIZE = 30;\n\nclass RasterArrayTile extends Tile {\n    // $FlowFixMe[incompatible-extend]\n    texture: ?Texture;\n    entireBuffer: ?ArrayBuffer;\n    requestParams: ?RequestParameters;\n\n    _workQueue: Array<() => void>;\n    _fetchQueue: Array<() => void>;\n\n    fbo: ?Framebuffer;\n    textureDescriptor: ?TextureDescriptor;\n\n    _mrt: ?MRT;\n    _isHeaderLoaded: boolean;\n\n    constructor(tileID: OverscaledTileID, size: number, tileZoom: number, painter: ?Painter, isRaster?: boolean) {\n        super(tileID, size, tileZoom, painter, isRaster);\n\n        this._workQueue = [];\n        this._fetchQueue = [];\n        this._isHeaderLoaded = false;\n    }\n\n    setTexture(img: TextureImage, painter: Painter) {\n        const context = painter.context;\n        const gl = context.gl;\n        this.texture = this.texture || painter.getTileTexture(img.width);\n\n        if (this.texture && this.texture instanceof Texture) {\n            this.texture.update(img, {useMipmap: false, premultiply: false});\n        } else {\n            this.texture = new Texture(context, img, gl.RGBA, {useMipmap: false, premultiply: false});\n        }\n    }\n\n    /**\n     * Stops existing fetches\n     * @private\n     */\n    flushQueues() {\n        while (this._workQueue.length) {\n            (this._workQueue.pop())();\n        }\n\n        while (this._fetchQueue.length) {\n            (this._fetchQueue.pop())();\n        }\n    }\n\n    fetchHeader(fetchLength: number = FIRST_TRY_HEADER_LENGTH, callback: ResponseCallback<?ArrayBuffer>): Cancelable {\n        const mrt = this._mrt = new MapboxRasterTile(MRT_DECODED_BAND_CACHE_SIZE);\n\n        const headerRequestParams = Object.assign({}, this.requestParams, {headers: {Range: `bytes=0-${fetchLength - 1}`}});\n\n        // A buffer, in case range requests were ignored\n        this.entireBuffer = null;\n\n        this.request = getArrayBuffer(headerRequestParams, (error: ?Error, dataBuffer: ?ArrayBuffer, cacheControl: ?string, expires: ?string) => {\n            if (error) {\n                callback(error);\n                return;\n            }\n\n            try {\n                const headerLength = mrt.getHeaderLength(dataBuffer);\n                if (headerLength > fetchLength) {\n                    this.request = this.fetchHeader(headerLength, callback);\n                    return;\n                }\n\n                // Parse the header only\n                mrt.parseHeader(dataBuffer);\n                this._isHeaderLoaded = true;\n\n                // If the received data covers all possible byte ranges (i.e. if the range request was\n                // ignored by the server), then cache the buffer and neglect range requests.\n                let lastByte = 0;\n                for (const layer of Object.values(mrt.layers)) {\n                    // $FlowFixMe[incompatible-use]\n                    lastByte = Math.max(lastByte, layer.dataIndex[layer.dataIndex.length - 1].last_byte);\n                }\n\n                // $FlowFixMe[incompatible-use]\n                if (dataBuffer.byteLength >= lastByte) {\n                    this.entireBuffer = dataBuffer;\n                }\n\n                callback(null, (this.entireBuffer || dataBuffer), cacheControl, expires);\n            } catch (error) {\n                callback(error);\n            }\n        });\n\n        return this.request;\n    }\n\n    fetchBand(sourceLayer: string, band: string | number, callback: Callback<?TextureImage>) {\n        // If header is not loaded, bail out of rendering.\n        // Repaint on reload is handled by appropriate callbacks.\n        const mrt = this._mrt;\n        if (!this._isHeaderLoaded || !mrt) {\n            callback(new Error('Tile header is not ready'));\n            return;\n        }\n\n        const actor = this.actor;\n        if (!actor) {\n            callback(new Error('Can\\'t fetch tile band without an actor'));\n            return;\n        }\n\n        // eslint-disable-next-line prefer-const\n        let task;\n\n        const onDataDecoded = (err: ?Error, result: ?ArrayBuffer) => {\n            task.complete(err, result);\n            if (err) {\n                callback(err);\n                return;\n            }\n\n            this.updateTextureDescriptor(sourceLayer, band);\n            callback(null, this.textureDescriptor && this.textureDescriptor.img);\n        };\n\n        const onDataLoaded = (err: ?Error, buffer: ?ArrayBuffer) => {\n            if (err) return callback(err);\n\n            const params = {buffer, task};\n            const workerJob = actor.send('decodeRasterArray', params, onDataDecoded, undefined, true);\n\n            this._workQueue.push(() => {\n                if (workerJob) workerJob.cancel();\n                task.cancel();\n            });\n        };\n\n        const mrtLayer = mrt.getLayer(sourceLayer);\n        if (!mrtLayer) {\n            callback(new Error(`Unknown sourceLayer \"${sourceLayer}\"`));\n            return;\n        }\n\n        if (mrtLayer.hasDataForBand(band)) {\n            this.updateTextureDescriptor(sourceLayer, band);\n            callback(null, this.textureDescriptor ? this.textureDescriptor.img : null);\n            return;\n        }\n\n        const range = mrtLayer.getDataRange([band]);\n        task = mrt.createDecodingTask(range);\n\n        // The MRT instance will not return work for a task which has already been checked\n        // out but not completed. If the resulting task has no work, we presume it is in\n        // progress. (This makes it very important to correctly cancel aborted decoding tasks.)\n        if (task && !task.tasks.length) {\n            callback(null);\n            return;\n        }\n\n        // Stop existing fetches and decodes\n        this.flushQueues();\n\n        if (this.entireBuffer) {\n            // eslint-disable-next-line no-warning-comments\n            // TODO: can we decode without slicing and duplicating memory?\n            onDataLoaded(null, this.entireBuffer.slice(range.firstByte, range.lastByte + 1));\n        } else {\n            const rangeRequestParams = Object.assign({}, this.requestParams, {headers: {Range: `bytes=${range.firstByte}-${range.lastByte}`}});\n            const request = getArrayBuffer(rangeRequestParams, onDataLoaded);\n            this._fetchQueue.push(() => {\n                request.cancel();\n                task.cancel();\n            });\n        }\n    }\n\n    updateNeeded(sourceLayer: string, band: string | number): boolean {\n        const textureUpdateNeeded = !this.textureDescriptor ||\n            this.textureDescriptor.band !== band ||\n            this.textureDescriptor.layer !== sourceLayer;\n\n        return textureUpdateNeeded && this.state !== 'errored';\n    }\n\n    updateTextureDescriptor(sourceLayer: string, band: string | number): void {\n        if (!this._mrt) return;\n\n        const mrtLayer = this._mrt.getLayer(sourceLayer);\n        if (!mrtLayer || !mrtLayer.hasBand(band) || !mrtLayer.hasDataForBand(band)) return;\n\n        const {bytes, tileSize, buffer, offset, scale} = mrtLayer.getBandView(band);\n        const size = tileSize + 2 * buffer;\n        const img = {data: bytes, width: size, height: size};\n\n        const texture = this.texture;\n        if (texture && texture instanceof Texture) {\n            texture.update(img, {useMipmap: false, premultiply: false});\n        }\n\n        this.textureDescriptor = {\n            layer: sourceLayer,\n            band,\n            img,\n            buffer,\n            offset,\n            tileSize,\n            format: mrtLayer.pixelFormat,\n            mix: [\n                scale,\n                scale * 256,\n                scale * 65536,\n                scale * 16777216,\n            ]\n        };\n    }\n}\n\nexport default RasterArrayTile;\n","// @flow\n\nimport {OverscaledTileID} from './tile_id.js';\nimport type Tile from './tile.js';\n\n/**\n * A [least-recently-used cache](http://en.wikipedia.org/wiki/Cache_algorithms)\n * with hash lookup made possible by keeping a list of keys in parallel to\n * an array of dictionary of values\n *\n * @private\n */\nclass TileCache {\n    max: number;\n    data: {[key: string | number]: Array<{ value: Tile, timeout: ?TimeoutID}>};\n    order: Array<number>;\n    onRemove: (element: Tile) => void;\n    /**\n     * @param {number} max The max number of permitted values.\n     * @private\n     * @param {Function} onRemove The callback called with items when they expire.\n     */\n    constructor(max: number, onRemove: (element: Tile) => void) {\n        this.max = max;\n        this.onRemove = onRemove;\n        this.reset();\n    }\n\n    /**\n     * Clear the cache.\n     *\n     * @returns {TileCache} Returns itself to allow for method chaining.\n     * @private\n     */\n    reset(): this {\n        for (const key in this.data) {\n            for (const removedData of this.data[key]) {\n                if (removedData.timeout) clearTimeout(removedData.timeout);\n                this.onRemove(removedData.value);\n            }\n        }\n\n        this.data = {};\n        this.order = [];\n\n        return this;\n    }\n\n    /**\n     * Add a key, value combination to the cache, trimming its size if this pushes\n     * it over max length.\n     *\n     * @param {OverscaledTileID} tileID lookup key for the item\n     * @param {*} data any value\n     *\n     * @returns {TileCache} Returns itself to allow for method chaining.\n     * @private\n     */\n    add(tileID: OverscaledTileID, data: Tile, expiryTimeout: number | void): this {\n        const key = tileID.wrapped().key;\n        if (this.data[key] === undefined) {\n            this.data[key] = [];\n        }\n\n        const dataWrapper = {\n            value: data,\n            timeout: undefined\n        };\n\n        if (expiryTimeout !== undefined) {\n            dataWrapper.timeout = setTimeout(() => {\n                this.remove(tileID, dataWrapper);\n            }, expiryTimeout);\n        }\n\n        this.data[key].push(dataWrapper);\n        this.order.push(key);\n\n        if (this.order.length > this.max) {\n            const removedData = this._getAndRemoveByKey(this.order[0]);\n            if (removedData) this.onRemove(removedData);\n        }\n\n        return this;\n    }\n\n    /**\n     * Determine whether the value attached to `key` is present\n     *\n     * @param {OverscaledTileID} tileID the key to be looked-up\n     * @returns {boolean} whether the cache has this value\n     * @private\n     */\n    has(tileID: OverscaledTileID): boolean {\n        return tileID.wrapped().key in this.data;\n    }\n\n    /**\n     * Get the value attached to a specific key and remove data from cache.\n     * If the key is not found, returns `null`\n     *\n     * @param {OverscaledTileID} tileID the key to look up\n     * @returns {*} the data, or null if it isn't found\n     * @private\n     */\n    getAndRemove(tileID: OverscaledTileID): ?Tile {\n        if (!this.has(tileID)) { return null; }\n        return this._getAndRemoveByKey(tileID.wrapped().key);\n    }\n\n    /*\n     * Get and remove the value with the specified key.\n     */\n    _getAndRemoveByKey(key: number): ?Tile {\n        const data = this.data[key].shift();\n        if (data.timeout) clearTimeout(data.timeout);\n\n        if (this.data[key].length === 0) {\n            delete this.data[key];\n        }\n        this.order.splice(this.order.indexOf(key), 1);\n\n        return data.value;\n    }\n\n    /*\n     * Get the value with the specified (wrapped tile) key.\n     */\n    getByKey(key: number): ?Tile {\n        const data = this.data[key];\n        return data ? data[0].value : null;\n    }\n\n    /**\n     * Get the value attached to a specific key without removing data\n     * from the cache. If the key is not found, returns `null`\n     *\n     * @param {OverscaledTileID} tileID the key to look up\n     * @returns {*} the data, or null if it isn't found\n     * @private\n     */\n    get(tileID: OverscaledTileID): ?Tile {\n        if (!this.has(tileID)) { return null; }\n\n        const data = this.data[tileID.wrapped().key][0];\n        return data.value;\n    }\n\n    /**\n     * Remove a key/value combination from the cache.\n     *\n     * @param {OverscaledTileID} tileID the key for the pair to delete\n     * @param {Tile} value If a value is provided, remove that exact version of the value.\n     * @returns {TileCache} this cache\n     * @private\n     */\n    remove(tileID: OverscaledTileID, value: ?{ value: Tile, timeout: ?TimeoutID}): this {\n        if (!this.has(tileID)) { return this; }\n        const key = tileID.wrapped().key;\n\n        const dataIndex = value === undefined ? 0 : this.data[key].indexOf(value);\n        const data = this.data[key][dataIndex];\n        this.data[key].splice(dataIndex, 1);\n        if (data.timeout) clearTimeout(data.timeout);\n        if (this.data[key].length === 0) {\n            delete this.data[key];\n        }\n        this.onRemove(data.value);\n        this.order.splice(this.order.indexOf(key), 1);\n\n        return this;\n    }\n\n    /**\n     * Change the max size of the cache.\n     *\n     * @param {number} max the max size of the cache\n     * @returns {TileCache} this cache\n     * @private\n     */\n    setMaxSize(max: number): TileCache {\n        this.max = max;\n\n        while (this.order.length > this.max) {\n            const removedData = this._getAndRemoveByKey(this.order[0]);\n            if (removedData) this.onRemove(removedData);\n        }\n\n        return this;\n    }\n\n    /**\n     * Remove entries that do not pass a filter function. Used for removing\n     * stale tiles from the cache.\n     *\n     * @private\n     * @param {function} filterFn Determines whether the tile is filtered. If the supplied function returns false, the tile will be filtered out.\n     */\n    filter(filterFn: (tile: Tile) => boolean) {\n        const removed = [];\n        for (const key in this.data) {\n            for (const entry of this.data[key]) {\n                if (!filterFn(entry.value)) {\n                    removed.push(entry);\n                }\n            }\n        }\n        for (const r of removed) {\n            this.remove(r.value.tileID, r);\n        }\n    }\n}\n\nexport default TileCache;\n","// @flow\n\nimport Tile from './tile.js';\nimport RasterArrayTile from './raster_array_tile.js';\nimport {Event, ErrorEvent, Evented} from '../util/evented.js';\nimport TileCache from './tile_cache.js';\nimport {asyncAll, keysDifference, values, clamp} from '../util/util.js';\nimport Context from '../gl/context.js';\nimport Point from '@mapbox/point-geometry';\nimport browser from '../util/browser.js';\nimport {OverscaledTileID, CanonicalTileID} from './tile_id.js';\nimport assert from 'assert';\nimport SourceFeatureState from './source_state.js';\nimport {mercatorXfromLng} from '../geo/mercator_coordinate.js';\n\nimport type {Source} from './source.js';\nimport type {SourceSpecification} from '../style-spec/types.js';\nimport type {Map as MapboxMap} from '../ui/map.js';\nimport type Transform from '../geo/transform.js';\nimport type {TileState} from './tile.js';\nimport type {Callback} from '../types/callback.js';\nimport type {FeatureStates} from './source_state.js';\nimport type {QueryGeometry, TilespaceQueryGeometry} from '../style/query_geometry.js';\nimport type {Vec3} from 'gl-matrix';\n\n/**\n * `SourceCache` is responsible for\n *\n *  - creating an instance of `Source`\n *  - forwarding events from `Source`\n *  - caching tiles loaded from an instance of `Source`\n *  - loading the tiles needed to render a given viewport\n *  - unloading the cached tiles not needed to render a given viewport\n *\n * @private\n */\nclass SourceCache extends Evented {\n    id: string;\n    map: MapboxMap;\n\n    _source: Source;\n    _sourceLoaded: boolean;\n    _sourceErrored: boolean;\n    _tiles: {[_: string | number]: Tile};\n    _prevLng: number | void;\n    _cache: TileCache;\n    _timers: {[_: any]: TimeoutID};\n    _cacheTimers: {[_: any]: TimeoutID};\n    _minTileCacheSize: ?number;\n    _maxTileCacheSize: ?number;\n    _paused: boolean;\n    _isRaster: boolean;\n    _shouldReloadOnResume: boolean;\n    _coveredTiles: {[_: number | string]: boolean};\n    transform: Transform;\n    used: boolean;\n    usedForTerrain: boolean;\n    castsShadows: boolean;\n    tileCoverLift: number;\n    _state: SourceFeatureState;\n    _loadedParentTiles: {[_: number | string]: ?Tile};\n    _onlySymbols: ?boolean;\n    _shadowCasterTiles: {[_: number]: boolean};\n\n    static maxUnderzooming: number;\n    static maxOverzooming: number;\n\n    constructor(id: string, source: Source, onlySymbols?: boolean) {\n        super();\n        this.id = id;\n        this._onlySymbols = onlySymbols;\n\n        source.on('data', (e) => {\n            // this._sourceLoaded signifies that the TileJSON is loaded if applicable.\n            // if the source type does not come with a TileJSON, the flag signifies the\n            // source data has loaded (in other words, GeoJSON has been tiled on the worker and is ready)\n            if (e.dataType === 'source' && e.sourceDataType === 'metadata') this._sourceLoaded = true;\n\n            // for sources with mutable data, this event fires when the underlying data\n            // to a source is changed (for example, using [GeoJSONSource#setData](https://docs.mapbox.com/mapbox-gl-js/api/sources/#geojsonsource#setdata) or [ImageSource#setCoordinates](https://docs.mapbox.com/mapbox-gl-js/api/sources/#imagesource#setcoordinates))\n            if (this._sourceLoaded && !this._paused && e.dataType === \"source\" && e.sourceDataType === 'content') {\n                this.reload();\n                if (this.transform) {\n                    this.update(this.transform);\n                }\n            }\n        });\n\n        source.on('error', () => {\n            this._sourceErrored = true;\n        });\n\n        this._source = source;\n        this._tiles = {};\n        // $FlowFixMe[method-unbinding]\n        this._cache = new TileCache(0, this._unloadTile.bind(this));\n        this._timers = {};\n        this._cacheTimers = {};\n        this._minTileCacheSize = source.minTileCacheSize;\n        this._maxTileCacheSize = source.maxTileCacheSize;\n        this._loadedParentTiles = {};\n        this.castsShadows = false;\n        this.tileCoverLift = 0.0;\n\n        this._coveredTiles = {};\n        this._shadowCasterTiles = {};\n        this._state = new SourceFeatureState();\n        this._isRaster =\n            this._source.type === 'raster' ||\n            this._source.type === 'raster-dem' ||\n            this._source.type === 'raster-array' ||\n            // $FlowFixMe[prop-missing]\n            (this._source.type === 'custom' && this._source._dataType === 'raster');\n    }\n\n    onAdd(map: MapboxMap) {\n        this.map = map;\n        this._minTileCacheSize = this._minTileCacheSize === undefined && map ? map._minTileCacheSize : this._minTileCacheSize;\n        this._maxTileCacheSize = this._maxTileCacheSize === undefined && map ? map._maxTileCacheSize : this._maxTileCacheSize;\n    }\n\n    /**\n     * Return true if no tile data is pending, tiles will not change unless\n     * an additional API call is received.\n     * @private\n     */\n    loaded(): boolean {\n        if (this._sourceErrored) { return true; }\n        if (!this._sourceLoaded) { return false; }\n        if (!this._source.loaded()) { return false; }\n        for (const t in this._tiles) {\n            const tile = this._tiles[t];\n            if (tile.state !== 'errored' && (tile.state !== 'loaded' || !tile.bucketsLoaded()))\n                return false;\n        }\n        return true;\n    }\n\n    getSource(): Source {\n        return this._source;\n    }\n\n    pause() {\n        this._paused = true;\n    }\n\n    resume() {\n        if (!this._paused) return;\n        const shouldReload = this._shouldReloadOnResume;\n        this._paused = false;\n        this._shouldReloadOnResume = false;\n        if (shouldReload) this.reload();\n        if (this.transform) this.update(this.transform);\n    }\n\n    _loadTile(tile: Tile, callback: Callback<void>): void {\n        tile.isSymbolTile = this._onlySymbols;\n        tile.isExtraShadowCaster = this._shadowCasterTiles[tile.tileID.key];\n        return this._source.loadTile(tile, callback);\n    }\n\n    _unloadTile(tile: Tile): void {\n        if (this._source.unloadTile)\n            return this._source.unloadTile(tile, () => {});\n    }\n\n    _abortTile(tile: Tile): void {\n        if (this._source.abortTile)\n            return this._source.abortTile(tile, () => {});\n    }\n\n    serialize(): SourceSpecification {\n        return this._source.serialize();\n    }\n\n    prepare(context: Context) {\n        if  (this._source.prepare) {\n            this._source.prepare();\n        }\n\n        this._state.coalesceChanges(this._tiles, this.map ? this.map.painter : null);\n\n        for (const i in this._tiles) {\n            const tile = this._tiles[i];\n            tile.upload(context);\n            tile.prepare(this.map.style.imageManager, this.map ? this.map.painter : null, this._source.scope);\n        }\n    }\n\n    /**\n     * Return all tile ids ordered with z-order, and cast to numbers\n     * @private\n     */\n    getIds(): Array<number> {\n        return values((this._tiles: any)).map((tile: Tile) => tile.tileID).sort(compareTileId).map(id => id.key);\n    }\n\n    getRenderableIds(symbolLayer?: boolean, includeShadowCasters?: boolean): Array<number> {\n        const renderables: Array<Tile> = [];\n        for (const id in this._tiles) {\n            if (this._isIdRenderable(+id, symbolLayer, includeShadowCasters)) renderables.push(this._tiles[id]);\n        }\n        if (symbolLayer) {\n            return renderables.sort((a_: Tile, b_: Tile) => {\n                const a = a_.tileID;\n                const b = b_.tileID;\n                const rotatedA = (new Point(a.canonical.x, a.canonical.y))._rotate(this.transform.angle);\n                const rotatedB = (new Point(b.canonical.x, b.canonical.y))._rotate(this.transform.angle);\n                return a.overscaledZ - b.overscaledZ || rotatedB.y - rotatedA.y || rotatedB.x - rotatedA.x;\n            }).map(tile => tile.tileID.key);\n        }\n        return renderables.map(tile => tile.tileID).sort(compareTileId).map(id => id.key);\n    }\n\n    hasRenderableParent(tileID: OverscaledTileID): boolean {\n        const parentTile = this.findLoadedParent(tileID, 0);\n        if (parentTile) {\n            return this._isIdRenderable(parentTile.tileID.key);\n        }\n        return false;\n    }\n\n    _isIdRenderable(id: number, symbolLayer?: boolean, includeShadowCasters?: boolean): boolean {\n        return this._tiles[id] && this._tiles[id].hasData() &&\n            !this._coveredTiles[id] && (symbolLayer || !this._tiles[id].holdingForFade()) &&\n            (includeShadowCasters || !this._shadowCasterTiles[id]);\n    }\n\n    reload() {\n        if (this._paused) {\n            this._shouldReloadOnResume = true;\n            return;\n        }\n\n        this._cache.reset();\n\n        for (const i in this._tiles) {\n            if (this._tiles[i].state !== \"errored\") this._reloadTile(+i, 'reloading');\n        }\n    }\n\n    _reloadTile(id: number, state: TileState) {\n        const tile = this._tiles[id];\n\n        // this potentially does not address all underlying\n        // issues https://github.com/mapbox/mapbox-gl-js/issues/4252\n        // - hard to tell without repro steps\n        if (!tile) return;\n\n        // The difference between \"loading\" tiles and \"reloading\" or \"expired\"\n        // tiles is that \"reloading\"/\"expired\" tiles are \"renderable\".\n        // Therefore, a \"loading\" tile cannot become a \"reloading\" tile without\n        // first becoming a \"loaded\" tile.\n        if (tile.state !== 'loading') {\n            tile.state = state;\n        }\n\n        // $FlowFixMe[method-unbinding]\n        this._loadTile(tile, this._tileLoaded.bind(this, tile, id, state));\n    }\n\n    _tileLoaded(tile: Tile, id: number, previousState: TileState, err: ?Error) {\n        if (err) {\n            tile.state = 'errored';\n            if ((err: any).status !== 404) this._source.fire(new ErrorEvent(err, {tile}));\n            // If the requested tile is missing, try to load the parent tile\n            // to use it as an overscaled tile instead of the missing one.\n            else {\n                const hasParent = tile.tileID.key in this._loadedParentTiles;\n                // If there are no parent tiles to load, fire a `data` event to trigger map render\n                if (!hasParent) {\n                    // We are firing an `error` source type event instead of `content` here because\n                    // the `content` event will reload all tiles and trigger redundant source cache updates\n                    this._source.fire(new Event('data', {dataType: 'source', sourceDataType: 'error', sourceId: this._source.id}));\n                    return;\n                }\n\n                // Otherwise, continue trying to load the parent tile until we find one that loads successfully\n                const updateForTerrain = this._source.type === 'raster-dem' && this.usedForTerrain;\n                if (updateForTerrain && this.map.painter.terrain) {\n                    const terrain = this.map.painter.terrain;\n                    this.update(this.transform, terrain.getScaledDemTileSize(), true);\n                    terrain.resetTileLookupCache(this.id);\n                } else {\n                    this.update(this.transform);\n                }\n            }\n            return;\n        }\n\n        tile.timeAdded = browser.now();\n        if (previousState === 'expired') tile.refreshedUponExpiration = true;\n        this._setTileReloadTimer(id, tile);\n        if (this._source.type === 'raster-dem' && tile.dem) this._backfillDEM(tile);\n        this._state.initializeTileState(tile, this.map ? this.map.painter : null);\n\n        this._source.fire(new Event('data', {dataType: 'source', tile, coord: tile.tileID, 'sourceCacheId': this.id}));\n    }\n\n    /**\n    * For raster terrain source, backfill DEM to eliminate visible tile boundaries\n    * @private\n    */\n    _backfillDEM(tile: Tile) {\n        const renderables = this.getRenderableIds();\n        for (let i = 0; i < renderables.length; i++) {\n            const borderId = renderables[i];\n            if (tile.neighboringTiles && tile.neighboringTiles[borderId]) {\n                const borderTile = this.getTileByID(borderId);\n                fillBorder(tile, borderTile);\n                fillBorder(borderTile, tile);\n            }\n        }\n\n        function fillBorder(tile: Tile, borderTile: Tile) {\n            if (!tile.dem || tile.dem.borderReady) return;\n            tile.needsHillshadePrepare = true;\n            tile.needsDEMTextureUpload = true;\n            let dx = borderTile.tileID.canonical.x - tile.tileID.canonical.x;\n            const dy = borderTile.tileID.canonical.y - tile.tileID.canonical.y;\n            const dim = Math.pow(2, tile.tileID.canonical.z);\n            const borderId = borderTile.tileID.key;\n            if (dx === 0 && dy === 0) return;\n\n            if (Math.abs(dy) > 1) {\n                return;\n            }\n            if (Math.abs(dx) > 1) {\n                // Adjust the delta coordinate for world wraparound.\n                if (Math.abs(dx + dim) === 1) {\n                    dx += dim;\n                } else if (Math.abs(dx - dim) === 1) {\n                    dx -= dim;\n                }\n            }\n            if (!borderTile.dem || !tile.dem) return;\n            tile.dem.backfillBorder(borderTile.dem, dx, dy);\n            if (tile.neighboringTiles && tile.neighboringTiles[borderId])\n                tile.neighboringTiles[borderId].backfilled = true;\n        }\n    }\n    /**\n     * Get a specific tile by TileID\n     * @private\n     */\n    getTile(tileID: OverscaledTileID): Tile {\n        return this.getTileByID(tileID.key);\n    }\n\n    /**\n     * Get a specific tile by id\n     * @private\n     */\n    getTileByID(id: number): Tile {\n        return this._tiles[id];\n    }\n\n    /**\n     * For a given set of tiles, retain children that are loaded and have a zoom\n     * between `zoom` (exclusive) and `maxCoveringZoom` (inclusive)\n     * @private\n     */\n    _retainLoadedChildren(\n        idealTiles: {[number | string]: OverscaledTileID},\n        zoom: number,\n        maxCoveringZoom: number,\n        retain: {[number | string]: OverscaledTileID}\n    ) {\n        for (const id in this._tiles) {\n            let tile = this._tiles[id];\n\n            // only consider renderable tiles up to maxCoveringZoom\n            if (retain[id] ||\n                !tile.hasData() ||\n                tile.tileID.overscaledZ <= zoom ||\n                tile.tileID.overscaledZ > maxCoveringZoom\n            ) continue;\n\n            // loop through parents and retain the topmost loaded one if found\n            let topmostLoadedID = tile.tileID;\n            while (tile && tile.tileID.overscaledZ > zoom + 1) {\n                const parentID = tile.tileID.scaledTo(tile.tileID.overscaledZ - 1);\n\n                tile = this._tiles[parentID.key];\n\n                if (tile && tile.hasData()) {\n                    topmostLoadedID = parentID;\n                }\n            }\n\n            // loop through ancestors of the topmost loaded child to see if there's one that needed it\n            let tileID = topmostLoadedID;\n            while (tileID.overscaledZ > zoom) {\n                tileID = tileID.scaledTo(tileID.overscaledZ - 1);\n\n                if (idealTiles[tileID.key]) {\n                    // found a parent that needed a loaded child; retain that child\n                    retain[topmostLoadedID.key] = topmostLoadedID;\n                    break;\n                }\n            }\n        }\n    }\n\n    /**\n     * Find a loaded parent of the given tile (up to minCoveringZoom)\n     * @private\n     */\n    findLoadedParent(tileID: OverscaledTileID, minCoveringZoom: number): ?Tile {\n        if (tileID.key in this._loadedParentTiles) {\n            const parent = this._loadedParentTiles[tileID.key];\n            if (parent && parent.tileID.overscaledZ >= minCoveringZoom) {\n                return parent;\n            } else {\n                return null;\n            }\n        }\n        for (let z = tileID.overscaledZ - 1; z >= minCoveringZoom; z--) {\n            const parentTileID = tileID.scaledTo(z);\n            const tile = this._getLoadedTile(parentTileID);\n            if (tile) {\n                return tile;\n            }\n        }\n    }\n\n    _getLoadedTile(tileID: OverscaledTileID): ?Tile {\n        const tile = this._tiles[tileID.key];\n        if (tile && tile.hasData()) {\n            return tile;\n        }\n        // TileCache ignores wrap in lookup.\n        const cachedTile = this._cache.getByKey(this._source.reparseOverscaled ? tileID.wrapped().key : tileID.canonical.key);\n        return cachedTile;\n    }\n\n    /**\n     * Resizes the tile cache based on the current viewport's size\n     * or the minTileCacheSize and maxTileCacheSize options passed during map creation\n     *\n     * Larger viewports use more tiles and need larger caches. Larger viewports\n     * are more likely to be found on devices with more memory and on pages where\n     * the map is more important.\n     * @private\n     */\n    updateCacheSize(transform: Transform, tileSize?: number) {\n        tileSize = tileSize || this._source.tileSize;\n        const widthInTiles = Math.ceil(transform.width / tileSize) + 1;\n        const heightInTiles = Math.ceil(transform.height / tileSize) + 1;\n        const approxTilesInView = widthInTiles * heightInTiles;\n        const commonZoomRange = 5;\n\n        const viewDependentMaxSize = Math.floor(approxTilesInView * commonZoomRange);\n        const minSize = typeof this._minTileCacheSize === 'number' ? Math.max(this._minTileCacheSize, viewDependentMaxSize) : viewDependentMaxSize;\n        const maxSize = typeof this._maxTileCacheSize === 'number' ? Math.min(this._maxTileCacheSize, minSize) : minSize;\n\n        this._cache.setMaxSize(maxSize);\n    }\n\n    handleWrapJump(lng: number) {\n        // On top of the regular z/x/y values, TileIDs have a `wrap` value that specify\n        // which copy of the world the tile belongs to. For example, at `lng: 10` you\n        // might render z/x/y/0 while at `lng: 370` you would render z/x/y/1.\n        //\n        // When lng values get wrapped (going from `lng: 370` to `long: 10`) you expect\n        // to see the same thing on the screen (370 degrees and 10 degrees is the same\n        // place in the world) but all the TileIDs will have different wrap values.\n        //\n        // In order to make this transition seamless, we calculate the rounded difference of\n        // \"worlds\" between the last frame and the current frame. If the map panned by\n        // a world, then we can assign all the tiles new TileIDs with updated wrap values.\n        // For example, assign z/x/y/1 a new id: z/x/y/0. It is the same tile, just rendered\n        // in a different position.\n        //\n        // This enables us to reuse the tiles at more ideal locations and prevent flickering.\n        const prevLng = this._prevLng === undefined ? lng : this._prevLng;\n        const lngDifference = lng - prevLng;\n        const worldDifference = lngDifference / 360;\n        const wrapDelta = Math.round(worldDifference);\n        this._prevLng = lng;\n\n        if (wrapDelta) {\n            const tiles: {[_: string | number]: Tile} = {};\n            for (const key in this._tiles) {\n                const tile = this._tiles[key];\n                tile.tileID = tile.tileID.unwrapTo(tile.tileID.wrap + wrapDelta);\n                tiles[tile.tileID.key] = tile;\n            }\n            this._tiles = tiles;\n\n            // Reset tile reload timers\n            for (const id in this._timers) {\n                clearTimeout(this._timers[id]);\n                delete this._timers[id];\n            }\n            for (const id in this._tiles) {\n                const tile = this._tiles[id];\n                this._setTileReloadTimer(+id, tile);\n            }\n        }\n    }\n\n    /**\n     * Removes tiles that are outside the viewport and adds new tiles that\n     * are inside the viewport.\n     * @private\n     * @param {boolean} updateForTerrain Signals to update tiles even if the\n     * source is not used (this.used) by layers: it is used for terrain.\n     * @param {tileSize} tileSize If needed to get lower resolution ideal cover,\n     * override source.tileSize used in tile cover calculation.\n     */\n    update(transform: Transform, tileSize?: number, updateForTerrain?: boolean, directionalLight?: Vec3) {\n        this.transform = transform;\n        if (!this._sourceLoaded || this._paused || this.transform.freezeTileCoverage) { return; }\n        assert(!(updateForTerrain && !this.usedForTerrain));\n        if (this.usedForTerrain && !updateForTerrain) {\n            // If source is used for both terrain and hillshade, don't update it twice.\n            return;\n        }\n\n        this.updateCacheSize(transform, tileSize);\n        if (this.transform.projection.name !== 'globe') {\n            this.handleWrapJump(this.transform.center.lng);\n        }\n\n        // Tiles acting as shadow casters can be included in the ideal set\n        // even though they might not be visible on the screen.\n        this._shadowCasterTiles = {};\n\n        // Covered is a list of retained tiles who's areas are fully covered by other,\n        // better, retained tiles. They are not drawn separately.\n        this._coveredTiles = {};\n\n        let idealTileIDs;\n\n        if (!this.used && !this.usedForTerrain) {\n            idealTileIDs = [];\n        } else if (this._source.tileID) {\n            idealTileIDs = transform.getVisibleUnwrappedCoordinates(this._source.tileID)\n                .map((unwrapped) => new OverscaledTileID(unwrapped.canonical.z, unwrapped.wrap, unwrapped.canonical.z, unwrapped.canonical.x, unwrapped.canonical.y));\n        } else if (this.tileCoverLift !== 0.0) {\n            // Extended tile cover to load elevated tiles\n            const modifiedTransform = transform.clone();\n            modifiedTransform.tileCoverLift = this.tileCoverLift;\n            idealTileIDs = modifiedTransform.coveringTiles({\n                tileSize: tileSize || this._source.tileSize,\n                minzoom: this._source.minzoom,\n                maxzoom: this._source.maxzoom,\n                roundZoom: this._source.roundZoom && !updateForTerrain,\n                reparseOverscaled: this._source.reparseOverscaled,\n                isTerrainDEM: this.usedForTerrain\n            });\n\n            // Add zoom level 1 tiles to cover area behind globe\n            if (this._source.minzoom <= 1.0 && transform.projection.name === 'globe') {\n                idealTileIDs.push(new OverscaledTileID(1, 0, 1, 0, 0));\n                idealTileIDs.push(new OverscaledTileID(1, 0, 1, 1, 0));\n                idealTileIDs.push(new OverscaledTileID(1, 0, 1, 0, 1));\n                idealTileIDs.push(new OverscaledTileID(1, 0, 1, 1, 1));\n            }\n        } else {\n            idealTileIDs = transform.coveringTiles({\n                tileSize: tileSize || this._source.tileSize,\n                minzoom: this._source.minzoom,\n                maxzoom: this._source.maxzoom,\n                roundZoom: this._source.roundZoom && !updateForTerrain,\n                reparseOverscaled: this._source.reparseOverscaled,\n                isTerrainDEM: this.usedForTerrain\n            });\n\n            if (this._source.hasTile) {\n                idealTileIDs = idealTileIDs.filter((coord) => (this._source.hasTile: any)(coord));\n            }\n        }\n\n        if (idealTileIDs.length > 0 && this.castsShadows &&\n            directionalLight && this.transform.projection.name !== 'globe' &&\n            !this.usedForTerrain && !isRasterType(this._source.type)) {\n            // compute desired max zoom level\n            const coveringZoom = transform.coveringZoomLevel({\n                tileSize: tileSize || this._source.tileSize,\n                roundZoom: this._source.roundZoom && !updateForTerrain\n            });\n            const idealZoom = Math.min(coveringZoom, this._source.maxzoom);\n\n            // find shadowCasterTiles\n            const shadowCasterTileIDs = transform.extendTileCoverForShadows(idealTileIDs, directionalLight, idealZoom);\n            for (const id of shadowCasterTileIDs) {\n                this._shadowCasterTiles[id.key] = true;\n                idealTileIDs.push(id);\n            }\n        }\n\n        // Retain is a list of tiles that we shouldn't delete, even if they are not\n        // the most ideal tile for the current viewport. This may include tiles like\n        // parent or child tiles that are *already* loaded.\n        const retain = this._updateRetainedTiles(idealTileIDs);\n\n        if (isRasterType(this._source.type) && idealTileIDs.length !== 0) {\n            const parentsForFading: {[_: string | number]: OverscaledTileID} = {};\n            const fadingTiles = {};\n            const ids = Object.keys(retain);\n            for (const id of ids) {\n                const tileID = retain[id];\n                assert(tileID.key === +id);\n\n                const tile = this._tiles[id];\n                if (!tile || (tile.fadeEndTime && tile.fadeEndTime <= browser.now())) continue;\n\n                // if the tile is loaded but still fading in, find parents to cross-fade with it\n                const parentTile = this.findLoadedParent(tileID, Math.max(tileID.overscaledZ - SourceCache.maxOverzooming, this._source.minzoom));\n                if (parentTile) {\n                    this._addTile(parentTile.tileID);\n                    parentsForFading[parentTile.tileID.key] = parentTile.tileID;\n                }\n\n                fadingTiles[id] = tileID;\n            }\n\n            // for children tiles with parent tiles still fading in,\n            // retain the children so the parent can fade on top\n            const minZoom = idealTileIDs[idealTileIDs.length - 1].overscaledZ;\n            for (const id in this._tiles) {\n                const childTile = this._tiles[id];\n                if (retain[id] || !childTile.hasData()) {\n                    continue;\n                }\n\n                let parentID = childTile.tileID;\n                while (parentID.overscaledZ > minZoom) {\n                    parentID = parentID.scaledTo(parentID.overscaledZ - 1);\n                    const tile = this._tiles[parentID.key];\n                    if (tile && tile.hasData() && fadingTiles[parentID.key]) {\n                        retain[id] = childTile.tileID;\n                        break;\n                    }\n                }\n            }\n\n            for (const id in parentsForFading) {\n                if (!retain[id]) {\n                    // If a tile is only needed for fading, mark it as covered so that it isn't rendered on it's own.\n                    this._coveredTiles[id] = true;\n                    retain[id] = parentsForFading[id];\n                }\n            }\n        }\n\n        for (const retainedId in retain) {\n            // Make sure retained tiles always clear any existing fade holds\n            // so that if they're removed again their fade timer starts fresh.\n            this._tiles[retainedId].clearFadeHold();\n        }\n\n        // Remove the tiles we don't need anymore.\n        const remove = keysDifference((this._tiles: any), (retain: any));\n        for (const tileID of remove) {\n            const tile = this._tiles[tileID];\n            if (tile.hasSymbolBuckets && !tile.holdingForFade()) {\n                tile.setHoldDuration(this.map._fadeDuration);\n            } else if (!tile.hasSymbolBuckets || tile.symbolFadeFinished()) {\n                this._removeTile(+tileID);\n            }\n        }\n\n        // Construct a cache of loaded parents\n        this._updateLoadedParentTileCache();\n\n        if (this._onlySymbols && this._source.afterUpdate) {\n            this._source.afterUpdate();\n        }\n    }\n\n    releaseSymbolFadeTiles() {\n        for (const id in this._tiles) {\n            if (this._tiles[id].holdingForFade()) {\n                this._removeTile(+id);\n            }\n        }\n    }\n\n    _updateRetainedTiles(idealTileIDs: Array<OverscaledTileID>): {[_: number | string]: OverscaledTileID} {\n        const retain: {[_: number | string]: OverscaledTileID} = {};\n        if (idealTileIDs.length === 0) { return retain; }\n\n        const checked: {[_: number | string]: boolean } = {};\n        const minZoom = idealTileIDs.reduce((min, id) => Math.min(min, id.overscaledZ), Infinity);\n        const maxZoom = idealTileIDs[0].overscaledZ;\n        assert(minZoom <= maxZoom);\n        const minCoveringZoom = Math.max(maxZoom - SourceCache.maxOverzooming, this._source.minzoom);\n        const maxCoveringZoom = Math.max(maxZoom + SourceCache.maxUnderzooming,  this._source.minzoom);\n\n        const missingTiles = {};\n        for (const tileID of idealTileIDs) {\n            const tile = this._addTile(tileID);\n\n            // retain the tile even if it's not loaded because it's an ideal tile.\n            retain[tileID.key] = tileID;\n\n            if (tile.hasData()) continue;\n\n            if (minZoom < this._source.maxzoom) {\n                // save missing tiles that potentially have loaded children\n                missingTiles[tileID.key] = tileID;\n            }\n        }\n\n        // retain any loaded children of ideal tiles up to maxCoveringZoom\n        this._retainLoadedChildren(missingTiles, minZoom, maxCoveringZoom, retain);\n\n        for (const tileID of idealTileIDs) {\n            let tile = this._tiles[tileID.key];\n\n            if (tile.hasData()) continue;\n\n            // The tile we require is not yet loaded or does not exist;\n            // Attempt to find children that fully cover it.\n\n            if (tileID.canonical.z >= this._source.maxzoom) {\n                // We're looking for an overzoomed child tile.\n                const childCoord = tileID.children(this._source.maxzoom)[0];\n                const childTile = this.getTile(childCoord);\n                if (!!childTile && childTile.hasData()) {\n                    retain[childCoord.key] = childCoord;\n                    continue; // tile is covered by overzoomed child\n                }\n            } else {\n                // Check if all 4 immediate children are loaded (in other words, the missing ideal tile is covered)\n                const children = tileID.children(this._source.maxzoom);\n\n                if (retain[children[0].key] &&\n                    retain[children[1].key] &&\n                    retain[children[2].key] &&\n                    retain[children[3].key]) continue; // tile is covered by children\n            }\n\n            // We couldn't find child tiles that entirely cover the ideal tile; look for parents now.\n\n            // As we ascend up the tile pyramid of the ideal tile, we check whether the parent\n            // tile has been previously requested (and errored because we only loop over tiles with no data)\n            // in order to determine if we need to request its parent.\n            let parentWasRequested = tile.wasRequested();\n\n            for (let overscaledZ = tileID.overscaledZ - 1; overscaledZ >= minCoveringZoom; --overscaledZ) {\n                const parentId = tileID.scaledTo(overscaledZ);\n\n                // Break parent tile ascent if this route has been previously checked by another child.\n                if (checked[parentId.key]) break;\n                checked[parentId.key] = true;\n\n                tile = this.getTile(parentId);\n                if (!tile && parentWasRequested) {\n                    tile = this._addTile(parentId);\n                }\n                if (tile) {\n                    retain[parentId.key] = parentId;\n                    // Save the current values, since they're the parent of the next iteration\n                    // of the parent tile ascent loop.\n                    parentWasRequested = tile.wasRequested();\n                    if (tile.hasData()) break;\n                }\n            }\n        }\n\n        return retain;\n    }\n\n    _updateLoadedParentTileCache() {\n        this._loadedParentTiles = {};\n\n        for (const tileKey in this._tiles) {\n            const path = [];\n            let parentTile: ?Tile;\n            let currentId = this._tiles[tileKey].tileID;\n\n            // Find the closest loaded ancestor by traversing the tile tree towards the root and\n            // caching results along the way\n            while (currentId.overscaledZ > 0) {\n\n                // Do we have a cached result from previous traversals?\n                if (currentId.key in this._loadedParentTiles) {\n                    parentTile = this._loadedParentTiles[currentId.key];\n                    break;\n                }\n\n                path.push(currentId.key);\n\n                // Is the parent loaded?\n                const parentId = currentId.scaledTo(currentId.overscaledZ - 1);\n                parentTile = this._getLoadedTile(parentId);\n                if (parentTile) {\n                    break;\n                }\n\n                currentId = parentId;\n            }\n\n            // Cache the result of this traversal to all newly visited tiles\n            for (const key of path) {\n                this._loadedParentTiles[key] = parentTile;\n            }\n        }\n    }\n\n    /**\n     * Add a tile, given its coordinate, to the pyramid.\n     * @private\n     */\n    _addTile(tileID: OverscaledTileID): Tile {\n        let tile: ?Tile = this._tiles[tileID.key];\n        const isExtraShadowCaster = !!this._shadowCasterTiles[tileID.key];\n        if (tile) {\n            if (tile.isExtraShadowCaster === true && !isExtraShadowCaster) {\n                // If the tile changed shadow visibility we need to relayout\n                this._reloadTile(tileID.key, 'reloading');\n            }\n            return tile;\n        }\n        tile = this._cache.getAndRemove(tileID);\n        if (tile) {\n            this._setTileReloadTimer(tileID.key, tile);\n            // set the tileID because the cached tile could have had a different wrap value\n            tile.tileID = tileID;\n            this._state.initializeTileState(tile, this.map ? this.map.painter : null);\n            if (this._cacheTimers[tileID.key]) {\n                clearTimeout(this._cacheTimers[tileID.key]);\n                delete this._cacheTimers[tileID.key];\n                this._setTileReloadTimer(tileID.key, tile);\n            }\n        }\n\n        const cached = Boolean(tile);\n        if (!cached) {\n            const painter = this.map ? this.map.painter : null;\n            const size = this._source.tileSize * tileID.overscaleFactor();\n            const isRasterArray = this._source.type === 'raster-array';\n\n            tile = isRasterArray ?\n                new RasterArrayTile(tileID, size, this.transform.tileZoom, painter, this._isRaster) :\n                new Tile(tileID, size, this.transform.tileZoom, painter, this._isRaster);\n\n            // $FlowFixMe[method-unbinding]\n            this._loadTile(tile, this._tileLoaded.bind(this, tile, tileID.key, tile.state));\n        }\n\n        // Impossible, but silence flow.\n        if (!tile) return (null: any);\n\n        tile.uses++;\n        this._tiles[tileID.key] = tile;\n        if (!cached) this._source.fire(new Event('dataloading', {tile, coord: tile.tileID, dataType: 'source'}));\n\n        return tile;\n    }\n\n    _setTileReloadTimer(id: number, tile: Tile) {\n        if (id in this._timers) {\n            clearTimeout(this._timers[id]);\n            delete this._timers[id];\n        }\n\n        const expiryTimeout = tile.getExpiryTimeout();\n        if (expiryTimeout) {\n            this._timers[id] = setTimeout(() => {\n                this._reloadTile(id, 'expired');\n                delete this._timers[id];\n            }, expiryTimeout);\n        }\n    }\n\n    /**\n     * Remove a tile, given its id, from the pyramid\n     * @private\n     */\n    _removeTile(id: number) {\n        const tile = this._tiles[id];\n        if (!tile)\n            return;\n\n        tile.uses--;\n        delete this._tiles[id];\n        if (this._timers[id]) {\n            clearTimeout(this._timers[id]);\n            delete this._timers[id];\n        }\n\n        if (tile.uses > 0)\n            return;\n\n        if ((tile.hasData() && tile.state !== 'reloading') || tile.state === 'empty') {\n            this._cache.add(tile.tileID, tile, tile.getExpiryTimeout());\n        } else {\n            tile.aborted = true;\n            this._abortTile(tile);\n            this._unloadTile(tile);\n        }\n    }\n\n    /**\n     * Remove all tiles from this pyramid.\n     * @private\n     */\n    clearTiles() {\n        this._shouldReloadOnResume = false;\n        this._paused = false;\n\n        for (const id in this._tiles)\n            this._removeTile(+id);\n\n        if (this._source._clear) this._source._clear();\n\n        this._cache.reset();\n\n        if (this.map && this.usedForTerrain && this.map.painter.terrain) {\n            this.map.painter.terrain.resetTileLookupCache(this.id);\n        }\n    }\n\n    /**\n     * Search through our current tiles and attempt to find the tiles that cover the given `queryGeometry`.\n     *\n     * @param {QueryGeometry} queryGeometry\n     * @param {boolean} [visualizeQueryGeometry=false]\n     * @param {boolean} use3DQuery\n     * @returns\n     * @private\n     */\n    tilesIn(queryGeometry: QueryGeometry, use3DQuery: boolean, visualizeQueryGeometry: boolean): TilespaceQueryGeometry[] {\n        const tileResults = [];\n\n        const transform = this.transform;\n        if (!transform) return tileResults;\n\n        const isGlobe = transform.projection.name === 'globe';\n        const centerX = mercatorXfromLng(transform.center.lng);\n\n        for (const tileID in this._tiles) {\n            const tile = this._tiles[tileID];\n            if (visualizeQueryGeometry) {\n                tile.clearQueryDebugViz();\n            }\n            if (tile.holdingForFade()) {\n                // Tiles held for fading are covered by tiles that are closer to ideal\n                continue;\n            }\n\n            // An array of wrap values for the tile [-1, 0, 1]. The default value is 0 but -1 or 1 wrapping\n            // might be required in globe view due to globe's surface being continuous.\n            let tilesToCheck;\n\n            if (isGlobe) {\n                // Compare distances to copies of the tile to see if a wrapped one should be used.\n                const id = tile.tileID.canonical;\n                assert(tile.tileID.wrap === 0);\n\n                if (id.z === 0) {\n                    // Render the zoom level 0 tile twice as the query polygon might span over the antimeridian\n                    const distances = [\n                        Math.abs(clamp(centerX, ...tileBoundsX(id, -1)) - centerX),\n                        Math.abs(clamp(centerX, ...tileBoundsX(id, 1)) - centerX)\n                    ];\n\n                    tilesToCheck = [0, distances.indexOf(Math.min(...distances)) * 2 - 1];\n                } else {\n                    const distances = [\n                        Math.abs(clamp(centerX, ...tileBoundsX(id, -1)) - centerX),\n                        Math.abs(clamp(centerX, ...tileBoundsX(id, 0)) - centerX),\n                        Math.abs(clamp(centerX, ...tileBoundsX(id, 1)) - centerX)\n                    ];\n\n                    tilesToCheck = [distances.indexOf(Math.min(...distances)) - 1];\n                }\n            } else {\n                tilesToCheck = [0];\n            }\n\n            for (const wrap of tilesToCheck) {\n                const tileResult = queryGeometry.containsTile(tile, transform, use3DQuery, wrap);\n                if (tileResult) {\n                    tileResults.push(tileResult);\n                }\n            }\n        }\n        return tileResults;\n    }\n\n    getShadowCasterCoordinates(): Array<OverscaledTileID> {\n        return this._getRenderableCoordinates(false, true);\n    }\n\n    getVisibleCoordinates(symbolLayer?: boolean): Array<OverscaledTileID> {\n        return this._getRenderableCoordinates(symbolLayer);\n    }\n\n    _getRenderableCoordinates(symbolLayer?: boolean, includeShadowCasters?: boolean): Array<OverscaledTileID> {\n        const coords = this.getRenderableIds(symbolLayer, includeShadowCasters).map((id) => this._tiles[id].tileID);\n        const isGlobe = this.transform.projection.name === 'globe';\n        for (const coord of coords) {\n            coord.projMatrix = this.transform.calculateProjMatrix(coord.toUnwrapped());\n            if (isGlobe) {\n                coord.expandedProjMatrix = this.transform.calculateProjMatrix(coord.toUnwrapped(), false, true);\n            } else {\n                coord.expandedProjMatrix = coord.projMatrix;\n            }\n        }\n        return coords;\n    }\n\n    sortCoordinatesByDistance(coords: Array<OverscaledTileID>): Array<OverscaledTileID> {\n        const sortedCoords = coords.slice();\n\n        const camPos = this.transform._camera.position;\n        const camFwd = this.transform._camera.forward();\n\n        const precomputedDistances: {[number]: number} = {};\n\n        // Precompute distances of tile center points to the camera plane\n        for (const id of sortedCoords) {\n            const invTiles = 1.0 / (1 << id.canonical.z);\n            const centerX = (id.canonical.x + 0.5) * invTiles + id.wrap;\n            const centerY = (id.canonical.y + 0.5) * invTiles;\n\n            precomputedDistances[id.key] = (centerX - camPos[0]) * camFwd[0] + (centerY - camPos[1]) * camFwd[1] - camPos[2] * camFwd[2];\n        }\n\n        sortedCoords.sort((a, b) => { return precomputedDistances[a.key] - precomputedDistances[b.key]; });\n        return sortedCoords;\n    }\n\n    hasTransition(): boolean {\n        if (this._source.hasTransition()) {\n            return true;\n        }\n\n        if (isRasterType(this._source.type)) {\n            for (const id in this._tiles) {\n                const tile = this._tiles[id];\n                if (tile.fadeEndTime !== undefined && tile.fadeEndTime >= browser.now()) {\n                    return true;\n                }\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * Set the value of a particular state for a feature\n     * @private\n     */\n    setFeatureState(sourceLayer?: string, featureId: number | string, state: Object) {\n        sourceLayer = sourceLayer || '_geojsonTileLayer';\n        this._state.updateState(sourceLayer, featureId, state);\n    }\n\n    /**\n     * Resets the value of a particular state key for a feature\n     * @private\n     */\n    removeFeatureState(sourceLayer?: string, featureId?: number | string, key?: string) {\n        sourceLayer = sourceLayer || '_geojsonTileLayer';\n        this._state.removeFeatureState(sourceLayer, featureId, key);\n    }\n\n    /**\n     * Get the entire state object for a feature\n     * @private\n     */\n    getFeatureState(sourceLayer?: string, featureId: number | string): FeatureStates {\n        sourceLayer = sourceLayer || '_geojsonTileLayer';\n        return this._state.getState(sourceLayer, featureId);\n    }\n\n    /**\n     * Sets the set of keys that the tile depends on. This allows tiles to\n     * be reloaded when their dependencies change.\n     * @private\n     */\n    setDependencies(tileKey: number, namespace: string, dependencies: Array<string>) {\n        const tile = this._tiles[tileKey];\n        if (tile) {\n            tile.setDependencies(namespace, dependencies);\n        }\n    }\n\n    /**\n     * Reloads all tiles that depend on the given keys.\n     * @private\n     */\n    reloadTilesForDependencies(namespaces: Array<string>, keys: Array<string>) {\n        for (const id in this._tiles) {\n            const tile = this._tiles[id];\n            if (tile.hasDependency(namespaces, keys)) {\n                this._reloadTile(+id, 'reloading');\n            }\n        }\n        this._cache.filter(tile => !tile.hasDependency(namespaces, keys));\n    }\n\n    /**\n     * Preloads all tiles that will be requested for one or a series of transformations\n     *\n     * @private\n     * @returns {Object} Returns `this` | Promise.\n     */\n    _preloadTiles(transform: Transform | Array<Transform>, callback: Callback<any>) {\n        if (!this._sourceLoaded) {\n            const waitUntilSourceLoaded = () => {\n                if (!this._sourceLoaded) return;\n                this._source.off('data', waitUntilSourceLoaded);\n                this._preloadTiles(transform, callback);\n            };\n\n            this._source.on('data', waitUntilSourceLoaded);\n            return;\n        }\n\n        const coveringTilesIDs: Map<number, OverscaledTileID> = new Map();\n        const transforms = Array.isArray(transform) ? transform : [transform];\n\n        const terrain = this.map.painter.terrain;\n        const tileSize = this.usedForTerrain && terrain ? terrain.getScaledDemTileSize() : this._source.tileSize;\n\n        for (const tr of transforms) {\n            const tileIDs = tr.coveringTiles({\n                tileSize,\n                minzoom: this._source.minzoom,\n                maxzoom: this._source.maxzoom,\n                roundZoom: this._source.roundZoom && !this.usedForTerrain,\n                reparseOverscaled: this._source.reparseOverscaled,\n                isTerrainDEM: this.usedForTerrain\n            });\n\n            for (const tileID of tileIDs) {\n                coveringTilesIDs.set(tileID.key, tileID);\n            }\n\n            if (this.usedForTerrain) {\n                tr.updateElevation(false);\n            }\n        }\n\n        const tileIDs = Array.from(coveringTilesIDs.values());\n\n        asyncAll(tileIDs, (tileID, done) => {\n            const tile = new Tile(tileID, this._source.tileSize * tileID.overscaleFactor(), this.transform.tileZoom, this.map.painter, this._isRaster);\n            this._loadTile(tile, (err) => {\n                if (this._source.type === 'raster-dem' && tile.dem) this._backfillDEM(tile);\n                done(err, tile);\n            });\n        }, callback);\n    }\n}\n\nSourceCache.maxOverzooming = 10;\nSourceCache.maxUnderzooming = 3;\n\nfunction compareTileId(a: OverscaledTileID, b: OverscaledTileID): number {\n    // Different copies of the world are sorted based on their distance to the center.\n    // Wrap values are converted to unsigned distances by reserving odd number for copies\n    // with negative wrap and even numbers for copies with positive wrap.\n    const aWrap = Math.abs(a.wrap * 2) - +(a.wrap < 0);\n    const bWrap = Math.abs(b.wrap * 2) - +(b.wrap < 0);\n    return a.overscaledZ - b.overscaledZ || bWrap - aWrap || b.canonical.y - a.canonical.y || b.canonical.x - a.canonical.x;\n}\n\nfunction isRasterType(type: string): boolean {\n    return type === 'raster' || type === 'image' || type === 'video' || type === 'custom';\n}\n\nfunction tileBoundsX(id: CanonicalTileID, wrap: number): [number, number] {\n    const tiles = 1 << id.z;\n    return [id.x / tiles + wrap, (id.x + 1) / tiles + wrap];\n}\n\nexport default SourceCache;\n","// @flow\n\nimport FillExtrusionBucket from '../data/bucket/fill_extrusion_bucket.js';\nimport StyleLayer from '../style/style_layer.js';\nimport EXTENT from '../style-spec/data/extent.js';\nimport SymbolBucket from '../data/bucket/symbol_bucket.js';\nimport FillExtrusionStyleLayer from '../style/style_layer/fill_extrusion_style_layer.js';\nimport {OverscaledTileID} from './tile_id.js';\n\nimport type Style from '../style/style.js';\nimport type Tiled3dModelBucket from '../../3d-style/data/bucket/tiled_3d_model_bucket.js';\nimport type {Bucket} from '../data/bucket.js';\nimport ModelStyleLayer from '../../3d-style/style/style_layer/model_style_layer.js';\n\nclass BuildingIndex {\n    style: Style;\n    layers: Array<{layer: StyleLayer, visible: boolean}>;\n    currentBuildingBuckets: Array<{bucket: ?Bucket, tileID: OverscaledTileID, verticalScale: number}>;\n    layersGotHidden: boolean; // when layer're hidden since the last frame, don't keep previous elevation, while loading tiles.\n\n    constructor(style: Style) {\n        this.style = style;\n        this.layersGotHidden = false;\n        this.layers = [];\n    }\n\n    processLayersChanged() {\n        this.layers = [];\n        const visible = false, visibilityChanged = false;\n        for (const layerId in this.style._mergedLayers) {\n            const layer = this.style._mergedLayers[layerId];\n            if (layer.type === 'fill-extrusion') {\n                this.layers.push({layer, visible, visibilityChanged});\n            } else if (layer.type === 'model') {\n                const source = this.style.getLayerSource(layer);\n                if (source && source.type === 'batched-model') {\n                    this.layers.push({layer, visible, visibilityChanged});\n                }\n            }\n        }\n    }\n\n    // Check if some of the building layers are disabled or with opacity evaluated to 0.\n    onNewFrame(zoom: number) {\n        this.layersGotHidden = false;\n        for (const l of this.layers) {\n            const layer = l.layer;\n            let visible = false;\n            if (layer.type === 'fill-extrusion') {\n                visible = !layer.isHidden(zoom) && ((layer: any): FillExtrusionStyleLayer).paint.get('fill-extrusion-opacity') > 0.0;\n            } else if (layer.type === 'model') {\n                visible = !layer.isHidden(zoom) && ((layer: any): ModelStyleLayer).paint.get('model-opacity') > 0.0;\n            }\n            this.layersGotHidden = this.layersGotHidden || (!visible && l.visible);\n            l.visible = visible;\n        }\n    }\n\n    updateZOffset(symbolBucket: SymbolBucket, tileID: OverscaledTileID) {\n        // prepare lookup from bucket to overlapping buckets of all building layers.\n        this.currentBuildingBuckets = [];\n        for (const l of this.layers) {\n            const layer = l.layer;\n            const sourceCache = this.style.getLayerSourceCache(layer);\n\n            let verticalScale = 1;\n            if (layer.type === 'fill-extrusion') {\n                verticalScale = l.visible ? ((layer: any): FillExtrusionStyleLayer).paint.get('fill-extrusion-vertical-scale') : 0;\n            }\n\n            let tile = sourceCache ? sourceCache.getTile(tileID) : null;\n\n            if (!tile && sourceCache && tileID.canonical.z > sourceCache.getSource().minzoom) {\n                let id = tileID.scaledTo(Math.min(sourceCache.getSource().maxzoom, tileID.overscaledZ - 1));\n                while (id.overscaledZ >= sourceCache.getSource().minzoom) {\n                    tile = sourceCache.getTile(id);\n                    if (tile || id.overscaledZ === 0) break;\n                    id = id.scaledTo(id.overscaledZ - 1);\n                }\n            }\n            this.currentBuildingBuckets.push({bucket: tile ? tile.getBucket(layer) : null, tileID: tile ? tile.tileID : tileID, verticalScale});\n        }\n\n        symbolBucket.hasAnyZOffset = false;\n        let dataChanged = false;\n        for (let s = 0; s < symbolBucket.symbolInstances.length; s++) {\n            const symbolInstance = symbolBucket.symbolInstances.get(s);\n            const currentZOffset = symbolInstance.zOffset;\n            const newZOffset = this._getHeightAtTileOffset(tileID, symbolInstance.tileAnchorX, symbolInstance.tileAnchorY);\n\n            // When zooming over integer zooms, keep the elevation while loading building buckets.\n            symbolInstance.zOffset = newZOffset !== Number.NEGATIVE_INFINITY ? newZOffset : currentZOffset;\n\n            if (!dataChanged && currentZOffset !== symbolInstance.zOffset) {\n                dataChanged = true;\n            }\n            if (!symbolBucket.hasAnyZOffset && symbolInstance.zOffset !== 0) {\n                symbolBucket.hasAnyZOffset = true;\n            }\n        }\n        if (dataChanged) {\n            symbolBucket.zOffsetBuffersNeedUpload = true;\n            symbolBucket.zOffsetSortDirty = true;\n        }\n    }\n\n    _mapCoordToOverlappingTile(tid: OverscaledTileID, x: number, y: number, targetTileID: OverscaledTileID): {tileX: number, tileY: number} {\n        let tileX = x;\n        let tileY = y;\n        const tileID = targetTileID;\n        if (tid.canonical.z !== tileID.canonical.z) {\n            const id =  tileID.canonical;\n            const zDiff = 1. / (1 << (tid.canonical.z - id.z));\n            tileX = ((x + tid.canonical.x * EXTENT) * zDiff - id.x * EXTENT) | 0;\n            tileY = ((y + tid.canonical.y * EXTENT) * zDiff - id.y * EXTENT) | 0;\n        }\n        return {tileX, tileY};\n    }\n\n    _getHeightAtTileOffset(tid: OverscaledTileID, x: number, y: number): number {\n        let availableHeight;\n        let maxFillExtrusionHeight;\n        // use FE data when landmark height is not available. Instead of assuming order, process\n        // fill extrusions before landmarks\n        for (let i = 0; i < this.layers.length; ++i) {\n            const l = this.layers[i];\n            const layer = l.layer;\n            if (layer.type !== 'fill-extrusion') continue;\n            const {bucket, tileID, verticalScale} = this.currentBuildingBuckets[i];\n            if (!bucket) continue;\n\n            const {tileX, tileY} = this._mapCoordToOverlappingTile(tid, x, y, tileID);\n\n            const b: FillExtrusionBucket = (bucket: any);\n            const heightData = b.getHeightAtTileCoord(tileX, tileY);\n            if (!heightData || heightData.height === undefined) continue;\n            if (heightData.hidden) { // read height, even if fill extrusion is hidden, until it is used for tiled 3D models.\n                availableHeight = heightData.height;\n                continue;\n            }\n            maxFillExtrusionHeight = Math.max(heightData.height * verticalScale, maxFillExtrusionHeight || 0);\n        }\n        if (maxFillExtrusionHeight !== undefined) {\n            return maxFillExtrusionHeight;\n        }\n\n        for (let i = 0; i < this.layers.length; ++i) {\n            const l = this.layers[i];\n            const layer = l.layer;\n            if (layer.type !== 'model' || !l.visible) continue;\n            const {bucket, tileID} = this.currentBuildingBuckets[i];\n            if (!bucket) continue;\n\n            const {tileX, tileY} = this._mapCoordToOverlappingTile(tid, x, y, tileID);\n\n            const b: Tiled3dModelBucket = (bucket: any);\n            const heightData = b.getHeightAtTileCoord(tileX, tileY);\n            if (!heightData || heightData.hidden) continue;\n            if (heightData.height === undefined && availableHeight !== undefined) return Math.min(heightData.maxHeight, availableHeight) * heightData.verticalScale;\n            return heightData.height ? heightData.height * heightData.verticalScale : Number.NEGATIVE_INFINITY;\n        }\n        // If we couldn't find a bucket, return Number.NEGATIVE_INFINITY. If a layer got hidden since previous frame, place symbols on ground.\n        return this.layersGotHidden ? 0 : Number.NEGATIVE_INFINITY;\n    }\n}\n\nexport default BuildingIndex;\n","// @flow\n\nimport refProperties from './util/ref_properties.js';\n\nimport type {LayerSpecification} from './types.js';\n\nfunction deref(layer: LayerSpecification, parent: LayerSpecification): LayerSpecification {\n    const result = {};\n\n    for (const k in layer) {\n        if (k !== 'ref') {\n            result[k] = layer[k];\n        }\n    }\n\n    refProperties.forEach((k) => {\n        if (k in parent) {\n            result[k] = (parent: any)[k];\n        }\n    });\n\n    return ((result: any): LayerSpecification);\n}\n\n/**\n * Given an array of layers, some of which may contain `ref` properties\n * whose value is the `id` of another property, return a new array where\n * such layers have been augmented with the 'type', 'source', etc. properties\n * from the parent layer, and the `ref` property has been removed.\n *\n * The input is not modified. The output may contain references to portions\n * of the input.\n *\n * @private\n * @param {Array<Layer>} layers\n * @returns {Array<Layer>}\n */\nexport default function derefLayers(layers: Array<LayerSpecification>): Array<LayerSpecification> {\n    layers = layers.slice();\n\n    const map: Object = Object.create(null);\n    for (let i = 0; i < layers.length; i++) {\n        map[layers[i].id] = layers[i];\n    }\n\n    for (let i = 0; i < layers.length; i++) {\n        if ('ref' in layers[i]) {\n            layers[i] = deref(layers[i], map[(layers[i]: any).ref]);\n        }\n    }\n\n    return layers;\n}\n","// @flow\n\nimport isEqual from './util/deep_equal.js';\n\nimport type {StyleSpecification, ImportSpecification, SourceSpecification, LayerSpecification} from './types.js';\n\ntype Sources = { [string]: SourceSpecification };\n\ntype Command = {\n    command: string;\n    args: Array<any>;\n};\n\nexport const operations: {[_: string]: string} = {\n\n    /*\n     * { command: 'setStyle', args: [stylesheet] }\n     */\n    setStyle: 'setStyle',\n\n    /*\n     * { command: 'addLayer', args: [layer, 'beforeLayerId'] }\n     */\n    addLayer: 'addLayer',\n\n    /*\n     * { command: 'removeLayer', args: ['layerId'] }\n     */\n    removeLayer: 'removeLayer',\n\n    /*\n     * { command: 'setPaintProperty', args: ['layerId', 'prop', value] }\n     */\n    setPaintProperty: 'setPaintProperty',\n\n    /*\n     * { command: 'setLayoutProperty', args: ['layerId', 'prop', value] }\n     */\n    setLayoutProperty: 'setLayoutProperty',\n\n    /*\n     * { command: 'setSlot', args: ['layerId', slot] }\n     */\n    setSlot: 'setSlot',\n\n    /*\n     * { command: 'setFilter', args: ['layerId', filter] }\n     */\n    setFilter: 'setFilter',\n\n    /*\n     * { command: 'addSource', args: ['sourceId', source] }\n     */\n    addSource: 'addSource',\n\n    /*\n     * { command: 'removeSource', args: ['sourceId'] }\n     */\n    removeSource: 'removeSource',\n\n    /*\n     * { command: 'setGeoJSONSourceData', args: ['sourceId', data] }\n     */\n    setGeoJSONSourceData: 'setGeoJSONSourceData',\n\n    /*\n     * { command: 'setLayerZoomRange', args: ['layerId', 0, 22] }\n     */\n    setLayerZoomRange: 'setLayerZoomRange',\n\n    /*\n     * { command: 'setLayerProperty', args: ['layerId', 'prop', value] }\n     */\n    setLayerProperty: 'setLayerProperty',\n\n    /*\n     * { command: 'setCenter', args: [[lon, lat]] }\n     */\n    setCenter: 'setCenter',\n\n    /*\n     * { command: 'setZoom', args: [zoom] }\n     */\n    setZoom: 'setZoom',\n\n    /*\n     * { command: 'setBearing', args: [bearing] }\n     */\n    setBearing: 'setBearing',\n\n    /*\n     * { command: 'setPitch', args: [pitch] }\n     */\n    setPitch: 'setPitch',\n\n    /*\n     * { command: 'setSprite', args: ['spriteUrl'] }\n     */\n    setSprite: 'setSprite',\n\n    /*\n     * { command: 'setGlyphs', args: ['glyphsUrl'] }\n     */\n    setGlyphs: 'setGlyphs',\n\n    /*\n     * { command: 'setTransition', args: [transition] }\n     */\n    setTransition: 'setTransition',\n\n    /*\n     * { command: 'setLighting', args: [lightProperties] }\n     */\n    setLight: 'setLight',\n\n    /*\n     * { command: 'setTerrain', args: [terrainProperties] }\n     */\n    setTerrain: 'setTerrain',\n\n    /*\n     *  { command: 'setFog', args: [fogProperties] }\n     */\n    setFog: 'setFog',\n\n    /*\n     *  { command: 'setCamera', args: [cameraProperties] }\n     */\n    setCamera: 'setCamera',\n\n    /*\n     *  { command: 'setLights', args: [{light-3d},...] }\n     */\n    setLights: 'setLights',\n\n    /*\n     *  { command: 'setProjection', args: [projectionProperties] }\n     */\n    setProjection: 'setProjection',\n\n    /*\n     *  { command: 'addImport', args: [import] }\n     */\n    addImport: 'addImport',\n\n    /*\n     *  { command: 'removeImport', args: [importId] }\n     */\n    removeImport: 'removeImport',\n\n    /**\n     * { command: 'updateImport', args: [importId, importSpecification | styleUrl] }\n     */\n    updateImport: 'updateImport'\n};\n\nfunction addSource(sourceId: string, after: Sources, commands: Array<Command>) {\n    commands.push({command: operations.addSource, args: [sourceId, after[sourceId]]});\n}\n\nfunction removeSource(sourceId: string, commands: Array<Command>, sourcesRemoved: {[string]: true}) {\n    commands.push({command: operations.removeSource, args: [sourceId]});\n    sourcesRemoved[sourceId] = true;\n}\n\nfunction updateSource(sourceId: string, after: Sources, commands: Array<Command>, sourcesRemoved: {[string]: true}) {\n    removeSource(sourceId, commands, sourcesRemoved);\n    addSource(sourceId, after, commands);\n}\n\nfunction canUpdateGeoJSON(before: Sources, after: Sources, sourceId: string) {\n    let prop;\n    for (prop in before[sourceId]) {\n        if (!before[sourceId].hasOwnProperty(prop)) continue;\n        if (prop !== 'data' && !isEqual(before[sourceId][prop], after[sourceId][prop])) {\n            return false;\n        }\n    }\n    for (prop in after[sourceId]) {\n        if (!after[sourceId].hasOwnProperty(prop)) continue;\n        if (prop !== 'data' && !isEqual(before[sourceId][prop], after[sourceId][prop])) {\n            return false;\n        }\n    }\n    return true;\n}\n\nfunction diffSources(before: Sources, after: Sources, commands: Array<Command>, sourcesRemoved: {[string]: true}) {\n    before = before || {};\n    after = after || {};\n\n    let sourceId;\n\n    // look for sources to remove\n    for (sourceId in before) {\n        if (!before.hasOwnProperty(sourceId)) continue;\n        if (!after.hasOwnProperty(sourceId)) {\n            removeSource(sourceId, commands, sourcesRemoved);\n        }\n    }\n\n    // look for sources to add/update\n    for (sourceId in after) {\n        if (!after.hasOwnProperty(sourceId)) continue;\n        const source = after[sourceId];\n        if (!before.hasOwnProperty(sourceId)) {\n            addSource(sourceId, after, commands);\n        } else if (!isEqual(before[sourceId], source)) {\n            if (before[sourceId].type === 'geojson' && source.type === 'geojson' && canUpdateGeoJSON(before, after, sourceId)) {\n                commands.push({command: operations.setGeoJSONSourceData, args: [sourceId, source.data]});\n            } else {\n                // no update command, must remove then add\n                updateSource(sourceId, after, commands, sourcesRemoved);\n            }\n        }\n    }\n}\n\nfunction diffLayerPropertyChanges(before: any, after: any, commands: Array<Command>, layerId: string, klass: ?string, command: string) {\n    before = before || {};\n    after = after || {};\n\n    let prop;\n\n    for (prop in before) {\n        if (!before.hasOwnProperty(prop)) continue;\n        if (!isEqual(before[prop], after[prop])) {\n            commands.push({command, args: [layerId, prop, after[prop], klass]});\n        }\n    }\n    for (prop in after) {\n        if (!after.hasOwnProperty(prop) || before.hasOwnProperty(prop)) continue;\n        if (!isEqual(before[prop], after[prop])) {\n            commands.push({command, args: [layerId, prop, after[prop], klass]});\n        }\n    }\n}\n\nfunction pluckId<T: {id: string}>(item: T): string {\n    return item.id;\n}\n\nfunction indexById<T: {id: string}>(group: {[string]: T}, item: T): {[id: string]: T} {\n    group[item.id] = item;\n    return group;\n}\n\nfunction diffLayers(before: Array<LayerSpecification>, after: Array<LayerSpecification>, commands: Array<Command>) {\n    before = before || [];\n    after = after || [];\n\n    // order of layers by id\n    const beforeOrder = before.map(pluckId);\n    const afterOrder = after.map(pluckId);\n\n    // index of layer by id\n    const beforeIndex = before.reduce(indexById, {});\n    const afterIndex = after.reduce(indexById, {});\n\n    // track order of layers as if they have been mutated\n    const tracker = beforeOrder.slice();\n\n    // layers that have been added do not need to be diffed\n    const clean: Object = Object.create(null);\n\n    let i, d, layerId, beforeLayer: LayerSpecification, afterLayer: LayerSpecification, insertBeforeLayerId, prop;\n\n    // remove layers\n    for (i = 0, d = 0; i < beforeOrder.length; i++) {\n        layerId = beforeOrder[i];\n        if (!afterIndex.hasOwnProperty(layerId)) {\n            commands.push({command: operations.removeLayer, args: [layerId]});\n            tracker.splice(tracker.indexOf(layerId, d), 1);\n        } else {\n            // limit where in tracker we need to look for a match\n            d++;\n        }\n    }\n\n    // add/reorder layers\n    for (i = 0, d = 0; i < afterOrder.length; i++) {\n        // work backwards as insert is before an existing layer\n        layerId = afterOrder[afterOrder.length - 1 - i];\n\n        if (tracker[tracker.length - 1 - i] === layerId) continue;\n\n        if (beforeIndex.hasOwnProperty(layerId)) {\n            // remove the layer before we insert at the correct position\n            commands.push({command: operations.removeLayer, args: [layerId]});\n            tracker.splice(tracker.lastIndexOf(layerId, tracker.length - d), 1);\n        } else {\n            // limit where in tracker we need to look for a match\n            d++;\n        }\n\n        // add layer at correct position\n        insertBeforeLayerId = tracker[tracker.length - i];\n        commands.push({command: operations.addLayer, args: [afterIndex[layerId], insertBeforeLayerId]});\n        tracker.splice(tracker.length - i, 0, layerId);\n        clean[layerId] = true;\n    }\n\n    // update layers\n    for (i = 0; i < afterOrder.length; i++) {\n        layerId = afterOrder[i];\n        beforeLayer = beforeIndex[layerId];\n        afterLayer = afterIndex[layerId];\n\n        // no need to update if previously added (new or moved)\n        if (clean[layerId] || isEqual(beforeLayer, afterLayer)) continue;\n\n        // If source, source-layer, or type have changes, then remove the layer\n        // and add it back 'from scratch'.\n        // $FlowFixMe[prop-missing] - there is no `source-layer` in background and sky layers\n        if (!isEqual(beforeLayer.source, afterLayer.source) || !isEqual(beforeLayer['source-layer'], afterLayer['source-layer']) || !isEqual(beforeLayer.type, afterLayer.type)) {\n            commands.push({command: operations.removeLayer, args: [layerId]});\n            // we add the layer back at the same position it was already in, so\n            // there's no need to update the `tracker`\n            insertBeforeLayerId = tracker[tracker.lastIndexOf(layerId) + 1];\n            commands.push({command: operations.addLayer, args: [afterLayer, insertBeforeLayerId]});\n            continue;\n        }\n\n        // layout, paint, filter, minzoom, maxzoom\n        diffLayerPropertyChanges(beforeLayer.layout, afterLayer.layout, commands, layerId, null, operations.setLayoutProperty);\n        diffLayerPropertyChanges(beforeLayer.paint, afterLayer.paint, commands, layerId, null, operations.setPaintProperty);\n        if (!isEqual(beforeLayer.slot, afterLayer.slot)) {\n            commands.push({command: operations.setSlot, args: [layerId, afterLayer.slot]});\n        }\n        if (!isEqual(beforeLayer.filter, afterLayer.filter)) {\n            commands.push({command: operations.setFilter, args: [layerId, afterLayer.filter]});\n        }\n        if (!isEqual(beforeLayer.minzoom, afterLayer.minzoom) || !isEqual(beforeLayer.maxzoom, afterLayer.maxzoom)) {\n            commands.push({command: operations.setLayerZoomRange, args: [layerId, afterLayer.minzoom, afterLayer.maxzoom]});\n        }\n\n        // handle all other layer props, including paint.*\n        for (prop in beforeLayer) {\n            if (!beforeLayer.hasOwnProperty(prop)) continue;\n            if (prop === 'layout' || prop === 'paint' || prop === 'filter' ||\n                prop === 'metadata' || prop === 'minzoom' || prop === 'maxzoom' || prop === 'slot') continue;\n            if (prop.indexOf('paint.') === 0) {\n                diffLayerPropertyChanges(beforeLayer[prop], afterLayer[prop], commands, layerId, prop.slice(6), operations.setPaintProperty);\n            } else if (!isEqual(beforeLayer[prop], afterLayer[prop])) {\n                commands.push({command: operations.setLayerProperty, args: [layerId, prop, afterLayer[prop]]});\n            }\n        }\n        for (prop in afterLayer) {\n            if (!afterLayer.hasOwnProperty(prop) || beforeLayer.hasOwnProperty(prop)) continue;\n            if (prop === 'layout' || prop === 'paint' || prop === 'filter' ||\n                prop === 'metadata' || prop === 'minzoom' || prop === 'maxzoom' || prop === 'slot') continue;\n            if (prop.indexOf('paint.') === 0) {\n                diffLayerPropertyChanges(beforeLayer[prop], afterLayer[prop], commands, layerId, prop.slice(6), operations.setPaintProperty);\n            } else if (!isEqual(beforeLayer[prop], afterLayer[prop])) {\n                commands.push({command: operations.setLayerProperty, args: [layerId, prop, afterLayer[prop]]});\n            }\n        }\n    }\n}\n\nexport function diffImports(before: Array<ImportSpecification> = [], after: Array<ImportSpecification> = [], commands: Array<Command>) {\n    before = before || [];\n    after = after || [];\n\n    // order imports by id\n    const beforeOrder = before.map(pluckId);\n    const afterOrder = after.map(pluckId);\n\n    // index imports by id\n    const beforeIndex = before.reduce(indexById, {});\n    const afterIndex = after.reduce(indexById, {});\n\n    // track order of imports as if they have been mutated\n    const tracker = beforeOrder.slice();\n\n    let i, d, importId, insertBefore;\n\n    // remove imports\n    for (i = 0, d = 0; i < beforeOrder.length; i++) {\n        importId = beforeOrder[i];\n        if (!afterIndex.hasOwnProperty(importId)) {\n            commands.push({command: operations.removeImport, args: [importId]});\n            tracker.splice(tracker.indexOf(importId, d), 1);\n        } else {\n            // limit where in tracker we need to look for a match\n            d++;\n        }\n    }\n\n    // add/reorder imports\n    for (i = 0, d = 0; i < afterOrder.length; i++) {\n        // work backwards as insert is before an existing import\n        importId = afterOrder[afterOrder.length - 1 - i];\n\n        if (tracker[tracker.length - 1 - i] === importId) continue;\n\n        if (beforeIndex.hasOwnProperty(importId)) {\n            // remove the import before we insert at the correct position\n            commands.push({command: operations.removeImport, args: [importId]});\n            tracker.splice(tracker.lastIndexOf(importId, tracker.length - d), 1);\n        } else {\n            // limit where in tracker we need to look for a match\n            d++;\n        }\n\n        // add import at correct position\n        insertBefore = tracker[tracker.length - i];\n        commands.push({command: operations.addImport, args: [afterIndex[importId], insertBefore]});\n        tracker.splice(tracker.length - i, 0, importId);\n    }\n\n    // update imports\n    for (const afterImport of after) {\n        const beforeImport = beforeIndex[afterImport.id];\n        if (!beforeImport || isEqual(beforeImport, afterImport)) continue;\n\n        commands.push({command: operations.updateImport, args: [afterImport.id, afterImport]});\n    }\n}\n\n/**\n * Diff two stylesheet\n *\n * Creates semanticly aware diffs that can easily be applied at runtime.\n * Operations produced by the diff closely resemble the mapbox-gl-js API. Any\n * error creating the diff will fall back to the 'setStyle' operation.\n *\n * Example diff:\n * [\n *     { command: 'setConstant', args: ['@water', '#0000FF'] },\n *     { command: 'setPaintProperty', args: ['background', 'background-color', 'black'] }\n * ]\n *\n * @private\n * @param {*} [before] stylesheet to compare from\n * @param {*} after stylesheet to compare to\n * @returns Array list of changes\n */\nexport default function diffStyles(before: StyleSpecification, after: StyleSpecification): Array<Command> {\n    if (!before) return [{command: operations.setStyle, args: [after]}];\n\n    let commands: Array<Command> = [];\n\n    try {\n        // Handle changes to top-level properties\n        if (!isEqual(before.version, after.version)) {\n            return [{command: operations.setStyle, args: [after]}];\n        }\n        if (!isEqual(before.center, after.center)) {\n            commands.push({command: operations.setCenter, args: [after.center]});\n        }\n        if (!isEqual(before.zoom, after.zoom)) {\n            commands.push({command: operations.setZoom, args: [after.zoom]});\n        }\n        if (!isEqual(before.bearing, after.bearing)) {\n            commands.push({command: operations.setBearing, args: [after.bearing]});\n        }\n        if (!isEqual(before.pitch, after.pitch)) {\n            commands.push({command: operations.setPitch, args: [after.pitch]});\n        }\n        if (!isEqual(before.sprite, after.sprite)) {\n            commands.push({command: operations.setSprite, args: [after.sprite]});\n        }\n        if (!isEqual(before.glyphs, after.glyphs)) {\n            commands.push({command: operations.setGlyphs, args: [after.glyphs]});\n        }\n        // Handle changes to `imports` before other mergable top-level properties\n        if (!isEqual(before.imports, after.imports)) {\n            diffImports(before.imports, after.imports, commands);\n        }\n        if (!isEqual(before.transition, after.transition)) {\n            commands.push({command: operations.setTransition, args: [after.transition]});\n        }\n        if (!isEqual(before.light, after.light)) {\n            commands.push({command: operations.setLight, args: [after.light]});\n        }\n        if (!isEqual(before.fog, after.fog)) {\n            commands.push({command: operations.setFog, args: [after.fog]});\n        }\n        if (!isEqual(before.projection, after.projection)) {\n            commands.push({command: operations.setProjection, args: [after.projection]});\n        }\n        if (!isEqual(before.lights, after.lights)) {\n            commands.push({command: operations.setLights, args: [after.lights]});\n        }\n        if (!isEqual(before.camera, after.camera)) {\n            commands.push({command: operations.setCamera, args: [after.camera]});\n        }\n\n        // Handle changes to `sources`\n        // If a source is to be removed, we also--before the removeSource\n        // command--need to remove all the style layers that depend on it.\n        const sourcesRemoved = {};\n\n        // First collect the {add,remove}Source commands\n        const removeOrAddSourceCommands = [];\n        diffSources(before.sources, after.sources, removeOrAddSourceCommands, sourcesRemoved);\n\n        // Push a removeLayer command for each style layer that depends on a\n        // source that's being removed.\n        // Also, exclude any such layers them from the input to `diffLayers`\n        // below, so that diffLayers produces the appropriate `addLayers`\n        // command\n        const beforeLayers = [];\n        if (before.layers) {\n            before.layers.forEach((layer) => {\n                if (layer.source && sourcesRemoved[layer.source]) {\n                    commands.push({command: operations.removeLayer, args: [layer.id]});\n                } else {\n                    beforeLayers.push(layer);\n                }\n            });\n        }\n\n        // Remove the terrain if the source for that terrain is being removed\n        let beforeTerrain = before.terrain;\n        if (beforeTerrain) {\n            if (sourcesRemoved[beforeTerrain.source]) {\n                commands.push({command: operations.setTerrain, args: [undefined]});\n                beforeTerrain = undefined;\n            }\n        }\n\n        commands = commands.concat(removeOrAddSourceCommands);\n\n        // Even though terrain is a top-level property\n        // Its like a layer in the sense that it depends on a source being present.\n        if (!isEqual(beforeTerrain, after.terrain)) {\n            commands.push({command: operations.setTerrain, args: [after.terrain]});\n        }\n\n        // Handle changes to `layers`\n        diffLayers(beforeLayers, after.layers, commands);\n    } catch (e) {\n        // fall back to setStyle\n        console.warn('Unable to compute style diff:', e);\n        commands = [{command: operations.setStyle, args: [after]}];\n    }\n\n    return commands;\n}\n","// @flow\n\nimport {clamp} from '../util/util.js';\nimport Point from '@mapbox/point-geometry';\nimport assert from 'assert';\n\nclass PathInterpolator {\n    points: Array<Point>;\n    length: number;\n    paddedLength: number;\n    padding: number;\n    _distances: Array<number>;\n\n    constructor(points_: ?Array<Point>, padding_: ?number) {\n        this.reset(points_, padding_);\n    }\n\n    reset(points_: ?Array<Point>, padding_: ?number) {\n        this.points = points_ || [];\n\n        // Compute cumulative distance from first point to every other point in the segment.\n        // Last entry in the array is total length of the path\n        this._distances = [0.0];\n\n        for (let i = 1; i < this.points.length; i++) {\n            this._distances[i] = this._distances[i - 1] + this.points[i].dist(this.points[i - 1]);\n        }\n\n        this.length = this._distances[this._distances.length - 1];\n        this.padding = Math.min(padding_ || 0, this.length * 0.5);\n        this.paddedLength = this.length - this.padding * 2.0;\n    }\n\n    lerp(t: number): Point {\n        assert(this.points.length > 0);\n        if (this.points.length === 1) {\n            return this.points[0];\n        }\n\n        t = clamp(t, 0, 1);\n\n        // Find the correct segment [p0, p1] where p0 <= x < p1\n        let currentIndex = 1;\n        let distOfCurrentIdx = this._distances[currentIndex];\n        const distToTarget = t * this.paddedLength + this.padding;\n\n        while (distOfCurrentIdx < distToTarget && currentIndex < this._distances.length) {\n            distOfCurrentIdx = this._distances[++currentIndex];\n        }\n\n        // Interpolate between the two points of the segment\n        const idxOfPrevPoint = currentIndex - 1;\n        const distOfPrevIdx = this._distances[idxOfPrevPoint];\n        const segmentLength = distOfCurrentIdx - distOfPrevIdx;\n        const segmentT = segmentLength > 0 ? (distToTarget - distOfPrevIdx) / segmentLength : 0;\n\n        return this.points[idxOfPrevPoint].mult(1.0 - segmentT).add(this.points[currentIndex].mult(segmentT));\n    }\n}\n\nexport default PathInterpolator;\n","// @flow\n\ntype GridItem = {\n    key: any,\n    x1: number,\n    y1: number,\n    x2: number,\n    y2: number\n};\n\n/**\n * GridIndex is a data structure for testing the intersection of\n * circles and rectangles in a 2d plane.\n * It is optimized for rapid insertion and querying.\n * GridIndex splits the plane into a set of \"cells\" and keeps track\n * of which geometries intersect with each cell. At query time,\n * full geometry comparisons are only done for items that share\n * at least one cell. As long as the geometries are relatively\n * uniformly distributed across the plane, this greatly reduces\n * the number of comparisons necessary.\n *\n * @private\n */\nclass GridIndex {\n    circleKeys: Array<any>;\n    boxKeys: Array<any>;\n    boxCells: Array<Array<number>>;\n    circleCells: Array<Array<number>>;\n    bboxes: Array<number>;\n    circles: Array<number>;\n    xCellCount: number;\n    yCellCount: number;\n    width: number;\n    height: number;\n    xScale: number;\n    yScale: number;\n    boxUid: number;\n    circleUid: number;\n\n    constructor (width: number, height: number, cellSize: number) {\n        const boxCells = this.boxCells = [];\n        const circleCells = this.circleCells = [];\n\n        // More cells -> fewer geometries to check per cell, but items tend\n        // to be split across more cells.\n        // Sweet spot allows most small items to fit in one cell\n        this.xCellCount = Math.ceil(width / cellSize);\n        this.yCellCount = Math.ceil(height / cellSize);\n\n        for (let i = 0; i < this.xCellCount * this.yCellCount; i++) {\n            boxCells.push([]);\n            circleCells.push([]);\n        }\n        this.circleKeys = [];\n        this.boxKeys = [];\n        this.bboxes = [];\n        this.circles = [];\n\n        this.width = width;\n        this.height = height;\n        this.xScale = this.xCellCount / width;\n        this.yScale = this.yCellCount / height;\n        this.boxUid = 0;\n        this.circleUid = 0;\n    }\n\n    keysLength(): number {\n        return this.boxKeys.length + this.circleKeys.length;\n    }\n\n    insert(key: any, x1: number, y1: number, x2: number, y2: number) {\n        // $FlowFixMe[method-unbinding]\n        this._forEachCell(x1, y1, x2, y2, this._insertBoxCell, this.boxUid++);\n        this.boxKeys.push(key);\n        this.bboxes.push(x1);\n        this.bboxes.push(y1);\n        this.bboxes.push(x2);\n        this.bboxes.push(y2);\n    }\n\n    insertCircle(key: any, x: number, y: number, radius: number) {\n        // Insert circle into grid for all cells in the circumscribing square\n        // It's more than necessary (by a factor of 4/PI), but fast to insert\n        // $FlowFixMe[method-unbinding]\n        this._forEachCell(x - radius, y - radius, x + radius, y + radius, this._insertCircleCell, this.circleUid++);\n        this.circleKeys.push(key);\n        this.circles.push(x);\n        this.circles.push(y);\n        this.circles.push(radius);\n    }\n\n    _insertBoxCell(x1: number, y1: number, x2: number, y2: number, cellIndex: number, uid: number) {\n        this.boxCells[cellIndex].push(uid);\n    }\n\n    _insertCircleCell(x1: number, y1: number, x2: number, y2: number, cellIndex: number, uid: number)  {\n        this.circleCells[cellIndex].push(uid);\n    }\n\n    _query(x1: number, y1: number, x2: number, y2: number, hitTest: boolean, predicate?: any): boolean | Array<GridItem> {\n        if (x2 < 0 || x1 > this.width || y2 < 0 || y1 > this.height) {\n            return hitTest ? false : [];\n        }\n        const result = [];\n        if (x1 <= 0 && y1 <= 0 && this.width <= x2 && this.height <= y2) {\n            if (hitTest) {\n                return true;\n            }\n            for (let boxUid = 0; boxUid < this.boxKeys.length; boxUid++) {\n                result.push({\n                    key: this.boxKeys[boxUid],\n                    x1: this.bboxes[boxUid * 4],\n                    y1: this.bboxes[boxUid * 4 + 1],\n                    x2: this.bboxes[boxUid * 4 + 2],\n                    y2: this.bboxes[boxUid * 4 + 3]\n                });\n            }\n            for (let circleUid = 0; circleUid < this.circleKeys.length; circleUid++) {\n                const x = this.circles[circleUid * 3];\n                const y = this.circles[circleUid * 3 + 1];\n                const radius = this.circles[circleUid * 3 + 2];\n                result.push({\n                    key: this.circleKeys[circleUid],\n                    x1: x - radius,\n                    y1: y - radius,\n                    x2: x + radius,\n                    y2: y + radius\n                });\n            }\n            return predicate ? result.filter(predicate) : result;\n        } else {\n            const queryArgs = {\n                hitTest,\n                seenUids: {box: {}, circle: {}}\n            };\n            // $FlowFixMe[method-unbinding]\n            this._forEachCell(x1, y1, x2, y2, this._queryCell, result, queryArgs, predicate);\n            return hitTest ? result.length > 0 : result;\n        }\n    }\n\n    _queryCircle(x: number, y: number, radius: number, hitTest: boolean, predicate?: any): boolean | Array<GridItem> {\n        // Insert circle into grid for all cells in the circumscribing square\n        // It's more than necessary (by a factor of 4/PI), but fast to insert\n        const x1 = x - radius;\n        const x2 = x + radius;\n        const y1 = y - radius;\n        const y2 = y + radius;\n        if (x2 < 0 || x1 > this.width || y2 < 0 || y1 > this.height) {\n            return hitTest ? false : [];\n        }\n\n        // Box query early exits if the bounding box is larger than the grid, but we don't do\n        // the equivalent calculation for circle queries because early exit is less likely\n        // and the calculation is more expensive\n        const result = [];\n        const queryArgs = {\n            hitTest,\n            circle: {x, y, radius},\n            seenUids: {box: {}, circle: {}}\n        };\n        // $FlowFixMe[method-unbinding]\n        this._forEachCell(x1, y1, x2, y2, this._queryCellCircle, result, queryArgs, predicate);\n        return hitTest ? result.length > 0 : result;\n    }\n\n    query(x1: number, y1: number, x2: number, y2: number, predicate?: any): Array<GridItem> {\n        return (this._query(x1, y1, x2, y2, false, predicate): any);\n    }\n\n    hitTest(x1: number, y1: number, x2: number, y2: number, predicate?: any): boolean  {\n        return (this._query(x1, y1, x2, y2, true, predicate): any);\n    }\n\n    hitTestCircle(x: number, y: number, radius: number, predicate?: any): boolean {\n        return (this._queryCircle(x, y, radius, true, predicate): any);\n    }\n\n    _queryCell(x1: number, y1: number, x2: number, y2: number, cellIndex: number, result: any, queryArgs: any, predicate?: any): void | boolean {\n        const seenUids = queryArgs.seenUids;\n        const boxCell = this.boxCells[cellIndex];\n        if (boxCell !== null) {\n            const bboxes = this.bboxes;\n            for (const boxUid of boxCell) {\n                if (!seenUids.box[boxUid]) {\n                    seenUids.box[boxUid] = true;\n                    const offset = boxUid * 4;\n                    if ((x1 <= bboxes[offset + 2]) &&\n                        (y1 <= bboxes[offset + 3]) &&\n                        (x2 >= bboxes[offset + 0]) &&\n                        (y2 >= bboxes[offset + 1]) &&\n                        (!predicate || predicate(this.boxKeys[boxUid]))) {\n                        if (queryArgs.hitTest) {\n                            result.push(true);\n                            return true;\n                        } else {\n                            result.push({\n                                key: this.boxKeys[boxUid],\n                                x1: bboxes[offset],\n                                y1: bboxes[offset + 1],\n                                x2: bboxes[offset + 2],\n                                y2: bboxes[offset + 3]\n                            });\n                        }\n                    }\n                }\n            }\n        }\n        const circleCell = this.circleCells[cellIndex];\n        if (circleCell !== null) {\n            const circles = this.circles;\n            for (const circleUid of circleCell) {\n                if (!seenUids.circle[circleUid]) {\n                    seenUids.circle[circleUid] = true;\n                    const offset = circleUid * 3;\n                    if (this._circleAndRectCollide(\n                        circles[offset],\n                        circles[offset + 1],\n                        circles[offset + 2],\n                        x1,\n                        y1,\n                        x2,\n                        y2) &&\n                        (!predicate || predicate(this.circleKeys[circleUid]))) {\n                        if (queryArgs.hitTest) {\n                            result.push(true);\n                            return true;\n                        } else {\n                            const x = circles[offset];\n                            const y = circles[offset + 1];\n                            const radius = circles[offset + 2];\n                            result.push({\n                                key: this.circleKeys[circleUid],\n                                x1: x - radius,\n                                y1: y - radius,\n                                x2: x + radius,\n                                y2: y + radius\n                            });\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    _queryCellCircle(x1: number, y1: number, x2: number, y2: number, cellIndex: number, result: any, queryArgs: any, predicate?: any): void | boolean {\n        const circle = queryArgs.circle;\n        const seenUids = queryArgs.seenUids;\n        const boxCell = this.boxCells[cellIndex];\n        if (boxCell !== null) {\n            const bboxes = this.bboxes;\n            for (const boxUid of boxCell) {\n                if (!seenUids.box[boxUid]) {\n                    seenUids.box[boxUid] = true;\n                    const offset = boxUid * 4;\n                    if (this._circleAndRectCollide(\n                        circle.x,\n                        circle.y,\n                        circle.radius,\n                        bboxes[offset + 0],\n                        bboxes[offset + 1],\n                        bboxes[offset + 2],\n                        bboxes[offset + 3]) &&\n                        (!predicate || predicate(this.boxKeys[boxUid]))) {\n                        result.push(true);\n                        return true;\n                    }\n                }\n            }\n        }\n\n        const circleCell = this.circleCells[cellIndex];\n        if (circleCell !== null) {\n            const circles = this.circles;\n            for (const circleUid of circleCell) {\n                if (!seenUids.circle[circleUid]) {\n                    seenUids.circle[circleUid] = true;\n                    const offset = circleUid * 3;\n                    if (this._circlesCollide(\n                        circles[offset],\n                        circles[offset + 1],\n                        circles[offset + 2],\n                        circle.x,\n                        circle.y,\n                        circle.radius) &&\n                        (!predicate || predicate(this.circleKeys[circleUid]))) {\n                        result.push(true);\n                        return true;\n                    }\n                }\n            }\n        }\n    }\n\n    _forEachCell(x1: number, y1: number, x2: number, y2: number, fn: any, arg1: any, arg2?: any, predicate?: any) {\n        const cx1 = this._convertToXCellCoord(x1);\n        const cy1 = this._convertToYCellCoord(y1);\n        const cx2 = this._convertToXCellCoord(x2);\n        const cy2 = this._convertToYCellCoord(y2);\n\n        for (let x = cx1; x <= cx2; x++) {\n            for (let y = cy1; y <= cy2; y++) {\n                const cellIndex = this.xCellCount * y + x;\n                if (fn.call(this, x1, y1, x2, y2, cellIndex, arg1, arg2, predicate)) return;\n            }\n        }\n    }\n\n    _convertToXCellCoord(x: number): number {\n        return Math.max(0, Math.min(this.xCellCount - 1, Math.floor(x * this.xScale)));\n    }\n\n    _convertToYCellCoord(y: number): number {\n        return Math.max(0, Math.min(this.yCellCount - 1, Math.floor(y * this.yScale)));\n    }\n\n    _circlesCollide(x1: number, y1: number, r1: number, x2: number, y2: number, r2: number): boolean {\n        const dx = x2 - x1;\n        const dy = y2 - y1;\n        const bothRadii = r1 + r2;\n        return (bothRadii * bothRadii) > (dx * dx + dy * dy);\n    }\n\n    _circleAndRectCollide(circleX: number, circleY: number, radius: number, x1: number, y1: number, x2: number, y2: number): boolean {\n        const halfRectWidth = (x2 - x1) / 2;\n        const distX = Math.abs(circleX - (x1 + halfRectWidth));\n        if (distX > (halfRectWidth + radius)) {\n            return false;\n        }\n\n        const halfRectHeight = (y2 - y1) / 2;\n        const distY = Math.abs(circleY - (y1 + halfRectHeight));\n        if (distY > (halfRectHeight + radius)) {\n            return false;\n        }\n\n        if (distX <= halfRectWidth || distY <= halfRectHeight) {\n            return true;\n        }\n\n        const dx = distX - halfRectWidth;\n        const dy = distY - halfRectHeight;\n        return (dx * dx + dy * dy <= (radius * radius));\n    }\n}\n\nexport default GridIndex;\n","// @flow\n\nimport Point from '@mapbox/point-geometry';\n\nimport {mat2, mat4, vec3, vec4} from 'gl-matrix';\nimport * as symbolSize from './symbol_size.js';\nimport {addDynamicAttributes, updateGlobeVertexNormal} from '../data/bucket/symbol_bucket.js';\nimport {WritingMode} from '../symbol/shaping.js';\nimport {CanonicalTileID, OverscaledTileID} from '../source/tile_id.js';\nimport {calculateGlobeLabelMatrix} from '../geo/projection/globe_util.js';\n\nimport type Projection from '../geo/projection/projection.js';\nimport type Painter from '../render/painter.js';\nimport type Transform from '../geo/transform.js';\nimport type SymbolBucket from '../data/bucket/symbol_bucket.js';\nimport type {\n    GlyphOffsetArray,\n    SymbolLineVertexArray,\n    SymbolDynamicLayoutArray,\n    SymbolGlobeExtArray,\n    PlacedSymbol\n} from '../data/array_types.js';\n\nimport type {Mat4, Vec3, Vec4} from 'gl-matrix';\nimport type {VecType} from '../types/vec-type.js';\n\nexport {updateLineLabels, hideGlyphs, getLabelPlaneMatrixForRendering, getLabelPlaneMatrixForPlacement, getGlCoordMatrix, project, projectClamped, getPerspectiveRatio, placeFirstAndLastGlyph, placeGlyphAlongLine, xyTransformMat4};\n\ntype PlacedGlyph = {|\n    angle: number,\n    path: Array<Vec3>,\n    point: Vec3,\n    tilePath: Array<Point>,\n    up: Vec3\n|};\ntype ProjectionCache = {[_: number]: Vec3};\n\ntype PlacementStatus = {\n    needsFlipping?: boolean,\n    notEnoughRoom?: boolean,\n    useVertical?: boolean\n};\n\nconst FlipState = {\n    unknown: 0,\n    flipRequired: 1,\n    flipNotRequired: 2\n};\n\nconst maxTangent = Math.tan(85 * Math.PI / 180);\n\n/*\n * # Overview of coordinate spaces\n *\n * ## Tile coordinate spaces\n * Each label has an anchor. Some labels have corresponding line geometries.\n * The points for both anchors and lines are stored in tile units. Each tile has it's own\n * coordinate space going from (0, 0) at the top left to (EXTENT, EXTENT) at the bottom right.\n *\n * ## GL coordinate space\n * At the end of everything, the vertex shader needs to produce a position in GL coordinate space,\n * which is (-1, 1) at the top left and (1, -1) in the bottom right.\n *\n * ## Map pixel coordinate spaces\n * Each tile has a pixel coordinate space. It's just the tile units scaled so that one unit is\n * whatever counts as 1 pixel at the current zoom.\n * This space is used for pitch-alignment=map, rotation-alignment=map\n *\n * ## Rotated map pixel coordinate spaces\n * Like the above, but rotated so axis of the space are aligned with the viewport instead of the tile.\n * This space is used for pitch-alignment=map, rotation-alignment=viewport\n *\n * ## Viewport pixel coordinate space\n * (0, 0) is at the top left of the canvas and (pixelWidth, pixelHeight) is at the bottom right corner\n * of the canvas. This space is used for pitch-alignment=viewport\n *\n *\n * # Vertex projection\n * It goes roughly like this:\n * 1. project the anchor and line from tile units into the correct label coordinate space\n *      - map pixel space           pitch-alignment=map         rotation-alignment=map\n *      - rotated map pixel space   pitch-alignment=map         rotation-alignment=viewport\n *      - viewport pixel space      pitch-alignment=viewport    rotation-alignment=*\n * 2. if the label follows a line, find the point along the line that is the correct distance from the anchor.\n * 3. add the glyph's corner offset to the point from step 3\n * 4. convert from the label coordinate space to gl coordinates\n *\n * For horizontal labels we want to do step 1 in the shader for performance reasons (no cpu work).\n *      This is what `u_label_plane_matrix` is used for.\n * For labels aligned with lines we have to steps 1 and 2 on the cpu since we need access to the line geometry.\n *      This is what `updateLineLabels(...)` does.\n *      Since the conversion is handled on the cpu we just set `u_label_plane_matrix` to an identity matrix.\n *\n * Steps 3 and 4 are done in the shaders for all labels.\n */\n\n/*\n * Returns a matrix for converting from tile units to the correct label coordinate space.\n * This variation of the function returns a label space matrix specialized for rendering.\n * It transforms coordinates as-is to whatever the target space is (either 2D or 3D).\n * See also `getLabelPlaneMatrixForPlacement`\n */\nfunction getLabelPlaneMatrixForRendering(posMatrix: Float32Array,\n                             tileID: CanonicalTileID,\n                             pitchWithMap: boolean,\n                             rotateWithMap: boolean,\n                             transform: Transform,\n                             projection: Projection,\n                             pixelsToTileUnits: Float32Array): Float32Array {\n    const m = mat4.create();\n\n    if (pitchWithMap) {\n        if (projection.name === 'globe') {\n            const lm = calculateGlobeLabelMatrix(transform, tileID);\n            mat4.multiply(m, m, lm);\n        } else {\n            const s = mat2.invert([], pixelsToTileUnits);\n            m[0] = s[0];\n            m[1] = s[1];\n            m[4] = s[2];\n            m[5] = s[3];\n            if (!rotateWithMap) {\n                mat4.rotateZ(m, m, transform.angle);\n            }\n        }\n    } else {\n        mat4.multiply(m, transform.labelPlaneMatrix, posMatrix);\n    }\n\n    return m;\n}\n\n/*\n * Returns a matrix for converting from tile units to the correct label coordinate space.\n * This variation of the function returns a matrix specialized for placement logic.\n * Coordinates will be clamped to x&y 2D plane which is used with viewport and map aligned placement\n * logic in most cases. Certain projections such as globe view will use 3D space for map aligned\n * label placement.\n */\nfunction getLabelPlaneMatrixForPlacement(posMatrix: Float32Array,\n                             tileID: CanonicalTileID,\n                             pitchWithMap: boolean,\n                             rotateWithMap: boolean,\n                             transform: Transform,\n                             projection: Projection,\n                             pixelsToTileUnits: Float32Array): Float32Array {\n    const m = getLabelPlaneMatrixForRendering(posMatrix, tileID, pitchWithMap, rotateWithMap, transform, projection, pixelsToTileUnits);\n\n    // Symbol placement logic is performed in 2D in most scenarios.\n    // For this reason project all coordinates to the xy-plane by discarding the z-component\n    if (projection.name !== 'globe' || !pitchWithMap) {\n        // Pre-multiply by scaling z to 0\n        m[2] = m[6] = m[10] = m[14] = 0;\n    }\n\n    return m;\n}\n\n/*\n * Returns a matrix for converting from the correct label coordinate space to gl coords.\n */\nfunction getGlCoordMatrix(posMatrix: Float32Array,\n                          tileID: CanonicalTileID,\n                          pitchWithMap: boolean,\n                          rotateWithMap: boolean,\n                          transform: Transform,\n                          projection: Projection,\n                          pixelsToTileUnits: Float32Array): Float32Array {\n    if (pitchWithMap) {\n        if (projection.name === 'globe') {\n            const m = getLabelPlaneMatrixForRendering(posMatrix, tileID, pitchWithMap, rotateWithMap, transform, projection, pixelsToTileUnits);\n            mat4.invert(m, m);\n            mat4.multiply(m, posMatrix, m);\n            return m;\n        } else {\n            const m = mat4.clone(posMatrix);\n            const s = mat4.identity([]);\n            s[0] = pixelsToTileUnits[0];\n            s[1] = pixelsToTileUnits[1];\n            s[4] = pixelsToTileUnits[2];\n            s[5] = pixelsToTileUnits[3];\n            mat4.multiply(m, m, s);\n            if (!rotateWithMap) {\n                mat4.rotateZ(m, m, -transform.angle);\n            }\n            return m;\n        }\n    } else {\n        return transform.glCoordMatrix;\n    }\n}\n\nfunction project(x: number, y: number, z: number, matrix: Mat4): Vec4 {\n    const pos = [x, y, z, 1];\n    if (z) {\n        vec4.transformMat4(pos, pos, matrix);\n    } else {\n        xyTransformMat4(pos, pos, matrix);\n    }\n    const w = pos[3];\n    pos[0] /= w;\n    pos[1] /= w;\n    pos[2] /= w;\n    return pos;\n}\n\nfunction projectClamped([x, y, z]: Vec3, matrix: Mat4): Vec4 {\n    const pos = [x, y, z, 1];\n    vec4.transformMat4(pos, pos, matrix);\n\n    // Clamp distance to a positive value so we can avoid screen coordinate\n    // being flipped possibly due to perspective projection\n    const w = pos[3] = Math.max(pos[3], 0.000001);\n    pos[0] /= w;\n    pos[1] /= w;\n    pos[2] /= w;\n    return pos;\n}\n\nfunction getPerspectiveRatio(cameraToCenterDistance: number, signedDistanceFromCamera: number): number {\n    return Math.min(0.5 + 0.5 * (cameraToCenterDistance / signedDistanceFromCamera), 1.5);\n}\n\nfunction isVisible(anchorPos: [number, number, number, number],\n                   clippingBuffer: [number, number]) {\n    const x = anchorPos[0] / anchorPos[3];\n    const y = anchorPos[1] / anchorPos[3];\n    const inPaddedViewport = (\n        x >= -clippingBuffer[0] &&\n        x <= clippingBuffer[0] &&\n        y >= -clippingBuffer[1] &&\n        y <= clippingBuffer[1]);\n    return inPaddedViewport;\n}\n\n/*\n *  Update the `dynamicLayoutVertexBuffer` for the buffer with the correct glyph positions for the current map view.\n *  This is only run on labels that are aligned with lines. Horizontal labels are handled entirely in the shader.\n */\nfunction updateLineLabels(bucket: SymbolBucket,\n                          posMatrix: Float32Array,\n                          painter: Painter,\n                          isText: boolean,\n                          labelPlaneMatrix: Float32Array,\n                          glCoordMatrix: Float32Array,\n                          pitchWithMap: boolean,\n                          keepUpright: boolean,\n                          getElevation: ?((p: Point) => VecType),\n                          tileID: OverscaledTileID) {\n\n    const tr = painter.transform;\n    const sizeData = isText ? bucket.textSizeData : bucket.iconSizeData;\n    const partiallyEvaluatedSize = symbolSize.evaluateSizeForZoom(sizeData, painter.transform.zoom);\n    const isGlobe = tr.projection.name === 'globe';\n\n    const clippingBuffer = [256 / painter.width * 2 + 1, 256 / painter.height * 2 + 1];\n\n    const dynamicLayoutVertexArray = isText ?\n        bucket.text.dynamicLayoutVertexArray :\n        bucket.icon.dynamicLayoutVertexArray;\n    dynamicLayoutVertexArray.clear();\n\n    let globeExtVertexArray: ?SymbolGlobeExtArray = null;\n    if (isGlobe) {\n        globeExtVertexArray = isText ?\n            bucket.text.globeExtVertexArray :\n            bucket.icon.globeExtVertexArray;\n    }\n\n    const lineVertexArray = bucket.lineVertexArray;\n    const placedSymbols = isText ? bucket.text.placedSymbolArray : bucket.icon.placedSymbolArray;\n\n    const aspectRatio = painter.transform.width / painter.transform.height;\n\n    let useVertical: ?boolean = false;\n    let prevWritingMode;\n\n    for (let s = 0; s < placedSymbols.length; s++) {\n        const symbol = placedSymbols.get(s);\n        const {numGlyphs, writingMode} = symbol;\n\n        // Normally, the 'Horizontal|Vertical' writing mode is followed by a 'Vertical' counterpart, this\n        // is not true for 'Vertical' only line labels. For this case, we'll have to overwrite the 'useVertical'\n        // status before further checks.\n        if (writingMode === WritingMode.vertical && !useVertical && prevWritingMode !== WritingMode.horizontal) {\n            useVertical = true;\n        }\n        prevWritingMode = writingMode;\n\n        // Don't do calculations for vertical glyphs unless the previous symbol was horizontal\n        // and we determined that vertical glyphs were necessary.\n        // Also don't do calculations for symbols that are collided and fully faded out\n        if ((symbol.hidden || writingMode === WritingMode.vertical) && !useVertical) {\n            hideGlyphs(numGlyphs, dynamicLayoutVertexArray);\n            continue;\n        }\n        // Awkward... but we're counting on the paired \"vertical\" symbol coming immediately after its horizontal counterpart\n        useVertical = false;\n\n        // Project tile anchor to globe anchor\n        const tileAnchorPoint = new Point(symbol.tileAnchorX, symbol.tileAnchorY);\n        let {x, y, z} = tr.projection.projectTilePoint(tileAnchorPoint.x, tileAnchorPoint.y, tileID.canonical);\n        if (getElevation) {\n            const [dx, dy, dz] = getElevation(tileAnchorPoint);\n            x += dx;\n            y += dy;\n            z += dz;\n        }\n        const anchorPos = [x, y, z, 1.0];\n        vec4.transformMat4(anchorPos, anchorPos, posMatrix);\n\n        // Don't bother calculating the correct point for invisible labels.\n        if (!isVisible(anchorPos, clippingBuffer)) {\n            hideGlyphs(numGlyphs, dynamicLayoutVertexArray);\n            continue;\n        }\n        const cameraToAnchorDistance = anchorPos[3];\n        const perspectiveRatio = getPerspectiveRatio(painter.transform.getCameraToCenterDistance(tr.projection), cameraToAnchorDistance);\n\n        const fontSize = symbolSize.evaluateSizeForFeature(sizeData, partiallyEvaluatedSize, symbol);\n        const pitchScaledFontSize = pitchWithMap ? fontSize / perspectiveRatio : fontSize * perspectiveRatio;\n\n        const labelPlaneAnchorPoint = project(x, y, z, labelPlaneMatrix);\n\n        // Skip labels behind the camera\n        if (labelPlaneAnchorPoint[3] <= 0.0) {\n            hideGlyphs(numGlyphs, dynamicLayoutVertexArray);\n            continue;\n        }\n\n        let projectionCache: ProjectionCache = {};\n\n        const getElevationForPlacement = pitchWithMap ? null : getElevation; // When pitchWithMap, we're projecting to scaled tile coordinate space: there is no need to get elevation as it doesn't affect projection.\n        const placeUnflipped = placeGlyphsAlongLine(symbol, pitchScaledFontSize, false /*unflipped*/, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix,\n            bucket.glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, globeExtVertexArray, labelPlaneAnchorPoint, tileAnchorPoint, projectionCache, aspectRatio, getElevationForPlacement, tr.projection, tileID, pitchWithMap);\n\n        useVertical = placeUnflipped.useVertical;\n\n        if (getElevationForPlacement && placeUnflipped.needsFlipping) projectionCache = {}; // Truncated points should be recalculated.\n        if (placeUnflipped.notEnoughRoom || useVertical ||\n            (placeUnflipped.needsFlipping &&\n             placeGlyphsAlongLine(symbol, pitchScaledFontSize, true /*flipped*/, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix,\n                 bucket.glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, globeExtVertexArray, labelPlaneAnchorPoint, tileAnchorPoint, projectionCache, aspectRatio, getElevationForPlacement, tr.projection, tileID, pitchWithMap).notEnoughRoom)) {\n            hideGlyphs(numGlyphs, dynamicLayoutVertexArray);\n        }\n    }\n\n    if (isText) {\n        bucket.text.dynamicLayoutVertexBuffer.updateData(dynamicLayoutVertexArray);\n        if (globeExtVertexArray && bucket.text.globeExtVertexBuffer) {\n            bucket.text.globeExtVertexBuffer.updateData(globeExtVertexArray);\n        }\n    } else {\n        bucket.icon.dynamicLayoutVertexBuffer.updateData(dynamicLayoutVertexArray);\n        if (globeExtVertexArray && bucket.icon.globeExtVertexBuffer) {\n            bucket.icon.globeExtVertexBuffer.updateData(globeExtVertexArray);\n        }\n    }\n}\n\nfunction placeFirstAndLastGlyph(\n    fontScale: number,\n    glyphOffsetArray: GlyphOffsetArray,\n    lineOffsetX: number,\n    lineOffsetY: number,\n    flip: boolean,\n    anchorPoint: Vec3,\n    tileAnchorPoint: Point,\n    symbol: PlacedSymbol,\n    lineVertexArray: SymbolLineVertexArray,\n    labelPlaneMatrix: Float32Array,\n    projectionCache: ProjectionCache,\n    getElevation: ?((p: Point) => VecType),\n    returnPathInTileCoords: ?boolean,\n    projection: Projection,\n    tileID: OverscaledTileID,\n    pitchWithMap: boolean): null | {|first: PlacedGlyph, last: PlacedGlyph|} {\n\n    const {lineStartIndex, glyphStartIndex, segment} = symbol;\n    const glyphEndIndex = glyphStartIndex + symbol.numGlyphs;\n    const lineEndIndex = lineStartIndex + symbol.lineLength;\n\n    const firstGlyphOffset = glyphOffsetArray.getoffsetX(glyphStartIndex);\n    const lastGlyphOffset = glyphOffsetArray.getoffsetX(glyphEndIndex - 1);\n\n    const firstPlacedGlyph = placeGlyphAlongLine(fontScale * firstGlyphOffset, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, segment,\n        lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, getElevation, returnPathInTileCoords, true, projection, tileID, pitchWithMap);\n    if (!firstPlacedGlyph)\n        return null;\n\n    const lastPlacedGlyph = placeGlyphAlongLine(fontScale * lastGlyphOffset, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, segment,\n        lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, getElevation, returnPathInTileCoords, true, projection, tileID, pitchWithMap);\n    if (!lastPlacedGlyph)\n        return null;\n\n    return {first: firstPlacedGlyph, last: lastPlacedGlyph};\n}\n\n// Check in the glCoordinate space, the rough estimation of angle between the text line and the Y axis.\n// If the angle if less or equal to 5 degree, then keep the text glyphs unflipped even if it is required.\nfunction isInFlipRetainRange(dx: number, dy: number) {\n    return dx === 0 || Math.abs(dy / dx) > maxTangent;\n}\n\nfunction requiresOrientationChange(writingMode: number, flipState: number, dx: number, dy: number) {\n    if (writingMode === WritingMode.horizontal && Math.abs(dy) > Math.abs(dx)) {\n        // On top of choosing whether to flip, choose whether to render this version of the glyphs or the alternate\n        // vertical glyphs. We can't just filter out vertical glyphs in the horizontal range because the horizontal\n        // and vertical versions can have slightly different projections which could lead to angles where both or\n        // neither showed.\n        return {useVertical: true};\n    }\n    // Check if flipping is required for \"verticalOnly\" case.\n    if (writingMode === WritingMode.vertical) {\n        return dy > 0 ? {needsFlipping: true} : null;\n    }\n\n    // symbol's flipState stores the flip decision from the previous frame, and that\n    // decision is reused when the symbol is in the retain range.\n    if (flipState !== FlipState.unknown && isInFlipRetainRange(dx, dy)) {\n        return (flipState === FlipState.flipRequired) ? {needsFlipping: true} : null;\n    }\n\n    // Check if flipping is required for \"horizontal\" case.\n    return dx < 0 ? {needsFlipping: true} : null;\n}\n\nfunction placeGlyphsAlongLine(symbol: PlacedSymbol, fontSize: number, flip: boolean, keepUpright: boolean, posMatrix: Float32Array, labelPlaneMatrix: Float32Array, glCoordMatrix: Float32Array, glyphOffsetArray: GlyphOffsetArray, lineVertexArray: SymbolLineVertexArray, dynamicLayoutVertexArray: SymbolDynamicLayoutArray, globeExtVertexArray: ?SymbolGlobeExtArray, anchorPoint: VecType, tileAnchorPoint: Point, projectionCache: ProjectionCache, aspectRatio: number, getElevation: ?((p: Point) => VecType), projection: Projection, tileID: OverscaledTileID, pitchWithMap: boolean): PlacementStatus {\n    const fontScale = fontSize / 24;\n    const lineOffsetX = symbol.lineOffsetX * fontScale;\n    const lineOffsetY = symbol.lineOffsetY * fontScale;\n    const {lineStartIndex, glyphStartIndex, numGlyphs, segment, writingMode, flipState} = symbol;\n    const lineEndIndex = lineStartIndex + symbol.lineLength;\n\n    const addGlyph = (glyph: PlacedGlyph) => {\n        if (globeExtVertexArray) {\n            const [ux, uy, uz] = glyph.up;\n            const offset = dynamicLayoutVertexArray.length;\n            updateGlobeVertexNormal(globeExtVertexArray, offset + 0, ux, uy, uz);\n            updateGlobeVertexNormal(globeExtVertexArray, offset + 1, ux, uy, uz);\n            updateGlobeVertexNormal(globeExtVertexArray, offset + 2, ux, uy, uz);\n            updateGlobeVertexNormal(globeExtVertexArray, offset + 3, ux, uy, uz);\n        }\n        const [x, y, z] = glyph.point;\n        addDynamicAttributes(dynamicLayoutVertexArray, x, y, z, glyph.angle);\n    };\n\n    if (numGlyphs > 1) {\n        // Place the first and the last glyph in the label first, so we can figure out\n        // the overall orientation of the label and determine whether it needs to be flipped in keepUpright mode\n        const firstAndLastGlyph = placeFirstAndLastGlyph(fontScale, glyphOffsetArray, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol, lineVertexArray, labelPlaneMatrix, projectionCache, getElevation, false, projection, tileID, pitchWithMap);\n        if (!firstAndLastGlyph) {\n            return {notEnoughRoom: true};\n        }\n\n        if (keepUpright && !flip) {\n            let [x0, y0, z0] = firstAndLastGlyph.first.point;\n            let [x1, y1, z1] = firstAndLastGlyph.last.point;\n            [x0, y0] = project(x0, y0, z0, glCoordMatrix);\n            [x1, y1] = project(x1, y1, z1, glCoordMatrix);\n            const orientationChange = requiresOrientationChange(writingMode, flipState, (x1 - x0) * aspectRatio, y1 - y0);\n            symbol.flipState = orientationChange && orientationChange.needsFlipping ? FlipState.flipRequired : FlipState.flipNotRequired;\n            if (orientationChange) {\n                return orientationChange;\n            }\n        }\n\n        addGlyph(firstAndLastGlyph.first);\n        for (let glyphIndex = glyphStartIndex + 1; glyphIndex < glyphStartIndex + numGlyphs - 1; glyphIndex++) {\n            // Since first and last glyph fit on the line, the rest of the glyphs can be placed too, but check to make sure\n            const glyph = placeGlyphAlongLine(fontScale * glyphOffsetArray.getoffsetX(glyphIndex), lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, segment,\n                lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, getElevation, false, false, projection, tileID, pitchWithMap);\n            if (!glyph) {\n                // undo previous glyphs of the symbol if it doesn't fit; it will be filled with hideGlyphs instead\n                dynamicLayoutVertexArray.length -= 4 * (glyphIndex - glyphStartIndex);\n                return {notEnoughRoom: true};\n            }\n            addGlyph(glyph);\n        }\n        addGlyph(firstAndLastGlyph.last);\n    } else {\n        // Only a single glyph to place\n        // So, determine whether to flip based on projected angle of the line segment it's on\n        if (keepUpright && !flip) {\n            const a = project(tileAnchorPoint.x, tileAnchorPoint.y, 0, posMatrix);\n            const tileVertexIndex = lineStartIndex + segment + 1;\n            const tileSegmentEnd = new Point(lineVertexArray.getx(tileVertexIndex), lineVertexArray.gety(tileVertexIndex));\n            const projectedVertex = project(tileSegmentEnd.x, tileSegmentEnd.y, 0, posMatrix);\n            // We know the anchor will be in the viewport, but the end of the line segment may be\n            // behind the plane of the camera, in which case we can use a point at any arbitrary (closer)\n            // point on the segment.\n            const b = (projectedVertex[3] > 0) ?\n                projectedVertex :\n                projectTruncatedLineSegment(tileAnchorPoint, tileSegmentEnd, a, 1, posMatrix, undefined, projection, tileID.canonical);\n\n            const orientationChange = requiresOrientationChange(writingMode, flipState, (b[0] - a[0]) * aspectRatio, b[1] - a[1]);\n            symbol.flipState = orientationChange && orientationChange.needsFlipping ? FlipState.flipRequired : FlipState.flipNotRequired;\n            if (orientationChange) {\n                return orientationChange;\n            }\n        }\n        const singleGlyph = placeGlyphAlongLine(fontScale * glyphOffsetArray.getoffsetX(glyphStartIndex), lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, segment,\n            lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, getElevation, false, false, projection, tileID, pitchWithMap);\n        if (!singleGlyph) {\n            return {notEnoughRoom: true};\n        }\n\n        addGlyph(singleGlyph);\n    }\n    return {};\n}\n\nfunction elevatePointAndProject(p: Point, tileID: CanonicalTileID, posMatrix: Float32Array, projection: Projection, getElevation: ?((p: Point) => VecType)) {\n    const {x, y, z} = projection.projectTilePoint(p.x, p.y, tileID);\n    if (!getElevation) {\n        return project(x, y, z, posMatrix);\n    }\n    const [dx, dy, dz] = getElevation(p);\n    return project(x + dx, y + dy, z + dz, posMatrix);\n}\n\nfunction projectTruncatedLineSegment(previousTilePoint: Point, currentTilePoint: Point, previousProjectedPoint: Vec3, minimumLength: number, projectionMatrix: Float32Array, getElevation: ?((p: Point) => VecType), projection: Projection, tileID: CanonicalTileID): Vec3 {\n    // We are assuming \"previousTilePoint\" won't project to a point within one unit of the camera plane\n    // If it did, that would mean our label extended all the way out from within the viewport to a (very distant)\n    // point near the plane of the camera. We wouldn't be able to render the label anyway once it crossed the\n    // plane of the camera.\n    const unitVertex = previousTilePoint.sub(currentTilePoint)._unit()._add(previousTilePoint);\n    const projectedUnit = elevatePointAndProject(unitVertex, tileID, projectionMatrix, projection, getElevation);\n    vec3.sub(projectedUnit, previousProjectedPoint, projectedUnit);\n    vec3.normalize(projectedUnit, projectedUnit);\n\n    return vec3.scaleAndAdd(projectedUnit, previousProjectedPoint, projectedUnit, minimumLength);\n}\n\nfunction placeGlyphAlongLine(\n    offsetX: number,\n    lineOffsetX: number,\n    lineOffsetY: number,\n    flip: boolean,\n    anchorPoint: Vec3,\n    tileAnchorPoint: Point,\n    anchorSegment: number,\n    lineStartIndex: number,\n    lineEndIndex: number,\n    lineVertexArray: SymbolLineVertexArray,\n    labelPlaneMatrix: Float32Array,\n    projectionCache: ProjectionCache,\n    getElevation: ?((p: Point) => VecType),\n    returnPathInTileCoords: ?boolean,\n    endGlyph: ?boolean,\n    reprojection: Projection,\n    tileID: OverscaledTileID,\n    pitchWithMap: boolean): null | PlacedGlyph {\n\n    const combinedOffsetX = flip ?\n        offsetX - lineOffsetX :\n        offsetX + lineOffsetX;\n\n    let dir = combinedOffsetX > 0 ? 1 : -1;\n\n    let angle = 0;\n    if (flip) {\n        // The label needs to be flipped to keep text upright.\n        // Iterate in the reverse direction.\n        dir *= -1;\n        angle = Math.PI;\n    }\n\n    if (dir < 0) angle += Math.PI;\n\n    let currentIndex = lineStartIndex + anchorSegment + (dir > 0 ? 0 : 1) | 0;\n    let current = anchorPoint;\n    let prev = anchorPoint;\n    let distanceToPrev = 0;\n    let currentSegmentDistance = 0;\n    const absOffsetX = Math.abs(combinedOffsetX);\n    const pathVertices = [];\n    const tilePath = [];\n    let currentVertex = tileAnchorPoint;\n    let prevVertex = currentVertex;\n\n    const getTruncatedLineSegment = () => {\n        return projectTruncatedLineSegment(prevVertex, currentVertex, prev, absOffsetX - distanceToPrev + 1, labelPlaneMatrix, getElevation, reprojection, tileID.canonical);\n    };\n\n    while (distanceToPrev + currentSegmentDistance <= absOffsetX) {\n        currentIndex += dir;\n\n        // offset does not fit on the projected line\n        if (currentIndex < lineStartIndex || currentIndex >= lineEndIndex)\n            return null;\n\n        prev = current;\n        prevVertex = currentVertex;\n\n        pathVertices.push(prev);\n        if (returnPathInTileCoords) tilePath.push(prevVertex);\n\n        currentVertex = new Point(lineVertexArray.getx(currentIndex), lineVertexArray.gety(currentIndex));\n        current = projectionCache[currentIndex];\n        if (!current) {\n            const projection = elevatePointAndProject(currentVertex, tileID.canonical, labelPlaneMatrix, reprojection, getElevation);\n            if (projection[3] > 0) {\n                current = projectionCache[currentIndex] = projection;\n            } else {\n                // The vertex is behind the plane of the camera, so we can't project it\n                // Instead, we'll create a vertex along the line that's far enough to include the glyph\n                // Don't cache because the new vertex might not be far enough out for future glyphs on the same segment\n                current = getTruncatedLineSegment();\n            }\n        }\n\n        distanceToPrev += currentSegmentDistance;\n        currentSegmentDistance = vec3.distance(prev, current);\n    }\n\n    if (endGlyph && getElevation) {\n        // For terrain, always truncate end points in order to handle terrain curvature.\n        // If previously truncated, on signedDistanceFromCamera < 0, don't do it.\n        // Cache as end point. The cache is cleared if there is need for flipping in updateLineLabels.\n        if (projectionCache[currentIndex]) {\n            current = getTruncatedLineSegment();\n            currentSegmentDistance = vec3.distance(prev, current);\n        }\n        projectionCache[currentIndex] = current;\n    }\n\n    // The point is on the current segment. Interpolate to find it. Compute points on both label plane and tile space\n    const segmentInterpolationT = (absOffsetX - distanceToPrev) / currentSegmentDistance;\n    const tilePoint = currentVertex.sub(prevVertex)._mult(segmentInterpolationT)._add(prevVertex);\n    const prevToCurrent = vec3.sub([], current, prev);\n    const labelPlanePoint = vec3.scaleAndAdd([], prev, prevToCurrent, segmentInterpolationT);\n\n    let axisZ: Vec3 = [0, 0, 1];\n    let diffX = prevToCurrent[0];\n    let diffY = prevToCurrent[1];\n\n    if (pitchWithMap) {\n        axisZ = reprojection.upVector(tileID.canonical, tilePoint.x, tilePoint.y);\n\n        if (axisZ[0] !== 0 || axisZ[1] !== 0 || axisZ[2] !== 1) {\n            // Compute coordinate frame that is aligned to the tangent of the surface\n            const axisX = [axisZ[2], 0, -axisZ[0]];\n            const axisY = vec3.cross([], axisZ, axisX);\n            vec3.normalize(axisX, axisX);\n            vec3.normalize(axisY, axisY);\n            diffX = vec3.dot(prevToCurrent, axisX);\n            diffY = vec3.dot(prevToCurrent, axisY);\n        }\n    }\n\n    // offset the point from the line to text-offset and icon-offset\n    if (lineOffsetY) {\n        // Find a coordinate frame for the vertical offset\n        const offsetDir = vec3.cross([], axisZ, prevToCurrent);\n        vec3.normalize(offsetDir, offsetDir);\n        vec3.scaleAndAdd(labelPlanePoint, labelPlanePoint, offsetDir, lineOffsetY * dir);\n    }\n\n    const segmentAngle = angle + Math.atan2(diffY, diffX);\n\n    pathVertices.push(labelPlanePoint);\n    if (returnPathInTileCoords) {\n        tilePath.push(tilePoint);\n    }\n\n    return {\n        point: labelPlanePoint,\n        angle: segmentAngle,\n        path: pathVertices,\n        tilePath,\n        up: axisZ\n    };\n}\n\n// Hide them by moving them offscreen. We still need to add them to the buffer\n// because the dynamic buffer is paired with a static buffer that doesn't get updated.\nfunction hideGlyphs(num: number, dynamicLayoutVertexArray: SymbolDynamicLayoutArray) {\n    const offset = dynamicLayoutVertexArray.length;\n    const end = offset + 4 * num;\n    dynamicLayoutVertexArray.resize(end);\n    // Since all hidden glyphs have the same attributes, we can build up the array faster with a single call to\n    // Float32Array.fill for all vertices, instead of calling addDynamicAttributes for each vertex.\n    dynamicLayoutVertexArray.float32.fill(-Infinity, offset * 4, end * 4);\n}\n\n// For line label layout, we're not using z output and our w input is always 1\n// This custom matrix transformation ignores those components to make projection faster\nfunction xyTransformMat4(out: Vec4, a: Vec4, m: Mat4): Vec4 {\n    const x = a[0], y = a[1];\n    out[0] = m[0] * x + m[4] * y + m[12];\n    out[1] = m[1] * x + m[5] * y + m[13];\n    out[3] = m[3] * x + m[7] * y + m[15];\n    return out;\n}\n","// @flow\n\nimport Point from '@mapbox/point-geometry';\nimport clipLine from './clip_line.js';\nimport PathInterpolator from './path_interpolator.js';\nimport * as intersectionTests from '../util/intersection_tests.js';\nimport Grid from './grid_index.js';\nimport {mat4, vec4} from 'gl-matrix';\nimport ONE_EM from '../symbol/one_em.js';\nimport {FOG_SYMBOL_CLIPPING_THRESHOLD, getFogOpacityAtTileCoord} from '../style/fog_helpers.js';\nimport assert from 'assert';\nimport {OverscaledTileID} from '../source/tile_id.js';\nimport * as symbolProjection from '../symbol/projection.js';\n\nimport type Transform from '../geo/transform.js';\nimport type Projection from '../geo/projection/projection.js';\nimport type SymbolBucket from '../data/bucket/symbol_bucket.js';\nimport type {SingleCollisionBox} from '../data/bucket/symbol_bucket.js';\nimport type {GlyphOffsetArray, SymbolLineVertexArray, PlacedSymbol} from '../data/array_types.js';\nimport type {FogState} from '../style/fog_helpers.js';\nimport type {Vec3, Mat4} from 'gl-matrix';\n\nexport type PlacedCollisionBox = {|\n    box: Array<number>,\n    offscreen: boolean,\n    occluded: boolean\n|};\ntype PlacedCollisionCircles = {|\n    circles: Array<number>,\n    offscreen: boolean,\n    collisionDetected: boolean,\n    occluded: boolean\n|};\ntype ScreenAnchorPoint = {|\n  occluded: boolean,\n  perspectiveRatio: number,\n  point: Point,\n  signedDistanceFromCamera: number,\n|};\n\n// When a symbol crosses the edge that causes it to be included in\n// collision detection, it will cause changes in the symbols around\n// it. This constant specifies how many pixels to pad the edge of\n// the viewport for collision detection so that the bulk of the changes\n// occur offscreen. Making this constant greater increases label\n// stability, but it's expensive.\nconst viewportPadding = 100;\n\n/**\n * A collision index used to prevent symbols from overlapping. It keep tracks of\n * where previous symbols have been placed and is used to check if a new\n * symbol overlaps with any previously added symbols.\n *\n * There are two steps to insertion: first placeCollisionBox/Circles checks if\n * there's room for a symbol, then insertCollisionBox/Circles actually puts the\n * symbol in the index. The two step process allows paired symbols to be inserted\n * together even if they overlap.\n *\n * @private\n */\nclass CollisionIndex {\n    grid: Grid;\n    ignoredGrid: Grid;\n    transform: Transform;\n    pitchfactor: number;\n    screenRightBoundary: number;\n    screenBottomBoundary: number;\n    gridRightBoundary: number;\n    gridBottomBoundary: number;\n    fogState: ?FogState;\n\n    constructor(\n        transform: Transform,\n        fogState: ?FogState,\n        grid: Grid = new Grid(transform.width + 2 * viewportPadding, transform.height + 2 * viewportPadding, 25),\n        ignoredGrid: Grid = new Grid(transform.width + 2 * viewportPadding, transform.height + 2 * viewportPadding, 25)\n    ) {\n        this.transform = transform;\n\n        this.grid = grid;\n        this.ignoredGrid = ignoredGrid;\n        this.pitchfactor = Math.cos(transform._pitch) * transform.cameraToCenterDistance;\n\n        this.screenRightBoundary = transform.width + viewportPadding;\n        this.screenBottomBoundary = transform.height + viewportPadding;\n        this.gridRightBoundary = transform.width + 2 * viewportPadding;\n        this.gridBottomBoundary = transform.height + 2 * viewportPadding;\n        this.fogState = fogState;\n    }\n\n    placeCollisionBox(bucket: SymbolBucket, scale: number, collisionBox: SingleCollisionBox, shift: Point, allowOverlap: boolean, textPixelRatio: number, posMatrix: Mat4, collisionGroupPredicate?: any): PlacedCollisionBox {\n        assert(!this.transform.elevation || collisionBox.elevation !== undefined);\n\n        let anchorX = collisionBox.projectedAnchorX;\n        let anchorY = collisionBox.projectedAnchorY;\n        let anchorZ = collisionBox.projectedAnchorZ;\n\n        // Apply elevation vector to the anchor point\n        const elevation = collisionBox.elevation;\n        const tileID = collisionBox.tileID;\n        const projection = bucket.getProjection();\n        if (elevation && tileID) {\n            const [ux, uy, uz] = projection.upVector(tileID.canonical, collisionBox.tileAnchorX, collisionBox.tileAnchorY);\n            const upScale = projection.upVectorScale(tileID.canonical, this.transform.center.lat, this.transform.worldSize).metersToTile;\n\n            anchorX += ux * elevation * upScale;\n            anchorY += uy * elevation * upScale;\n            anchorZ += uz * elevation * upScale;\n        }\n\n        const checkOcclusion = projection.name === 'globe' || !!elevation || this.transform.pitch > 0;\n        const projectedPoint = this.projectAndGetPerspectiveRatio(posMatrix, anchorX, anchorY, anchorZ, collisionBox.tileID, checkOcclusion, projection);\n\n        const tileToViewport = textPixelRatio * projectedPoint.perspectiveRatio;\n        const tlX = (collisionBox.x1 * scale + shift.x - collisionBox.padding) * tileToViewport + projectedPoint.point.x;\n        const tlY = (collisionBox.y1 * scale + shift.y - collisionBox.padding) * tileToViewport + projectedPoint.point.y;\n        const brX = (collisionBox.x2 * scale + shift.x + collisionBox.padding) * tileToViewport + projectedPoint.point.x;\n        const brY = (collisionBox.y2 * scale + shift.y + collisionBox.padding) * tileToViewport + projectedPoint.point.y;\n        // Clip at 10 times the distance of the map center or, said otherwise, when the label\n        // would be drawn at 10% the size of the features around it without scaling. Refer:\n        // https://github.com/mapbox/mapbox-gl-native/wiki/Text-Rendering#perspective-scaling\n        // 0.55 === projection.getPerspectiveRatio(camera_to_center, camera_to_center * 10)\n        const minPerspectiveRatio = 0.55;\n        const isClipped = projectedPoint.perspectiveRatio <= minPerspectiveRatio || projectedPoint.occluded;\n\n        if (!this.isInsideGrid(tlX, tlY, brX, brY) ||\n            (!allowOverlap && this.grid.hitTest(tlX, tlY, brX, brY, collisionGroupPredicate)) ||\n            isClipped) {\n            return {\n                box: [],\n                offscreen: false,\n                occluded: projectedPoint.occluded\n            };\n        }\n\n        return {\n            box: [tlX, tlY, brX, brY],\n            offscreen: this.isOffscreen(tlX, tlY, brX, brY),\n            occluded: false\n        };\n    }\n\n    placeCollisionCircles(bucket: SymbolBucket,\n                          allowOverlap: boolean,\n                          symbol: PlacedSymbol,\n                          lineVertexArray: SymbolLineVertexArray,\n                          glyphOffsetArray: GlyphOffsetArray,\n                          fontSize: number,\n                          posMatrix: Float32Array,\n                          labelPlaneMatrix: Float32Array,\n                          labelToScreenMatrix?: Mat4,\n                          showCollisionCircles: boolean,\n                          pitchWithMap: boolean,\n                          collisionGroupPredicate?: any,\n                          circlePixelDiameter: number,\n                          textPixelPadding: number,\n                          tileID: OverscaledTileID): PlacedCollisionCircles {\n        const placedCollisionCircles = [];\n        const elevation = this.transform.elevation;\n        const projection = bucket.getProjection();\n        const getElevation = elevation ? elevation.getAtTileOffsetFunc(tileID, this.transform.center.lat, this.transform.worldSize, projection) : null;\n\n        const tileUnitAnchorPoint = new Point(symbol.tileAnchorX, symbol.tileAnchorY);\n        let {x: anchorX, y: anchorY, z: anchorZ} = projection.projectTilePoint(tileUnitAnchorPoint.x, tileUnitAnchorPoint.y, tileID.canonical);\n        if (getElevation) {\n            const [dx, dy, dz] = getElevation(tileUnitAnchorPoint);\n            anchorX += dx;\n            anchorY += dy;\n            anchorZ += dz;\n        }\n        const isGlobe = projection.name === 'globe';\n        const checkOcclusion = isGlobe || !!elevation || this.transform.pitch > 0;\n        const screenAnchorPoint = this.projectAndGetPerspectiveRatio(posMatrix, anchorX, anchorY, anchorZ, tileID, checkOcclusion, projection);\n        const {perspectiveRatio} = screenAnchorPoint;\n        const labelPlaneFontScale = (pitchWithMap ? fontSize / perspectiveRatio : fontSize * perspectiveRatio) / ONE_EM;\n        const labelPlaneAnchorPoint = symbolProjection.project(anchorX, anchorY, anchorZ, labelPlaneMatrix);\n\n        const projectionCache = {};\n        const lineOffsetX = symbol.lineOffsetX * labelPlaneFontScale;\n        const lineOffsetY = symbol.lineOffsetY * labelPlaneFontScale;\n\n        const firstAndLastGlyph = screenAnchorPoint.signedDistanceFromCamera > 0 ? symbolProjection.placeFirstAndLastGlyph(\n            labelPlaneFontScale,\n            glyphOffsetArray,\n            lineOffsetX,\n            lineOffsetY,\n            /*flip*/ false,\n            labelPlaneAnchorPoint,\n            tileUnitAnchorPoint,\n            symbol,\n            lineVertexArray,\n            labelPlaneMatrix,\n            projectionCache,\n            elevation && !pitchWithMap ? getElevation : null, // pitchWithMap: no need to sample elevation as it has no effect when projecting using scale/rotate to tile space labelPlaneMatrix.\n            pitchWithMap && !!elevation,\n            projection,\n            tileID,\n            pitchWithMap\n        ) : null;\n\n        let collisionDetected = false;\n        let inGrid = false;\n        let entirelyOffscreen = true;\n\n        if (firstAndLastGlyph && !screenAnchorPoint.occluded) {\n            const radius = circlePixelDiameter * 0.5 * perspectiveRatio + textPixelPadding;\n            const screenPlaneMin = new Point(-viewportPadding, -viewportPadding);\n            const screenPlaneMax = new Point(this.screenRightBoundary, this.screenBottomBoundary);\n            const interpolator = new PathInterpolator();\n\n            // Construct a projected path from projected line vertices. Anchor points are ignored and removed\n            const {first, last} = firstAndLastGlyph;\n            const firstLen = first.path.length;\n\n            let projectedPath: Vec3[] = [];\n            for (let i = firstLen - 1; i >= 1; i--) {\n                projectedPath.push(first.path[i]);\n            }\n            for (let i = 1; i < last.path.length; i++) {\n                projectedPath.push(last.path[i]);\n            }\n            assert(projectedPath.length >= 2);\n\n            // Tolerate a slightly longer distance than one diameter between two adjacent circles\n            const circleDist = radius * 2.5;\n\n            // The path might need to be converted into screen space if a pitched map is used as the label space\n            if (labelToScreenMatrix) {\n                assert(pitchWithMap);\n                projectedPath = projectedPath.map(([x, y, z], index) => {\n                    if (getElevation && !isGlobe) {\n                        z = getElevation(index < firstLen - 1 ? first.tilePath[firstLen - 1 - index] : last.tilePath[index - firstLen + 2])[2];\n                    }\n                    return symbolProjection.project(x, y, z, labelToScreenMatrix);\n                });\n\n                // Do not try to place collision circles if even of the points is behind the camera.\n                // This is a plausible scenario with big camera pitch angles\n                if (projectedPath.some(point => point[3] <= 0)) {\n                    projectedPath = [];\n                }\n            }\n\n            let segments = [];\n\n            if (projectedPath.length > 0) {\n                // Quickly check if the path is fully inside or outside of the padded collision region.\n                // For overlapping paths we'll only create collision circles for the visible segments\n                let minx = Infinity;\n                let maxx = -Infinity;\n                let miny = Infinity;\n                let maxy = -Infinity;\n\n                for (const p of projectedPath) {\n                    minx = Math.min(minx, p[0]);\n                    miny = Math.min(miny, p[1]);\n                    maxx = Math.max(maxx, p[0]);\n                    maxy = Math.max(maxy, p[1]);\n                }\n\n                // Path visible\n                if (maxx >= screenPlaneMin.x && minx <= screenPlaneMax.x &&\n                    maxy >= screenPlaneMin.y && miny <= screenPlaneMax.y) {\n\n                    segments = [projectedPath.map(p => new Point(p[0], p[1]))];\n\n                    if (minx < screenPlaneMin.x || maxx > screenPlaneMax.x ||\n                        miny < screenPlaneMin.y || maxy > screenPlaneMax.y) {\n                        // Path partially visible, clip\n                        segments = clipLine(segments, screenPlaneMin.x, screenPlaneMin.y, screenPlaneMax.x, screenPlaneMax.y);\n                    }\n                }\n            }\n\n            for (const seg of segments) {\n                // interpolate positions for collision circles. Add a small padding to both ends of the segment\n                assert(seg.length > 0);\n                interpolator.reset(seg, radius * 0.25);\n\n                let numCircles = 0;\n\n                if (interpolator.length <= 0.5 * radius) {\n                    numCircles = 1;\n                } else {\n                    numCircles = Math.ceil(interpolator.paddedLength / circleDist) + 1;\n                }\n\n                for (let i = 0; i < numCircles; i++) {\n                    const t = i / Math.max(numCircles - 1, 1);\n                    const circlePosition = interpolator.lerp(t);\n\n                    // add viewport padding to the position and perform initial collision check\n                    const centerX = circlePosition.x + viewportPadding;\n                    const centerY = circlePosition.y + viewportPadding;\n\n                    placedCollisionCircles.push(centerX, centerY, radius, 0);\n\n                    const x1 = centerX - radius;\n                    const y1 = centerY - radius;\n                    const x2 = centerX + radius;\n                    const y2 = centerY + radius;\n\n                    entirelyOffscreen = entirelyOffscreen && this.isOffscreen(x1, y1, x2, y2);\n                    inGrid = inGrid || this.isInsideGrid(x1, y1, x2, y2);\n\n                    if (!allowOverlap) {\n                        if (this.grid.hitTestCircle(centerX, centerY, radius, collisionGroupPredicate)) {\n                            // Don't early exit if we're showing the debug circles because we still want to calculate\n                            // which circles are in use\n                            collisionDetected = true;\n                            if (!showCollisionCircles) {\n                                return {\n                                    circles: [],\n                                    offscreen: false,\n                                    collisionDetected,\n                                    occluded: false\n                                };\n                            }\n                        }\n                    }\n                }\n            }\n        }\n\n        return {\n            circles: ((!showCollisionCircles && collisionDetected) || !inGrid) ? [] : placedCollisionCircles,\n            offscreen: entirelyOffscreen,\n            collisionDetected,\n            occluded: screenAnchorPoint.occluded\n        };\n    }\n\n    /**\n     * Because the geometries in the CollisionIndex are an approximation of the shape of\n     * symbols on the map, we use the CollisionIndex to look up the symbol part of\n     * `queryRenderedFeatures`.\n     *\n     * @private\n     */\n    queryRenderedSymbols(viewportQueryGeometry: Array<Point>): {[id: number]: Array<number>} {\n        if (viewportQueryGeometry.length === 0 || (this.grid.keysLength() === 0 && this.ignoredGrid.keysLength() === 0)) {\n            return {};\n        }\n\n        const query = [];\n        let minX = Infinity;\n        let minY = Infinity;\n        let maxX = -Infinity;\n        let maxY = -Infinity;\n        for (const point of viewportQueryGeometry) {\n            const gridPoint = new Point(point.x + viewportPadding, point.y + viewportPadding);\n            minX = Math.min(minX, gridPoint.x);\n            minY = Math.min(minY, gridPoint.y);\n            maxX = Math.max(maxX, gridPoint.x);\n            maxY = Math.max(maxY, gridPoint.y);\n            query.push(gridPoint);\n        }\n\n        const features = this.grid.query(minX, minY, maxX, maxY)\n            .concat(this.ignoredGrid.query(minX, minY, maxX, maxY));\n\n        const seenFeatures = {};\n        const result = {};\n\n        for (const feature of features) {\n            const featureKey = feature.key;\n            // Skip already seen features.\n            if (seenFeatures[featureKey.bucketInstanceId] === undefined) {\n                seenFeatures[featureKey.bucketInstanceId] = {};\n            }\n            if (seenFeatures[featureKey.bucketInstanceId][featureKey.featureIndex]) {\n                continue;\n            }\n\n            // Check if query intersects with the feature box\n            // \"Collision Circles\" for line labels are treated as boxes here\n            // Since there's no actual collision taking place, the circle vs. square\n            // distinction doesn't matter as much, and box geometry is easier\n            // to work with.\n            const bbox = [\n                new Point(feature.x1, feature.y1),\n                new Point(feature.x2, feature.y1),\n                new Point(feature.x2, feature.y2),\n                new Point(feature.x1, feature.y2)\n            ];\n            if (!intersectionTests.polygonIntersectsPolygon(query, bbox)) {\n                continue;\n            }\n\n            seenFeatures[featureKey.bucketInstanceId][featureKey.featureIndex] = true;\n            if (result[featureKey.bucketInstanceId] === undefined) {\n                result[featureKey.bucketInstanceId] = [];\n            }\n            result[featureKey.bucketInstanceId].push(featureKey.featureIndex);\n        }\n\n        return result;\n    }\n\n    insertCollisionBox(collisionBox: Array<number>, ignorePlacement: boolean, bucketInstanceId: number, featureIndex: number, collisionGroupID: number) {\n        const grid = ignorePlacement ? this.ignoredGrid : this.grid;\n\n        const key = {bucketInstanceId, featureIndex, collisionGroupID};\n        grid.insert(key, collisionBox[0], collisionBox[1], collisionBox[2], collisionBox[3]);\n    }\n\n    insertCollisionCircles(collisionCircles: Array<number>, ignorePlacement: boolean, bucketInstanceId: number, featureIndex: number, collisionGroupID: number) {\n        const grid = ignorePlacement ? this.ignoredGrid : this.grid;\n\n        const key = {bucketInstanceId, featureIndex, collisionGroupID};\n        for (let k = 0; k < collisionCircles.length; k += 4) {\n            grid.insertCircle(key, collisionCircles[k], collisionCircles[k + 1], collisionCircles[k + 2]);\n        }\n    }\n\n    projectAndGetPerspectiveRatio(posMatrix: Mat4, x: number, y: number, z: number, tileID: ?OverscaledTileID, checkOcclusion: boolean, bucketProjection: Projection): ScreenAnchorPoint {\n        const p = [x, y, z, 1];\n        let behindFog = false;\n        if (z || this.transform.pitch > 0) {\n            vec4.transformMat4(p, p, posMatrix);\n            // Do not perform symbol occlusion on globe due to fog fixed range\n            const isGlobe = bucketProjection.name === 'globe';\n            if (this.fogState && tileID && !isGlobe) {\n                const fogOpacity = getFogOpacityAtTileCoord(this.fogState, x, y, z, tileID.toUnwrapped(), this.transform);\n                behindFog = fogOpacity > FOG_SYMBOL_CLIPPING_THRESHOLD;\n            }\n        } else {\n            symbolProjection.xyTransformMat4(p, p, posMatrix);\n        }\n        const w = p[3];\n        const a = new Point(\n            (((p[0] / w + 1) / 2) * this.transform.width) + viewportPadding,\n            (((-p[1] / w + 1) / 2) * this.transform.height) + viewportPadding\n        );\n        return {\n            point: a,\n            // See perspective ratio comment in symbol_sdf.vertex\n            // We're doing collision detection in viewport space so we need\n            // to scale down boxes in the distance\n            perspectiveRatio: Math.min(0.5 + 0.5 * (this.transform.getCameraToCenterDistance(bucketProjection) / w), 1.5),\n            signedDistanceFromCamera: w,\n            occluded: (checkOcclusion && p[2] > w) || behindFog // Occluded by the far plane\n        };\n    }\n\n    isOffscreen(x1: number, y1: number, x2: number, y2: number): boolean {\n        return x2 < viewportPadding || x1 >= this.screenRightBoundary || y2 < viewportPadding || y1 > this.screenBottomBoundary;\n    }\n\n    isInsideGrid(x1: number, y1: number, x2: number, y2: number): boolean {\n        return x2 >= 0 && x1 < this.gridRightBoundary && y2 >= 0 && y1 < this.gridBottomBoundary;\n    }\n\n    /*\n    * Returns a matrix for transforming collision shapes to viewport coordinate space.\n    * Use this function to render e.g. collision circles on the screen.\n    *   example transformation: clipPos = glCoordMatrix * viewportMatrix * circle_pos\n    */\n    getViewportMatrix(): Mat4 {\n        const m = mat4.identity([]);\n        mat4.translate(m, m, [-viewportPadding, -viewportPadding, 0.0]);\n        return m;\n    }\n}\n\nexport default CollisionIndex;\n","// @flow\nimport type {OverscaledTileID} from '../../source/tile_id.js';\nimport type SymbolBucket from '../../data/bucket/symbol_bucket.js';\nimport type Transform from '../../geo/transform.js';\nimport type Projection from './projection.js';\nimport {mat4} from 'gl-matrix';\nimport assert from 'assert';\n\nfunction reconstructTileMatrix(transform: Transform, projection: Projection, coord: OverscaledTileID) {\n    // Bucket being rendered is built for different map projection\n    // than is currently being used. Reconstruct correct matrices.\n    // This code path may happen during a Globe - Mercator transition\n    const tileMatrix = projection.createTileMatrix(transform, transform.worldSize, coord.toUnwrapped());\n    return mat4.multiply(new Float32Array(16), transform.projMatrix, tileMatrix);\n}\n\nexport function getCollisionDebugTileProjectionMatrix(coord: OverscaledTileID, bucket: SymbolBucket, transform: Transform): Float32Array {\n    if (bucket.projection.name === transform.projection.name) {\n        assert(coord.projMatrix);\n        return coord.projMatrix;\n    }\n    const tr = transform.clone();\n    tr.setProjection(bucket.projection);\n    return reconstructTileMatrix(tr, bucket.getProjection(), coord);\n}\n\nexport function getSymbolTileProjectionMatrix(coord: OverscaledTileID, bucketProjection: Projection, transform: Transform): Float32Array {\n    if (bucketProjection.name === transform.projection.name) {\n        assert(coord.projMatrix);\n        return coord.projMatrix;\n    }\n    return reconstructTileMatrix(transform, bucketProjection, coord);\n}\n\nexport function getSymbolPlacementTileProjectionMatrix(coord: OverscaledTileID, bucketProjection: Projection, transform: Transform, runtimeProjection: string): Float32Array {\n    if (bucketProjection.name === runtimeProjection) {\n        return transform.calculateProjMatrix(coord.toUnwrapped());\n    }\n    assert(transform.projection.name === bucketProjection.name);\n    return reconstructTileMatrix(transform, bucketProjection, coord);\n}\n","// @flow\n\nimport CollisionIndex from './collision_index.js';\nimport EXTENT from '../style-spec/data/extent.js';\nimport ONE_EM from './one_em.js';\nimport * as symbolSize from './symbol_size.js';\nimport * as projection from './projection.js';\nimport {getAnchorJustification, evaluateVariableOffset} from './symbol_layout.js';\nimport {getAnchorAlignment, WritingMode} from './shaping.js';\nimport {mat4} from 'gl-matrix';\nimport assert from 'assert';\nimport Point from '@mapbox/point-geometry';\nimport {getSymbolPlacementTileProjectionMatrix} from '../geo/projection/projection_util.js';\nimport BuildingIndex from '../source/building_index.js';\nimport {warnOnce} from '../util/util.js';\n\nimport type Transform from '../geo/transform.js';\nimport type StyleLayer from '../style/style_layer.js';\nimport type Tile from '../source/tile.js';\nimport type SymbolBucket from '../data/bucket/symbol_bucket.js';\nimport type {SymbolBuffers, CollisionArrays, SingleCollisionBox} from '../data/bucket/symbol_bucket.js';\nimport type {CollisionBoxArray, CollisionVertexArray, SymbolInstance} from '../data/array_types.js';\nimport type FeatureIndex from '../data/feature_index.js';\nimport type {OverscaledTileID} from '../source/tile_id.js';\nimport type {TextAnchor} from './symbol_layout.js';\nimport type {FogState} from '../style/fog_helpers.js';\nimport type {Mat4} from 'gl-matrix';\nimport type {PlacedCollisionBox} from './collision_index.js';\nimport type {ObjMap} from '../types/obj-map.js';\n\n// PlacedCollisionBox with all fields optional\ntype PartialPlacedCollisionBox = ObjMap<PlacedCollisionBox, <V>() => ?V>;\n\nclass OpacityState {\n    opacity: number;\n    placed: boolean;\n    constructor(prevState: ?OpacityState, increment: number, placed: boolean, skipFade: ?boolean) {\n        if (prevState) {\n            this.opacity = Math.max(0, Math.min(1, prevState.opacity + (prevState.placed ? increment : -increment)));\n        } else {\n            this.opacity = (skipFade && placed) ? 1 : 0;\n        }\n        this.placed = placed;\n    }\n    isHidden(): boolean {\n        return this.opacity === 0 && !this.placed;\n    }\n}\n\nclass JointOpacityState {\n    text: OpacityState;\n    icon: OpacityState;\n    clipped: boolean;\n    constructor(prevState: ?JointOpacityState, increment: number, placedText: boolean, placedIcon: boolean, skipFade: ?boolean, clipped: boolean = false) {\n        this.text = new OpacityState(prevState ? prevState.text : null, increment, placedText, skipFade);\n        this.icon = new OpacityState(prevState ? prevState.icon : null, increment, placedIcon, skipFade);\n\n        this.clipped = clipped;\n    }\n    isHidden(): boolean {\n        return this.text.isHidden() && this.icon.isHidden();\n    }\n}\n\nclass JointPlacement {\n    text: boolean;\n    icon: boolean;\n    // skipFade = outside viewport, but within CollisionIndex::viewportPadding px of the edge\n    // Because these symbols aren't onscreen yet, we can skip the \"fade in\" animation,\n    // and if a subsequent viewport change brings them into view, they'll be fully\n    // visible right away.\n    skipFade: boolean;\n\n    clipped: boolean\n    constructor(text: boolean, icon: boolean, skipFade: boolean, clipped: boolean = false) {\n        this.text = text;\n        this.icon = icon;\n        this.skipFade = skipFade;\n        this.clipped = clipped;\n    }\n}\n\nclass CollisionCircleArray {\n    // Stores collision circles and placement matrices of a bucket for debug rendering.\n    invProjMatrix: Mat4;\n    viewportMatrix: Mat4;\n    circles: Array<number>;\n\n    constructor() {\n        this.invProjMatrix = mat4.create();\n        this.viewportMatrix = mat4.create();\n        this.circles = [];\n    }\n}\n\nexport class RetainedQueryData {\n    bucketInstanceId: number;\n    featureIndex: FeatureIndex;\n    sourceLayerIndex: number;\n    bucketIndex: number;\n    tileID: OverscaledTileID;\n    featureSortOrder: ?Array<number>\n    constructor(bucketInstanceId: number,\n                featureIndex: FeatureIndex,\n                sourceLayerIndex: number,\n                bucketIndex: number,\n                tileID: OverscaledTileID) {\n        this.bucketInstanceId = bucketInstanceId;\n        this.featureIndex = featureIndex;\n        this.sourceLayerIndex = sourceLayerIndex;\n        this.bucketIndex = bucketIndex;\n        this.tileID = tileID;\n    }\n}\n\ntype CollisionGroup = {|ID: number, predicate?: any|};\n\nclass CollisionGroups {\n    collisionGroups: {[groupName: string]: CollisionGroup};\n    maxGroupID: number;\n    crossSourceCollisions: boolean;\n\n    constructor(crossSourceCollisions: boolean) {\n        this.crossSourceCollisions = crossSourceCollisions;\n        this.maxGroupID = 0;\n        this.collisionGroups = {};\n    }\n\n    get(sourceID: string): CollisionGroup {\n        // The predicate/groupID mechanism allows for arbitrary grouping,\n        // but the current interface defines one source == one group when\n        // crossSourceCollisions == true.\n        if (!this.crossSourceCollisions) {\n            if (!this.collisionGroups[sourceID]) {\n                const nextGroupID = ++this.maxGroupID;\n                this.collisionGroups[sourceID] = {\n                    ID: nextGroupID,\n                    predicate: (key) => {\n                        return key.collisionGroupID === nextGroupID;\n                    }\n                };\n            }\n            return this.collisionGroups[sourceID];\n        } else {\n            return {ID: 0, predicate: null};\n        }\n    }\n}\n\nfunction calculateVariableLayoutShift(anchor: TextAnchor, width: number, height: number, textOffset: [number, number], textScale: number): Point {\n    const {horizontalAlign, verticalAlign} = getAnchorAlignment(anchor);\n    const shiftX = -(horizontalAlign - 0.5) * width;\n    const shiftY = -(verticalAlign - 0.5) * height;\n    const offset = evaluateVariableOffset(anchor, textOffset);\n    return new Point(\n        shiftX + offset[0] * textScale,\n        shiftY + offset[1] * textScale\n    );\n}\n\nfunction offsetShift(shiftX: number, shiftY: number, rotateWithMap: boolean, pitchWithMap: boolean, angle: number): Point {\n    const shift = new Point(shiftX, shiftY);\n    if (rotateWithMap) {\n        shift._rotate(pitchWithMap ? angle : -angle);\n    }\n    return shift;\n}\n\nexport type VariableOffset = {\n    textOffset: [number, number],\n    width: number,\n    height: number,\n    anchor: TextAnchor,\n    textScale: number,\n    prevAnchor?: TextAnchor\n};\n\ntype TileLayerParameters = {\n    bucket: SymbolBucket,\n    layout: any,\n    posMatrix: Mat4,\n    textLabelPlaneMatrix: Mat4,\n    labelToScreenMatrix: ?Mat4,\n    scale: number,\n    textPixelRatio: number,\n    holdingForFade: boolean,\n    collisionBoxArray: ?CollisionBoxArray,\n    partiallyEvaluatedTextSize: any,\n    collisionGroup: any\n};\n\nexport type BucketPart = {\n    sortKey?: number | void,\n    symbolInstanceStart: number,\n    symbolInstanceEnd: number,\n    parameters: TileLayerParameters\n};\n\nexport type CrossTileID = string | number;\n\nexport class Placement {\n    projection: string;\n    transform: Transform;\n    collisionIndex: CollisionIndex;\n    placements: { [_: CrossTileID]: JointPlacement };\n    opacities: { [_: CrossTileID]: JointOpacityState };\n    variableOffsets: {[_: CrossTileID]: VariableOffset };\n    placedOrientations: {[_: CrossTileID]: number };\n    commitTime: number;\n    prevZoomAdjustment: number;\n    lastPlacementChangeTime: number;\n    stale: boolean;\n    fadeDuration: number;\n    retainedQueryData: {[_: number]: RetainedQueryData};\n    collisionGroups: CollisionGroups;\n    prevPlacement: ?Placement;\n    zoomAtLastRecencyCheck: number;\n    collisionCircleArrays: {[any]: CollisionCircleArray};\n    buildingIndex: ?BuildingIndex;\n\n    constructor(transform: Transform, fadeDuration: number, crossSourceCollisions: boolean, prevPlacement?: Placement, fogState: ?FogState, buildingIndex: ?BuildingIndex) {\n        this.transform = transform.clone();\n        this.projection = transform.projection.name;\n        this.collisionIndex = new CollisionIndex(this.transform, fogState);\n        this.buildingIndex = buildingIndex;\n        this.placements = {};\n        this.opacities = {};\n        this.variableOffsets = {};\n        this.stale = false;\n        this.commitTime = 0;\n        this.fadeDuration = fadeDuration;\n        this.retainedQueryData = {};\n        this.collisionGroups = new CollisionGroups(crossSourceCollisions);\n        this.collisionCircleArrays = {};\n\n        this.prevPlacement = prevPlacement;\n        if (prevPlacement) {\n            prevPlacement.prevPlacement = undefined; // Only hold on to one placement back\n        }\n\n        this.placedOrientations = {};\n    }\n\n    getBucketParts(results: Array<BucketPart>, styleLayer: StyleLayer, tile: Tile, sortAcrossTiles: boolean) {\n        const symbolBucket = ((tile.getBucket(styleLayer): any): SymbolBucket);\n        const bucketFeatureIndex = tile.latestFeatureIndex;\n\n        if (!symbolBucket || !bucketFeatureIndex || styleLayer.fqid !== symbolBucket.layerIds[0])\n            return;\n\n        const layout = symbolBucket.layers[0].layout;\n\n        const collisionBoxArray = tile.collisionBoxArray;\n        const scale = Math.pow(2, this.transform.zoom - tile.tileID.overscaledZ);\n        const textPixelRatio = tile.tileSize / EXTENT;\n        const unwrappedTileID = tile.tileID.toUnwrapped();\n\n        this.transform.setProjection(symbolBucket.projection);\n\n        const posMatrix = getSymbolPlacementTileProjectionMatrix(tile.tileID, symbolBucket.getProjection(), this.transform, this.projection);\n\n        const pitchWithMap = layout.get('text-pitch-alignment') === 'map';\n        const rotateWithMap = layout.get('text-rotation-alignment') === 'map';\n\n        styleLayer.compileFilter();\n\n        const dynamicFilter = styleLayer.dynamicFilter();\n        const dynamicFilterNeedsFeature = styleLayer.dynamicFilterNeedsFeature();\n        const pixelsToTiles = this.transform.calculatePixelsToTileUnitsMatrix(tile);\n\n        const textLabelPlaneMatrix = projection.getLabelPlaneMatrixForPlacement(posMatrix,\n                tile.tileID.canonical,\n                pitchWithMap,\n                rotateWithMap,\n                this.transform,\n                symbolBucket.getProjection(),\n                pixelsToTiles);\n\n        let labelToScreenMatrix = null;\n\n        if (pitchWithMap) {\n            const glMatrix = projection.getGlCoordMatrix(\n                posMatrix,\n                tile.tileID.canonical,\n                pitchWithMap,\n                rotateWithMap,\n                this.transform,\n                symbolBucket.getProjection(),\n                pixelsToTiles);\n\n            labelToScreenMatrix = mat4.multiply([], this.transform.labelPlaneMatrix, glMatrix);\n        }\n\n        let clippingData = null;\n        assert(!!tile.latestFeatureIndex);\n        if (!!dynamicFilter && tile.latestFeatureIndex) {\n\n            clippingData = {\n                unwrappedTileID,\n                dynamicFilter,\n                dynamicFilterNeedsFeature,\n                featureIndex: tile.latestFeatureIndex\n            };\n        }\n\n        // As long as this placement lives, we have to hold onto this bucket's\n        // matching FeatureIndex/data for querying purposes\n        this.retainedQueryData[symbolBucket.bucketInstanceId] = new RetainedQueryData(\n            symbolBucket.bucketInstanceId,\n            bucketFeatureIndex,\n            symbolBucket.sourceLayerIndex,\n            symbolBucket.index,\n            tile.tileID\n        );\n\n        const parameters = {\n            bucket: symbolBucket,\n            layout,\n            posMatrix,\n            textLabelPlaneMatrix,\n            labelToScreenMatrix,\n            clippingData,\n            scale,\n            textPixelRatio,\n            holdingForFade: tile.holdingForFade(),\n            collisionBoxArray,\n            partiallyEvaluatedTextSize: symbolSize.evaluateSizeForZoom(symbolBucket.textSizeData, this.transform.zoom),\n            partiallyEvaluatedIconSize: symbolSize.evaluateSizeForZoom(symbolBucket.iconSizeData, this.transform.zoom),\n            collisionGroup: this.collisionGroups.get(symbolBucket.sourceID)\n        };\n\n        if (sortAcrossTiles) {\n            for (const range of symbolBucket.sortKeyRanges) {\n                const {sortKey, symbolInstanceStart, symbolInstanceEnd} = range;\n                results.push({sortKey, symbolInstanceStart, symbolInstanceEnd, parameters});\n            }\n        } else {\n            results.push({\n                symbolInstanceStart: 0,\n                symbolInstanceEnd: symbolBucket.symbolInstances.length,\n                parameters\n            });\n        }\n    }\n\n    attemptAnchorPlacement(anchor: TextAnchor, textBox: SingleCollisionBox, width: number, height: number,\n                           textScale: number, rotateWithMap: boolean, pitchWithMap: boolean, textPixelRatio: number,\n                           posMatrix: Mat4, collisionGroup: CollisionGroup, textAllowOverlap: boolean,\n                           symbolInstance: SymbolInstance, boxIndex: number, bucket: SymbolBucket,\n                           orientation: number, iconBox: ?SingleCollisionBox, textSize: any, iconSize: any): ?{ shift: Point, placedGlyphBoxes: PlacedCollisionBox }  {\n\n        const {textOffset0, textOffset1, crossTileID} = symbolInstance;\n        const textOffset = [textOffset0, textOffset1];\n        const shift = calculateVariableLayoutShift(anchor, width, height, textOffset, textScale);\n\n        const placedGlyphBoxes = this.collisionIndex.placeCollisionBox(\n            bucket, textScale, textBox, offsetShift(shift.x, shift.y, rotateWithMap, pitchWithMap, this.transform.angle),\n            textAllowOverlap, textPixelRatio, posMatrix, collisionGroup.predicate);\n        if (iconBox) {\n            const size = bucket.getSymbolInstanceIconSize(iconSize, this.transform.zoom, symbolInstance.placedIconSymbolIndex);\n            const placedIconBoxes = this.collisionIndex.placeCollisionBox(\n                bucket, size,\n                iconBox, offsetShift(shift.x, shift.y, rotateWithMap, pitchWithMap, this.transform.angle),\n                textAllowOverlap, textPixelRatio, posMatrix, collisionGroup.predicate);\n            if (placedIconBoxes.box.length === 0) return;\n        }\n\n        if (placedGlyphBoxes.box.length > 0) {\n            let prevAnchor;\n            // If this label was placed in the previous placement, record the anchor position\n            // to allow us to animate the transition\n            if (this.prevPlacement &&\n                this.prevPlacement.variableOffsets[crossTileID] &&\n                this.prevPlacement.placements[crossTileID] &&\n                this.prevPlacement.placements[crossTileID].text) {\n                prevAnchor = this.prevPlacement.variableOffsets[crossTileID].anchor;\n            }\n            assert(crossTileID !== 0);\n            this.variableOffsets[crossTileID] = {\n                textOffset,\n                width,\n                height,\n                anchor,\n                textScale,\n                prevAnchor\n            };\n            this.markUsedJustification(bucket, anchor, symbolInstance, orientation);\n\n            if (bucket.allowVerticalPlacement) {\n                this.markUsedOrientation(bucket, orientation, symbolInstance);\n                this.placedOrientations[crossTileID] = orientation;\n            }\n\n            return {shift, placedGlyphBoxes};\n        }\n    }\n\n    placeLayerBucketPart(bucketPart: Object, seenCrossTileIDs: Set<number>, showCollisionBoxes: boolean, updateCollisionBoxIfNecessary: boolean) {\n\n        const {\n            bucket,\n            layout,\n            posMatrix,\n            textLabelPlaneMatrix,\n            labelToScreenMatrix,\n            clippingData,\n            textPixelRatio,\n            holdingForFade,\n            collisionBoxArray,\n            partiallyEvaluatedTextSize,\n            partiallyEvaluatedIconSize,\n            collisionGroup\n        } = bucketPart.parameters;\n\n        const textOptional = layout.get('text-optional');\n        const iconOptional = layout.get('icon-optional');\n        const textAllowOverlap = layout.get('text-allow-overlap');\n        const iconAllowOverlap = layout.get('icon-allow-overlap');\n        const rotateWithMap = layout.get('text-rotation-alignment') === 'map';\n        const pitchWithMap = layout.get('text-pitch-alignment') === 'map';\n        const zOrderByViewportY = layout.get('symbol-z-order') === 'viewport-y';\n        const zOffset = layout.get('symbol-z-elevate');\n\n        this.transform.setProjection(bucket.projection);\n\n        // This logic is similar to the \"defaultOpacityState\" logic below in updateBucketOpacities\n        // If we know a symbol is always supposed to show, force it to be marked visible even if\n        // it wasn't placed into the collision index (because some or all of it was outside the range\n        // of the collision grid).\n        // There is a subtle edge case here we're accepting:\n        //  Symbol A has text-allow-overlap: true, icon-allow-overlap: true, icon-optional: false\n        //  A's icon is outside the grid, so doesn't get placed\n        //  A's text would be inside grid, but doesn't get placed because of icon-optional: false\n        //  We still show A because of the allow-overlap settings.\n        //  Symbol B has allow-overlap: false, and gets placed where A's text would be\n        //  On panning in, there is a short period when Symbol B and Symbol A will overlap\n        //  This is the reverse of our normal policy of \"fade in on pan\", but should look like any other\n        //  collision and hopefully not be too noticeable.\n        // See https://github.com/mapbox/mapbox-gl-js/issues/7172\n        let alwaysShowText = textAllowOverlap && (iconAllowOverlap || !bucket.hasIconData() || iconOptional);\n        let alwaysShowIcon = iconAllowOverlap && (textAllowOverlap || !bucket.hasTextData() || textOptional);\n\n        if (!bucket.collisionArrays && collisionBoxArray) {\n            bucket.deserializeCollisionBoxes(collisionBoxArray);\n        }\n\n        if (showCollisionBoxes && updateCollisionBoxIfNecessary) {\n            bucket.updateCollisionDebugBuffers(this.transform.zoom, collisionBoxArray);\n        }\n\n        const placeSymbol = (symbolInstance: SymbolInstance, boxIndex: number, collisionArrays: CollisionArrays) => {\n            const {crossTileID, numVerticalGlyphVertices} = symbolInstance;\n\n            if (clippingData) {\n                // Setup globals\n                const globals = {\n                    zoom: this.transform.zoom,\n                    pitch: this.transform.pitch,\n                };\n\n                // Deserialize feature only if necessary\n                let feature = null;\n                if (clippingData.dynamicFilterNeedsFeature) {\n                    const featureIndex = clippingData.featureIndex;\n                    const retainedQueryData = this.retainedQueryData[bucket.bucketInstanceId];\n                    feature = featureIndex.loadFeature({\n                        featureIndex: symbolInstance.featureIndex,\n                        bucketIndex: retainedQueryData.bucketIndex,\n                        sourceLayerIndex: retainedQueryData.sourceLayerIndex,\n                        layoutVertexArrayOffset: 0\n                    });\n                }\n                const canonicalTileId = this.retainedQueryData[bucket.bucketInstanceId].tileID.canonical;\n\n                const filterFunc = clippingData.dynamicFilter;\n                const shouldClip = !filterFunc(globals, feature, canonicalTileId, new Point(symbolInstance.tileAnchorX, symbolInstance.tileAnchorY), this.transform.calculateDistanceTileData(clippingData.unwrappedTileID));\n\n                if (shouldClip) {\n                    this.placements[crossTileID] = new JointPlacement(false, false, false, true);\n                    seenCrossTileIDs.add(crossTileID);\n                    return;\n                }\n            }\n\n            if (seenCrossTileIDs.has(crossTileID)) return;\n            if (holdingForFade) {\n                // Mark all symbols from this tile as \"not placed\", but don't add to seenCrossTileIDs, because we don't\n                // know yet if we have a duplicate in a parent tile that _should_ be placed.\n                this.placements[crossTileID] = new JointPlacement(false, false, false);\n                return;\n            }\n            let placeText: ?boolean = false;\n            let placeIcon: ?boolean = false;\n            let offscreen: ?boolean = true;\n            let textOccluded: ?boolean = false;\n            let iconOccluded = false;\n            let shift = null;\n\n            let placed: PartialPlacedCollisionBox = {box: null, offscreen: null, occluded: null};\n            let placedVerticalText: PartialPlacedCollisionBox = {box: null, offscreen: null, occluded: null};\n\n            let placedGlyphBoxes = null;\n            let placedGlyphCircles = null;\n            let placedIconBoxes = null;\n            let textFeatureIndex = 0;\n            let verticalTextFeatureIndex = 0;\n            let iconFeatureIndex = 0;\n\n            if (collisionArrays.textFeatureIndex) {\n                textFeatureIndex = collisionArrays.textFeatureIndex;\n            } else if (symbolInstance.useRuntimeCollisionCircles) {\n                textFeatureIndex = symbolInstance.featureIndex;\n            }\n            if (collisionArrays.verticalTextFeatureIndex) {\n                verticalTextFeatureIndex = collisionArrays.verticalTextFeatureIndex;\n            }\n\n            const updateBoxData = (box: SingleCollisionBox) => {\n                box.tileID = this.retainedQueryData[bucket.bucketInstanceId].tileID;\n                const elevation = this.transform.elevation;\n                box.elevation = symbolInstance.zOffset + (elevation ? elevation.getAtTileOffset(box.tileID, box.tileAnchorX, box.tileAnchorY) : 0);\n            };\n\n            const textBox = collisionArrays.textBox;\n            if (textBox) {\n                updateBoxData(textBox);\n                const updatePreviousOrientationIfNotPlaced = (isPlaced: boolean) => {\n                    let previousOrientation = WritingMode.horizontal;\n                    if (bucket.allowVerticalPlacement && !isPlaced && this.prevPlacement) {\n                        const prevPlacedOrientation = this.prevPlacement.placedOrientations[crossTileID];\n                        if (prevPlacedOrientation) {\n                            this.placedOrientations[crossTileID] = prevPlacedOrientation;\n                            previousOrientation = prevPlacedOrientation;\n                            this.markUsedOrientation(bucket, previousOrientation, symbolInstance);\n                        }\n                    }\n                    return previousOrientation;\n                };\n\n                const placeTextForPlacementModes = (placeHorizontalFn: () => PartialPlacedCollisionBox, placeVerticalFn: () => PartialPlacedCollisionBox) => {\n                    if (bucket.allowVerticalPlacement && numVerticalGlyphVertices > 0 && collisionArrays.verticalTextBox) {\n                        for (const placementMode of bucket.writingModes) {\n                            if (placementMode === WritingMode.vertical) {\n                                placed = placeVerticalFn();\n                                placedVerticalText = placed;\n                            } else {\n                                placed = placeHorizontalFn();\n                            }\n                            if (placed && placed.box && placed.box.length) break;\n                        }\n                    } else {\n                        placed = placeHorizontalFn();\n                    }\n                };\n\n                if (!layout.get('text-variable-anchor')) {\n                    const placeBox = (collisionTextBox: SingleCollisionBox, orientation: number) => {\n                        const textScale = bucket.getSymbolInstanceTextSize(partiallyEvaluatedTextSize, symbolInstance, this.transform.zoom, boxIndex);\n                        const placedFeature = this.collisionIndex.placeCollisionBox(bucket, textScale, collisionTextBox,\n                            new Point(0, 0), textAllowOverlap, textPixelRatio, posMatrix, collisionGroup.predicate);\n                        if (placedFeature && placedFeature.box && placedFeature.box.length) {\n                            this.markUsedOrientation(bucket, orientation, symbolInstance);\n                            this.placedOrientations[crossTileID] = orientation;\n                        }\n                        return placedFeature;\n                    };\n\n                    const placeHorizontal: () => PlacedCollisionBox = () => {\n                        return placeBox(textBox, WritingMode.horizontal);\n                    };\n\n                    const placeVertical: () => PlacedCollisionBox | PartialPlacedCollisionBox = () => {\n                        const verticalTextBox = collisionArrays.verticalTextBox;\n                        if (bucket.allowVerticalPlacement && numVerticalGlyphVertices > 0 && verticalTextBox) {\n                            updateBoxData(verticalTextBox);\n                            return placeBox(verticalTextBox, WritingMode.vertical);\n                        }\n                        return {box: null, offscreen: null, occluded: null};\n                    };\n\n                    placeTextForPlacementModes(\n                        ((placeHorizontal: any): () => PartialPlacedCollisionBox),\n                        ((placeVertical: any): () => PartialPlacedCollisionBox),\n                    );\n\n                    const isPlaced = placed && placed.box && placed.box.length;\n                    updatePreviousOrientationIfNotPlaced(!!isPlaced);\n\n                } else {\n                    let anchors = layout.get('text-variable-anchor');\n\n                    // If this symbol was in the last placement, shift the previously used\n                    // anchor to the front of the anchor list, only if the previous anchor\n                    // is still in the anchor list\n                    if (this.prevPlacement && this.prevPlacement.variableOffsets[crossTileID]) {\n                        const prevOffsets = this.prevPlacement.variableOffsets[crossTileID];\n                        if (anchors.indexOf(prevOffsets.anchor) > 0) {\n                            anchors = anchors.filter(anchor => anchor !== prevOffsets.anchor);\n                            anchors.unshift(prevOffsets.anchor);\n                        }\n                    }\n\n                    const placeBoxForVariableAnchors = (collisionTextBox: SingleCollisionBox, collisionIconBox: ?SingleCollisionBox, orientation: number) => {\n                        const textScale = bucket.getSymbolInstanceTextSize(partiallyEvaluatedTextSize, symbolInstance, this.transform.zoom, boxIndex);\n                        const width = (collisionTextBox.x2 - collisionTextBox.x1) * textScale + 2.0 * collisionTextBox.padding;\n                        const height = (collisionTextBox.y2 - collisionTextBox.y1) * textScale + 2.0 * collisionTextBox.padding;\n\n                        const variableIconBox = symbolInstance.hasIconTextFit && !iconAllowOverlap ? collisionIconBox : null;\n                        if (variableIconBox) updateBoxData(variableIconBox);\n\n                        let placedBox: PartialPlacedCollisionBox = {box: [], offscreen: false, occluded: false};\n                        const placementAttempts = textAllowOverlap ? anchors.length * 2 : anchors.length;\n                        for (let i = 0; i < placementAttempts; ++i) {\n                            const anchor = anchors[i % anchors.length];\n                            const allowOverlap = (i >= anchors.length);\n                            const result = this.attemptAnchorPlacement(\n                                anchor, collisionTextBox, width, height, textScale, rotateWithMap,\n                                pitchWithMap, textPixelRatio, posMatrix, collisionGroup, allowOverlap,\n                                symbolInstance, boxIndex, bucket, orientation, variableIconBox,\n                                partiallyEvaluatedTextSize, partiallyEvaluatedIconSize);\n\n                            if (result) {\n                                placedBox = ((result.placedGlyphBoxes: any): PartialPlacedCollisionBox);\n                                if (placedBox && placedBox.box && placedBox.box.length) {\n                                    placeText = true;\n                                    shift = result.shift;\n                                    break;\n                                }\n                            }\n                        }\n\n                        return placedBox;\n                    };\n\n                    const placeHorizontal = () => {\n                        return placeBoxForVariableAnchors(textBox, collisionArrays.iconBox, WritingMode.horizontal);\n                    };\n\n                    const placeVertical = () => {\n                        const verticalTextBox = collisionArrays.verticalTextBox;\n                        if (verticalTextBox) updateBoxData(verticalTextBox);\n                        const wasPlaced = placed && placed.box && placed.box.length;\n                        if (bucket.allowVerticalPlacement && !wasPlaced && numVerticalGlyphVertices > 0 && verticalTextBox) {\n                            return placeBoxForVariableAnchors(verticalTextBox, collisionArrays.verticalIconBox, WritingMode.vertical);\n                        }\n                        return {box: null, offscreen: null, occluded: null};\n                    };\n\n                    placeTextForPlacementModes(placeHorizontal, placeVertical);\n\n                    if (placed) {\n                        placeText = placed.box;\n                        offscreen = placed.offscreen;\n                        textOccluded = placed.occluded;\n                    }\n\n                    const isPlaced = placed && placed.box;\n                    const prevOrientation = updatePreviousOrientationIfNotPlaced(!!isPlaced);\n\n                    // If we didn't get placed, we still need to copy our position from the last placement for\n                    // fade animations\n                    if (!placeText && this.prevPlacement) {\n                        const prevOffset = this.prevPlacement.variableOffsets[crossTileID];\n                        if (prevOffset) {\n                            this.variableOffsets[crossTileID] = prevOffset;\n                            this.markUsedJustification(bucket, prevOffset.anchor, symbolInstance, prevOrientation);\n                        }\n                    }\n\n                }\n            }\n\n            placedGlyphBoxes = placed;\n\n            placeText = placedGlyphBoxes && placedGlyphBoxes.box && placedGlyphBoxes.box.length > 0;\n            offscreen = placedGlyphBoxes && placedGlyphBoxes.offscreen;\n            textOccluded = placedGlyphBoxes && placedGlyphBoxes.occluded;\n\n            if (symbolInstance.useRuntimeCollisionCircles) {\n                const placedSymbolIndex = symbolInstance.centerJustifiedTextSymbolIndex >= 0 ? symbolInstance.centerJustifiedTextSymbolIndex : symbolInstance.verticalPlacedTextSymbolIndex;\n                const placedSymbol = bucket.text.placedSymbolArray.get(placedSymbolIndex);\n                const fontSize = symbolSize.evaluateSizeForFeature(bucket.textSizeData, partiallyEvaluatedTextSize, placedSymbol);\n\n                const textPixelPadding = layout.get('text-padding');\n                // Convert circle collision height into pixels\n                const circlePixelDiameter = symbolInstance.collisionCircleDiameter * fontSize / ONE_EM;\n\n                placedGlyphCircles = this.collisionIndex.placeCollisionCircles(\n                        bucket,\n                        textAllowOverlap,\n                        placedSymbol,\n                        bucket.lineVertexArray,\n                        bucket.glyphOffsetArray,\n                        fontSize,\n                        posMatrix,\n                        textLabelPlaneMatrix,\n                        labelToScreenMatrix,\n                        showCollisionBoxes,\n                        pitchWithMap,\n                        collisionGroup.predicate,\n                        circlePixelDiameter,\n                        textPixelPadding,\n                        this.retainedQueryData[bucket.bucketInstanceId].tileID);\n\n                assert(!placedGlyphCircles.circles.length || (!placedGlyphCircles.collisionDetected || showCollisionBoxes));\n                // If text-allow-overlap is set, force \"placedCircles\" to true\n                // In theory there should always be at least one circle placed\n                // in this case, but for now quirks in text-anchor\n                // and text-offset may prevent that from being true.\n                placeText = textAllowOverlap || (placedGlyphCircles.circles.length > 0 && !placedGlyphCircles.collisionDetected);\n                offscreen = offscreen && placedGlyphCircles.offscreen;\n                textOccluded = placedGlyphCircles.occluded;\n            }\n\n            if (collisionArrays.iconFeatureIndex) {\n                iconFeatureIndex = collisionArrays.iconFeatureIndex;\n            }\n\n            if (collisionArrays.iconBox) {\n\n                const placeIconFeature = (iconBox: SingleCollisionBox) => {\n                    updateBoxData(iconBox);\n                    const shiftPoint: Point = symbolInstance.hasIconTextFit && shift ?\n                        offsetShift(shift.x, shift.y, rotateWithMap, pitchWithMap, this.transform.angle) :\n                        new Point(0, 0);\n                    const iconScale = bucket.getSymbolInstanceIconSize(partiallyEvaluatedIconSize, this.transform.zoom, symbolInstance.placedIconSymbolIndex);\n                    return this.collisionIndex.placeCollisionBox(bucket, iconScale, iconBox, shiftPoint,\n                        iconAllowOverlap, textPixelRatio, posMatrix, collisionGroup.predicate);\n                };\n\n                if (placedVerticalText && placedVerticalText.box && placedVerticalText.box.length && collisionArrays.verticalIconBox) {\n                    placedIconBoxes = placeIconFeature(collisionArrays.verticalIconBox);\n                    placeIcon = placedIconBoxes.box.length > 0;\n                } else {\n                    placedIconBoxes = placeIconFeature(collisionArrays.iconBox);\n                    placeIcon = placedIconBoxes.box.length > 0;\n                }\n                offscreen = offscreen && placedIconBoxes.offscreen;\n                iconOccluded = placedIconBoxes.occluded;\n            }\n\n            const iconWithoutText = textOptional ||\n                (symbolInstance.numHorizontalGlyphVertices === 0 && numVerticalGlyphVertices === 0);\n            const textWithoutIcon = iconOptional || symbolInstance.numIconVertices === 0;\n\n            // Combine the scales for icons and text.\n            if (!iconWithoutText && !textWithoutIcon) {\n                placeIcon = placeText = placeIcon && placeText;\n            } else if (!textWithoutIcon) {\n                placeText = placeIcon && placeText;\n            } else if (!iconWithoutText) {\n                placeIcon = placeIcon && placeText;\n            }\n\n            if (placeText && placedGlyphBoxes && placedGlyphBoxes.box) {\n                if (placedVerticalText && placedVerticalText.box && verticalTextFeatureIndex) {\n                    this.collisionIndex.insertCollisionBox(placedGlyphBoxes.box, layout.get('text-ignore-placement'),\n                        bucket.bucketInstanceId, verticalTextFeatureIndex, collisionGroup.ID);\n                } else {\n                    this.collisionIndex.insertCollisionBox(placedGlyphBoxes.box, layout.get('text-ignore-placement'),\n                        bucket.bucketInstanceId, textFeatureIndex, collisionGroup.ID);\n                }\n\n            }\n            if (placeIcon && placedIconBoxes) {\n                this.collisionIndex.insertCollisionBox(placedIconBoxes.box, layout.get('icon-ignore-placement'),\n                        bucket.bucketInstanceId, iconFeatureIndex, collisionGroup.ID);\n            }\n            if (placedGlyphCircles) {\n                if (placeText) {\n                    this.collisionIndex.insertCollisionCircles(placedGlyphCircles.circles, layout.get('text-ignore-placement'),\n                        bucket.bucketInstanceId, textFeatureIndex, collisionGroup.ID);\n                }\n\n                if (showCollisionBoxes) {\n                    const id = bucket.bucketInstanceId;\n                    let circleArray = this.collisionCircleArrays[id];\n\n                    // Group collision circles together by bucket. Circles can't be pushed forward for rendering yet as the symbol placement\n                    // for a bucket is not guaranteed to be complete before the commit-function has been called\n                    if (circleArray === undefined)\n                        circleArray = this.collisionCircleArrays[id] = new CollisionCircleArray();\n\n                    for (let i = 0; i < placedGlyphCircles.circles.length; i += 4) {\n                        circleArray.circles.push(placedGlyphCircles.circles[i + 0]);              // x\n                        circleArray.circles.push(placedGlyphCircles.circles[i + 1]);              // y\n                        circleArray.circles.push(placedGlyphCircles.circles[i + 2]);              // radius\n                        circleArray.circles.push(placedGlyphCircles.collisionDetected ? 1 : 0);   // collisionDetected-flag\n                    }\n                }\n            }\n\n            assert(crossTileID !== 0);\n            assert(bucket.bucketInstanceId !== 0);\n\n            const notGlobe = bucket.projection.name !== 'globe';\n            alwaysShowText = alwaysShowText && (notGlobe || !textOccluded);\n            alwaysShowIcon = alwaysShowIcon && (notGlobe || !iconOccluded);\n\n            this.placements[crossTileID] = new JointPlacement(placeText || alwaysShowText, placeIcon || alwaysShowIcon, offscreen || bucket.justReloaded);\n            seenCrossTileIDs.add(crossTileID);\n        };\n\n        if (zOffset && this.buildingIndex) {\n            const tileID = this.retainedQueryData[bucket.bucketInstanceId].tileID;\n            this.buildingIndex.updateZOffset(bucket, tileID);\n            bucket.updateZOffset();\n        }\n\n        if (zOrderByViewportY) {\n            assert(bucketPart.symbolInstanceStart === 0);\n            const symbolIndexes = bucket.getSortedSymbolIndexes(this.transform.angle);\n            for (let i = symbolIndexes.length - 1; i >= 0; --i) {\n                const symbolIndex = symbolIndexes[i];\n                placeSymbol(bucket.symbolInstances.get(symbolIndex), symbolIndex, bucket.collisionArrays[symbolIndex]);\n            }\n            if (bucket.hasAnyZOffset) warnOnce(`${bucket.layerIds[0]} layer symbol-z-elevate: symbols are not sorted by elevation if symbol-z-order is evaluated to viewport-y`);\n        } else if (bucket.hasAnyZOffset) {\n            const indexes = bucket.getSortedIndexesByZOffset();\n            for (let i = 0; i < indexes.length; ++i) {\n                const symbolIndex = indexes[i];\n                placeSymbol(bucket.symbolInstances.get(symbolIndex), symbolIndex, bucket.collisionArrays[symbolIndex]);\n            }\n        } else {\n            for (let i = bucketPart.symbolInstanceStart; i < bucketPart.symbolInstanceEnd; i++) {\n                placeSymbol(bucket.symbolInstances.get(i), i, bucket.collisionArrays[i]);\n            }\n        }\n\n        if (showCollisionBoxes && bucket.bucketInstanceId in this.collisionCircleArrays) {\n            const circleArray = this.collisionCircleArrays[bucket.bucketInstanceId];\n\n            // Store viewport and inverse projection matrices per bucket\n            mat4.invert(circleArray.invProjMatrix, posMatrix);\n            circleArray.viewportMatrix = this.collisionIndex.getViewportMatrix();\n        }\n\n        bucket.justReloaded = false;\n    }\n\n    markUsedJustification(bucket: SymbolBucket, placedAnchor: TextAnchor, symbolInstance: SymbolInstance, orientation: number) {\n        const {\n            leftJustifiedTextSymbolIndex: left, centerJustifiedTextSymbolIndex: center,\n            rightJustifiedTextSymbolIndex: right, verticalPlacedTextSymbolIndex: vertical, crossTileID\n        } = symbolInstance;\n\n        const justification = getAnchorJustification(placedAnchor);\n        const autoIndex =\n            orientation === WritingMode.vertical ? vertical :\n            justification === 'left' ? left :\n            justification === 'center' ? center :\n            justification === 'right' ? right : -1;\n\n        // If there are multiple justifications and this one isn't it: shift offscreen\n        // If either this is the chosen justification or the justification is hardwired: use it\n        if (left >= 0) bucket.text.placedSymbolArray.get(left).crossTileID = autoIndex >= 0 && left !== autoIndex ? 0 : crossTileID;\n        if (center >= 0) bucket.text.placedSymbolArray.get(center).crossTileID = autoIndex >= 0 && center !== autoIndex ? 0 : crossTileID;\n        if (right >= 0) bucket.text.placedSymbolArray.get(right).crossTileID = autoIndex >= 0 && right !== autoIndex ? 0 : crossTileID;\n        if (vertical >= 0) bucket.text.placedSymbolArray.get(vertical).crossTileID = autoIndex >= 0 && vertical !== autoIndex ? 0 : crossTileID;\n    }\n\n    markUsedOrientation(bucket: SymbolBucket, orientation: number, symbolInstance: SymbolInstance) {\n        const horizontalOrientation = (orientation === WritingMode.horizontal || orientation === WritingMode.horizontalOnly) ? orientation : 0;\n        const verticalOrientation = orientation === WritingMode.vertical ? orientation : 0;\n        const {\n            leftJustifiedTextSymbolIndex: left, centerJustifiedTextSymbolIndex: center,\n            rightJustifiedTextSymbolIndex: right, verticalPlacedTextSymbolIndex: vertical\n        } = symbolInstance;\n        const array = bucket.text.placedSymbolArray;\n\n        if (left >= 0) array.get(left).placedOrientation = horizontalOrientation;\n        if (center >= 0) array.get(center).placedOrientation = horizontalOrientation;\n        if (right >= 0) array.get(right).placedOrientation = horizontalOrientation;\n        if (vertical >= 0) array.get(vertical).placedOrientation = verticalOrientation;\n    }\n\n    commit(now: number): void {\n        this.commitTime = now;\n        this.zoomAtLastRecencyCheck = this.transform.zoom;\n\n        const prevPlacement = this.prevPlacement;\n        let placementChanged = false;\n\n        this.prevZoomAdjustment = prevPlacement ? prevPlacement.zoomAdjustment(this.transform.zoom) : 0;\n        const increment = prevPlacement ? prevPlacement.symbolFadeChange(now) : 1;\n\n        const prevOpacities = prevPlacement ? prevPlacement.opacities : {};\n        const prevOffsets = prevPlacement ? prevPlacement.variableOffsets : {};\n        const prevOrientations = prevPlacement ? prevPlacement.placedOrientations : {};\n\n        // add the opacities from the current placement, and copy their current values from the previous placement\n        for (const crossTileID in this.placements) {\n            const jointPlacement = this.placements[crossTileID];\n            const prevOpacity = prevOpacities[crossTileID];\n            if (prevOpacity) {\n                this.opacities[crossTileID] = new JointOpacityState(prevOpacity, increment, jointPlacement.text, jointPlacement.icon, null, jointPlacement.clipped);\n                placementChanged = placementChanged ||\n                    jointPlacement.text !== prevOpacity.text.placed ||\n                    jointPlacement.icon !== prevOpacity.icon.placed;\n            } else {\n                this.opacities[crossTileID] = new JointOpacityState(null, increment, jointPlacement.text, jointPlacement.icon, jointPlacement.skipFade, jointPlacement.clipped);\n                placementChanged = placementChanged || jointPlacement.text || jointPlacement.icon;\n            }\n        }\n\n        // copy and update values from the previous placement that aren't in the current placement but haven't finished fading\n        for (const crossTileID in prevOpacities) {\n            const prevOpacity = prevOpacities[crossTileID];\n            if (!this.opacities[crossTileID]) {\n                const jointOpacity = new JointOpacityState(prevOpacity, increment, false, false);\n                if (!jointOpacity.isHidden()) {\n                    this.opacities[crossTileID] = jointOpacity;\n                    placementChanged = placementChanged || prevOpacity.text.placed || prevOpacity.icon.placed;\n                }\n            }\n        }\n        for (const crossTileID in prevOffsets) {\n            if (!this.variableOffsets[crossTileID] && this.opacities[crossTileID] && !this.opacities[crossTileID].isHidden()) {\n                this.variableOffsets[crossTileID] = prevOffsets[crossTileID];\n            }\n        }\n\n        for (const crossTileID in prevOrientations) {\n            if (!this.placedOrientations[crossTileID] && this.opacities[crossTileID] && !this.opacities[crossTileID].isHidden()) {\n                this.placedOrientations[crossTileID] = prevOrientations[crossTileID];\n            }\n        }\n\n        // this.lastPlacementChangeTime is the time of the last commit() that\n        // resulted in a placement change -- in other words, the start time of\n        // the last symbol fade animation\n        assert(!prevPlacement || prevPlacement.lastPlacementChangeTime !== undefined);\n        if (placementChanged) {\n            this.lastPlacementChangeTime = now;\n        } else if (typeof this.lastPlacementChangeTime !== 'number') {\n            this.lastPlacementChangeTime = prevPlacement ? prevPlacement.lastPlacementChangeTime : now;\n        }\n    }\n\n    updateLayerOpacities(styleLayer: StyleLayer, tiles: Array<Tile>) {\n        const seenCrossTileIDs = new Set();\n        for (const tile of tiles) {\n            const symbolBucket = ((tile.getBucket(styleLayer): any): SymbolBucket);\n            if (symbolBucket && tile.latestFeatureIndex && styleLayer.fqid === symbolBucket.layerIds[0]) {\n                this.updateBucketOpacities(symbolBucket, seenCrossTileIDs, tile.collisionBoxArray);\n                const layout = symbolBucket.layers[0].layout;\n                if (layout.get('symbol-z-elevate') && this.buildingIndex) {\n                    this.buildingIndex.updateZOffset(symbolBucket, tile.tileID);\n                    symbolBucket.updateZOffset();\n                }\n            }\n        }\n    }\n\n    updateBucketOpacities(bucket: SymbolBucket, seenCrossTileIDs: Set<number>, collisionBoxArray: ?CollisionBoxArray) {\n        if (bucket.hasTextData()) bucket.text.opacityVertexArray.clear();\n        if (bucket.hasIconData()) bucket.icon.opacityVertexArray.clear();\n        if (bucket.hasIconCollisionBoxData()) bucket.iconCollisionBox.collisionVertexArray.clear();\n        if (bucket.hasTextCollisionBoxData()) bucket.textCollisionBox.collisionVertexArray.clear();\n\n        const layout = bucket.layers[0].layout;\n        const hasClipping = !!bucket.layers[0].dynamicFilter();\n        const duplicateOpacityState = new JointOpacityState(null, 0, false, false, true);\n        const textAllowOverlap = layout.get('text-allow-overlap');\n        const iconAllowOverlap = layout.get('icon-allow-overlap');\n        const variablePlacement = layout.get('text-variable-anchor');\n        const rotateWithMap = layout.get('text-rotation-alignment') === 'map';\n        const pitchWithMap = layout.get('text-pitch-alignment') === 'map';\n\n        // If allow-overlap is true, we can show symbols before placement runs on them\n        // But we have to wait for placement if we potentially depend on a paired icon/text\n        // with allow-overlap: false.\n        // See https://github.com/mapbox/mapbox-gl-js/issues/7032\n        const defaultOpacityState = new JointOpacityState(null, 0,\n                textAllowOverlap && (iconAllowOverlap || !bucket.hasIconData() || layout.get('icon-optional')),\n                iconAllowOverlap && (textAllowOverlap || !bucket.hasTextData() || layout.get('text-optional')),\n                true);\n\n        if (!bucket.collisionArrays && collisionBoxArray && ((bucket.hasIconCollisionBoxData() || bucket.hasTextCollisionBoxData()))) {\n            bucket.deserializeCollisionBoxes(collisionBoxArray);\n        }\n\n        const addOpacities = (iconOrText: SymbolBuffers, numVertices: number, opacity: number) => {\n            for (let i = 0; i < numVertices / 4; i++) {\n                iconOrText.opacityVertexArray.emplaceBack(opacity);\n            }\n        };\n\n        let visibleInstanceCount = 0;\n\n        for (let s = 0; s < bucket.symbolInstances.length; s++) {\n            const symbolInstance = bucket.symbolInstances.get(s);\n            const {\n                numHorizontalGlyphVertices,\n                numVerticalGlyphVertices,\n                crossTileID,\n                numIconVertices\n            } = symbolInstance;\n\n            const isDuplicate = seenCrossTileIDs.has(crossTileID);\n\n            let opacityState = this.opacities[crossTileID];\n            if (isDuplicate) {\n                opacityState = duplicateOpacityState;\n            } else if (!opacityState) {\n                opacityState = defaultOpacityState;\n                // store the state so that future placements use it as a starting point\n                this.opacities[crossTileID] = opacityState;\n            }\n\n            seenCrossTileIDs.add(crossTileID);\n\n            const hasText = numHorizontalGlyphVertices > 0 || numVerticalGlyphVertices > 0;\n            const hasIcon = numIconVertices > 0;\n\n            const placedOrientation = this.placedOrientations[crossTileID];\n            const horizontalHidden = placedOrientation === WritingMode.vertical;\n            const verticalHidden = placedOrientation === WritingMode.horizontal || placedOrientation === WritingMode.horizontalOnly;\n            if ((hasText || hasIcon) && !opacityState.isHidden()) visibleInstanceCount++;\n\n            if (hasText) {\n                const packedOpacity = packOpacity(opacityState.text);\n                // Vertical text fades in/out on collision the same way as corresponding\n                // horizontal text. Switch between vertical/horizontal should be instantaneous\n                const horizontalOpacity = horizontalHidden ? PACKED_HIDDEN_OPACITY : packedOpacity;\n                addOpacities(bucket.text, numHorizontalGlyphVertices, horizontalOpacity);\n                const verticalOpacity = verticalHidden ? PACKED_HIDDEN_OPACITY : packedOpacity;\n                addOpacities(bucket.text, numVerticalGlyphVertices, verticalOpacity);\n\n                // If this label is completely faded, mark it so that we don't have to calculate\n                // its position at render time. If this layer has variable placement, shift the various\n                // symbol instances appropriately so that symbols from buckets that have yet to be placed\n                // offset appropriately.\n                const symbolHidden = opacityState.text.isHidden();\n                const {\n                    leftJustifiedTextSymbolIndex: left, centerJustifiedTextSymbolIndex: center,\n                    rightJustifiedTextSymbolIndex: right, verticalPlacedTextSymbolIndex: vertical\n                } = symbolInstance;\n                const array = bucket.text.placedSymbolArray;\n                const horizontalHiddenValue = symbolHidden || horizontalHidden ? 1 : 0;\n\n                if (left >= 0) array.get(left).hidden = horizontalHiddenValue;\n                if (center >= 0) array.get(center).hidden = horizontalHiddenValue;\n                if (right >= 0) array.get(right).hidden = horizontalHiddenValue;\n                if (vertical >= 0) array.get(vertical).hidden = symbolHidden || verticalHidden ? 1 : 0;\n\n                const prevOffset = this.variableOffsets[crossTileID];\n                if (prevOffset) {\n                    this.markUsedJustification(bucket, prevOffset.anchor, symbolInstance, placedOrientation);\n                }\n\n                const prevOrientation = this.placedOrientations[crossTileID];\n                if (prevOrientation) {\n                    this.markUsedJustification(bucket, 'left', symbolInstance, prevOrientation);\n                    this.markUsedOrientation(bucket, prevOrientation, symbolInstance);\n                }\n            }\n\n            if (hasIcon) {\n                const packedOpacity = packOpacity(opacityState.icon);\n                const {placedIconSymbolIndex, verticalPlacedIconSymbolIndex} = symbolInstance;\n                const array = bucket.icon.placedSymbolArray;\n                const iconHidden = opacityState.icon.isHidden() ? 1 : 0;\n\n                if (placedIconSymbolIndex >= 0) {\n                    const horizontalOpacity = !horizontalHidden ? packedOpacity : PACKED_HIDDEN_OPACITY;\n                    addOpacities(bucket.icon, numIconVertices, horizontalOpacity);\n                    array.get(placedIconSymbolIndex).hidden = iconHidden;\n                }\n\n                if (verticalPlacedIconSymbolIndex >= 0) {\n                    const verticalOpacity = !verticalHidden ? packedOpacity : PACKED_HIDDEN_OPACITY;\n                    addOpacities(bucket.icon, symbolInstance.numVerticalIconVertices, verticalOpacity);\n                    array.get(verticalPlacedIconSymbolIndex).hidden = iconHidden;\n                }\n            }\n\n            if (bucket.hasIconCollisionBoxData() || bucket.hasTextCollisionBoxData()) {\n                const collisionArrays = bucket.collisionArrays[s];\n                if (collisionArrays) {\n                    let shift = new Point(0, 0);\n                    let used = true;\n                    if (collisionArrays.textBox || collisionArrays.verticalTextBox) {\n                        if (variablePlacement) {\n                            const variableOffset = this.variableOffsets[crossTileID];\n                            if (variableOffset) {\n                                // This will show either the currently placed position or the last\n                                // successfully placed position (so you can visualize what collision\n                                // just made the symbol disappear, and the most likely place for the\n                                // symbol to come back)\n                                shift = calculateVariableLayoutShift(variableOffset.anchor,\n                                   variableOffset.width,\n                                   variableOffset.height,\n                                   variableOffset.textOffset,\n                                   variableOffset.textScale);\n                                if (rotateWithMap) {\n                                    shift._rotate(pitchWithMap ? this.transform.angle : -this.transform.angle);\n                                }\n                            } else {\n                                // No offset -> this symbol hasn't been placed since coming on-screen\n                                // No single box is particularly meaningful and all of them would be too noisy\n                                // Use the center box just to show something's there, but mark it \"not used\"\n                                used = false;\n                            }\n                        }\n\n                        if (hasClipping) {\n                            used = !opacityState.clipped;\n                        }\n\n                        if (collisionArrays.textBox) {\n                            updateCollisionVertices(bucket.textCollisionBox.collisionVertexArray, opacityState.text.placed, !used || horizontalHidden, shift.x, shift.y);\n                        }\n                        if (collisionArrays.verticalTextBox) {\n                            updateCollisionVertices(bucket.textCollisionBox.collisionVertexArray, opacityState.text.placed, !used || verticalHidden, shift.x, shift.y);\n                        }\n                    }\n\n                    const verticalIconUsed = used && Boolean(!verticalHidden && collisionArrays.verticalIconBox);\n\n                    if (collisionArrays.iconBox) {\n                        updateCollisionVertices(bucket.iconCollisionBox.collisionVertexArray, opacityState.icon.placed, verticalIconUsed,\n                            symbolInstance.hasIconTextFit ? shift.x : 0,\n                            symbolInstance.hasIconTextFit ? shift.y : 0);\n                    }\n\n                    if (collisionArrays.verticalIconBox) {\n                        updateCollisionVertices(bucket.iconCollisionBox.collisionVertexArray, opacityState.icon.placed, !verticalIconUsed,\n                            symbolInstance.hasIconTextFit ? shift.x : 0,\n                            symbolInstance.hasIconTextFit ? shift.y : 0);\n                    }\n                }\n            }\n        }\n        bucket.fullyClipped = visibleInstanceCount === 0;\n        bucket.sortFeatures(this.transform.angle);\n        if (this.retainedQueryData[bucket.bucketInstanceId]) {\n            this.retainedQueryData[bucket.bucketInstanceId].featureSortOrder = bucket.featureSortOrder;\n        }\n\n        if (bucket.hasTextData() && bucket.text.opacityVertexBuffer) {\n            bucket.text.opacityVertexBuffer.updateData(bucket.text.opacityVertexArray);\n        }\n        if (bucket.hasIconData() && bucket.icon.opacityVertexBuffer) {\n            bucket.icon.opacityVertexBuffer.updateData(bucket.icon.opacityVertexArray);\n        }\n        if (bucket.hasIconCollisionBoxData() && bucket.iconCollisionBox.collisionVertexBuffer) {\n            bucket.iconCollisionBox.collisionVertexBuffer.updateData(bucket.iconCollisionBox.collisionVertexArray);\n        }\n        if (bucket.hasTextCollisionBoxData() && bucket.textCollisionBox.collisionVertexBuffer) {\n            bucket.textCollisionBox.collisionVertexBuffer.updateData(bucket.textCollisionBox.collisionVertexArray);\n        }\n\n        assert(bucket.text.opacityVertexArray.length === bucket.text.layoutVertexArray.length / 4);\n        assert(bucket.icon.opacityVertexArray.length === bucket.icon.layoutVertexArray.length / 4);\n\n        // Push generated collision circles to the bucket for debug rendering\n        if (bucket.bucketInstanceId in this.collisionCircleArrays) {\n            const instance = this.collisionCircleArrays[bucket.bucketInstanceId];\n\n            bucket.placementInvProjMatrix = instance.invProjMatrix;\n            bucket.placementViewportMatrix = instance.viewportMatrix;\n            bucket.collisionCircleArray = instance.circles;\n\n            delete this.collisionCircleArrays[bucket.bucketInstanceId];\n        }\n    }\n\n    symbolFadeChange(now: number): number {\n        return this.fadeDuration === 0 ?\n            1 :\n            ((now - this.commitTime) / this.fadeDuration + this.prevZoomAdjustment);\n    }\n\n    zoomAdjustment(zoom: number): number {\n        // When zooming out quickly, labels can overlap each other. This\n        // adjustment is used to reduce the interval between placement calculations\n        // and to reduce the fade duration when zooming out quickly. Discovering the\n        // collisions more quickly and fading them more quickly reduces the unwanted effect.\n        return Math.max(0, (this.transform.zoom - zoom) / 1.5);\n    }\n\n    hasTransitions(now: number): boolean {\n        return this.stale ||\n            now - this.lastPlacementChangeTime < this.fadeDuration;\n    }\n\n    stillRecent(now: number, zoom: number): boolean {\n        // The adjustment makes placement more frequent when zooming.\n        // This condition applies the adjustment only after the map has\n        // stopped zooming. This avoids adding extra jank while zooming.\n        const durationAdjustment = this.zoomAtLastRecencyCheck === zoom ?\n            (1 - this.zoomAdjustment(zoom)) :\n            1;\n        this.zoomAtLastRecencyCheck = zoom;\n\n        return this.commitTime + this.fadeDuration * durationAdjustment > now;\n    }\n\n    setStale() {\n        this.stale = true;\n    }\n}\n\nfunction updateCollisionVertices(collisionVertexArray: CollisionVertexArray, placed: boolean, notUsed: boolean | number, shiftX?: number, shiftY?: number) {\n    collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0);\n    collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0);\n    collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0);\n    collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0);\n}\n\n// All four vertices for a glyph will have the same opacity state\n// So we pack the opacity into a uint8, and then repeat it four times\n// to make a single uint32 that we can upload for each glyph in the\n// label.\nconst shift25 = Math.pow(2, 25);\nconst shift24 = Math.pow(2, 24);\nconst shift17 = Math.pow(2, 17);\nconst shift16 = Math.pow(2, 16);\nconst shift9 = Math.pow(2, 9);\nconst shift8 = Math.pow(2, 8);\nconst shift1 = Math.pow(2, 1);\nfunction packOpacity(opacityState: OpacityState): number {\n    if (opacityState.opacity === 0 && !opacityState.placed) {\n        return 0;\n    } else if (opacityState.opacity === 1 && opacityState.placed) {\n        return 4294967295;\n    }\n    const targetBit = opacityState.placed ? 1 : 0;\n    const opacityBits = Math.floor(opacityState.opacity * 127);\n    return opacityBits * shift25 + targetBit * shift24 +\n        opacityBits * shift17 + targetBit * shift16 +\n        opacityBits * shift9 + targetBit * shift8 +\n        opacityBits * shift1 + targetBit;\n}\n\nconst PACKED_HIDDEN_OPACITY = 0;\n","// @flow\n\nimport browser from '../util/browser.js';\n\nimport {Placement} from '../symbol/placement.js';\nimport {PerformanceUtils} from '../util/performance.js';\nimport {makeFQID} from '../util/fqid.js';\n\nimport type Transform from '../geo/transform.js';\nimport type StyleLayer from './style_layer.js';\nimport type SymbolStyleLayer from './style_layer/symbol_style_layer.js';\nimport type Tile from '../source/tile.js';\nimport type {BucketPart} from '../symbol/placement.js';\nimport type {FogState} from './fog_helpers.js';\nimport BuildingIndex from '../source/building_index.js';\n\nclass LayerPlacement {\n    _sortAcrossTiles: boolean;\n    _currentTileIndex: number;\n    _currentPartIndex: number;\n    _seenCrossTileIDs: Set<number>;\n    _bucketParts: Array<BucketPart>;\n\n    constructor(styleLayer: SymbolStyleLayer) {\n        this._sortAcrossTiles = styleLayer.layout.get('symbol-z-order') !== 'viewport-y' &&\n            styleLayer.layout.get('symbol-sort-key').constantOr(1) !== undefined;\n\n        this._currentTileIndex = 0;\n        this._currentPartIndex = 0;\n        this._seenCrossTileIDs = new Set();\n        this._bucketParts = [];\n    }\n\n    continuePlacement(tiles: Array<Tile>, placement: Placement, showCollisionBoxes: boolean, styleLayer: StyleLayer, shouldPausePlacement: () => boolean): boolean {\n        const bucketParts = this._bucketParts;\n\n        while (this._currentTileIndex < tiles.length) {\n            const tile = tiles[this._currentTileIndex];\n            placement.getBucketParts(bucketParts, styleLayer, tile, this._sortAcrossTiles);\n\n            this._currentTileIndex++;\n            if (shouldPausePlacement()) {\n                return true;\n            }\n        }\n\n        if (this._sortAcrossTiles) {\n            this._sortAcrossTiles = false;\n            bucketParts.sort((a, b) => ((a.sortKey: any): number) - ((b.sortKey: any): number));\n        }\n\n        while (this._currentPartIndex < bucketParts.length) {\n            const bucketPart = bucketParts[this._currentPartIndex];\n            placement.placeLayerBucketPart(bucketPart, this._seenCrossTileIDs, showCollisionBoxes, bucketPart.symbolInstanceStart === 0);\n            this._currentPartIndex++;\n            if (shouldPausePlacement()) {\n                return true;\n            }\n        }\n        return false;\n    }\n}\n\nclass PauseablePlacement {\n    placement: Placement;\n    _done: boolean;\n    _currentPlacementIndex: number;\n    _forceFullPlacement: boolean;\n    _showCollisionBoxes: boolean;\n    _inProgressLayer: ?LayerPlacement;\n\n    constructor(transform: Transform, order: Array<string>,\n                forceFullPlacement: boolean,\n                showCollisionBoxes: boolean,\n                fadeDuration: number,\n                crossSourceCollisions: boolean,\n                prevPlacement?: Placement,\n                fogState: ?FogState,\n                buildingIndex: ?BuildingIndex\n    ) {\n        this.placement = new Placement(transform, fadeDuration, crossSourceCollisions, prevPlacement, fogState, buildingIndex);\n        this._currentPlacementIndex = order.length - 1;\n        this._forceFullPlacement = forceFullPlacement;\n        this._showCollisionBoxes = showCollisionBoxes;\n        this._done = false;\n    }\n\n    isDone(): boolean {\n        return this._done;\n    }\n\n    continuePlacement(order: Array<string>, layers: {[_: string]: StyleLayer}, layerTiles: {[_: string]: Array<Tile>}, layerTilesInYOrder: {[_: string]: Array<Tile>}) {\n        const startTime = browser.now();\n\n        const shouldPausePlacement = () => {\n            const elapsedTime = browser.now() - startTime;\n            return this._forceFullPlacement ? false : elapsedTime > 2;\n        };\n\n        while (this._currentPlacementIndex >= 0) {\n            const layerId = order[this._currentPlacementIndex];\n            const layer = layers[layerId];\n            const placementZoom = this.placement.collisionIndex.transform.zoom;\n            if (layer.type === 'symbol' &&\n                (!layer.minzoom || layer.minzoom <= placementZoom) &&\n                (!layer.maxzoom || layer.maxzoom > placementZoom)) {\n\n                const symbolLayer = ((layer: any): SymbolStyleLayer);\n                const zOffset = symbolLayer.layout.get('symbol-z-elevate');\n                const inProgressLayer = this._inProgressLayer = this._inProgressLayer || new LayerPlacement(symbolLayer);\n\n                const sourceId = makeFQID(layer.source, layer.scope);\n                const pausePlacement = inProgressLayer.continuePlacement(zOffset ? layerTilesInYOrder[sourceId] : layerTiles[sourceId], this.placement, this._showCollisionBoxes, layer, shouldPausePlacement);\n\n                if (pausePlacement) {\n                    PerformanceUtils.recordPlacementTime(browser.now() - startTime);\n                    // We didn't finish placing all layers within 2ms,\n                    // but we can keep rendering with a partial placement\n                    // We'll resume here on the next frame\n                    return;\n                }\n\n                delete this._inProgressLayer;\n            }\n\n            this._currentPlacementIndex--;\n        }\n        PerformanceUtils.recordPlacementTime(browser.now() - startTime);\n        this._done = true;\n    }\n\n    commit(now: number): Placement {\n        this.placement.commit(now);\n        return this.placement;\n    }\n}\n\nexport default PauseablePlacement;\n","// @flow\n\nimport EXTENT from '../style-spec/data/extent.js';\n\nimport {SymbolInstanceArray} from '../data/array_types.js';\nimport KDBush from 'kdbush';\n\nimport type Projection from '../geo/projection/projection.js';\nimport type {OverscaledTileID} from '../source/tile_id.js';\nimport type SymbolBucket from '../data/bucket/symbol_bucket.js';\nimport type StyleLayer from '../style/style_layer.js';\nimport type Tile from '../source/tile.js';\n\n/*\n    The CrossTileSymbolIndex generally works on the assumption that\n    a conceptual \"unique symbol\" can be identified by the text of\n    the label combined with the anchor point. The goal is to assign\n    these conceptual \"unique symbols\" a shared crossTileID that can be\n    used by Placement to keep fading opacity states consistent and to\n    deduplicate labels.\n\n    The CrossTileSymbolIndex indexes all the current symbol instances and\n    their crossTileIDs. When a symbol bucket gets added or updated, the\n    index assigns a crossTileID to each of it's symbol instances by either\n    matching it with an existing id or assigning a new one.\n*/\n\n// Round anchor positions to roughly 4 pixel grid\nconst roundingFactor = 512 / EXTENT / 2;\n\nclass TileLayerIndex {\n    tileID: OverscaledTileID;\n    bucketInstanceId: number;\n    index: KDBush;\n    keys: Array<number>;\n    crossTileIDs: Array<number>;\n\n    constructor(tileID: OverscaledTileID, symbolInstances: SymbolInstanceArray, bucketInstanceId: number) {\n        this.tileID = tileID;\n        this.bucketInstanceId = bucketInstanceId;\n\n        // create a spatial index for deduplicating symbol instances;\n        // use a low nodeSize because we're optimizing for search performance, not indexing\n        this.index = new KDBush(symbolInstances.length, 16, Int32Array);\n        this.keys = [];\n        this.crossTileIDs = [];\n        const tx = tileID.canonical.x * EXTENT;\n        const ty = tileID.canonical.y * EXTENT;\n\n        for (let i = 0; i < symbolInstances.length; i++) {\n            const {key, crossTileID, tileAnchorX, tileAnchorY} = symbolInstances.get(i);\n\n            // Converts the coordinates of the input symbol instance into coordinates that be can compared\n            // against other symbols in this index. Coordinates are:\n            // (1) world-based (so after conversion the source tile is irrelevant)\n            // (2) converted to the z-scale of this TileLayerIndex\n            // (3) down-sampled by \"roundingFactor\" from tile coordinate precision in order to be\n            //     more tolerant of small differences between tiles.\n            const x = Math.floor((tx + tileAnchorX) * roundingFactor);\n            const y = Math.floor((ty + tileAnchorY) * roundingFactor);\n\n            this.index.add(x, y);\n            this.keys.push(key);\n            this.crossTileIDs.push(crossTileID);\n        }\n        this.index.finish();\n    }\n\n    findMatches(symbolInstances: SymbolInstanceArray, newTileID: OverscaledTileID, zoomCrossTileIDs: Set<number>) {\n        const tolerance = this.tileID.canonical.z < newTileID.canonical.z ? 1 : Math.pow(2, this.tileID.canonical.z - newTileID.canonical.z);\n        const scale = roundingFactor / Math.pow(2, newTileID.canonical.z - this.tileID.canonical.z);\n        const tx = newTileID.canonical.x * EXTENT;\n        const ty = newTileID.canonical.y * EXTENT;\n\n        for (let i = 0; i < symbolInstances.length; i++) {\n            const symbolInstance = symbolInstances.get(i);\n            if (symbolInstance.crossTileID) {\n                // already has a match, skip\n                continue;\n            }\n            const {key, tileAnchorX, tileAnchorY} = symbolInstance;\n            const x = Math.floor((tx + tileAnchorX) * scale);\n            const y = Math.floor((ty + tileAnchorY) * scale);\n\n            // Return any symbol with the same keys whose coordinates are within 1\n            // grid unit. (with a 4px grid, this covers a 12px by 12px area)\n            const matchedIds = this.index.range(x - tolerance, y - tolerance, x + tolerance, y + tolerance);\n            for (const id of matchedIds) {\n                const crossTileID = this.crossTileIDs[id];\n                if (this.keys[id] === key && !zoomCrossTileIDs.has(crossTileID)) {\n                    // Once we've marked ourselves duplicate against this parent symbol,\n                    // don't let any other symbols at the same zoom level duplicate against\n                    // the same parent (see issue #5993)\n                    zoomCrossTileIDs.add(crossTileID);\n                    symbolInstance.crossTileID = crossTileID;\n                    break;\n                }\n            }\n        }\n    }\n}\n\nclass CrossTileIDs {\n    maxCrossTileID: number;\n    constructor() {\n        this.maxCrossTileID = 0;\n    }\n    generate(): number {\n        return ++this.maxCrossTileID;\n    }\n}\n\nclass CrossTileSymbolLayerIndex {\n    indexes: {[zoom: string | number]: {[tileId: string | number]: TileLayerIndex}};\n    usedCrossTileIDs: {[zoom: string | number]: Set<number>};\n    lng: number;\n\n    constructor() {\n        this.indexes = {};\n        this.usedCrossTileIDs = {};\n        this.lng = 0;\n    }\n\n    /*\n     * Sometimes when a user pans across the antimeridian the longitude value gets wrapped.\n     * To prevent labels from flashing out and in we adjust the tileID values in the indexes\n     * so that they match the new wrapped version of the map.\n     */\n    handleWrapJump(lng: number) {\n        const wrapDelta = Math.round((lng - this.lng) / 360);\n        if (wrapDelta !== 0) {\n            for (const zoom in this.indexes) {\n                const zoomIndexes = this.indexes[zoom];\n                const newZoomIndex = {};\n                for (const key in zoomIndexes) {\n                    // change the tileID's wrap and add it to a new index\n                    const index = zoomIndexes[key];\n                    index.tileID = index.tileID.unwrapTo(index.tileID.wrap + wrapDelta);\n                    newZoomIndex[index.tileID.key] = index;\n                }\n                this.indexes[zoom] = newZoomIndex;\n            }\n        }\n        this.lng = lng;\n    }\n\n    addBucket(tileID: OverscaledTileID, bucket: SymbolBucket, crossTileIDs: CrossTileIDs): boolean {\n        if (this.indexes[tileID.overscaledZ] &&\n            this.indexes[tileID.overscaledZ][tileID.key]) {\n\n            if (this.indexes[tileID.overscaledZ][tileID.key].bucketInstanceId ===\n                bucket.bucketInstanceId) {\n                return false;\n            } else {\n                // We're replacing this bucket with an updated version\n                // Remove the old bucket's \"used crossTileIDs\" now so that\n                // the new bucket can claim them.\n                // The old index entries themselves stick around until\n                // 'removeStaleBuckets' is called.\n                this.removeBucketCrossTileIDs(tileID.overscaledZ,\n                    this.indexes[tileID.overscaledZ][tileID.key]);\n            }\n        }\n\n        for (let i = 0; i < bucket.symbolInstances.length; i++) {\n            const symbolInstance = bucket.symbolInstances.get(i);\n            symbolInstance.crossTileID = 0;\n        }\n\n        if (!this.usedCrossTileIDs[tileID.overscaledZ]) {\n            this.usedCrossTileIDs[tileID.overscaledZ] = new Set();\n        }\n        const zoomCrossTileIDs = this.usedCrossTileIDs[tileID.overscaledZ];\n\n        for (const zoom in this.indexes) {\n            const zoomIndexes = this.indexes[zoom];\n            if (Number(zoom) > tileID.overscaledZ) {\n                for (const id in zoomIndexes) {\n                    const childIndex = zoomIndexes[id];\n                    if (childIndex.tileID.isChildOf(tileID)) {\n                        childIndex.findMatches(bucket.symbolInstances, tileID, zoomCrossTileIDs);\n                    }\n                }\n            } else {\n                const parentCoord = tileID.scaledTo(Number(zoom));\n                const parentIndex = zoomIndexes[parentCoord.key];\n                if (parentIndex) {\n                    parentIndex.findMatches(bucket.symbolInstances, tileID, zoomCrossTileIDs);\n                }\n            }\n        }\n\n        for (let i = 0; i < bucket.symbolInstances.length; i++) {\n            const symbolInstance = bucket.symbolInstances.get(i);\n            if (!symbolInstance.crossTileID) {\n                // symbol did not match any known symbol, assign a new id\n                symbolInstance.crossTileID = crossTileIDs.generate();\n                zoomCrossTileIDs.add(symbolInstance.crossTileID);\n            }\n        }\n\n        if (this.indexes[tileID.overscaledZ] === undefined) {\n            this.indexes[tileID.overscaledZ] = {};\n        }\n        this.indexes[tileID.overscaledZ][tileID.key] = new TileLayerIndex(tileID, bucket.symbolInstances, bucket.bucketInstanceId);\n\n        return true;\n    }\n\n    removeBucketCrossTileIDs(zoom: string | number, removedBucket: TileLayerIndex) {\n        for (const crossTileID of removedBucket.crossTileIDs) {\n            this.usedCrossTileIDs[zoom].delete(crossTileID);\n        }\n    }\n\n    removeStaleBuckets(currentIDs: { [string | number]: boolean }): boolean {\n        let tilesChanged = false;\n        for (const z in this.indexes) {\n            const zoomIndexes = this.indexes[z];\n            for (const tileKey in zoomIndexes) {\n                if (!currentIDs[zoomIndexes[tileKey].bucketInstanceId]) {\n                    this.removeBucketCrossTileIDs(z, zoomIndexes[tileKey]);\n                    delete zoomIndexes[tileKey];\n                    tilesChanged = true;\n                }\n            }\n        }\n        return tilesChanged;\n    }\n}\n\nclass CrossTileSymbolIndex {\n    layerIndexes: {[fqid: string]: CrossTileSymbolLayerIndex};\n    crossTileIDs: CrossTileIDs;\n    maxBucketInstanceId: number;\n    bucketsInCurrentPlacement: {[_: number]: boolean};\n\n    constructor() {\n        this.layerIndexes = {};\n        this.crossTileIDs = new CrossTileIDs();\n        this.maxBucketInstanceId = 0;\n        this.bucketsInCurrentPlacement = {};\n    }\n\n    addLayer(styleLayer: StyleLayer, tiles: Array<Tile>, lng: number, projection: Projection): boolean {\n        let layerIndex = this.layerIndexes[styleLayer.fqid];\n        if (layerIndex === undefined) {\n            layerIndex = this.layerIndexes[styleLayer.fqid] = new CrossTileSymbolLayerIndex();\n        }\n\n        let symbolBucketsChanged = false;\n        const currentBucketIDs = {};\n\n        if (projection.name !== 'globe') {\n            layerIndex.handleWrapJump(lng);\n        }\n\n        for (const tile of tiles) {\n            const symbolBucket = ((tile.getBucket(styleLayer): any): SymbolBucket);\n            if (!symbolBucket || styleLayer.fqid !== symbolBucket.layerIds[0])\n                continue;\n\n            if (!symbolBucket.bucketInstanceId) {\n                symbolBucket.bucketInstanceId = ++this.maxBucketInstanceId;\n            }\n\n            if (layerIndex.addBucket(tile.tileID, symbolBucket, this.crossTileIDs)) {\n                symbolBucketsChanged = true;\n            }\n            currentBucketIDs[symbolBucket.bucketInstanceId] = true;\n        }\n\n        if (layerIndex.removeStaleBuckets(currentBucketIDs)) {\n            symbolBucketsChanged = true;\n        }\n\n        return symbolBucketsChanged;\n    }\n\n    pruneUnusedLayers(usedLayers: Array<string>) {\n        const usedLayerMap = {};\n        usedLayers.forEach((usedLayer) => {\n            usedLayerMap[usedLayer] = true;\n        });\n        for (const layerId in this.layerIndexes) {\n            if (!usedLayerMap[layerId]) {\n                delete this.layerIndexes[layerId];\n            }\n        }\n    }\n}\n\nexport default CrossTileSymbolIndex;\n","// @flow\nimport {number} from \"../style-spec/util/interpolate.js\";\nimport Point  from \"@mapbox/point-geometry\";\nimport {clamp} from \"../util/util.js\";\n\n/**\n * @private\n * An `EdgeInset` object represents screen space padding applied to the edges of the viewport.\n * This shifts the apparent center or the vanishing point of the map. This is useful for adding floating UI elements\n * on top of the map and having the vanishing point shift as UI elements resize.\n *\n * @param {number} [top=0]\n * @param {number} [bottom=0]\n * @param {number} [left=0]\n * @param {number} [right=0]\n */\nclass EdgeInsets {\n    top: number;\n    bottom: number;\n    left: number;\n    right: number;\n\n    constructor(top: number = 0, bottom: number = 0, left: number = 0, right: number = 0) {\n        if (isNaN(top) || top < 0 ||\n            isNaN(bottom) || bottom < 0 ||\n            isNaN(left) || left < 0 ||\n            isNaN(right) || right < 0\n        ) {\n            throw new Error('Invalid value for edge-insets, top, bottom, left and right must all be numbers');\n        }\n\n        this.top = top;\n        this.bottom = bottom;\n        this.left = left;\n        this.right = right;\n    }\n\n    /**\n     * Interpolates the inset in-place.\n     * This maintains the current inset value for any inset not present in `target`.\n     *\n     * @private\n     * @param {PaddingOptions | EdgeInsets} start The initial padding options.\n     * @param {PaddingOptions} target The target padding options.\n     * @param {number} t The interpolation variable.\n     * @returns {EdgeInsets} The interpolated edge insets.\n     * @memberof EdgeInsets\n     */\n    interpolate(start: PaddingOptions | EdgeInsets, target: PaddingOptions, t: number): EdgeInsets {\n        if (target.top != null && start.top != null) this.top = number(start.top, target.top, t);\n        if (target.bottom != null && start.bottom != null) this.bottom = number(start.bottom, target.bottom, t);\n        if (target.left != null && start.left != null) this.left = number(start.left, target.left, t);\n        if (target.right != null && start.right != null) this.right = number(start.right, target.right, t);\n\n        return this;\n    }\n\n    /**\n     * Utility method that computes the new apprent center or vanishing point after applying insets.\n     * This is in pixels and with the top left being (0.0) and +y being downwards.\n     *\n     * @private\n     * @param {number} width The width of the map in pixels.\n     * @param {number} height The height of the map in pixels.\n     * @returns {Point} The apparent center or vanishing point of the map.\n     * @memberof EdgeInsets\n     */\n    getCenter(width: number, height: number): Point {\n        // Clamp insets so they never overflow width/height and always calculate a valid center\n        const x = clamp((this.left + width - this.right) / 2, 0, width);\n        const y = clamp((this.top + height - this.bottom) / 2, 0, height);\n\n        return new Point(x, y);\n    }\n\n    equals(other: PaddingOptions): boolean {\n        return this.top === other.top &&\n            this.bottom === other.bottom &&\n            this.left === other.left &&\n            this.right === other.right;\n    }\n\n    clone(): EdgeInsets {\n        return new EdgeInsets(this.top, this.bottom, this.left, this.right);\n    }\n\n    /**\n     * Returns the current state as json, useful when you want to have a\n     * read-only representation of the inset.\n     *\n     * @private\n     * @returns {PaddingOptions} The current padding options.\n     * @memberof EdgeInsets\n     */\n    toJSON(): PaddingOptions {\n        return {\n            top: this.top,\n            bottom: this.bottom,\n            left: this.left,\n            right: this.right\n        };\n    }\n}\n\nexport type PaddingOptions = {+top: ?number, +bottom: ?number, +right: ?number, +left: ?number};\n\nexport default EdgeInsets;\n","// @flow\n\nimport MercatorCoordinate, {mercatorZfromAltitude, latFromMercatorY} from '../geo/mercator_coordinate.js';\nimport {degToRad, wrap, getColumn, setColumn} from '../util/util.js';\nimport {vec3, quat, mat4} from 'gl-matrix';\n\nimport type {Elevation} from '../terrain/elevation.js';\nimport type {LngLatLike} from '../geo/lng_lat.js';\nimport type {Mat4, Vec3, Vec4, Quat} from 'gl-matrix';\n\nfunction updateTransformOrientation(matrix: Mat4, orientation: Quat) {\n    // Take temporary copy of position to prevent it from being overwritten\n    const position: Vec4 = getColumn(matrix, 3);\n\n    // Convert quaternion to rotation matrix\n    mat4.fromQuat(matrix, orientation);\n    setColumn(matrix, 3, position);\n}\n\nfunction updateTransformPosition(matrix: Mat4, position: Vec3) {\n    setColumn(matrix, 3, [position[0], position[1], position[2], 1.0]);\n}\n\nfunction orientationFromPitchBearing(pitch: number, bearing: number): Quat {\n    // Both angles are considered to define CW rotation around their respective axes.\n    // Values have to be negated to achieve the proper quaternion in left handed coordinate space\n    const orientation = quat.identity([]);\n    quat.rotateZ(orientation, orientation, -bearing);\n    quat.rotateX(orientation, orientation, -pitch);\n    return orientation;\n}\n\nexport function orientationFromFrame(forward: Vec3, up: Vec3): ?Quat {\n    // Find right-vector of the resulting coordinate frame. Up-vector has to be\n    // sanitized first in order to remove the roll component from the orientation\n    const xyForward = [forward[0], forward[1], 0];\n    const xyUp = [up[0], up[1], 0];\n\n    const epsilon = 1e-15;\n\n    if (vec3.length(xyForward) >= epsilon) {\n        // Roll rotation can be seen as the right vector not being on the xy-plane, ie. right[2] != 0.0.\n        // It can be negated by projecting the up vector on top of the forward vector.\n        const xyDir = vec3.normalize([], xyForward);\n        vec3.scale(xyUp, xyDir, vec3.dot(xyUp, xyDir));\n\n        up[0] = xyUp[0];\n        up[1] = xyUp[1];\n    }\n\n    const right = vec3.cross([], up, forward);\n    if (vec3.len(right) < epsilon) {\n        return null;\n    }\n\n    const bearing = Math.atan2(-right[1], right[0]);\n    const pitch = Math.atan2(Math.sqrt(forward[0] * forward[0] + forward[1] * forward[1]), -forward[2]);\n\n    return orientationFromPitchBearing(pitch, bearing);\n}\n\n/**\n * Options for accessing physical properties of the underlying camera entity.\n * Direct access to these properties allows more flexible and precise controlling of the camera.\n * These options are also fully compatible and interchangeable with CameraOptions. All fields are optional.\n * See {@link Map#setFreeCameraOptions} and {@link Map#getFreeCameraOptions}.\n *\n * @param {MercatorCoordinate} position Position of the camera in slightly modified web mercator coordinates.\n        - The size of 1 unit is the width of the projected world instead of the \"mercator meter\".\n          Coordinate [0, 0, 0] is the north-west corner and [1, 1, 0] is the south-east corner.\n        - Z coordinate is conformal and must respect minimum and maximum zoom values.\n        - Zoom is automatically computed from the altitude (z).\n * @param {quat} orientation Orientation of the camera represented as a unit quaternion [x, y, z, w] in a left-handed coordinate space.\n        Direction of the rotation is clockwise around the respective axis.\n        The default pose of the camera is such that the forward vector is looking up the -Z axis.\n        The up vector is aligned with north orientation of the map:\n          forward: [0, 0, -1]\n          up:      [0, -1, 0]\n          right    [1, 0, 0]\n        Orientation can be set freely but certain constraints still apply:\n         - Orientation must be representable with only pitch and bearing.\n         - Pitch has an upper limit\n * @example\n * const camera = map.getFreeCameraOptions();\n *\n * const position = [138.72649, 35.33974];\n * const altitude = 3000;\n *\n * camera.position = mapboxgl.MercatorCoordinate.fromLngLat(position, altitude);\n * camera.lookAtPoint([138.73036, 35.36197]);\n *\n * map.setFreeCameraOptions(camera);\n * @see [Example: Animate the camera around a point in 3D terrain](https://docs.mapbox.com/mapbox-gl-js/example/free-camera-point/)\n * @see [Example: Animate the camera along a path](https://docs.mapbox.com/mapbox-gl-js/example/free-camera-path/)\n*/\nclass FreeCameraOptions {\n    orientation: ?Quat;\n    _position: ?MercatorCoordinate;\n    _elevation: ?Elevation;\n    _renderWorldCopies: boolean;\n\n    constructor(position: ?MercatorCoordinate, orientation: ?Quat) {\n        this.position = position;\n        this.orientation = orientation;\n    }\n\n    get position(): ?MercatorCoordinate {\n        return this._position;\n    }\n\n    set position(position: ?MercatorCoordinate | Vec3) {\n        if (!position) {\n            this._position = null;\n        } else {\n            const mercatorCoordinate = position instanceof MercatorCoordinate ? position : new MercatorCoordinate(position[0], position[1], position[2]);\n            if (this._renderWorldCopies) {\n                mercatorCoordinate.x = wrap(mercatorCoordinate.x, 0, 1);\n            }\n            this._position = mercatorCoordinate;\n        }\n    }\n\n    /**\n     * Helper function for setting orientation of the camera by defining a focus point\n     * on the map.\n     *\n     * @param {LngLatLike} location Location of the focus point on the map.\n     * @param {vec3?} up Up vector of the camera is necessary in certain scenarios where bearing can't be deduced\n     *      from the viewing direction.\n     * @example\n     * const camera = map.getFreeCameraOptions();\n     *\n     * const position = [138.72649, 35.33974];\n     * const altitude = 3000;\n     *\n     * camera.position = mapboxgl.MercatorCoordinate.fromLngLat(position, altitude);\n     * camera.lookAtPoint([138.73036, 35.36197]);\n     * // Apply camera changes\n     * map.setFreeCameraOptions(camera);\n     */\n    lookAtPoint(location: LngLatLike, up?: Vec3) {\n        this.orientation = null;\n        if (!this.position) {\n            return;\n        }\n\n        const pos: MercatorCoordinate = this.position;\n        const altitude = this._elevation ? this._elevation.getAtPointOrZero(MercatorCoordinate.fromLngLat(location)) : 0;\n        const target = MercatorCoordinate.fromLngLat(location, altitude);\n        const forward = [target.x - pos.x, target.y - pos.y, target.z - pos.z];\n        if (!up)\n            up = [0, 0, 1];\n\n        // flip z-component if the up vector is pointing downwards\n        up[2] = Math.abs(up[2]);\n\n        this.orientation = orientationFromFrame(forward, up);\n    }\n\n    /**\n     * Helper function for setting the orientation of the camera as a pitch and a bearing.\n     *\n     * @param {number} pitch Pitch angle in degrees.\n     * @param {number} bearing Bearing angle in degrees.\n     * @example\n     * const camera = map.getFreeCameraOptions();\n     *\n     * // Update camera pitch and bearing\n     * camera.setPitchBearing(80, 90);\n     * // Apply changes\n     * map.setFreeCameraOptions(camera);\n     */\n    setPitchBearing(pitch: number, bearing: number) {\n        this.orientation = orientationFromPitchBearing(degToRad(pitch), degToRad(-bearing));\n    }\n}\n\n/**\n * While using the free camera API the outcome value of isZooming, isMoving and isRotating\n * is not a result of the free camera API.\n * If the user sets the map.interactive to true, there will be conflicting behaviors while\n * interacting with map via zooming or moving using mouse or/and keyboard which will result\n * in isZooming, isMoving and isRotating to return true while using free camera API. In order\n * to prevent the confilicting behavior please set map.interactive to false which will result\n * in muting the following events: zoom, zoomend, zoomstart, rotate, rotateend, rotatestart,\n * move, moveend, movestart, pitch, pitchend, pitchstart.\n */\n\nclass FreeCamera {\n    _transform: Mat4;\n    _orientation: Quat;\n\n    constructor(position: ?Vec3, orientation: ?Quat) {\n        this._transform = mat4.identity([]);\n        this.orientation = orientation;\n        this.position = position;\n    }\n\n    get mercatorPosition(): MercatorCoordinate {\n        const pos = this.position;\n        return new MercatorCoordinate(pos[0], pos[1], pos[2]);\n    }\n\n    get position(): Vec3 {\n        const col: Vec4 = getColumn(this._transform, 3);\n        return [col[0], col[1], col[2]];\n    }\n\n    set position(value: Vec3 | null | void) {\n        if (value) {\n            updateTransformPosition(this._transform, value);\n        }\n    }\n\n    get orientation(): Quat {\n        return this._orientation;\n    }\n\n    set orientation(value: Quat | null | void) {\n        this._orientation = value || quat.identity([]);\n        if (value) {\n            updateTransformOrientation(this._transform, this._orientation);\n        }\n    }\n\n    getPitchBearing(): {pitch: number, bearing: number} {\n        const f = this.forward();\n        const r = this.right();\n\n        return {\n            bearing: Math.atan2(-r[1], r[0]),\n            pitch: Math.atan2(Math.sqrt(f[0] * f[0] + f[1] * f[1]), -f[2])\n        };\n    }\n\n    setPitchBearing(pitch: number, bearing: number) {\n        this._orientation = orientationFromPitchBearing(pitch, bearing);\n        updateTransformOrientation(this._transform, this._orientation);\n    }\n\n    forward(): Vec3 {\n        const col: Vec4 = getColumn(this._transform, 2);\n        // Forward direction is towards the negative Z-axis\n        return [-col[0], -col[1], -col[2]];\n    }\n\n    up(): Vec3 {\n        const col: Vec4 = getColumn(this._transform, 1);\n        // Up direction has to be flipped to point towards north\n        return [-col[0], -col[1], -col[2]];\n    }\n\n    right(): Vec3 {\n        const col: Vec4 = getColumn(this._transform, 0);\n        return [col[0], col[1], col[2]];\n    }\n\n    getCameraToWorld(worldSize: number, pixelsPerMeter: number): Float64Array {\n        const cameraToWorld = new Float64Array(16);\n        mat4.invert(cameraToWorld, this.getWorldToCamera(worldSize, pixelsPerMeter));\n        return cameraToWorld;\n    }\n\n    getCameraToWorldMercator(): Mat4 {\n        return this._transform;\n    }\n\n    getWorldToCameraPosition(worldSize: number, pixelsPerMeter: number, uniformScale: number): Float64Array {\n        const invPosition = this.position;\n\n        vec3.scale(invPosition, invPosition, -worldSize);\n        const matrix = new Float64Array(16);\n        mat4.fromScaling(matrix, [uniformScale, uniformScale, uniformScale]);\n        mat4.translate(matrix, matrix, invPosition);\n\n        // Adjust scale on z (3rd column 3rd row)\n        matrix[10] *= pixelsPerMeter;\n\n        return matrix;\n    }\n\n    getWorldToCamera(worldSize: number, pixelsPerMeter: number): Float64Array {\n        // transformation chain from world space to camera space:\n        // 1. Height value (z) of renderables is in meters. Scale z coordinate by pixelsPerMeter\n        // 2. Transform from pixel coordinates to camera space with cameraMatrix^-1\n        // 3. flip Y if required\n\n        // worldToCamera: flip * cam^-1 * zScale\n        // cameraToWorld: (flip * cam^-1 * zScale)^-1 => (zScale^-1 * cam * flip^-1)\n        const matrix = new Float64Array(16);\n\n        // Compute inverse of camera matrix and post-multiply negated translation\n        const invOrientation = new Float64Array(4);\n        const invPosition = this.position;\n\n        quat.conjugate(invOrientation, this._orientation);\n        vec3.scale(invPosition, invPosition, -worldSize);\n\n        mat4.fromQuat(matrix, invOrientation);\n\n        mat4.translate(matrix, matrix, invPosition);\n\n        // Pre-multiply y (2nd row)\n        matrix[1] *= -1.0;\n        matrix[5] *= -1.0;\n        matrix[9] *= -1.0;\n        matrix[13] *= -1.0;\n\n        // Post-multiply z (3rd column)\n        matrix[8] *= pixelsPerMeter;\n        matrix[9] *= pixelsPerMeter;\n        matrix[10] *= pixelsPerMeter;\n        matrix[11] *= pixelsPerMeter;\n\n        return matrix;\n    }\n\n    getCameraToClipPerspective(fovy: number, aspectRatio: number, nearZ: number, farZ: number): Float64Array {\n        const matrix = new Float64Array(16);\n        mat4.perspective(matrix, fovy, aspectRatio, nearZ, farZ);\n        return matrix;\n    }\n\n    getCameraToClipOrthographic(left: number, right: number, bottom: number, top: number, nearZ: number, farZ: number): Float64Array {\n        const matrix = new Float64Array(16);\n        mat4.ortho(matrix, left, right, bottom, top, nearZ, farZ);\n        return matrix;\n    }\n\n    // The additional parameter needs to be removed. This was introduced because originally\n    // the value returned by this function was incorrect. Fixing it would break the fog visuals and needs to be\n    // communicated carefully first. Also see transform.cameraWorldSizeForFog.\n    getDistanceToElevation(elevationMeters: number, convert: boolean = false): number {\n        const z0 = elevationMeters === 0 ? 0 : mercatorZfromAltitude(elevationMeters, convert ? latFromMercatorY(this.position[1]) : this.position[1]);\n        const f = this.forward();\n        return (z0 - this.position[2]) / f[2];\n    }\n\n    clone(): FreeCamera {\n        return new FreeCamera([...this.position], [...this.orientation]);\n    }\n}\n\nexport {\n    FreeCamera,\n    FreeCameraOptions\n};\n","// @flow\n\nimport LngLat, {LngLatBounds} from './lng_lat.js';\nimport MercatorCoordinate, {mercatorXfromLng, mercatorYfromLat, mercatorZfromAltitude, latFromMercatorY, MAX_MERCATOR_LATITUDE, circumferenceAtLatitude} from './mercator_coordinate.js';\nimport {getProjection} from './projection/index.js';\nimport {tileAABB} from '../geo/projection/tile_transform.js';\nimport Point from '@mapbox/point-geometry';\nimport {wrap, clamp, pick, radToDeg, degToRad, getAABBPointSquareDist, furthestTileCorner, warnOnce, deepEqual} from '../util/util.js';\nimport {number as interpolate} from '../style-spec/util/interpolate.js';\nimport EXTENT from '../style-spec/data/extent.js';\nimport {vec4, mat4, mat2, vec3, quat} from 'gl-matrix';\nimport {Frustum, FrustumCorners, Ray, Aabb} from '../util/primitives.js';\nimport EdgeInsets from './edge_insets.js';\nimport {FreeCamera, FreeCameraOptions, orientationFromFrame} from '../ui/free_camera.js';\nimport assert from 'assert';\nimport getProjectionAdjustments, {getProjectionAdjustmentInverted, getScaleAdjustment, getProjectionInterpolationT} from './projection/adjustments.js';\nimport {getPixelsToTileUnitsMatrix} from '../source/pixels_to_tile_units.js';\nimport {UnwrappedTileID, OverscaledTileID, CanonicalTileID} from '../source/tile_id.js';\nimport {\n    GLOBE_ZOOM_THRESHOLD_MIN,\n    GLOBE_ZOOM_THRESHOLD_MAX,\n    GLOBE_SCALE_MATCH_LATITUDE\n} from '../geo/projection/globe_constants.js';\nimport {\n    calculateGlobeMatrix,\n    polesInViewport,\n    aabbForTileOnGlobe,\n} from '../geo/projection/globe_util.js';\nimport {projectClamped} from '../symbol/projection.js';\n\nimport type Projection from '../geo/projection/projection.js';\nimport type {Elevation} from '../terrain/elevation.js';\nimport type {PaddingOptions} from './edge_insets.js';\nimport type Tile from '../source/tile.js';\nimport type {ProjectionSpecification} from '../style-spec/types.js';\nimport type {FeatureDistanceData} from '../style-spec/feature_filter/index.js';\nimport type {Mat4, Vec3, Vec4, Quat} from 'gl-matrix';\n\nconst NUM_WORLD_COPIES = 3;\nexport const DEFAULT_MIN_ZOOM = 0;\nexport const DEFAULT_MAX_ZOOM = 25.5;\nexport const MIN_LOD_PITCH = 60.0;\n\ntype RayIntersectionResult = { p0: Vec4, p1: Vec4, t: number};\ntype ElevationReference = \"sea\" | \"ground\";\ntype RootTile = {\n    aabb: Aabb,\n    fullyVisible: boolean,\n    maxZ: number,\n    minZ: number,\n    shouldSplit?: boolean,\n    tileID?: OverscaledTileID,\n    wrap: number,\n    x: number,\n    y: number,\n    zoom: number,\n};\n\nconst OrthographicPitchTranstionValue = 15;\nconst lerp = (x: number, y: number, t: number) => { return (1 - t) * x + t * y; };\nconst easeIn = (x: number) => {\n    return x * x * x * x * x;\n};\nconst lerpMatrix = (out: Float64Array, a: Float64Array, b: Float64Array, value: number) => {\n    for (let i = 0; i < 16; i++) {\n        out[i] = lerp(a[i], b[i], value);\n    }\n\n    return out;\n};\n\n/**\n * A single transform, generally used for a single tile to be\n * scaled, rotated, and zoomed.\n * @private\n */\nclass Transform {\n    tileSize: number;\n    tileZoom: number;\n    maxBounds: ?LngLatBounds;\n\n    // 2^zoom (worldSize = tileSize * scale)\n    scale: number;\n\n    // Map viewport size (not including the pixel ratio)\n    width: number;\n    height: number;\n\n    // Bearing, radians, in [-pi, pi]\n    angle: number;\n\n    // 2D rotation matrix in the horizontal plane, as a function of bearing\n    rotationMatrix: Float32Array;\n\n    // Zoom, modulo 1\n    zoomFraction: number;\n\n    // The scale factor component of the conversion from pixels ([0, w] x [h, 0]) to GL\n    // NDC ([1, -1] x [1, -1]) (note flipped y)\n    pixelsToGLUnits: [number, number];\n\n    // Distance from camera to the center, in screen pixel units, independent of zoom\n    cameraToCenterDistance: number;\n\n    // Projection from mercator coordinates ([0, 0] nw, [1, 1] se) to GL clip coordinates\n    mercatorMatrix: Array<number>;\n\n    // Translate points in mercator coordinates to be centered about the camera, with units chosen\n    // for screen-height-independent scaling of fog. Not affected by orientation of camera.\n    mercatorFogMatrix: Float32Array;\n\n    // Projection from world coordinates (mercator scaled by worldSize) to clip coordinates\n    projMatrix: Array<number> | Float32Array | Float64Array;\n    invProjMatrix: Float64Array;\n\n    // Projection matrix with expanded farZ on globe projection\n    expandedFarZProjMatrix: Array<number> | Float32Array | Float64Array;\n\n    // Same as projMatrix, pixel-aligned to avoid fractional pixels for raster tiles\n    alignedProjMatrix: Float64Array;\n\n    // From world coordinates to screen pixel coordinates (projMatrix premultiplied by labelPlaneMatrix)\n    pixelMatrix: Float64Array;\n    pixelMatrixInverse: Float64Array;\n\n    worldToFogMatrix: Float64Array;\n    skyboxMatrix: Float32Array;\n\n    starsProjMatrix: Float32Array;\n\n    // Transform from screen coordinates to GL NDC, [0, w] x [h, 0] --> [-1, 1] x [-1, 1]\n    // Roughly speaking, applies pixelsToGLUnits scaling with a translation\n    glCoordMatrix: Float32Array;\n\n    // Inverse of glCoordMatrix, from NDC to screen coordinates, [-1, 1] x [-1, 1] --> [0, w] x [h, 0]\n    labelPlaneMatrix: Float32Array;\n\n    // globe coordinate transformation matrix\n    globeMatrix: Float64Array;\n\n    globeCenterInViewSpace: [number, number, number];\n    globeRadius: number;\n\n    inverseAdjustmentMatrix: Array<number>;\n\n    mercatorFromTransition: boolean;\n\n    minLng: number;\n    maxLng: number;\n    minLat: number;\n    maxLat: number;\n    worldMinX: number;\n    worldMaxX: number;\n    worldMinY: number;\n    worldMaxY: number;\n\n    cameraFrustum: Frustum;\n    frustumCorners: FrustumCorners;\n    _tileCoverLift: number;\n\n    freezeTileCoverage: boolean;\n    cameraElevationReference: ElevationReference;\n    fogCullDistSq: ?number;\n    _averageElevation: number;\n    projectionOptions: ProjectionSpecification;\n    projection: Projection;\n    _elevation: ?Elevation;\n    _fov: number;\n    _pitch: number;\n    _zoom: number;\n    _seaLevelZoom: ?number;\n    _unmodified: boolean;\n    _renderWorldCopies: boolean;\n    _minZoom: number;\n    _maxZoom: number;\n    _minPitch: number;\n    _maxPitch: number;\n    _center: LngLat;\n    _edgeInsets: EdgeInsets;\n    _constraining: boolean;\n    _projMatrixCache: {[_: number]: Float32Array};\n    _alignedProjMatrixCache: {[_: number]: Float32Array};\n    _pixelsToTileUnitsCache: {[_: number]: Float32Array};\n    _expandedProjMatrixCache: {[_: number]: Float32Array};\n    _fogTileMatrixCache: {[_: number]: Float32Array};\n    _distanceTileDataCache: {[_: number]: FeatureDistanceData};\n    _camera: FreeCamera;\n    _centerAltitude: number;\n    _centerAltitudeValidForExaggeration: ?number;\n    _horizonShift: number;\n    _pixelsPerMercatorPixel: number;\n    _nearZ: number;\n    _farZ: number;\n    _mercatorScaleRatio: number;\n    _isCameraConstrained: boolean;\n\n    _orthographicProjectionAtLowPitch: boolean;\n\n    constructor(minZoom: ?number, maxZoom: ?number, minPitch: ?number, maxPitch: ?number, renderWorldCopies: boolean | void, projection?: ?ProjectionSpecification, bounds: ?LngLatBounds) {\n        this.tileSize = 512; // constant\n\n        this._renderWorldCopies = renderWorldCopies === undefined ? true : renderWorldCopies;\n        this._minZoom = minZoom || DEFAULT_MIN_ZOOM;\n        this._maxZoom = maxZoom || 22;\n\n        this._minPitch = (minPitch === undefined || minPitch === null) ? 0 : minPitch;\n        this._maxPitch = (maxPitch === undefined || maxPitch === null) ? 60 : maxPitch;\n\n        this.setProjection(projection);\n        this.setMaxBounds(bounds);\n\n        this.width = 0;\n        this.height = 0;\n        this._center = new LngLat(0, 0);\n        this.zoom = 0;\n        this.angle = 0;\n        this._fov = 0.6435011087932844;\n        this._pitch = 0;\n        this._nearZ = 0;\n        this._farZ = 0;\n        this._unmodified = true;\n        this._edgeInsets = new EdgeInsets();\n        this._projMatrixCache = {};\n        this._alignedProjMatrixCache = {};\n        this._fogTileMatrixCache = {};\n        this._expandedProjMatrixCache = {};\n        this._distanceTileDataCache = {};\n        this._camera = new FreeCamera();\n        this._centerAltitude = 0;\n        this._averageElevation = 0;\n        this.cameraElevationReference = \"ground\";\n        this._pixelsPerMercatorPixel = 1.0;\n        this.globeRadius = 0;\n        this.globeCenterInViewSpace = [0, 0, 0];\n        this._tileCoverLift = 0;\n        this.freezeTileCoverage = false;\n\n        // Move the horizon closer to the center. 0 would not shift the horizon. 1 would put the horizon at the center.\n        this._horizonShift = 0.1;\n\n        this._orthographicProjectionAtLowPitch = false;\n    }\n\n    clone(): Transform {\n        const clone = new Transform(this._minZoom, this._maxZoom, this._minPitch, this.maxPitch, this._renderWorldCopies, this.getProjection());\n        clone._elevation = this._elevation;\n        clone._centerAltitude = this._centerAltitude;\n        clone._centerAltitudeValidForExaggeration = this._centerAltitudeValidForExaggeration;\n        clone.tileSize = this.tileSize;\n        clone.mercatorFromTransition = this.mercatorFromTransition;\n        clone.width = this.width;\n        clone.height = this.height;\n        clone.cameraElevationReference = this.cameraElevationReference;\n        clone._center = this._center;\n        clone._setZoom(this.zoom);\n        clone._seaLevelZoom = this._seaLevelZoom;\n        clone.angle = this.angle;\n        clone._fov = this._fov;\n        clone._pitch = this._pitch;\n        clone._nearZ = this._nearZ;\n        clone._farZ = this._farZ;\n        clone._averageElevation = this._averageElevation;\n        clone._orthographicProjectionAtLowPitch = this._orthographicProjectionAtLowPitch;\n        clone._unmodified = this._unmodified;\n        clone._edgeInsets = this._edgeInsets.clone();\n        clone._camera = this._camera.clone();\n        clone._calcMatrices();\n        clone.freezeTileCoverage = this.freezeTileCoverage;\n        clone.frustumCorners = this.frustumCorners;\n        return clone;\n    }\n\n    get isOrthographic(): boolean {\n        return this.projection.name !== 'globe' && this._orthographicProjectionAtLowPitch && this.pitch < OrthographicPitchTranstionValue;\n    }\n    get elevation(): ?Elevation { return this._elevation; }\n    set elevation(elevation: Elevation | null | void) {\n        if (this._elevation === elevation) return;\n        this._elevation = elevation;\n        this._updateCameraOnTerrain();\n        this._calcMatrices();\n    }\n    get depthOcclusionForSymbolsAndCircles(): boolean {\n        return this.projection.name !== 'globe' && !this.isOrthographic;\n    }\n\n    updateElevation(constrainCameraOverTerrain: boolean, adaptCameraAltitude: boolean = false) {\n        const centerAltitudeChanged = this._elevation && this._elevation.exaggeration() !== this._centerAltitudeValidForExaggeration;\n        if (this._seaLevelZoom == null || centerAltitudeChanged) {\n            this._updateCameraOnTerrain();\n        }\n        if (constrainCameraOverTerrain || centerAltitudeChanged) {\n            this._constrainCamera(adaptCameraAltitude);\n        }\n        this._calcMatrices();\n    }\n\n    getProjection(): ProjectionSpecification {\n        return (pick(this.projection, ['name', 'center', 'parallels']): ProjectionSpecification);\n    }\n\n    // Returns whether the projection changes\n    setProjection(projection?: ?ProjectionSpecification): boolean {\n        this.projectionOptions = projection || {name: 'mercator'};\n\n        const oldProjection = this.projection ? this.getProjection() : undefined;\n        this.projection = getProjection(this.projectionOptions);\n        const newProjection = this.getProjection();\n\n        const projectionHasChanged = !deepEqual(oldProjection, newProjection);\n        if (projectionHasChanged) {\n            this._calcMatrices();\n        }\n        this.mercatorFromTransition = false;\n\n        return projectionHasChanged;\n    }\n\n    // Returns whether the projection need to be reevaluated\n    setOrthographicProjectionAtLowPitch(enabled: boolean): boolean {\n        if (this._orthographicProjectionAtLowPitch === enabled) {\n            return false;\n        }\n\n        this._orthographicProjectionAtLowPitch = enabled;\n        this._calcMatrices();\n\n        return true;\n    }\n\n    setMercatorFromTransition(): boolean {\n        const oldProjection = this.projection.name;\n        this.mercatorFromTransition = true;\n        this.projectionOptions = {name: 'mercator'};\n        this.projection = getProjection({name: 'mercator'});\n        const projectionHasChanged = oldProjection !== this.projection.name;\n        if (projectionHasChanged) {\n            this._calcMatrices();\n        }\n        return projectionHasChanged;\n    }\n\n    get minZoom(): number { return this._minZoom; }\n    set minZoom(zoom: number) {\n        if (this._minZoom === zoom) return;\n        this._minZoom = zoom;\n        this.zoom = Math.max(this.zoom, zoom);\n    }\n\n    get maxZoom(): number { return this._maxZoom; }\n    set maxZoom(zoom: number) {\n        if (this._maxZoom === zoom) return;\n        this._maxZoom = zoom;\n        this.zoom = Math.min(this.zoom, zoom);\n    }\n\n    get minPitch(): number { return this._minPitch; }\n    set minPitch(pitch: number) {\n        if (this._minPitch === pitch) return;\n        this._minPitch = pitch;\n        this.pitch = Math.max(this.pitch, pitch);\n    }\n\n    get maxPitch(): number { return this._maxPitch; }\n    set maxPitch(pitch: number) {\n        if (this._maxPitch === pitch) return;\n        this._maxPitch = pitch;\n        this.pitch = Math.min(this.pitch, pitch);\n    }\n\n    get renderWorldCopies(): boolean {\n        return this._renderWorldCopies && this.projection.supportsWorldCopies === true;\n    }\n    set renderWorldCopies(renderWorldCopies: ?boolean | void) {\n        if (renderWorldCopies === undefined) {\n            renderWorldCopies = true;\n        } else if (renderWorldCopies === null) {\n            renderWorldCopies = false;\n        }\n\n        this._renderWorldCopies = renderWorldCopies;\n    }\n\n    get worldSize(): number {\n        return this.tileSize * this.scale;\n    }\n\n    // This getter returns an incorrect value.\n    // It should eventually be removed and cameraWorldSize be used instead.\n    // See free_camera.getDistanceToElevation for the rationale.\n    get cameraWorldSizeForFog(): number {\n        const distance = Math.max(this._camera.getDistanceToElevation(this._averageElevation), Number.EPSILON);\n        return this._worldSizeFromZoom(this._zoomFromMercatorZ(distance));\n    }\n\n    get cameraWorldSize(): number {\n        const distance = Math.max(this._camera.getDistanceToElevation(this._averageElevation, true), Number.EPSILON);\n        return this._worldSizeFromZoom(this._zoomFromMercatorZ(distance));\n    }\n\n    // `pixelsPerMeter` is used to describe relation between real world and pixel distances.\n    // In mercator projection it is dependant on latitude value meaning that one meter covers\n    // less pixels at the equator than near polar regions. Globe projection in other hand uses\n    // fixed ratio everywhere.\n\n    get pixelsPerMeter(): number {\n        return this.projection.pixelsPerMeter(this.center.lat, this.worldSize);\n    }\n\n    get cameraPixelsPerMeter(): number {\n        return mercatorZfromAltitude(1, this.center.lat) * this.cameraWorldSizeForFog;\n    }\n\n    get centerOffset(): Point {\n        return this.centerPoint._sub(this.size._div(2));\n    }\n\n    get size(): Point {\n        return new Point(this.width, this.height);\n    }\n\n    get bearing(): number {\n        return wrap(this.rotation, -180, 180);\n    }\n\n    set bearing(bearing: number) {\n        this.rotation = bearing;\n    }\n\n    get rotation(): number {\n        return -this.angle / Math.PI * 180;\n    }\n\n    set rotation(rotation: number) {\n        const b = -rotation * Math.PI / 180;\n        if (this.angle === b) return;\n        this._unmodified = false;\n        this.angle = b;\n        this._calcMatrices();\n\n        // 2x2 matrix for rotating points\n        this.rotationMatrix = mat2.create();\n        mat2.rotate(this.rotationMatrix, this.rotationMatrix, this.angle);\n    }\n\n    get pitch(): number {\n        return this._pitch / Math.PI * 180;\n    }\n    set pitch(pitch: number) {\n        const p = clamp(pitch, this.minPitch, this.maxPitch) / 180 * Math.PI;\n        if (this._pitch === p) return;\n        this._unmodified = false;\n        this._pitch = p;\n        this._calcMatrices();\n    }\n\n    get aspect(): number {\n        return this.width / this.height;\n    }\n\n    get fov(): number {\n        return this._fov / Math.PI * 180;\n    }\n\n    get fovX(): number {\n        return this._fov;\n    }\n\n    get fovY(): number {\n        const focalLength = 1.0 / Math.tan(this.fovX * 0.5);\n        return 2 * Math.atan((1.0 / this.aspect) / focalLength);\n    }\n\n    set fov(fov: number) {\n        fov = Math.max(0.01, Math.min(60, fov));\n        if (this._fov === fov) return;\n        this._unmodified = false;\n        this._fov = degToRad(fov);\n        this._calcMatrices();\n    }\n\n    get averageElevation(): number {\n        return this._averageElevation;\n    }\n    set averageElevation(averageElevation: number) {\n        this._averageElevation = averageElevation;\n        this._calcFogMatrices();\n        this._distanceTileDataCache = {};\n    }\n\n    get zoom(): number { return this._zoom; }\n    set zoom(zoom: number) {\n        const z = Math.min(Math.max(zoom, this.minZoom), this.maxZoom);\n        if (this._zoom === z) return;\n        this._unmodified = false;\n        this._setZoom(z);\n        this._updateSeaLevelZoom();\n        this._constrain();\n        this._calcMatrices();\n    }\n    _setZoom(z: number) {\n        this._zoom = z;\n        this.scale = this.zoomScale(z);\n        this.tileZoom = Math.floor(z);\n        this.zoomFraction = z - this.tileZoom;\n    }\n\n    get tileCoverLift(): number { return this._tileCoverLift; }\n    set tileCoverLift(lift: number) {\n        if (this._tileCoverLift === lift) return;\n        this._tileCoverLift = lift;\n    }\n\n    _updateCameraOnTerrain() {\n        const elevationAtCenter = this.elevation ? this.elevation.getAtPoint(this.locationCoordinate(this.center), Number.NEGATIVE_INFINITY) : Number.NEGATIVE_INFINITY;\n        const usePreviousCenter = this.elevation && elevationAtCenter === Number.NEGATIVE_INFINITY && this.elevation.visibleDemTiles.length > 0 && this.elevation.exaggeration() > 0 &&\n            this._centerAltitudeValidForExaggeration;\n        if (!this._elevation || (elevationAtCenter === Number.NEGATIVE_INFINITY && !(usePreviousCenter && this._centerAltitude))) {\n            // Elevation data not loaded yet, reset\n            this._centerAltitude = 0;\n            this._seaLevelZoom = null;\n            this._centerAltitudeValidForExaggeration = undefined;\n            return;\n        }\n        const elevation: Elevation = this._elevation;\n        if (usePreviousCenter || (this._centerAltitude && this._centerAltitudeValidForExaggeration &&\n                                  elevation.exaggeration() && this._centerAltitudeValidForExaggeration !== elevation.exaggeration())) {\n            assert(this._centerAltitudeValidForExaggeration);\n            const previousExaggeration = (this._centerAltitudeValidForExaggeration: any);\n            // scale down the centerAltitude\n            this._centerAltitude = this._centerAltitude / previousExaggeration * elevation.exaggeration();\n            this._centerAltitudeValidForExaggeration = elevation.exaggeration();\n        } else {\n            this._centerAltitude = elevationAtCenter || 0;\n            this._centerAltitudeValidForExaggeration = elevation.exaggeration();\n        }\n        this._updateSeaLevelZoom();\n    }\n\n    _updateSeaLevelZoom() {\n        if (this._centerAltitudeValidForExaggeration === undefined) {\n            return;\n        }\n        const height = this.cameraToCenterDistance;\n        const terrainElevation = this.pixelsPerMeter * this._centerAltitude;\n        const mercatorZ = (terrainElevation + height) / this.worldSize;\n\n        // MSL (Mean Sea Level) zoom describes the distance of the camera to the sea level (altitude).\n        // It is used only for manipulating the camera location. The standard zoom (this._zoom)\n        // defines the camera distance to the terrain (height). Its behavior and conceptual\n        // meaning in determining which tiles to stream is same with or without the terrain.\n        this._seaLevelZoom = this._zoomFromMercatorZ(mercatorZ);\n    }\n\n    sampleAverageElevation(): number {\n        if (!this._elevation) return 0;\n        const elevation: Elevation = this._elevation;\n\n        const elevationSamplePoints = [\n            [0.5, 0.2],\n            [0.3, 0.5],\n            [0.5, 0.5],\n            [0.7, 0.5],\n            [0.5, 0.8]\n        ];\n\n        const horizon = this.horizonLineFromTop();\n\n        let elevationSum = 0.0;\n        let weightSum = 0.0;\n        for (let i = 0; i < elevationSamplePoints.length; i++) {\n            const pt = new Point(\n                elevationSamplePoints[i][0] * this.width,\n                horizon + elevationSamplePoints[i][1] * (this.height - horizon)\n            );\n            const hit = elevation.pointCoordinate(pt);\n            if (!hit) continue;\n\n            const distanceToHit = Math.hypot(hit[0] - this._camera.position[0], hit[1] - this._camera.position[1]);\n            const weight = 1 / distanceToHit;\n            elevationSum += hit[3] * weight;\n            weightSum += weight;\n        }\n\n        if (weightSum === 0) return NaN;\n        return elevationSum / weightSum;\n    }\n\n    get center(): LngLat { return this._center; }\n    set center(center: LngLat) {\n        if (center.lat === this._center.lat && center.lng === this._center.lng) return;\n\n        this._unmodified = false;\n        this._center = center;\n        if (this._terrainEnabled()) {\n            if (this.cameraElevationReference === \"ground\") {\n                this._updateCameraOnTerrain();\n            } else {\n                this._updateZoomFromElevation();\n            }\n        }\n        this._constrain();\n        this._calcMatrices();\n    }\n\n    _updateZoomFromElevation() {\n        if (this._seaLevelZoom == null || !this._elevation)\n            return;\n\n        // Compute zoom level from the height of the camera relative to the terrain\n        const seaLevelZoom: number = this._seaLevelZoom;\n        const elevationAtCenter = this._elevation.getAtPointOrZero(this.locationCoordinate(this.center));\n        const mercatorElevation = this.pixelsPerMeter / this.worldSize * elevationAtCenter;\n        const altitude  = this._mercatorZfromZoom(seaLevelZoom);\n        const minHeight = this._mercatorZfromZoom(this._maxZoom);\n        const height = Math.max(altitude - mercatorElevation, minHeight);\n\n        this._setZoom(this._zoomFromMercatorZ(height));\n    }\n\n    get padding(): PaddingOptions { return this._edgeInsets.toJSON(); }\n    set padding(padding: PaddingOptions) {\n        if (this._edgeInsets.equals(padding)) return;\n        this._unmodified = false;\n        //Update edge-insets inplace\n        this._edgeInsets.interpolate(this._edgeInsets, padding, 1);\n        this._calcMatrices();\n    }\n\n    /**\n     * Computes a zoom value relative to a map plane that goes through the provided mercator position.\n     *\n     * @param {MercatorCoordinate} position A position defining the altitude of the the map plane.\n     * @returns {number} The zoom value.\n     */\n    computeZoomRelativeTo(position: MercatorCoordinate): number {\n        // Find map center position on the target plane by casting a ray from screen center towards the plane.\n        // Direct distance to the target position is used if the target position is above camera position.\n        const centerOnTargetAltitude = this.rayIntersectionCoordinate(this.pointRayIntersection(this.centerPoint, position.toAltitude()));\n\n        let targetPosition: ?Vec3;\n        if (position.z < this._camera.position[2]) {\n            targetPosition = [centerOnTargetAltitude.x, centerOnTargetAltitude.y, centerOnTargetAltitude.z];\n        } else {\n            targetPosition = [position.x, position.y, position.z];\n        }\n\n        const distToTarget = vec3.length(vec3.sub([], this._camera.position, targetPosition));\n        return clamp(this._zoomFromMercatorZ(distToTarget), this._minZoom, this._maxZoom);\n    }\n\n    setFreeCameraOptions(options: FreeCameraOptions) {\n        if (!this.height)\n            return;\n\n        if (!options.position && !options.orientation)\n            return;\n\n        // Camera state must be up-to-date before accessing its getters\n        this._updateCameraState();\n\n        let changed = false;\n        if (options.orientation && !quat.exactEquals(options.orientation, this._camera.orientation)) {\n            // $FlowFixMe[incompatible-call] - Flow can't infer that orientation is not null\n            changed = this._setCameraOrientation(options.orientation);\n        }\n\n        if (options.position) {\n            const newPosition = [options.position.x, options.position.y, options.position.z];\n            if (!vec3.exactEquals(newPosition, this._camera.position)) {\n                this._setCameraPosition(newPosition);\n                changed = true;\n            }\n        }\n\n        if (changed) {\n            this._updateStateFromCamera();\n            this.recenterOnTerrain();\n        }\n    }\n\n    getFreeCameraOptions(): FreeCameraOptions {\n        this._updateCameraState();\n        const pos = this._camera.position;\n        const options = new FreeCameraOptions();\n        options.position = new MercatorCoordinate(pos[0], pos[1], pos[2]);\n        options.orientation = this._camera.orientation;\n        options._elevation = this.elevation;\n        options._renderWorldCopies = this.renderWorldCopies;\n\n        return options;\n    }\n\n    _setCameraOrientation(orientation: Quat): boolean {\n        // zero-length quaternions are not valid\n        if (!quat.length(orientation))\n            return false;\n\n        quat.normalize(orientation, orientation);\n\n        // The new orientation must be sanitized by making sure it can be represented\n        // with a pitch and bearing. Roll-component must be removed and the camera can't be upside down\n        const forward = vec3.transformQuat([], [0, 0, -1], orientation);\n        const up = vec3.transformQuat([], [0, -1, 0], orientation);\n\n        if (up[2] < 0.0)\n            return false;\n\n        const updatedOrientation = orientationFromFrame(forward, up);\n        if (!updatedOrientation)\n            return false;\n\n        this._camera.orientation = updatedOrientation;\n        return true;\n    }\n\n    _setCameraPosition(position: Vec3) {\n        // Altitude must be clamped to respect min and max zoom\n        const minWorldSize = this.zoomScale(this.minZoom) * this.tileSize;\n        const maxWorldSize = this.zoomScale(this.maxZoom) * this.tileSize;\n        const distToCenter = this.cameraToCenterDistance;\n\n        position[2] = clamp(position[2], distToCenter / maxWorldSize, distToCenter / minWorldSize);\n        this._camera.position = position;\n    }\n\n    /**\n     * The center of the screen in pixels with the top-left corner being (0,0)\n     * and +y axis pointing downwards. This accounts for padding.\n     *\n     * @readonly\n     * @type {Point}\n     * @memberof Transform\n     */\n    get centerPoint(): Point {\n        return this._edgeInsets.getCenter(this.width, this.height);\n    }\n\n    /**\n     * Returns the vertical half-fov, accounting for padding, in radians.\n     *\n     * @readonly\n     * @type {number}\n     * @private\n     */\n    get fovAboveCenter(): number {\n        return this._fov * (0.5 + this.centerOffset.y / this.height);\n    }\n\n    /**\n     * Returns true if the padding options are equal.\n     *\n     * @param {PaddingOptions} padding The padding options to compare.\n     * @returns {boolean} True if the padding options are equal.\n     * @memberof Transform\n     */\n    isPaddingEqual(padding: PaddingOptions): boolean {\n        return this._edgeInsets.equals(padding);\n    }\n\n    /**\n     * Helper method to update edge-insets inplace.\n     *\n     * @param {PaddingOptions} start The initial padding options.\n     * @param {PaddingOptions} target The target padding options.\n     * @param {number} t The interpolation variable.\n     * @memberof Transform\n     */\n    interpolatePadding(start: PaddingOptions, target: PaddingOptions, t: number) {\n        this._unmodified = false;\n        this._edgeInsets.interpolate(start, target, t);\n        this._constrain();\n        this._calcMatrices();\n    }\n\n    /**\n     * Return the highest zoom level that fully includes all tiles within the transform's boundaries.\n     * @param {Object} options Options.\n     * @param {number} options.tileSize Tile size, expressed in screen pixels.\n     * @param {boolean} options.roundZoom Target zoom level. If true, the value will be rounded to the closest integer. Otherwise the value will be floored.\n     * @returns {number} An integer zoom level at which all tiles will be visible.\n     */\n    coveringZoomLevel(options: {roundZoom?: boolean, tileSize: number}): number {\n        const z = (options.roundZoom ? Math.round : Math.floor)(\n            this.zoom + this.scaleZoom(this.tileSize / options.tileSize)\n        );\n        // At negative zoom levels load tiles from z0 because negative tile zoom levels don't exist.\n        return Math.max(0, z);\n    }\n\n    /**\n     * Return any \"wrapped\" copies of a given tile coordinate that are visible\n     * in the current view.\n     *\n     * @private\n     */\n    getVisibleUnwrappedCoordinates(tileID: CanonicalTileID): Array<UnwrappedTileID> {\n        const result = [new UnwrappedTileID(0, tileID)];\n        if (this.renderWorldCopies) {\n            const utl = this.pointCoordinate(new Point(0, 0));\n            const utr = this.pointCoordinate(new Point(this.width, 0));\n            const ubl = this.pointCoordinate(new Point(this.width, this.height));\n            const ubr = this.pointCoordinate(new Point(0, this.height));\n            const w0 = Math.floor(Math.min(utl.x, utr.x, ubl.x, ubr.x));\n            const w1 = Math.floor(Math.max(utl.x, utr.x, ubl.x, ubr.x));\n\n            // Add an extra copy of the world on each side to properly render ImageSources and CanvasSources.\n            // Both sources draw outside the tile boundaries of the tile that \"contains them\" so we need\n            // to add extra copies on both sides in case offscreen tiles need to draw into on-screen ones.\n            const extraWorldCopy = 1;\n\n            for (let w = w0 - extraWorldCopy; w <= w1 + extraWorldCopy; w++) {\n                if (w === 0) continue;\n                result.push(new UnwrappedTileID(w, tileID));\n            }\n        }\n        return result;\n    }\n\n    isLODDisabled(checkPitch: boolean): boolean {\n        // No change of LOD behavior for pitch lower than 60 and when there is no top padding: return only tile ids from the requested zoom level\n        return (!checkPitch || this.pitch <= MIN_LOD_PITCH) && this._edgeInsets.top <= this._edgeInsets.bottom && !this._elevation && !this.projection.isReprojectedInTileSpace;\n    }\n\n    /**\n     * Extends tile coverage to include potential shadow caster tiles.\n     * @param {Array<OverscaledTileID>} coveringTiles tiles that are potential shadow receivers\n     * @param {Vec3} lightDir direction of the light (unit vector)\n     * @param {number} maxZoom maximum zoom level of shadow caster tiles\n     * @returns {Array<OverscaledTileID>} a set of potential shadow casters\n     */\n    extendTileCoverForShadows(coveringTiles: Array<OverscaledTileID>, lightDir: Vec3, maxZoom: number): Array<OverscaledTileID> {\n        let out = [];\n\n        if (lightDir[0] === 0.0 && lightDir[1] === 0.0) {\n            return out;\n        }\n\n        // Extra tile selection based on the direction of the light:\n        // For each tile we add neighbourgs that might cast shadows over the current tile\n        for (const id of coveringTiles) {\n            const tileId = id.canonical;\n            const overscaledZ = id.overscaledZ;\n            const tileWrap = id.wrap;\n            const tiles = 1 << tileId.z;\n\n            const xMaxInsideRange = tileId.x + 1 < tiles;\n            const xMinInsideRange = tileId.x > 0;\n\n            const yMaxInsideRange = tileId.y + 1 < tiles;\n            const yMinInsideRange = tileId.y > 0;\n\n            const leftWrap = id.wrap - (xMinInsideRange ? 0 : 1);\n            const rightWrap = id.wrap + (xMaxInsideRange ? 0 : 1);\n\n            const leftTileX = xMinInsideRange ? tileId.x - 1 : tiles - 1;\n            const rightTileX = xMaxInsideRange ? tileId.x + 1 : 0;\n\n            if (lightDir[0] < 0.0) {\n                out.push(new OverscaledTileID(overscaledZ, rightWrap, tileId.z, rightTileX, tileId.y));\n                if (lightDir[1] < 0.0 && yMaxInsideRange) {\n                    out.push(new OverscaledTileID(overscaledZ, tileWrap, tileId.z, tileId.x, tileId.y + 1));\n                    out.push(new OverscaledTileID(overscaledZ, rightWrap, tileId.z, rightTileX, tileId.y + 1));\n                }\n                if (lightDir[1] > 0.0 && yMinInsideRange) {\n                    out.push(new OverscaledTileID(overscaledZ, tileWrap, tileId.z, tileId.x, tileId.y - 1));\n                    out.push(new OverscaledTileID(overscaledZ, rightWrap, tileId.z, rightTileX, tileId.y - 1));\n                }\n            } else if (lightDir[0] > 0.0) {\n                out.push(new OverscaledTileID(overscaledZ, leftWrap, tileId.z, leftTileX, tileId.y));\n                if (lightDir[1] < 0.0 && yMaxInsideRange) {\n                    out.push(new OverscaledTileID(overscaledZ, tileWrap, tileId.z, tileId.x, tileId.y + 1));\n                    out.push(new OverscaledTileID(overscaledZ, leftWrap, tileId.z, leftTileX, tileId.y + 1));\n                }\n                if (lightDir[1] > 0.0 && yMinInsideRange) {\n                    out.push(new OverscaledTileID(overscaledZ, tileWrap, tileId.z, tileId.x, tileId.y - 1));\n                    out.push(new OverscaledTileID(overscaledZ, leftWrap, tileId.z, leftTileX, tileId.y - 1));\n                }\n            } else {\n                if (lightDir[1] < 0.0 && yMaxInsideRange) {\n                    out.push(new OverscaledTileID(overscaledZ, tileWrap, tileId.z, tileId.x, tileId.y + 1));\n                } else if (yMinInsideRange) {\n                    out.push(new OverscaledTileID(overscaledZ, tileWrap, tileId.z, tileId.x, tileId.y - 1));\n                }\n            }\n        }\n\n        // Remove duplicates from new ids\n        if (out.length > 1) {\n            out.sort((a, b) => {\n                return a.overscaledZ - b.overscaledZ ||\n                        a.wrap - b.wrap ||\n                        a.canonical.z - b.canonical.z ||\n                        a.canonical.x - b.canonical.x ||\n                        a.canonical.y - b.canonical.y;\n            });\n\n            let i = 0;\n            let j = 0;\n            while (j < out.length) {\n                if (!out[j].equals(out[i])) {\n                    out[++i] = out[j++];\n                } else {\n                    ++j;\n                }\n            }\n            out.length = i + 1;\n        }\n\n        // Remove higher zoom new IDs that overlap with other new IDs\n        const nonOverlappingIds = [];\n\n        for (const id of out) {\n            if (!out.some(ancestorCandidate => id.isChildOf(ancestorCandidate))) {\n                nonOverlappingIds.push(id);\n            }\n        }\n\n        // Remove new IDs that overlap with old IDs\n        out = nonOverlappingIds.filter(newId => !coveringTiles.some(oldId => {\n            if (newId.overscaledZ < maxZoom && oldId.isChildOf(newId)) {\n                return true;\n            }\n            // Remove identical IDs or children of existing IDs\n            return newId.equals(oldId) || newId.isChildOf(oldId);\n        }));\n\n        return out;\n    }\n\n    /**\n     * Return all coordinates that could cover this transform for a covering\n     * zoom level.\n     * @param {Object} options\n     * @param {number} options.tileSize\n     * @param {number} options.minzoom\n     * @param {number} options.maxzoom\n     * @param {boolean} options.roundZoom\n     * @param {boolean} options.reparseOverscaled\n     * @returns {Array<OverscaledTileID>} OverscaledTileIDs\n     * @private\n     */\n    coveringTiles(\n        options: {\n            tileSize: number,\n            minzoom?: number,\n            maxzoom?: number,\n            roundZoom?: boolean,\n            reparseOverscaled?: boolean,\n            renderWorldCopies?: boolean,\n            isTerrainDEM?: boolean\n        }\n    ): Array<OverscaledTileID> {\n        let z = this.coveringZoomLevel(options);\n        const actualZ = z;\n\n        const hasExaggeration = this.elevation && this.elevation.exaggeration();\n        const useElevationData = hasExaggeration && !options.isTerrainDEM;\n        const isMercator = this.projection.name === 'mercator';\n\n        if (options.minzoom !== undefined && z < options.minzoom) return [];\n        if (options.maxzoom !== undefined && z > options.maxzoom) z = options.maxzoom;\n\n        const centerCoord = this.locationCoordinate(this.center);\n        const centerLatitude = this.center.lat;\n        const numTiles = 1 << z;\n        const centerPoint = [numTiles * centerCoord.x, numTiles * centerCoord.y, 0];\n        const isGlobe = this.projection.name === 'globe';\n        const zInMeters = !isGlobe;\n        const cameraFrustum = Frustum.fromInvProjectionMatrix(this.invProjMatrix, this.worldSize, z, zInMeters);\n        const cameraCoord = isGlobe ? this._camera.mercatorPosition : this.pointCoordinate(this.getCameraPoint());\n        const meterToTile = numTiles * mercatorZfromAltitude(1, this.center.lat);\n        const cameraAltitude = this._camera.position[2] / mercatorZfromAltitude(1, this.center.lat);\n        const cameraPoint = [numTiles * cameraCoord.x, numTiles * cameraCoord.y, cameraAltitude * (zInMeters ? 1 : meterToTile)];\n        const verticalFrustumIntersect = isGlobe || hasExaggeration;\n        // Let's consider an example for !roundZoom: e.g. tileZoom 16 is used from zoom 16 all the way to zoom 16.99.\n        // This would mean that the minimal distance to split would be based on distance from camera to center of 16.99 zoom.\n        // The same is already incorporated in logic behind roundZoom for raster (so there is no adjustment needed in following line).\n        // 0.02 added to compensate for precision errors, see \"coveringTiles for terrain\" test in transform.test.js.\n        const zoomSplitDistance = this.cameraToCenterDistance / options.tileSize * (options.roundZoom ? 1 : 0.502);\n\n        const minZoom = this.isLODDisabled(true) ? z : 0;\n\n        // When calculating tile cover for terrain, create deep AABB for nodes, to ensure they intersect frustum: for sources,\n        // other than DEM, use minimum of visible DEM tiles and center altitude as upper bound (pitch is always less than 90°).\n        let maxRange;\n        if (this._elevation && options.isTerrainDEM) {\n            maxRange = this._elevation.exaggeration() * 10000;\n        } else if (this._elevation) {\n            const minMaxOpt = this._elevation.getMinMaxForVisibleTiles();\n            maxRange = minMaxOpt ? minMaxOpt.max : this._centerAltitude;\n        } else {\n            maxRange = this._centerAltitude;\n        }\n        const minRange = options.isTerrainDEM ? -maxRange : this._elevation ? this._elevation.getMinElevationBelowMSL() : 0;\n\n        const scaleAdjustment = this.projection.isReprojectedInTileSpace ? getScaleAdjustment(this) : 1.0;\n\n        const relativeScaleAtMercatorCoord = (mc: MercatorCoordinate) => {\n            // Calculate how scale compares between projected coordinates and mercator coordinates.\n            // Returns a length. The units don't matter since the result is only\n            // used in a ratio with other values returned by this function.\n\n            // Construct a small square in Mercator coordinates.\n            const offset = 1 / 40000;\n            const mcEast = new MercatorCoordinate(mc.x + offset, mc.y, mc.z);\n            const mcSouth = new MercatorCoordinate(mc.x, mc.y + offset, mc.z);\n\n            // Convert the square to projected coordinates.\n            const ll = mc.toLngLat();\n            const llEast = mcEast.toLngLat();\n            const llSouth = mcSouth.toLngLat();\n            const p = this.locationCoordinate(ll);\n            const pEast = this.locationCoordinate(llEast);\n            const pSouth = this.locationCoordinate(llSouth);\n\n            // Calculate the size of each edge of the reprojected square\n            const dx = Math.hypot(pEast.x - p.x, pEast.y - p.y);\n            const dy = Math.hypot(pSouth.x - p.x, pSouth.y - p.y);\n\n            // Calculate the size of a projected square that would have the\n            // same area as the reprojected square.\n            return Math.sqrt(dx * dy) * scaleAdjustment / offset;\n        };\n\n        const newRootTile = (wrap: number): RootTile => {\n            const max = maxRange;\n            const min = minRange;\n            return {\n                // With elevation, this._elevation provides z coordinate values. For 2D:\n                // All tiles are on zero elevation plane => z difference is zero\n                aabb: tileAABB(this, numTiles, 0, 0, 0, wrap, min, max, this.projection),\n                zoom: 0,\n                x: 0,\n                y: 0,\n                minZ: min,\n                maxZ: max,\n                wrap,\n                fullyVisible: false\n            };\n        };\n\n        // Do a depth-first traversal to find visible tiles and proper levels of detail\n        const stack = [];\n        let result = [];\n        const maxZoom = z;\n        const overscaledZ = options.reparseOverscaled ? actualZ : z;\n        const square = (a: number) => a * a;\n        const cameraHeightSqr = square((cameraAltitude - this._centerAltitude) * meterToTile); // in tile coordinates.\n\n        const getAABBFromElevation = (it: RootTile) => {\n            assert(this._elevation);\n            if (!this._elevation || !it.tileID || !isMercator) return; // To silence flow.\n            const minmax = this._elevation.getMinMaxForTile(it.tileID);\n            const aabb = it.aabb;\n            if (minmax) {\n                aabb.min[2] = minmax.min;\n                aabb.max[2] = minmax.max;\n                aabb.center[2] = (aabb.min[2] + aabb.max[2]) / 2;\n            } else {\n                it.shouldSplit = shouldSplit(it);\n                if (!it.shouldSplit) {\n                    // At final zoom level, while corresponding DEM tile is not loaded yet,\n                    // assume center elevation. This covers ground to horizon and prevents\n                    // loading unnecessary tiles until DEM cover is fully loaded.\n                    aabb.min[2] = aabb.max[2] = aabb.center[2] = this._centerAltitude;\n                }\n            }\n        };\n\n        // Scale distance to split for acute angles.\n        // dzSqr: z component of camera to tile distance, square.\n        // dSqr: 3D distance of camera to tile, square.\n        const distToSplitScale = (dzSqr: number, dSqr: number) => {\n            // When the angle between camera to tile ray and tile plane is smaller\n            // than acuteAngleThreshold, scale the distance to split. Scaling is adaptive: smaller\n            // the angle, the scale gets lower value. Although it seems early to start at 45,\n            // it is not: scaling kicks in around 60 degrees pitch.\n            const acuteAngleThresholdSin = 0.707; // Math.sin(45)\n            const stretchTile = 1.1;\n            // Distances longer than 'dz / acuteAngleThresholdSin' gets scaled\n            // following geometric series sum: every next dz length in distance can be\n            // 'stretchTile times' longer. It is further, the angle is sharper. Total,\n            // adjusted, distance would then be:\n            // = dz / acuteAngleThresholdSin + (dz * stretchTile + dz * stretchTile ^ 2 + ... + dz * stretchTile ^ k),\n            // where k = (d - dz / acuteAngleThresholdSin) / dz = d / dz - 1 / acuteAngleThresholdSin;\n            // = dz / acuteAngleThresholdSin + dz * ((stretchTile ^ (k + 1) - 1) / (stretchTile - 1) - 1)\n            // or put differently, given that k is based on d and dz, tile on distance d could be used on distance scaled by:\n            // 1 / acuteAngleThresholdSin + (stretchTile ^ (k + 1) - 1) / (stretchTile - 1) - 1\n            if (dSqr * square(acuteAngleThresholdSin) < dzSqr) return 1.0; // Early return, no scale.\n            const r = Math.sqrt(dSqr / dzSqr);\n            const k =  r - 1 / acuteAngleThresholdSin;\n            return r / (1 / acuteAngleThresholdSin + (Math.pow(stretchTile, k + 1) - 1) / (stretchTile - 1) - 1);\n        };\n\n        const shouldSplit = (it: RootTile) => {\n            if (it.zoom < minZoom) {\n                return true;\n            } else if (it.zoom === maxZoom) {\n                return false;\n            }\n            if (it.shouldSplit != null) {\n                return it.shouldSplit;\n            }\n            const dx = it.aabb.distanceX(cameraPoint);\n            const dy = it.aabb.distanceY(cameraPoint);\n            let dzSqr = cameraHeightSqr;\n\n            let tileScaleAdjustment = 1;\n            if (isGlobe) {\n                dzSqr = square(it.aabb.distanceZ(cameraPoint));\n                // Compensate physical sizes of the tiles when determining which zoom level to use.\n                // In practice tiles closer to poles should use more aggressive LOD as their\n                // physical size is already smaller than size of tiles near the equator.\n                const tilesAtZoom = Math.pow(2, it.zoom);\n                const minLat = latFromMercatorY((it.y + 1) / tilesAtZoom);\n                const maxLat = latFromMercatorY((it.y) / tilesAtZoom);\n                const closestLat = Math.min(Math.max(centerLatitude, minLat), maxLat);\n\n                const relativeTileScale = circumferenceAtLatitude(closestLat) / circumferenceAtLatitude(centerLatitude);\n\n                // With globe, the rendered scale does not exactly match the mercator scale at low zoom levels.\n                // Account for this difference during LOD of loading so that you load the correct size tiles.\n                // We try to compromise between two conflicting requirements:\n                // - loading tiles at the camera's zoom level (for visual and styling consistency)\n                // - loading correct size tiles (to reduce the number of tiles loaded)\n                // These are arbitrarily balanced:\n                if (closestLat === centerLatitude) {\n                    // For tiles that are in the middle of the viewport, prioritize matching the camera\n                    // zoom and allow divergence from the true scale.\n                    const maxDivergence = 0.3;\n                    tileScaleAdjustment = 1 / Math.max(1, this._mercatorScaleRatio - maxDivergence);\n                } else {\n                    // For other tiles, use the real scale to reduce tile counts near poles.\n                    tileScaleAdjustment = Math.min(1, relativeTileScale / this._mercatorScaleRatio);\n                }\n\n                // Ensure that all tiles near the center have the same zoom level.\n                // With LOD tile loading, tile zoom levels can change when scale slightly changes.\n                // These differences can be pretty different in globe view. Work around this by\n                // making more tiles match the center tile's zoom level. If the tiles are nearly big enough,\n                // round up. Only apply this adjustment before the transition to mercator rendering has started.\n                if (this.zoom <= GLOBE_ZOOM_THRESHOLD_MIN && it.zoom === maxZoom - 1 && relativeTileScale >= 0.9) {\n                    return true;\n                }\n            } else {\n                assert(zInMeters);\n                if (useElevationData) {\n                    dzSqr = square(it.aabb.distanceZ(cameraPoint) * meterToTile);\n                }\n                if (this.projection.isReprojectedInTileSpace && actualZ <= 5) {\n                    // In other projections, not all tiles are the same size.\n                    // Account for the tile size difference by adjusting the distToSplit.\n                    // Adjust by the ratio of the area at the tile center to the area at the map center.\n                    // Adjustments are only needed at lower zooms where tiles are not similarly sized.\n                    const numTiles = Math.pow(2, it.zoom);\n                    const relativeScale = relativeScaleAtMercatorCoord(new MercatorCoordinate((it.x + 0.5) / numTiles, (it.y + 0.5) / numTiles));\n                    // Fudge the ratio slightly so that all tiles near the center have the same zoom level.\n                    tileScaleAdjustment = relativeScale > 0.85 ? 1 : relativeScale;\n                }\n            }\n\n            const distanceSqr = dx * dx + dy * dy + dzSqr;\n            const distToSplit = (1 << maxZoom - it.zoom) * zoomSplitDistance * tileScaleAdjustment;\n            const distToSplitSqr = square(distToSplit * distToSplitScale(Math.max(dzSqr, cameraHeightSqr), distanceSqr));\n\n            return distanceSqr < distToSplitSqr;\n        };\n\n        if (this.renderWorldCopies) {\n            // Render copy of the globe thrice on both sides\n            for (let i = 1; i <= NUM_WORLD_COPIES; i++) {\n                stack.push(newRootTile(-i));\n                stack.push(newRootTile(i));\n            }\n        }\n\n        stack.push(newRootTile(0));\n\n        while (stack.length > 0) {\n            const it = stack.pop();\n            const x = it.x;\n            const y = it.y;\n            let fullyVisible = it.fullyVisible;\n\n            const isPoleNeighbourAndGlobeProjection = () => {\n                return this.projection.name === 'globe' && (it.y === 0 || it.y === (1 << it.zoom) - 1);\n            };\n\n            // Visibility of a tile is not required if any of its ancestor is fully inside the frustum\n            if (!fullyVisible) {\n                let intersectResult = verticalFrustumIntersect ? it.aabb.intersects(cameraFrustum) : it.aabb.intersectsFlat(cameraFrustum);\n\n                // For globe projection and pole neighboouring tiles - clip against pole segments as well\n                if (intersectResult === 0 && isPoleNeighbourAndGlobeProjection()) {\n                    const tileId = new CanonicalTileID(it.zoom, x, y);\n                    const poleAABB = aabbForTileOnGlobe(this, numTiles, tileId, true);\n                    intersectResult = poleAABB.intersects(cameraFrustum);\n                }\n\n                if (intersectResult === 0) {\n                    continue;\n                }\n                fullyVisible = intersectResult === 2;\n            }\n\n            // Have we reached the target depth or is the tile too far away to be any split further?\n            if (it.zoom === maxZoom || !shouldSplit(it)) {\n                const tileZoom = it.zoom === maxZoom ? overscaledZ : it.zoom;\n                if (!!options.minzoom && options.minzoom > tileZoom) {\n                    // Not within source tile range.\n                    continue;\n                }\n\n                // Perform more precise intersection tests to cull the remaining < 1% false positives from the earlier test.\n                if (!fullyVisible) {\n\n                    let intersectResult = verticalFrustumIntersect ? it.aabb.intersectsPrecise(cameraFrustum) : it.aabb.intersectsPreciseFlat(cameraFrustum);\n\n                    // For globe projection and pole neighboouring tiles - clip against pole segments as well\n                    if (intersectResult === 0 && isPoleNeighbourAndGlobeProjection()) {\n                        const tileId = new CanonicalTileID(it.zoom, x, y);\n                        const poleAABB = aabbForTileOnGlobe(this, numTiles, tileId, true);\n                        intersectResult = poleAABB.intersectsPrecise(cameraFrustum);\n                    }\n\n                    if (intersectResult === 0) {\n                        continue;\n                    }\n                }\n\n                const dx = centerPoint[0] - ((0.5 + x + (it.wrap << it.zoom)) * (1 << (z - it.zoom)));\n                const dy = centerPoint[1] - 0.5 - y;\n                const id = it.tileID ? it.tileID : new OverscaledTileID(tileZoom, it.wrap, it.zoom, x, y);\n                result.push({tileID: id, distanceSq: dx * dx + dy * dy});\n                continue;\n            }\n\n            for (let i = 0; i < 4; i++) {\n                const childX = (x << 1) + (i % 2);\n                const childY = (y << 1) + (i >> 1);\n\n                const aabb = isMercator ? it.aabb.quadrant(i) : tileAABB(this, numTiles, it.zoom + 1, childX, childY, it.wrap, it.minZ, it.maxZ, this.projection);\n                const child: RootTile = {aabb, zoom: it.zoom + 1, x: childX, y: childY, wrap: it.wrap, fullyVisible, tileID: undefined, shouldSplit: undefined, minZ: it.minZ, maxZ: it.maxZ};\n                if (useElevationData && !isGlobe) {\n                    child.tileID = new OverscaledTileID(it.zoom + 1 === maxZoom ? overscaledZ : it.zoom + 1, it.wrap, it.zoom + 1, childX, childY);\n                    getAABBFromElevation(child);\n                }\n                stack.push(child);\n            }\n        }\n\n        if (this.fogCullDistSq) {\n            const fogCullDistSq = this.fogCullDistSq;\n            const horizonLineFromTop = this.horizonLineFromTop();\n            result = result.filter(entry => {\n                const tl = [0, 0, 0, 1];\n                const br = [EXTENT, EXTENT, 0, 1];\n\n                const fogTileMatrix = this.calculateFogTileMatrix(entry.tileID.toUnwrapped());\n\n                vec4.transformMat4(tl, tl, fogTileMatrix);\n                vec4.transformMat4(br, br, fogTileMatrix);\n\n                // the fog matrix can flip the min/max values, so we calculate them explicitly\n                const min = vec4.min([], tl, br);\n                const max = vec4.max([], tl, br);\n\n                const sqDist = getAABBPointSquareDist(min, max);\n\n                if (sqDist === 0) { return true; }\n\n                let overHorizonLine = false;\n\n                // Terrain loads at one zoom level lower than the raster data,\n                // so the following checks whether the terrain sits above the horizon and ensures that\n                // when mountains stick out above the fog (due to horizon-blend),\n                // we haven’t accidentally culled some of the raster tiles we need to draw on them.\n                // If we don’t do this, the terrain is default black color and may flash in and out as we move toward it.\n\n                const elevation = this._elevation;\n\n                if (elevation && sqDist > fogCullDistSq && horizonLineFromTop !== 0) {\n                    const projMatrix = this.calculateProjMatrix(entry.tileID.toUnwrapped());\n\n                    let minmax;\n                    if (!options.isTerrainDEM) {\n                        minmax = elevation.getMinMaxForTile(entry.tileID);\n                    }\n\n                    if (!minmax) { minmax = {min: minRange, max: maxRange}; }\n\n                    // ensure that we want `this.rotation` instead of `this.bearing` here\n                    const cornerFar = furthestTileCorner(this.rotation);\n\n                    const farX = cornerFar[0] * EXTENT;\n                    const farY = cornerFar[1] * EXTENT;\n\n                    const worldFar = [farX, farY, minmax.max];\n\n                    // World to NDC\n                    vec3.transformMat4(worldFar, worldFar, projMatrix);\n\n                    // NDC to Screen\n                    const screenCoordY = (1 - worldFar[1]) * this.height * 0.5;\n\n                    // Prevent cutting tiles crossing over the horizon line to\n                    // prevent pop-in and out within the fog culling range\n                    overHorizonLine = screenCoordY < horizonLineFromTop;\n                }\n\n                return sqDist < fogCullDistSq || overHorizonLine;\n            });\n        }\n\n        const cover = result.sort((a, b) => a.distanceSq - b.distanceSq).map(a => a.tileID);\n\n        // Relax the assertion on terrain, on high zoom we use distance to center of tile\n        // while camera might be closer to selected center of map.\n        assert(!cover.length || this.elevation || cover[0].overscaledZ === overscaledZ || !isMercator);\n        return cover;\n    }\n\n    resize(width: number, height: number) {\n        this.width = width;\n        this.height = height;\n\n        this.pixelsToGLUnits = [2 / width, -2 / height];\n        this._constrain();\n        this._calcMatrices();\n    }\n\n    get unmodified(): boolean { return this._unmodified; }\n\n    zoomScale(zoom: number): number { return Math.pow(2, zoom); }\n    scaleZoom(scale: number): number { return Math.log(scale) / Math.LN2; }\n\n    // Transform from LngLat to Point in world coordinates [-180, 180] x [90, -90] --> [0, this.worldSize] x [0, this.worldSize]\n    project(lnglat: LngLat): Point {\n        const lat = clamp(lnglat.lat, -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE);\n        const projectedLngLat = this.projection.project(lnglat.lng, lat);\n        return new Point(\n                projectedLngLat.x * this.worldSize,\n                projectedLngLat.y * this.worldSize);\n    }\n\n    // Transform from Point in world coordinates to LngLat [0, this.worldSize] x [0, this.worldSize] --> [-180, 180] x [90, -90]\n    unproject(point: Point): LngLat {\n        return this.projection.unproject(point.x / this.worldSize, point.y / this.worldSize);\n    }\n\n    // Point at center in world coordinates.\n    get point(): Point { return this.project(this.center); }\n\n    // Point at center in Mercator coordinates.\n    get pointMerc(): Point { return this.point._div(this.worldSize); }\n\n    // Ratio of pixelsPerMeter in the current projection to Mercator's.\n    get pixelsPerMeterRatio(): number { return this.pixelsPerMeter / mercatorZfromAltitude(1, this.center.lat) / this.worldSize; }\n\n    setLocationAtPoint(lnglat: LngLat, point: Point) {\n        let x, y;\n        const centerPoint = this.centerPoint;\n\n        if (this.projection.name === 'globe') {\n            // Pixel coordinates are applied directly to the globe\n            const worldSize = this.worldSize;\n            x = (point.x - centerPoint.x) / worldSize;\n            y = (point.y - centerPoint.y) / worldSize;\n        } else {\n            const a = this.pointCoordinate(point);\n            const b = this.pointCoordinate(centerPoint);\n            x = a.x - b.x;\n            y = a.y - b.y;\n        }\n\n        const loc = this.locationCoordinate(lnglat);\n        this.setLocation(new MercatorCoordinate(loc.x - x, loc.y - y));\n    }\n\n    setLocation(location: MercatorCoordinate) {\n        this.center = this.coordinateLocation(location);\n        if (this.projection.wrap) {\n            this.center = this.center.wrap();\n        }\n    }\n\n    /**\n     * Given a location, return the screen point that corresponds to it. In 3D mode\n     * (with terrain) this behaves the same as in 2D mode.\n     * This method is coupled with {@see pointLocation} in 3D mode to model map manipulation\n     * using flat plane approach to keep constant elevation above ground.\n     * @param {LngLat} lnglat location\n     * @returns {Point} screen point\n     * @private\n     */\n    locationPoint(lnglat: LngLat): Point {\n        return this.projection.locationPoint(this, lnglat);\n    }\n\n    /**\n     * Given a location, return the screen point that corresponds to it\n     * In 3D mode (when terrain is enabled) elevation is sampled for the point before\n     * projecting it. In 2D mode, behaves the same locationPoint.\n     * @param {LngLat} lnglat location\n     * @returns {Point} screen point\n     * @private\n     */\n    locationPoint3D(lnglat: LngLat): Point {\n        return this.projection.locationPoint(this, lnglat, true);\n    }\n\n    /**\n     * Given a point on screen, return its lnglat\n     * @param {Point} p screen point\n     * @returns {LngLat} lnglat location\n     * @private\n     */\n    pointLocation(p: Point): LngLat {\n        return this.coordinateLocation(this.pointCoordinate(p));\n    }\n\n    /**\n     * Given a point on screen, return its lnglat\n     * In 3D mode (map with terrain) returns location of terrain raycast point.\n     * In 2D mode, behaves the same as {@see pointLocation}.\n     * @param {Point} p screen point\n     * @returns {LngLat} lnglat location\n     * @private\n     */\n    pointLocation3D(p: Point): LngLat {\n        return this.coordinateLocation(this.pointCoordinate3D(p));\n    }\n\n    /**\n     * Given a geographical lngLat, return an unrounded\n     * coordinate that represents it at this transform's zoom level.\n     * @param {LngLat} lngLat\n     * @returns {Coordinate}\n     * @private\n     */\n    locationCoordinate(lngLat: LngLat, altitude?: number): MercatorCoordinate {\n        const z = altitude ?\n            mercatorZfromAltitude(altitude, lngLat.lat) :\n            undefined;\n        const projectedLngLat = this.projection.project(lngLat.lng, lngLat.lat);\n        return new MercatorCoordinate(\n            projectedLngLat.x,\n            projectedLngLat.y,\n            z);\n    }\n\n    /**\n     * Given a Coordinate, return its geographical position.\n     * @param {Coordinate} coord\n     * @returns {LngLat} lngLat\n     * @private\n     */\n    coordinateLocation(coord: MercatorCoordinate): LngLat {\n        return this.projection.unproject(coord.x, coord.y);\n    }\n\n    /**\n     * Casts a ray from a point on screen and returns the Ray,\n     * and the extent along it, at which it intersects the map plane.\n     *\n     * @param {Point} p Viewport pixel co-ordinates.\n     * @param {number} z Optional altitude of the map plane, defaulting to elevation at center.\n     * @returns {{ p0: Vec4, p1: Vec4, t: number }} p0,p1 are two points on the ray.\n     * t is the fractional extent along the ray at which the ray intersects the map plane.\n     * @private\n     */\n    pointRayIntersection(p: Point, z: ?number): RayIntersectionResult {\n        const targetZ = (z !== undefined && z !== null) ? z : this._centerAltitude;\n        // Since we don't know the correct projected z value for the point,\n        // unproject two points to get a line and then find the point on that\n        // line with z=0.\n\n        const p0 = [p.x, p.y, 0, 1];\n        const p1 = [p.x, p.y, 1, 1];\n\n        vec4.transformMat4(p0, p0, this.pixelMatrixInverse);\n        vec4.transformMat4(p1, p1, this.pixelMatrixInverse);\n\n        const w0 = p0[3];\n        const w1 = p1[3];\n        vec4.scale(p0, p0, 1 / w0);\n        vec4.scale(p1, p1, 1 / w1);\n\n        const z0 = p0[2];\n        const z1 = p1[2];\n\n        const t = z0 === z1 ? 0 : (targetZ - z0) / (z1 - z0);\n\n        return {p0, p1, t};\n    }\n\n    screenPointToMercatorRay(p: Point): Ray {\n        const p0 = [p.x, p.y, 0, 1];\n        const p1 = [p.x, p.y, 1, 1];\n\n        vec4.transformMat4(p0, p0, this.pixelMatrixInverse);\n        vec4.transformMat4(p1, p1, this.pixelMatrixInverse);\n\n        vec4.scale(p0, p0, 1 / p0[3]);\n        vec4.scale(p1, p1, 1 / p1[3]);\n\n        // Convert altitude from meters to pixels.\n        p0[2] = mercatorZfromAltitude(p0[2], this._center.lat) * this.worldSize;\n        p1[2] = mercatorZfromAltitude(p1[2], this._center.lat) * this.worldSize;\n\n        vec4.scale(p0, p0, 1 / this.worldSize);\n        vec4.scale(p1, p1, 1 / this.worldSize);\n\n        return new Ray([p0[0], p0[1], p0[2]], vec3.normalize([], vec3.sub([], p1, p0)));\n    }\n\n    /**\n     *  Helper method to convert the ray intersection with the map plane to MercatorCoordinate.\n     *\n     * @param {RayIntersectionResult} rayIntersection\n     * @returns {MercatorCoordinate}\n     * @private\n     */\n    rayIntersectionCoordinate(rayIntersection: RayIntersectionResult): MercatorCoordinate {\n        const {p0, p1, t} = rayIntersection;\n\n        const z0 = mercatorZfromAltitude(p0[2], this._center.lat);\n        const z1 = mercatorZfromAltitude(p1[2], this._center.lat);\n\n        return new MercatorCoordinate(\n            interpolate(p0[0], p1[0], t) / this.worldSize,\n            interpolate(p0[1], p1[1], t) / this.worldSize,\n            interpolate(z0, z1, t));\n    }\n\n    /**\n     * Given a point on screen, returns MercatorCoordinate.\n     * @param {Point} p Top left origin screen point, in pixels.\n     * @param {number} z Optional altitude of the map plane, defaulting to elevation at center.\n     * @private\n     */\n    pointCoordinate(p: Point, z?: number = this._centerAltitude): MercatorCoordinate {\n        return this.projection.pointCoordinate(this, p.x, p.y, z);\n    }\n\n    /**\n     * Given a point on screen, returns MercatorCoordinate.\n     * In 3D mode, raycast to terrain. In 2D mode, behaves the same as {@see pointCoordinate}.\n     * For p above terrain, don't return point behind camera but clamp p.y at the top of terrain.\n     * @param {Point} p top left origin screen point, in pixels.\n     * @private\n     */\n    pointCoordinate3D(p: Point): MercatorCoordinate {\n        if (!this.elevation) return this.pointCoordinate(p);\n        let raycast: ?Vec3 = this.projection.pointCoordinate3D(this, p.x, p.y);\n        if (raycast) return new MercatorCoordinate(raycast[0], raycast[1], raycast[2]);\n        let start = 0, end = this.horizonLineFromTop();\n        if (p.y > end) return this.pointCoordinate(p); // holes between tiles below horizon line or below bottom.\n        const samples = 10;\n        const threshold = 0.02 * end;\n        const r = p.clone();\n\n        for (let i = 0; i < samples && end - start > threshold; i++) {\n            r.y = interpolate(start, end, 0.66); // non uniform binary search favoring points closer to horizon.\n            const rCast = this.projection.pointCoordinate3D(this, r.x, r.y);\n            if (rCast) {\n                end = r.y;\n                raycast = rCast;\n            } else {\n                start = r.y;\n            }\n        }\n        return raycast ? new MercatorCoordinate(raycast[0], raycast[1], raycast[2]) : this.pointCoordinate(p);\n    }\n\n    /**\n     * Returns true if a screenspace Point p, is above the horizon.\n     * In non-globe projections, this approximates the map as an infinite plane and does not account for z0-z3\n     * wherein the map is small quad with whitespace above the north pole and below the south pole.\n     *\n     * @param {Point} p\n     * @returns {boolean}\n     * @private\n     */\n    isPointAboveHorizon(p: Point): boolean {\n        return this.projection.isPointAboveHorizon(this, p);\n    }\n\n    /**\n     * Determines if the given point is located on a visible map surface.\n     *\n     * @param {Point} p\n     * @returns {boolean}\n     * @private\n     */\n    isPointOnSurface(p: Point): boolean {\n        if (p.y < 0 || p.y > this.height || p.x < 0 || p.x > this.width) return false;\n        if (this.elevation || this.zoom >= GLOBE_ZOOM_THRESHOLD_MAX) return !this.isPointAboveHorizon(p);\n        const coord = this.pointCoordinate(p);\n        return coord.y >= 0 && coord.y <= 1;\n    }\n\n    /**\n     * Given a coordinate, return the screen point that corresponds to it\n     * @param {Coordinate} coord\n     * @param {boolean} sampleTerrainIn3D in 3D mode (terrain enabled), sample elevation for the point.\n     * If false, do the same as in 2D mode, assume flat camera elevation plane for all points.\n     * @returns {Point} screen point\n     * @private\n     */\n    _coordinatePoint(coord: MercatorCoordinate, sampleTerrainIn3D: boolean): Point {\n        const elevation = sampleTerrainIn3D && this.elevation ? this.elevation.getAtPointOrZero(coord, this._centerAltitude) : this._centerAltitude;\n        const p = [coord.x * this.worldSize, coord.y * this.worldSize, elevation + coord.toAltitude(), 1];\n        vec4.transformMat4(p, p, this.pixelMatrix);\n        return p[3] > 0 ?\n            new Point(p[0] / p[3], p[1] / p[3]) :\n            new Point(Number.MAX_VALUE, Number.MAX_VALUE);\n    }\n\n    // In Globe, conic and thematic projections, Lng/Lat extremes are not always at corners.\n    // This function additionally checks each screen edge midpoint.\n    // While midpoints continue to be extremes, it recursively checks midpoints of smaller segments.\n    _getBoundsNonRectangular(): LngLatBounds {\n        assert(!this.projection.supportsWorldCopies, \"Rectangular projections should use the simpler _getBoundsRectangular\");\n        const {top, left} = this._edgeInsets;\n        const bottom = this.height - this._edgeInsets.bottom;\n        const right = this.width - this._edgeInsets.right;\n\n        const tl = this.pointLocation3D(new Point(left, top));\n        const tr = this.pointLocation3D(new Point(right, top));\n        const br = this.pointLocation3D(new Point(right, bottom));\n        const bl = this.pointLocation3D(new Point(left, bottom));\n\n        let west = Math.min(tl.lng, tr.lng, br.lng, bl.lng);\n        let east = Math.max(tl.lng, tr.lng, br.lng, bl.lng);\n        let south = Math.min(tl.lat, tr.lat, br.lat, bl.lat);\n        let north = Math.max(tl.lat, tr.lat, br.lat, bl.lat);\n\n        // we pick an error threshold for calculating the bbox that balances between performance and precision\n        // Roughly emulating behavior of maxErr in tile_transform.js\n        const s = Math.pow(2, -this.zoom);\n        const maxErr = s / 16 * 270; // 270 = avg(180, 360) i.e. rough conversion between Mercator coords and Lat/Lng\n\n        // We check a minimum of 15 points on each side for Albers, etc.\n        // We check a minmum of one midpoint on each side per globe.\n        // Globe checks require raytracing and are slower\n        // and mising area near the horizon is highly compressed so not noticeable\n        const minRecursions = this.projection.name === \"globe\" ? 1 : 4;\n\n        const processSegment = (ax: number, ay: number, bx: number, by: number, depth: number) => {\n            const mx = (ax + bx) / 2;\n            const my = (ay + by) / 2;\n\n            const p = new Point(mx, my);\n            const {lng, lat} = this.pointLocation3D(p);\n\n            // The error metric is the maximum change to bounds from a given point\n            const err = Math.max(0, west - lng, south - lat, lng - east, lat - north);\n\n            west = Math.min(west, lng);\n            east = Math.max(east, lng);\n            south = Math.min(south, lat);\n            north = Math.max(north, lat);\n\n            if (depth < minRecursions || err > maxErr) {\n                processSegment(ax, ay, mx, my, depth + 1);\n                processSegment(mx, my, bx, by, depth + 1);\n            }\n        };\n\n        processSegment(left, top, right, top, 1);\n        processSegment(right, top, right, bottom, 1);\n        processSegment(right, bottom, left, bottom, 1);\n        processSegment(left, bottom, left, top, 1);\n\n        if (this.projection.name === \"globe\") {\n            const [northPoleIsVisible, southPoleIsVisible] = polesInViewport(this);\n            if (northPoleIsVisible) {\n                north = 90;\n                east = 180;\n                west = -180;\n            } else if (southPoleIsVisible) {\n                south = -90;\n                east = 180;\n                west = -180;\n            }\n        }\n\n        return new LngLatBounds(new LngLat(west, south), new LngLat(east, north));\n    }\n\n    _getBoundsRectangular(min: number, max: number): LngLatBounds {\n        assert(this.projection.supportsWorldCopies, \"_getBoundsRectangular only checks corners and works only on rectangular projections. Other projections should use _getBoundsNonRectangular\");\n\n        const {top, left} = this._edgeInsets;\n        const bottom = this.height - this._edgeInsets.bottom;\n        const right = this.width - this._edgeInsets.right;\n\n        const topLeft = new Point(left, top);\n        const topRight = new Point(right, top);\n        const bottomRight = new Point(right, bottom);\n        const bottomLeft = new Point(left, bottom);\n\n        // Consider far points at the maximum possible elevation\n        // and near points at the minimum to ensure full coverage.\n        let tl = this.pointCoordinate(topLeft, min);\n        let tr = this.pointCoordinate(topRight, min);\n        const br = this.pointCoordinate(bottomRight, max);\n        const bl = this.pointCoordinate(bottomLeft, max);\n\n        // If map pitch places top corners off map edge (latitude > 90 or < -90),\n        // place them at the intersection between the left/right screen edge and map edge.\n        const slope = (p1: MercatorCoordinate, p2: MercatorCoordinate) => (p2.y - p1.y) / (p2.x - p1.x);\n\n        if (tl.y > 1 && tr.y >= 0) tl = new MercatorCoordinate((1 - bl.y) / slope(bl, tl) + bl.x, 1);\n        else if (tl.y < 0 && tr.y <= 1) tl = new MercatorCoordinate(-bl.y / slope(bl, tl) + bl.x, 0);\n\n        if (tr.y > 1 && tl.y >= 0) tr = new MercatorCoordinate((1 - br.y) / slope(br, tr) + br.x, 1);\n        else if (tr.y < 0 && tl.y <= 1) tr = new MercatorCoordinate(-br.y / slope(br, tr) + br.x, 0);\n\n        return new LngLatBounds()\n            .extend(this.coordinateLocation(tl))\n            .extend(this.coordinateLocation(tr))\n            .extend(this.coordinateLocation(bl))\n            .extend(this.coordinateLocation(br));\n    }\n\n    _getBoundsRectangularTerrain(): LngLatBounds {\n        assert(this.elevation);\n        const elevation = ((this.elevation: any): Elevation);\n        if (!elevation.visibleDemTiles.length || elevation.isUsingMockSource()) { return this._getBoundsRectangular(0, 0); }\n        const minmax = elevation.visibleDemTiles.reduce((acc, t) => {\n            if (t.dem) {\n                const tree = t.dem.tree;\n                acc.min = Math.min(acc.min, tree.minimums[0]);\n                acc.max = Math.max(acc.max, tree.maximums[0]);\n            }\n            return acc;\n        }, {min: Number.MAX_VALUE, max: 0});\n        assert(minmax.min !== Number.MAX_VALUE);\n        return this._getBoundsRectangular(minmax.min * elevation.exaggeration(), minmax.max * elevation.exaggeration());\n    }\n\n    /**\n     * Returns the map's geographical bounds. When the bearing or pitch is non-zero, the visible region is not\n     * an axis-aligned rectangle, and the result is the smallest bounds that encompasses the visible region.\n     *\n     * @returns {LngLatBounds} Returns a {@link LngLatBounds} object describing the map's geographical bounds.\n     */\n    getBounds(): LngLatBounds {\n        if (this.projection.name === 'mercator' || this.projection.name === 'equirectangular') {\n            if (this._terrainEnabled()) return this._getBoundsRectangularTerrain();\n            return this._getBoundsRectangular(0, 0);\n        }\n        return this._getBoundsNonRectangular();\n    }\n\n    /**\n     * Returns position of horizon line from the top of the map in pixels.\n     * If horizon is not visible, returns 0 by default or a negative value if called with clampToTop = false.\n     * @private\n     */\n    horizonLineFromTop(clampToTop: boolean = true): number {\n        // h is height of space above map center to horizon.\n        const h = this.height / 2 / Math.tan(this._fov / 2) / Math.tan(Math.max(this._pitch, 0.1)) - this.centerOffset.y;\n        const offset = this.height / 2 - h * (1 - this._horizonShift);\n        return clampToTop ? Math.max(0, offset) : offset;\n    }\n\n    /**\n     * Returns the maximum geographical bounds the map is constrained to, or `null` if none set.\n     * @returns {LngLatBounds} {@link LngLatBounds}.\n     */\n    getMaxBounds(): ?LngLatBounds {\n        return this.maxBounds;\n    }\n\n    /**\n     * Sets or clears the map's geographical constraints.\n     *\n     * @param {LngLatBounds} bounds A {@link LngLatBounds} object describing the new geographic boundaries of the map.\n     */\n    setMaxBounds(bounds: ?LngLatBounds) {\n        this.maxBounds = bounds;\n\n        this.minLat = -MAX_MERCATOR_LATITUDE;\n        this.maxLat = MAX_MERCATOR_LATITUDE;\n        this.minLng = -180;\n        this.maxLng = 180;\n\n        if (bounds) {\n            this.minLat = bounds.getSouth();\n            this.maxLat = bounds.getNorth();\n            this.minLng = bounds.getWest();\n            this.maxLng = bounds.getEast();\n            if (this.maxLng < this.minLng) this.maxLng += 360;\n        }\n\n        this.worldMinX = mercatorXfromLng(this.minLng) * this.tileSize;\n        this.worldMaxX = mercatorXfromLng(this.maxLng) * this.tileSize;\n        this.worldMinY = mercatorYfromLat(this.maxLat) * this.tileSize;\n        this.worldMaxY = mercatorYfromLat(this.minLat) * this.tileSize;\n\n        this._constrain();\n    }\n\n    calculatePosMatrix(unwrappedTileID: UnwrappedTileID, worldSize: number): Float64Array {\n        return this.projection.createTileMatrix(this, worldSize, unwrappedTileID);\n    }\n\n    calculateDistanceTileData(unwrappedTileID: UnwrappedTileID): FeatureDistanceData {\n        const distanceDataKey = unwrappedTileID.key;\n        const cache = this._distanceTileDataCache;\n        if (cache[distanceDataKey]) {\n            return cache[distanceDataKey];\n        }\n\n        //Calculate the offset of the tile\n        const canonical = unwrappedTileID.canonical;\n        const windowScaleFactor = 1 / this.height;\n        const cws = this.cameraWorldSize;\n        const scale = cws / this.zoomScale(canonical.z);\n        const unwrappedX = canonical.x + Math.pow(2, canonical.z) * unwrappedTileID.wrap;\n        const tX = unwrappedX * scale;\n        const tY = canonical.y * scale;\n\n        const center = this.point;\n        // center is in world/pixel coordinate, ensure it's in the same coordinate space as tX and tY computed earlier.\n        center.x *= cws / this.worldSize;\n        center.y *= cws / this.worldSize;\n\n        // Calculate the bearing vector by rotating unit vector [0, -1] clockwise\n        const angle = this.angle;\n        const bX = Math.sin(-angle);\n        const bY = -Math.cos(-angle);\n\n        const cX = (center.x - tX) * windowScaleFactor;\n        const cY = (center.y - tY) * windowScaleFactor;\n        cache[distanceDataKey] = {\n            bearing: [bX, bY],\n            center: [cX, cY],\n            scale: (scale / EXTENT) * windowScaleFactor\n        };\n\n        return cache[distanceDataKey];\n    }\n\n    /**\n     * Calculate the fogTileMatrix that, given a tile coordinate, can be used to\n     * calculate its position relative to the camera in units of pixels divided\n     * by the map height. Used with fog for consistent computation of distance\n     * from camera.\n     *\n     * @param {UnwrappedTileID} unwrappedTileID;\n     * @private\n     */\n    calculateFogTileMatrix(unwrappedTileID: UnwrappedTileID): Float32Array {\n        const fogTileMatrixKey = unwrappedTileID.key;\n        const cache = this._fogTileMatrixCache;\n        if (cache[fogTileMatrixKey]) {\n            return cache[fogTileMatrixKey];\n        }\n\n        const posMatrix = this.projection.createTileMatrix(this, this.cameraWorldSizeForFog, unwrappedTileID);\n        mat4.multiply(posMatrix, this.worldToFogMatrix, posMatrix);\n\n        cache[fogTileMatrixKey] = new Float32Array(posMatrix);\n        return cache[fogTileMatrixKey];\n    }\n\n    /**\n     * Calculate the projMatrix that, given a tile coordinate, would be used to display the tile on the screen.\n     * @param {UnwrappedTileID} unwrappedTileID;\n     * @private\n     */\n    calculateProjMatrix(unwrappedTileID: UnwrappedTileID, aligned: boolean = false, expanded: boolean = false): Float32Array {\n        const projMatrixKey = unwrappedTileID.key;\n        let cache;\n        if (expanded) {\n            cache = this._expandedProjMatrixCache;\n        } else if (aligned) {\n            cache = this._alignedProjMatrixCache;\n        } else {\n            cache = this._projMatrixCache;\n        }\n        if (cache[projMatrixKey]) {\n            return cache[projMatrixKey];\n        }\n\n        const posMatrix = this.calculatePosMatrix(unwrappedTileID, this.worldSize);\n        let projMatrix;\n        if (this.projection.isReprojectedInTileSpace) {\n            projMatrix = this.mercatorMatrix;\n        } else if (expanded) {\n            assert(!aligned);\n            projMatrix = this.expandedFarZProjMatrix;\n        } else {\n            projMatrix = aligned ? this.alignedProjMatrix : this.projMatrix;\n        }\n        mat4.multiply(posMatrix, projMatrix, posMatrix);\n\n        cache[projMatrixKey] = new Float32Array(posMatrix);\n        return cache[projMatrixKey];\n    }\n\n    calculatePixelsToTileUnitsMatrix(tile: Tile): Float32Array {\n        const key = tile.tileID.key;\n        const cache = this._pixelsToTileUnitsCache;\n        if (cache[key]) {\n            return cache[key];\n        }\n\n        const matrix = getPixelsToTileUnitsMatrix(tile, this);\n        cache[key] = matrix;\n        return cache[key];\n    }\n\n    customLayerMatrix(): Array<number> {\n        return this.mercatorMatrix.slice();\n    }\n\n    globeToMercatorMatrix(): ?Array<number> {\n        if (this.projection.name === 'globe') {\n            const pixelsToMerc = 1 / this.worldSize;\n            const m = mat4.fromScaling([], [pixelsToMerc, pixelsToMerc, pixelsToMerc]);\n            mat4.multiply(m, m, this.globeMatrix);\n            return m;\n        }\n        return undefined;\n    }\n\n    recenterOnTerrain() {\n        if (!this._elevation || this.projection.name === 'globe')\n            return;\n\n        const elevation: Elevation = this._elevation;\n        this._updateCameraState();\n\n        // Cast a ray towards the sea level and find the intersection point with the terrain.\n        // We need to use a camera position that exists in the same coordinate space as the data.\n        // The default camera position might have been compensated by the active projection model.\n        const mercPixelsPerMeter = mercatorZfromAltitude(1, this._center.lat) * this.worldSize;\n        const start = this._computeCameraPosition(mercPixelsPerMeter);\n        const dir = this._camera.forward();\n\n        // The raycast function expects z-component to be in meters\n        const metersToMerc = mercatorZfromAltitude(1.0, this._center.lat);\n        start[2] /= metersToMerc;\n        dir[2] /= metersToMerc;\n        vec3.normalize(dir, dir);\n\n        const t = elevation.raycast(start, dir, elevation.exaggeration());\n\n        if (t) {\n            const point = vec3.scaleAndAdd([], start, dir, t);\n            const newCenter = new MercatorCoordinate(point[0], point[1], mercatorZfromAltitude(point[2], latFromMercatorY(point[1])));\n\n            const camToNew = [newCenter.x - start[0], newCenter.y - start[1], newCenter.z - start[2] * metersToMerc];\n            const maxAltitude = (newCenter.z + vec3.length(camToNew)) * this._pixelsPerMercatorPixel;\n            this._seaLevelZoom = this._zoomFromMercatorZ(maxAltitude);\n\n            // Camera zoom has to be updated as the orbit distance might have changed\n            this._centerAltitude = newCenter.toAltitude();\n            this._center = this.coordinateLocation(newCenter);\n            this._updateZoomFromElevation();\n            this._constrain();\n            this._calcMatrices();\n        }\n    }\n\n    _constrainCamera(adaptCameraAltitude: boolean = false) {\n        if (!this._elevation)\n            return;\n\n        const elevation: Elevation = this._elevation;\n\n        // Find uncompensated camera position for elevation sampling.\n        // The default camera position might have been compensated by the active projection model.\n        const mercPixelsPerMeter = mercatorZfromAltitude(1, this._center.lat) * this.worldSize;\n        const pos = this._computeCameraPosition(mercPixelsPerMeter);\n        const elevationAtCamera = elevation.getAtPointOrZero(new MercatorCoordinate(...pos));\n        const terrainElevation = this.pixelsPerMeter / this.worldSize * elevationAtCamera;\n        const minHeight = this._minimumHeightOverTerrain();\n        const cameraHeight = pos[2] - terrainElevation;\n\n        if (cameraHeight <= minHeight) {\n            if (cameraHeight < 0 || adaptCameraAltitude) {\n                const center = this.locationCoordinate(this._center, this._centerAltitude);\n                const cameraToCenter = [pos[0], pos[1], center.z - pos[2]];\n\n                const prevDistToCamera = vec3.length(cameraToCenter);\n                // Adjust the camera vector so that the camera is placed above the terrain.\n                // Distance between the camera and the center point is kept constant.\n                cameraToCenter[2] -= (minHeight - cameraHeight) / this._pixelsPerMercatorPixel;\n                const newDistToCamera = vec3.length(cameraToCenter);\n\n                if (newDistToCamera === 0)\n                    return;\n\n                vec3.scale(cameraToCenter, cameraToCenter, prevDistToCamera / newDistToCamera * this._pixelsPerMercatorPixel);\n                this._camera.position = [pos[0], pos[1], center.z * this._pixelsPerMercatorPixel - cameraToCenter[2]];\n                this._updateStateFromCamera();\n            } else {\n                this._isCameraConstrained = true;\n            }\n        }\n    }\n\n    _constrain() {\n        if (!this.center || !this.width || !this.height || this._constraining) return;\n\n        this._constraining = true;\n        const isGlobe = this.projection.name === 'globe' || this.mercatorFromTransition;\n\n        // alternate constraining for non-Mercator projections\n        if (this.projection.isReprojectedInTileSpace || isGlobe) {\n            const center = this.center;\n            center.lat = clamp(center.lat, this.minLat, this.maxLat);\n            if (this.maxBounds || !(this.renderWorldCopies || isGlobe)) center.lng = clamp(center.lng, this.minLng, this.maxLng);\n            this.center = center;\n            this._constraining = false;\n            return;\n        }\n\n        const unmodified = this._unmodified;\n        const {x, y} = this.point;\n        let s = 0;\n        let x2 = x;\n        let y2 = y;\n        const w2 = this.width / 2;\n        const h2 = this.height / 2;\n\n        const minY = this.worldMinY * this.scale;\n        const maxY = this.worldMaxY * this.scale;\n        if (y - h2 < minY) y2 = minY + h2;\n        if (y + h2 > maxY) y2 = maxY - h2;\n        if (maxY - minY < this.height) {\n            s = Math.max(s, this.height / (maxY - minY));\n            y2 = (maxY + minY) / 2;\n        }\n\n        if (this.maxBounds || !this._renderWorldCopies || !this.projection.wrap) {\n            const minX = this.worldMinX * this.scale;\n            const maxX = this.worldMaxX * this.scale;\n\n            // Translate to positive positions with the map center in the center position.\n            // This ensures that the map snaps to the correct edge.\n            const shift = this.worldSize / 2 - (minX + maxX) / 2;\n            x2 = (x + shift + this.worldSize) % this.worldSize - shift;\n\n            if (x2 - w2 < minX) x2 = minX + w2;\n            if (x2 + w2 > maxX) x2 = maxX - w2;\n            if (maxX - minX < this.width) {\n                s = Math.max(s, this.width / (maxX - minX));\n                x2 = (maxX + minX) / 2;\n            }\n        }\n\n        if (x2 !== x || y2 !== y) { // pan the map to fit the range\n            this.center = this.unproject(new Point(x2, y2));\n        }\n        if (s) { // scale the map to fit the range\n            this.zoom += this.scaleZoom(s);\n        }\n\n        this._constrainCamera();\n        this._unmodified = unmodified;\n        this._constraining = false;\n    }\n\n    /**\n     * Returns the minimum zoom at which `this.width` can fit max longitude range\n     * and `this.height` can fit max latitude range.\n     *\n     * @returns {number} The zoom value.\n     */\n    _minZoomForBounds(): number {\n        let minZoom = Math.max(0, this.scaleZoom(this.height / (this.worldMaxY - this.worldMinY)));\n        if (this.maxBounds) {\n            minZoom = Math.max(minZoom, this.scaleZoom(this.width / (this.worldMaxX - this.worldMinX)));\n        }\n        return minZoom;\n    }\n\n    /**\n     * Returns the maximum distance of the camera from the center of the bounds, such that\n     * `this.width` can fit max longitude range and `this.height` can fit max latitude range.\n     * In mercator units.\n     *\n     * @returns {number} The mercator z coordinate.\n     */\n    _maxCameraBoundsDistance(): number {\n        return this._mercatorZfromZoom(this._minZoomForBounds());\n    }\n\n    _calcMatrices(): void {\n        if (!this.height) return;\n\n        const offset = this.centerOffset;\n        const isGlobe = this.projection.name === 'globe';\n\n        // Z-axis uses pixel coordinates when globe mode is enabled\n        const pixelsPerMeter = this.pixelsPerMeter;\n\n        if (this.projection.name === 'globe') {\n            this._mercatorScaleRatio = mercatorZfromAltitude(1, this.center.lat) / mercatorZfromAltitude(1, GLOBE_SCALE_MATCH_LATITUDE);\n        }\n\n        const projectionT = getProjectionInterpolationT(this.projection, this.zoom, this.width, this.height, 1024);\n\n        // 'this._pixelsPerMercatorPixel' is the ratio between pixelsPerMeter in the current projection relative to Mercator.\n        // This is useful for converting e.g. camera position between pixel spaces as some logic\n        // such as raycasting expects the scale to be in mercator pixels\n        this._pixelsPerMercatorPixel = this.projection.pixelSpaceConversion(this.center.lat, this.worldSize, projectionT);\n\n        this.cameraToCenterDistance = 0.5 / Math.tan(this._fov * 0.5) * this.height * this._pixelsPerMercatorPixel;\n\n        this._updateCameraState();\n\n        this._farZ = this.projection.farthestPixelDistance(this);\n\n        // The larger the value of nearZ is\n        // - the more depth precision is available for features (good)\n        // - clipping starts appearing sooner when the camera is close to 3d features (bad)\n        //\n        // Smaller values worked well for mapbox-gl-js but deckgl was encountering precision issues\n        // when rendering it's layers using custom layers. This value was experimentally chosen and\n        // seems to solve z-fighting issues in deckgl while not clipping buildings too close to the camera.\n        this._nearZ = this.height / 50;\n\n        const zUnit = this.projection.zAxisUnit === \"meters\" ? pixelsPerMeter : 1.0;\n        const worldToCamera = this._camera.getWorldToCamera(this.worldSize, zUnit);\n\n        let cameraToClip;\n\n        const cameraToClipPerspective = this._camera.getCameraToClipPerspective(this._fov, this.width / this.height, this._nearZ, this._farZ);\n        // Apply offset/padding\n        cameraToClipPerspective[8] = -offset.x * 2 / this.width;\n        cameraToClipPerspective[9] = offset.y * 2 / this.height;\n\n        if (this.isOrthographic) {\n            const cameraToCenterDistance =  0.5 * this.height / Math.tan(this._fov / 2.0) * 1.0;\n\n            // Calculate bounds for orthographic view\n            let top = cameraToCenterDistance * Math.tan(this._fov * 0.5);\n            let right = top * this.aspect;\n            let left = -right;\n            let bottom = -top;\n            // Apply offset/padding\n            right -= offset.x;\n            left -= offset.x;\n            top += offset.y;\n            bottom += offset.y;\n\n            cameraToClip = this._camera.getCameraToClipOrthographic(left, right, bottom, top, this._nearZ, this._farZ);\n\n            const mixValue =\n                this.pitch >= OrthographicPitchTranstionValue ? 1.0 : this.pitch / OrthographicPitchTranstionValue;\n            lerpMatrix(cameraToClip, cameraToClip, cameraToClipPerspective, easeIn(mixValue));\n        } else {\n            cameraToClip = cameraToClipPerspective;\n        }\n\n        const worldToClipPerspective: Array<number> | Float32Array | Float64Array = mat4.mul([], cameraToClipPerspective, worldToCamera);\n        let m: Array<number> | Float32Array | Float64Array = mat4.mul([], cameraToClip, worldToCamera);\n\n        if (this.projection.isReprojectedInTileSpace) {\n            // Projections undistort as you zoom in (shear, scale, rotate).\n            // Apply the undistortion around the center of the map.\n            const mc = this.locationCoordinate(this.center);\n            const adjustments = mat4.identity([]);\n            mat4.translate(adjustments, adjustments, [mc.x * this.worldSize, mc.y * this.worldSize, 0]);\n            mat4.multiply(adjustments, adjustments, getProjectionAdjustments(this));\n            mat4.translate(adjustments, adjustments, [-mc.x * this.worldSize, -mc.y * this.worldSize, 0]);\n            mat4.multiply(m, m, adjustments);\n            mat4.multiply(worldToClipPerspective, worldToClipPerspective, adjustments);\n            this.inverseAdjustmentMatrix = getProjectionAdjustmentInverted(this);\n        } else {\n            this.inverseAdjustmentMatrix = [1, 0, 0, 1];\n        }\n\n        // The mercatorMatrix can be used to transform points from mercator coordinates\n        // ([0, 0] nw, [1, 1] se) to GL coordinates. / zUnit compensates for scaling done in worldToCamera.\n        this.mercatorMatrix = mat4.scale([], m, [this.worldSize, this.worldSize, this.worldSize / zUnit, 1.0]);\n\n        this.projMatrix = m;\n\n        // For tile cover calculation, use inverted of base (non elevated) matrix\n        // as tile elevations are in tile coordinates and relative to center elevation.\n        this.invProjMatrix = mat4.invert(new Float64Array(16), this.projMatrix);\n\n        if (isGlobe) {\n            const expandedCameraToClipPerspective = this._camera.getCameraToClipPerspective(this._fov, this.width / this.height, this._nearZ, Infinity);\n            expandedCameraToClipPerspective[8] = -offset.x * 2 / this.width;\n            expandedCameraToClipPerspective[9] = offset.y * 2 / this.height;\n            this.expandedFarZProjMatrix = mat4.mul([], expandedCameraToClipPerspective, worldToCamera);\n        } else {\n            this.expandedFarZProjMatrix = this.projMatrix;\n        }\n\n        const clipToCamera = mat4.invert([], cameraToClip);\n        this.frustumCorners = FrustumCorners.fromInvProjectionMatrix(clipToCamera, this.horizonLineFromTop(), this.height);\n\n        // Create a camera frustum in mercator units\n        this.cameraFrustum = Frustum.fromInvProjectionMatrix(this.invProjMatrix, this.worldSize, 0.0, !isGlobe);\n\n        const view = new Float32Array(16);\n        mat4.identity(view);\n        mat4.scale(view, view, [1, -1, 1]);\n        mat4.rotateX(view, view, this._pitch);\n        mat4.rotateZ(view, view, this.angle);\n\n        const projection = mat4.perspective(new Float32Array(16), this._fov, this.width / this.height, this._nearZ, this._farZ);\n\n        this.starsProjMatrix = mat4.clone(projection);\n\n        // The distance in pixels the skybox needs to be shifted down by to meet the shifted horizon.\n        const skyboxHorizonShift = (Math.PI / 2 - this._pitch) * (this.height / this._fov) * this._horizonShift;\n        // Apply center of perspective offset to skybox projection\n        projection[8] = -offset.x * 2 / this.width;\n        projection[9] = (offset.y + skyboxHorizonShift) * 2 / this.height;\n        this.skyboxMatrix = mat4.multiply(view, projection, view);\n\n        // Make a second projection matrix that is aligned to a pixel grid for rendering raster tiles.\n        // We're rounding the (floating point) x/y values to achieve to avoid rendering raster images to fractional\n        // coordinates. Additionally, we adjust by half a pixel in either direction in case that viewport dimension\n        // is an odd integer to preserve rendering to the pixel grid. We're rotating this shift based on the angle\n        // of the transformation so that 0°, 90°, 180°, and 270° rasters are crisp, and adjust the shift so that\n        // it is always <= 0.5 pixels.\n        const point = this.point;\n        const x = point.x, y = point.y;\n        const xShift = (this.width % 2) / 2, yShift = (this.height % 2) / 2,\n            angleCos = Math.cos(this.angle), angleSin = Math.sin(this.angle),\n            dx = x - Math.round(x) + angleCos * xShift + angleSin * yShift,\n            dy = y - Math.round(y) + angleCos * yShift + angleSin * xShift;\n        const alignedM = new Float64Array(m);\n        mat4.translate(alignedM, alignedM, [ dx > 0.5 ? dx - 1 : dx, dy > 0.5 ? dy - 1 : dy, 0 ]);\n        this.alignedProjMatrix = alignedM;\n\n        m = mat4.create();\n        mat4.scale(m, m, [this.width / 2, -this.height / 2, 1]);\n        mat4.translate(m, m, [1, -1, 0]);\n        this.labelPlaneMatrix = m;\n\n        m = mat4.create();\n        mat4.scale(m, m, [1, -1, 1]);\n        mat4.translate(m, m, [-1, -1, 0]);\n        mat4.scale(m, m, [2 / this.width, 2 / this.height, 1]);\n        this.glCoordMatrix = m;\n\n        // matrix for conversion from location to screen coordinates\n        this.pixelMatrix = mat4.multiply(new Float64Array(16), this.labelPlaneMatrix, worldToClipPerspective);\n\n        this._calcFogMatrices();\n        this._distanceTileDataCache = {};\n\n        // inverse matrix for conversion from screen coordinates to location\n        m = mat4.invert(new Float64Array(16), this.pixelMatrix);\n        if (!m) throw new Error(\"failed to invert matrix\");\n        this.pixelMatrixInverse = m;\n\n        if (this.projection.name === 'globe' || this.mercatorFromTransition) {\n            this.globeMatrix = calculateGlobeMatrix(this);\n\n            const globeCenter = [this.globeMatrix[12], this.globeMatrix[13], this.globeMatrix[14]];\n\n            this.globeCenterInViewSpace = vec3.transformMat4(globeCenter, globeCenter, worldToCamera);\n            this.globeRadius = this.worldSize / 2.0 / Math.PI - 1.0;\n        } else {\n            this.globeMatrix = m;\n        }\n\n        this._projMatrixCache = {};\n        this._alignedProjMatrixCache = {};\n        this._pixelsToTileUnitsCache = {};\n        this._expandedProjMatrixCache = {};\n    }\n\n    _calcFogMatrices() {\n        this._fogTileMatrixCache = {};\n\n        const cameraWorldSizeForFog = this.cameraWorldSizeForFog;\n        const cameraPixelsPerMeter = this.cameraPixelsPerMeter;\n        const cameraPos = this._camera.position;\n\n        // The mercator fog matrix encodes transformation necessary to transform a position to camera fog space (in meters):\n        // translates p to camera origin and transforms it from pixels to meters. The windowScaleFactor is used to have a\n        // consistent transformation across different window sizes.\n        // - p = p - cameraOrigin\n        // - p.xy = p.xy * cameraWorldSizeForFog * windowScaleFactor\n        // - p.z  = p.z  * cameraPixelsPerMeter * windowScaleFactor\n        const windowScaleFactor = 1 / this.height / this._pixelsPerMercatorPixel;\n        const metersToPixel = [cameraWorldSizeForFog, cameraWorldSizeForFog, cameraPixelsPerMeter];\n        vec3.scale(metersToPixel, metersToPixel, windowScaleFactor);\n        vec3.scale(cameraPos, cameraPos, -1);\n        vec3.multiply(cameraPos, cameraPos, metersToPixel);\n\n        const m = mat4.create();\n        mat4.translate(m, m, cameraPos);\n        mat4.scale(m, m, metersToPixel);\n        this.mercatorFogMatrix = m;\n\n        // The worldToFogMatrix can be used for conversion from world coordinates to relative camera position in\n        // units of fractions of the map height. Later composed with tile position to construct the fog tile matrix.\n        this.worldToFogMatrix = this._camera.getWorldToCameraPosition(cameraWorldSizeForFog, cameraPixelsPerMeter, windowScaleFactor);\n    }\n\n    _computeCameraPosition(targetPixelsPerMeter: ?number): Vec3 {\n        targetPixelsPerMeter = targetPixelsPerMeter || this.pixelsPerMeter;\n        const pixelSpaceConversion = targetPixelsPerMeter / this.pixelsPerMeter;\n\n        const dir = this._camera.forward();\n        const center = this.point;\n\n        // Compute camera position using the following vector math: camera.position = map.center - camera.forward * cameraToCenterDist\n        // Camera distance to the center can be found in mercator units by subtracting the center elevation from\n        // camera's zenith position (which can be deduced from the zoom level)\n        const zoom = this._seaLevelZoom ? this._seaLevelZoom : this._zoom;\n        const altitude = this._mercatorZfromZoom(zoom) * pixelSpaceConversion;\n        const distance = altitude - targetPixelsPerMeter / this.worldSize * this._centerAltitude;\n\n        return [\n            center.x / this.worldSize - dir[0] * distance,\n            center.y / this.worldSize - dir[1] * distance,\n            targetPixelsPerMeter / this.worldSize * this._centerAltitude - dir[2] * distance\n        ];\n    }\n\n    _updateCameraState() {\n        if (!this.height) return;\n\n        // Set camera orientation and move it to a proper distance from the map\n        this._camera.setPitchBearing(this._pitch, this.angle);\n        this._camera.position = this._computeCameraPosition();\n    }\n\n    /**\n     * Apply a 3d translation to the camera position, but clamping it so that\n     * it respects the maximum longitude and latitude range set.\n     *\n     * @param {vec3} translation The translation vector.\n     */\n    _translateCameraConstrained(translation: Vec3) {\n        const maxDistance = this._maxCameraBoundsDistance();\n        // Define a ceiling in mercator Z\n        const maxZ = maxDistance * Math.cos(this._pitch);\n        const z = this._camera.position[2];\n        const deltaZ = translation[2];\n        let t = 1;\n\n        if (this.projection.wrap) this.center = this.center.wrap();\n\n        // we only need to clamp if the camera is moving upwards\n        if (deltaZ > 0) {\n            t = Math.min((maxZ - z) / deltaZ, 1);\n        }\n\n        this._camera.position = vec3.scaleAndAdd([], this._camera.position, translation, t);\n        this._updateStateFromCamera();\n    }\n\n    _updateStateFromCamera() {\n        const position = this._camera.position;\n        const dir = this._camera.forward();\n        const {pitch, bearing} = this._camera.getPitchBearing();\n\n        // Compute zoom from the distance between camera and terrain\n        const centerAltitude = mercatorZfromAltitude(this._centerAltitude, this.center.lat) * this._pixelsPerMercatorPixel;\n        const minHeight = this._mercatorZfromZoom(this._maxZoom) * Math.cos(degToRad(this._maxPitch));\n        const height = Math.max((position[2] - centerAltitude) / Math.cos(pitch), minHeight);\n        const zoom = this._zoomFromMercatorZ(height);\n\n        // Cast a ray towards the ground to find the center point\n        vec3.scaleAndAdd(position, position, dir, height);\n\n        this._pitch = clamp(pitch, degToRad(this.minPitch), degToRad(this.maxPitch));\n        this.angle = wrap(bearing, -Math.PI, Math.PI);\n        this._setZoom(clamp(zoom, this._minZoom, this._maxZoom));\n        this._updateSeaLevelZoom();\n\n        this._center = this.coordinateLocation(new MercatorCoordinate(position[0], position[1], position[2]));\n        this._unmodified = false;\n        this._constrain();\n        this._calcMatrices();\n    }\n\n    _worldSizeFromZoom(zoom: number): number {\n        return Math.pow(2.0, zoom) * this.tileSize;\n    }\n\n    _mercatorZfromZoom(zoom: number): number {\n        return this.cameraToCenterDistance / this._worldSizeFromZoom(zoom);\n    }\n\n    _minimumHeightOverTerrain(): number {\n        // Determine minimum height for the camera over the terrain related to current zoom.\n        // Values above 4 allow camera closer to e.g. top of the hill, exposing\n        // drape raster overscale artifacts or cut terrain (see under it) as it gets clipped on\n        // near plane. Returned value is in mercator coordinates.\n        const MAX_DRAPE_OVERZOOM = 4;\n        const zoom = Math.min((this._seaLevelZoom != null ? this._seaLevelZoom : this._zoom), this._maxZoom) + MAX_DRAPE_OVERZOOM;\n        return this._mercatorZfromZoom(zoom);\n    }\n\n    _zoomFromMercatorZ(z: number): number {\n        return this.scaleZoom(this.cameraToCenterDistance / (z * this.tileSize));\n    }\n\n    // This function is helpful to approximate true zoom given a mercator height with varying ppm.\n    // With Globe, since we use a fixed reference latitude at lower zoom levels and transition between this\n    // latitude and the center's latitude as you zoom in, camera to center distance varies dynamically.\n    // As the cameraToCenterDistance is a function of zoom, we need to approximate the true zoom\n    // given a mercator meter value in order to eliminate the zoom/cameraToCenterDistance dependency.\n    zoomFromMercatorZAdjusted(mercatorZ: number): number {\n        assert(this.projection.name === 'globe');\n        assert(mercatorZ !== 0);\n\n        let zoomLow = 0;\n        let zoomHigh = GLOBE_ZOOM_THRESHOLD_MAX;\n        let zoom = 0;\n        let minZoomDiff = Infinity;\n\n        const epsilon = 1e-6;\n\n        while (zoomHigh - zoomLow > epsilon && zoomHigh > zoomLow) {\n            const zoomMid = zoomLow + (zoomHigh - zoomLow) * 0.5;\n\n            const worldSize = this.tileSize * Math.pow(2, zoomMid);\n            const d = this.getCameraToCenterDistance(this.projection, zoomMid, worldSize);\n            const newZoom = this.scaleZoom(d / (mercatorZ * this.tileSize));\n\n            const diff = Math.abs(zoomMid - newZoom);\n\n            if (diff < minZoomDiff) {\n                minZoomDiff = diff;\n                zoom = zoomMid;\n            }\n\n            if (zoomMid < newZoom) {\n                zoomLow = zoomMid;\n            } else {\n                zoomHigh = zoomMid;\n            }\n        }\n\n        return zoom;\n    }\n\n    _terrainEnabled(): boolean {\n        if (!this._elevation) return false;\n        if (!this.projection.supportsTerrain) {\n            warnOnce('Terrain is not yet supported with alternate projections. Use mercator or globe to enable terrain.');\n            return false;\n        }\n        return true;\n    }\n\n    // Check if any of the four corners are off the edge of the rendered map\n    // This function will return `false` for all non-mercator projection\n    anyCornerOffEdge(p0: Point, p1: Point): boolean {\n        const minX = Math.min(p0.x, p1.x);\n        const maxX = Math.max(p0.x, p1.x);\n        const minY = Math.min(p0.y, p1.y);\n        const maxY = Math.max(p0.y, p1.y);\n\n        const horizon = this.horizonLineFromTop(false);\n        if (minY < horizon) return true;\n\n        if (this.projection.name !== 'mercator') {\n            return false;\n        }\n\n        const min = new Point(minX, minY);\n        const max = new Point(maxX, maxY);\n\n        const corners = [\n            min, max,\n            new Point(minX, maxY),\n            new Point(maxX, minY),\n        ];\n\n        const minWX = (this.renderWorldCopies) ? -NUM_WORLD_COPIES : 0;\n        const maxWX = (this.renderWorldCopies) ? 1 + NUM_WORLD_COPIES : 1;\n        const minWY = 0;\n        const maxWY = 1;\n\n        for (const corner of corners) {\n            const rayIntersection = this.pointRayIntersection(corner);\n            // Point is above the horizon\n            if (rayIntersection.t < 0) {\n                return true;\n            }\n            // Point is off the bondaries of the map\n            const coordinate = this.rayIntersectionCoordinate(rayIntersection);\n            if (coordinate.x < minWX || coordinate.y < minWY ||\n                coordinate.x > maxWX || coordinate.y > maxWY) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    // Checks the four corners of the frustum to see if they lie in the map's quad.\n    //\n    isHorizonVisible(): boolean {\n\n        // we consider the horizon as visible if the angle between\n        // a the top plane of the frustum and the map plane is smaller than this threshold.\n        const horizonAngleEpsilon = 2;\n        if (this.pitch + radToDeg(this.fovAboveCenter) > (90 - horizonAngleEpsilon)) {\n            return true;\n        }\n\n        return this.anyCornerOffEdge(new Point(0, 0), new Point(this.width, this.height));\n    }\n\n    /**\n     * Converts a zoom delta value into a physical distance travelled in web mercator coordinates.\n     *\n     * @param {vec3} center Destination mercator point of the movement.\n     * @param {number} zoomDelta Change in the zoom value.\n     * @returns {number} The distance in mercator coordinates.\n     */\n    zoomDeltaToMovement(center: Vec3, zoomDelta: number): number {\n        const distance = vec3.length(vec3.sub([], this._camera.position, center));\n        const relativeZoom = this._zoomFromMercatorZ(distance) + zoomDelta;\n        return distance - this._mercatorZfromZoom(relativeZoom);\n    }\n\n    /*\n     * The camera looks at the map from a 3D (lng, lat, altitude) location. Let's use `cameraLocation`\n     * as the name for the location under the camera and on the surface of the earth (lng, lat, 0).\n     * `cameraPoint` is the projected position of the `cameraLocation`.\n     *\n     * This point is useful to us because only fill-extrusions that are between `cameraPoint` and\n     * the query point on the surface of the earth can extend and intersect the query.\n     *\n     * When the map is not pitched the `cameraPoint` is equivalent to the center of the map because\n     * the camera is right above the center of the map.\n     */\n    getCameraPoint(): Point {\n        if (this.projection.name === 'globe') {\n            // Find precise location of the projected camera position on the curved surface\n            const center = [this.globeMatrix[12], this.globeMatrix[13], this.globeMatrix[14]];\n            const pos = projectClamped(center, this.pixelMatrix);\n            return new Point(pos[0], pos[1]);\n        } else {\n            const pitch = this._pitch;\n            const yOffset = Math.tan(pitch) * (this.cameraToCenterDistance || 1);\n            return this.centerPoint.add(new Point(0, yOffset));\n        }\n    }\n\n    getCameraToCenterDistance(projection: Projection, zoom: number = this.zoom, worldSize: number = this.worldSize): number {\n        const t = getProjectionInterpolationT(projection, zoom, this.width, this.height, 1024);\n        const projectionScaler = projection.pixelSpaceConversion(this.center.lat, worldSize, t);\n        let distance =  0.5 / Math.tan(this._fov * 0.5) * this.height * projectionScaler;\n\n        // In case we have orthographic transition we need to interpolate the distance value in the range [1, distance]\n        // to calculate correct perspective ratio values for symbols\n        if (this.isOrthographic) {\n            const mixValue = this.pitch >= OrthographicPitchTranstionValue ? 1.0 : this.pitch / OrthographicPitchTranstionValue;\n            distance = lerp(1.0, distance, easeIn(mixValue));\n        }\n        return distance;\n    }\n\n    getWorldToCameraMatrix(): Mat4 {\n        const zUnit = this.projection.zAxisUnit === \"meters\" ? this.pixelsPerMeter : 1.0;\n        const worldToCamera = this._camera.getWorldToCamera(this.worldSize, zUnit);\n\n        if (this.projection.name === 'globe') {\n            mat4.multiply(worldToCamera, worldToCamera, this.globeMatrix);\n        }\n\n        return worldToCamera;\n    }\n\n    getFrustum(zoom: number): Frustum {\n        const zInMeters = this.projection.zAxisUnit === 'meters';\n        return Frustum.fromInvProjectionMatrix(this.invProjMatrix, this.worldSize, zoom, zInMeters);\n    }\n}\n\nexport default Transform;\n","// @flow\n\nconst TextureSlots = {\n    BaseColor : 5,\n    MetallicRoughness : 6,\n    Normal : 7,\n    Occlusion : 8,\n    Emission : 9,\n    ShadowMap0 : 10\n};\n\nexport default TextureSlots;\n","// @flow\n\nimport Context from '../gl/context.js';\nimport type {UniformValues} from './uniform_binding.js';\nimport {Uniform4f} from './uniform_binding.js';\nimport {smoothstep, warnOnce} from '../util/util.js';\nimport {MIN_LOD_PITCH} from '../geo/transform.js';\n\nimport type Painter from './painter.js';\n\nexport type CutoffUniformsType = {|\n    'u_cutoff_params': Uniform4f,\n|};\n\nexport type CutoffParams = {\n    shouldRenderCutoff: boolean;\n    uniformValues: UniformValues<CutoffUniformsType>;\n}\n\nexport const cutoffUniforms = (context: Context): CutoffUniformsType => ({\n    'u_cutoff_params': new Uniform4f(context),\n});\n\n// This function returns the parameters of the cutoff effect for the LOD content (before the tileCover shows lower zoom\n// level tiles)\n//\n// The first 2 values are the near and far plane distances in pixels, which are used to linearize the depth values of\n// the vertices after the projection\n//\n// The 3rd value is the distance from which the content will be hidden, which is relative to the range of the near and\n// far plane distance\n//\n// The 4th value is the distance where the linear fade out from value 3 should end\nexport const getCutoffParams = (\n    painter: Painter,\n    cutoffFadeRange: number\n): CutoffParams => {\n    if (cutoffFadeRange > 0.0 && painter.terrain)  {\n        // To be fixed: https://mapbox.atlassian.net/browse/MAPS3D-1034\n        warnOnce(\"Cutoff is currently disabled on terrain\");\n    }\n    if (cutoffFadeRange <= 0.0 || painter.terrain) {\n        return {\n            shouldRenderCutoff: false,\n            uniformValues: {\n                'u_cutoff_params': [0, 0, 0, 1]\n            }\n        };\n    }\n\n    const lerp = (a: number, b: number, t: number) => { return (1 - t) * a + t * b; };\n    const tr = painter.transform;\n    const zoomScale = Math.max(Math.abs(tr._zoom - (painter.minCutoffZoom - 1.0)), 1.0);\n    const pitchScale = tr.isLODDisabled(false) ? smoothstep(MIN_LOD_PITCH, MIN_LOD_PITCH - 15.0, tr.pitch) : smoothstep(30, 15, tr.pitch);\n    const zRange = tr._farZ - tr._nearZ;\n    const cameraToCenterDistance = tr.cameraToCenterDistance;\n    const fadeRangePixels = cutoffFadeRange * tr.height;\n    const cutoffDistance = lerp(cameraToCenterDistance, tr._farZ + fadeRangePixels, pitchScale) * zoomScale;\n    const relativeCutoffDistance = ((cutoffDistance - tr._nearZ) / zRange);\n    const relativeCutoffFadeDistance = ((cutoffDistance - fadeRangePixels - tr._nearZ) / zRange);\n    return {\n        shouldRenderCutoff: pitchScale < 1.0,\n        uniformValues: {\n            'u_cutoff_params': [\n                tr._nearZ,\n                tr._farZ,\n                relativeCutoffDistance,\n                relativeCutoffFadeDistance\n            ]\n        }\n    };\n};\n","// @flow\n\nimport Texture from '../../src/render/texture.js';\nimport Framebuffer from '../../src/gl/framebuffer.js';\nimport ColorMode from '../../src/gl/color_mode.js';\nimport DepthMode from '../../src/gl/depth_mode.js';\nimport StencilMode from '../../src/gl/stencil_mode.js';\nimport CullFaceMode from '../../src/gl/cull_face_mode.js';\nimport Transform from '../../src/geo/transform.js';\nimport {Frustum, Aabb} from '../../src/util/primitives.js';\nimport Color from '../../src/style-spec/util/color.js';\nimport {FreeCamera} from '../../src/ui/free_camera.js';\nimport {OverscaledTileID, UnwrappedTileID} from '../../src/source/tile_id.js';\nimport {mercatorZfromAltitude, tileToMeter} from '../../src/geo/mercator_coordinate.js';\nimport {cartesianPositionToSpherical, sphericalPositionToCartesian, clamp, linearVec3TosRGB} from '../../src/util/util.js';\n\nimport Lights from '../style/lights.js';\nimport {defaultShadowUniformValues} from '../render/shadow_uniforms.js';\nimport TextureSlots from './texture_slots.js';\n\nimport assert from 'assert';\n\nimport {mat4, vec3} from 'gl-matrix';\nimport {groundShadowUniformValues} from './program/ground_shadow_program.js';\nimport EXTENT from '../../src/style-spec/data/extent.js';\nimport {getCutoffParams} from '../../src/render/cutoff.js';\n\nimport type Painter from '../../src/render/painter.js';\nimport type Program from '../../src/render/program.js';\nimport type Style from '../../src/style/style.js';\nimport type {UniformValues} from '../../src/render/uniform_binding.js';\nimport type {LightProps as Directional} from '../style/directional_light_properties.js';\nimport type {LightProps as Ambient} from '../style/ambient_light_properties.js';\nimport type {ShadowUniformsType} from '../render/shadow_uniforms.js';\nimport type {Mat4, Vec3, Vec4} from 'gl-matrix';\n\ntype ShadowCascade = {\n    framebuffer: Framebuffer,\n    texture: Texture,\n    matrix: Mat4,\n    far: number,\n    boundingSphereRadius: number,\n    frustum: Frustum,\n    scale: number;\n};\n\n// Describes simplified shadow volume of a tile. Consists of eight corner\n// points of the aabb (possibly transformed) and four side planes. Top and bottom\n// planes are left out as they rarely contribute visibility.\nexport type TileShadowVolume = {\n    vertices: Array<Vec3>;\n    planes: Array<Vec4>;\n};\n\ntype ShadowNormalOffsetMode = 'vector-tile' | 'model-tile';\n\nconst shadowParameters = {\n    cascadeCount: 2,\n    shadowMapResolution: 2048\n};\n\nclass ShadowReceiver {\n    constructor(aabb: Aabb, lastCascade: ?number) {\n        this.aabb = aabb;\n        this.lastCascade = lastCascade;\n    }\n\n    aabb: Aabb;\n    lastCascade: ?number;\n}\n\nclass ShadowReceivers {\n    add(tileId: UnwrappedTileID, aabb: Aabb) {\n        const receiver = this.receivers[tileId.key];\n\n        if (receiver !== undefined) {\n            receiver.aabb.min[0] = Math.min(receiver.aabb.min[0], aabb.min[0]);\n            receiver.aabb.min[1] = Math.min(receiver.aabb.min[1], aabb.min[1]);\n            receiver.aabb.min[2] = Math.min(receiver.aabb.min[2], aabb.min[2]);\n            receiver.aabb.max[0] = Math.max(receiver.aabb.max[0], aabb.max[0]);\n            receiver.aabb.max[1] = Math.max(receiver.aabb.max[1], aabb.max[1]);\n            receiver.aabb.max[2] = Math.max(receiver.aabb.max[2], aabb.max[2]);\n        } else {\n            this.receivers[tileId.key] = new ShadowReceiver(aabb, null);\n        }\n    }\n    clear() {\n        this.receivers = {};\n    }\n\n    get(tileId: UnwrappedTileID): ?ShadowReceiver {\n        return this.receivers[tileId.key];\n    }\n\n    // Returns the number of cascades that need to be rendered based on visibility on screen.\n    // Cascades that need to be rendered always include the first cascade.\n    computeRequiredCascades(frustum: Frustum, worldSize: number, cascades: Array<ShadowCascade>): number {\n        const frustumAabb = Aabb.fromPoints((frustum.points: any));\n        let lastCascade = 0;\n\n        for (const receiverKey in this.receivers) {\n            const receiver = (this.receivers[receiverKey]: ?ShadowReceiver);\n            if (!receiver) continue;\n\n            if (!frustumAabb.intersectsAabb(receiver.aabb)) continue;\n\n            receiver.aabb.min = frustumAabb.closestPoint(receiver.aabb.min);\n            receiver.aabb.max = frustumAabb.closestPoint(receiver.aabb.max);\n            const clampedTileAabbPoints = receiver.aabb.getCorners();\n\n            for (let i = 0; i < cascades.length; i++) {\n                let aabbInsideCascade = true;\n\n                for (const point of clampedTileAabbPoints) {\n                    const p = [point[0] * worldSize, point[1] * worldSize, point[2]];\n                    vec3.transformMat4(p, p, cascades[i].matrix);\n\n                    if (p[0] < -1.0 || p[0] > 1.0 || p[1] < -1.0 || p[1] > 1.0) {\n                        aabbInsideCascade = false;\n                        break;\n                    }\n                }\n\n                receiver.lastCascade = i;\n                lastCascade = Math.max(lastCascade, i);\n\n                if (aabbInsideCascade) {\n                    break;\n                }\n            }\n        }\n\n        return lastCascade + 1;\n    }\n\n    receivers: {number: ShadowReceiver};\n}\n\nexport class ShadowRenderer {\n    painter: Painter;\n    _enabled: boolean;\n    _shadowLayerCount: number;\n    _numCascadesToRender: number;\n    _cascades: Array<ShadowCascade>;\n    _groundShadowTiles: Array<OverscaledTileID>;\n    _receivers: ShadowReceivers;\n    _depthMode: DepthMode;\n    _uniformValues: UniformValues<ShadowUniformsType>;\n    shadowDirection: Vec3;\n    useNormalOffset: boolean;\n\n    _forceDisable: boolean;\n\n    constructor(painter: Painter) {\n        this.painter = painter;\n        this._enabled = false;\n        this._shadowLayerCount = 0;\n        this._numCascadesToRender = 0;\n        this._cascades = [];\n        this._groundShadowTiles = [];\n        this._receivers = new ShadowReceivers();\n        this._depthMode = new DepthMode(painter.context.gl.LEQUAL, DepthMode.ReadWrite, [0, 1]);\n        this._uniformValues = defaultShadowUniformValues();\n        this._forceDisable = false;\n\n        this.useNormalOffset = false;\n\n        painter.tp.registerParameter(this, [\"Shadows\"], \"_forceDisable\", {label: \"forceDisable\"}, () => { this.painter.style.map.triggerRepaint(); });\n        painter.tp.registerParameter(shadowParameters, [\"Shadows\"], \"cascadeCount\", {min: 1, max: 2, step: 1});\n        painter.tp.registerParameter(shadowParameters, [\"Shadows\"], \"shadowMapResolution\", {min: 32, max: 2048, step: 32});\n        painter.tp.registerBinding(this, [\"Shadows\"], \"_numCascadesToRender\", {readonly: true, label: 'numCascadesToRender'});\n    }\n\n    destroy() {\n        for (const cascade of this._cascades) {\n            cascade.texture.destroy();\n            cascade.framebuffer.destroy();\n        }\n\n        this._cascades = [];\n    }\n\n    updateShadowParameters(transform: Transform, directionalLight: ?Lights<Directional>) {\n        const painter = this.painter;\n\n        this._enabled = false;\n        this._shadowLayerCount = 0;\n        this._receivers.clear();\n\n        if (!directionalLight || !directionalLight.properties) {\n            return;\n        }\n\n        const shadowIntensity = directionalLight.properties.get('shadow-intensity');\n\n        if (!directionalLight.shadowsEnabled() || shadowIntensity <= 0.0) {\n            return;\n        }\n\n        this._shadowLayerCount = painter.style.order.reduce(\n            (accumulator: number, layerId: string) => {\n                const layer = painter.style._mergedLayers[layerId];\n                return accumulator + (layer.hasShadowPass() && !layer.isHidden(transform.zoom) ? 1 : 0);\n            }, 0);\n\n        this._enabled = this._shadowLayerCount > 0;\n\n        if (!this.enabled) {\n            return;\n        }\n\n        const context = painter.context;\n        const width = shadowParameters.shadowMapResolution;\n        const height = shadowParameters.shadowMapResolution;\n\n        if (this._cascades.length === 0 || shadowParameters.shadowMapResolution !== this._cascades[0].texture.size[0]) {\n            this._cascades = [];\n            for (let i = 0; i < shadowParameters.cascadeCount; ++i) {\n                const useColor = painter._shadowMapDebug;\n\n                const gl = context.gl;\n                const fbo = context.createFramebuffer(width, height, useColor, 'texture');\n                const depthTexture = new Texture(context, {width, height, data: null}, gl.DEPTH_COMPONENT);\n                fbo.depthAttachment.set(depthTexture.texture);\n\n                if (useColor) {\n                    const colorTexture = new Texture(context, {width, height, data: null}, gl.RGBA);\n                    fbo.colorAttachment.set(colorTexture.texture);\n                }\n\n                this._cascades.push({\n                    framebuffer: fbo,\n                    texture: depthTexture,\n                    matrix: [],\n                    far: 0,\n                    boundingSphereRadius: 0,\n                    frustum: new Frustum(),\n                    scale: 0});\n            }\n        }\n\n        this.shadowDirection = shadowDirectionFromProperties(directionalLight);\n\n        let verticalRange = 0.0;\n        if (transform.elevation) {\n            const elevation = transform.elevation;\n            const range = [10000, -10000];\n            elevation.visibleDemTiles.filter(tile => tile.dem).forEach(tile => {\n                const minMaxTree = (tile.dem: any).tree;\n                range[0] = Math.min(range[0], minMaxTree.minimums[0]);\n                range[1] = Math.max(range[1], minMaxTree.maximums[0]);\n            });\n            if (range[0] !== 10000) {\n                verticalRange = (range[1] - range[0]) * elevation.exaggeration();\n            }\n        }\n\n        const cascadeSplitDist = transform.cameraToCenterDistance * 1.5;\n        const shadowCutoutDist = cascadeSplitDist * 3.0;\n        const cameraInvProj = new Float64Array(16);\n        for (let cascadeIndex = 0; cascadeIndex < this._cascades.length; ++cascadeIndex) {\n            const cascade = this._cascades[cascadeIndex];\n\n            let near = transform.height / 50.0;\n            let far = 1.0;\n\n            if (shadowParameters.cascadeCount === 1) {\n                far = shadowCutoutDist;\n            } else {\n                if (cascadeIndex === 0) {\n                    far = cascadeSplitDist;\n                } else {\n                    near = cascadeSplitDist;\n                    far = shadowCutoutDist;\n                }\n            }\n\n            const [matrix, radius] = createLightMatrix(transform, this.shadowDirection, near, far, shadowParameters.shadowMapResolution, verticalRange);\n            cascade.scale = transform.scale;\n            cascade.matrix = matrix;\n            cascade.boundingSphereRadius = radius;\n\n            mat4.invert(cameraInvProj, cascade.matrix);\n            cascade.frustum = Frustum.fromInvProjectionMatrix(cameraInvProj, 1, 0, true);\n            cascade.far = far;\n        }\n        const fadeRangeIdx = this._cascades.length - 1;\n        this._uniformValues['u_fade_range'] = [this._cascades[fadeRangeIdx].far * 0.75, this._cascades[fadeRangeIdx].far];\n        this._uniformValues['u_shadow_intensity'] = shadowIntensity;\n        this._uniformValues['u_shadow_direction'] = [this.shadowDirection[0], this.shadowDirection[1], this.shadowDirection[2]];\n        this._uniformValues['u_shadow_texel_size'] = 1 / shadowParameters.shadowMapResolution;\n        this._uniformValues['u_shadow_map_resolution'] = shadowParameters.shadowMapResolution;\n        this._uniformValues['u_shadowmap_0'] = TextureSlots.ShadowMap0;\n        this._uniformValues['u_shadowmap_1'] = TextureSlots.ShadowMap0 + 1;\n\n        // Render shadows on the ground plane as an extra layer of blended \"tiles\"\n        const tileCoverOptions = {\n            tileSize: 512,\n            renderWorldCopies: true\n        };\n\n        this._groundShadowTiles = painter.transform.coveringTiles(tileCoverOptions);\n\n        const elevation = painter.transform.elevation;\n        for (const tileId of this._groundShadowTiles) {\n            let tileHeight = {min: 0, max: 0};\n            if (elevation) {\n                const minMax = elevation.getMinMaxForTile(tileId);\n                if (minMax) tileHeight = minMax;\n            }\n            this.addShadowReceiver(tileId.toUnwrapped(), tileHeight.min, tileHeight.max);\n        }\n    }\n\n    get enabled(): boolean {\n        return this._enabled && !this._forceDisable;\n    }\n\n    set enabled(enabled: boolean) {\n        // called on layer rendering to disable shadow receiving.\n        this._enabled = enabled;\n    }\n\n    drawShadowPass(style: Style, sourceCoords: {[_: string]: Array<OverscaledTileID>}) {\n        if (!this.enabled) {\n            return;\n        }\n\n        const painter = this.painter;\n        const context = painter.context;\n\n        assert(painter.renderPass === 'shadow');\n\n        // For each shadow receiver, compute how many cascades would need to be\n        // sampled for the VISIBLE part of the receiver to be fully covered by\n        // shadows.\n        this._numCascadesToRender = this._receivers.computeRequiredCascades(painter.transform.getFrustum(0), painter.transform.worldSize, this._cascades);\n\n        context.viewport.set([0, 0, shadowParameters.shadowMapResolution, shadowParameters.shadowMapResolution]);\n\n        for (let cascade = 0; cascade < this._numCascadesToRender; ++cascade) {\n            painter.currentShadowCascade = cascade;\n\n            context.bindFramebuffer.set(this._cascades[cascade].framebuffer.framebuffer);\n            context.clear({color: Color.white, depth: 1});\n\n            for (const layerId of style.order) {\n                const layer = style._mergedLayers[layerId];\n                if (!layer.hasShadowPass() || layer.isHidden(painter.transform.zoom)) continue;\n\n                const sourceCache = style.getLayerSourceCache(layer);\n                const coords = sourceCache ? sourceCoords[sourceCache.id] : undefined;\n                if (layer.type !== 'model' && !(coords && coords.length)) continue;\n\n                painter.renderLayer(painter, sourceCache, layer, coords);\n            }\n        }\n\n        painter.currentShadowCascade = 0;\n    }\n\n    drawGroundShadows() {\n        if (!this.enabled) {\n            return;\n        }\n\n        const painter = this.painter;\n        const style = painter.style;\n        const context = painter.context;\n        const directionalLight = style.directionalLight;\n        const ambientLight = style.ambientLight;\n\n        if (!directionalLight || !ambientLight) {\n            return;\n        }\n\n        const baseDefines = ([]: any);\n        const cutoffParams = getCutoffParams(painter, painter.longestCutoffRange);\n        if (cutoffParams.shouldRenderCutoff) {\n            baseDefines.push('RENDER_CUTOFF');\n        }\n\n        const shadowColor = calculateGroundShadowFactor(directionalLight, ambientLight);\n\n        const depthMode = new DepthMode(context.gl.LEQUAL, DepthMode.ReadOnly, painter.depthRangeFor3D);\n\n        for (const id of this._groundShadowTiles) {\n            const unwrapped = id.toUnwrapped();\n            const affectedByFog = painter.isTileAffectedByFog(id);\n            const program = painter.getOrCreateProgram('groundShadow', {defines: baseDefines, overrideFog: affectedByFog});\n\n            this.setupShadows(unwrapped, program);\n\n            painter.uploadCommonUniforms(context, program, unwrapped, null, cutoffParams);\n\n            const uniformValues = groundShadowUniformValues(painter.transform.calculateProjMatrix(unwrapped), shadowColor);\n\n            program.draw(painter, context.gl.TRIANGLES, depthMode, StencilMode.disabled, ColorMode.multiply, CullFaceMode.disabled,\n                uniformValues, \"ground_shadow\", painter.tileExtentBuffer, painter.quadTriangleIndexBuffer,\n                painter.tileExtentSegments, {}, painter.transform.zoom,\n                null, null);\n        }\n    }\n\n    getShadowPassColorMode(): $ReadOnly<ColorMode> {\n        return this.painter._shadowMapDebug ? ColorMode.unblended : ColorMode.disabled;\n    }\n\n    getShadowPassDepthMode(): $ReadOnly<DepthMode> {\n        return this._depthMode;\n    }\n\n    getShadowCastingLayerCount(): number {\n        return this._shadowLayerCount;\n    }\n\n    calculateShadowPassMatrixFromTile(unwrappedId: UnwrappedTileID): Float32Array {\n        const tr = this.painter.transform;\n        const tileMatrix = tr.calculatePosMatrix(unwrappedId, tr.worldSize);\n        const lightMatrix = this._cascades[this.painter.currentShadowCascade].matrix;\n        mat4.multiply(tileMatrix, lightMatrix, tileMatrix);\n        return Float32Array.from(tileMatrix);\n    }\n\n    calculateShadowPassMatrixFromMatrix(matrix: Mat4): Float32Array {\n        const lightMatrix = this._cascades[this.painter.currentShadowCascade].matrix;\n        mat4.multiply(matrix, lightMatrix, matrix);\n        return Float32Array.from(matrix);\n    }\n\n    setupShadows(unwrappedTileID: UnwrappedTileID, program: Program<*>, normalOffsetMode: ?ShadowNormalOffsetMode, tileOverscaledZ: number = 0) {\n        if (!this.enabled) {\n            return;\n        }\n\n        const transform = this.painter.transform;\n        const context = this.painter.context;\n        const gl = context.gl;\n        const uniforms = this._uniformValues;\n\n        const lightMatrix = new Float64Array(16);\n        const tileMatrix = transform.calculatePosMatrix(unwrappedTileID, transform.worldSize);\n\n        for (let i = 0; i < this._cascades.length; i++) {\n            mat4.multiply(lightMatrix, this._cascades[i].matrix, tileMatrix);\n            uniforms[i === 0 ? 'u_light_matrix_0' : 'u_light_matrix_1'] = Float32Array.from(lightMatrix);\n            context.activeTexture.set(gl.TEXTURE0 + TextureSlots.ShadowMap0 + i);\n            this._cascades[i].texture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE);\n        }\n\n        this.useNormalOffset = !!normalOffsetMode;\n\n        if (this.useNormalOffset) {\n            const meterInTiles = tileToMeter(unwrappedTileID.canonical);\n            const texelScale = 2.0 / transform.tileSize * EXTENT / shadowParameters.shadowMapResolution;\n            const shadowTexelInTileCoords0 = texelScale * this._cascades[0].boundingSphereRadius;\n            const shadowTexelInTileCoords1 = texelScale * this._cascades[this._cascades.length - 1].boundingSphereRadius;\n            // Instanced model tiles could have smoothened (shared among neighbor faces) normals. Normal is not surface normal\n            // and this is why it is needed to increase the offset. 3.0 in case of model-tile could be alternatively replaced by\n            // 2.0 if normal would not get scaled by dotScale in shadow_normal_offset().\n            const tileTypeMultiplier = (normalOffsetMode === 'vector-tile') ? 1.0 : 3.0;\n            const scale = tileTypeMultiplier / Math.pow(2, tileOverscaledZ - unwrappedTileID.canonical.z - (1 - transform.zoom + Math.floor(transform.zoom)));\n            const offset0 = shadowTexelInTileCoords0 * scale;\n            const offset1 = shadowTexelInTileCoords1 * scale;\n            uniforms[\"u_shadow_normal_offset\"] = [meterInTiles, offset0, offset1];\n            uniforms[\"u_shadow_bias\"] = [0.00006, 0.0012, 0.012]; // Reduce constant offset\n        } else {\n            uniforms[\"u_shadow_bias\"] = [0.00036, 0.0012, 0.012];\n        }\n        program.setShadowUniformValues(context, uniforms);\n    }\n\n    setupShadowsFromMatrix(worldMatrix: Mat4, program: Program<*>, normalOffset: boolean = false) {\n        if (!this.enabled) {\n            return;\n        }\n\n        const context = this.painter.context;\n        const gl = context.gl;\n        const uniforms = this._uniformValues;\n\n        const lightMatrix = new Float64Array(16);\n        for (let i = 0; i < shadowParameters.cascadeCount; i++) {\n            mat4.multiply(lightMatrix, this._cascades[i].matrix, worldMatrix);\n            uniforms[i === 0 ? 'u_light_matrix_0' : 'u_light_matrix_1'] = Float32Array.from(lightMatrix);\n            context.activeTexture.set(gl.TEXTURE0 + TextureSlots.ShadowMap0 + i);\n            this._cascades[i].texture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE);\n        }\n\n        this.useNormalOffset = normalOffset;\n\n        if (normalOffset) {\n            const scale = 5.0; // Experimentally found value\n            uniforms[\"u_shadow_normal_offset\"] = [1.0, scale, scale]; // meterToTile isn't used\n            uniforms[\"u_shadow_bias\"] = [0.00006, 0.0012, 0.012]; // Reduce constant offset\n        } else {\n            uniforms[\"u_shadow_bias\"] = [0.00036, 0.0012, 0.012];\n        }\n\n        program.setShadowUniformValues(context, uniforms);\n    }\n\n    // When the same uniform values are used multiple times on different programs, it is sufficient\n    // to call program.setShadowUniformValues(context, uniforms) instead of calling setupShadowsFromMatrix multiple times.\n    getShadowUniformValues(): UniformValues<ShadowUniformsType> {\n        return this._uniformValues;\n    }\n\n    getCurrentCascadeFrustum(): Frustum {\n        return this._cascades[this.painter.currentShadowCascade].frustum;\n    }\n\n    computeSimplifiedTileShadowVolume(id: UnwrappedTileID, height: number, worldSize: number, lightDir: Vec3): TileShadowVolume {\n        if (lightDir[2] >= 0.0) {\n            return {};\n        }\n        const corners = tileAabb(id, height, worldSize).getCorners();\n        const t = height / -lightDir[2];\n        // Project vertices of bottom edges belonging to sides facing away from the light.\n        if (lightDir[0] < 0.0) {\n            vec3.add(corners[0], corners[0], [lightDir[0] * t, 0.0, 0.0]);\n            vec3.add(corners[3], corners[3], [lightDir[0] * t, 0.0, 0.0]);\n        } else if (lightDir[0] > 0.0) {\n            vec3.add(corners[1], corners[1], [lightDir[0] * t, 0.0, 0.0]);\n            vec3.add(corners[2], corners[2], [lightDir[0] * t, 0.0, 0.0]);\n        }\n        if (lightDir[1] < 0.0) {\n            vec3.add(corners[0], corners[0], [0.0, lightDir[1] * t, 0.0]);\n            vec3.add(corners[1], corners[1], [0.0, lightDir[1] * t, 0.0]);\n        } else if (lightDir[1] > 0.0) {\n            vec3.add(corners[2], corners[2], [0.0, lightDir[1] * t, 0.0]);\n            vec3.add(corners[3], corners[3], [0.0, lightDir[1] * t, 0.0]);\n        }\n        const tileShadowVolume: TileShadowVolume = {};\n        /* $FlowIgnore[invalid-tuple-arity] we know corners have the same length than vertices */\n        tileShadowVolume.vertices = corners;\n        tileShadowVolume.planes = [computePlane(corners[1], corners[0], corners[4]), // top\n            computePlane(corners[2], corners[1], corners[5]), // right\n            computePlane(corners[3], corners[2], corners[6]), // bottom\n            computePlane(corners[0], corners[3], corners[7]) ];\n        return tileShadowVolume;\n    }\n\n    addShadowReceiver(tileId: UnwrappedTileID, minHeight: number, maxHeight: number) {\n        this._receivers.add(tileId, Aabb.fromTileIdAndHeight(tileId, minHeight, maxHeight));\n    }\n\n    getMaxCascadeForTile(tileId: UnwrappedTileID): number {\n        const receiver = this._receivers.get(tileId);\n        return !!receiver && !!receiver.lastCascade ? receiver.lastCascade : 0;\n    }\n}\n\nfunction tileAabb(id: UnwrappedTileID, height: number, worldSize: number): Aabb {\n    const tileToWorld = worldSize / (1 << id.canonical.z);\n    const minx =  id.canonical.x * tileToWorld + id.wrap * worldSize;\n    const maxx =  (id.canonical.x + 1) * tileToWorld + id.wrap * worldSize;\n    const miny =  id.canonical.y * tileToWorld + id.wrap * worldSize;\n    const maxy =  (id.canonical.y + 1) * tileToWorld + id.wrap * worldSize;\n    return new Aabb([minx, miny, 0], [maxx, maxy, height]);\n\n}\n\nfunction computePlane(a: Vec3, b: Vec3, c: Vec3): Vec4 {\n    const bc = vec3.sub([], c, b);\n    const ba = vec3.sub([], a, b);\n\n    const normal = vec3.cross([], bc, ba);\n    const len = vec3.length(normal);\n\n    if (len === 0) {\n        return [0, 0, 1, 0];\n    }\n    vec3.scale(normal, normal, 1 / len);\n    return [normal[0], normal[1], normal[2], -vec3.dot(normal, b)];\n}\n\nexport function shadowDirectionFromProperties(directionalLight: Lights<Directional>): Vec3 {\n    const direction = directionalLight.properties.get('direction');\n    const spherical = cartesianPositionToSpherical(direction.x, direction.y, direction.z);\n\n    // Limit light position specifically for shadow rendering.\n    // If the polar coordinate goes very high, we get visual artifacts.\n    // We limit the position in order to avoid these issues.\n    // 75 degrees is an arbitrarily chosen value, based on a subjective assessment of the visuals.\n    const MaxPolarCoordinate = 75.0;\n    spherical[2] = clamp(spherical[2], 0.0, MaxPolarCoordinate);\n\n    const position = sphericalPositionToCartesian([spherical[0], spherical[1], spherical[2]]);\n\n    // Convert polar and azimuthal to cartesian\n    return vec3.fromValues(position.x, position.y, position.z);\n}\n\nexport function calculateGroundShadowFactor(directionalLight: Lights<Directional>, ambientLight: Lights<Ambient>): [number, number, number] {\n    const dirColor = directionalLight.properties.get('color');\n    const dirIntensity = directionalLight.properties.get('intensity');\n    const dirDirection = directionalLight.properties.get('direction');\n    const directionVec = [dirDirection.x, dirDirection.y, dirDirection.z];\n    const ambientColor = ambientLight.properties.get('color');\n    const ambientIntensity = ambientLight.properties.get('intensity');\n\n    const groundNormal = [0.0, 0.0, 1.0];\n    const dirDirectionalFactor = Math.max(vec3.dot(groundNormal, directionVec), 0.0);\n    const ambStrength = [0, 0, 0];\n    vec3.scale(ambStrength, ambientColor.toArray01Linear().slice(0, 3), ambientIntensity);\n    const dirStrength = [0, 0, 0];\n    vec3.scale(dirStrength, dirColor.toArray01Linear().slice(0, 3), dirDirectionalFactor * dirIntensity);\n\n    // Multiplier X to get from lit surface color L to shadowed surface color S\n    // X = A / (A + D)\n    // A: Ambient light coming into the surface; taking into account color and intensity\n    // D: Directional light coming into the surface; taking into account color, intensity and direction\n    const shadow = [\n        ambStrength[0] > 0.0 ? ambStrength[0] / (ambStrength[0] + dirStrength[0]) : 0.0,\n        ambStrength[1] > 0.0 ? ambStrength[1] / (ambStrength[1] + dirStrength[1]) : 0.0,\n        ambStrength[2] > 0.0 ? ambStrength[2] / (ambStrength[2] + dirStrength[2]) : 0.0\n    ];\n\n    // Because blending will happen in sRGB space, convert the shadow factor to sRGB\n    return linearVec3TosRGB(shadow);\n}\n\nfunction createLightMatrix(\n    transform: Transform,\n    shadowDirection: Vec3,\n    near: number,\n    far: number,\n    resolution: number,\n    verticalRange: number): [Float64Array, number] {\n    const zoom = transform.zoom;\n    const scale = transform.scale;\n    const ws = transform.worldSize;\n    const wsInverse = 1.0 / ws;\n\n    // Find the minimum shadow cascade bounding sphere to create a rotation invariant shadow volume\n    // https://lxjk.github.io/2017/04/15/Calculate-Minimal-Bounding-Sphere-of-Frustum.html\n    const aspectRatio = transform.aspect;\n    const k = Math.sqrt(1. + aspectRatio * aspectRatio) * Math.tan(transform.fovX * 0.5);\n    const k2 = k * k;\n    const farMinusNear = far - near;\n    const farPlusNear = far + near;\n\n    let centerDepth;\n    let radius;\n    if (k2 > farMinusNear / farPlusNear) {\n        centerDepth = far;\n        radius = far * k;\n    } else {\n        centerDepth = 0.5 * farPlusNear * (1. + k2);\n        radius = 0.5 * Math.sqrt(farMinusNear * farMinusNear + 2. * (far * far + near * near) * k2 + farPlusNear * farPlusNear * k2 * k2);\n    }\n\n    const pixelsPerMeter = transform.projection.pixelsPerMeter(transform.center.lat, ws);\n    const cameraToWorldMerc = transform._camera.getCameraToWorldMercator();\n    const sphereCenter = [0.0, 0.0, -centerDepth * wsInverse];\n    vec3.transformMat4(sphereCenter, sphereCenter, cameraToWorldMerc);\n    let sphereRadius = radius * wsInverse;\n\n    // Transform frustum bounds to mercator space\n    const frustumPointToMercator = function(point: Vec3): Vec3 {\n        point[0] /= scale;\n        point[1] /= scale;\n        point[2] = mercatorZfromAltitude(point[2], transform._center.lat);\n        return point;\n    };\n\n    // Check if we have padding we need to recalculate radii\n    const padding = transform._edgeInsets;\n\n    // If there is padding\n    if (padding.left !== 0 || padding.top !== 0 || padding.right !== 0 || padding.bottom !== 0) {\n        // and the padding is not symmetrical\n        if (padding.left !== padding.right || padding.top !== padding.bottom) {\n            const zUnit = transform.projection.zAxisUnit === \"meters\" ? pixelsPerMeter : 1.0;\n            const worldToCamera = transform._camera.getWorldToCamera(transform.worldSize, zUnit);\n            const cameraToClip = transform._camera.getCameraToClipPerspective(transform._fov, transform.width / transform.height, near, far);\n\n            // Apply center of perspective offset\n            cameraToClip[8] = -transform.centerOffset.x * 2 / transform.width;\n            cameraToClip[9] = transform.centerOffset.y * 2 / transform.height;\n\n            const cameraProj = new Float64Array(16);\n            mat4.mul(cameraProj, cameraToClip, worldToCamera);\n\n            const cameraInvProj = new Float64Array(16);\n            mat4.invert(cameraInvProj, cameraProj);\n\n            const frustum = Frustum.fromInvProjectionMatrix(cameraInvProj, ws, zoom, true);\n\n            // Iterate over the frustum points to get the furthest one from the center\n            for (const p of frustum.points) {\n                const fp = frustumPointToMercator(p);\n                sphereRadius = Math.max(sphereRadius, vec3.len(vec3.subtract([], sphereCenter, fp)));\n            }\n        }\n    }\n\n    const roundingMarginFactor = resolution / (resolution - 1.0);\n    sphereRadius *= roundingMarginFactor;\n\n    const pitch = Math.acos(shadowDirection[2]);\n    const bearing = Math.atan2(-shadowDirection[0], -shadowDirection[1]);\n\n    const camera = new FreeCamera();\n    camera.position = sphereCenter;\n    camera.setPitchBearing(pitch, bearing);\n\n    // Construct the light view matrix\n    const lightWorldToView = camera.getWorldToCamera(ws, pixelsPerMeter);\n\n    // The lightMatrixNearZ value is a bit arbitrary. Its magnitude needs to be high enough to fit features that would\n    // cast shadows into the view, but low enough to preserve depth precision in the shadow map.\n    // The mercatorZfromZoom term gets used for the first cascade when zoom level is very high.\n    // The radius term gets used for the second cascade in most cases and for the first cascade at lower zoom levels.\n    const radiusPx = sphereRadius * ws;\n    const lightMatrixNearZ = Math.min(transform._mercatorZfromZoom(17) * ws * -2.0, radiusPx * -2.0);\n    const lightMatrixFarZ = (radiusPx + verticalRange * pixelsPerMeter) / shadowDirection[2];\n\n    const lightViewToClip = camera.getCameraToClipOrthographic(-radiusPx, radiusPx, -radiusPx, radiusPx, lightMatrixNearZ, lightMatrixFarZ);\n    const lightWorldToClip = new Float64Array(16);\n    mat4.multiply(lightWorldToClip, lightViewToClip, lightWorldToView);\n\n    // Move light camera in discrete steps in order to reduce shimmering when translating\n    const alignedCenter = vec3.fromValues(Math.floor(sphereCenter[0] * 1e6) / 1e6 * ws, Math.floor(sphereCenter[1] * 1e6) / 1e6 * ws, 0.);\n\n    const halfResolution = 0.5 * resolution;\n    const projectedPoint = [0.0, 0.0, 0.0];\n    vec3.transformMat4(projectedPoint, alignedCenter, lightWorldToClip);\n    vec3.scale(projectedPoint, projectedPoint, halfResolution);\n\n    const roundedPoint = [Math.floor(projectedPoint[0]), Math.floor(projectedPoint[1]), Math.floor(projectedPoint[2])];\n    const offsetVec = [0.0, 0.0, 0.0];\n    vec3.sub(offsetVec, projectedPoint, roundedPoint);\n    vec3.scale(offsetVec, offsetVec, -1.0 / halfResolution);\n\n    const truncMatrix = new Float64Array(16);\n    mat4.identity(truncMatrix);\n    mat4.translate(truncMatrix, truncMatrix, offsetVec);\n    mat4.multiply(lightWorldToClip, truncMatrix, lightWorldToClip);\n\n    return [lightWorldToClip, radiusPx];\n}\n","// @flow\n\nimport Context from '../../src/gl/context.js';\nimport {Uniform1f, Uniform1i, Uniform2f, Uniform3f, UniformMatrix4f} from '../../src/render/uniform_binding.js';\nimport type {UniformValues} from '../../src/render/uniform_binding.js';\n\nexport type ShadowUniformsType = {|\n    'u_light_matrix_0': UniformMatrix4f,\n    'u_light_matrix_1': UniformMatrix4f,\n    'u_shadow_intensity': Uniform1f,\n    'u_fade_range': Uniform2f,\n    'u_shadow_normal_offset': Uniform3f, // [tileToMeter, offsetCascade0, offsetCascade1]\n    'u_shadow_texel_size': Uniform1f,\n    'u_shadow_map_resolution': Uniform1f,\n    'u_shadow_direction': Uniform3f,\n    'u_shadow_bias': Uniform3f,\n    'u_shadowmap_0': Uniform1i,\n    'u_shadowmap_1': Uniform1i\n|};\n\nexport const shadowUniforms = (context: Context): ShadowUniformsType => ({\n    'u_light_matrix_0': new UniformMatrix4f(context),\n    'u_light_matrix_1': new UniformMatrix4f(context),\n    'u_fade_range': new Uniform2f(context),\n    'u_shadow_normal_offset': new Uniform3f(context),\n    'u_shadow_intensity': new Uniform1f(context),\n    'u_shadow_texel_size': new Uniform1f(context),\n    'u_shadow_map_resolution': new Uniform1f(context),\n    'u_shadow_direction': new Uniform3f(context),\n    'u_shadow_bias': new Uniform3f(context),\n    'u_shadowmap_0': new Uniform1i(context),\n    'u_shadowmap_1': new Uniform1i(context)\n});\n\nexport function defaultShadowUniformValues(): UniformValues<ShadowUniformsType>  {\n    return {\n        'u_light_matrix_0': new Float32Array(16),\n        'u_light_matrix_1': new Float32Array(16),\n        'u_shadow_intensity': 0.0,\n        'u_fade_range': [0.0, 0.0],\n        'u_shadow_normal_offset': [1.0, 1.0, 1.0],\n        'u_shadow_texel_size': 1.0,\n        'u_shadow_map_resolution': 1.0,\n        'u_shadow_direction': [0.0, 0.0, 1.0],\n        'u_shadow_bias': [0.00036, 0.0012, 0.012],\n        'u_shadowmap_0': 0,\n        'u_shadowmap_1': 0\n    };\n}\n","// @flow\n\nimport {UniformMatrix4f, Uniform3f} from '../../../src/render/uniform_binding.js';\nimport type {UniformValues} from '../../../src/render/uniform_binding.js';\nimport type Context from '../../../src/gl/context.js';\n\nexport type GroundShadowUniformsType = {\n    'u_matrix': UniformMatrix4f,\n    'u_ground_shadow_factor': Uniform3f\n};\n\nconst groundShadowUniforms = (context: Context): GroundShadowUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context),\n    'u_ground_shadow_factor': new Uniform3f(context)\n});\n\nconst groundShadowUniformValues = (\n    matrix: Float32Array,\n    shadowFactor: [number, number, number]): UniformValues<GroundShadowUniformsType> => ({\n    'u_matrix': matrix,\n    'u_ground_shadow_factor': shadowFactor\n});\n\nexport {\n    groundShadowUniforms,\n    groundShadowUniformValues\n};\n","// @flow\n\nimport assert from 'assert';\nimport murmur3 from 'murmurhash-js';\n\nimport {Event, ErrorEvent, Evented} from '../util/evented.js';\nimport StyleLayer from './style_layer.js';\nimport StyleChanges from './style_changes.js';\nimport createStyleLayer from './create_style_layer.js';\nimport loadSprite from './load_sprite.js';\nimport ImageManager from '../render/image_manager.js';\nimport GlyphManager, {LocalGlyphMode} from '../render/glyph_manager.js';\nimport Light from './light.js';\nimport Terrain, {DrapeRenderMode} from './terrain.js';\nimport Fog from './fog.js';\nimport {pick, clone, extend, deepEqual, filterObject, cartesianPositionToSpherical, warnOnce} from '../util/util.js';\nimport {getJSON, getReferrer, makeRequest, ResourceType} from '../util/ajax.js';\nimport {isMapboxURL} from '../util/mapbox_url.js';\nimport {stripQueryParameters} from '../util/url.js';\nimport browser from '../util/browser.js';\nimport Dispatcher from '../util/dispatcher.js';\nimport Lights from '../../3d-style/style/lights.js';\nimport {properties as ambientProps} from '../../3d-style/style/ambient_light_properties.js';\nimport {properties as directionalProps} from '../../3d-style/style/directional_light_properties.js';\nimport {createExpression} from '../style-spec/expression/index.js';\n\nimport {\n    validateStyle,\n    validateLayoutProperty,\n    validatePaintProperty,\n    validateSource,\n    validateLayer,\n    validateFilter,\n    validateTerrain,\n    validateLights,\n    validateModel,\n    emitValidationErrors as _emitValidationErrors\n} from './validate_style.js';\nimport {QueryGeometry} from '../style/query_geometry.js';\nimport {\n    create as createSource,\n    getType as getSourceType,\n    setType as setSourceType,\n} from '../source/source.js';\nimport {queryRenderedFeatures, queryRenderedSymbols, querySourceFeatures} from '../source/query_features.js';\nimport SourceCache from '../source/source_cache.js';\nimport BuildingIndex from '../source/building_index.js';\nimport GeoJSONSource from '../source/geojson_source.js';\nimport styleSpec from '../style-spec/reference/latest.js';\nimport getWorkerPool from '../util/global_worker_pool.js';\nimport deref from '../style-spec/deref.js';\nimport emptyStyle from '../style-spec/empty.js';\nimport diffStyles, {operations as diffOperations} from '../style-spec/diff.js';\nimport {\n    registerForPluginStateChange,\n    evented as rtlTextPluginEvented,\n    triggerPluginCompletionEvent\n} from '../source/rtl_text_plugin.js';\nimport PauseablePlacement from './pauseable_placement.js';\nimport CrossTileSymbolIndex from '../symbol/cross_tile_symbol_index.js';\nimport {validateCustomStyleLayer} from './style_layer/custom_style_layer.js';\nimport {isFQID, makeFQID, getNameFromFQID, getScopeFromFQID} from '../util/fqid.js';\nimport {shadowDirectionFromProperties} from '../../3d-style/render/shadow_renderer.js';\nimport ModelManager from '../../3d-style/render/model_manager.js';\nimport {DEFAULT_MAX_ZOOM, DEFAULT_MIN_ZOOM} from '../geo/transform.js';\n\n// We're skipping validation errors with the `source.canvas` identifier in order\n// to continue to allow canvas sources to be added at runtime/updated in\n// smart setStyle (see https://github.com/mapbox/mapbox-gl-js/pull/6424):\nconst emitValidationErrors = (evented: Evented, errors: ?ValidationErrors) =>\n    _emitValidationErrors(evented, errors && errors.filter(error => error.identifier !== 'source.canvas'));\n\nimport type {LightProps as Ambient} from '../../3d-style/style/ambient_light_properties.js';\nimport type {LightProps as Directional} from '../../3d-style/style/directional_light_properties.js';\nimport type {Vec3} from 'gl-matrix';\nimport type {Map as MapboxMap} from '../ui/map.js';\nimport type Transform from '../geo/transform.js';\nimport type {StyleImage} from './style_image.js';\nimport type {StyleGlyph} from './style_glyph.js';\nimport type {Callback} from '../types/callback.js';\nimport EvaluationParameters from './evaluation_parameters.js';\nimport type {Placement} from '../symbol/placement.js';\nimport type {Cancelable} from '../types/cancelable.js';\nimport type {RequestParameters, ResponseCallback} from '../util/ajax.js';\nimport type {GeoJSON} from '@mapbox/geojson-types';\nimport type {\n    LayerSpecification,\n    FilterSpecification,\n    StyleSpecification,\n    ImportSpecification,\n    LightSpecification,\n    SourceSpecification,\n    TerrainSpecification,\n    LightsSpecification,\n    FlatLightSpecification,\n    FogSpecification,\n    ProjectionSpecification,\n    TransitionSpecification,\n    PropertyValueSpecification,\n    ConfigSpecification,\n    SchemaSpecification,\n    CameraSpecification\n} from '../style-spec/types.js';\nimport type {CustomLayerInterface} from './style_layer/custom_style_layer.js';\nimport type {Validator, ValidationErrors} from './validate_style.js';\nimport type {OverscaledTileID} from '../source/tile_id.js';\nimport type {QueryResult} from '../data/feature_index.js';\nimport type {QueryFeature} from '../util/vectortile_to_geojson.js';\nimport type {FeatureStates} from '../source/source_state.js';\nimport type {PointLike} from '../types/point-like.js';\nimport type {Source, SourceClass} from '../source/source.js';\nimport type {TransitionParameters, ConfigOptions} from './properties.js';\nimport type {QueryRenderedFeaturesParams} from '../source/query_features.js';\n\nconst supportedDiffOperations = pick(diffOperations, [\n    'addLayer',\n    'removeLayer',\n    'setLights',\n    'setPaintProperty',\n    'setLayoutProperty',\n    'setSlot',\n    'setFilter',\n    'addSource',\n    'removeSource',\n    'setLayerZoomRange',\n    'setLight',\n    'setTransition',\n    'setGeoJSONSourceData',\n    'setTerrain',\n    'setFog',\n    'setProjection',\n    'setCamera',\n    'addImport',\n    'removeImport',\n    'updateImport'\n    // 'setGlyphs',\n    // 'setSprite',\n]);\n\nconst ignoredDiffOperations = pick(diffOperations, [\n    'setCenter',\n    'setZoom',\n    'setBearing',\n    'setPitch'\n]);\n\nconst empty = emptyStyle();\n\nexport type StyleOptions = {\n    validate?: boolean,\n    localFontFamily?: ?string,\n    localIdeographFontFamily?: string,\n\n    dispatcher?: Dispatcher,\n    imageManager?: ImageManager,\n    glyphManager?: GlyphManager,\n    modelManager?: ModelManager,\n    styleChanges?: StyleChanges,\n    configOptions?: ConfigOptions,\n\n    scope?: string,\n    importDepth?: number,\n    importsCache?: Map<string, StyleSpecification>,\n    resolvedImports?: Set<string>,\n    config?: ?ConfigSpecification,\n    initialConfig?: {[string]: ConfigSpecification},\n    configDependentLayers?: Set<string>;\n};\n\nexport type StyleSetterOptions = {\n    validate?: boolean;\n    isInitialLoad?: boolean;\n};\n\nexport type Fragment = {|\n    id: string,\n    style: Style,\n    config?: ?ConfigSpecification\n|};\n\nconst MAX_IMPORT_DEPTH = 5;\nconst defaultTransition = {duration: 300, delay: 0};\n\n/**\n * @private\n */\nclass Style extends Evented {\n    map: MapboxMap;\n    stylesheet: StyleSpecification;\n    dispatcher: Dispatcher;\n    imageManager: ImageManager;\n    glyphManager: GlyphManager;\n    modelManager: ModelManager;\n    ambientLight: ?Lights<Ambient>;\n    directionalLight: ?Lights<Directional>;\n    light: Light;\n    terrain: ?Terrain;\n    disableElevatedTerrain: ?boolean;\n    fog: ?Fog;\n    camera: CameraSpecification;\n    transition: TransitionSpecification;\n    projection: ProjectionSpecification;\n\n    // Serializable identifier of style, which we use for telemetry\n    globalId: string | null;\n\n    scope: string;\n    fragments: Array<Fragment>;\n    importDepth: number;\n    // Shared cache of imported stylesheets\n    importsCache: Map<string, StyleSpecification>;\n    // Keeps track of ancestors' Style URLs.\n    resolvedImports: Set<string>;\n\n    options: ConfigOptions;\n\n    // Merged layers and sources\n    _mergedOrder: Array<string>;\n    _mergedLayers: {[_: string]: StyleLayer};\n    _mergedSourceCaches: {[_: string]: SourceCache};\n    _mergedOtherSourceCaches: {[_: string]: SourceCache};\n    _mergedSymbolSourceCaches: {[_: string]: SourceCache};\n\n    _request: ?Cancelable;\n    _spriteRequest: ?Cancelable;\n    _layers: {[_: string]: StyleLayer};\n    _serializedLayers: {[_: string]: Object};\n    _order: Array<string>;\n    _drapedFirstOrder: Array<string>;\n    _sourceCaches: {[_: string]: SourceCache};\n    _otherSourceCaches: {[_: string]: SourceCache};\n    _symbolSourceCaches: {[_: string]: SourceCache};\n    _loaded: boolean;\n    _shouldPrecompile: boolean;\n    _precompileDone: boolean;\n    _rtlTextPluginCallback: Function;\n    _changes: StyleChanges;\n    _optionsChanged: boolean;\n    _layerOrderChanged: boolean;\n    _availableImages: Array<string>;\n    _markersNeedUpdate: boolean;\n    _brightness: ?number;\n    _configDependentLayers: Set<string>;\n    _config: ?ConfigSpecification;\n    _initialConfig: ?{[string]: ConfigSpecification};\n    _buildingIndex: BuildingIndex;\n    _transition: TransitionSpecification;\n\n    crossTileSymbolIndex: CrossTileSymbolIndex;\n    pauseablePlacement: PauseablePlacement;\n    placement: Placement;\n    z: number;\n\n    _has3DLayers: boolean;\n    _hasCircleLayers: boolean;\n    _hasSymbolLayers: boolean;\n\n    // exposed to allow stubbing by unit tests\n    static getSourceType: typeof getSourceType;\n    static setSourceType: typeof setSourceType;\n    static registerForPluginStateChange: typeof registerForPluginStateChange;\n\n    constructor(map: MapboxMap, options: StyleOptions = {}) {\n        super();\n\n        this.map = map;\n\n        // Empty string indicates the root Style scope.\n        this.scope = options.scope || '';\n\n        this.globalId = null;\n\n        this.fragments = [];\n        this.importDepth = options.importDepth || 0;\n        this.importsCache = options.importsCache || new Map();\n        this.resolvedImports = options.resolvedImports || new Set();\n\n        this.transition = extend({}, defaultTransition);\n\n        this._buildingIndex = new BuildingIndex(this);\n        this.crossTileSymbolIndex = new CrossTileSymbolIndex();\n\n        this._mergedOrder = [];\n        this._drapedFirstOrder = [];\n        this._mergedLayers = {};\n        this._mergedSourceCaches = {};\n        this._mergedOtherSourceCaches = {};\n        this._mergedSymbolSourceCaches = {};\n\n        this._has3DLayers = false;\n        this._hasCircleLayers = false;\n        this._hasSymbolLayers = false;\n\n        this._changes = options.styleChanges || new StyleChanges();\n\n        if (options.dispatcher) {\n            this.dispatcher = options.dispatcher;\n        } else {\n            this.dispatcher = new Dispatcher(getWorkerPool(), this);\n        }\n\n        if (options.imageManager) {\n            this.imageManager = options.imageManager;\n        } else {\n            this.imageManager = new ImageManager();\n            this.imageManager.setEventedParent(this);\n        }\n        this.imageManager.createScope(this.scope);\n\n        if (options.glyphManager) {\n            this.glyphManager = options.glyphManager;\n        } else {\n            this.glyphManager = new GlyphManager(map._requestManager,\n                options.localFontFamily ?\n                    LocalGlyphMode.all :\n                    (options.localIdeographFontFamily ? LocalGlyphMode.ideographs : LocalGlyphMode.none),\n                options.localFontFamily || options.localIdeographFontFamily);\n        }\n\n        if (options.modelManager) {\n            this.modelManager = options.modelManager;\n        } else {\n            this.modelManager = new ModelManager(map._requestManager);\n            this.modelManager.setEventedParent(this);\n        }\n\n        this._layers = {};\n        this._serializedLayers = {};\n        this._sourceCaches = {};\n        this._otherSourceCaches = {};\n        this._symbolSourceCaches = {};\n        this._loaded = false;\n        this._precompileDone = false;\n        this._shouldPrecompile = false;\n        this._availableImages = [];\n        this._order = [];\n        this._markersNeedUpdate = false;\n\n        this.options = options.configOptions ? options.configOptions : new Map();\n        this._configDependentLayers = options.configDependentLayers ? options.configDependentLayers : new Set();\n        this._config = options.config;\n        this._initialConfig = options.initialConfig;\n\n        this.dispatcher.broadcast('setReferrer', getReferrer());\n\n        const self = this;\n        this._rtlTextPluginCallback = Style.registerForPluginStateChange((event) => {\n            const state = {\n                pluginStatus: event.pluginStatus,\n                pluginURL: event.pluginURL\n            };\n            self.dispatcher.broadcast('syncRTLPluginState', state, (err, results) => {\n                triggerPluginCompletionEvent(err);\n                if (results) {\n                    const allComplete = results.every((elem) => elem);\n                    if (allComplete) {\n                        for (const id in self._sourceCaches) {\n                            const sourceCache = self._sourceCaches[id];\n                            const sourceCacheType = sourceCache.getSource().type;\n                            if (sourceCacheType === 'vector' || sourceCacheType === 'geojson') {\n                                sourceCache.reload(); // Should be a no-op if the plugin loads before any tiles load\n                            }\n                        }\n                    }\n                }\n            });\n        });\n\n        this.on('data', (event) => {\n            if (event.dataType !== 'source' || event.sourceDataType !== 'metadata') {\n                return;\n            }\n\n            const source = this.getOwnSource(event.sourceId);\n            if (!source || !source.vectorLayerIds) {\n                return;\n            }\n\n            for (const layerId in this._layers) {\n                const layer = this._layers[layerId];\n                if (layer.source === source.id) {\n                    this._validateLayer(layer);\n                }\n            }\n        });\n    }\n\n    load(style: StyleSpecification | string | null): Style {\n        if (!style) {\n            return this;\n        }\n\n        if (typeof style === 'string') {\n            this.loadURL(style);\n        } else {\n            this.loadJSON(style);\n        }\n\n        return this;\n    }\n\n    _getGlobalId(loadedStyle?: StyleSpecification | string | null): string | null {\n        if (!loadedStyle) {\n            return null;\n        }\n\n        if (typeof loadedStyle === 'string') {\n            if (isMapboxURL(loadedStyle)) {\n                return loadedStyle;\n            }\n\n            const url = stripQueryParameters(loadedStyle);\n\n            if (!url.startsWith('http')) {\n                try {\n                    return new URL(url, location.href).toString();\n                } catch (_e) {\n                    return url;\n                }\n            }\n\n            return url;\n        }\n\n        return `json://${murmur3(JSON.stringify(loadedStyle))}`;\n    }\n\n    _diffStyle(style: StyleSpecification | string, onStarted: (err: Error | null, isUpdateNeeded: boolean) => void, onFinished?: () => void) {\n        this.globalId = this._getGlobalId(style);\n\n        const handleStyle = (json: StyleSpecification, callback: (err: Error | null, isUpdateNeeded: boolean) => void) => {\n            try {\n                callback(null, this.setState(json, onFinished));\n            } catch (e) {\n                callback(e, false);\n            }\n        };\n\n        if (typeof style === 'string') {\n            const url = this.map._requestManager.normalizeStyleURL(style);\n            const request = this.map._requestManager.transformRequest(url, ResourceType.Style);\n            getJSON(request, (error: ?Error, json: ?Object) => {\n                if (error) {\n                    this.fire(new ErrorEvent(error));\n                } else if (json) {\n                    handleStyle(json, onStarted);\n                }\n            });\n        } else if (typeof style === 'object') {\n            handleStyle(style, onStarted);\n        }\n    }\n\n    loadURL(url: string, options: {\n        validate?: boolean,\n        accessToken?: string\n    } = {}): void {\n        this.fire(new Event('dataloading', {dataType: 'style'}));\n\n        const validate = typeof options.validate === 'boolean' ?\n            options.validate : !isMapboxURL(url);\n\n        this.globalId = this._getGlobalId(url);\n        url = this.map._requestManager.normalizeStyleURL(url, options.accessToken);\n        this.resolvedImports.add(url);\n\n        const cachedImport = this.importsCache.get(url);\n        if (cachedImport) return this._load(cachedImport, validate);\n\n        const request = this.map._requestManager.transformRequest(url, ResourceType.Style);\n        this._request = getJSON(request, (error: ?Error, json: ?Object) => {\n            this._request = null;\n            if (error) {\n                this.fire(new ErrorEvent(error));\n            } else if (json) {\n                this.importsCache.set(url, json);\n                return this._load(json, validate);\n            }\n        });\n    }\n\n    loadJSON(json: StyleSpecification, options: StyleSetterOptions = {}): void {\n        this.fire(new Event('dataloading', {dataType: 'style'}));\n\n        this.globalId = this._getGlobalId(json);\n        this._request = browser.frame(() => {\n            this._request = null;\n            this._load(json, options.validate !== false);\n        });\n    }\n\n    loadEmpty() {\n        this.fire(new Event('dataloading', {dataType: 'style'}));\n        this._load(empty, false);\n    }\n\n    _loadImports(imports: Array<ImportSpecification>, validate: boolean, beforeId: ?string): Promise<any> {\n        // We take the root style into account when calculating the import depth.\n        if (this.importDepth >= MAX_IMPORT_DEPTH - 1) {\n            warnOnce(`Style doesn't support nesting deeper than ${MAX_IMPORT_DEPTH}`);\n            return Promise.resolve();\n        }\n\n        const waitForStyles = [];\n        for (const importSpec of imports) {\n            const style = this._createFragmentStyle(importSpec);\n\n            // Merge everything and update layers after the import style is settled.\n            const waitForStyle = new Promise((resolve) => {\n                style.once('style.import.load', resolve);\n                style.once('error', resolve);\n            })\n                .then(() => this.mergeAll());\n            waitForStyles.push(waitForStyle);\n\n            // Load empty style if one of the ancestors was already\n            // instantiated from this URL to avoid recursion.\n            if (this.resolvedImports.has(importSpec.url)) {\n                style.loadEmpty();\n                continue;\n            }\n\n            // Use previously cached style JSON if the import data is not set.\n            const json = importSpec.data || this.importsCache.get(importSpec.url);\n            if (json) {\n                style.loadJSON(json, {validate});\n\n                // Don't expose global ID for internal style to ensure\n                // that we don't send in telemetry Standard style as import\n                // because we already use it directly\n                if (this._isInternalStyle(json)) {\n                    style.globalId = null;\n                }\n            } else if (importSpec.url) {\n                style.loadURL(importSpec.url, {validate});\n            } else {\n                style.loadEmpty();\n            }\n\n            const fragment = {\n                style,\n                id: importSpec.id,\n                config: importSpec.config\n            };\n\n            if (beforeId) {\n                const beforeIndex = this.fragments.findIndex(({id}) => id === beforeId);\n\n                assert(beforeIndex !== -1, `Import with id \"${beforeId}\" does not exist on this map`);\n\n                this.fragments = this.fragments\n                    .slice(0, beforeIndex)\n                    .concat(fragment)\n                    .concat(this.fragments.slice(beforeIndex));\n            } else {\n                this.fragments.push(fragment);\n            }\n\n        }\n\n        // $FlowFixMe[method-unbinding]\n        return Promise.allSettled(waitForStyles);\n    }\n\n    getImportGlobalIds(style: Style = this, ids: Set<string> = new Set()): string[] {\n        for (const fragment of style.fragments) {\n            if (fragment.style.globalId) {\n                ids.add(fragment.style.globalId);\n            }\n            this.getImportGlobalIds(fragment.style, ids);\n        }\n\n        return [...ids.values()];\n    }\n\n    _createFragmentStyle(importSpec: ImportSpecification): Style {\n        const scope = this.scope ? makeFQID(importSpec.id, this.scope) : importSpec.id;\n\n        // Merge import config and initial config from the Map constructor\n        let config;\n        const initialConfig = this._initialConfig && this._initialConfig[scope];\n        if (importSpec.config || initialConfig) {\n            config = extend({}, importSpec.config, initialConfig);\n        }\n\n        const style = new Style(this.map, {\n            scope,\n            styleChanges: this._changes,\n            importDepth: this.importDepth + 1,\n            importsCache: this.importsCache,\n            // Clone resolvedImports so it's not being shared between siblings\n            resolvedImports: new Set(this.resolvedImports),\n            // Use shared Dispatcher and assets Managers between Styles\n            dispatcher: this.dispatcher,\n            imageManager: this.imageManager,\n            glyphManager: this.glyphManager,\n            modelManager: this.modelManager,\n            config,\n            configOptions: this.options,\n            configDependentLayers: this._configDependentLayers\n        });\n\n        // Bubble all events fired by the style to the map.\n        style.setEventedParent(this.map, {style});\n\n        return style;\n    }\n\n    _reloadImports() {\n        this.mergeAll();\n        this._updateMapProjection();\n        this.updateConfigDependencies();\n        this.map._triggerCameraUpdate(this.camera);\n\n        this.dispatcher.broadcast('setLayers', {\n            layers: this._serializeLayers(this._order),\n            scope: this.scope,\n            options: this.options\n        });\n\n        this._shouldPrecompile = this.isRootStyle();\n    }\n\n    _isInternalStyle(json: StyleSpecification): boolean {\n        return this.isRootStyle() && (json.fragment || (!!json.schema && json.fragment !== false));\n    }\n\n    _load(json: StyleSpecification, validate: boolean) {\n        const schema = json.schema;\n\n        // This style was loaded as a root style, but it is marked as a fragment and/or has a schema. We instead load\n        // it as an import with the well-known ID \"basemap\" to make sure that we don't expose the internals.\n        if (this._isInternalStyle(json)) {\n            const basemap = {id: 'basemap', data: json, url: ''};\n            const style = extend({}, empty, {imports: [basemap]});\n            this._load(style, validate);\n            return;\n        }\n\n        this.updateConfig(this._config, schema);\n\n        if (validate && emitValidationErrors(this, validateStyle(json))) {\n            return;\n        }\n\n        this._loaded = true;\n        this.stylesheet = clone(json);\n\n        for (const id in json.sources) {\n            this.addSource(id, json.sources[id], {validate: false, isInitialLoad: true});\n        }\n\n        if (json.sprite) {\n            this._loadSprite(json.sprite);\n        } else {\n            this.imageManager.setLoaded(true, this.scope);\n            this.dispatcher.broadcast('spriteLoaded', {scope: this.scope, isLoaded: true});\n        }\n\n        this.glyphManager.setURL(json.glyphs, this.scope);\n\n        const layers: Array<LayerSpecification> = deref(this.stylesheet.layers);\n        this._order = layers.map((layer) => layer.id);\n\n        if (this.stylesheet.light) {\n            warnOnce('The `light` root property is deprecated, prefer using `lights` with `flat` light type instead.');\n        }\n\n        if (this.stylesheet.lights) {\n            if (this.stylesheet.lights.length === 1 && this.stylesheet.lights[0].type === \"flat\") {\n                const flatLight: FlatLightSpecification = this.stylesheet.lights[0];\n                this.light = new Light(flatLight.properties, flatLight.id);\n            } else {\n                this.setLights(this.stylesheet.lights);\n            }\n        }\n\n        if (!this.light) {\n            this.light = new Light(this.stylesheet.light);\n        }\n\n        this._layers = {};\n        this._serializedLayers = {};\n        for (const layer of layers) {\n            const styleLayer = createStyleLayer(layer, this.scope, this.options);\n            if (styleLayer.isConfigDependent) this._configDependentLayers.add(styleLayer.fqid);\n            styleLayer.setEventedParent(this, {layer: {id: styleLayer.id}});\n            this._layers[styleLayer.id] = styleLayer;\n            this._serializedLayers[styleLayer.id] = styleLayer.serialize();\n\n            const sourceCache = this.getOwnLayerSourceCache(styleLayer);\n            const shadowsEnabled = !!this.directionalLight && this.directionalLight.shadowsEnabled();\n\n            if (sourceCache && styleLayer.canCastShadows() && shadowsEnabled) {\n                sourceCache.castsShadows = true;\n            }\n        }\n\n        if (this.stylesheet.models) {\n            this.modelManager.addModels(this.stylesheet.models, this.scope);\n        }\n\n        const terrain = this.stylesheet.terrain;\n        if (terrain) {\n            // This workaround disables terrain and hillshade\n            // if there is noise in the Canvas2D operations used for image decoding.\n            if (this.disableElevatedTerrain === undefined)\n                this.disableElevatedTerrain = browser.hasCanvasFingerprintNoise();\n\n            if (this.disableElevatedTerrain) {\n                warnOnce('Terrain and hillshade are disabled because of Canvas2D limitations when fingerprinting protection is enabled (e.g. in private browsing mode).');\n            } else if (!this.terrainSetForDrapingOnly()) {\n                this._createTerrain(terrain, DrapeRenderMode.elevated);\n            }\n        }\n\n        if (this.stylesheet.fog) {\n            this._createFog(this.stylesheet.fog);\n        }\n\n        if (this.stylesheet.transition) {\n            this.setTransition(this.stylesheet.transition);\n        }\n\n        this.fire(new Event('data', {dataType: 'style'}));\n\n        const isRootStyle = this.isRootStyle();\n\n        if (json.imports) {\n            this._loadImports(json.imports, validate).then(() => {\n                this._reloadImports();\n                this.fire(new Event(isRootStyle ? 'style.load' : 'style.import.load'));\n            });\n        } else {\n            this._reloadImports();\n            this.fire(new Event(isRootStyle ? 'style.load' : 'style.import.load'));\n        }\n    }\n\n    isRootStyle(): boolean {\n        return this.importDepth === 0;\n    }\n\n    mergeAll() {\n        let light;\n        let ambientLight;\n        let directionalLight;\n        let terrain;\n        let fog;\n        let projection;\n        let transition;\n        let camera;\n\n        // Reset terrain that might have been set by a previous merge\n        if (this.terrain && this.terrain.scope !== this.scope) {\n            delete this.terrain;\n        }\n\n        this.forEachFragmentStyle((style: Style) => {\n            if (!style.stylesheet) return;\n\n            if (style.light != null)\n                light = style.light;\n\n            if (style.stylesheet.lights) {\n                for (const light of style.stylesheet.lights) {\n                    if (light.type === 'ambient' && style.ambientLight != null)\n                        ambientLight = style.ambientLight;\n\n                    if (light.type === 'directional' && style.directionalLight != null)\n                        directionalLight = style.directionalLight;\n                }\n            }\n\n            terrain = this._prioritizeTerrain(\n                terrain,\n                style.terrain,\n                style.stylesheet.terrain,\n            );\n\n            if (style.stylesheet.fog && style.fog != null)\n                fog = style.fog;\n\n            if (style.stylesheet.camera != null)\n                camera = style.stylesheet.camera;\n\n            if (style.stylesheet.projection != null)\n                projection = style.stylesheet.projection;\n\n            if (style.stylesheet.transition != null)\n                transition = style.stylesheet.transition;\n        });\n\n        // $FlowFixMe[incompatible-type]\n        this.light = light;\n        this.ambientLight = ambientLight;\n        this.directionalLight = directionalLight;\n        this.fog = fog;\n\n        if (terrain === null) {\n            delete this.terrain;\n        } else {\n            this.terrain = terrain;\n        }\n\n        // Use perspective camera as a fallback if no camera is specified\n        this.camera = camera || {'camera-projection': 'perspective'};\n        this.projection = projection || {name: 'mercator'};\n        this.transition = extend({}, defaultTransition, transition);\n\n        this.mergeSources();\n        this.mergeLayers();\n    }\n\n    forEachFragmentStyle(fn: (style: Style) => void) {\n        const traverse = (style: Style) => {\n            for (const fragment of style.fragments) {\n                traverse(fragment.style);\n            }\n\n            fn(style);\n        };\n\n        traverse(this);\n    }\n\n    _prioritizeTerrain(prevTerrain: ?Terrain, nextTerrain: ?Terrain, nextTerrainSpec: ?TerrainSpecification): ?Terrain {\n        // Given the previous and next terrain during imports merging, in order of priority, we select:\n        // 1. null, if the next terrain is explicitly disabled and we are not using the globe\n        // 2. next terrain if it is not null\n        // 3. previous terrain\n\n        const prevIsDeffered = prevTerrain && prevTerrain.drapeRenderMode === DrapeRenderMode.deferred;\n        const nextIsDeffered = nextTerrain && nextTerrain.drapeRenderMode === DrapeRenderMode.deferred;\n\n        // Disable terrain if it was explicitly set to null and we are not using globe\n        if (nextTerrainSpec === null) {\n            // First, check if the terrain is deferred\n            // If so, we are using the globe and should keep the terrain\n            if (nextIsDeffered) return nextTerrain;\n            if (prevIsDeffered) return prevTerrain;\n\n            return null;\n        }\n\n        // Use next terrain if there is no previous terrain or if it is deferred\n        if (nextTerrain != null) {\n            const nextIsElevated = nextTerrain && nextTerrain.drapeRenderMode === DrapeRenderMode.elevated;\n            if (!prevTerrain || prevIsDeffered || nextIsElevated) return nextTerrain;\n        }\n\n        return prevTerrain;\n    }\n\n    mergeTerrain() {\n        let terrain;\n\n        // Reset terrain that might have been set by a previous merge\n        if (this.terrain && this.terrain.scope !== this.scope) {\n            delete this.terrain;\n        }\n\n        this.forEachFragmentStyle((style: Style) => {\n            terrain = this._prioritizeTerrain(\n                terrain,\n                style.terrain,\n                style.stylesheet.terrain,\n            );\n        });\n\n        if (terrain === null) {\n            delete this.terrain;\n        } else {\n            this.terrain = terrain;\n        }\n    }\n\n    mergeProjection() {\n        let projection;\n\n        this.forEachFragmentStyle((style: Style) => {\n            if (style.stylesheet.projection != null)\n                projection = style.stylesheet.projection;\n        });\n\n        this.projection = projection || {name: 'mercator'};\n    }\n\n    mergeSources() {\n        const mergedSourceCaches = {};\n        const mergedOtherSourceCaches = {};\n        const mergedSymbolSourceCaches = {};\n\n        this.forEachFragmentStyle((style: Style) => {\n            for (const id in style._sourceCaches) {\n                const fqid = makeFQID(id, style.scope);\n                mergedSourceCaches[fqid] = style._sourceCaches[id];\n            }\n\n            for (const id in style._otherSourceCaches) {\n                const fqid = makeFQID(id, style.scope);\n                mergedOtherSourceCaches[fqid] = style._otherSourceCaches[id];\n            }\n\n            for (const id in style._symbolSourceCaches) {\n                const fqid = makeFQID(id, style.scope);\n                mergedSymbolSourceCaches[fqid] = style._symbolSourceCaches[id];\n            }\n        });\n\n        this._mergedSourceCaches = mergedSourceCaches;\n        this._mergedOtherSourceCaches = mergedOtherSourceCaches;\n        this._mergedSymbolSourceCaches = mergedSymbolSourceCaches;\n    }\n\n    mergeLayers() {\n        const slots: {[string]: StyleLayer[]} = {};\n        const mergedOrder: StyleLayer[] = [];\n        const mergedLayers: {[string]: StyleLayer} = {};\n\n        this._has3DLayers = false;\n        this._hasCircleLayers = false;\n        this._hasSymbolLayers = false;\n\n        this.forEachFragmentStyle((style: Style) => {\n            for (const layerId of style._order) {\n                const layer = style._layers[layerId];\n                if (layer.type === 'slot') {\n                    const slotName = getNameFromFQID(layerId);\n                    if (slots[slotName]) continue;\n                    else slots[slotName] = [];\n                }\n\n                if (layer.slot && slots[layer.slot]) {\n                    slots[layer.slot].push(layer);\n                    continue;\n                }\n\n                mergedOrder.push(layer);\n            }\n        });\n\n        this._mergedOrder = [];\n        const sort = (layers: StyleLayer[] = []) => {\n            for (const layer of layers) {\n                if (layer.type === 'slot') {\n                    const slotName = getNameFromFQID(layer.id);\n                    if (slots[slotName]) sort(slots[slotName]);\n                } else {\n                    const fqid = makeFQID(layer.id, layer.scope);\n                    this._mergedOrder.push(fqid);\n                    mergedLayers[fqid] = layer;\n\n                    // Typed layer bookkeeping\n                    if (layer.is3D()) this._has3DLayers = true;\n                    if (layer.type === 'circle') this._hasCircleLayers = true;\n                    if (layer.type === 'symbol') this._hasSymbolLayers = true;\n                }\n            }\n        };\n\n        sort(mergedOrder);\n        this._mergedLayers = mergedLayers;\n        this.updateDrapeFirstLayers();\n        this._buildingIndex.processLayersChanged();\n    }\n\n    terrainSetForDrapingOnly(): boolean {\n        return !!this.terrain && this.terrain.drapeRenderMode === DrapeRenderMode.deferred;\n    }\n\n    getCamera(): ?CameraSpecification {\n        return this.stylesheet.camera;\n    }\n\n    setCamera(camera: CameraSpecification): Style {\n        this.stylesheet.camera = extend({}, this.stylesheet.camera, camera);\n        this.camera = this.stylesheet.camera;\n        return this;\n    }\n\n    setProjection(projection?: ?ProjectionSpecification) {\n        if (projection) {\n            this.stylesheet.projection = projection;\n        } else {\n            delete this.stylesheet.projection;\n        }\n        this.mergeProjection();\n        this._updateMapProjection();\n    }\n\n    applyProjectionUpdate() {\n        if (!this._loaded) return;\n        this.dispatcher.broadcast('setProjection', this.map.transform.projectionOptions);\n\n        if (this.map.transform.projection.requiresDraping) {\n            const hasTerrain = (this.getTerrain() || this.stylesheet.terrain) && !this.disableElevatedTerrain;\n            if (!hasTerrain) {\n                this.setTerrainForDraping();\n            }\n        } else if (this.terrainSetForDrapingOnly()) {\n            this.setTerrain(null, DrapeRenderMode.deferred);\n        }\n    }\n\n    _updateMapProjection() {\n        // Skip projection updates from the children fragments\n        if (!this.isRootStyle()) return;\n\n        if (!this.map._useExplicitProjection) { // Update the visible projection if map's is null\n            this.map._prioritizeAndUpdateProjection(null, this.projection);\n        } else { // Ensure that style is consistent with current projection on style load\n            this.applyProjectionUpdate();\n        }\n    }\n\n    _loadSprite(url: string) {\n        this._spriteRequest = loadSprite(url, this.map._requestManager, (err, images) => {\n            this._spriteRequest = null;\n            if (err) {\n                this.fire(new ErrorEvent(err));\n            } else if (images) {\n                for (const id in images) {\n                    this.imageManager.addImage(id, this.scope, images[id]);\n                }\n            }\n\n            this.imageManager.setLoaded(true, this.scope);\n            this._availableImages = this.imageManager.listImages(this.scope);\n            this.dispatcher.broadcast('setImages', {\n                scope: this.scope,\n                images: this._availableImages\n            });\n            this.dispatcher.broadcast('spriteLoaded', {scope: this.scope, isLoaded: true});\n            this.fire(new Event('data', {dataType: 'style'}));\n        });\n    }\n\n    _validateLayer(layer: StyleLayer) {\n        const source = this.getOwnSource(layer.source);\n        if (!source) {\n            return;\n        }\n\n        const sourceLayer = layer.sourceLayer;\n        if (!sourceLayer) {\n            return;\n        }\n\n        if (source.type === 'geojson' || (source.vectorLayerIds && source.vectorLayerIds.indexOf(sourceLayer) === -1)) {\n            this.fire(new ErrorEvent(new Error(\n                `Source layer \"${sourceLayer}\" ` +\n                `does not exist on source \"${source.id}\" ` +\n                `as specified by style layer \"${layer.id}\"`\n            )));\n        }\n    }\n\n    loaded(): boolean {\n        if (!this._loaded)\n            return false;\n\n        if (Object.keys(this._changes.getUpdatedSourceCaches()).length)\n            return false;\n\n        for (const id in this._sourceCaches)\n            if (!this._sourceCaches[id].loaded())\n                return false;\n\n        if (!this.imageManager.isLoaded())\n            return false;\n\n        if (!this.modelManager.isLoaded())\n            return false;\n\n        for (const {style} of this.fragments) {\n            if (!style.loaded()) return false;\n        }\n\n        return true;\n    }\n\n    _serializeImports(): Array<ImportSpecification> | void {\n        if (!this.stylesheet.imports) return undefined;\n\n        return this.stylesheet.imports.map((importSpec, index) => {\n            const fragment = this.fragments[index];\n            if (fragment && fragment.style) {\n                importSpec.data = fragment.style.serialize();\n            }\n\n            return importSpec;\n        });\n    }\n\n    _serializeSources(): {[sourceId: string]: SourceSpecification} {\n        const sources = {};\n        for (const cacheId in this._sourceCaches) {\n            const source = this._sourceCaches[cacheId].getSource();\n            if (!sources[source.id]) {\n                sources[source.id] = source.serialize();\n            }\n        }\n\n        return sources;\n    }\n\n    _serializeLayers(ids: Array<string>): Array<LayerSpecification> {\n        const serializedLayers = [];\n        for (const id of ids) {\n            const layer = this._layers[id];\n            if (layer && layer.type !== 'custom') {\n                serializedLayers.push(layer.serialize());\n            }\n        }\n        return serializedLayers;\n    }\n\n    hasLightTransitions(): boolean {\n        if (this.light && this.light.hasTransition()) {\n            return true;\n        }\n\n        if (this.ambientLight && this.ambientLight.hasTransition()) {\n            return true;\n        }\n\n        if (this.directionalLight && this.directionalLight.hasTransition()) {\n            return true;\n        }\n\n        return false;\n    }\n\n    hasFogTransition(): boolean {\n        if (!this.fog) return false;\n        return this.fog.hasTransition();\n    }\n\n    hasTransitions(): boolean {\n        if (this.hasLightTransitions()) {\n            return true;\n        }\n\n        if (this.hasFogTransition()) {\n            return true;\n        }\n\n        for (const id in this._sourceCaches) {\n            if (this._sourceCaches[id].hasTransition()) {\n                return true;\n            }\n        }\n\n        for (const layerId in this._layers) {\n            const layer = this._layers[layerId];\n            if (layer.hasTransition()) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    get order(): Array<string> {\n        if (this.terrain) {\n            assert(this._drapedFirstOrder.length === this._mergedOrder.length, 'drapedFirstOrder doesn\\'t match order');\n            return this._drapedFirstOrder;\n        }\n        return this._mergedOrder;\n    }\n\n    isLayerDraped(layer: StyleLayer): boolean {\n        if (!this.terrain) return false;\n        return layer.isDraped(this.getLayerSourceCache(layer));\n    }\n\n    _checkLoaded(): void {\n        if (!this._loaded) {\n            throw new Error('Style is not done loading');\n        }\n    }\n\n    _checkLayer(layerId: string): ?StyleLayer {\n        const layer = this.getOwnLayer(layerId);\n        if (!layer) {\n            this.fire(new ErrorEvent(new Error(`The layer '${layerId}' does not exist in the map's style.`)));\n            return;\n        }\n        return layer;\n    }\n\n    _checkSource(sourceId: string): ?Source {\n        const source = this.getOwnSource(sourceId);\n        if (!source) {\n            this.fire(new ErrorEvent(new Error(`The source '${sourceId}' does not exist in the map's style.`)));\n            return;\n        }\n        return source;\n    }\n\n    /**\n     * Apply queued style updates in a batch and recalculate zoom-dependent paint properties.\n     * @private\n     */\n    update(parameters: EvaluationParameters) {\n        if (!this._loaded) {\n            return;\n        }\n\n        if (this.ambientLight) {\n            this.ambientLight.recalculate(parameters);\n        }\n\n        if (this.directionalLight) {\n            this.directionalLight.recalculate(parameters);\n        }\n\n        const brightness = this.calculateLightsBrightness();\n        parameters.brightness = brightness || 0.0;\n        if (brightness !== this._brightness) {\n            this._brightness = brightness;\n            this.dispatcher.broadcast('setBrightness', brightness);\n        }\n\n        const changed = this._changes.isDirty();\n        if (this._changes.isDirty()) {\n            const updatesByScope = this._changes.getLayerUpdatesByScope();\n            for (const scope in updatesByScope) {\n                const {updatedIds, removedIds} = updatesByScope[scope];\n                if (updatedIds || removedIds) {\n                    this._updateWorkerLayers(scope, updatedIds, removedIds);\n                }\n            }\n\n            this.updateSourceCaches();\n            this._updateTilesForChangedImages();\n\n            this.updateLayers(parameters);\n\n            if (this.light) {\n                this.light.updateTransitions(parameters);\n            }\n\n            if (this.ambientLight) {\n                this.ambientLight.updateTransitions(parameters);\n            }\n\n            if (this.directionalLight) {\n                this.directionalLight.updateTransitions(parameters);\n            }\n\n            if (this.fog) {\n                this.fog.updateTransitions(parameters);\n            }\n\n            this._changes.reset();\n        }\n\n        const sourcesUsedBefore = {};\n\n        for (const sourceId in this._mergedSourceCaches) {\n            const sourceCache = this._mergedSourceCaches[sourceId];\n            sourcesUsedBefore[sourceId] = sourceCache.used;\n            sourceCache.used = false;\n            sourceCache.tileCoverLift = 0.0;\n        }\n\n        for (const layerId of this._mergedOrder) {\n            const layer = this._mergedLayers[layerId];\n            layer.recalculate(parameters, this._availableImages);\n            if (!layer.isHidden(parameters.zoom)) {\n                const sourceCache = this.getLayerSourceCache(layer);\n                if (sourceCache) {\n                    sourceCache.used = true;\n                    // Select the highest elevation across all layers that are rendered with this source\n                    sourceCache.tileCoverLift = Math.max(sourceCache.tileCoverLift, layer.tileCoverLift());\n                }\n            }\n\n            if (!this._precompileDone && this._shouldPrecompile) {\n                for (let i = (layer.minzoom || DEFAULT_MIN_ZOOM); i < (layer.maxzoom || DEFAULT_MAX_ZOOM); i++) {\n                    const painter = this.map.painter;\n                    if (painter) {\n                        const programIds = layer.getProgramIds();\n                        if (!programIds) continue;\n\n                        for (const programId of programIds) {\n                            const params = layer.getDefaultProgramParams(programId, parameters.zoom);\n                            if (params) {\n                                painter.style = this;\n                                if (this.fog) {\n                                    painter._fogVisible = true;\n                                    params.overrideFog = true;\n                                    painter.getOrCreateProgram(programId, params);\n                                }\n                                painter._fogVisible = false;\n                                params.overrideFog = false;\n                                painter.getOrCreateProgram(programId, params);\n\n                                if (this.stylesheet.terrain || (this.stylesheet.projection && this.stylesheet.projection.name === 'globe')) {\n                                    params.overrideRtt = true;\n                                    painter.getOrCreateProgram(programId, params);\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        if (this._shouldPrecompile) {\n            this._precompileDone = true;\n        }\n\n        for (const sourceId in sourcesUsedBefore) {\n            const sourceCache = this._mergedSourceCaches[sourceId];\n            if (sourcesUsedBefore[sourceId] !== sourceCache.used) {\n                sourceCache.getSource().fire(new Event('data', {sourceDataType: 'visibility', dataType:'source', sourceId: sourceCache.getSource().id}));\n            }\n        }\n\n        if (this.light) {\n            this.light.recalculate(parameters);\n        }\n\n        if (this.terrain) {\n            this.terrain.recalculate(parameters);\n        }\n\n        if (this.fog) {\n            this.fog.recalculate(parameters);\n        }\n\n        this.z = parameters.zoom;\n\n        if (this._markersNeedUpdate) {\n            this._updateMarkersOpacity();\n            this._markersNeedUpdate = false;\n        }\n\n        if (changed) {\n            this.fire(new Event('data', {dataType: 'style'}));\n        }\n    }\n\n    /*\n     * Apply any queued image changes.\n     */\n    _updateTilesForChangedImages() {\n        const updatedImages = this._changes.getUpdatedImages();\n        if (updatedImages.length) {\n            for (const name in this._sourceCaches) {\n                this._sourceCaches[name].reloadTilesForDependencies(['icons', 'patterns'], updatedImages);\n            }\n            this._changes.resetUpdatedImages();\n        }\n    }\n\n    _updateWorkerLayers(scope: string, updatedIds?: Array<string>, removedIds?: Array<string>) {\n        const fragmentStyle = this.getFragmentStyle(scope);\n        if (!fragmentStyle) return;\n\n        this.dispatcher.broadcast('updateLayers', {\n            layers: updatedIds ? fragmentStyle._serializeLayers(updatedIds) : [],\n            scope,\n            removedIds: removedIds || [],\n            options: fragmentStyle.options\n        });\n    }\n\n    /**\n     * Update this style's state to match the given style JSON, performing only\n     * the necessary mutations.\n     *\n     * May throw an Error ('Unimplemented: METHOD') if the mapbox-gl-style-spec\n     * diff algorithm produces an operation that is not supported.\n     *\n     * @returns {boolean} true if any changes were made; false otherwise\n     * @private\n     */\n    setState(nextState: StyleSpecification, onFinish?: () => void): boolean {\n        this._checkLoaded();\n\n        if (emitValidationErrors(this, validateStyle(nextState))) return false;\n\n        nextState = clone(nextState);\n        nextState.layers = deref(nextState.layers);\n\n        const changes = diffStyles(this.serialize(), nextState)\n            .filter(op => !(op.command in ignoredDiffOperations));\n\n        if (changes.length === 0) {\n            return false;\n        }\n\n        const unimplementedOps = changes.filter(op => !(op.command in supportedDiffOperations));\n        if (unimplementedOps.length > 0) {\n            throw new Error(`Unimplemented: ${unimplementedOps.map(op => op.command).join(', ')}.`);\n        }\n\n        const changesPromises = [];\n\n        changes.forEach((op) => {\n            changesPromises.push((this: any)[op.command].apply(this, op.args));\n        });\n\n        if (onFinish) {\n            Promise.all(changesPromises).then(onFinish);\n        }\n\n        this.stylesheet = nextState;\n        this.mergeAll();\n\n        this.dispatcher.broadcast('setLayers', {\n            layers: this._serializeLayers(this._order),\n            scope: this.scope,\n            options: this.options\n        });\n\n        return true;\n    }\n\n    addImage(id: string, image: StyleImage): this {\n        if (this.getImage(id)) {\n            return this.fire(new ErrorEvent(new Error('An image with this name already exists.')));\n        }\n        this.imageManager.addImage(id, this.scope, image);\n        this._afterImageUpdated(id);\n        return this;\n    }\n\n    updateImage(id: string, image: StyleImage) {\n        this.imageManager.updateImage(id, this.scope, image);\n    }\n\n    getImage(id: string): ?StyleImage {\n        return this.imageManager.getImage(id, this.scope);\n    }\n\n    removeImage(id: string): this {\n        if (!this.getImage(id)) {\n            return this.fire(new ErrorEvent(new Error('No image with this name exists.')));\n        }\n        this.imageManager.removeImage(id, this.scope);\n        this._afterImageUpdated(id);\n        return this;\n    }\n\n    _afterImageUpdated(id: string) {\n        this._availableImages = this.imageManager.listImages(this.scope);\n        this._changes.updateImage(id);\n        this.dispatcher.broadcast('setImages', {\n            scope: this.scope,\n            images: this._availableImages\n        });\n        this.fire(new Event('data', {dataType: 'style'}));\n    }\n\n    listImages(): Array<string> {\n        this._checkLoaded();\n        return this._availableImages.slice();\n    }\n\n    addModel(id: string, url: string, options: StyleSetterOptions = {}): this {\n        this._checkLoaded();\n        if (this._validate(validateModel, `models.${id}`, url, null, options)) return this;\n\n        this.modelManager.addModel(id, url, this.scope);\n        this._changes.setDirty();\n        return this;\n    }\n\n    hasModel(id: string): boolean {\n        return this.modelManager.hasModel(id, this.scope);\n    }\n\n    removeModel(id: string): this {\n        if (!this.hasModel(id)) {\n            return this.fire(new ErrorEvent(new Error('No model with this ID exists.')));\n        }\n        this.modelManager.removeModel(id, this.scope);\n        return this;\n    }\n\n    listModels(): Array<string> {\n        this._checkLoaded();\n        return this.modelManager.listModels(this.scope);\n    }\n\n    addSource(id: string, source: SourceSpecification, options: StyleSetterOptions = {}): void {\n        this._checkLoaded();\n\n        if (this.getOwnSource(id) !== undefined) {\n            throw new Error(`There is already a source with ID \"${id}\".`);\n        }\n\n        if (!source.type) {\n            throw new Error(`The type property must be defined, but only the following properties were given: ${Object.keys(source).join(', ')}.`);\n        }\n\n        const builtIns = ['vector', 'raster', 'geojson', 'video', 'image'];\n        const shouldValidate = builtIns.indexOf(source.type) >= 0;\n        if (shouldValidate && this._validate(validateSource, `sources.${id}`, source, null, options)) return;\n\n        if (this.map && this.map._collectResourceTiming) (source: any).collectResourceTiming = true;\n        const sourceInstance = createSource(id, source, this.dispatcher, this);\n        sourceInstance.scope = this.scope;\n\n        sourceInstance.setEventedParent(this, () => ({\n            isSourceLoaded: this._isSourceCacheLoaded(sourceInstance.id),\n            source: sourceInstance.serialize(),\n            sourceId: sourceInstance.id\n        }));\n\n        const addSourceCache = (onlySymbols: boolean) => {\n            const sourceCacheId = (onlySymbols ? 'symbol:' : 'other:') + sourceInstance.id;\n            const sourceCacheFQID = makeFQID(sourceCacheId, this.scope);\n            const sourceCache = this._sourceCaches[sourceCacheId] = new SourceCache(sourceCacheFQID, sourceInstance, onlySymbols);\n            (onlySymbols ? this._symbolSourceCaches : this._otherSourceCaches)[sourceInstance.id] = sourceCache;\n            sourceCache.onAdd(this.map);\n        };\n\n        addSourceCache(false);\n        if (source.type === 'vector' || source.type === 'geojson') {\n            addSourceCache(true);\n        }\n\n        if (sourceInstance.onAdd) sourceInstance.onAdd(this.map);\n\n        // Avoid triggering redundant style update after adding initial sources.\n        if (!options.isInitialLoad) {\n            this.mergeSources();\n            this._changes.setDirty();\n        }\n    }\n\n    /**\n     * Remove a source from this stylesheet, given its ID.\n     * @param {string} id ID of the source to remove.\n     * @throws {Error} If no source is found with the given ID.\n     * @returns {Map} The {@link Map} object.\n     */\n    removeSource(id: string): this {\n        this._checkLoaded();\n\n        const source = this.getOwnSource(id);\n        if (!source) {\n            throw new Error('There is no source with this ID');\n        }\n        for (const layerId in this._layers) {\n            if (this._layers[layerId].source === id) {\n                return this.fire(new ErrorEvent(new Error(`Source \"${id}\" cannot be removed while layer \"${layerId}\" is using it.`)));\n            }\n        }\n        if (this.terrain && this.terrain.scope === this.scope && this.terrain.get().source === id) {\n            return this.fire(new ErrorEvent(new Error(`Source \"${id}\" cannot be removed while terrain is using it.`)));\n        }\n\n        const sourceCaches = this.getOwnSourceCaches(id);\n        for (const sourceCache of sourceCaches) {\n            const id = getNameFromFQID(sourceCache.id);\n            delete this._sourceCaches[id];\n            this._changes.discardSourceCacheUpdate(sourceCache.id);\n            sourceCache.fire(new Event('data', {sourceDataType: 'metadata', dataType:'source', sourceId: sourceCache.getSource().id}));\n            sourceCache.setEventedParent(null);\n            sourceCache.clearTiles();\n        }\n        delete this._otherSourceCaches[id];\n        delete this._symbolSourceCaches[id];\n        this.mergeSources();\n\n        source.setEventedParent(null);\n        if (source.onRemove) {\n            source.onRemove(this.map);\n        }\n        this._changes.setDirty();\n        return this;\n    }\n\n    /**\n     * Set the data of a GeoJSON source, given its ID.\n     * @param {string} id ID of the source.\n     * @param {GeoJSON|string} data GeoJSON source.\n     */\n    setGeoJSONSourceData(id: string, data: GeoJSON | string) {\n        this._checkLoaded();\n\n        assert(this.getOwnSource(id) !== undefined, 'There is no source with this ID');\n        const geojsonSource: GeoJSONSource = (this.getOwnSource(id): any);\n        assert(geojsonSource.type === 'geojson');\n\n        geojsonSource.setData(data);\n        this._changes.setDirty();\n    }\n\n    /**\n     * Get a source by ID.\n     * @param {string} id ID of the desired source.\n     * @returns {?Source} The source object.\n     */\n    getOwnSource(id: string): ?Source {\n        const sourceCache = this.getOwnSourceCache(id);\n        return sourceCache && sourceCache.getSource();\n    }\n\n    getOwnSources(): Source[] {\n        const sources = [];\n        for (const id in this._otherSourceCaches) {\n            const sourceCache = this.getOwnSourceCache(id);\n            if (sourceCache) sources.push(sourceCache.getSource());\n        }\n\n        return sources;\n    }\n\n    areTilesLoaded(): boolean {\n        const sources = this._mergedSourceCaches;\n        for (const id in sources) {\n            const source = sources[id];\n            const tiles = source._tiles;\n            for (const t in tiles) {\n                const tile = tiles[t];\n                if (!(tile.state === 'loaded' || tile.state === 'errored')) return false;\n            }\n        }\n        return true;\n    }\n\n    setLights(lights: ?Array<LightsSpecification>) {\n        this._checkLoaded();\n\n        if (!lights) {\n            delete this.ambientLight;\n            delete this.directionalLight;\n            return;\n        }\n\n        const transitionParameters = this._getTransitionParameters();\n\n        for (const light of lights) {\n            if (this._validate(validateLights, 'lights', light)) {\n                return;\n            }\n\n            switch (light.type) {\n            case 'ambient':\n                if (this.ambientLight) {\n                    const ambientLight = this.ambientLight;\n                    ambientLight.set(light);\n                    ambientLight.updateTransitions(transitionParameters);\n                } else {\n                    this.ambientLight = new Lights<Ambient>(light, ambientProps, this.scope, this.options);\n                }\n                break;\n            case 'directional':\n                if (this.directionalLight) {\n                    const directionalLight = this.directionalLight;\n                    directionalLight.set(light);\n                    directionalLight.updateTransitions(transitionParameters);\n                } else {\n                    this.directionalLight = new Lights<Directional>(light, directionalProps, this.scope, this.options);\n                }\n                break;\n            default:\n                assert(false, `Unknown light type: ${light.type}`);\n            }\n        }\n\n        const evaluationParameters = new EvaluationParameters(this.z || 0, transitionParameters);\n\n        if (this.ambientLight) {\n            this.ambientLight.recalculate(evaluationParameters);\n        }\n\n        if (this.directionalLight) {\n            this.directionalLight.recalculate(evaluationParameters);\n        }\n\n        this._brightness = this.calculateLightsBrightness();\n        this.dispatcher.broadcast('setBrightness', this._brightness);\n    }\n\n    calculateLightsBrightness(): ?number {\n        const directional = this.directionalLight;\n        const ambient = this.ambientLight;\n\n        if (!directional || !ambient) {\n            return;\n        }\n\n        // Based on: https://www.w3.org/WAI/GL/wiki/Relative_luminance\n        const relativeLuminance = (color: [number, number, number, number]) => {\n            const r = color[0] <= 0.03928 ? (color[0] / 12.92) : Math.pow(((color[0] + 0.055) / 1.055), 2.4);\n            const g = color[1] <= 0.03928 ? (color[1] / 12.92) : Math.pow(((color[1] + 0.055) / 1.055), 2.4);\n            const b = color[2] <= 0.03928 ? (color[2] / 12.92) : Math.pow(((color[2] + 0.055) / 1.055), 2.4);\n            return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n        };\n\n        const directionalColor = directional.properties.get('color').toArray01();\n        const directionalIntensity = directional.properties.get('intensity');\n        const direction = directional.properties.get('direction');\n\n        const sphericalDirection = cartesianPositionToSpherical(direction.x, direction.y, direction.z);\n        const polarIntensity = 1.0 - sphericalDirection[2] / 90.0;\n        const directionalBrightness = relativeLuminance(directionalColor) * directionalIntensity * polarIntensity;\n\n        const ambientColor = ambient.properties.get('color').toArray01();\n        const ambientIntensity = ambient.properties.get('intensity');\n        const ambientBrightness = relativeLuminance(ambientColor) * ambientIntensity;\n\n        return (directionalBrightness + ambientBrightness) / 2.0;\n    }\n\n    getBrightness(): ?number {\n        return this._brightness;\n    }\n\n    getLights(): ?Array<LightsSpecification> {\n        if (!this.enable3dLights()) return null;\n        const lights = [];\n        if (this.directionalLight) {\n            lights.push(this.directionalLight.get());\n        }\n        if (this.ambientLight) {\n            lights.push(this.ambientLight.get());\n        }\n        return lights;\n    }\n\n    enable3dLights(): boolean {\n        return !!this.ambientLight && !!this.directionalLight;\n    }\n\n    getFragmentStyle(fragmentId?: string): ?Style {\n        if (!fragmentId) return this;\n\n        if (isFQID(fragmentId)) {\n            const scope = getScopeFromFQID(fragmentId);\n            const fragment = this.fragments.find(({id}) => id === scope);\n            if (!fragment) throw new Error(`Style import not found: ${fragmentId}`);\n            const name = getNameFromFQID(fragmentId);\n            return fragment.style.getFragmentStyle(name);\n        } else {\n            const fragment = this.fragments.find(({id}) => id === fragmentId);\n            if (!fragment) throw new Error(`Style import not found: ${fragmentId}`);\n            return fragment.style;\n        }\n    }\n\n    getConfigProperty(fragmentId: string, key: string): mixed {\n        const fragmentStyle = this.getFragmentStyle(fragmentId);\n        if (!fragmentStyle) return null;\n        const fqid = makeFQID(key, fragmentStyle.scope);\n        const expressions = fragmentStyle.options.get(fqid);\n        const expression = expressions ? expressions.value || expressions.default : null;\n        return expression ? expression.serialize() : null;\n    }\n\n    setConfigProperty(fragmentId: string, key: string, value: mixed) {\n        const fragmentStyle = this.getFragmentStyle(fragmentId);\n        if (!fragmentStyle) return;\n\n        const schema = fragmentStyle.stylesheet.schema;\n        if (!schema || !schema[key]) return;\n\n        const expressionParsed = createExpression(value);\n        if (expressionParsed.result !== 'success') {\n            emitValidationErrors(this, expressionParsed.value);\n            return;\n        }\n\n        const expression = expressionParsed.value.expression;\n\n        const fqid = makeFQID(key, fragmentStyle.scope);\n        const expressions = fragmentStyle.options.get(fqid);\n        if (!expressions) return;\n\n        let defaultExpression;\n        const {minValue, maxValue, stepValue, type, values} = schema[key];\n        const defaultExpressionParsed = createExpression(schema[key].default);\n        if (defaultExpressionParsed.result === 'success') {\n            defaultExpression = defaultExpressionParsed.value.expression;\n        }\n\n        if (!defaultExpression) {\n            this.fire(new ErrorEvent(new Error(`No schema defined for the config option \"${key}\" in the \"${fragmentId}\" fragment.`)));\n            return;\n        }\n\n        this.options.set(fqid, {\n            ...expressions,\n            value: expression,\n            default: defaultExpression,\n            minValue, maxValue, stepValue, type, values\n        });\n\n        this.updateConfigDependencies();\n    }\n\n    getConfig(fragmentId: string): ?ConfigSpecification {\n        const fragmentStyle = this.getFragmentStyle(fragmentId);\n        if (!fragmentStyle) return null;\n\n        const schema = fragmentStyle.stylesheet.schema;\n        if (!schema) return null;\n\n        const config = {};\n        for (const key in schema) {\n            const fqid = makeFQID(key, fragmentStyle.scope);\n            const expressions = fragmentStyle.options.get(fqid);\n            const expression = expressions ? expressions.value || expressions.default : null;\n            config[key] = expression ? expression.serialize() : null;\n        }\n\n        return config;\n    }\n\n    setConfig(fragmentId: string, config: ?ConfigSpecification) {\n        const fragmentStyle = this.getFragmentStyle(fragmentId);\n        if (!fragmentStyle) return;\n\n        const schema = fragmentStyle.stylesheet.schema;\n        fragmentStyle.updateConfig(config, schema);\n\n        this.updateConfigDependencies();\n    }\n\n    getSchema(fragmentId: string): ?SchemaSpecification {\n        const fragmentStyle = this.getFragmentStyle(fragmentId);\n        if (!fragmentStyle) return null;\n        return fragmentStyle.stylesheet.schema;\n    }\n\n    setSchema(fragmentId: string, schema: SchemaSpecification) {\n        const fragmentStyle = this.getFragmentStyle(fragmentId);\n        if (!fragmentStyle) return;\n\n        fragmentStyle.stylesheet.schema = schema;\n        fragmentStyle.updateConfig(fragmentStyle._config, schema);\n\n        this.updateConfigDependencies();\n    }\n\n    updateConfig(config: ?ConfigSpecification, schema: ?SchemaSpecification) {\n        this._config = config;\n\n        if (!config && !schema) return;\n\n        if (!schema) {\n            this.fire(new ErrorEvent(new Error(`Attempting to set config for a style without schema.`)));\n            return;\n        }\n\n        for (const id in schema) {\n            let defaultExpression;\n            let configExpression;\n\n            const expression = schema[id].default;\n            const expressionParsed = createExpression(expression);\n            if (expressionParsed.result === 'success') {\n                defaultExpression = expressionParsed.value.expression;\n            }\n\n            if (config && config[id] !== undefined) {\n                const expressionParsed = createExpression(config[id]);\n                if (expressionParsed.result === 'success') {\n                    configExpression = expressionParsed.value.expression;\n                }\n            }\n\n            const {minValue, maxValue, stepValue, type, values} = schema[id];\n\n            if (defaultExpression) {\n                const fqid = makeFQID(id, this.scope);\n                this.options.set(fqid, {\n                    default: defaultExpression,\n                    value: configExpression,\n                    minValue, maxValue, stepValue, type, values\n                });\n            } else {\n                this.fire(new ErrorEvent(new Error(`No schema defined for config option \"${id}\".`)));\n            }\n        }\n    }\n\n    updateConfigDependencies() {\n        for (const id of this._configDependentLayers) {\n            const layer = this.getLayer(id);\n            if (layer) {\n                layer.possiblyEvaluateVisibility();\n                this._updateLayer(layer);\n            }\n        }\n\n        if (this.ambientLight) {\n            this.ambientLight.updateConfig(this.options);\n        }\n\n        if (this.directionalLight) {\n            this.directionalLight.updateConfig(this.options);\n        }\n\n        if (this.fog) {\n            this.fog.updateConfig(this.options);\n        }\n\n        this._changes.setDirty();\n    }\n\n    /**\n     * Add a layer to the map style. The layer will be inserted before the layer with\n     * ID `before`, or appended if `before` is omitted.\n     * @param {Object | CustomLayerInterface} layerObject The style layer to add.\n     * @param {string} [before] ID of an existing layer to insert before.\n     * @param {Object} options Style setter options.\n     * @returns {Map} The {@link Map} object.\n     */\n    addLayer(layerObject: LayerSpecification | CustomLayerInterface, before?: string, options: StyleSetterOptions = {}) {\n        this._checkLoaded();\n\n        const id = layerObject.id;\n\n        if (this._layers[id]) {\n            this.fire(new ErrorEvent(new Error(`Layer with id \"${id}\" already exists on this map`)));\n            return;\n        }\n\n        let layer;\n        if (layerObject.type === 'custom') {\n            if (emitValidationErrors(this, validateCustomStyleLayer(layerObject))) return;\n            layer = createStyleLayer(layerObject, this.scope, this.options);\n        } else {\n            if (typeof layerObject.source === 'object') {\n                this.addSource(id, layerObject.source);\n                layerObject = clone(layerObject);\n                layerObject = (extend(layerObject, {source: id}): any);\n            }\n\n            // this layer is not in the style.layers array, so we pass an impossible array index\n            if (this._validate(validateLayer,\n                `layers.${id}`, layerObject, {arrayIndex: -1}, options)) return;\n\n            layer = createStyleLayer(layerObject, this.scope, this.options);\n            this._validateLayer(layer);\n\n            layer.setEventedParent(this, {layer: {id}});\n            this._serializedLayers[layer.id] = layer.serialize();\n        }\n\n        if (layer.isConfigDependent) this._configDependentLayers.add(layer.fqid);\n\n        let index = this._order.length;\n        if (before) {\n            const beforeIndex = this._order.indexOf(before);\n            if (beforeIndex === -1) {\n                this.fire(new ErrorEvent(new Error(`Layer with id \"${before}\" does not exist on this map.`)));\n                return;\n            }\n\n            // If the layer we're inserting doesn't have a slot,\n            // or it has the same slot as the 'before' layer,\n            // then we can insert the new layer before the existing one.\n            const beforeLayer = this._layers[before];\n            if (layer.slot === beforeLayer.slot) index = beforeIndex;\n            else warnOnce(`Layer with id \"${before}\" has a different slot. Layers can only be rearranged within the same slot.`);\n        }\n\n        this._order.splice(index, 0, id);\n        this._layerOrderChanged = true;\n\n        this._layers[id] = layer;\n\n        const sourceCache = this.getOwnLayerSourceCache(layer);\n        const shadowsEnabled = !!this.directionalLight && this.directionalLight.shadowsEnabled();\n\n        if (sourceCache && layer.canCastShadows() && shadowsEnabled) {\n            sourceCache.castsShadows = true;\n        }\n\n        const removedLayer = this._changes.getRemovedLayer(layer);\n        if (removedLayer && layer.source && sourceCache && layer.type !== 'custom') {\n            // If, in the current batch, we have already removed this layer\n            // and we are now re-adding it with a different `type`, then we\n            // need to clear (rather than just reload) the underyling source's\n            // tiles.  Otherwise, tiles marked 'reloading' will have buckets /\n            // buffers that are set up for the _previous_ version of this\n            // layer, causing, e.g.:\n            // https://github.com/mapbox/mapbox-gl-js/issues/3633\n            this._changes.discardLayerRemoval(layer);\n            const fqid = makeFQID(layer.source, layer.scope);\n            if (removedLayer.type !== layer.type) {\n                this._changes.updateSourceCache(fqid, 'clear');\n            } else {\n                this._changes.updateSourceCache(fqid, 'reload');\n                sourceCache.pause();\n            }\n        }\n\n        this._updateLayer(layer);\n\n        // $FlowFixMe[method-unbinding]\n        if (layer.onAdd) {\n            layer.onAdd(this.map);\n        }\n\n        layer.scope = this.scope;\n\n        this.mergeLayers();\n    }\n\n    /**\n     * Moves a layer to a different z-position. The layer will be inserted before the layer with\n     * ID `before`, or appended if `before` is omitted.\n     * @param {string} id  ID of the layer to move.\n     * @param {string} [before] ID of an existing layer to insert before.\n     */\n    moveLayer(id: string, before?: string) {\n        this._checkLoaded();\n\n        const layer = this._checkLayer(id);\n        if (!layer) return;\n\n        if (id === before) {\n            return;\n        }\n\n        const index = this._order.indexOf(id);\n        this._order.splice(index, 1);\n\n        let newIndex = this._order.length;\n        if (before) {\n            const beforeIndex = this._order.indexOf(before);\n            if (beforeIndex === -1) {\n                this.fire(new ErrorEvent(new Error(`Layer with id \"${before}\" does not exist on this map.`)));\n                return;\n            }\n\n            // If the layer we're moving doesn't have a slot,\n            // or it has the same slot as the 'before' layer,\n            // then we can insert the new layer before the existing one.\n            const beforeLayer = this._layers[before];\n            if (layer.slot === beforeLayer.slot) newIndex = beforeIndex;\n            else warnOnce(`Layer with id \"${before}\" has a different slot. Layers can only be rearranged within the same slot.`);\n        }\n\n        this._order.splice(newIndex, 0, id);\n\n        this._changes.setDirty();\n        this._layerOrderChanged = true;\n\n        this.mergeLayers();\n    }\n\n    /**\n     * Remove the layer with the given id from the style.\n     *\n     * If no such layer exists, an `error` event is fired.\n     *\n     * @param {string} id ID of the layer to remove.\n     * @fires Map.event:error\n     */\n    removeLayer(id: string) {\n        this._checkLoaded();\n\n        const layer = this._checkLayer(id);\n        if (!layer) return;\n\n        layer.setEventedParent(null);\n\n        const index = this._order.indexOf(id);\n        this._order.splice(index, 1);\n\n        delete this._layers[id];\n        delete this._serializedLayers[id];\n\n        this._changes.setDirty();\n        this._layerOrderChanged = true;\n\n        this._configDependentLayers.delete(layer.fqid);\n        this._changes.removeLayer(layer);\n\n        const sourceCache = this.getOwnLayerSourceCache(layer);\n\n        if (sourceCache && sourceCache.castsShadows) {\n            let shadowCastersLeft = false;\n            for (const key in this._layers) {\n                if (this._layers[key].source === layer.source && this._layers[key].canCastShadows()) {\n                    shadowCastersLeft = true;\n                    break;\n                }\n            }\n\n            sourceCache.castsShadows = shadowCastersLeft;\n        }\n\n        // $FlowFixMe[method-unbinding]\n        if (layer.onRemove) {\n            layer.onRemove(this.map);\n        }\n\n        this.mergeLayers();\n    }\n\n    /**\n     * Return the style layer object with the given `id`.\n     *\n     * @param {string} id ID of the desired layer.\n     * @returns {?StyleLayer} A layer, if one with the given `id` exists.\n     */\n    getOwnLayer(id: string): ?StyleLayer {\n        return this._layers[id];\n    }\n\n    /**\n     * Checks if a specific layer is present within the style.\n     *\n     * @param {string} id ID of the desired layer.\n     * @returns {boolean} A boolean specifying if the given layer is present.\n     */\n    hasLayer(id: string): boolean {\n        return id in this._mergedLayers;\n    }\n\n    /**\n     * Checks if a specific layer type is present within the style.\n     *\n     * @param {string} type Type of the desired layer.\n     * @returns {boolean} A boolean specifying if the given layer type is present.\n     */\n    hasLayerType(type: string): boolean {\n        for (const layerId in this._layers) {\n            const layer = this._layers[layerId];\n            if (layer.type === type) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    setLayerZoomRange(layerId: string, minzoom: ?number, maxzoom: ?number) {\n        this._checkLoaded();\n\n        const layer = this._checkLayer(layerId);\n        if (!layer) return;\n\n        if (layer.minzoom === minzoom && layer.maxzoom === maxzoom) return;\n\n        if (minzoom != null) {\n            layer.minzoom = minzoom;\n        }\n        if (maxzoom != null) {\n            layer.maxzoom = maxzoom;\n        }\n        this._updateLayer(layer);\n    }\n\n    setSlot(layerId: string, slot: ?string) {\n        this._checkLoaded();\n\n        const layer = this._checkLayer(layerId);\n        if (!layer) return;\n\n        if (layer.slot === slot) {\n            return;\n        }\n\n        layer.slot = slot;\n        this._updateLayer(layer);\n    }\n\n    setFilter(layerId: string, filter: ?FilterSpecification,  options: StyleSetterOptions = {}) {\n        this._checkLoaded();\n\n        const layer = this._checkLayer(layerId);\n        if (!layer) return;\n\n        if (deepEqual(layer.filter, filter)) {\n            return;\n        }\n\n        if (filter === null || filter === undefined) {\n            layer.filter = undefined;\n            this._updateLayer(layer);\n            return;\n        }\n\n        if (this._validate(validateFilter, `layers.${layer.id}.filter`, filter, {layerType: layer.type}, options)) {\n            return;\n        }\n\n        layer.filter = clone(filter);\n        this._updateLayer(layer);\n    }\n\n    /**\n     * Get a layer's filter object.\n     * @param {string} layerId The layer to inspect.\n     * @returns {*} The layer's filter, if any.\n     */\n    getFilter(layerId: string): ?FilterSpecification {\n        const layer = this._checkLayer(layerId);\n        if (!layer) return;\n        return clone(layer.filter);\n    }\n\n    setLayoutProperty(layerId: string, name: string, value: any, options: StyleSetterOptions = {}) {\n        this._checkLoaded();\n\n        const layer = this._checkLayer(layerId);\n        if (!layer) return;\n\n        if (deepEqual(layer.getLayoutProperty(name), value)) return;\n\n        if (value !== null && value !== undefined && !(options && options.validate === false)) {\n            const key = `layers.${layerId}.layout.${name}`;\n            const errors = emitValidationErrors(layer, validateLayoutProperty.call(validateStyle, {\n                key,\n                layerType: layer.type,\n                objectKey: name,\n                value,\n                styleSpec,\n                // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407\n                style: {glyphs: true, sprite: true}\n            }));\n            if (errors) {\n                return;\n            }\n        }\n\n        layer.setLayoutProperty(name, value);\n        if (layer.isConfigDependent) this._configDependentLayers.add(layer.fqid);\n        this._updateLayer(layer);\n    }\n\n    /**\n     * Get a layout property's value from a given layer.\n     * @param {string} layerId The layer to inspect.\n     * @param {string} name The name of the layout property.\n     * @returns {*} The property value.\n     */\n    getLayoutProperty(layerId: string, name: string): ?PropertyValueSpecification<mixed> {\n        const layer = this._checkLayer(layerId);\n        if (!layer) return;\n        return layer.getLayoutProperty(name);\n    }\n\n    setPaintProperty(layerId: string, name: string, value: any, options: StyleSetterOptions = {}) {\n        this._checkLoaded();\n\n        const layer = this._checkLayer(layerId);\n        if (!layer) return;\n\n        if (deepEqual(layer.getPaintProperty(name), value)) return;\n\n        if (value !== null && value !== undefined && !(options && options.validate === false)) {\n            const key = `layers.${layerId}.paint.${name}`;\n            const errors = emitValidationErrors(layer, validatePaintProperty.call(validateStyle, {\n                key,\n                layerType: layer.type,\n                objectKey: name,\n                value,\n                styleSpec\n            }));\n            if (errors) {\n                return;\n            }\n        }\n\n        const requiresRelayout = layer.setPaintProperty(name, value);\n        if (layer.isConfigDependent) this._configDependentLayers.add(layer.fqid);\n        if (requiresRelayout) {\n            this._updateLayer(layer);\n        }\n\n        this._changes.updatePaintProperties(layer);\n    }\n\n    getPaintProperty(layerId: string, name: string): void | TransitionSpecification | PropertyValueSpecification<mixed> {\n        const layer = this._checkLayer(layerId);\n        if (!layer) return;\n        return layer.getPaintProperty(name);\n    }\n\n    setFeatureState(target: { source: string; sourceLayer?: string; id: string | number; }, state: Object) {\n        this._checkLoaded();\n        const sourceId = target.source;\n        const sourceLayer = target.sourceLayer;\n\n        const source = this._checkSource(sourceId);\n        if (!source) return;\n\n        const sourceType = source.type;\n        if (sourceType === 'geojson' && sourceLayer) {\n            this.fire(new ErrorEvent(new Error(`GeoJSON sources cannot have a sourceLayer parameter.`)));\n            return;\n        }\n        if (sourceType === 'vector' && !sourceLayer) {\n            this.fire(new ErrorEvent(new Error(`The sourceLayer parameter must be provided for vector source types.`)));\n            return;\n        }\n        if (target.id === undefined) {\n            this.fire(new ErrorEvent(new Error(`The feature id parameter must be provided.`)));\n        }\n\n        const sourceCaches = this.getOwnSourceCaches(sourceId);\n        for (const sourceCache of sourceCaches) {\n            sourceCache.setFeatureState(sourceLayer, target.id, state);\n        }\n    }\n\n    removeFeatureState(target: { source: string; sourceLayer?: string; id?: string | number; }, key?: string) {\n        this._checkLoaded();\n        const sourceId = target.source;\n\n        const source = this._checkSource(sourceId);\n        if (!source) return;\n\n        const sourceType = source.type;\n        const sourceLayer = sourceType === 'vector' ? target.sourceLayer : undefined;\n\n        if (sourceType === 'vector' && !sourceLayer) {\n            this.fire(new ErrorEvent(new Error(`The sourceLayer parameter must be provided for vector source types.`)));\n            return;\n        }\n\n        if (key && (typeof target.id !== 'string' && typeof target.id !== 'number')) {\n            this.fire(new ErrorEvent(new Error(`A feature id is required to remove its specific state property.`)));\n            return;\n        }\n\n        const sourceCaches = this.getOwnSourceCaches(sourceId);\n        for (const sourceCache of sourceCaches) {\n            sourceCache.removeFeatureState(sourceLayer, target.id, key);\n        }\n    }\n\n    getFeatureState(target: { source: string; sourceLayer?: string; id: string | number; }): ?FeatureStates {\n        this._checkLoaded();\n        const sourceId = target.source;\n        const sourceLayer = target.sourceLayer;\n\n        const source = this._checkSource(sourceId);\n        if (!source) return;\n\n        const sourceType = source.type;\n        if (sourceType === 'vector' && !sourceLayer) {\n            this.fire(new ErrorEvent(new Error(`The sourceLayer parameter must be provided for vector source types.`)));\n            return;\n        }\n        if (target.id === undefined) {\n            this.fire(new ErrorEvent(new Error(`The feature id parameter must be provided.`)));\n        }\n\n        const sourceCaches = this.getOwnSourceCaches(sourceId);\n        return sourceCaches[0].getFeatureState(sourceLayer, target.id);\n    }\n\n    setTransition(transition: ?TransitionSpecification): Style {\n        this.stylesheet.transition = extend({}, this.stylesheet.transition, transition);\n        this.transition = this.stylesheet.transition;\n        return this;\n    }\n\n    getTransition(): TransitionSpecification {\n        return extend({}, this.stylesheet.transition);\n    }\n\n    serialize(): StyleSpecification {\n        this._checkLoaded();\n\n        const terrain = this.getTerrain();\n        const scopedTerrain = terrain && this.terrain && this.terrain.scope === this.scope ?\n            terrain :\n            this.stylesheet.terrain;\n\n        return filterObject({\n            version: this.stylesheet.version,\n            name: this.stylesheet.name,\n            metadata: this.stylesheet.metadata,\n            fragment: this.stylesheet.fragment,\n            imports: this._serializeImports(),\n            schema: this.stylesheet.schema,\n            camera: this.stylesheet.camera,\n            light: this.stylesheet.light,\n            lights: this.stylesheet.lights,\n            terrain: scopedTerrain,\n            fog: this.stylesheet.fog,\n            center: this.stylesheet.center,\n            zoom: this.stylesheet.zoom,\n            bearing: this.stylesheet.bearing,\n            pitch: this.stylesheet.pitch,\n            sprite: this.stylesheet.sprite,\n            glyphs: this.stylesheet.glyphs,\n            transition: this.stylesheet.transition,\n            projection: this.stylesheet.projection,\n            sources: this._serializeSources(),\n            layers: this._serializeLayers(this._order)\n        }, (value) => { return value !== undefined; });\n    }\n\n    _updateLayer(layer: StyleLayer) {\n        this._changes.updateLayer(layer);\n        const sourceCache = this.getLayerSourceCache(layer);\n        const fqid = makeFQID(layer.source, layer.scope);\n        const sourceCacheUpdates = this._changes.getUpdatedSourceCaches();\n        if (layer.source && !sourceCacheUpdates[fqid] &&\n            // Skip for raster layers (https://github.com/mapbox/mapbox-gl-js/issues/7865)\n            sourceCache && sourceCache.getSource().type !== 'raster') {\n            this._changes.updateSourceCache(fqid, 'reload');\n            sourceCache.pause();\n        }\n        layer.invalidateCompiledFilter();\n    }\n\n    _flattenAndSortRenderedFeatures(sourceResults: Array<any>): Array<mixed> {\n        // Feature order is complicated.\n        // The order between features in two 2D layers is determined by layer order (subject to draped rendering modification).\n        //  - if terrain/globe enabled layers are reordered in a drape-first, immediate-second manner\n        //  - if terrain/globe disabled layers are not reordered\n        // The order between features in two 3D layers is always determined by depth.\n        // The order between a feature in a 2D layer and a 3D layer is tricky:\n        //      Most often layer order determines the feature order in this case. If\n        //      a line layer is above a extrusion layer the line feature will be rendered\n        //      above the extrusion. If the line layer is below the extrusion layer,\n        //      it will be rendered below it.\n        //\n        //      There is a weird case though.\n        //      You have layers in this order: extrusion_layer_a, line_layer, extrusion_layer_b\n        //      Each layer has a feature that overlaps the other features.\n        //      The feature in extrusion_layer_a is closer than the feature in extrusion_layer_b so it is rendered above.\n        //      The feature in line_layer is rendered above extrusion_layer_a.\n        //      This means that that the line_layer feature is above the extrusion_layer_b feature despite\n        //      it being in an earlier layer.\n\n        const isLayer3D = (layerId: string) => this._mergedLayers[layerId].type === 'fill-extrusion' ||  this._mergedLayers[layerId].type === 'model';\n\n        const order = this.order;\n\n        const layerIndex = {};\n        const features3D = [];\n        for (let l = order.length - 1; l >= 0; l--) {\n            const layerId = order[l];\n            if (isLayer3D(layerId)) {\n                layerIndex[layerId] = l;\n                for (const sourceResult of sourceResults) {\n                    const layerFeatures = sourceResult[layerId];\n                    if (layerFeatures) {\n                        for (const featureWrapper of layerFeatures) {\n                            features3D.push(featureWrapper);\n                        }\n                    }\n                }\n            }\n        }\n\n        features3D.sort((a, b) => {\n            return b.intersectionZ - a.intersectionZ;\n        });\n\n        const features = [];\n        for (let l = order.length - 1; l >= 0; l--) {\n            const layerId = order[l];\n\n            if (isLayer3D(layerId)) {\n                // add all 3D features that are in or above the current layer\n                for (let i = features3D.length - 1; i >= 0; i--) {\n                    const topmost3D = features3D[i].feature;\n                    if (layerIndex[topmost3D.layer.id] < l) break;\n                    features.push(topmost3D);\n                    features3D.pop();\n                }\n            } else {\n                for (const sourceResult of sourceResults) {\n                    const layerFeatures = sourceResult[layerId];\n                    if (layerFeatures) {\n                        for (const featureWrapper of layerFeatures) {\n                            features.push(featureWrapper.feature);\n                        }\n                    }\n                }\n            }\n        }\n\n        return features;\n    }\n\n    queryRenderedFeatures(queryGeometry: PointLike | [PointLike, PointLike], params: QueryRenderedFeaturesParams, transform: Transform): Array<QueryResult> {\n        if (params && params.filter) {\n            this._validate(validateFilter, 'queryRenderedFeatures.filter', params.filter, null, params);\n        }\n\n        params.scope = this.scope;\n        params.availableImages = this._availableImages;\n        params.serializedLayers = this._serializedLayers;\n\n        const includedSources = {};\n        if (params && params.layers) {\n            if (!Array.isArray(params.layers)) {\n                this.fire(new ErrorEvent(new Error('parameters.layers must be an Array.')));\n                return [];\n            }\n            for (const layerId of params.layers) {\n                const layer = this._mergedLayers[layerId];\n                if (!layer) {\n                    // this layer is not in the style.layers array\n                    this.fire(new ErrorEvent(new Error(`The layer '${layerId}' does not exist in the map's style and cannot be queried for features.`)));\n                    return [];\n                }\n                includedSources[layer.source] = true;\n            }\n        }\n\n        const sourceResults: Array<QueryResult> = [];\n        const serializedLayers = params.serializedLayers || {};\n\n        const has3DLayer = (params && params.layers) ?\n            params.layers.some((layerId) => {\n                const layer = this.getLayer(layerId);\n                return layer && layer.is3D();\n            }) : this.has3DLayers();\n\n        const queryGeometryStruct = QueryGeometry.createFromScreenPoints(queryGeometry, transform);\n\n        for (const id in this._mergedSourceCaches) {\n            const source = this._mergedSourceCaches[id].getSource();\n            if (!source || source.scope !== params.scope) continue;\n\n            const sourceId = this._mergedSourceCaches[id].getSource().id;\n            if (params.layers && !includedSources[sourceId]) continue;\n            const showQueryGeometry = !!this.map._showQueryGeometry;\n            sourceResults.push(\n                queryRenderedFeatures(\n                    this._mergedSourceCaches[id],\n                    this._mergedLayers,\n                    serializedLayers,\n                    queryGeometryStruct,\n                    (params: any),\n                    transform,\n                    has3DLayer,\n                    showQueryGeometry)\n            );\n        }\n\n        if (this.placement) {\n            // If a placement has run, query against its CollisionIndex\n            // for symbol results, and treat it as an extra source to merge\n            sourceResults.push(\n                queryRenderedSymbols(\n                    this._mergedLayers,\n                    serializedLayers,\n                    // $FlowFixMe[method-unbinding]\n                    this.getLayerSourceCache.bind(this),\n                    queryGeometryStruct.screenGeometry,\n                    (params: any),\n                    this.placement.collisionIndex,\n                    this.placement.retainedQueryData)\n            );\n        }\n\n        return (this._flattenAndSortRenderedFeatures(sourceResults): any);\n    }\n\n    querySourceFeatures(sourceID: string, params: ?{sourceLayer: ?string, filter?: ?Array<any>, validate?: boolean}): Array<QueryFeature> {\n        if (params && params.filter) {\n            this._validate(validateFilter, 'querySourceFeatures.filter', params.filter, null, params);\n        }\n        const sourceCaches = this.getOwnSourceCaches(sourceID);\n        let results = [];\n        for (const sourceCache of sourceCaches) {\n            results = results.concat(querySourceFeatures(sourceCache, params));\n        }\n        return results;\n    }\n\n    addSourceType(name: string, SourceType: SourceClass, callback: Callback<void>): void {\n        if (Style.getSourceType(name)) {\n            return callback(new Error(`A source type called \"${name}\" already exists.`));\n        }\n\n        Style.setSourceType(name, SourceType);\n\n        if (!SourceType.workerSourceURL) {\n            return callback(null, null);\n        }\n\n        this.dispatcher.broadcast('loadWorkerSource', {\n            name,\n            url: SourceType.workerSourceURL\n        }, callback);\n    }\n\n    getFlatLight(): LightSpecification {\n        return this.light.getLight();\n    }\n\n    setFlatLight(lightOptions: LightSpecification, id: string, options: StyleSetterOptions = {}) {\n        this._checkLoaded();\n\n        const light = this.light.getLight();\n        let _update = false;\n        for (const key in lightOptions) {\n            if (!deepEqual(lightOptions[key], light[key])) {\n                _update = true;\n                break;\n            }\n        }\n        if (!_update) return;\n\n        const parameters = this._getTransitionParameters();\n\n        this.light.setLight(lightOptions, id, options);\n        this.light.updateTransitions(parameters);\n    }\n\n    getTerrain(): ?TerrainSpecification {\n        return this.terrain && this.terrain.drapeRenderMode === DrapeRenderMode.elevated ? this.terrain.get() : null;\n    }\n\n    setTerrainForDraping() {\n        const mockTerrainOptions = {source: '', exaggeration: 0};\n        this.setTerrain(mockTerrainOptions, DrapeRenderMode.deferred);\n    }\n\n    // eslint-disable-next-line no-warning-comments\n    // TODO: generic approach for root level property: light, terrain, skybox.\n    // It is not done here to prevent rebasing issues.\n    setTerrain(terrainOptions: ?TerrainSpecification, drapeRenderMode: number = DrapeRenderMode.elevated) {\n        this._checkLoaded();\n\n        // Disabling\n        if (!terrainOptions) {\n            // This check prevents removing draping terrain not from #applyProjectionUpdate\n            if (!this.terrainSetForDrapingOnly() || drapeRenderMode === DrapeRenderMode.deferred) {\n                delete this.terrain;\n            }\n\n            if (terrainOptions === null) {\n                this.stylesheet.terrain = null;\n            } else {\n                delete this.stylesheet.terrain;\n            }\n\n            this._force3DLayerUpdate();\n            this._markersNeedUpdate = true;\n            return;\n        }\n\n        let options: TerrainSpecification = terrainOptions;\n        const isUpdating = terrainOptions.source == null;\n        if (drapeRenderMode === DrapeRenderMode.elevated) {\n            // Input validation and source object unrolling\n            if (typeof options.source === 'object') {\n                const id = 'terrain-dem-src';\n                this.addSource(id, options.source);\n                options = clone(options);\n                options = extend(options, {source: id});\n            }\n\n            const validationOptions = extend({}, options);\n            const validationProps = {};\n\n            if (this.terrain && isUpdating) {\n                validationOptions.source = this.terrain.get().source;\n\n                const fragmentStyle = this.terrain ? this.getFragmentStyle(this.terrain.scope) : null;\n                if (fragmentStyle) {\n                    validationProps.style = fragmentStyle.serialize();\n                }\n            }\n\n            if (this._validate(validateTerrain, 'terrain', validationOptions, validationProps)) {\n                return;\n            }\n        }\n\n        // Enabling\n        if (!this.terrain || (this.terrain.scope !== this.scope && !isUpdating) || (this.terrain && drapeRenderMode !== this.terrain.drapeRenderMode)) {\n            if (!options) return;\n            this._createTerrain(options, drapeRenderMode);\n            this.fire(new Event('data', {dataType: 'style'}));\n        } else { // Updating\n            const terrain = this.terrain;\n            const currSpec = terrain.get();\n\n            for (const name of Object.keys(styleSpec.terrain)) {\n                // Fallback to use default style specification when the properties wasn't set\n                if (!options.hasOwnProperty(name) && !!styleSpec.terrain[name].default) {\n                    // $FlowFixMe[prop-missing]\n                    options[name] = styleSpec.terrain[name].default;\n                }\n            }\n            for (const key in terrainOptions) {\n                if (!deepEqual(terrainOptions[key], currSpec[key])) {\n                    terrain.set(terrainOptions, this.options);\n                    this.stylesheet.terrain = terrainOptions;\n                    const parameters = this._getTransitionParameters({duration: 0});\n                    terrain.updateTransitions(parameters);\n                    this.fire(new Event('data', {dataType: 'style'}));\n                    break;\n                }\n            }\n        }\n\n        this.mergeTerrain();\n        this.updateDrapeFirstLayers();\n        this._markersNeedUpdate = true;\n    }\n\n    _createFog(fogOptions: FogSpecification) {\n        const fog = this.fog = new Fog(fogOptions, this.map.transform, this.scope, this.options);\n        this.stylesheet.fog = fog.get();\n        const parameters = this._getTransitionParameters({duration: 0});\n        fog.updateTransitions(parameters);\n    }\n\n    _updateMarkersOpacity() {\n        if (this.map._markers.length === 0) {\n            return;\n        }\n        this.map._requestDomTask(() => {\n            for (const marker of this.map._markers) {\n                marker._evaluateOpacity();\n            }\n        });\n    }\n\n    getFog(): ?FogSpecification {\n        return this.fog ? this.fog.get() : null;\n    }\n\n    setFog(fogOptions?: FogSpecification) {\n        this._checkLoaded();\n\n        if (!fogOptions) {\n            // Remove fog\n            delete this.fog;\n            delete this.stylesheet.fog;\n            this._markersNeedUpdate = true;\n            return;\n        }\n\n        if (!this.fog) {\n            // Initialize Fog\n            this._createFog(fogOptions);\n        } else {\n            // Updating fog\n            const fog = this.fog;\n            if (!deepEqual(fog.get(), fogOptions)) {\n                fog.set(fogOptions, this.options);\n                this.stylesheet.fog = fog.get();\n                const parameters = this._getTransitionParameters({duration: 0});\n                fog.updateTransitions(parameters);\n            }\n        }\n\n        this._markersNeedUpdate = true;\n    }\n\n    _getTransitionParameters(transition: ?TransitionSpecification): TransitionParameters {\n        return {\n            now: browser.now(),\n            transition: extend(this.transition, transition)\n        };\n    }\n\n    updateDrapeFirstLayers() {\n        if (!this.terrain) {\n            return;\n        }\n\n        const draped = [];\n        const nonDraped = [];\n        for (const layerId in this._mergedLayers) {\n            const layer = this._mergedLayers[layerId];\n            if (this.isLayerDraped(layer)) {\n                draped.push(layerId);\n            } else {\n                nonDraped.push(layerId);\n            }\n        }\n\n        this._drapedFirstOrder = [];\n        this._drapedFirstOrder.push(...draped);\n        this._drapedFirstOrder.push(...nonDraped);\n    }\n\n    _createTerrain(terrainOptions: TerrainSpecification, drapeRenderMode: number) {\n        const terrain = this.terrain = new Terrain(terrainOptions, drapeRenderMode, this.scope, this.options);\n\n        // We need to update the stylesheet only for the elevated mode,\n        // i.e., mock terrain shouldn't be propagated to the stylesheet\n        if (drapeRenderMode === DrapeRenderMode.elevated) {\n            this.stylesheet.terrain = terrainOptions;\n        }\n\n        this.mergeTerrain();\n        this.updateDrapeFirstLayers();\n        this._force3DLayerUpdate();\n        const parameters = this._getTransitionParameters({duration: 0});\n        terrain.updateTransitions(parameters);\n    }\n\n    _force3DLayerUpdate() {\n        for (const layerId in this._layers) {\n            const layer = this._layers[layerId];\n            if (layer.type === 'fill-extrusion') {\n                this._updateLayer(layer);\n            }\n        }\n    }\n\n    _forceSymbolLayerUpdate() {\n        for (const layerId in this._layers) {\n            const layer = this._layers[layerId];\n            if (layer.type === 'symbol') {\n                this._updateLayer(layer);\n            }\n        }\n    }\n\n    _validate(validate: Validator, key: string, value: any, props: any, options: { validate?: boolean } = {}): boolean {\n        if (options && options.validate === false) {\n            return false;\n        }\n\n        // Fallback to the default glyphs URL if none is specified\n        const style = extend({}, this.serialize());\n        return emitValidationErrors(this, validate.call(validateStyle, extend({\n            key,\n            style,\n            value,\n            styleSpec\n        }, props)));\n    }\n\n    _remove() {\n        if (this._request) {\n            this._request.cancel();\n            this._request = null;\n        }\n        if (this._spriteRequest) {\n            this._spriteRequest.cancel();\n            this._spriteRequest = null;\n        }\n\n        rtlTextPluginEvented.off('pluginStateChange', this._rtlTextPluginCallback);\n\n        for (const layerId in this._mergedLayers) {\n            const layer = this._mergedLayers[layerId];\n            layer.setEventedParent(null);\n        }\n\n        for (const id in this._mergedSourceCaches) {\n            this._mergedSourceCaches[id].clearTiles();\n            this._mergedSourceCaches[id].setEventedParent(null);\n        }\n\n        this.setEventedParent(null);\n\n        delete this.fog;\n        delete this.terrain;\n        delete this.ambientLight;\n        delete this.directionalLight;\n\n        // Shared managers should be removed only on removing the root style\n        if (this.isRootStyle()) {\n            this.imageManager.setEventedParent(null);\n            this.modelManager.setEventedParent(null);\n            this.dispatcher.remove();\n        }\n    }\n\n    clearSource(id: string) {\n        const sourceCaches = this.getSourceCaches(id);\n        for (const sourceCache of sourceCaches) {\n            sourceCache.clearTiles();\n        }\n    }\n\n    clearSources() {\n        for (const id in this._mergedSourceCaches) {\n            this._mergedSourceCaches[id].clearTiles();\n        }\n    }\n\n    reloadSource(id: string) {\n        const sourceCaches = this.getSourceCaches(id);\n        for (const sourceCache of sourceCaches) {\n            sourceCache.resume();\n            sourceCache.reload();\n        }\n    }\n\n    reloadSources() {\n        for (const source of this.getSources()) {\n            if (source.reload) source.reload();\n        }\n    }\n\n    updateSources(transform: Transform) {\n        let lightDirection: ?Vec3;\n        if (this.directionalLight) {\n            lightDirection = shadowDirectionFromProperties(this.directionalLight);\n        }\n        for (const id in this._mergedSourceCaches) {\n            this._mergedSourceCaches[id].update(transform, undefined, undefined, lightDirection);\n        }\n    }\n\n    _generateCollisionBoxes() {\n        for (const id in this._sourceCaches) {\n            const sourceCache = this._sourceCaches[id];\n            sourceCache.resume();\n            sourceCache.reload();\n        }\n    }\n\n    _updatePlacement(transform: Transform, showCollisionBoxes: boolean, fadeDuration: number, crossSourceCollisions: boolean, forceFullPlacement: boolean = false): boolean {\n        let symbolBucketsChanged = false;\n        let placementCommitted = false;\n\n        const layerTiles = {};\n        const layerTilesInYOrder = {};\n\n        for (const layerId of this._mergedOrder) {\n            const styleLayer = this._mergedLayers[layerId];\n            if (styleLayer.type !== 'symbol') continue;\n\n            const sourceId = makeFQID(styleLayer.source, styleLayer.scope);\n\n            let sourceTiles = layerTiles[sourceId];\n\n            if (!sourceTiles) {\n                const sourceCache = this.getLayerSourceCache(styleLayer);\n                if (!sourceCache) continue;\n                const tiles = sourceCache.getRenderableIds(true).map((id) => sourceCache.getTileByID(id));\n                layerTilesInYOrder[sourceId] = tiles.slice();\n                sourceTiles = layerTiles[sourceId] =\n                    tiles.sort((a, b) => (b.tileID.overscaledZ - a.tileID.overscaledZ) || (a.tileID.isLessThan(b.tileID) ? -1 : 1));\n            }\n\n            const layerBucketsChanged = this.crossTileSymbolIndex.addLayer(styleLayer, sourceTiles, transform.center.lng, transform.projection);\n            symbolBucketsChanged = symbolBucketsChanged || layerBucketsChanged;\n        }\n        this.crossTileSymbolIndex.pruneUnusedLayers(this._mergedOrder);\n\n        // Anything that changes our \"in progress\" layer and tile indices requires us\n        // to start over. When we start over, we do a full placement instead of incremental\n        // to prevent starvation.\n        // We need to restart placement to keep layer indices in sync.\n        // Also force full placement when fadeDuration === 0 to ensure that newly loaded\n        // tiles will fully display symbols in their first frame\n        forceFullPlacement = forceFullPlacement || this._layerOrderChanged || fadeDuration === 0;\n\n        if (this._layerOrderChanged) {\n            this.fire(new Event('neworder'));\n        }\n\n        if (forceFullPlacement || !this.pauseablePlacement || (this.pauseablePlacement.isDone() && !this.placement.stillRecent(browser.now(), transform.zoom))) {\n            const fogState = this.fog && transform.projection.supportsFog ? this.fog.state : null;\n            this.pauseablePlacement = new PauseablePlacement(transform, this._mergedOrder, forceFullPlacement, showCollisionBoxes, fadeDuration, crossSourceCollisions, this.placement, fogState, this._buildingIndex);\n            this._layerOrderChanged = false;\n        }\n\n        if (this.pauseablePlacement.isDone()) {\n            // the last placement finished running, but the next one hasn’t\n            // started yet because of the `stillRecent` check immediately\n            // above, so mark it stale to ensure that we request another\n            // render frame\n            this.placement.setStale();\n        } else {\n            this.pauseablePlacement.continuePlacement(this._mergedOrder, this._mergedLayers, layerTiles, layerTilesInYOrder);\n\n            if (this.pauseablePlacement.isDone()) {\n                this.placement = this.pauseablePlacement.commit(browser.now());\n                placementCommitted = true;\n            }\n\n            if (symbolBucketsChanged) {\n                // since the placement gets split over multiple frames it is possible\n                // these buckets were processed before they were changed and so the\n                // placement is already stale while it is in progress\n                this.pauseablePlacement.placement.setStale();\n            }\n        }\n\n        if (placementCommitted || symbolBucketsChanged) {\n            this._buildingIndex.onNewFrame(transform.zoom);\n            for (const layerId of this._mergedOrder) {\n                const styleLayer = this._mergedLayers[layerId];\n                if (styleLayer.type !== 'symbol') continue;\n                this.placement.updateLayerOpacities(styleLayer, layerTiles[makeFQID(styleLayer.source, styleLayer.scope)]);\n            }\n        }\n\n        // needsRender is false when we have just finished a placement that didn't change the visibility of any symbols\n        const needsRerender = !this.pauseablePlacement.isDone() || this.placement.hasTransitions(browser.now());\n        return needsRerender;\n    }\n\n    _releaseSymbolFadeTiles() {\n        for (const id in this._sourceCaches) {\n            this._sourceCaches[id].releaseSymbolFadeTiles();\n        }\n    }\n\n    // Fragments and merging\n\n    addImport(importSpec: ImportSpecification, beforeId: ?string): Promise<any> | void {\n        this._checkLoaded();\n\n        const imports = this.stylesheet.imports = this.stylesheet.imports || [];\n\n        const index = imports.findIndex(({id}) => id === importSpec.id);\n        if (index !== -1) {\n            this.fire(new ErrorEvent(new Error(`Import with id '${importSpec.id}' already exists in the map's style.`)));\n            return;\n        }\n\n        if (!beforeId) {\n            imports.push(importSpec);\n            return this._loadImports([importSpec], true);\n        }\n\n        const beforeIndex = imports.findIndex(({id}) => id === beforeId);\n\n        if (beforeIndex === -1) {\n            this.fire(new ErrorEvent(new Error(`Import with id \"${beforeId}\" does not exist on this map.`)));\n        }\n\n        this.stylesheet.imports = imports\n            .slice(0, beforeIndex)\n            .concat(importSpec)\n            .concat(imports.slice(beforeIndex));\n\n        return this._loadImports([importSpec], true, beforeId);\n    }\n\n    updateImport(importId: string, importSpecification: ImportSpecification | string): Style {\n        this._checkLoaded();\n\n        const imports = this.stylesheet.imports || [];\n        const index = this.getImportIndex(importId);\n        if (index === -1) return this;\n\n        if (typeof importSpecification === 'string') {\n            this.setImportUrl(importId, importSpecification);\n            return this;\n        }\n\n        if (importSpecification.url && importSpecification.url !== imports[index].url) {\n            this.setImportUrl(importId, importSpecification.url);\n        }\n\n        if (!deepEqual(importSpecification.config, imports[index].config)) {\n            this.setImportConfig(importId, importSpecification.config);\n        }\n\n        if (!deepEqual(importSpecification.data, imports[index].data)) {\n            this.setImportData(importId, importSpecification.data);\n        }\n\n        return this;\n    }\n\n    moveImport(importId: string, beforeId: string): Style {\n        this._checkLoaded();\n\n        let imports = this.stylesheet.imports || [];\n\n        const index = this.getImportIndex(importId);\n        if (index === -1) return this;\n\n        const beforeIndex = this.getImportIndex(beforeId);\n        if (beforeIndex === -1) return this;\n\n        const importSpec = imports[index];\n        const fragment = this.fragments[index];\n\n        imports = imports.filter(({id}) => id !== importId);\n\n        this.fragments = this.fragments.filter(({id}) => id !== importId);\n\n        this.stylesheet.imports = imports\n            .slice(0, beforeIndex)\n            .concat(importSpec)\n            .concat(imports.slice(beforeIndex));\n\n        this.fragments = this.fragments\n            .slice(0, beforeIndex)\n            .concat(fragment)\n            .concat(this.fragments.slice(beforeIndex));\n\n        this.mergeLayers();\n        return this;\n    }\n\n    setImportUrl(importId: string, url: string): Style {\n        this._checkLoaded();\n\n        const imports = this.stylesheet.imports || [];\n        const index = this.getImportIndex(importId);\n        if (index === -1) return this;\n\n        imports[index].url = url;\n\n        // Update related fragment\n        const fragment = this.fragments[index];\n        fragment.style = this._createFragmentStyle(imports[index]);\n\n        fragment.style.on('style.import.load', () => this.mergeAll());\n        fragment.style.loadURL(url);\n\n        return this;\n    }\n\n    setImportData(importId: string, stylesheet: ?StyleSpecification): Style {\n        this._checkLoaded();\n\n        const index = this.getImportIndex(importId);\n        const imports = this.stylesheet.imports || [];\n        if (index === -1) return this;\n\n        // Reload import from the URL if import data is unset\n        if (!stylesheet) {\n            delete imports[index].data;\n            return this.setImportUrl(importId, imports[index].url);\n        }\n\n        // Update related fragment\n        const fragment = this.fragments[index];\n        fragment.style.setState(stylesheet);\n\n        this._reloadImports();\n        return this;\n    }\n\n    setImportConfig(importId: string, config: ?ConfigSpecification): Style {\n        this._checkLoaded();\n\n        const index = this.getImportIndex(importId);\n        const imports = this.stylesheet.imports || [];\n        if (index === -1) return this;\n\n        if (config) {\n            imports[index].config = config;\n        } else {\n            delete imports[index].config;\n        }\n\n        // Update related fragment\n        const fragment = this.fragments[index];\n        const schema = fragment.style.stylesheet && fragment.style.stylesheet.schema;\n\n        fragment.config = config;\n        fragment.style.updateConfig(config, schema);\n\n        this.updateConfigDependencies();\n\n        return this;\n    }\n\n    removeImport(importId: string): void {\n        this._checkLoaded();\n\n        const imports = this.stylesheet.imports || [];\n        const index = this.getImportIndex(importId);\n        if (index === -1) return;\n\n        imports.splice(index, 1);\n\n        // Update related fragment\n        const fragment = this.fragments[index];\n        fragment.style._remove();\n        this.fragments.splice(index, 1);\n\n        this._reloadImports();\n    }\n\n    getImportIndex(importId: string): number {\n        const imports = this.stylesheet.imports || [];\n        const index = imports.findIndex((importSpec) => importSpec.id === importId);\n        if (index === -1) {\n            this.fire(new ErrorEvent(new Error(`Import '${importId}' does not exist in the map's style and cannot be updated.`)));\n        }\n        return index;\n    }\n\n    /**\n     * Return the style layer object with the given `id`.\n     *\n     * @param {string} id ID of the desired layer.\n     * @returns {?StyleLayer} A layer, if one with the given `id` exists.\n     */\n    getLayer(id: string): ?StyleLayer {\n        return this._mergedLayers[id];\n    }\n\n    getSources(): Source[] {\n        const sources = [];\n        for (const id in this._mergedOtherSourceCaches) {\n            const sourceCache = this._mergedOtherSourceCaches[id];\n            if (sourceCache) sources.push(sourceCache.getSource());\n        }\n\n        return sources;\n    }\n\n    /**\n     * Get a source by ID.\n     * @param {string} id ID of the desired source.\n     * @returns {?Source} The source object.\n     */\n    getSource(id: string, scope: string): ?Source {\n        const sourceCache = this.getSourceCache(id, scope);\n        return sourceCache && sourceCache.getSource();\n    }\n\n    getLayerSource(layer: StyleLayer): ?Source {\n        const sourceCache = this.getLayerSourceCache(layer);\n        return sourceCache && sourceCache.getSource();\n    }\n\n    getSourceCache(id: string, scope: ?string): SourceCache | void {\n        const fqid = makeFQID(id, scope);\n        return this._mergedOtherSourceCaches[fqid];\n    }\n\n    getLayerSourceCache(layer: StyleLayer): SourceCache | void {\n        const fqid = makeFQID(layer.source, layer.scope);\n        return layer.type === 'symbol' ?\n            this._mergedSymbolSourceCaches[fqid] :\n            this._mergedOtherSourceCaches[fqid];\n    }\n\n    /**\n     * Returns all source caches for a given style FQID.\n     * If no FQID is provided, returns all source caches,\n     * including source caches in imported styles.\n     * @param {string} fqid Style FQID.\n     * @returns {Array<SourceCache>} List of source caches.\n     */\n    getSourceCaches(fqid: ?string): Array<SourceCache> {\n        // $FlowFixMe[incompatible-return] - Flow can't infer result of Object.values()\n        if (fqid == null) return Object.values(this._mergedSourceCaches);\n\n        const sourceCaches = [];\n        if (this._mergedOtherSourceCaches[fqid]) {\n            sourceCaches.push(this._mergedOtherSourceCaches[fqid]);\n        }\n        if (this._mergedSymbolSourceCaches[fqid]) {\n            sourceCaches.push(this._mergedSymbolSourceCaches[fqid]);\n        }\n        return sourceCaches;\n    }\n\n    updateSourceCaches() {\n        const updatedSourceCaches = this._changes.getUpdatedSourceCaches();\n        for (const fqid in updatedSourceCaches) {\n            const action = updatedSourceCaches[fqid];\n            assert(action === 'reload' || action === 'clear');\n            if (action === 'reload') {\n                this.reloadSource(fqid);\n            } else if (action === 'clear') {\n                this.clearSource(fqid);\n            }\n        }\n    }\n\n    updateLayers(parameters: EvaluationParameters) {\n        const updatedPaintProps = this._changes.getUpdatedPaintProperties();\n        for (const id of updatedPaintProps) {\n            const layer = this.getLayer(id);\n            if (layer) layer.updateTransitions(parameters);\n        }\n    }\n\n    // Callbacks from web workers\n\n    getImages(mapId: string, params: {icons: Array<string>, source: string, scope: string, tileID: OverscaledTileID, type: string}, callback: Callback<{[_: string]: StyleImage}>) {\n        this.imageManager.getImages(params.icons, params.scope, callback);\n\n        // Apply queued image changes before setting the tile's dependencies so that the tile\n        // is not reloaded unecessarily. Without this forced update the reload could happen in cases\n        // like this one:\n        // - icons contains \"my-image\"\n        // - imageManager.getImages(...) triggers `onstyleimagemissing`\n        // - the user adds \"my-image\" within the callback\n        // - addImage adds \"my-image\" to this._changes.changedImages\n        // - the next frame triggers a reload of this tile even though it already has the latest version\n        this._updateTilesForChangedImages();\n\n        const setDependencies = (sourceCache: SourceCache) => {\n            if (sourceCache) {\n                sourceCache.setDependencies(params.tileID.key, params.type, params.icons);\n            }\n        };\n        setDependencies(this._otherSourceCaches[params.source]);\n        setDependencies(this._symbolSourceCaches[params.source]);\n    }\n\n    getGlyphs(mapId: string, params: {stacks: {[_: string]: Array<number>}, scope: string}, callback: Callback<{[_: string]: {glyphs: {[_: number]: ?StyleGlyph}, ascender?: number, descender?: number}}>) {\n        this.glyphManager.getGlyphs(params.stacks, params.scope, callback);\n    }\n\n    getResource(mapId: string, params: RequestParameters, callback: ResponseCallback<any>): Cancelable {\n        return makeRequest(params, callback);\n    }\n\n    getOwnSourceCache(source: string): SourceCache | void {\n        return this._otherSourceCaches[source];\n    }\n\n    getOwnLayerSourceCache(layer: StyleLayer): SourceCache | void {\n        return layer.type === 'symbol' ?\n            this._symbolSourceCaches[layer.source] :\n            this._otherSourceCaches[layer.source];\n    }\n\n    getOwnSourceCaches(source: string): Array<SourceCache> {\n        const sourceCaches = [];\n        if (this._otherSourceCaches[source]) {\n            sourceCaches.push(this._otherSourceCaches[source]);\n        }\n        if (this._symbolSourceCaches[source]) {\n            sourceCaches.push(this._symbolSourceCaches[source]);\n        }\n        return sourceCaches;\n    }\n\n    _isSourceCacheLoaded(source: string): boolean {\n        const sourceCaches = this.getOwnSourceCaches(source);\n        if (sourceCaches.length === 0) {\n            this.fire(new ErrorEvent(new Error(`There is no source with ID '${source}'`)));\n            return false;\n        }\n        return sourceCaches.every(sc => sc.loaded());\n    }\n\n    has3DLayers(): boolean {\n        return this._has3DLayers;\n    }\n\n    hasSymbolLayers(): boolean {\n        return this._hasSymbolLayers;\n    }\n\n    hasCircleLayers(): boolean {\n        return this._hasCircleLayers;\n    }\n\n    _clearWorkerCaches() {\n        this.dispatcher.broadcast('clearCaches');\n    }\n\n    destroy() {\n        this._clearWorkerCaches();\n        this.fragments.forEach(fragment => {\n            fragment.style._remove();\n        });\n        if (this.terrainSetForDrapingOnly()) {\n            delete this.terrain;\n            delete this.stylesheet.terrain;\n        }\n    }\n}\n\nStyle.getSourceType = getSourceType;\nStyle.setSourceType = setSourceType;\nStyle.registerForPluginStateChange = registerForPluginStateChange;\n\nexport default Style;\n","// @flow\nimport type {StyleSpecification} from './types.js';\n\nexport default function emptyStyle(): StyleSpecification {\n    return {\n        version: 8,\n        layers: [],\n        sources: {}\n    };\n}\n","// @flow\n\nimport {getJSON, getImage, ResourceType} from '../util/ajax.js';\n\nimport browser from '../util/browser.js';\nimport {RGBAImage} from '../util/image.js';\n\nimport type {StyleImage} from './style_image.js';\nimport type {RequestManager} from '../util/mapbox.js';\nimport type {Callback} from '../types/callback.js';\nimport type {Cancelable} from '../types/cancelable.js';\n\nexport default function(baseURL: string, requestManager: RequestManager, callback: Callback<{[_: string]: StyleImage}>): Cancelable {\n    let json: any, image, error;\n    const format = browser.devicePixelRatio > 1 ? '@2x' : '';\n\n    let jsonRequest: ?Cancelable = getJSON(requestManager.transformRequest(requestManager.normalizeSpriteURL(baseURL, format, '.json'), ResourceType.SpriteJSON), (err: ?Error, data: ?Object) => {\n        jsonRequest = null;\n        if (!error) {\n            error = err;\n            json = data;\n            maybeComplete();\n        }\n    });\n\n    let imageRequest: ?Cancelable = getImage(requestManager.transformRequest(requestManager.normalizeSpriteURL(baseURL, format, '.png'), ResourceType.SpriteImage), (err, img) => {\n        imageRequest = null;\n        if (!error) {\n            error = err;\n            image = img;\n            maybeComplete();\n        }\n    });\n\n    function maybeComplete() {\n        if (error) {\n            callback(error);\n        } else if (json && image) {\n            const imageData = browser.getImageData(image);\n            const result = {};\n\n            for (const id in json) {\n                const {width, height, x, y, sdf, pixelRatio, stretchX, stretchY, content} = json[id];\n                const data = new RGBAImage({width, height});\n                RGBAImage.copy(imageData, data, {x, y}, {x: 0, y: 0}, {width, height});\n                result[id] = {data, pixelRatio, sdf, stretchX, stretchY, content};\n            }\n\n            callback(null, result);\n        }\n    }\n\n    return {\n        cancel() {\n            if (jsonRequest) {\n                jsonRequest.cancel();\n                jsonRequest = null;\n            }\n            if (imageRequest) {\n                imageRequest.cancel();\n                imageRequest = null;\n            }\n        }\n    };\n}\n","// @noflow\n// Disable Flow annotations here because Flow doesn't support importing GLSL files\n\nimport preludeCommon from './_prelude.glsl';\nimport preludeFrag from './_prelude.fragment.glsl';\nimport preludeVert from './_prelude.vertex.glsl';\nimport backgroundFrag from './background.fragment.glsl';\nimport backgroundVert from './background.vertex.glsl';\nimport backgroundPatternFrag from './background_pattern.fragment.glsl';\nimport backgroundPatternVert from './background_pattern.vertex.glsl';\nimport circleFrag from './circle.fragment.glsl';\nimport circleVert from './circle.vertex.glsl';\nimport clippingMaskFrag from './clipping_mask.fragment.glsl';\nimport clippingMaskVert from './clipping_mask.vertex.glsl';\nimport heatmapFrag from './heatmap.fragment.glsl';\nimport heatmapVert from './heatmap.vertex.glsl';\nimport heatmapTextureFrag from './heatmap_texture.fragment.glsl';\nimport heatmapTextureVert from './heatmap_texture.vertex.glsl';\nimport collisionBoxFrag from './collision_box.fragment.glsl';\nimport collisionBoxVert from './collision_box.vertex.glsl';\nimport collisionCircleFrag from './collision_circle.fragment.glsl';\nimport collisionCircleVert from './collision_circle.vertex.glsl';\nimport debugFrag from './debug.fragment.glsl';\nimport debugVert from './debug.vertex.glsl';\nimport fillFrag from './fill.fragment.glsl';\nimport fillVert from './fill.vertex.glsl';\nimport fillOutlineFrag from './fill_outline.fragment.glsl';\nimport fillOutlineVert from './fill_outline.vertex.glsl';\nimport fillOutlinePatternFrag from './fill_outline_pattern.fragment.glsl';\nimport fillOutlinePatternVert from './fill_outline_pattern.vertex.glsl';\nimport fillPatternFrag from './fill_pattern.fragment.glsl';\nimport fillPatternVert from './fill_pattern.vertex.glsl';\nimport fillExtrusionFrag from './fill_extrusion.fragment.glsl';\nimport fillExtrusionVert from './fill_extrusion.vertex.glsl';\nimport fillExtrusionPatternFrag from './fill_extrusion_pattern.fragment.glsl';\nimport fillExtrusionPatternVert from './fill_extrusion_pattern.vertex.glsl';\nimport hillshadePrepareFrag from './hillshade_prepare.fragment.glsl';\nimport fillExtrusionGroundEffectFrag from './fill_extrusion_ground_effect.fragment.glsl';\nimport fillExtrusionGroundEffectVert from './fill_extrusion_ground_effect.vertex.glsl';\nimport hillshadePrepareVert from './hillshade_prepare.vertex.glsl';\nimport hillshadeFrag from './hillshade.fragment.glsl';\nimport hillshadeVert from './hillshade.vertex.glsl';\nimport lineFrag from './line.fragment.glsl';\nimport lineVert from './line.vertex.glsl';\nimport linePatternFrag from './line_pattern.fragment.glsl';\nimport linePatternVert from './line_pattern.vertex.glsl';\nimport rasterFrag from './raster.fragment.glsl';\nimport rasterVert from './raster.vertex.glsl';\nimport rasterParticleFrag from './raster_particle.fragment.glsl';\nimport rasterParticleVert from './raster_particle.vertex.glsl';\nimport rasterParticleDrawFrag from './raster_particle_draw.fragment.glsl';\nimport rasterParticleDrawVert from './raster_particle_draw.vertex.glsl';\nimport rasterParticleTextureFrag from './raster_particle_texture.fragment.glsl';\nimport rasterParticleTextureVert from './raster_particle_texture.vertex.glsl';\nimport rasterParticleUpdateFrag from './raster_particle_update.fragment.glsl';\nimport rasterParticleUpdateVert from './raster_particle_update.vertex.glsl';\nimport symbolIconFrag from './symbol_icon.fragment.glsl';\nimport symbolIconVert from './symbol_icon.vertex.glsl';\nimport symbolSDFFrag from './symbol_sdf.fragment.glsl';\nimport symbolSDFVert from './symbol_sdf.vertex.glsl';\nimport symbolTextAndIconFrag from './symbol_text_and_icon.fragment.glsl';\nimport symbolTextAndIconVert from './symbol_text_and_icon.vertex.glsl';\nimport skyboxFrag from './skybox.fragment.glsl';\nimport skyboxGradientFrag from './skybox_gradient.fragment.glsl';\nimport skyboxVert from './skybox.vertex.glsl';\nimport terrainRasterFrag from './terrain_raster.fragment.glsl';\nimport terrainRasterVert from './terrain_raster.vertex.glsl';\nimport terrainDepthFrag from './terrain_depth.fragment.glsl';\nimport terrainDepthVert from './terrain_depth.vertex.glsl';\nimport preludeTerrainVert from './_prelude_terrain.vertex.glsl';\nimport preludeFogVert from './_prelude_fog.vertex.glsl';\nimport preludeFogFrag from './_prelude_fog.fragment.glsl';\nimport preludeLighting from './_prelude_lighting.glsl';\nimport preludeRasterArrayFrag from './_prelude_raster_array.glsl';\nimport preludeRasterParticleFrag from './_prelude_raster_particle.glsl';\nimport skyboxCaptureFrag from './skybox_capture.fragment.glsl';\nimport skyboxCaptureVert from './skybox_capture.vertex.glsl';\nimport globeFrag from './globe_raster.fragment.glsl';\nimport globeVert from './globe_raster.vertex.glsl';\nimport atmosphereFrag from './atmosphere.fragment.glsl';\nimport atmosphereVert from './atmosphere.vertex.glsl';\nimport starsFrag from './stars.fragment.glsl';\nimport starsVert from './stars.vertex.glsl';\n\n// 3d-style related shaders\nimport fillExtrusionDepthFrag from '../../3d-style/shaders/fill_extrusion_depth.fragment.glsl';\nimport fillExtrusionDepthVert from '../../3d-style/shaders/fill_extrusion_depth.vertex.glsl';\nimport groundShadowFrag from '../../3d-style/shaders/ground_shadow.fragment.glsl';\nimport groundShadowVert from '../../3d-style/shaders/ground_shadow.vertex.glsl';\nimport modelVert from '../../3d-style/shaders/model.vertex.glsl';\nimport modelFrag from '../../3d-style/shaders/model.fragment.glsl';\nimport modelDepthVert from '../../3d-style/shaders/model_depth.vertex.glsl';\nimport modelDepthFrag from '../../3d-style/shaders/model_depth.fragment.glsl';\nimport preludeShadowVert from '../../3d-style/shaders/_prelude_shadow.vertex.glsl';\nimport preludeShadowFrag from '../../3d-style/shaders/_prelude_shadow.fragment.glsl';\n\nexport let preludeTerrain = {};\nexport let preludeFog = {};\nexport let preludeShadow = {};\nexport let preludeRasterArray = {};\nexport let preludeRasterParticle = {};\n\nconst commonDefines = [];\nparseUsedPreprocessorDefines(preludeCommon, commonDefines);\nparseUsedPreprocessorDefines(preludeVert, commonDefines);\nparseUsedPreprocessorDefines(preludeFrag, commonDefines);\nexport const includeMap = {\n    \"_prelude_fog.vertex.glsl\": preludeFogVert,\n    \"_prelude_terrain.vertex.glsl\": preludeTerrainVert,\n    \"_prelude_shadow.vertex.glsl\": preludeShadowVert,\n    \"_prelude_fog.fragment.glsl\": preludeFogFrag,\n    \"_prelude_shadow.fragment.glsl\": preludeShadowFrag,\n    \"_prelude_lighting.glsl\": preludeLighting,\n    \"_prelude_raster_array.glsl\": preludeRasterArrayFrag,\n    \"_prelude_raster_particle.glsl\": preludeRasterParticleFrag\n};\n// Populated during precompilation\nconst defineMap = {};\n\npreludeTerrain = compile('', preludeTerrainVert);\npreludeFog = compile(preludeFogFrag, preludeFogVert);\npreludeShadow = compile(preludeShadowFrag, preludeShadowVert);\npreludeRasterArray = compile(preludeRasterArrayFrag, '');\npreludeRasterParticle = compile(preludeRasterParticleFrag, '');\n\nexport const prelude = compile(preludeFrag, preludeVert);\nexport const preludeCommonSource = preludeCommon;\nexport const preludeLightingSource = preludeLighting;\n\nexport const preludeVertPrecisionQualifiers = `precision highp float;`;\nexport const preludeFragPrecisionQualifiers = `precision mediump float;`;\n\nexport default {\n    background: compile(backgroundFrag, backgroundVert),\n    backgroundPattern: compile(backgroundPatternFrag, backgroundPatternVert),\n    circle: compile(circleFrag, circleVert),\n    clippingMask: compile(clippingMaskFrag, clippingMaskVert),\n    heatmap: compile(heatmapFrag, heatmapVert),\n    heatmapTexture: compile(heatmapTextureFrag, heatmapTextureVert),\n    collisionBox: compile(collisionBoxFrag, collisionBoxVert),\n    collisionCircle: compile(collisionCircleFrag, collisionCircleVert),\n    debug: compile(debugFrag, debugVert),\n    fill: compile(fillFrag, fillVert),\n    fillOutline: compile(fillOutlineFrag, fillOutlineVert),\n    fillOutlinePattern: compile(fillOutlinePatternFrag, fillOutlinePatternVert),\n    fillPattern: compile(fillPatternFrag, fillPatternVert),\n    fillExtrusion: compile(fillExtrusionFrag, fillExtrusionVert),\n    fillExtrusionDepth: compile(fillExtrusionDepthFrag, fillExtrusionDepthVert),\n    fillExtrusionPattern: compile(fillExtrusionPatternFrag, fillExtrusionPatternVert),\n    groundShadow: compile(groundShadowFrag, groundShadowVert),\n    fillExtrusionGroundEffect: compile(fillExtrusionGroundEffectFrag, fillExtrusionGroundEffectVert),\n    hillshadePrepare: compile(hillshadePrepareFrag, hillshadePrepareVert),\n    hillshade: compile(hillshadeFrag, hillshadeVert),\n    line: compile(lineFrag, lineVert),\n    linePattern: compile(linePatternFrag, linePatternVert),\n    raster: compile(rasterFrag, rasterVert),\n    rasterParticle: compile(rasterParticleFrag, rasterParticleVert),\n    rasterParticleDraw: compile(rasterParticleDrawFrag, rasterParticleDrawVert),\n    rasterParticleTexture: compile(rasterParticleTextureFrag, rasterParticleTextureVert),\n    rasterParticleUpdate: compile(rasterParticleUpdateFrag, rasterParticleUpdateVert),\n    symbolIcon: compile(symbolIconFrag, symbolIconVert),\n    symbolSDF: compile(symbolSDFFrag, symbolSDFVert),\n    symbolTextAndIcon: compile(symbolTextAndIconFrag, symbolTextAndIconVert),\n    terrainRaster: compile(terrainRasterFrag, terrainRasterVert),\n    terrainDepth: compile(terrainDepthFrag, terrainDepthVert),\n    skybox: compile(skyboxFrag, skyboxVert),\n    skyboxGradient: compile(skyboxGradientFrag, skyboxVert),\n    skyboxCapture: compile(skyboxCaptureFrag, skyboxCaptureVert),\n    globeRaster: compile(globeFrag, globeVert),\n    globeAtmosphere: compile(atmosphereFrag, atmosphereVert),\n    model: compile(modelFrag, modelVert),\n    modelDepth: compile(modelDepthFrag, modelDepthVert),\n    stars: compile(starsFrag, starsVert)\n};\n\nexport function parseUsedPreprocessorDefines(source, defines) {\n    const lines = source.replace(/\\s*\\/\\/[^\\n]*\\n/g, '\\n').split('\\n');\n    for (let line of lines) {\n        line = line.trim();\n        if (line[0] === '#') {\n            if (line.includes('if') && !line.includes('endif')) {\n                line = line.replace('#', '')\n                    .replace(/ifdef|ifndef|elif|if/g, '')\n                    .replace(/!|defined|\\(|\\)|\\|\\||&&/g, '')\n                    .replace(/\\s+/g, ' ').trim();\n\n                const newDefines = line.split(' ');\n                for (const define of newDefines) {\n                    if (!defines.includes(define)) {\n                        defines.push(define);\n                    }\n                }\n            }\n        }\n    }\n}\n\n// Expand #pragmas to #ifdefs.\nexport function compile(fragmentSource, vertexSource) {\n    const includeRegex = /#include\\s+\"([^\"]+)\"/g;\n    const pragmaRegex = /#pragma mapbox: ([\\w\\-]+) ([\\w]+) ([\\w]+) ([\\w]+)/g;\n    const attributeRegex = /(attribute(\\S*)|(^\\s*|;)in) (highp |mediump |lowp )?([\\w]+) ([\\w]+)/gm;\n\n    let staticAttributes = vertexSource.match(attributeRegex);\n\n    if (staticAttributes) {\n        staticAttributes = staticAttributes.map((str) => {\n            const tokens = str.split(' ');\n            return tokens[tokens.length - 1];\n        });\n        // remove duplicates as Safari does not support lookbehind in regex\n        // so we need to get rid of initialize-* expressions\n        staticAttributes = [...new Set(staticAttributes)];\n    }\n    const fragmentPragmas = {};\n\n    const vertexIncludes = [];\n    const fragmentIncludes = [];\n    fragmentSource = fragmentSource.replace(includeRegex, (match, name) => {\n        fragmentIncludes.push(name);\n        return '';\n    });\n    vertexSource = vertexSource.replace(includeRegex, (match, name) => {\n        vertexIncludes.push(name);\n        return '';\n    });\n\n    if (vertexSource.includes(\"flat out\")) {\n        console.error(`The usage of \"flat\" qualifier is disallowed, see: https://bugs.webkit.org/show_bug.cgi?id=268071`);\n        return;\n    }\n\n    let usedDefines = [...commonDefines];\n    parseUsedPreprocessorDefines(fragmentSource, usedDefines);\n    parseUsedPreprocessorDefines(vertexSource, usedDefines);\n    for (const includePath of [...vertexIncludes, ...fragmentIncludes]) {\n        if (!includeMap[includePath]) {\n            console.error(`Undefined include: ${includePath}`);\n        }\n        if (!defineMap[includePath]) {\n            defineMap[includePath] = [];\n            parseUsedPreprocessorDefines(includeMap[includePath], defineMap[includePath]);\n        }\n        usedDefines = [...usedDefines, ...defineMap[includePath]];\n    }\n\n    fragmentSource = fragmentSource.replace(pragmaRegex, (match, operation, precision, type, name) => {\n        fragmentPragmas[name] = true;\n        if (operation === 'define') {\n            return `\n#ifndef HAS_UNIFORM_u_${name}\nin ${precision} ${type} ${name};\n#else\nuniform ${precision} ${type} u_${name};\n#endif\n`;\n        } else  if (operation === 'initialize') {\n            return `\n#ifdef HAS_UNIFORM_u_${name}\n    ${precision} ${type} ${name} = u_${name};\n#endif\n`;\n        } else if (operation === 'define-attribute') {\n            return `\n#ifdef HAS_ATTRIBUTE_a_${name}\n    in ${precision} ${type} ${name};\n#endif\n`;\n        } else if (operation === 'initialize-attribute') {\n            return '';\n        }\n\n    });\n\n    vertexSource = vertexSource.replace(pragmaRegex, (match, operation, precision, type, name) => {\n        const attrType = type === 'float' ? 'vec2' : type;\n        const unpackType = name.match(/color/) ? 'color' : attrType;\n\n        if (operation === 'define-attribute-vertex-shader-only') {\n            return `\n#ifdef HAS_ATTRIBUTE_a_${name}\nin ${precision} ${type} a_${name};\n#endif\n`;\n        } else if (fragmentPragmas[name]) {\n            if (operation === 'define') {\n                return `\n#ifndef HAS_UNIFORM_u_${name}\nuniform lowp float u_${name}_t;\nin ${precision} ${attrType} a_${name};\nout ${precision} ${type} ${name};\n#else\nuniform ${precision} ${type} u_${name};\n#endif\n`;\n            } else if (operation === 'initialize') {\n                if (unpackType === 'vec4') {\n                    // vec4 attributes are only used for cross-faded properties, and are not packed\n                    return `\n#ifndef HAS_UNIFORM_u_${name}\n    ${name} = a_${name};\n#else\n    ${precision} ${type} ${name} = u_${name};\n#endif\n`;\n                } else {\n                    return `\n#ifndef HAS_UNIFORM_u_${name}\n    ${name} = unpack_mix_${unpackType}(a_${name}, u_${name}_t);\n#else\n    ${precision} ${type} ${name} = u_${name};\n#endif\n`;\n                }\n            } else if (operation === 'define-attribute') {\n                return `\n#ifdef HAS_ATTRIBUTE_a_${name}\n    in ${precision} ${type} a_${name};\n    out ${precision} ${type} ${name};\n#endif\n`;\n            } else if (operation === 'initialize-attribute') {\n                return `\n#ifdef HAS_ATTRIBUTE_a_${name}\n    ${name} = a_${name};\n#endif\n`;\n            }\n        } else {\n            if (operation === 'define') {\n                return `\n#ifndef HAS_UNIFORM_u_${name}\nuniform lowp float u_${name}_t;\nin ${precision} ${attrType} a_${name};\n#else\nuniform ${precision} ${type} u_${name};\n#endif\n`;\n            } else if (operation === 'define-instanced') {\n                if (unpackType === 'mat4') {\n                    return `\n#ifdef INSTANCED_ARRAYS\nin vec4 a_${name}0;\nin vec4 a_${name}1;\nin vec4 a_${name}2;\nin vec4 a_${name}3;\n#else\nuniform ${precision} ${type} u_${name};\n#endif\n`;\n                } else {\n                    return `\n#ifdef INSTANCED_ARRAYS\nin ${precision} ${attrType} a_${name};\n#else\nuniform ${precision} ${type} u_${name};\n#endif\n`;\n                }\n            } else if (operation === 'initialize-attribute-custom') {\n                return `\n#ifdef HAS_ATTRIBUTE_a_${name}\n    ${precision} ${type} ${name} = a_${name};\n#endif\n`;\n            } else /* if (operation === 'initialize') */ {\n                if (unpackType === 'vec4') {\n                    // vec4 attributes are only used for cross-faded properties, and are not packed\n                    return `\n#ifndef HAS_UNIFORM_u_${name}\n    ${precision} ${type} ${name} = a_${name};\n#else\n    ${precision} ${type} ${name} = u_${name};\n#endif\n`;\n                } else /* */ {\n                    return `\n#ifndef HAS_UNIFORM_u_${name}\n    ${precision} ${type} ${name} = unpack_mix_${unpackType}(a_${name}, u_${name}_t);\n#else\n    ${precision} ${type} ${name} = u_${name};\n#endif\n`;\n                }\n            }\n        }\n    });\n\n    return {fragmentSource, vertexSource, staticAttributes, usedDefines, vertexIncludes, fragmentIncludes};\n}\n","// @flow\n\nimport type Program from './program.js';\nimport type VertexBuffer from '../gl/vertex_buffer.js';\nimport type IndexBuffer from '../gl/index_buffer.js';\nimport type Context from '../gl/context.js';\n\nclass VertexArrayObject {\n    context: Context;\n    boundProgram: ?Program<*>;\n    boundLayoutVertexBuffer: ?VertexBuffer;\n    boundPaintVertexBuffers: Array<VertexBuffer>;\n    boundIndexBuffer: ?IndexBuffer;\n    boundVertexOffset: ?number;\n    boundDynamicVertexBuffers: Array<?VertexBuffer>;\n    vao: any;\n\n    constructor() {\n        this.boundProgram = null;\n        this.boundLayoutVertexBuffer = null;\n        this.boundPaintVertexBuffers = [];\n        this.boundIndexBuffer = null;\n        this.boundVertexOffset = null;\n        this.boundDynamicVertexBuffers = [];\n        this.vao = null;\n    }\n\n    bind(context: Context,\n         program: Program<*>,\n         layoutVertexBuffer: VertexBuffer,\n         paintVertexBuffers: Array<VertexBuffer>,\n         indexBuffer: ?IndexBuffer,\n         vertexOffset: ?number,\n         dynamicVertexBuffers: Array<?VertexBuffer>,\n         vertexAttribDivisorValue: ?number) {\n\n        this.context = context;\n\n        let paintBuffersDiffer = this.boundPaintVertexBuffers.length !== paintVertexBuffers.length;\n        for (let i = 0; !paintBuffersDiffer && i < paintVertexBuffers.length; i++) {\n            if (this.boundPaintVertexBuffers[i] !== paintVertexBuffers[i]) {\n                paintBuffersDiffer = true;\n            }\n        }\n        let dynamicBuffersDiffer = this.boundDynamicVertexBuffers.length !== dynamicVertexBuffers.length;\n        for (let i = 0; !dynamicBuffersDiffer && i < dynamicVertexBuffers.length; i++) {\n            if (this.boundDynamicVertexBuffers[i] !== dynamicVertexBuffers[i]) {\n                dynamicBuffersDiffer = true;\n            }\n        }\n\n        const isFreshBindRequired = (\n            !this.vao ||\n            this.boundProgram !== program ||\n            this.boundLayoutVertexBuffer !== layoutVertexBuffer ||\n            paintBuffersDiffer ||\n            dynamicBuffersDiffer ||\n            this.boundIndexBuffer !== indexBuffer ||\n            this.boundVertexOffset !== vertexOffset\n        );\n\n        if (isFreshBindRequired) {\n            this.freshBind(program, layoutVertexBuffer, paintVertexBuffers, indexBuffer, vertexOffset, dynamicVertexBuffers, vertexAttribDivisorValue);\n        } else {\n            context.bindVertexArrayOES.set(this.vao);\n            for (const dynamicBuffer of dynamicVertexBuffers) {\n                if (dynamicBuffer) {\n                    dynamicBuffer.bind();\n                    if (vertexAttribDivisorValue && dynamicBuffer.instanceCount) {\n                        dynamicBuffer.setVertexAttribDivisor(context.gl, program, vertexAttribDivisorValue);\n                    }\n                }\n            }\n            if (indexBuffer && indexBuffer.dynamicDraw) {\n                indexBuffer.bind();\n            }\n        }\n    }\n\n    freshBind(program: Program<*>,\n              layoutVertexBuffer: VertexBuffer,\n              paintVertexBuffers: Array<VertexBuffer>,\n              indexBuffer: ?IndexBuffer,\n              vertexOffset: ?number,\n              dynamicVertexBuffers: Array<?VertexBuffer>,\n              vertexAttribDivisorValue: ?number) {\n        const numNextAttributes = program.numAttributes;\n\n        const context = this.context;\n        const gl = context.gl;\n\n        if (this.vao) this.destroy();\n        this.vao = context.gl.createVertexArray();\n        context.bindVertexArrayOES.set(this.vao);\n\n        // store the arguments so that we can verify them when the vao is bound again\n        this.boundProgram = program;\n        this.boundLayoutVertexBuffer = layoutVertexBuffer;\n        this.boundPaintVertexBuffers = paintVertexBuffers;\n        this.boundIndexBuffer = indexBuffer;\n        this.boundVertexOffset = vertexOffset;\n        this.boundDynamicVertexBuffers = dynamicVertexBuffers;\n\n        layoutVertexBuffer.enableAttributes(gl, program);\n        layoutVertexBuffer.bind();\n        layoutVertexBuffer.setVertexAttribPointers(gl, program, vertexOffset);\n\n        for (const vertexBuffer of paintVertexBuffers) {\n            vertexBuffer.enableAttributes(gl, program);\n            vertexBuffer.bind();\n            vertexBuffer.setVertexAttribPointers(gl, program, vertexOffset);\n        }\n\n        for (const dynamicBuffer of dynamicVertexBuffers) {\n            if (dynamicBuffer) {\n                dynamicBuffer.enableAttributes(gl, program);\n                dynamicBuffer.bind();\n                dynamicBuffer.setVertexAttribPointers(gl, program, vertexOffset);\n                if (vertexAttribDivisorValue && dynamicBuffer.instanceCount) {\n                    dynamicBuffer.setVertexAttribDivisor(gl, program, vertexAttribDivisorValue);\n                }\n            }\n        }\n\n        if (indexBuffer) {\n            indexBuffer.bind();\n        }\n\n        context.currentNumAttributes = numNextAttributes;\n    }\n\n    destroy() {\n        if (this.vao) {\n            this.context.gl.deleteVertexArray(this.vao);\n            this.vao = null;\n        }\n    }\n}\n\nexport default VertexArrayObject;\n","// @flow\n\nimport {mat4} from 'gl-matrix';\n\nimport {\n    Uniform1i,\n    Uniform1f,\n    Uniform2f,\n    UniformColor,\n    UniformMatrix4f\n} from '../uniform_binding.js';\nimport EXTENT from '../../style-spec/data/extent.js';\nimport MercatorCoordinate from '../../geo/mercator_coordinate.js';\nimport {cartesianPositionToSpherical, degToRad} from '../../../src/util/util.js';\n\nimport type Context from '../../gl/context.js';\nimport type {UniformValues} from '../uniform_binding.js';\nimport type Tile from '../../source/tile.js';\nimport type Painter from '../painter.js';\nimport type HillshadeStyleLayer from '../../style/style_layer/hillshade_style_layer.js';\nimport type DEMData from '../../data/dem_data.js';\nimport type {OverscaledTileID} from '../../source/tile_id.js';\n\nexport type HillshadeUniformsType = {|\n    'u_matrix': UniformMatrix4f,\n    'u_image': Uniform1i,\n    'u_latrange': Uniform2f,\n    'u_light': Uniform2f,\n    'u_shadow': UniformColor,\n    'u_highlight': UniformColor,\n    'u_emissive_strength': Uniform1f,\n    'u_accent': UniformColor\n|};\n\nexport type HillshadePrepareUniformsType = {|\n    'u_matrix': UniformMatrix4f,\n    'u_image': Uniform1i,\n    'u_dimension': Uniform2f,\n    'u_zoom': Uniform1f\n|};\n\nexport type HillshadeDefinesType = 'TERRAIN_DEM_FLOAT_FORMAT';\n\nconst hillshadeUniforms = (context: Context): HillshadeUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context),\n    'u_image': new Uniform1i(context),\n    'u_latrange': new Uniform2f(context),\n    'u_light': new Uniform2f(context),\n    'u_shadow': new UniformColor(context),\n    'u_highlight': new UniformColor(context),\n    'u_emissive_strength': new Uniform1f(context),\n    'u_accent': new UniformColor(context)\n});\n\nconst hillshadePrepareUniforms = (context: Context): HillshadePrepareUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context),\n    'u_image': new Uniform1i(context),\n    'u_dimension': new Uniform2f(context),\n    'u_zoom': new Uniform1f(context)\n});\n\nconst hillshadeUniformValues = (\n    painter: Painter,\n    tile: Tile,\n    layer: HillshadeStyleLayer,\n    matrix: ?Float32Array\n): UniformValues<HillshadeUniformsType> => {\n    const shadow = layer.paint.get(\"hillshade-shadow-color\");\n    const highlight = layer.paint.get(\"hillshade-highlight-color\");\n    const accent = layer.paint.get(\"hillshade-accent-color\");\n    const emissiveStrength = layer.paint.get(\"hillshade-emissive-strength\");\n\n    let azimuthal = degToRad(layer.paint.get('hillshade-illumination-direction'));\n    // modify azimuthal angle by map rotation if light is anchored at the viewport\n    if (layer.paint.get('hillshade-illumination-anchor') === 'viewport') {\n        azimuthal -= painter.transform.angle;\n    } else if (painter.style && painter.style.enable3dLights()) {\n        // hillshade-illumination-anchor = map & 3d lights enabled\n        if (painter.style.directionalLight) {\n            const direction = painter.style.directionalLight.properties.get('direction');\n            const spherical = cartesianPositionToSpherical(direction.x, direction.y, direction.z);\n            azimuthal = degToRad(spherical[1]);\n        }\n    }\n    const align = !painter.options.moving;\n    return {\n        'u_matrix': matrix ? matrix : painter.transform.calculateProjMatrix(tile.tileID.toUnwrapped(), align),\n        'u_image': 0,\n        'u_latrange': getTileLatRange(painter, tile.tileID),\n        'u_light': [layer.paint.get('hillshade-exaggeration'), azimuthal],\n        'u_shadow': shadow,\n        'u_highlight': highlight,\n        'u_emissive_strength': emissiveStrength,\n        'u_accent': accent\n    };\n};\n\nconst hillshadeUniformPrepareValues = (\n    tileID: OverscaledTileID, dem: DEMData\n): UniformValues<HillshadePrepareUniformsType> => {\n\n    const stride = dem.stride;\n    const matrix = mat4.create();\n    // Flip rendering at y axis.\n    mat4.ortho(matrix, 0, EXTENT, -EXTENT, 0, 0, 1);\n    mat4.translate(matrix, matrix, [0, -EXTENT, 0]);\n\n    return {\n        'u_matrix': matrix,\n        'u_image': 1,\n        'u_dimension': [stride, stride],\n        'u_zoom': tileID.overscaledZ\n    };\n};\n\nfunction getTileLatRange(painter: Painter, tileID: OverscaledTileID) {\n    // for scaling the magnitude of a points slope by its latitude\n    const tilesAtZoom = Math.pow(2, tileID.canonical.z);\n    const y = tileID.canonical.y;\n    return [\n        new MercatorCoordinate(0, y / tilesAtZoom).toLngLat().lat,\n        new MercatorCoordinate(0, (y + 1) / tilesAtZoom).toLngLat().lat];\n}\n\nexport {\n    hillshadeUniforms,\n    hillshadePrepareUniforms,\n    hillshadeUniformValues,\n    hillshadeUniformPrepareValues\n};\n","// @flow\n\nimport Texture from './texture.js';\nimport StencilMode from '../gl/stencil_mode.js';\nimport DepthMode from '../gl/depth_mode.js';\nimport CullFaceMode from '../gl/cull_face_mode.js';\nimport {\n    hillshadeUniformValues,\n    hillshadeUniformPrepareValues\n} from './program/hillshade_program.js';\n\nimport type Painter from './painter.js';\nimport type SourceCache from '../source/source_cache.js';\nimport type Tile from '../source/tile.js';\nimport type HillshadeStyleLayer from '../style/style_layer/hillshade_style_layer.js';\nimport ColorMode from '../gl/color_mode.js';\nimport type {OverscaledTileID} from '../source/tile_id.js';\nimport assert from 'assert';\nimport DEMData from '../data/dem_data.js';\nimport type {DynamicDefinesType} from './program/program_uniforms.js';\n\nexport default drawHillshade;\n\nfunction drawHillshade(painter: Painter, sourceCache: SourceCache, layer: HillshadeStyleLayer, tileIDs: Array<OverscaledTileID>) {\n    if (painter.renderPass !== 'offscreen' && painter.renderPass !== 'translucent') return;\n    if (painter.style.disableElevatedTerrain) return;\n\n    const context = painter.context;\n\n    // When rendering to texture, coordinates are already sorted: primary by\n    // proxy id and secondary sort is by Z.\n    const renderingToTexture = painter.terrain && painter.terrain.renderingToTexture;\n    const [stencilModes, coords] = painter.renderPass === 'translucent' && !renderingToTexture ?\n        painter.stencilConfigForOverlap(tileIDs) : [{}, tileIDs];\n\n    for (const coord of coords) {\n        const tile = sourceCache.getTile(coord);\n        if (tile.needsHillshadePrepare && painter.renderPass === 'offscreen') {\n            prepareHillshade(painter, tile, layer);\n        } else if (painter.renderPass === 'translucent') {\n            const depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly);\n            const emissiveStrength = layer.paint.get('hillshade-emissive-strength');\n            const colorMode = painter.colorModeForDrapableLayerRenderPass(emissiveStrength);\n            const stencilMode = renderingToTexture && painter.terrain ?\n                painter.terrain.stencilModeForRTTOverlap(coord) : stencilModes[coord.overscaledZ];\n            renderHillshade(painter, coord, tile, layer, depthMode, stencilMode, colorMode);\n        }\n    }\n\n    context.viewport.set([0, 0, painter.width, painter.height]);\n\n    painter.resetStencilClippingMasks();\n}\n\nfunction renderHillshade(painter: Painter, coord: OverscaledTileID, tile: Tile, layer: HillshadeStyleLayer, depthMode: DepthMode, stencilMode: StencilMode, colorMode: ColorMode) {\n    const context = painter.context;\n    const gl = context.gl;\n    const fbo = tile.hillshadeFBO;\n    if (!fbo) return;\n    painter.prepareDrawTile();\n\n    const affectedByFog = painter.isTileAffectedByFog(coord);\n    const program = painter.getOrCreateProgram('hillshade', {overrideFog: affectedByFog});\n\n    context.activeTexture.set(gl.TEXTURE0);\n    gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get());\n\n    const uniformValues = hillshadeUniformValues(painter, tile, layer, painter.terrain ? coord.projMatrix : null);\n\n    painter.uploadCommonUniforms(context, program, coord.toUnwrapped());\n\n    const {tileBoundsBuffer, tileBoundsIndexBuffer, tileBoundsSegments} = painter.getTileBoundsBuffers(tile);\n\n    program.draw(painter, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled,\n        uniformValues, layer.id, tileBoundsBuffer,\n        tileBoundsIndexBuffer, tileBoundsSegments);\n}\n\nexport function prepareDEMTexture(painter: Painter, tile: Tile, dem: DEMData) {\n    if (!tile.needsDEMTextureUpload) return;\n\n    const context = painter.context;\n    const gl = context.gl;\n\n    context.pixelStoreUnpackPremultiplyAlpha.set(false);\n    const textureStride = dem.stride;\n    tile.demTexture = tile.demTexture || painter.getTileTexture(textureStride);\n    const demImage = dem.getPixels();\n\n    // Dem encoding should match painters expectations about floating point DEM usage\n    if (tile.demTexture) {\n        tile.demTexture.update(demImage, {premultiply: false});\n    } else {\n        tile.demTexture = new Texture(context, demImage, gl.R32F, {premultiply: false});\n    }\n    tile.needsDEMTextureUpload = false;\n}\n\n// hillshade rendering is done in two steps. the prepare step first calculates the slope of the terrain in the x and y\n// directions for each pixel, and saves those values to a framebuffer texture in the r and g channels.\nfunction prepareHillshade(painter: Painter, tile: Tile, layer: HillshadeStyleLayer) {\n    const context = painter.context;\n    const gl = context.gl;\n    if (!tile.dem) return;\n    const dem: DEMData = tile.dem;\n\n    context.activeTexture.set(gl.TEXTURE1);\n    prepareDEMTexture(painter, tile, dem);\n    assert(tile.demTexture);\n    if (!tile.demTexture) return; // Silence flow.\n    tile.demTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE);\n    const tileSize = dem.dim;\n\n    context.activeTexture.set(gl.TEXTURE0);\n    let fbo = tile.hillshadeFBO;\n    if (!fbo) {\n        const renderTexture = new Texture(context, {width: tileSize, height: tileSize, data: null}, gl.RGBA);\n        renderTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n\n        fbo = tile.hillshadeFBO = context.createFramebuffer(tileSize, tileSize, true, 'renderbuffer');\n        fbo.colorAttachment.set(renderTexture.texture);\n    }\n\n    context.bindFramebuffer.set(fbo.framebuffer);\n    context.viewport.set([0, 0, tileSize, tileSize]);\n\n    const {tileBoundsBuffer, tileBoundsIndexBuffer, tileBoundsSegments} = painter.getMercatorTileBoundsBuffers();\n\n    const definesValues: DynamicDefinesType[] = [];\n    if (painter.linearFloatFilteringSupported()) definesValues.push('TERRAIN_DEM_FLOAT_FORMAT');\n\n    painter.getOrCreateProgram('hillshadePrepare', {defines: definesValues}).draw(painter, gl.TRIANGLES,\n        DepthMode.disabled, StencilMode.disabled, ColorMode.unblended, CullFaceMode.disabled,\n        hillshadeUniformPrepareValues(tile.tileID, dem),\n        layer.id, tileBoundsBuffer,\n        tileBoundsIndexBuffer, tileBoundsSegments);\n\n    tile.needsHillshadePrepare = false;\n}\n","// @flow\n\nimport {\n    Uniform1i,\n    Uniform1f,\n    Uniform3f,\n    UniformMatrix4f\n} from '../render/uniform_binding.js';\n\nimport type Context from '../gl/context.js';\nimport type {UniformValues} from '../render/uniform_binding.js';\n\nexport type TerrainRasterUniformsType = {|\n    'u_matrix': UniformMatrix4f,\n    'u_image0': Uniform1i,\n    'u_skirt_height': Uniform1f,\n    'u_ground_shadow_factor': Uniform3f\n|};\n\nconst terrainRasterUniforms = (context: Context): TerrainRasterUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context),\n    'u_image0': new Uniform1i(context),\n    'u_skirt_height': new Uniform1f(context),\n    'u_ground_shadow_factor': new Uniform3f(context)\n});\n\nconst terrainRasterUniformValues = (\n    matrix: Float32Array,\n    skirtHeight: number,\n    groundShadowFactor: [number, number, number]\n): UniformValues<TerrainRasterUniformsType> => ({\n    'u_matrix': matrix,\n    'u_image0': 0,\n    'u_skirt_height': skirtHeight,\n    'u_ground_shadow_factor': groundShadowFactor\n});\n\nexport {terrainRasterUniforms, terrainRasterUniformValues};\n","// @flow\n\nimport {\n    Uniform1i,\n    Uniform2f,\n    Uniform3f,\n    Uniform4f,\n    UniformMatrix4f,\n    Uniform1f,\n    UniformMatrix3f\n} from '../render/uniform_binding.js';\n\nimport type Context from '../gl/context.js';\nimport type {UniformValues} from '../render/uniform_binding.js';\nimport type {Mat4} from 'gl-matrix';\n\nexport type GlobeRasterUniformsType = {|\n    'u_proj_matrix': UniformMatrix4f,\n    'u_globe_matrix': UniformMatrix4f,\n    'u_normalize_matrix': UniformMatrix4f,\n    'u_merc_matrix': UniformMatrix4f,\n    'u_zoom_transition': Uniform1f,\n    'u_merc_center': Uniform2f,\n    'u_image0': Uniform1i,\n    'u_grid_matrix': UniformMatrix3f,\n    'u_skirt_height': Uniform1f,\n    'u_far_z_cutoff': Uniform1f,\n    'u_frustum_tl': Uniform3f,\n    'u_frustum_tr': Uniform3f,\n    'u_frustum_br': Uniform3f,\n    'u_frustum_bl': Uniform3f,\n    'u_globe_pos': Uniform3f,\n    'u_globe_radius': Uniform1f,\n    'u_viewport': Uniform2f\n|};\n\nexport type AtmosphereUniformsType = {|\n    'u_frustum_tl': Uniform3f,\n    'u_frustum_tr': Uniform3f,\n    'u_frustum_br': Uniform3f,\n    'u_frustum_bl': Uniform3f,\n    'u_horizon': Uniform1f,\n    'u_transition': Uniform1f,\n    'u_fadeout_range': Uniform1f,\n    'u_color': Uniform4f,\n    'u_high_color': Uniform4f,\n    'u_space_color': Uniform4f,\n    'u_temporal_offset': Uniform1f,\n    'u_horizon_angle': Uniform1f\n|};\n\nconst globeRasterUniforms = (context: Context): GlobeRasterUniformsType => ({\n    'u_proj_matrix': new UniformMatrix4f(context),\n    'u_globe_matrix': new UniformMatrix4f(context),\n    'u_normalize_matrix': new UniformMatrix4f(context),\n    'u_merc_matrix': new UniformMatrix4f(context),\n    'u_zoom_transition': new Uniform1f(context),\n    'u_merc_center': new Uniform2f(context),\n    'u_image0': new Uniform1i(context),\n    'u_grid_matrix': new UniformMatrix3f(context),\n    'u_skirt_height': new Uniform1f(context),\n    'u_far_z_cutoff': new Uniform1f(context),\n    'u_frustum_tl': new Uniform3f(context),\n    'u_frustum_tr': new Uniform3f(context),\n    'u_frustum_br': new Uniform3f(context),\n    'u_frustum_bl': new Uniform3f(context),\n    'u_globe_pos': new Uniform3f(context),\n    'u_globe_radius': new Uniform1f(context),\n    'u_viewport': new Uniform2f(context)\n});\n\nconst atmosphereUniforms = (context: Context): AtmosphereUniformsType => ({\n    'u_frustum_tl': new Uniform3f(context),\n    'u_frustum_tr': new Uniform3f(context),\n    'u_frustum_br': new Uniform3f(context),\n    'u_frustum_bl': new Uniform3f(context),\n    'u_horizon': new Uniform1f(context),\n    'u_transition': new Uniform1f(context),\n    'u_fadeout_range': new Uniform1f(context),\n    'u_color': new Uniform4f(context),\n    'u_high_color': new Uniform4f(context),\n    'u_space_color': new Uniform4f(context),\n    'u_temporal_offset': new Uniform1f(context),\n    'u_horizon_angle': new Uniform1f(context),\n});\n\nconst globeRasterUniformValues = (\n    projMatrix: Mat4,\n    globeMatrix: Float32Array,\n    globeMercatorMatrix: Float32Array,\n    normalizeMatrix: Float64Array,\n    zoomTransition: number,\n    mercCenter: [number, number],\n    frustumDirTl: [number, number, number],\n    frustumDirTr: [number, number, number],\n    frustumDirBr: [number, number, number],\n    frustumDirBl: [number, number, number],\n    globePosition: [number, number, number],\n    globeRadius: number,\n    viewport: [number, number],\n    skirtHeight: number,\n    farZCutoff: number,\n    gridMatrix: ?Mat4\n): UniformValues<GlobeRasterUniformsType> => ({\n    'u_proj_matrix': Float32Array.from(projMatrix),\n    'u_globe_matrix': globeMatrix,\n    'u_normalize_matrix': Float32Array.from(normalizeMatrix),\n    'u_merc_matrix': globeMercatorMatrix,\n    'u_zoom_transition': zoomTransition,\n    'u_merc_center': mercCenter,\n    'u_image0': 0,\n    'u_frustum_tl': frustumDirTl,\n    'u_frustum_tr': frustumDirTr,\n    'u_frustum_br': frustumDirBr,\n    'u_frustum_bl': frustumDirBl,\n    'u_globe_pos': globePosition,\n    'u_globe_radius': globeRadius,\n    'u_viewport': viewport,\n    'u_grid_matrix': gridMatrix ? Float32Array.from(gridMatrix) : new Float32Array(9),\n    'u_skirt_height': skirtHeight,\n    'u_far_z_cutoff': farZCutoff\n});\n\nconst atmosphereUniformValues = (\n    frustumDirTl: [number, number, number],\n    frustumDirTr: [number, number, number],\n    frustumDirBr: [number, number, number],\n    frustumDirBl: [number, number, number],\n    horizon: number,\n    transitionT: number,\n    fadeoutRange: number,\n    color: [number, number, number, number],\n    highColor: [number, number, number, number],\n    spaceColor: [number, number, number, number],\n    temporalOffset: number,\n    horizonAngle: number\n): UniformValues<AtmosphereUniformsType> => ({\n    'u_frustum_tl': frustumDirTl,\n    'u_frustum_tr': frustumDirTr,\n    'u_frustum_br': frustumDirBr,\n    'u_frustum_bl': frustumDirBl,\n    'u_horizon': horizon,\n    'u_transition': transitionT,\n    'u_fadeout_range': fadeoutRange,\n    'u_color': color,\n    'u_high_color': highColor,\n    'u_space_color': spaceColor,\n    'u_temporal_offset': temporalOffset,\n    'u_horizon_angle': horizonAngle\n});\n\nexport {globeRasterUniforms, globeRasterUniformValues, atmosphereUniforms, atmosphereUniformValues};\n\nexport type GlobeDefinesType = 'PROJECTION_GLOBE_VIEW' | 'GLOBE_POLES' | 'CUSTOM_ANTIALIASING' | 'ALPHA_PASS';\n","// @flow\n\nimport DepthMode from '../gl/depth_mode.js';\nimport CullFaceMode from '../gl/cull_face_mode.js';\nimport {terrainRasterUniformValues} from './terrain_raster_program.js';\nimport {globeRasterUniformValues} from './globe_raster_program.js';\nimport Tile from '../source/tile.js';\nimport assert from 'assert';\nimport {easeCubicInOut} from '../util/util.js';\nimport browser from '../util/browser.js';\nimport {mercatorXfromLng, mercatorYfromLat} from '../geo/mercator_coordinate.js';\nimport type Painter from '../render/painter.js';\nimport type SourceCache from '../source/source_cache.js';\nimport {OverscaledTileID, CanonicalTileID} from '../source/tile_id.js';\nimport StencilMode from '../gl/stencil_mode.js';\nimport ColorMode from '../gl/color_mode.js';\nimport {mat4} from 'gl-matrix';\nimport {\n    calculateGlobeMercatorMatrix,\n    globeToMercatorTransition,\n    globePoleMatrixForTile,\n    getGridMatrix,\n    tileCornersToBounds,\n    globeNormalizeECEF,\n    globeTileBounds,\n    globeUseCustomAntiAliasing,\n    getLatitudinalLod\n} from '../geo/projection/globe_util.js';\nimport extend from '../style-spec/util/extend.js';\nimport type Program from '../render/program.js';\nimport type VertexBuffer from \"../gl/vertex_buffer.js\";\nimport type {Terrain} from './terrain.js';\nimport {calculateGroundShadowFactor} from \"../../3d-style/render/shadow_renderer.js\";\nimport {getCutoffParams} from '../render/cutoff.js';\n\nexport {\n    drawTerrainRaster,\n    drawTerrainDepth\n};\n\ntype DEMChain = {\n    startTime: number,\n    phase: number,\n    duration: number,   // Interpolation duration in milliseconds\n    from: Tile,\n    to: Tile,\n    queued: ?Tile\n};\n\nclass VertexMorphing {\n    operations: {[string | number]: DEMChain };\n\n    constructor() {\n        this.operations = {};\n    }\n\n    newMorphing(key: number, from: Tile, to: Tile, now: number, duration: number) {\n        assert(from.demTexture && to.demTexture);\n        assert(from.tileID.key !== to.tileID.key);\n\n        if (key in this.operations) {\n            const op = this.operations[key];\n            assert(op.from && op.to);\n            // Queue the target tile unless it's being morphed to already\n            if (op.to.tileID.key !== to.tileID.key)\n                op.queued = to;\n        } else {\n            this.operations[key] = {\n                startTime: now,\n                phase: 0.0,\n                duration,\n                from,\n                to,\n                queued: null\n            };\n        }\n    }\n\n    getMorphValuesForProxy(key: number): ?{from: Tile, to: Tile, phase: number} {\n        if (!(key in this.operations))\n            return null;\n\n        const op = this.operations[key];\n        const from = op.from;\n        const to = op.to;\n        assert(from && to);\n\n        return {from, to, phase: op.phase};\n    }\n\n    update(now: number) {\n        for (const key in this.operations) {\n            const op = this.operations[key];\n            assert(op.from && op.to);\n\n            op.phase = (now - op.startTime) / op.duration;\n\n            // Start the queued operation if the current one is finished or the data has expired\n            while (op.phase >= 1.0 || !this._validOp(op)) {\n                if (!this._nextOp(op, now)) {\n                    delete this.operations[key];\n                    break;\n                }\n            }\n        }\n    }\n\n    _nextOp(op: DEMChain, now: number): boolean {\n        if (!op.queued)\n            return false;\n        op.from = op.to;\n        op.to = op.queued;\n        op.queued = null;\n        op.phase = 0.0;\n        op.startTime = now;\n        return true;\n    }\n\n    _validOp(op: DEMChain): boolean {\n        return op.from.hasData() && op.to.hasData();\n    }\n}\n\nfunction demTileChanged(prev: ?Tile, next: ?Tile): boolean {\n    if (prev == null || next == null)\n        return false;\n    if (!prev.hasData() || !next.hasData())\n        return false;\n    if (prev.demTexture == null || next.demTexture == null)\n        return false;\n    return prev.tileID.key !== next.tileID.key;\n}\n\nconst vertexMorphing = new VertexMorphing();\nconst SHADER_DEFAULT = 0;\nconst SHADER_MORPHING = 1;\nconst defaultDuration = 250;\n\nconst shaderDefines = {\n    \"0\": null,\n    \"1\": 'TERRAIN_VERTEX_MORPHING'\n};\n\nfunction drawTerrainForGlobe(painter: Painter, terrain: Terrain, sourceCache: SourceCache, tileIDs: Array<OverscaledTileID>, now: number) {\n    const context = painter.context;\n    const gl = context.gl;\n\n    let program, programMode;\n    const tr = painter.transform;\n    const useCustomAntialiasing = globeUseCustomAntiAliasing(painter, context, tr);\n\n    const setShaderMode = (coord: OverscaledTileID, mode: number) => {\n        if (programMode === mode) return;\n        const defines = [shaderDefines[mode], 'PROJECTION_GLOBE_VIEW'];\n\n        if (useCustomAntialiasing) defines.push('CUSTOM_ANTIALIASING');\n\n        const affectedByFog = painter.isTileAffectedByFog(coord);\n        program = painter.getOrCreateProgram('globeRaster', {defines, overrideFog: affectedByFog});\n        programMode = mode;\n    };\n\n    const colorMode = painter.colorModeForRenderPass();\n    const depthMode = new DepthMode(gl.LEQUAL, DepthMode.ReadWrite, painter.depthRangeFor3D);\n    vertexMorphing.update(now);\n    const globeMercatorMatrix = calculateGlobeMercatorMatrix(tr);\n    const mercatorCenter = [mercatorXfromLng(tr.center.lng), mercatorYfromLat(tr.center.lat)];\n    const sharedBuffers = painter.globeSharedBuffers;\n    const viewport = [tr.width * browser.devicePixelRatio, tr.height * browser.devicePixelRatio];\n    const globeMatrix = Float32Array.from(tr.globeMatrix);\n    const elevationOptions = {useDenormalizedUpVectorScale: true};\n\n    {\n        const tr = painter.transform;\n        const skirtHeightValue = skirtHeight(tr.zoom, terrain.exaggeration(), terrain.sourceCache._source.tileSize);\n\n        programMode = -1;\n\n        const primitive = gl.TRIANGLES;\n\n        for (const coord of tileIDs) {\n            const tile = sourceCache.getTile(coord);\n            const stencilMode = StencilMode.disabled;\n\n            const prevDemTile = terrain.prevTerrainTileForTile[coord.key];\n            const nextDemTile = terrain.terrainTileForTile[coord.key];\n\n            if (demTileChanged(prevDemTile, nextDemTile)) {\n                vertexMorphing.newMorphing(coord.key, prevDemTile, nextDemTile, now, defaultDuration);\n            }\n\n            // Bind the main draped texture\n            context.activeTexture.set(gl.TEXTURE0);\n            if (tile.texture) {\n                tile.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n            }\n\n            const morph = vertexMorphing.getMorphValuesForProxy(coord.key);\n            const shaderMode = morph ? SHADER_MORPHING : SHADER_DEFAULT;\n\n            if (morph) {\n                extend(elevationOptions, {morphing: {srcDemTile: morph.from, dstDemTile: morph.to, phase: easeCubicInOut(morph.phase)}});\n            }\n\n            const tileBounds = tileCornersToBounds(coord.canonical);\n            const latitudinalLod = getLatitudinalLod(tileBounds.getCenter().lat);\n            const gridMatrix = getGridMatrix(coord.canonical, tileBounds, latitudinalLod, tr.worldSize / tr._pixelsPerMercatorPixel);\n            const normalizeMatrix = globeNormalizeECEF(globeTileBounds(coord.canonical));\n            const uniformValues = globeRasterUniformValues(\n                tr.expandedFarZProjMatrix, globeMatrix, globeMercatorMatrix, normalizeMatrix, globeToMercatorTransition(tr.zoom),\n                mercatorCenter, tr.frustumCorners.TL, tr.frustumCorners.TR, tr.frustumCorners.BR,\n                tr.frustumCorners.BL, tr.globeCenterInViewSpace, tr.globeRadius, viewport, skirtHeightValue, tr._farZ, gridMatrix);\n\n            setShaderMode(coord, shaderMode);\n            if (!program) {\n                continue;\n            }\n\n            terrain.setupElevationDraw(tile, program, elevationOptions);\n\n            painter.uploadCommonUniforms(context, program, coord.toUnwrapped());\n\n            if (sharedBuffers) {\n                const [buffer, indexBuffer, segments] = sharedBuffers.getGridBuffers(latitudinalLod, skirtHeightValue !== 0);\n\n                program.draw(painter, primitive, depthMode, stencilMode, colorMode, CullFaceMode.backCCW,\n                    uniformValues, \"globe_raster\", buffer, indexBuffer, segments);\n            }\n        }\n    }\n\n    // Render the poles.\n    if (sharedBuffers && (painter.renderDefaultNorthPole || painter.renderDefaultSouthPole)) {\n        const defines = ['GLOBE_POLES', 'PROJECTION_GLOBE_VIEW'];\n        if (useCustomAntialiasing) defines.push('CUSTOM_ANTIALIASING');\n\n        program = painter.getOrCreateProgram('globeRaster', {defines});\n        for (const coord of tileIDs) {\n            // Fill poles by extrapolating adjacent border tiles\n            const {x, y, z} = coord.canonical;\n            const topCap = y === 0;\n            const bottomCap = y === (1 << z) - 1;\n\n            const [northPoleBuffer, southPoleBuffer, indexBuffer, segment] = sharedBuffers.getPoleBuffers(z, false);\n\n            if (segment && (topCap || bottomCap)) {\n                const tile = sourceCache.getTile(coord);\n\n                // Bind the main draped texture\n                context.activeTexture.set(gl.TEXTURE0);\n                if (tile.texture) {\n                    tile.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n                }\n\n                let poleMatrix = globePoleMatrixForTile(z, x, tr);\n                const normalizeMatrix = globeNormalizeECEF(globeTileBounds(coord.canonical));\n\n                const drawPole = (program: Program<any>, vertexBuffer: VertexBuffer) => program.draw(\n                    painter, gl.TRIANGLES, depthMode, StencilMode.disabled, colorMode, CullFaceMode.disabled,\n                    globeRasterUniformValues(tr.expandedFarZProjMatrix, poleMatrix, poleMatrix, normalizeMatrix, 0.0, mercatorCenter,\n                    tr.frustumCorners.TL, tr.frustumCorners.TR, tr.frustumCorners.BR, tr.frustumCorners.BL,\n                    tr.globeCenterInViewSpace, tr.globeRadius, viewport, 0, tr._farZ), \"globe_pole_raster\", vertexBuffer,\n                    indexBuffer, segment);\n\n                terrain.setupElevationDraw(tile, program, elevationOptions);\n\n                painter.uploadCommonUniforms(context, program, coord.toUnwrapped());\n\n                if (topCap && painter.renderDefaultNorthPole) {\n                    drawPole(program, northPoleBuffer);\n                }\n                if (bottomCap && painter.renderDefaultSouthPole) {\n                    poleMatrix = mat4.scale(mat4.create(), poleMatrix, [1, -1, 1]);\n                    drawPole(program, southPoleBuffer);\n                }\n            }\n        }\n    }\n}\n\nfunction drawTerrainRaster(painter: Painter, terrain: Terrain, sourceCache: SourceCache, tileIDs: Array<OverscaledTileID>, now: number) {\n    if (painter.transform.projection.name === 'globe') {\n        drawTerrainForGlobe(painter, terrain, sourceCache, tileIDs, now);\n    } else {\n        const context = painter.context;\n        const gl = context.gl;\n\n        let program, programMode;\n        const shadowRenderer = painter.shadowRenderer;\n        const cutoffParams = getCutoffParams(painter, painter.longestCutoffRange);\n\n        const setShaderMode = (mode: number) => {\n            if (programMode === mode)\n                return;\n            const modes = ([]: any);\n            modes.push(shaderDefines[mode]);\n            if (cutoffParams.shouldRenderCutoff) {\n                modes.push('RENDER_CUTOFF');\n            }\n            program = painter.getOrCreateProgram('terrainRaster', {defines: modes});\n            programMode = mode;\n        };\n\n        const colorMode = painter.colorModeForRenderPass();\n        const depthMode = new DepthMode(gl.LEQUAL, DepthMode.ReadWrite, painter.depthRangeFor3D);\n        vertexMorphing.update(now);\n        const tr = painter.transform;\n        const skirt = skirtHeight(tr.zoom, terrain.exaggeration(), terrain.sourceCache._source.tileSize);\n\n        let groundShadowFactor: [number, number, number] = [0, 0, 0];\n        if (shadowRenderer) {\n            const directionalLight = painter.style.directionalLight;\n            const ambientLight = painter.style.ambientLight;\n            if (directionalLight && ambientLight) {\n                groundShadowFactor = calculateGroundShadowFactor(directionalLight, ambientLight);\n            }\n        }\n\n        {\n            programMode = -1;\n\n            const primitive = gl.TRIANGLES;\n            const [buffer, segments] = [terrain.gridIndexBuffer, terrain.gridSegments];\n\n            for (const coord of tileIDs) {\n                const tile = sourceCache.getTile(coord);\n                const stencilMode = StencilMode.disabled;\n\n                const prevDemTile = terrain.prevTerrainTileForTile[coord.key];\n                const nextDemTile = terrain.terrainTileForTile[coord.key];\n\n                if (demTileChanged(prevDemTile, nextDemTile)) {\n                    vertexMorphing.newMorphing(coord.key, prevDemTile, nextDemTile, now, defaultDuration);\n                }\n\n                // Bind the main draped texture\n                context.activeTexture.set(gl.TEXTURE0);\n                if (tile.texture) {\n                    tile.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n                }\n\n                const morph = vertexMorphing.getMorphValuesForProxy(coord.key);\n                const shaderMode = morph ? SHADER_MORPHING : SHADER_DEFAULT;\n                let elevationOptions;\n\n                if (morph) {\n                    elevationOptions = {morphing: {srcDemTile: morph.from, dstDemTile: morph.to, phase: easeCubicInOut(morph.phase)}};\n                }\n\n                const uniformValues = terrainRasterUniformValues(coord.projMatrix, isEdgeTile(coord.canonical, tr.renderWorldCopies) ? skirt / 10 : skirt, groundShadowFactor);\n                setShaderMode(shaderMode);\n                if (!program) {\n                    continue;\n                }\n\n                terrain.setupElevationDraw(tile, program, elevationOptions);\n\n                const unwrappedId = coord.toUnwrapped();\n\n                if (shadowRenderer) {\n                    shadowRenderer.setupShadows(unwrappedId, program);\n                }\n\n                painter.uploadCommonUniforms(context, program, unwrappedId, null, cutoffParams);\n\n                program.draw(painter, primitive, depthMode, stencilMode, colorMode, CullFaceMode.backCCW,\n                    uniformValues, \"terrain_raster\", terrain.gridBuffer, buffer, segments);\n            }\n        }\n    }\n}\n\nfunction drawTerrainDepth(painter: Painter, terrain: Terrain, sourceCache: SourceCache, tileIDs: Array<OverscaledTileID>) {\n    if (painter.transform.projection.name === 'globe') {\n        return;\n    }\n\n    assert(painter.renderPass === 'offscreen');\n\n    const context = painter.context;\n    const gl = context.gl;\n\n    context.clear({depth: 1});\n    const program = painter.getOrCreateProgram('terrainDepth');\n    const depthMode = new DepthMode(gl.LESS, DepthMode.ReadWrite, painter.depthRangeFor3D);\n\n    for (const coord of tileIDs) {\n        const tile = sourceCache.getTile(coord);\n        const uniformValues = terrainRasterUniformValues(coord.projMatrix, 0, [0, 0, 0]);\n        terrain.setupElevationDraw(tile, program);\n\n        program.draw(painter, gl.TRIANGLES, depthMode, StencilMode.disabled, ColorMode.unblended, CullFaceMode.backCCW,\n            uniformValues, \"terrain_depth\", terrain.gridBuffer, terrain.gridIndexBuffer, terrain.gridNoSkirtSegments);\n    }\n}\n\nfunction skirtHeight(zoom: number, terrainExaggeration: number, tileSize: number) {\n    // Skirt height calculation is heuristic: provided value hides\n    // seams between tiles and it is not too large: 9 at zoom 22, ~20000m at zoom 0.\n    if (terrainExaggeration === 0) return 0;\n    const exaggerationFactor = (terrainExaggeration < 1.0 && tileSize === 514) ? 0.25 / terrainExaggeration : 1.0;\n    return 6 * Math.pow(1.5, 22 - zoom) * Math.max(terrainExaggeration, 1.0) * exaggerationFactor;\n}\n\nfunction isEdgeTile(cid: CanonicalTileID, renderWorldCopies: boolean): boolean {\n    const numTiles = 1 << cid.z;\n    return (!renderWorldCopies && (cid.x === 0 || cid.x === numTiles - 1)) || cid.y === 0 || cid.y === numTiles - 1;\n}\n\nexport {\n    VertexMorphing\n};\n","// @flow\n\nimport {UniformMatrix4f} from '../uniform_binding.js';\n\nimport type Context from '../../gl/context.js';\nimport type {UniformValues} from '../uniform_binding.js';\n\nexport type ClippingMaskUniformsType = {|\n    'u_matrix': UniformMatrix4f\n|};\n\nconst clippingMaskUniforms = (context: Context): ClippingMaskUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context)\n});\n\nconst clippingMaskUniformValues = (matrix: Float32Array): UniformValues<ClippingMaskUniformsType> => ({\n    'u_matrix': matrix\n});\n\nexport {clippingMaskUniforms, clippingMaskUniformValues};\n","// @flow\n\nimport type SourceCache from '../source/source_cache.js';\nimport {clamp} from '../util/util.js';\nimport browser from '../util/browser.js';\nimport Tile from '../source/tile.js';\nimport type Transform from '../geo/transform.js';\n\nexport type RasterFade = {|\n    opacity: number,\n    mix: number,\n|};\n\nfunction rasterFade(tile: Tile, parentTile: ?Tile, sourceCache: SourceCache, transform: Transform, fadeDuration: number): RasterFade {\n    if (fadeDuration > 0) {\n        const now = browser.now();\n        const sinceTile = (now - tile.timeAdded) / fadeDuration;\n        const sinceParent = parentTile ? (now - parentTile.timeAdded) / fadeDuration : -1;\n\n        const source = sourceCache.getSource();\n        const idealZ = transform.coveringZoomLevel({\n            tileSize: source.tileSize,\n            roundZoom: source.roundZoom\n        });\n\n        // if no parent or parent is older, fade in; if parent is younger, fade out\n        const fadeIn = !parentTile || Math.abs(parentTile.tileID.overscaledZ - idealZ) > Math.abs(tile.tileID.overscaledZ - idealZ);\n\n        const childOpacity = (fadeIn && tile.refreshedUponExpiration) ? 1 : clamp(fadeIn ? sinceTile : 1 - sinceParent, 0, 1);\n\n        // we don't crossfade tiles that were just refreshed upon expiring:\n        // once they're old enough to pass the crossfading threshold\n        // (fadeDuration), unset the `refreshedUponExpiration` flag so we don't\n        // incorrectly fail to crossfade them when zooming\n        if (tile.refreshedUponExpiration && sinceTile >= 1) tile.refreshedUponExpiration = false;\n\n        if (parentTile) {\n            return {\n                opacity: 1,\n                mix: 1 - childOpacity\n            };\n        } else {\n            return {\n                opacity: childOpacity,\n                mix: 0\n            };\n        }\n    } else {\n        return {\n            opacity: 1,\n            mix: 0\n        };\n    }\n}\n\nexport default rasterFade;\n","// @flow\nimport Point from '@mapbox/point-geometry';\nimport SourceCache from '../source/source_cache.js';\nimport {OverscaledTileID} from '../source/tile_id.js';\nimport Tile from '../source/tile.js';\nimport posAttributes from '../data/pos_attributes.js';\nimport {TriangleIndexArray, PosArray} from '../data/array_types.js';\nimport SegmentVector from '../data/segment.js';\nimport Texture from '../render/texture.js';\nimport {Uniform1i, Uniform1f, Uniform2f, Uniform3f, UniformMatrix4f} from '../render/uniform_binding.js';\nimport {prepareDEMTexture} from '../render/draw_hillshade.js';\nimport EXTENT from '../style-spec/data/extent.js';\nimport {clamp, warnOnce} from '../util/util.js';\nimport assert from 'assert';\nimport {vec3, mat4, vec4} from 'gl-matrix';\nimport getWorkerPool from '../util/global_worker_pool.js';\nimport Dispatcher from '../util/dispatcher.js';\nimport GeoJSONSource from '../source/geojson_source.js';\nimport ImageSource from '../source/image_source.js';\nimport RasterTileSource from '../source/raster_tile_source.js';\nimport VectorTileSource from '../source/vector_tile_source.js';\nimport Color from '../style-spec/util/color.js';\nimport type {Callback} from '../types/callback.js';\nimport StencilMode from '../gl/stencil_mode.js';\nimport {DepthStencilAttachment} from '../gl/value.js';\nimport {drawTerrainRaster, drawTerrainDepth} from './draw_terrain_raster.js';\nimport type RasterStyleLayer from '../style/style_layer/raster_style_layer.js';\nimport type CustomStyleLayer from '../style/style_layer/custom_style_layer.js';\nimport type LineStyleLayer from '../style/style_layer/line_style_layer.js';\nimport type Program from '../render/program.js';\nimport {Elevation} from './elevation.js';\nimport Framebuffer from '../gl/framebuffer.js';\nimport ColorMode from '../gl/color_mode.js';\nimport DepthMode from '../gl/depth_mode.js';\nimport CullFaceMode from '../gl/cull_face_mode.js';\nimport {clippingMaskUniformValues} from '../render/program/clipping_mask_program.js';\nimport MercatorCoordinate, {mercatorZfromAltitude} from '../geo/mercator_coordinate.js';\nimport browser from '../util/browser.js';\nimport {DrapeRenderMode} from '../style/terrain.js';\nimport rasterFade from '../render/raster_fade.js';\nimport {create as createSource} from '../source/source.js';\nimport {RGBAImage, Float32Image} from '../util/image.js';\nimport {globeMetersToEcef} from '../geo/projection/globe_util.js';\nimport {ZoomDependentExpression} from '../style-spec/expression/index.js';\nimport {number as interpolate} from '../style-spec/util/interpolate.js';\n\nimport type {Map} from '../ui/map.js';\nimport type Painter from '../render/painter.js';\nimport type Style from '../style/style.js';\nimport type StyleLayer from '../style/style_layer.js';\nimport type VertexBuffer from '../gl/vertex_buffer.js';\nimport type IndexBuffer from '../gl/index_buffer.js';\nimport type Context from '../gl/context.js';\nimport type {UniformValues} from '../render/uniform_binding.js';\nimport type Transform from '../geo/transform.js';\nimport type {Vec3, Vec4} from 'gl-matrix';\nimport type {CanonicalTileID} from '../source/tile_id.js';\n\nconst GRID_DIM = 128;\n\nconst FBO_POOL_SIZE = 5;\nconst RENDER_CACHE_MAX_SIZE = 50;\n\ntype RenderBatch = {\n    start: number;\n    end: number;\n}\n\nclass MockSourceCache extends SourceCache {\n    constructor(map: Map) {\n        const sourceSpec = {type: 'raster-dem', maxzoom: map.transform.maxZoom};\n        const sourceDispatcher = new Dispatcher(getWorkerPool(), null);\n        const source = createSource('mock-dem', sourceSpec, sourceDispatcher, map.style);\n\n        super('mock-dem', source, false);\n\n        source.setEventedParent(this);\n\n        this._sourceLoaded = true;\n    }\n\n    _loadTile(tile: Tile, callback: Callback<void>) {\n        tile.state = 'loaded';\n        callback(null);\n    }\n}\n\n/**\n * Proxy source cache gets ideal screen tile cover coordinates. All the other\n * source caches's coordinates get mapped to subrects of proxy coordinates (or\n * vice versa, subrects of larger tiles from all source caches get mapped to\n * full proxy tile). This happens on every draw call in Terrain.updateTileBinding.\n * Approach is used here for terrain : all the visible source tiles of all the\n * source caches get rendered to proxy source cache textures and then draped over\n * terrain. It is in future reusable for handling overscalling as buckets could be\n * constructed only for proxy tile content, not for full overscalled vector tile.\n */\nclass ProxySourceCache extends SourceCache {\n    renderCache: Array<FBO>;\n    renderCachePool: Array<number>;\n    proxyCachedFBO: {[string | number]: {[string | number]: number}};\n\n    constructor(map: Map) {\n\n        const source = createSource('proxy', {\n            type: 'geojson',\n            maxzoom: map.transform.maxZoom\n        }, new Dispatcher(getWorkerPool(), null), map.style);\n\n        super('proxy', source, false);\n\n        source.setEventedParent(this);\n\n        // This source is not to be added as a map source: we use it's tile management.\n        // For that, initialize internal structures used for tile cover update.\n        this.map = ((this.getSource(): any): GeoJSONSource).map = map;\n        this.used = this._sourceLoaded = true;\n        this.renderCache = [];\n        this.renderCachePool = [];\n        this.proxyCachedFBO = {};\n    }\n\n    // Override for transient nature of cover here: don't cache and retain.\n    update(transform: Transform, tileSize?: number, updateForTerrain?: boolean) { // eslint-disable-line no-unused-vars\n        if (transform.freezeTileCoverage) { return; }\n        this.transform = transform;\n        const idealTileIDs = transform.coveringTiles({\n            tileSize: this._source.tileSize,\n            minzoom: this._source.minzoom,\n            maxzoom: this._source.maxzoom,\n            roundZoom: this._source.roundZoom,\n            reparseOverscaled: this._source.reparseOverscaled\n        });\n\n        const incoming: {[string]: string} = idealTileIDs.reduce((acc, tileID) => {\n            acc[tileID.key] = '';\n            if (!this._tiles[tileID.key]) {\n                const tile = new Tile(tileID, this._source.tileSize * tileID.overscaleFactor(), transform.tileZoom);\n                tile.state = 'loaded';\n                this._tiles[tileID.key] = tile;\n            }\n            return acc;\n        }, {});\n\n        for (const id in this._tiles) {\n            if (!(id in incoming)) {\n                this.freeFBO(id);\n                this._tiles[id].unloadVectorData();\n                delete this._tiles[id];\n            }\n        }\n    }\n\n    freeFBO(id: string) {\n        const fbos = this.proxyCachedFBO[id];\n        if (fbos !== undefined) {\n            const fboIds = ((Object.values(fbos): any): Array<number>);\n            this.renderCachePool.push(...fboIds);\n            delete this.proxyCachedFBO[id];\n        }\n    }\n\n    deallocRenderCache() {\n        this.renderCache.forEach(fbo => fbo.fb.destroy());\n        this.renderCache = [];\n        this.renderCachePool = [];\n        this.proxyCachedFBO = {};\n    }\n}\n\n/**\n * Canonical, wrap and overscaledZ contain information of original source cache tile.\n * This tile gets ortho-rendered to proxy tile (defined by proxyTileKey).\n * `posMatrix` holds orthographic, scaling and translation information that is used\n * for rendering original tile content to a proxy tile. Proxy tile covers whole\n * or sub-rectangle of the original tile.\n */\nclass ProxiedTileID extends OverscaledTileID {\n    proxyTileKey: number;\n\n    constructor(tileID: OverscaledTileID, proxyTileKey: number, projMatrix: Float32Array) {\n        super(tileID.overscaledZ, tileID.wrap, tileID.canonical.z, tileID.canonical.x, tileID.canonical.y);\n        this.proxyTileKey = proxyTileKey;\n        this.projMatrix = projMatrix;\n    }\n}\n\ntype OverlapStencilType = false | 'Clip' | 'Mask';\ntype FBO = {fb: Framebuffer, tex: Texture, dirty: boolean};\n\nexport class Terrain extends Elevation {\n    terrainTileForTile: {[number | string]: Tile};\n    prevTerrainTileForTile: {[number | string]: Tile};\n    painter: Painter;\n    sourceCache: SourceCache;\n    gridBuffer: VertexBuffer;\n    gridIndexBuffer: IndexBuffer;\n    gridSegments: SegmentVector;\n    gridNoSkirtSegments: SegmentVector;\n    proxiedCoords: {[fqid: string]: Array<ProxiedTileID>};\n    proxyCoords: Array<OverscaledTileID>;\n    proxyToSource: {[number]: {[string]: Array<ProxiedTileID>}};\n    proxySourceCache: ProxySourceCache;\n    renderingToTexture: boolean;\n    _style: Style;\n    _mockSourceCache: MockSourceCache;\n    orthoMatrix: Float32Array;\n    enabled: boolean;\n    renderMode: number;\n\n    _visibleDemTiles: Array<Tile>;\n    _sourceTilesOverlap: {[string]: boolean};\n    _overlapStencilMode: StencilMode;\n    _overlapStencilType: OverlapStencilType;\n    _stencilRef: number;\n\n    _exaggeration: number;\n    _evaluationZoom: ?number;\n    _previousCameraAltitude: ?number;\n    _previousUpdateTimestamp: ?number;\n    _depthFBO: ?Framebuffer;\n    _depthTexture: ?Texture;\n    _previousZoom: number;\n    _updateTimestamp: number;\n    _useVertexMorphing: boolean;\n    pool: Array<FBO>;\n    renderedToTile: boolean;\n    _drapedRenderBatches: Array<RenderBatch>;\n    _sharedDepthStencil: ?WebGLRenderbuffer;\n\n    _findCoveringTileCache: {[string]: {[number]: ?number}};\n\n    _tilesDirty: {[string]: {[number]: boolean}};\n    invalidateRenderCache: boolean;\n\n    _emptyDepthBufferTexture: ?Texture;\n    _emptyDEMTexture: ?Texture;\n    _initializing: ?boolean;\n    _emptyDEMTextureDirty: ?boolean;\n\n    _pendingGroundEffectLayers: Array<number>;\n    framebufferCopyTexture: ?Texture;\n\n    _debugParams: {\n        sortTilesHiZFirst: boolean,\n        disableRenderCache: boolean\n    }\n\n    constructor(painter: Painter, style: Style) {\n        super();\n\n        this._debugParams = {sortTilesHiZFirst: true, disableRenderCache: false};\n        painter.tp.registerParameter(this._debugParams, [\"Terrain\"], \"sortTilesHiZFirst\", {}, () => {\n            this._style.map.triggerRepaint();\n        });\n        painter.tp.registerParameter(this._debugParams, [\"Terrain\"], \"disableRenderCache\", {}, () => {\n            this._style.map.triggerRepaint();\n        });\n        painter.tp.registerButton([\"Terrain\"], \"Invalidate Render Cache\", () => {\n            this.invalidateRenderCache = true;\n            this._style.map.triggerRepaint();\n        });\n\n        this.painter = painter;\n        this.terrainTileForTile = {};\n        this.prevTerrainTileForTile = {};\n\n        // Terrain rendering grid is 129x129 cell grid, made by 130x130 points.\n        // 130 vertices map to 128 DEM data + 1px padding on both sides.\n        // DEM texture is padded (1, 1, 1, 1) and padding pixels are backfilled\n        // by neighboring tile edges. This way we achieve tile stitching as\n        // edge vertices from neighboring tiles evaluate to the same 3D point.\n        const [triangleGridArray, triangleGridIndices, skirtIndicesOffset] = createGrid(GRID_DIM + 1);\n        const context = painter.context;\n        this.gridBuffer = context.createVertexBuffer(triangleGridArray, posAttributes.members);\n        this.gridIndexBuffer = context.createIndexBuffer(triangleGridIndices);\n        this.gridSegments = SegmentVector.simpleSegment(0, 0, triangleGridArray.length, triangleGridIndices.length);\n        this.gridNoSkirtSegments = SegmentVector.simpleSegment(0, 0, triangleGridArray.length, skirtIndicesOffset);\n        this.proxyCoords = [];\n        this.proxiedCoords = {};\n        this._visibleDemTiles = [];\n        this._drapedRenderBatches = [];\n        this._sourceTilesOverlap = {};\n        this.proxySourceCache = new ProxySourceCache(style.map);\n        this.orthoMatrix = mat4.create();\n        const epsilon = this.painter.transform.projection.name === 'globe' ?  .015 : 0; // Experimentally the smallest value to avoid rendering artifacts (https://github.com/mapbox/mapbox-gl-js/issues/11975)\n        mat4.ortho(this.orthoMatrix, epsilon, EXTENT, 0, EXTENT, 0, 1);\n        const gl = context.gl;\n        this._overlapStencilMode = new StencilMode({func: gl.GEQUAL, mask: 0xFF}, 0, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE);\n        this._previousZoom = painter.transform.zoom;\n        this.pool = [];\n        this._findCoveringTileCache = {};\n        this._tilesDirty = {};\n        this.style = style;\n        this._useVertexMorphing = true;\n        this._exaggeration = 1;\n        this._mockSourceCache = new MockSourceCache(style.map);\n        this._pendingGroundEffectLayers = [];\n    }\n\n    set style(style: Style) {\n        // $FlowFixMe[method-unbinding]\n        style.on('data', this._onStyleDataEvent.bind(this));\n        // $FlowFixMe[method-unbinding]\n        this._style = style;\n        this._style.map.on('moveend', () => {\n            this._clearLineLayersFromRenderCache();\n        });\n    }\n\n    /*\n     * Validate terrain and update source cache used for elevation.\n     * Explicitly pass transform to update elevation (Transform.updateElevation)\n     * before using transform for source cache update.\n     */\n    update(style: Style, transform: Transform, adaptCameraAltitude: boolean) {\n        if (style && style.terrain) {\n            if (this._style !== style) {\n                this.style = style;\n                this._evaluationZoom = undefined;\n            }\n            const terrainProps = style.terrain.properties;\n            const isDrapeModeDeferred = style.terrain.drapeRenderMode === DrapeRenderMode.deferred;\n            const zoomDependentExaggeration = style.terrain.isZoomDependent();\n\n            this._previousUpdateTimestamp = this.enabled ? this._updateTimestamp : undefined;\n            this._updateTimestamp = browser.now();\n\n            const scope = style.terrain && style.terrain.scope;\n            const sourceCacheId = terrainProps.get('source');\n            const sourceCache = isDrapeModeDeferred ?\n                this._mockSourceCache :\n                style.getSourceCache(sourceCacheId, scope);\n\n            if (!sourceCache) {\n                warnOnce(`Couldn't find terrain source \"${sourceCacheId}\".`);\n                return;\n            }\n\n            this.sourceCache = sourceCache;\n            this._exaggeration = zoomDependentExaggeration ? this.calculateExaggeration(transform) : terrainProps.get('exaggeration');\n            if (!transform.projection.requiresDraping && zoomDependentExaggeration && this._exaggeration === 0) {\n                this._disable();\n                return;\n            }\n\n            this.enabled = true;\n\n            const updateSourceCache = () => {\n                if (this.sourceCache.used) {\n                    warnOnce(`Raster DEM source '${this.sourceCache.id}' is used both for terrain and as layer source.\\n` +\n                        'This leads to lower resolution of hillshade. For full hillshade resolution but higher memory consumption, define another raster DEM source.');\n                }\n                // Lower tile zoom is sufficient for terrain, given the size of terrain grid.\n                const scaledDemTileSize = this.getScaledDemTileSize();\n                // Dem tile needs to be parent or at least of the same zoom level as proxy tile.\n                // Tile cover roundZoom behavior is set to the same as for proxy (false) in SourceCache.update().\n                this.sourceCache.update(transform, scaledDemTileSize, true);\n                // As a result of update, we get new set of tiles: reset lookup cache.\n                this.resetTileLookupCache(this.sourceCache.id);\n            };\n\n            if (!this.sourceCache.usedForTerrain) {\n                // Init cache entry.\n                this.resetTileLookupCache(this.sourceCache.id);\n                // When toggling terrain on/off load available terrain tiles from cache\n                // before reading elevation at center.\n                this.sourceCache.usedForTerrain = true;\n                updateSourceCache();\n                this._initializing = true;\n            }\n\n            updateSourceCache();\n            // Camera gets constrained over terrain. Issue constrainCameraOverTerrain = true\n            // here to cover potential under terrain situation on data, style, or other camera changes.\n            transform.updateElevation(true, adaptCameraAltitude);\n\n            // Reset tile lookup cache and update draped tiles coordinates.\n            this.resetTileLookupCache(this.proxySourceCache.id);\n            this.proxySourceCache.update(transform);\n\n            this._emptyDEMTextureDirty = true;\n            this._previousZoom = transform.zoom;\n        } else {\n            this._disable();\n        }\n    }\n\n    calculateExaggeration(transform: Transform): number {\n        const previousAltitude = this._previousCameraAltitude;\n        const altitude = (transform.getFreeCameraOptions().position: any).z / transform.pixelsPerMeter * transform.worldSize;\n        this._previousCameraAltitude = altitude;\n        // 2 meters as threshold for constant sea elevation movement.\n        const altitudeDelta = previousAltitude != null ? (altitude - previousAltitude) : Number.MAX_VALUE;\n        if (Math.abs(altitudeDelta) < 2) {\n            // Returns current value and avoids any unpleasant terrain change.\n            return this._exaggeration;\n        }\n\n        const cameraZoom = transform.zoom;\n\n        assert(this._style.terrain);\n        const terrainStyle = (this._style.terrain: any);\n\n        if (!this._previousUpdateTimestamp) {\n            // covers also 0 (timestamp in render tests is 0).\n            return terrainStyle.getExaggeration(cameraZoom);\n        }\n        let zoomDelta = cameraZoom - this._previousZoom;\n        const previousUpdateTimestamp = this._previousUpdateTimestamp;\n\n        let z = cameraZoom;\n        if (this._evaluationZoom != null) {\n            z = this._evaluationZoom;\n            assert(previousAltitude != null);\n            // incorporate any difference of _evaluationZoom and real zoom here.\n            // Smoothening below resolves flicker.\n            if (Math.abs(cameraZoom - z) > 0.5) {\n                zoomDelta = 0.5 * (cameraZoom - z + zoomDelta);\n            }\n            if (zoomDelta * altitudeDelta < 0) {\n                // if they have different sign, e.g. zooming in and recenter calculates lower zoom, do not advance.\n                z += zoomDelta;\n            }\n        }\n        this._evaluationZoom = z;\n\n        const evaluatedExaggeration = terrainStyle.getExaggeration(z);\n        assert(this._previousUpdateTimestamp != null);\n\n        // evaluate if we are in area with fixed exaggeration. 0.1 is random - idea is to\n        // interpolate faster to desired value.\n        const evaluatedExaggerationLowerZ = terrainStyle.getExaggeration(Math.max(0, z - 0.1));\n        const fixedExaggeration = evaluatedExaggeration === evaluatedExaggerationLowerZ;\n\n        const lowExaggerationTreshold = 0.1;\n        const exaggerationSmoothTarget = 0.01;\n        if (fixedExaggeration && Math.abs(evaluatedExaggeration - this._exaggeration) < exaggerationSmoothTarget) {\n            return evaluatedExaggeration;\n        }\n\n        // smoothen the changes further to reduce flickering\n        let interpolateStrength = Math.min(0.1, (this._updateTimestamp - previousUpdateTimestamp) * 0.00375); // Empiric value, e.g. ~0.06 at 60 FPS\n        if (fixedExaggeration || evaluatedExaggeration < lowExaggerationTreshold || Math.abs(zoomDelta) < 0.0001) {\n            // interpolate faster, when out of dynamic exaggeration range, near zero or when zooming out/in stops.\n            interpolateStrength = Math.min(0.2, interpolateStrength * 4);\n        }\n        return interpolate(this._exaggeration, evaluatedExaggeration, interpolateStrength);\n    }\n\n    resetTileLookupCache(sourceCacheID: string) {\n        this._findCoveringTileCache[sourceCacheID] = {};\n    }\n\n    getScaledDemTileSize(): number {\n        const demScale = this.sourceCache.getSource().tileSize / GRID_DIM;\n        const proxyTileSize = this.proxySourceCache.getSource().tileSize;\n        return demScale * proxyTileSize;\n    }\n\n    _onStyleDataEvent(event: any) {\n        if (event.coord && event.dataType === 'source') {\n            this._clearRenderCacheForTile(event.sourceCacheId, event.coord);\n        } else if (event.dataType === 'style') {\n            this.invalidateRenderCache = true;\n            this._evaluationZoom = undefined;\n            this._previousUpdateTimestamp = undefined;\n            this._previousCameraAltitude = undefined;\n        }\n    }\n\n    // Terrain\n    _disable() {\n        if (!this.enabled) return;\n        this.enabled = false;\n        this._sharedDepthStencil = undefined;\n        this._evaluationZoom = undefined;\n        this._previousUpdateTimestamp = undefined;\n        this.proxySourceCache.deallocRenderCache();\n        if (this._style) {\n            for (const id in this._style._mergedSourceCaches) {\n                this._style._mergedSourceCaches[id].usedForTerrain = false;\n            }\n        }\n    }\n\n    destroy() {\n        this._disable();\n        if (this._emptyDEMTexture) this._emptyDEMTexture.destroy();\n        if (this._emptyDepthBufferTexture) this._emptyDepthBufferTexture.destroy();\n        this.pool.forEach(fbo => fbo.fb.destroy());\n        this.pool = [];\n        if (this._depthFBO) {\n            this._depthFBO.destroy();\n            this._depthFBO = undefined;\n            this._depthTexture = undefined;\n        }\n        if (this.framebufferCopyTexture) this.framebufferCopyTexture.destroy();\n    }\n\n    // Implements Elevation::_source.\n    _source(): ?SourceCache {\n        return this.enabled ? this.sourceCache : null;\n    }\n\n    isUsingMockSource(): boolean {\n        return this.sourceCache === this._mockSourceCache;\n    }\n\n    // Implements Elevation::exaggeration.\n    exaggeration(): number {\n        return this._exaggeration;\n    }\n\n    get visibleDemTiles(): Array<Tile> {\n        return this._visibleDemTiles;\n    }\n\n    get drapeBufferSize(): [number, number] {\n        const extent = this.proxySourceCache.getSource().tileSize * 2; // *2 is to avoid upscaling bitmap on zoom.\n        return [extent, extent];\n    }\n\n    set useVertexMorphing(enable: boolean) {\n        this._useVertexMorphing = enable;\n    }\n\n    // For every renderable coordinate in every source cache, assign one proxy\n    // tile (see _setupProxiedCoordsForOrtho). Mapping of source tile to proxy\n    // tile is modeled by ProxiedTileID. In general case, source and proxy tile\n    // are of different zoom: ProxiedTileID.projMatrix models ortho, scale and\n    // translate from source to proxy. This matrix is used when rendering source\n    // tile to proxy tile's texture.\n    // One proxy tile can have multiple source tiles, or pieces of source tiles,\n    // that get rendered to it.\n    // For each proxy tile we assign one terrain tile (_assignTerrainTiles). The\n    // terrain tile provides elevation data when rendering (draping) proxy tile\n    // texture over terrain grid.\n    updateTileBinding(sourcesCoords: {[string]: Array<OverscaledTileID>}) {\n        if (!this.enabled) return;\n        this.prevTerrainTileForTile = this.terrainTileForTile;\n\n        const proxySourceCache = this.proxySourceCache;\n        const tr = this.painter.transform;\n        if (this._initializing) {\n            // Don't activate terrain until center tile gets loaded.\n            this._initializing = tr._centerAltitude === 0 && this.getAtPointOrZero(MercatorCoordinate.fromLngLat(tr.center), -1) === -1;\n            this._emptyDEMTextureDirty = !this._initializing;\n        }\n\n        const coords = this.proxyCoords = proxySourceCache.getIds().map((id) => {\n            const tileID = proxySourceCache.getTileByID(id).tileID;\n            tileID.projMatrix = tr.calculateProjMatrix(tileID.toUnwrapped());\n            return tileID;\n        });\n        sortByDistanceToCamera(coords, this.painter);\n\n        const previousProxyToSource = this.proxyToSource || {};\n        this.proxyToSource = {};\n        coords.forEach((tileID) => {\n            this.proxyToSource[tileID.key] = {};\n        });\n\n        this.terrainTileForTile = {};\n        const sourceCaches = this._style._mergedSourceCaches;\n\n        for (const fqid in sourceCaches) {\n            const sourceCache = sourceCaches[fqid];\n            if (!sourceCache.used) continue;\n            if (sourceCache !== this.sourceCache) this.resetTileLookupCache(sourceCache.id);\n            this._setupProxiedCoordsForOrtho(sourceCache, sourcesCoords[fqid], previousProxyToSource);\n            if (sourceCache.usedForTerrain) continue;\n            const coordinates = sourcesCoords[fqid];\n            if (sourceCache.getSource().reparseOverscaled) {\n                // Do this for layers that are not rasterized to proxy tile.\n                this._assignTerrainTiles(coordinates);\n            }\n        }\n\n        // Background has no source. Using proxy coords with 1-1 ortho (this.proxiedCoords[proxySourceCache.id])\n        // when rendering background to proxy tiles.\n        this.proxiedCoords[proxySourceCache.id] = coords.map(tileID => new ProxiedTileID(tileID, tileID.key, this.orthoMatrix));\n        this._assignTerrainTiles(coords);\n        this._prepareDEMTextures();\n        this._setupDrapedRenderBatches();\n        this._initFBOPool();\n        this._setupRenderCache(previousProxyToSource);\n\n        this.renderingToTexture = false;\n\n        // Gather all dem tiles that are assigned to proxy tiles\n        const visibleKeys = {};\n        this._visibleDemTiles = [];\n\n        for (const id of this.proxyCoords) {\n            const demTile = this.terrainTileForTile[id.key];\n            if (!demTile)\n                continue;\n            const key = demTile.tileID.key;\n            if (key in visibleKeys)\n                continue;\n            this._visibleDemTiles.push(demTile);\n            visibleKeys[key] = key;\n        }\n\n    }\n\n    _assignTerrainTiles(coords: Array<OverscaledTileID>) {\n        if (this._initializing) return;\n        coords.forEach((tileID) => {\n            if (this.terrainTileForTile[tileID.key]) return;\n            const demTile = this._findTileCoveringTileID(tileID, this.sourceCache);\n            if (demTile) this.terrainTileForTile[tileID.key] = demTile;\n        });\n    }\n\n    _prepareDEMTextures() {\n        const context = this.painter.context;\n        const gl = context.gl;\n        for (const key in this.terrainTileForTile) {\n            const tile = this.terrainTileForTile[key];\n            const dem = tile.dem;\n            if (dem && (!tile.demTexture || tile.needsDEMTextureUpload)) {\n                context.activeTexture.set(gl.TEXTURE1);\n                prepareDEMTexture(this.painter, tile, dem);\n            }\n        }\n    }\n\n    _prepareDemTileUniforms(proxyTile: Tile, demTile: ?Tile, uniforms: UniformValues<TerrainUniformsType>, uniformSuffix: ?string): boolean {\n        if (!demTile || demTile.demTexture == null)\n            return false;\n\n        assert(demTile.dem);\n        const proxyId = proxyTile.tileID.canonical;\n        const demId = demTile.tileID.canonical;\n        const demScaleBy = Math.pow(2, demId.z - proxyId.z);\n        const suffix = uniformSuffix || \"\";\n        // $FlowFixMe[prop-missing]\n        uniforms[`u_dem_tl${suffix}`] = [proxyId.x * demScaleBy % 1, proxyId.y * demScaleBy % 1];\n        // $FlowFixMe[prop-missing]\n        uniforms[`u_dem_scale${suffix}`] = demScaleBy;\n        return true;\n    }\n\n    get emptyDEMTexture(): Texture {\n        return !this._emptyDEMTextureDirty && this._emptyDEMTexture ?\n            this._emptyDEMTexture : this._updateEmptyDEMTexture();\n    }\n\n    get emptyDepthBufferTexture(): Texture {\n        const context = this.painter.context;\n        const gl = context.gl;\n        if (!this._emptyDepthBufferTexture) {\n            const image = new RGBAImage({width: 1, height: 1}, Uint8Array.of(255, 255, 255, 255));\n            this._emptyDepthBufferTexture = new Texture(context, image, gl.RGBA, {premultiply: false});\n        }\n        return this._emptyDepthBufferTexture;\n    }\n\n    _getLoadedAreaMinimum(): number {\n        let nonzero = 0;\n        const min = this._visibleDemTiles.reduce((acc, tile) => {\n            if (!tile.dem) return acc;\n            const m = tile.dem.tree.minimums[0];\n            acc += m;\n            if (m > 0) nonzero++;\n            return acc;\n        }, 0);\n        return nonzero ? min / nonzero : 0;\n    }\n\n    _updateEmptyDEMTexture(): Texture {\n        const context = this.painter.context;\n        const gl = context.gl;\n        context.activeTexture.set(gl.TEXTURE2);\n\n        const min = this._getLoadedAreaMinimum();\n\n        const getTextureParameters = () => {\n            const image = new Float32Image(\n                {width: 1, height: 1},\n                new Float32Array([min]));\n            return [gl.R32F, image];\n        };\n\n        const [internalFormat, image] = getTextureParameters();\n\n        this._emptyDEMTextureDirty = false;\n        let texture = this._emptyDEMTexture;\n        if (!texture) {\n            texture = this._emptyDEMTexture = new Texture(context, image, internalFormat, {premultiply: false});\n        } else {\n            texture.update(image, {premultiply: false});\n        }\n        return texture;\n    }\n\n    // useDepthForOcclusion: Pre-rendered depth to texture (this._depthTexture) is\n    // used to hide (actually moves all object's vertices out of viewport).\n    // useMeterToDem: u_meter_to_dem uniform is not used for all terrain programs,\n    // optimization to avoid unnecessary computation and upload.\n    setupElevationDraw(tile: Tile, program: Program<*>,\n        options?: {\n            useDepthForOcclusion?: boolean,\n            useMeterToDem?: boolean,\n            labelPlaneMatrixInv?: ?Float32Array,\n            morphing?: { srcDemTile: Tile, dstDemTile: Tile, phase: number },\n            useDenormalizedUpVectorScale?: boolean\n        }) {\n        const context = this.painter.context;\n        const gl = context.gl;\n        const uniforms = defaultTerrainUniforms();\n\n        uniforms['u_exaggeration'] = this.exaggeration();\n\n        let demTile = null;\n        let prevDemTile = null;\n        let morphingPhase = 1.0;\n\n        if (options && options.morphing && this._useVertexMorphing) {\n            const srcTile = options.morphing.srcDemTile;\n            const dstTile = options.morphing.dstDemTile;\n            morphingPhase = options.morphing.phase;\n\n            if (srcTile && dstTile) {\n                if (this._prepareDemTileUniforms(tile, srcTile, uniforms, \"_prev\"))\n                    prevDemTile = srcTile;\n                if (this._prepareDemTileUniforms(tile, dstTile, uniforms))\n                    demTile = dstTile;\n            }\n        }\n\n        const filteringForDemTile = (tile: any) => {\n            if (!tile || !tile.demTexture) {\n                return gl.NEAREST;\n            }\n\n            return this.painter.linearFloatFilteringSupported() ? gl.LINEAR : gl.NEAREST;\n        };\n\n        const setDemSizeUniform = (demTexture: Texture) => {\n            uniforms['u_dem_size'] = demTexture.size[0] === 1 ? 1 : demTexture.size[0] - 2;\n        };\n\n        if (prevDemTile && demTile) {\n            // Both DEM textures are expected to be correctly set if geomorphing is enabled\n            context.activeTexture.set(gl.TEXTURE2);\n            (demTile.demTexture: any).bind(filteringForDemTile(demTile), gl.CLAMP_TO_EDGE);\n            context.activeTexture.set(gl.TEXTURE4);\n            (prevDemTile.demTexture: any).bind(filteringForDemTile(prevDemTile), gl.CLAMP_TO_EDGE);\n            if (demTile.demTexture) {\n                setDemSizeUniform(demTile.demTexture);\n            }\n            uniforms[\"u_dem_lerp\"] = morphingPhase;\n        } else {\n            demTile = this.terrainTileForTile[tile.tileID.key];\n            context.activeTexture.set(gl.TEXTURE2);\n            const demTexture = this._prepareDemTileUniforms(tile, demTile, uniforms) ?\n                (demTile.demTexture: any) : this.emptyDEMTexture;\n            demTexture.bind(filteringForDemTile(demTile), gl.CLAMP_TO_EDGE);\n            setDemSizeUniform(demTexture);\n        }\n\n        context.activeTexture.set(gl.TEXTURE3);\n        if (options && options.useDepthForOcclusion) {\n            if (this._depthTexture) this._depthTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE);\n            if (this._depthFBO) uniforms['u_depth_size_inv'] = [1 / this._depthFBO.width, 1 / this._depthFBO.height];\n        } else {\n            this.emptyDepthBufferTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE);\n            uniforms['u_depth_size_inv'] = [1, 1];\n        }\n\n        if (options && options.useMeterToDem && demTile) {\n            const meterToDEM = (1 << demTile.tileID.canonical.z) * mercatorZfromAltitude(1, this.painter.transform.center.lat) * this.sourceCache.getSource().tileSize;\n            uniforms['u_meter_to_dem'] = meterToDEM;\n        }\n        if (options && options.labelPlaneMatrixInv) {\n            uniforms['u_label_plane_matrix_inv'] = options.labelPlaneMatrixInv;\n        }\n        program.setTerrainUniformValues(context, uniforms);\n\n        if (this.painter.transform.projection.name === 'globe') {\n            const globeUniforms = this.globeUniformValues(this.painter.transform, tile.tileID.canonical, options && options.useDenormalizedUpVectorScale);\n            program.setGlobeUniformValues(context, globeUniforms);\n        }\n    }\n\n    globeUniformValues(tr: Transform, id: CanonicalTileID, useDenormalizedUpVectorScale: ?boolean): UniformValues<GlobeUniformsType> {\n        const projection = tr.projection;\n        return {\n            'u_tile_tl_up': (projection.upVector(id, 0, 0): any),\n            'u_tile_tr_up': (projection.upVector(id, EXTENT, 0): any),\n            'u_tile_br_up': (projection.upVector(id, EXTENT, EXTENT): any),\n            'u_tile_bl_up': (projection.upVector(id, 0, EXTENT): any),\n            'u_tile_up_scale': (useDenormalizedUpVectorScale ? globeMetersToEcef(1) : projection.upVectorScale(id, tr.center.lat, tr.worldSize).metersToTile: any)\n        };\n    }\n\n    renderToBackBuffer(accumulatedDrapes: Array<OverscaledTileID>) {\n        const painter = this.painter;\n        const context = this.painter.context;\n\n        if (accumulatedDrapes.length === 0) {\n            return;\n        }\n\n        context.bindFramebuffer.set(null);\n        context.viewport.set([0, 0, painter.width, painter.height]);\n\n        painter.gpuTimingDeferredRenderStart();\n\n        this.renderingToTexture = false;\n        drawTerrainRaster(painter, this, this.proxySourceCache, accumulatedDrapes, this._updateTimestamp);\n        this.renderingToTexture = true;\n\n        painter.gpuTimingDeferredRenderEnd();\n\n        accumulatedDrapes.splice(0, accumulatedDrapes.length);\n    }\n\n    // For each proxy tile, render all layers until the non-draped layer (and\n    // render the tile to the screen) before advancing to the next proxy tile.\n    // Returns the last drawn index that is used as a start\n    // layer for interleaved draped rendering.\n    // Apart to layer-by-layer rendering used in 2D, here we have proxy-tile-by-proxy-tile\n    // rendering.\n    renderBatch(startLayerIndex: number): number {\n        if (this._drapedRenderBatches.length === 0) {\n            return startLayerIndex + 1;\n        }\n\n        this.renderingToTexture = true;\n        const painter = this.painter;\n        const context = this.painter.context;\n        const proxySourceCache = this.proxySourceCache;\n        const proxies = this.proxiedCoords[proxySourceCache.id];\n\n        // Consume batch of sequential drape layers and move next\n        const drapedLayerBatch = this._drapedRenderBatches.shift();\n        assert(drapedLayerBatch.start === startLayerIndex);\n\n        const layerIds = painter.style.order;\n\n        const accumulatedDrapes = [];\n\n        let poolIndex = 0;\n        for (const proxy of proxies) {\n            // bind framebuffer and assign texture to the tile (texture used in drawTerrainRaster).\n            const tile = proxySourceCache.getTileByID(proxy.proxyTileKey);\n            const renderCacheIndex = proxySourceCache.proxyCachedFBO[proxy.key] ? proxySourceCache.proxyCachedFBO[proxy.key][startLayerIndex] : undefined;\n            const fbo = renderCacheIndex !== undefined ? proxySourceCache.renderCache[renderCacheIndex] : this.pool[poolIndex++];\n            const useRenderCache = renderCacheIndex !== undefined;\n\n            tile.texture = fbo.tex;\n\n            if (useRenderCache && !fbo.dirty) {\n                // Use cached render from previous pass, no need to render again.\n                accumulatedDrapes.push(tile.tileID);\n                continue;\n            }\n\n            context.bindFramebuffer.set(fbo.fb.framebuffer);\n            this.renderedToTile = false; // reset flag.\n            if (fbo.dirty) {\n                // Clear on start.\n                context.clear({color: Color.transparent, stencil: 0});\n                fbo.dirty = false;\n            }\n\n            let currentStencilSource; // There is no need to setup stencil for the same source for consecutive layers.\n            for (let j = drapedLayerBatch.start; j <= drapedLayerBatch.end; ++j) {\n                const layer = painter.style._mergedLayers[layerIds[j]];\n                const hidden = layer.isHidden(painter.transform.zoom);\n                assert(this._style.isLayerDraped(layer) || hidden);\n                if (hidden) continue;\n\n                const sourceCache = painter.style.getLayerSourceCache(layer);\n                const proxiedCoords = sourceCache ? this.proxyToSource[proxy.key][sourceCache.id] : [proxy];\n                if (!proxiedCoords) continue; // when tile is not loaded yet for the source cache.\n\n                const coords = ((proxiedCoords: any): Array<OverscaledTileID>);\n                context.viewport.set([0, 0, fbo.fb.width, fbo.fb.height]);\n                if (currentStencilSource !== (sourceCache ? sourceCache.id : null)) {\n                    this._setupStencil(fbo, proxiedCoords, layer, sourceCache);\n                    currentStencilSource = sourceCache ? sourceCache.id : null;\n                }\n                painter.renderLayer(painter, sourceCache, layer, coords);\n            }\n\n            const isLastBatch = this._drapedRenderBatches.length === 0;\n            if (isLastBatch) {\n                for (const id of this._pendingGroundEffectLayers) {\n                    const layer = painter.style._mergedLayers[layerIds[id]];\n                    if (layer.isHidden(painter.transform.zoom)) continue;\n\n                    const sourceCache = painter.style.getLayerSourceCache(layer);\n                    const proxiedCoords = sourceCache ? this.proxyToSource[proxy.key][sourceCache.id] : [proxy];\n                    if (!proxiedCoords) continue;\n\n                    const coords = ((proxiedCoords: any): Array<OverscaledTileID>);\n                    context.viewport.set([0, 0, fbo.fb.width, fbo.fb.height]);\n                    if (currentStencilSource !== (sourceCache ? sourceCache.id : null)) {\n                        this._setupStencil(fbo, proxiedCoords, layer, sourceCache);\n                        currentStencilSource = sourceCache ? sourceCache.id : null;\n                    }\n                    painter.renderLayer(painter, sourceCache, layer, coords);\n                }\n            }\n\n            if (this.renderedToTile) {\n                fbo.dirty = true;\n                accumulatedDrapes.push(tile.tileID);\n            } else if (!useRenderCache) {\n                --poolIndex;\n                assert(poolIndex >= 0);\n            }\n            if (poolIndex === FBO_POOL_SIZE) {\n                poolIndex = 0;\n                this.renderToBackBuffer(accumulatedDrapes);\n            }\n        }\n\n        // Reset states and render last drapes\n        this.renderToBackBuffer(accumulatedDrapes);\n        this.renderingToTexture = false;\n\n        context.bindFramebuffer.set(null);\n        context.viewport.set([0, 0, painter.width, painter.height]);\n\n        return drapedLayerBatch.end + 1;\n    }\n\n    postRender() {\n        // Make sure we consumed all the draped terrain batches at this point\n        assert(this._drapedRenderBatches.length === 0);\n    }\n\n    isLayerOrderingCorrect(style: Style): boolean {\n        const layerCount = style.order.length;\n\n        let drapedMax = -1;\n        let immediateMin = layerCount;\n        for (let i = 0; i < layerCount; ++i) {\n            const layer = style._mergedLayers[style.order[i]];\n            if (this._style.isLayerDraped(layer)) {\n                drapedMax = Math.max(drapedMax, i);\n            } else {\n                immediateMin = Math.min(immediateMin, i);\n            }\n        }\n\n        return immediateMin > drapedMax;\n    }\n\n    getMinElevationBelowMSL(): number {\n        let min = 0.0;\n        // The maximum DEM error in meters to be conservative (SRTM).\n        const maxDEMError = 30.0;\n        this._visibleDemTiles.filter(tile => tile.dem).forEach(tile => {\n            const minMaxTree = (tile.dem: any).tree;\n            min = Math.min(min, minMaxTree.minimums[0]);\n        });\n        return min === 0.0 ? min : (min - maxDEMError) * this._exaggeration;\n    }\n\n    // Performs raycast against visible DEM tiles on the screen and returns the distance travelled along the ray.\n    // x & y components of the position are expected to be in normalized mercator coordinates [0, 1] and z in meters.\n    raycast(pos: Vec3, dir: Vec3, exaggeration: number): ?number {\n        if (!this._visibleDemTiles)\n            return null;\n\n        // Perform initial raycasts against root nodes of the available dem tiles\n        // and use this information to sort them from closest to furthest.\n        const preparedTiles = this._visibleDemTiles.filter(tile => tile.dem).map(tile => {\n            const id = tile.tileID;\n            const tiles = 1 << id.overscaledZ;\n            const {x, y} = id.canonical;\n\n            // Compute tile boundaries in mercator coordinates\n            const minx = x / tiles;\n            const maxx = (x + 1) / tiles;\n            const miny = y / tiles;\n            const maxy = (y + 1) / tiles;\n            const tree = (tile.dem: any).tree;\n\n            return {\n                minx, miny, maxx, maxy,\n                t: tree.raycastRoot(minx, miny, maxx, maxy, pos, dir, exaggeration),\n                tile\n            };\n        });\n\n        preparedTiles.sort((a, b) => {\n            const at = a.t !== null ? a.t : Number.MAX_VALUE;\n            const bt = b.t !== null ? b.t : Number.MAX_VALUE;\n            return at - bt;\n        });\n\n        for (const obj of preparedTiles) {\n            if (obj.t == null)\n                return null;\n\n            // Perform more accurate raycast against the dem tree. First intersection is the closest on\n            // as all tiles are sorted from closest to furthest\n            const tree = (obj.tile.dem: any).tree;\n            const t = tree.raycast(obj.minx, obj.miny, obj.maxx, obj.maxy, pos, dir, exaggeration);\n\n            if (t != null)\n                return t;\n        }\n\n        return null;\n    }\n\n    _createFBO(): FBO {\n        const painter = this.painter;\n        const context = painter.context;\n        const gl = context.gl;\n        const bufferSize = this.drapeBufferSize;\n        context.activeTexture.set(gl.TEXTURE0);\n        const tex = new Texture(context, {width: bufferSize[0], height: bufferSize[1], data: null}, gl.RGBA);\n        tex.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n        const fb = context.createFramebuffer(bufferSize[0], bufferSize[1], true, null);\n        fb.colorAttachment.set(tex.texture);\n        fb.depthAttachment = new DepthStencilAttachment(context, fb.framebuffer);\n\n        if (this._sharedDepthStencil === undefined) {\n            this._sharedDepthStencil = context.createRenderbuffer(context.gl.DEPTH_STENCIL, bufferSize[0], bufferSize[1]);\n            this._stencilRef = 0;\n            fb.depthAttachment.set(this._sharedDepthStencil);\n            context.clear({stencil: 0});\n        } else {\n            fb.depthAttachment.set(this._sharedDepthStencil);\n        }\n\n        if (context.extTextureFilterAnisotropic) {\n            gl.texParameterf(gl.TEXTURE_2D,\n                context.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT,\n                context.extTextureFilterAnisotropicMax);\n        }\n\n        return {fb, tex, dirty: false};\n    }\n\n    _initFBOPool() {\n        while (this.pool.length < Math.min(FBO_POOL_SIZE, this.proxyCoords.length)) {\n            this.pool.push(this._createFBO());\n        }\n    }\n\n    _shouldDisableRenderCache(): boolean {\n        if (this._debugParams.disableRenderCache) {\n            return true;\n        }\n\n        // Disable render caches on dynamic events due to fading or transitioning.\n        if (this._style.hasLightTransitions()) {\n            return true;\n        }\n\n        for (const id in this._style._mergedSourceCaches) {\n            if (this._style._mergedSourceCaches[id].hasTransition()) {\n                return true;\n            }\n        }\n\n        const isTransitioning = (id: string) => {\n            const layer = this._style._mergedLayers[id];\n            const isHidden = layer.isHidden(this.painter.transform.zoom);\n            if (layer.type === 'custom') {\n                return !isHidden && ((layer: any): CustomStyleLayer).shouldRedrape();\n            }\n            return !isHidden && layer.hasTransition();\n        };\n        return this._style.order.some(isTransitioning);\n    }\n\n    _clearLineLayersFromRenderCache() {\n        let hasVectorSource = false;\n        for (const source of this._style.getSources()) {\n            if (source instanceof VectorTileSource) {\n                hasVectorSource = true;\n                break;\n            }\n        }\n\n        if (!hasVectorSource) return;\n\n        const clearSourceCaches = {};\n        for (let i = 0; i < this._style.order.length; ++i) {\n            const layer = this._style._mergedLayers[this._style.order[i]];\n            const sourceCache = this._style.getLayerSourceCache(layer);\n            if (!sourceCache || clearSourceCaches[sourceCache.id]) continue;\n\n            const isHidden = layer.isHidden(this.painter.transform.zoom);\n            if (isHidden || layer.type !== 'line') continue;\n\n            // Check if layer has a zoom dependent \"line-width\" expression\n            const widthExpression = ((layer: any): LineStyleLayer).widthExpression();\n            if (!(widthExpression instanceof ZoomDependentExpression)) continue;\n\n            // Mark sourceCache as cleared\n            clearSourceCaches[sourceCache.id] = true;\n            for (const proxy of this.proxyCoords) {\n                const proxiedCoords = this.proxyToSource[proxy.key][sourceCache.id];\n                const coords = ((proxiedCoords: any): Array<OverscaledTileID>);\n                if (!coords) continue;\n\n                for (const coord of coords) {\n                    this._clearRenderCacheForTile(sourceCache.id, coord);\n                }\n            }\n        }\n    }\n\n    _clearRasterLayersFromRenderCache() {\n        let hasRasterSource = false;\n        for (const id in this._style._mergedSourceCaches) {\n            if (this._style._mergedSourceCaches[id]._source instanceof RasterTileSource) {\n                hasRasterSource = true;\n                break;\n            }\n        }\n\n        if (!hasRasterSource) return;\n\n        const clearSourceCaches = {};\n        for (let i = 0; i < this._style.order.length; ++i) {\n            const layer = this._style._mergedLayers[this._style.order[i]];\n            const sourceCache = this._style.getLayerSourceCache(layer);\n            if (!sourceCache || clearSourceCaches[sourceCache.id]) continue;\n\n            const isHidden = layer.isHidden(this.painter.transform.zoom);\n            if (isHidden || layer.type !== 'raster') continue;\n\n            // Check if any raster tile is in a fading state\n            const fadeDuration = ((layer: any): RasterStyleLayer).paint.get('raster-fade-duration');\n            for (const proxy of this.proxyCoords) {\n                const proxiedCoords = this.proxyToSource[proxy.key][sourceCache.id];\n                const coords = ((proxiedCoords: any): Array<OverscaledTileID>);\n                if (!coords) continue;\n\n                for (const coord of coords) {\n                    const tile = sourceCache.getTile(coord);\n                    const parent = sourceCache.findLoadedParent(coord, 0);\n                    const fade = rasterFade(tile, parent, sourceCache, this.painter.transform, fadeDuration);\n                    const isFading = fade.opacity !== 1 || fade.mix !== 0;\n                    if (isFading) {\n                        this._clearRenderCacheForTile(sourceCache.id, coord);\n                    }\n                }\n            }\n        }\n    }\n\n    _setupDrapedRenderBatches() {\n        const layerIds = this._style.order;\n        const layerCount = layerIds.length;\n        if (layerCount === 0) {\n            return;\n        }\n\n        const batches: Array<RenderBatch> = [];\n        this._pendingGroundEffectLayers = [];\n\n        let currentLayer = 0;\n        let layer = this._style._mergedLayers[layerIds[currentLayer]];\n        while (!this._style.isLayerDraped(layer) && layer.isHidden(this.painter.transform.zoom) && ++currentLayer < layerCount) {\n            layer = this._style._mergedLayers[layerIds[currentLayer]];\n        }\n\n        let batchStart: number | void;\n        for (; currentLayer < layerCount; ++currentLayer) {\n            const layer = this._style._mergedLayers[layerIds[currentLayer]];\n            if (layer.isHidden(this.painter.transform.zoom)) {\n                continue;\n            }\n            if (!this._style.isLayerDraped(layer)) {\n                if (layer.type === 'fill-extrusion') {\n                    this._pendingGroundEffectLayers.push(currentLayer);\n                }\n                if (batchStart !== undefined) {\n                    batches.push({start: batchStart, end: currentLayer - 1});\n                    batchStart = undefined;\n                }\n                continue;\n            }\n            if (batchStart === undefined) {\n                batchStart = currentLayer;\n            }\n        }\n\n        if (batchStart !== undefined) {\n            batches.push({start: batchStart, end: currentLayer - 1});\n        }\n\n        // Draped first approach should result in a single or no batch\n        assert(batches.length === 1 || batches.length === 0);\n\n        if (batches.length !== 0) {\n            const lastBatch = batches[batches.length - 1];\n            const groundEffectLayersComeLast = this._pendingGroundEffectLayers.every((id: number) => {\n                return id > lastBatch.end;\n            });\n            if (!groundEffectLayersComeLast) {\n                warnOnce('fill-extrusion with flood lighting and/or ground ambient occlusion should be moved to be on top of all draped layers.');\n            }\n        }\n\n        this._drapedRenderBatches = batches;\n    }\n\n    _setupRenderCache(previousProxyToSource: {[number]: {[string]: Array<ProxiedTileID>}}) {\n        const psc = this.proxySourceCache;\n        if (this._shouldDisableRenderCache() || this.invalidateRenderCache) {\n            this.invalidateRenderCache = false;\n            if (psc.renderCache.length > psc.renderCachePool.length) {\n                const used = ((Object.values(psc.proxyCachedFBO): any): Array<{[string | number]: number}>);\n                psc.proxyCachedFBO = {};\n                for (let i = 0; i < used.length; ++i) {\n                    const fbos = ((Object.values(used[i]): any): Array<number>);\n                    psc.renderCachePool.push(...fbos);\n                }\n                assert(psc.renderCache.length === psc.renderCachePool.length);\n            }\n            return;\n        }\n\n        this._clearRasterLayersFromRenderCache();\n\n        const coords = this.proxyCoords;\n        const dirty = this._tilesDirty;\n        for (let i = coords.length - 1; i >= 0; i--) {\n            const proxy = coords[i];\n            const tile = psc.getTileByID(proxy.key);\n\n            if (psc.proxyCachedFBO[proxy.key] !== undefined) {\n                assert(tile.texture);\n                const prev = previousProxyToSource[proxy.key];\n                assert(prev);\n                // Reuse previous render from cache if there was no change of\n                // content that was used to render proxy tile.\n                const current = this.proxyToSource[proxy.key];\n                let equal = 0;\n                for (const source in current) {\n                    const tiles = current[source];\n                    const prevTiles = prev[source];\n                    if (!prevTiles || prevTiles.length !== tiles.length ||\n                        tiles.some((t, index) =>\n                            (t !== prevTiles[index] ||\n                            (dirty[source] && dirty[source].hasOwnProperty(t.key)\n                            )))\n                    ) {\n                        equal = -1;\n                        break;\n                    }\n                    ++equal;\n                }\n                // dirty === false: doesn't need to be rendered to, just use cached render.\n                for (const proxyFBO in psc.proxyCachedFBO[proxy.key]) {\n                    psc.renderCache[psc.proxyCachedFBO[proxy.key][proxyFBO]].dirty = equal < 0 || equal !== Object.values(prev).length;\n                }\n            }\n        }\n\n        const sortedRenderBatches = [...this._drapedRenderBatches];\n        sortedRenderBatches.sort((batchA, batchB) => {\n            const batchASize = batchA.end - batchA.start;\n            const batchBSize = batchB.end - batchB.start;\n            return batchBSize - batchASize;\n        });\n\n        for (const batch of sortedRenderBatches) {\n            for (const id of coords) {\n                if (psc.proxyCachedFBO[id.key]) {\n                    continue;\n                }\n\n                // Assign renderCache FBO if there are available FBOs in pool.\n                let index = psc.renderCachePool.pop();\n                if (index === undefined && psc.renderCache.length < RENDER_CACHE_MAX_SIZE) {\n                    index = psc.renderCache.length;\n                    psc.renderCache.push(this._createFBO());\n                }\n                if (index !== undefined) {\n                    psc.proxyCachedFBO[id.key] = {};\n                    psc.proxyCachedFBO[id.key][batch.start] = index;\n                    psc.renderCache[index].dirty = true; // needs to be rendered to.\n                }\n            }\n        }\n        this._tilesDirty = {};\n    }\n\n    _setupStencil(fbo: FBO, proxiedCoords: Array<ProxiedTileID>, layer: StyleLayer, sourceCache?: SourceCache) {\n        if (!sourceCache || !this._sourceTilesOverlap[sourceCache.id]) {\n            if (this._overlapStencilType) this._overlapStencilType = false;\n            return;\n        }\n        const context = this.painter.context;\n        const gl = context.gl;\n\n        // If needed, setup stencilling. Don't bother to remove when there is no\n        // more need: in such case, if there is no overlap, stencilling is disabled.\n        if (proxiedCoords.length <= 1) { this._overlapStencilType = false; return; }\n\n        let stencilRange;\n        if (layer.isTileClipped()) {\n            stencilRange = proxiedCoords.length;\n            this._overlapStencilMode.test = {func: gl.EQUAL, mask: 0xFF};\n            this._overlapStencilType = 'Clip';\n        } else if (proxiedCoords[0].overscaledZ > proxiedCoords[proxiedCoords.length - 1].overscaledZ) {\n            stencilRange = 1;\n            this._overlapStencilMode.test = {func: gl.GREATER, mask: 0xFF};\n            this._overlapStencilType = 'Mask';\n        } else {\n            this._overlapStencilType = false;\n            return;\n        }\n        if (this._stencilRef + stencilRange > 255) {\n            context.clear({stencil: 0});\n            this._stencilRef = 0;\n        }\n        this._stencilRef += stencilRange;\n        this._overlapStencilMode.ref = this._stencilRef;\n        if (layer.isTileClipped()) {\n            this._renderTileClippingMasks(proxiedCoords, this._overlapStencilMode.ref);\n        }\n    }\n\n    clipOrMaskOverlapStencilType(): boolean {\n        return this._overlapStencilType === 'Clip' || this._overlapStencilType === 'Mask';\n    }\n\n    stencilModeForRTTOverlap(id: OverscaledTileID): $ReadOnly<StencilMode> {\n        if (!this.renderingToTexture || !this._overlapStencilType) {\n            return StencilMode.disabled;\n        }\n        // All source tiles contributing to the same proxy are processed in sequence, in zoom descending order.\n        // For raster / hillshade overlap masking, ref is based on zoom dif.\n        // For vector layer clipping, every tile gets dedicated stencil ref.\n        if (this._overlapStencilType === 'Clip') {\n            // In immediate 2D mode, we render rects to mark clipping area and handle behavior on tile borders.\n            // Here, there is no need for now for this:\n            // 1. overlap is handled by proxy render to texture tiles (there is no overlap there)\n            // 2. here we handle only brief zoom out semi-transparent color intensity flickering\n            //    and that is avoided fine by stenciling primitives as part of drawing (instead of additional tile quad step).\n            this._overlapStencilMode.ref = this.painter._tileClippingMaskIDs[id.key];\n        } // else this._overlapStencilMode.ref is set to a single value used per proxy tile, in _setupStencil.\n        return this._overlapStencilMode;\n    }\n\n    _renderTileClippingMasks(proxiedCoords: Array<ProxiedTileID>, ref: number) {\n        const painter = this.painter;\n        const context = this.painter.context;\n        const gl = context.gl;\n        painter._tileClippingMaskIDs = {};\n        context.setColorMode(ColorMode.disabled);\n        context.setDepthMode(DepthMode.disabled);\n\n        const program = painter.getOrCreateProgram('clippingMask');\n\n        for (const tileID of proxiedCoords) {\n            const id = painter._tileClippingMaskIDs[tileID.key] = --ref;\n            program.draw(painter, gl.TRIANGLES, DepthMode.disabled,\n                // Tests will always pass, and ref value will be written to stencil buffer.\n                new StencilMode({func: gl.ALWAYS, mask: 0}, id, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE),\n                ColorMode.disabled, CullFaceMode.disabled, clippingMaskUniformValues(tileID.projMatrix),\n                '$clipping', painter.tileExtentBuffer,\n                painter.quadTriangleIndexBuffer, painter.tileExtentSegments);\n        }\n    }\n\n    // Casts a ray from a point on screen and returns the intersection point with the terrain.\n    // The returned point contains the mercator coordinates in its first 3 components, and elevation\n    // in meter in its 4th coordinate.\n    pointCoordinate(screenPoint: Point): ?Vec4 {\n        const transform = this.painter.transform;\n        if (screenPoint.x < 0 || screenPoint.x > transform.width ||\n            screenPoint.y < 0 || screenPoint.y > transform.height) {\n            return null;\n        }\n\n        const far = [screenPoint.x, screenPoint.y, 1, 1];\n        vec4.transformMat4(far, far, transform.pixelMatrixInverse);\n        vec4.scale(far, far, 1.0 / far[3]);\n        // x & y in pixel coordinates, z is altitude in meters\n        far[0] /= transform.worldSize;\n        far[1] /= transform.worldSize;\n        const camera = transform._camera.position;\n        const mercatorZScale = mercatorZfromAltitude(1, transform.center.lat);\n        const p = [camera[0], camera[1], camera[2] / mercatorZScale, 0.0];\n        const dir = vec3.subtract([], far.slice(0, 3), p);\n        vec3.normalize(dir, dir);\n\n        const exaggeration = this._exaggeration;\n        const distanceAlongRay = this.raycast(p, dir, exaggeration);\n\n        if (distanceAlongRay === null || !distanceAlongRay) return null;\n        vec3.scaleAndAdd(p, p, dir, distanceAlongRay);\n        p[3] = p[2];\n        p[2] *= mercatorZScale;\n        return p;\n    }\n\n    drawDepth() {\n        const painter = this.painter;\n        const context = painter.context;\n        const psc = this.proxySourceCache;\n\n        const width = Math.ceil(painter.width), height = Math.ceil(painter.height);\n        if (this._depthFBO && (this._depthFBO.width !== width || this._depthFBO.height !== height)) {\n            this._depthFBO.destroy();\n            this._depthFBO = undefined;\n            this._depthTexture = undefined;\n        }\n        if (!this._depthFBO) {\n            const gl = context.gl;\n            const fbo = context.createFramebuffer(width, height, true, 'renderbuffer');\n            context.activeTexture.set(gl.TEXTURE0);\n            const texture = new Texture(context, {width, height, data: null}, gl.RGBA);\n            texture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE);\n            fbo.colorAttachment.set(texture.texture);\n            const renderbuffer = context.createRenderbuffer(context.gl.DEPTH_COMPONENT16, width, height);\n            fbo.depthAttachment.set(renderbuffer);\n            this._depthFBO = fbo;\n            this._depthTexture = texture;\n        }\n        context.bindFramebuffer.set(this._depthFBO.framebuffer);\n        context.viewport.set([0, 0, width, height]);\n\n        drawTerrainDepth(painter, this, psc, this.proxyCoords);\n    }\n\n    _setupProxiedCoordsForOrtho(sourceCache: SourceCache, sourceCoords: Array<OverscaledTileID>, previousProxyToSource: {[number]: {[string]: Array<ProxiedTileID>}}): void {\n        if (sourceCache.getSource() instanceof ImageSource) {\n            return this._setupProxiedCoordsForImageSource(sourceCache, sourceCoords, previousProxyToSource);\n        }\n        this._findCoveringTileCache[sourceCache.id] = this._findCoveringTileCache[sourceCache.id] || {};\n        const coords = this.proxiedCoords[sourceCache.id] = [];\n        const proxys = this.proxyCoords;\n        for (let i = 0; i < proxys.length; i++) {\n            const proxyTileID = proxys[i];\n            const proxied = this._findTileCoveringTileID(proxyTileID, sourceCache);\n            if (proxied) {\n                assert(proxied.hasData());\n                const id = this._createProxiedId(proxyTileID, proxied, previousProxyToSource[proxyTileID.key] && previousProxyToSource[proxyTileID.key][sourceCache.id]);\n                coords.push(id);\n                this.proxyToSource[proxyTileID.key][sourceCache.id] = [id];\n            }\n        }\n        let hasOverlap = false;\n        const proxiesToSort = new Set();\n        for (let i = 0; i < sourceCoords.length; i++) {\n            const tile = sourceCache.getTile(sourceCoords[i]);\n            if (!tile || !tile.hasData()) continue;\n            const proxy = this._findTileCoveringTileID(tile.tileID, this.proxySourceCache);\n            // Don't add the tile if already added in loop above.\n            if (proxy && proxy.tileID.canonical.z !== tile.tileID.canonical.z) {\n                const array = this.proxyToSource[proxy.tileID.key][sourceCache.id];\n                const id = this._createProxiedId(proxy.tileID, tile, previousProxyToSource[proxy.tileID.key] && previousProxyToSource[proxy.tileID.key][sourceCache.id]);\n                if (!array) {\n                    this.proxyToSource[proxy.tileID.key][sourceCache.id] = [id];\n                } else {\n                    array.splice(array.length - 1, 0, id);\n                }\n                const arr = this.proxyToSource[proxy.tileID.key][sourceCache.id];\n                if (!proxiesToSort.has(arr)) {\n                    proxiesToSort.add(arr);\n                }\n                coords.push(id);\n                hasOverlap = true;\n            }\n        }\n        this._sourceTilesOverlap[sourceCache.id] = hasOverlap;\n        if (hasOverlap && this._debugParams.sortTilesHiZFirst) {\n            for (const arr of proxiesToSort) {\n                arr.sort((a, b) => {\n                    return b.overscaledZ - a.overscaledZ;\n                });\n            }\n        }\n    }\n\n    _setupProxiedCoordsForImageSource(sourceCache: SourceCache, sourceCoords: Array<OverscaledTileID>, previousProxyToSource: {[number]: {[string]: Array<ProxiedTileID>}}) {\n        if (!sourceCache.getSource().loaded()) return;\n\n        const coords = this.proxiedCoords[sourceCache.id] = [];\n        const proxys = this.proxyCoords;\n        const imageSource: ImageSource = ((sourceCache.getSource(): any): ImageSource);\n        // Special case where image is rendered outside of the map's bounds (eg. pole caps)\n        const tileID = imageSource.tileID;\n        if (!tileID) return;\n\n        const anchor = new Point(tileID.x, tileID.y)._div(1 << tileID.z);\n        // $FlowFixMe[method-unbinding]\n        const aabb = imageSource.coordinates.map(MercatorCoordinate.fromLngLat).reduce((acc, coord) => {\n            acc.min.x = Math.min(acc.min.x, coord.x - anchor.x);\n            acc.min.y = Math.min(acc.min.y, coord.y - anchor.y);\n            acc.max.x = Math.max(acc.max.x, coord.x - anchor.x);\n            acc.max.y = Math.max(acc.max.y, coord.y - anchor.y);\n            return acc;\n        }, {min: new Point(Number.MAX_VALUE, Number.MAX_VALUE), max: new Point(-Number.MAX_VALUE, -Number.MAX_VALUE)});\n\n        // Fast conservative check using aabb: content outside proxy tile gets clipped out by on render, anyway.\n        const tileOutsideImage = (tileID: OverscaledTileID, imageTileID: OverscaledTileID) => {\n            const x = tileID.wrap + tileID.canonical.x / (1 << tileID.canonical.z);\n            const y = tileID.canonical.y / (1 << tileID.canonical.z);\n            const d = EXTENT / (1 << tileID.canonical.z);\n\n            const ix = imageTileID.wrap + imageTileID.canonical.x / (1 << imageTileID.canonical.z);\n            const iy = imageTileID.canonical.y / (1 << imageTileID.canonical.z);\n\n            return x + d < ix + aabb.min.x || x > ix + aabb.max.x || y + d < iy + aabb.min.y || y > iy + aabb.max.y;\n        };\n\n        for (let i = 0; i < proxys.length; i++) {\n            const proxyTileID = proxys[i];\n            for (let j = 0; j < sourceCoords.length; j++) {\n                const tile = sourceCache.getTile(sourceCoords[j]);\n                if (!tile || !tile.hasData()) continue;\n\n                // Setup proxied -> proxy mapping only if image on given tile wrap intersects the proxy tile.\n                if (tileOutsideImage(proxyTileID, tile.tileID)) continue;\n\n                const id = this._createProxiedId(proxyTileID, tile, previousProxyToSource[proxyTileID.key] && previousProxyToSource[proxyTileID.key][sourceCache.id]);\n                const array = this.proxyToSource[proxyTileID.key][sourceCache.id];\n                if (!array) {\n                    this.proxyToSource[proxyTileID.key][sourceCache.id] = [id];\n                } else {\n                    array.push(id);\n                }\n                coords.push(id);\n            }\n        }\n    }\n\n    // recycle is previous pass content that likely contains proxied ID combining proxy and source tile.\n    _createProxiedId(proxyTileID: OverscaledTileID, tile: Tile, recycle: Array<ProxiedTileID>): ProxiedTileID {\n        let matrix = this.orthoMatrix;\n        if (recycle) {\n            const recycled = recycle.find(proxied => (proxied.key === tile.tileID.key));\n            if (recycled) return recycled;\n        }\n        if (tile.tileID.key !== proxyTileID.key) {\n            const scale = proxyTileID.canonical.z - tile.tileID.canonical.z;\n            matrix = mat4.create();\n            let size, xOffset, yOffset;\n            const wrap = (tile.tileID.wrap - proxyTileID.wrap) << proxyTileID.overscaledZ;\n            if (scale > 0) {\n                size = EXTENT >> scale;\n                xOffset = size * ((tile.tileID.canonical.x << scale) - proxyTileID.canonical.x + wrap);\n                yOffset = size * ((tile.tileID.canonical.y << scale) - proxyTileID.canonical.y);\n            } else {\n                size = EXTENT << -scale;\n                xOffset = EXTENT * (tile.tileID.canonical.x - ((proxyTileID.canonical.x + wrap) << -scale));\n                yOffset = EXTENT * (tile.tileID.canonical.y - (proxyTileID.canonical.y << -scale));\n            }\n            mat4.ortho(matrix, 0, size, 0, size, 0, 1);\n            mat4.translate(matrix, matrix, [xOffset, yOffset, 0]);\n        }\n        return new ProxiedTileID(tile.tileID, proxyTileID.key, matrix);\n    }\n\n    // A variant of SourceCache.findLoadedParent that considers only visible\n    // tiles (and doesn't check SourceCache._cache). Another difference is in\n    // caching \"not found\" results along the lookup, to leave the lookup early.\n    // Not found is cached by this._findCoveringTileCache[key] = null;\n    _findTileCoveringTileID(tileID: OverscaledTileID, sourceCache: SourceCache): ?Tile {\n        let tile: ?Tile = sourceCache.getTile(tileID);\n        if (tile && tile.hasData()) return tile;\n\n        const lookup = this._findCoveringTileCache[sourceCache.id];\n        const key = lookup[tileID.key];\n        tile = key ? sourceCache.getTileByID(key) : null;\n        if ((tile && tile.hasData()) || key === null) return tile;\n\n        assert(!key || tile);\n\n        let sourceTileID = tile ? tile.tileID : tileID;\n        let z = sourceTileID.overscaledZ;\n        const minzoom = sourceCache.getSource().minzoom;\n        const path = [];\n        if (!key) {\n            const maxzoom = sourceCache.getSource().maxzoom;\n            if (tileID.canonical.z >= maxzoom) {\n                const downscale = tileID.canonical.z - maxzoom;\n                if (sourceCache.getSource().reparseOverscaled) {\n                    z = Math.max(tileID.canonical.z + 2, sourceCache.transform.tileZoom);\n                    sourceTileID = new OverscaledTileID(z, tileID.wrap, maxzoom,\n                        tileID.canonical.x >> downscale, tileID.canonical.y >> downscale);\n                } else if (downscale !== 0) {\n                    z = maxzoom;\n                    sourceTileID = new OverscaledTileID(z, tileID.wrap, maxzoom,\n                        tileID.canonical.x >> downscale, tileID.canonical.y >> downscale);\n                }\n            }\n            if (sourceTileID.key !== tileID.key) {\n                path.push(sourceTileID.key);\n                tile = sourceCache.getTile(sourceTileID);\n            }\n        }\n\n        const pathToLookup = (key: ?number) => {\n            path.forEach(id => { lookup[id] = key; });\n            path.length = 0;\n        };\n\n        for (z = z - 1; z >= minzoom && !(tile && tile.hasData()); z--) {\n            if (tile) {\n                pathToLookup(tile.tileID.key); // Store lookup to parents not loaded (yet).\n            }\n            const id = sourceTileID.calculateScaledKey(z);\n            tile = sourceCache.getTileByID(id);\n            if (tile && tile.hasData()) break;\n            const key = lookup[id];\n            if (key === null) {\n                break; // There's no tile loaded and no point searching further.\n            } else if (key !== undefined) {\n                tile = sourceCache.getTileByID(key);\n                assert(tile);\n                continue;\n            }\n            path.push(id);\n        }\n\n        pathToLookup(tile ? tile.tileID.key : null);\n        return tile && tile.hasData() ? tile : null;\n    }\n\n    findDEMTileFor(tileID: OverscaledTileID): ?Tile {\n        return this.enabled ? this._findTileCoveringTileID(tileID, this.sourceCache) : null;\n    }\n\n    /*\n     * Bookkeeping if something gets rendered to the tile.\n     */\n    prepareDrawTile() {\n        this.renderedToTile = true;\n    }\n\n    _clearRenderCacheForTile(sourceCacheFQID: string, coord: OverscaledTileID) {\n        let sourceTiles = this._tilesDirty[sourceCacheFQID];\n        if (!sourceTiles) sourceTiles = this._tilesDirty[sourceCacheFQID] = {};\n        sourceTiles[coord.key] = true;\n    }\n}\n\nfunction sortByDistanceToCamera(tileIDs: Array<OverscaledTileID>, painter: Painter) {\n    const cameraCoordinate = painter.transform.pointCoordinate(painter.transform.getCameraPoint());\n    const cameraPoint = new Point(cameraCoordinate.x, cameraCoordinate.y);\n    tileIDs.sort((a, b) => {\n        if (b.overscaledZ - a.overscaledZ) return b.overscaledZ - a.overscaledZ;\n        const aPoint = new Point(a.canonical.x + (1 << a.canonical.z) * a.wrap, a.canonical.y);\n        const bPoint = new Point(b.canonical.x + (1 << b.canonical.z) * b.wrap, b.canonical.y);\n        const cameraScaled = cameraPoint.mult(1 << a.canonical.z);\n        cameraScaled.x -= 0.5;\n        cameraScaled.y -= 0.5;\n        return cameraScaled.distSqr(aPoint) - cameraScaled.distSqr(bPoint);\n    });\n}\n\n/**\n * Creates uniform grid of triangles, covering EXTENT x EXTENT square, with two\n * adjustent traigles forming a quad, so that there are |count| columns and rows\n * of these quads in EXTENT x EXTENT square.\n * e.g. for count of 2:\n *  -------------\n *  |    /|    /|\n *  |  /  |  /  |\n *  |/    |/    |\n *  -------------\n *  |    /|    /|\n *  |  /  |  /  |\n *  |/    |/    |\n *  -------------\n * @param {number} count Count of rows and columns\n * @private\n */\nfunction createGrid(count: number): [PosArray, TriangleIndexArray, number] {\n    const boundsArray = new PosArray();\n    // Around the grid, add one more row/column padding for \"skirt\".\n    const indexArray = new TriangleIndexArray();\n    const size = count + 2;\n    boundsArray.reserve(size * size);\n    indexArray.reserve((size - 1) * (size - 1) * 2);\n    const step = EXTENT / (count - 1);\n    const gridBound = EXTENT + step / 2;\n    const bound = gridBound + step;\n\n    // Skirt offset of 0x5FFF is chosen randomly to encode boolean value (skirt\n    // on/off) with x position (max value EXTENT = 4096) to 16-bit signed integer.\n    const skirtOffset = 24575; // 0x5FFF\n    for (let y = -step; y < bound; y += step) {\n        for (let x = -step; x < bound; x += step) {\n            const offset = (x < 0 || x > gridBound || y < 0 || y > gridBound) ? skirtOffset : 0;\n            const xi = clamp(Math.round(x), 0, EXTENT);\n            const yi = clamp(Math.round(y), 0, EXTENT);\n            boundsArray.emplaceBack(xi + offset, yi);\n        }\n    }\n\n    // For cases when there's no need to render \"skirt\", the \"inner\" grid indices\n    // are followed by skirt indices.\n    const skirtIndicesOffset = (size - 3) * (size - 3) * 2;\n    const quad = (i: number, j: number) => {\n        const index = j * size + i;\n        indexArray.emplaceBack(index + 1, index, index + size);\n        indexArray.emplaceBack(index + size, index + size + 1, index + 1);\n    };\n    for (let j = 1; j < size - 2; j++) {\n        for (let i = 1; i < size - 2; i++) {\n            quad(i, j);\n        }\n    }\n    // Padding (skirt) indices:\n    [0, size - 2].forEach(j => {\n        for (let i = 0; i < size - 1; i++) {\n            quad(i, j);\n            quad(j, i);\n        }\n    });\n    return [boundsArray, indexArray, skirtIndicesOffset];\n}\n\nexport type TerrainUniformsType = {|\n    'u_dem': Uniform1i,\n    'u_dem_prev': Uniform1i,\n    'u_dem_tl': Uniform2f,\n    'u_dem_scale': Uniform1f,\n    'u_dem_tl_prev': Uniform2f,\n    'u_dem_scale_prev': Uniform1f,\n    'u_dem_size': Uniform1f,\n    'u_dem_lerp': Uniform1f,\n    \"u_exaggeration\": Uniform1f,\n    'u_depth': Uniform1i,\n    'u_depth_size_inv': Uniform2f,\n    'u_meter_to_dem'?: Uniform1f,\n    'u_label_plane_matrix_inv'?: UniformMatrix4f,\n|};\n\nexport const terrainUniforms = (context: Context): TerrainUniformsType => ({\n    'u_dem': new Uniform1i(context),\n    'u_dem_prev': new Uniform1i(context),\n    'u_dem_tl': new Uniform2f(context),\n    'u_dem_scale': new Uniform1f(context),\n    'u_dem_tl_prev': new Uniform2f(context),\n    'u_dem_scale_prev': new Uniform1f(context),\n    'u_dem_size': new Uniform1f(context),\n    'u_dem_lerp': new Uniform1f(context),\n    'u_exaggeration': new Uniform1f(context),\n    'u_depth': new Uniform1i(context),\n    'u_depth_size_inv': new Uniform2f(context),\n    'u_meter_to_dem': new Uniform1f(context),\n    'u_label_plane_matrix_inv': new UniformMatrix4f(context),\n});\n\nfunction defaultTerrainUniforms(): UniformValues<TerrainUniformsType> {\n    return {\n        'u_dem': 2,\n        'u_dem_prev': 4,\n        'u_dem_tl': [0, 0],\n        'u_dem_tl_prev': [0, 0],\n        'u_dem_scale': 0,\n        'u_dem_scale_prev': 0,\n        'u_dem_size': 0,\n        'u_dem_lerp': 1.0,\n        'u_depth': 3,\n        'u_depth_size_inv': [0, 0],\n        'u_exaggeration': 0,\n    };\n}\n\nexport type GlobeUniformsType = {|\n    'u_tile_tl_up': Uniform3f,\n    'u_tile_tr_up': Uniform3f,\n    'u_tile_br_up': Uniform3f,\n    'u_tile_bl_up': Uniform3f,\n    'u_tile_up_scale': Uniform1f\n|};\n\nexport const globeUniforms = (context: Context): GlobeUniformsType => ({\n    'u_tile_tl_up': new Uniform3f(context),\n    'u_tile_tr_up': new Uniform3f(context),\n    'u_tile_br_up': new Uniform3f(context),\n    'u_tile_bl_up': new Uniform3f(context),\n    'u_tile_up_scale': new Uniform1f(context)\n});\n","// @flow\n\nimport Context from '../../src/gl/context.js';\nimport {Uniform3f} from '../../src/render/uniform_binding.js';\nimport {sRGBToLinearAndScale, linearVec3TosRGB, clamp} from '../../src/util/util.js';\nimport {vec3} from 'gl-matrix';\n\nimport Lights from '../style/lights.js';\nimport type {UniformValues} from '../../src/render/uniform_binding.js';\nimport type {LightProps as Ambient} from '../style/ambient_light_properties.js';\nimport type {LightProps as Directional} from '../style/directional_light_properties.js';\nimport type {Vec3} from 'gl-matrix';\n\nexport type LightsUniformsType = {|\n    'u_lighting_ambient_color': Uniform3f,\n    'u_lighting_directional_dir': Uniform3f,\n    'u_lighting_directional_color': Uniform3f,\n    'u_ground_radiance': Uniform3f\n|};\n\nexport const lightsUniforms = (context: Context): LightsUniformsType => ({\n    'u_lighting_ambient_color': new Uniform3f(context),\n    'u_lighting_directional_dir': new Uniform3f(context),\n    'u_lighting_directional_color': new Uniform3f(context),\n    'u_ground_radiance': new Uniform3f(context)\n});\n\nfunction calculateAmbientDirectionalFactor(dir: Vec3, normal: Vec3, dirColor: Vec3): number {\n    // NdotL Used only for ambient directionality\n    const NdotL  = vec3.dot(normal, dir);\n\n    // Emulate sky being brighter close to the main light source\n\n    const factorReductionMax = 0.3;\n    const dirLuminance = vec3.dot(dirColor, [0.2126, 0.7152, 0.0722]);\n    const directionalFactorMin = 1.0 - factorReductionMax * Math.min(dirLuminance, 1.0);\n\n    const lerp = (a: number, b: number, t: number) => { return (1 - t) * a + t * b; };\n\n    // If dirColor is (1, 1, 1), then the return value range is\n    // NdotL=-1: 1.0 - factorReductionMax\n    // NdotL>=0: 1.0\n    const ambientDirectionalFactor = lerp(directionalFactorMin, 1.0, Math.min((NdotL + 1.0), 1.0));\n\n    // Emulate environmental light being blocked by other objects\n\n    // Value moves from vertical_factor_min at z=-1 to 1.0 at z=1\n    const verticalFactorMin = 0.92;\n    // clamp(z, -1.0, 1.0) is required because z can be very slightly out of the acceptable input\n    // range for asin, even when it has been normalized, due to limited floating point precision.\n    const verticalFactor = lerp(verticalFactorMin, 1.0, Math.asin(clamp(normal[2], -1.0, 1.0)) / Math.PI + 0.5);\n\n    return verticalFactor * ambientDirectionalFactor;\n}\n\nfunction calculateGroundRadiance(dir: Vec3, dirColor: Vec3, ambientColor: Vec3): [number, number, number] {\n    const groundNormal = [0.0, 0.0, 1.0];\n    const ambientDirectionalFactor = calculateAmbientDirectionalFactor(dir, groundNormal, dirColor);\n\n    const ambientContrib = [0, 0, 0];\n    vec3.scale(ambientContrib, ambientColor.slice(0, 3), ambientDirectionalFactor);\n    const dirConrib = [0, 0, 0];\n    vec3.scale(dirConrib, dirColor.slice(0, 3), dir[2]);\n\n    const radiance = [0, 0, 0];\n    vec3.add(radiance, ambientContrib, dirConrib);\n\n    return linearVec3TosRGB(radiance);\n}\n\nexport const lightsUniformValues = (\n    directional: Lights<Directional>,\n    ambient: Lights<Ambient>\n): UniformValues<LightsUniformsType> => {\n    const direction = directional.properties.get('direction');\n\n    const directionalColor = directional.properties.get('color').toArray01();\n    const directionalIntensity = directional.properties.get('intensity');\n    const ambientColor = ambient.properties.get('color').toArray01();\n    const ambientIntensity = ambient.properties.get('intensity');\n\n    const dirVec = [direction.x, direction.y, direction.z];\n    const ambientColorLinear = sRGBToLinearAndScale(ambientColor, ambientIntensity);\n    const directionalColorLinear = sRGBToLinearAndScale(directionalColor, directionalIntensity);\n    const groundRadianceSrgb = calculateGroundRadiance((dirVec: any), (directionalColorLinear: any), (ambientColorLinear: any));\n    return {\n        'u_lighting_ambient_color': ambientColorLinear,\n        'u_lighting_directional_dir': dirVec,\n        'u_lighting_directional_color': directionalColorLinear,\n        'u_ground_radiance': groundRadianceSrgb\n    };\n};\n","// @flow\n\nimport {\n    prelude,\n    preludeFragPrecisionQualifiers,\n    preludeVertPrecisionQualifiers,\n    preludeCommonSource,\n    includeMap\n} from '../shaders/shaders.js';\nimport assert from 'assert';\nimport ProgramConfiguration from '../data/program_configuration.js';\nimport VertexArrayObject from './vertex_array_object.js';\nimport Context from '../gl/context.js';\nimport {terrainUniforms, globeUniforms} from '../terrain/terrain.js';\nimport type {TerrainUniformsType, GlobeUniformsType} from '../terrain/terrain.js';\nimport {fogUniforms} from './fog.js';\nimport type {FogUniformsType} from './fog.js';\nimport {cutoffUniforms} from './cutoff.js';\nimport type {CutoffUniformsType} from './cutoff.js';\nimport {lightsUniforms} from '../../3d-style/render/lights.js';\nimport type {LightsUniformsType} from '../../3d-style/render/lights.js';\nimport {shadowUniforms} from '../../3d-style/render/shadow_uniforms.js';\nimport type {ShadowUniformsType} from '../../3d-style/render/shadow_uniforms.js';\n\nimport type SegmentVector from '../data/segment.js';\nimport type VertexBuffer from '../gl/vertex_buffer.js';\nimport IndexBuffer from '../gl/index_buffer.js';\nimport DepthMode from '../gl/depth_mode.js';\nimport StencilMode from '../gl/stencil_mode.js';\nimport ColorMode from '../gl/color_mode.js';\nimport type CullFaceMode from '../gl/cull_face_mode.js';\nimport type {UniformBindings, UniformValues} from './uniform_binding.js';\nimport type {BinderUniform} from '../data/program_configuration.js';\nimport type Painter from './painter.js';\nimport type {Segment} from \"../data/segment\";\nimport Color from '../style-spec/util/color.js';\n\nexport type DrawMode =\n    | $PropertyType<WebGL2RenderingContext, 'POINTS'>\n    | $PropertyType<WebGL2RenderingContext, 'LINES'>\n    | $PropertyType<WebGL2RenderingContext, 'TRIANGLES'>\n    | $PropertyType<WebGL2RenderingContext, 'LINE_STRIP'>;\n\ntype ShaderSource = {\n    fragmentSource: string,\n    vertexSource: string,\n    staticAttributes: Array<string>,\n    usedDefines: Array<string>,\n    vertexIncludes: Array<string>,\n    fragmentIncludes: Array<string>\n};\n\nconst debugWireframe2DLayerProgramNames = [\n    'fill', 'fillOutline', 'fillPattern',\n    'line', 'linePattern',\n    'background', 'backgroundPattern',\n    \"hillshade\",\n    \"raster\"];\n\nconst debugWireframe3DLayerProgramNames = [\n    \"stars\",\n    \"fillExtrusion\",  \"fillExtrusionGroundEffect\",\n    \"model\",\n    \"symbolSDF\", \"symbolIcon\", \"symbolTextAndIcon\"];\n\nclass Program<Us: UniformBindings> {\n    program: WebGLProgram;\n    attributes: {[_: string]: number};\n    numAttributes: number;\n    fixedUniforms: Us;\n    binderUniforms: Array<BinderUniform>;\n    failedToCreate: boolean;\n    terrainUniforms: ?TerrainUniformsType;\n    fogUniforms: ?FogUniformsType;\n    cutoffUniforms: ?CutoffUniformsType;\n    lightsUniforms: ?LightsUniformsType;\n    globeUniforms: ?GlobeUniformsType;\n    shadowUniforms: ?ShadowUniformsType;\n\n    name: string;\n    configuration: ?ProgramConfiguration;\n    fixedDefines: string[];\n\n    static cacheKey(source: ShaderSource, name: string, defines: string[], programConfiguration: ?ProgramConfiguration): string {\n        let key = `${name}${programConfiguration ? programConfiguration.cacheKey : ''}`;\n        for (const define of defines) {\n            if (source.usedDefines.includes(define)) {\n                key += `/${define}`;\n            }\n        }\n        return key;\n    }\n\n    constructor(context: Context,\n                name: string,\n                source: ShaderSource,\n                configuration: ?ProgramConfiguration,\n                fixedUniforms: (Context) => Us,\n                fixedDefines: string[]) {\n        const gl = context.gl;\n        this.program = ((gl.createProgram(): any): WebGLProgram);\n\n        this.configuration = configuration;\n        this.name = name;\n        this.fixedDefines = [...fixedDefines];\n\n        const dynamicAttrInfo = configuration ? configuration.getBinderAttributes() : [];\n        const allAttrInfo = (source.staticAttributes || []).concat(dynamicAttrInfo);\n\n        let defines = configuration ? configuration.defines() : [];\n        defines = defines.concat(fixedDefines.map((define) => `#define ${define}`));\n        const version = '#version 300 es\\n';\n\n        let fragmentSource = version + defines.concat(\n            preludeFragPrecisionQualifiers,\n            preludeCommonSource,\n            prelude.fragmentSource).join('\\n');\n        for (const include of source.fragmentIncludes) {\n            fragmentSource += `\\n${includeMap[include]}`;\n        }\n        fragmentSource += `\\n${source.fragmentSource}`;\n\n        let vertexSource = version + defines.concat(\n            preludeVertPrecisionQualifiers,\n            preludeCommonSource,\n            prelude.vertexSource).join('\\n');\n        for (const include of source.vertexIncludes) {\n            vertexSource += `\\n${includeMap[include]}`;\n        }\n        vertexSource += `\\n${source.vertexSource}`;\n\n        const fragmentShader = ((gl.createShader(gl.FRAGMENT_SHADER): any): WebGLShader);\n        if (gl.isContextLost()) {\n            this.failedToCreate = true;\n            return;\n        }\n        gl.shaderSource(fragmentShader, fragmentSource);\n        gl.compileShader(fragmentShader);\n        assert(gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS), (gl.getShaderInfoLog(fragmentShader): any));\n        gl.attachShader(this.program, fragmentShader);\n\n        const vertexShader = ((gl.createShader(gl.VERTEX_SHADER): any): WebGLShader);\n        if (gl.isContextLost()) {\n            this.failedToCreate = true;\n            return;\n        }\n        gl.shaderSource(vertexShader, vertexSource);\n        gl.compileShader(vertexShader);\n        assert(gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS), (gl.getShaderInfoLog(vertexShader): any));\n        gl.attachShader(this.program, vertexShader);\n\n        this.attributes = {};\n\n        this.numAttributes = allAttrInfo.length;\n\n        for (let i = 0; i < this.numAttributes; i++) {\n            if (allAttrInfo[i]) {\n                // Handle pragma defined attributes\n                const attributeName = allAttrInfo[i].startsWith('a_') ? allAttrInfo[i] : `a_${allAttrInfo[i]}`;\n                gl.bindAttribLocation(this.program, i, attributeName);\n                this.attributes[attributeName] = i;\n            }\n        }\n\n        gl.linkProgram(this.program);\n        assert(gl.getProgramParameter(this.program, gl.LINK_STATUS), (gl.getProgramInfoLog(this.program): any));\n\n        gl.deleteShader(vertexShader);\n        gl.deleteShader(fragmentShader);\n\n        this.fixedUniforms = fixedUniforms(context);\n        this.binderUniforms = configuration ? configuration.getUniforms(context) : [];\n        if (fixedDefines.includes('TERRAIN')) {\n            this.terrainUniforms = terrainUniforms(context);\n        }\n        if (fixedDefines.includes('GLOBE')) {\n            this.globeUniforms = globeUniforms(context);\n        }\n        if (fixedDefines.includes('FOG')) {\n            this.fogUniforms = fogUniforms(context);\n        }\n        if (fixedDefines.includes('RENDER_CUTOFF')) {\n            this.cutoffUniforms = cutoffUniforms(context);\n        }\n        if (fixedDefines.includes('LIGHTING_3D_MODE')) {\n            this.lightsUniforms = lightsUniforms(context);\n        }\n        if (fixedDefines.includes('RENDER_SHADOWS')) {\n            this.shadowUniforms = shadowUniforms(context);\n        }\n    }\n\n    setTerrainUniformValues(context: Context, terrainUniformValues: UniformValues<TerrainUniformsType>) {\n        if (!this.terrainUniforms) return;\n        const uniforms: TerrainUniformsType = this.terrainUniforms;\n\n        if (this.failedToCreate) return;\n        context.program.set(this.program);\n\n        for (const name in terrainUniformValues) {\n            if (uniforms[name]) {\n                uniforms[name].set(this.program, name, terrainUniformValues[name]);\n            }\n        }\n    }\n\n    setGlobeUniformValues(context: Context, globeUniformValues: UniformValues<GlobeUniformsType>) {\n        if (!this.globeUniforms) return;\n        const uniforms: GlobeUniformsType = this.globeUniforms;\n\n        if (this.failedToCreate) return;\n        context.program.set(this.program);\n\n        for (const name in globeUniformValues) {\n            if (uniforms[name]) {\n                uniforms[name].set(this.program, name, globeUniformValues[name]);\n            }\n        }\n    }\n\n    setFogUniformValues(context: Context, fogUniformValues: UniformValues<FogUniformsType>) {\n        if (!this.fogUniforms) return;\n        const uniforms: FogUniformsType = this.fogUniforms;\n\n        if (this.failedToCreate) return;\n        context.program.set(this.program);\n\n        for (const name in fogUniformValues) {\n            uniforms[name].set(this.program, name, fogUniformValues[name]);\n        }\n    }\n\n    setCutoffUniformValues(context: Context, cutoffUniformValues: UniformValues<CutoffUniformsType>) {\n        if (!this.cutoffUniforms) return;\n        const uniforms: CutoffUniformsType = this.cutoffUniforms;\n\n        if (this.failedToCreate) return;\n        context.program.set(this.program);\n\n        for (const name in cutoffUniformValues) {\n            uniforms[name].set(this.program, name, cutoffUniformValues[name]);\n        }\n    }\n\n    setLightsUniformValues(context: Context, lightsUniformValues: UniformValues<LightsUniformsType>) {\n        if (!this.lightsUniforms) return;\n        const uniforms: LightsUniformsType = this.lightsUniforms;\n\n        if (this.failedToCreate) return;\n        context.program.set(this.program);\n\n        for (const name in lightsUniformValues) {\n            uniforms[name].set(this.program, name, lightsUniformValues[name]);\n        }\n    }\n\n    setShadowUniformValues(context: Context, shadowUniformValues: UniformValues<ShadowUniformsType>) {\n        if (this.failedToCreate || !this.shadowUniforms) return;\n\n        const uniforms: ShadowUniformsType = this.shadowUniforms;\n        context.program.set(this.program);\n\n        for (const name in shadowUniformValues) {\n            uniforms[name].set(this.program, name, shadowUniformValues[name]);\n        }\n    }\n\n    _drawDebugWireframe(painter: Painter, depthMode: $ReadOnly<DepthMode>,\n        stencilMode: $ReadOnly<StencilMode>,\n        colorMode: $ReadOnly<ColorMode>,\n        indexBuffer: IndexBuffer, segment: Segment,\n        currentProperties: any, zoom: ?number, configuration: ?ProgramConfiguration, instanceCount: ?number) {\n\n        const wireframe = painter.options.wireframe;\n\n        if (wireframe.terrain === false && wireframe.layers2D === false && wireframe.layers3D === false) {\n            return;\n        }\n\n        const context = painter.context;\n\n        const subjectForWireframe = (() => {\n            // Terrain\n            if (wireframe.terrain && (this.name === 'terrainRaster' || this.name === 'globeRaster')) {\n                return true;\n            }\n\n            const drapingInProgress = painter._terrain && painter._terrain.renderingToTexture;\n\n            // 2D\n            if (wireframe.layers2D && !drapingInProgress) {\n                if (debugWireframe2DLayerProgramNames.includes(this.name)) {\n                    return true;\n                }\n            }\n\n            // 3D\n            if (wireframe.layers3D) {\n                if (debugWireframe3DLayerProgramNames.includes(this.name)) {\n                    return true;\n                }\n            }\n\n            return false;\n        })();\n\n        if (!subjectForWireframe) {\n            return;\n        }\n\n        const gl = context.gl;\n        const linesIndexBuffer = painter.wireframeDebugCache.getLinesFromTrianglesBuffer(painter.frameCounter, indexBuffer, context);\n\n        if (!linesIndexBuffer) {\n            return;\n        }\n\n        const debugDefines = [...this.fixedDefines];\n        debugDefines.push(\"DEBUG_WIREFRAME\");\n        // $FlowIgnore[incompatible-call] defines are saved as string whereas getOrCreateProgram has restrictions\n        const debugProgram = painter.getOrCreateProgram(this.name, {config: this.configuration, defines: debugDefines});\n\n        context.program.set(debugProgram.program);\n\n        const copyUniformValues = (group: string, pSrc: any, pDst: any) => {\n            if (pSrc[group] && pDst[group]) {\n                for (const name in pSrc[group]) {\n                    if (pDst[group][name]) {\n                        pDst[group][name].set(pDst.program, name, pSrc[group][name].current);\n                    }\n                }\n            }\n        };\n\n        if (configuration) {\n            configuration.setUniforms(debugProgram.program, context, debugProgram.binderUniforms, currentProperties, {zoom: (zoom: any)});\n        }\n\n        copyUniformValues(\"fixedUniforms\", this, debugProgram);\n        copyUniformValues(\"terrainUniforms\", this, debugProgram);\n        copyUniformValues(\"globeUniforms\", this, debugProgram);\n        copyUniformValues(\"fogUniforms\", this, debugProgram);\n        copyUniformValues(\"lightsUniforms\", this, debugProgram);\n        copyUniformValues(\"shadowUniforms\", this, debugProgram);\n\n        linesIndexBuffer.bind();\n\n        // Debug wireframe uses premultiplied alpha blending (alpha channel is left unchanged)\n        context.setColorMode(new ColorMode([gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ZERO, gl.ONE],\n            Color.transparent, [true, true, true, false]));\n        context.setDepthMode(new DepthMode(depthMode.func === gl.LESS ? gl.LEQUAL : depthMode.func, DepthMode.ReadOnly, depthMode.range));\n        context.setStencilMode(StencilMode.disabled);\n\n        const count = segment.primitiveLength * 3 * 2; // One triangle corresponds to 3 lines (each has 2 indices)\n        const offset = segment.primitiveOffset * 3 * 2 * 2; // One triangles corresponds to 3 lines (2 indices * 2 bytes per index)\n\n        if (instanceCount && instanceCount > 1) {\n            gl.drawElementsInstanced(\n                gl.LINES,\n                count,\n                gl.UNSIGNED_SHORT,\n                offset,\n                instanceCount);\n        } else {\n            gl.drawElements(\n                gl.LINES,\n                count,\n                gl.UNSIGNED_SHORT,\n                offset\n            );\n        }\n\n        // Revert to non-wireframe parameters\n        indexBuffer.bind();\n        context.program.set(this.program);\n        context.setDepthMode(depthMode);\n        context.setStencilMode(stencilMode);\n        context.setColorMode(colorMode);\n    }\n\n    draw(\n         painter: Painter,\n         drawMode: DrawMode,\n         depthMode: $ReadOnly<DepthMode>,\n         stencilMode: $ReadOnly<StencilMode>,\n         colorMode: $ReadOnly<ColorMode>,\n         cullFaceMode: $ReadOnly<CullFaceMode>,\n         uniformValues: UniformValues<Us>,\n         layerID: string,\n         layoutVertexBuffer: VertexBuffer,\n         indexBuffer: IndexBuffer | void,\n         segments: SegmentVector,\n         currentProperties: any,\n         zoom: ?number,\n         configuration: ?ProgramConfiguration,\n         dynamicLayoutBuffers: ?Array<?VertexBuffer>,\n         instanceCount: ?number) {\n\n        const context = painter.context;\n        const gl = context.gl;\n\n        if (this.failedToCreate) return;\n\n        context.program.set(this.program);\n        context.setDepthMode(depthMode);\n        context.setStencilMode(stencilMode);\n        context.setColorMode(colorMode);\n        context.setCullFace(cullFaceMode);\n\n        for (const name of Object.keys(this.fixedUniforms)) {\n            this.fixedUniforms[name].set(this.program, name, uniformValues[name]);\n        }\n\n        if (configuration) {\n            configuration.setUniforms(this.program, context, this.binderUniforms, currentProperties, {zoom: (zoom: any)});\n        }\n\n        const primitiveSize = {\n            [gl.POINTS]: 1,\n            [gl.LINES]: 2,\n            [gl.TRIANGLES]: 3,\n            [gl.LINE_STRIP]: 1\n        }[drawMode];\n\n        const vertexAttribDivisorValue = instanceCount && instanceCount > 0 ? 1 : undefined;\n        for (const segment of segments.get()) {\n            const vaos = segment.vaos || (segment.vaos = {});\n            const vao: VertexArrayObject = vaos[layerID] || (vaos[layerID] = new VertexArrayObject());\n            vao.bind(\n                context,\n                this,\n                layoutVertexBuffer,\n                configuration ? configuration.getPaintVertexBuffers() : [],\n                indexBuffer,\n                segment.vertexOffset,\n                dynamicLayoutBuffers ? dynamicLayoutBuffers : [],\n                vertexAttribDivisorValue\n            );\n\n            if (instanceCount && instanceCount > 1) {\n                assert(indexBuffer);\n                gl.drawElementsInstanced(\n                    drawMode,\n                    segment.primitiveLength * primitiveSize,\n                    gl.UNSIGNED_SHORT,\n                    segment.primitiveOffset * primitiveSize * 2,\n                    instanceCount);\n            } else if (indexBuffer) {\n                gl.drawElements(\n                    drawMode,\n                    segment.primitiveLength * primitiveSize,\n                    gl.UNSIGNED_SHORT,\n                    segment.primitiveOffset * primitiveSize * 2);\n            } else {\n                gl.drawArrays(drawMode, segment.vertexOffset, segment.vertexLength);\n            }\n            if (drawMode === gl.TRIANGLES && indexBuffer) {\n                // Handle potential wireframe rendering for current draw call\n                this._drawDebugWireframe(painter, depthMode, stencilMode, colorMode, indexBuffer, segment,\n                    currentProperties, zoom, configuration, instanceCount);\n            }\n        }\n    }\n}\n\nexport default Program;\n","// @flow\n\nimport Context from '../gl/context.js';\nimport Fog from '../style/fog.js';\nimport {Uniform1f, Uniform1i, Uniform2f, Uniform3f, Uniform4f, UniformMatrix4f} from './uniform_binding.js';\nimport {globeToMercatorTransition} from '../geo/projection/globe_util.js';\n\nimport type {UniformValues} from './uniform_binding.js';\nimport type {UnwrappedTileID} from '../source/tile_id.js';\nimport type Painter from './painter.js';\n\nexport type FogUniformsType = {|\n    'u_fog_matrix': UniformMatrix4f,\n    'u_fog_range': Uniform2f,\n    'u_fog_color': Uniform4f,\n    'u_fog_horizon_blend': Uniform1f,\n    'u_fog_vertical_limit': Uniform2f,\n    'u_fog_temporal_offset': Uniform1f,\n    'u_frustum_tl': Uniform3f,\n    'u_frustum_tr': Uniform3f,\n    'u_frustum_br': Uniform3f,\n    'u_frustum_bl': Uniform3f,\n    'u_globe_pos': Uniform3f,\n    'u_globe_radius': Uniform1f,\n    'u_globe_transition': Uniform1f,\n    'u_is_globe': Uniform1i,\n    'u_viewport': Uniform2f,\n|};\n\nexport const fogUniforms = (context: Context): FogUniformsType => ({\n    'u_fog_matrix': new UniformMatrix4f(context),\n    'u_fog_range': new Uniform2f(context),\n    'u_fog_color': new Uniform4f(context),\n    'u_fog_horizon_blend': new Uniform1f(context),\n    'u_fog_vertical_limit': new Uniform2f(context),\n    'u_fog_temporal_offset': new Uniform1f(context),\n    'u_frustum_tl': new Uniform3f(context),\n    'u_frustum_tr': new Uniform3f(context),\n    'u_frustum_br': new Uniform3f(context),\n    'u_frustum_bl': new Uniform3f(context),\n    'u_globe_pos': new Uniform3f(context),\n    'u_globe_radius': new Uniform1f(context),\n    'u_globe_transition': new Uniform1f(context),\n    'u_is_globe': new Uniform1i(context),\n    'u_viewport': new Uniform2f(context)\n});\n\nexport const fogUniformValues = (\n    painter: Painter,\n    fog: Fog,\n    tileID: ?UnwrappedTileID,\n    fogOpacity: number,\n    frustumDirTl: [number, number, number],\n    frustumDirTr: [number, number, number],\n    frustumDirBr: [number, number, number],\n    frustumDirBl: [number, number, number],\n    globePosition: [number, number, number],\n    globeRadius: number,\n    viewport: [number, number],\n    fogMatrix: ?Float32Array\n): UniformValues<FogUniformsType> => {\n    const tr = painter.transform;\n    const fogColor = fog.properties.get('color').toArray01();\n    fogColor[3] = fogOpacity; // Update Alpha\n    const temporalOffset = (painter.frameCounter / 1000.0) % 1;\n    const [verticalRangeMin, verticalRangeMax] = fog.properties.get('vertical-range');\n    return {\n        'u_fog_matrix': tileID ? tr.calculateFogTileMatrix(tileID) : fogMatrix ? fogMatrix : painter.identityMat,\n        'u_fog_range': fog.getFovAdjustedRange(tr._fov),\n        'u_fog_color': fogColor,\n        'u_fog_horizon_blend': fog.properties.get('horizon-blend'),\n        'u_fog_vertical_limit': [Math.min(verticalRangeMin, verticalRangeMax), verticalRangeMax],\n        'u_fog_temporal_offset': temporalOffset,\n        'u_frustum_tl': frustumDirTl,\n        'u_frustum_tr': frustumDirTr,\n        'u_frustum_br': frustumDirBr,\n        'u_frustum_bl': frustumDirBl,\n        'u_globe_pos': globePosition,\n        'u_globe_radius': globeRadius,\n        'u_viewport': viewport,\n        'u_globe_transition': globeToMercatorTransition(tr.zoom),\n        'u_is_globe': +(tr.projection.name === 'globe')\n    };\n};\n","// @flow\n\nimport assert from 'assert';\nimport {\n    Uniform1i,\n    Uniform1f,\n    Uniform2f\n} from '../uniform_binding.js';\nimport pixelsToTileUnits from '../../source/pixels_to_tile_units.js';\n\nimport type Painter from '../painter.js';\nimport type {OverscaledTileID} from '../../source/tile_id.js';\nimport type {UniformValues} from '../uniform_binding.js';\nimport type Tile from '../../source/tile.js';\nimport type ResolvedImage from '../../style-spec/expression/types/resolved_image.js';\n\ntype BackgroundPatternUniformsType = {|\n    'u_image': Uniform1i,\n    'u_pattern_tl': Uniform2f,\n    'u_pattern_br': Uniform2f,\n    'u_texsize': Uniform2f,\n    'u_pattern_size': Uniform2f,\n    'u_pixel_coord_upper': Uniform2f,\n    'u_pixel_coord_lower': Uniform2f,\n    'u_tile_units_to_pixels': Uniform1f\n|};\n\nexport type PatternUniformsType = {|\n    'u_image': Uniform1i,\n    'u_texsize': Uniform2f,\n    'u_tile_units_to_pixels': Uniform1f,\n    'u_pixel_coord_upper': Uniform2f,\n    'u_pixel_coord_lower': Uniform2f\n|};\n\nfunction patternUniformValues(painter: Painter, tile: Tile): UniformValues<PatternUniformsType> {\n\n    const numTiles = Math.pow(2, tile.tileID.overscaledZ);\n    const tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom) / numTiles;\n\n    const pixelX = tileSizeAtNearestZoom * (tile.tileID.canonical.x + tile.tileID.wrap * numTiles);\n    const pixelY = tileSizeAtNearestZoom * tile.tileID.canonical.y;\n\n    return {\n        'u_image': 0,\n        'u_texsize': tile.imageAtlasTexture ? tile.imageAtlasTexture.size : [0, 0],\n        'u_tile_units_to_pixels': 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom),\n        // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision.\n        'u_pixel_coord_upper': [pixelX >> 16, pixelY >> 16],\n        'u_pixel_coord_lower': [pixelX & 0xFFFF, pixelY & 0xFFFF]\n    };\n}\n\nfunction bgPatternUniformValues(\n    image: ResolvedImage,\n    scope: string,\n    painter: Painter,\n    tile: {tileID: OverscaledTileID, tileSize: number}\n): UniformValues<BackgroundPatternUniformsType> {\n    const imagePos = painter.imageManager.getPattern(image.toString(), scope);\n    assert(imagePos);\n    const {width, height} = painter.imageManager.getPixelSize(scope);\n\n    const numTiles = Math.pow(2, tile.tileID.overscaledZ);\n    const tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom) / numTiles;\n\n    const pixelX = tileSizeAtNearestZoom * (tile.tileID.canonical.x + tile.tileID.wrap * numTiles);\n    const pixelY = tileSizeAtNearestZoom * tile.tileID.canonical.y;\n\n    return {\n        'u_image': 0,\n        'u_pattern_tl': (imagePos: any).tl,\n        'u_pattern_br': (imagePos: any).br,\n        'u_texsize': [width, height],\n        'u_pattern_size': (imagePos: any).displaySize,\n        'u_tile_units_to_pixels': 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom),\n        // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision.\n        'u_pixel_coord_upper': [pixelX >> 16, pixelY >> 16],\n        'u_pixel_coord_lower': [pixelX & 0xFFFF, pixelY & 0xFFFF]\n    };\n}\nexport {bgPatternUniformValues, patternUniformValues};\n","// @flow\n\nimport {patternUniformValues} from './pattern.js';\nimport {\n    Uniform1i,\n    Uniform1f,\n    Uniform2f,\n    Uniform3f,\n    UniformMatrix4f\n} from '../uniform_binding.js';\nimport {mat3, mat4, vec3} from 'gl-matrix';\nimport {extend} from '../../util/util.js';\nimport type Context from '../../gl/context.js';\nimport type Painter from '../painter.js';\nimport type {UniformValues} from '../uniform_binding.js';\nimport type Tile from '../../source/tile.js';\nimport {CanonicalTileID, OverscaledTileID} from '../../source/tile_id.js';\nimport EXTENT from '../../style-spec/data/extent.js';\n\nexport type FillExtrusionUniformsType = {|\n    'u_matrix': UniformMatrix4f,\n    'u_lightpos': Uniform3f,\n    'u_lightintensity': Uniform1f,\n    'u_lightcolor': Uniform3f,\n    'u_vertical_gradient': Uniform1f,\n    'u_opacity': Uniform1f,\n    // globe uniforms:\n    'u_tile_id': Uniform3f,\n    'u_zoom_transition': Uniform1f,\n    'u_inv_rot_matrix': UniformMatrix4f,\n    'u_merc_center': Uniform2f,\n    'u_up_dir': Uniform3f,\n    'u_height_lift': Uniform1f,\n    'u_ao': Uniform2f,\n    'u_edge_radius': Uniform1f,\n    'u_flood_light_color': Uniform3f,\n    'u_vertical_scale': Uniform1f,\n    'u_flood_light_intensity': Uniform1f,\n    'u_ground_shadow_factor': Uniform3f,\n    'u_emissive_strength': Uniform1f\n|};\n\nexport type FillExtrusionDepthUniformsType = {|\n    'u_matrix': UniformMatrix4f,\n    'u_edge_radius': Uniform1f,\n    'u_vertical_scale': Uniform1f\n|};\n\nexport type FillExtrusionPatternUniformsType = {|\n    'u_matrix': UniformMatrix4f,\n    'u_lightpos': Uniform3f,\n    'u_lightintensity': Uniform1f,\n    'u_lightcolor': Uniform3f,\n    'u_height_factor': Uniform1f,\n    'u_vertical_gradient': Uniform1f,\n    'u_ao': Uniform2f,\n    'u_edge_radius': Uniform1f,\n    // globe uniforms:\n    'u_tile_id': Uniform3f,\n    'u_zoom_transition': Uniform1f,\n    'u_inv_rot_matrix': UniformMatrix4f,\n    'u_merc_center': Uniform2f,\n    'u_up_dir': Uniform3f,\n    'u_height_lift': Uniform1f,\n    // pattern uniforms:\n    'u_texsize': Uniform2f,\n    'u_image': Uniform1i,\n    'u_pixel_coord_upper': Uniform2f,\n    'u_pixel_coord_lower': Uniform2f,\n    'u_tile_units_to_pixels': Uniform1f,\n    'u_opacity': Uniform1f\n|};\nexport type FillExtrusionGroundEffectUniformsType = {|\n    'u_matrix': UniformMatrix4f,\n    'u_opacity': Uniform1f,\n    'u_ao_pass': Uniform1f,\n    'u_meter_to_tile': Uniform1f,\n    'u_ao': Uniform2f,\n    'u_flood_light_intensity': Uniform1f,\n    'u_flood_light_color': Uniform3f,\n    'u_attenuation': Uniform1f,\n    'u_edge_radius': Uniform1f,\n    'u_fb': Uniform1i,\n    'u_fb_size': Uniform1f\n|};\n\nconst fillExtrusionUniforms = (context: Context): FillExtrusionUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context),\n    'u_lightpos': new Uniform3f(context),\n    'u_lightintensity': new Uniform1f(context),\n    'u_lightcolor': new Uniform3f(context),\n    'u_vertical_gradient': new Uniform1f(context),\n    'u_opacity': new Uniform1f(context),\n    'u_edge_radius': new Uniform1f(context),\n    'u_ao': new Uniform2f(context),\n    // globe uniforms:\n    'u_tile_id': new Uniform3f(context),\n    'u_zoom_transition': new Uniform1f(context),\n    'u_inv_rot_matrix': new UniformMatrix4f(context),\n    'u_merc_center': new Uniform2f(context),\n    'u_up_dir': new Uniform3f(context),\n    'u_height_lift': new Uniform1f(context),\n    'u_flood_light_color': new Uniform3f(context),\n    'u_vertical_scale': new Uniform1f(context),\n    'u_flood_light_intensity': new Uniform1f(context),\n    'u_ground_shadow_factor': new Uniform3f(context),\n    'u_emissive_strength': new Uniform1f(context)\n});\n\nconst fillExtrusionDepthUniforms = (context: Context): FillExtrusionDepthUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context),\n    'u_edge_radius': new Uniform1f(context),\n    'u_vertical_scale': new Uniform1f(context)\n});\n\nconst fillExtrusionPatternUniforms = (context: Context): FillExtrusionPatternUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context),\n    'u_lightpos': new Uniform3f(context),\n    'u_lightintensity': new Uniform1f(context),\n    'u_lightcolor': new Uniform3f(context),\n    'u_vertical_gradient': new Uniform1f(context),\n    'u_height_factor': new Uniform1f(context),\n    'u_edge_radius': new Uniform1f(context),\n    'u_ao': new Uniform2f(context),\n    // globe uniforms:\n    'u_tile_id': new Uniform3f(context),\n    'u_zoom_transition': new Uniform1f(context),\n    'u_inv_rot_matrix': new UniformMatrix4f(context),\n    'u_merc_center': new Uniform2f(context),\n    'u_up_dir': new Uniform3f(context),\n    'u_height_lift': new Uniform1f(context),\n    // pattern uniforms\n    'u_image': new Uniform1i(context),\n    'u_texsize': new Uniform2f(context),\n    'u_pixel_coord_upper': new Uniform2f(context),\n    'u_pixel_coord_lower': new Uniform2f(context),\n    'u_tile_units_to_pixels': new Uniform1f(context),\n    'u_opacity': new Uniform1f(context)\n});\n\nconst fillExtrusionGroundEffectUniforms = (context: Context): FillExtrusionGroundEffectUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context),\n    'u_opacity': new Uniform1f(context),\n    'u_ao_pass': new Uniform1f(context),\n    'u_meter_to_tile': new Uniform1f(context),\n    'u_ao': new Uniform2f(context),\n    'u_flood_light_intensity': new Uniform1f(context),\n    'u_flood_light_color': new Uniform3f(context),\n    'u_attenuation': new Uniform1f(context),\n    'u_edge_radius': new Uniform1f(context),\n    'u_fb': new Uniform1i(context),\n    'u_fb_size': new Uniform1f(context)\n});\n\nconst identityMatrix = mat4.create();\n\nconst fillExtrusionUniformValues = (\n    matrix: Float32Array,\n    painter: Painter,\n    shouldUseVerticalGradient: boolean,\n    opacity: number,\n    aoIntensityRadius: [number, number],\n    edgeRadius: number,\n    coord: OverscaledTileID,\n    heightLift: number,\n    zoomTransition: number,\n    mercatorCenter: [number, number],\n    invMatrix: Float32Array,\n    floodLightColor: [number, number, number],\n    verticalScale: number,\n    floodLightIntensity: number,\n    groundShadowFactor: [number, number, number],\n    emissiveStrength: number\n): UniformValues<FillExtrusionUniformsType> => {\n    const light = painter.style.light;\n    const _lp = light.properties.get('position');\n    const lightPos = [_lp.x, _lp.y, _lp.z];\n    const lightMat = mat3.create();\n    const anchor = light.properties.get('anchor');\n    if (anchor === 'viewport') {\n        mat3.fromRotation(lightMat, -painter.transform.angle);\n        vec3.transformMat3(lightPos, lightPos, lightMat);\n    }\n\n    const lightColor = light.properties.get('color');\n    const tr = painter.transform;\n\n    const uniformValues = {\n        'u_matrix': matrix,\n        'u_lightpos': lightPos,\n        'u_lightintensity': light.properties.get('intensity'),\n        'u_lightcolor': [lightColor.r, lightColor.g, lightColor.b],\n        'u_vertical_gradient': +shouldUseVerticalGradient,\n        'u_opacity': opacity,\n        'u_tile_id': [0, 0, 0],\n        'u_zoom_transition': 0,\n        'u_inv_rot_matrix': identityMatrix,\n        'u_merc_center': [0, 0],\n        'u_up_dir': [0, 0, 0],\n        'u_height_lift': 0,\n        'u_ao': aoIntensityRadius,\n        'u_edge_radius': edgeRadius,\n        'u_flood_light_color': floodLightColor,\n        'u_vertical_scale': verticalScale,\n        'u_flood_light_intensity': floodLightIntensity,\n        'u_ground_shadow_factor': groundShadowFactor,\n        'u_emissive_strength': emissiveStrength\n    };\n\n    if (tr.projection.name === 'globe') {\n        uniformValues['u_tile_id'] = [coord.canonical.x, coord.canonical.y, 1 << coord.canonical.z];\n        uniformValues['u_zoom_transition'] = zoomTransition;\n        uniformValues['u_inv_rot_matrix'] = invMatrix;\n        uniformValues['u_merc_center'] = mercatorCenter;\n        uniformValues['u_up_dir'] = (tr.projection.upVector(new CanonicalTileID(0, 0, 0), mercatorCenter[0] * EXTENT, mercatorCenter[1] * EXTENT): any);\n        uniformValues['u_height_lift'] = heightLift;\n    }\n\n    return uniformValues;\n};\n\nconst fillExtrusionDepthUniformValues = (\n    matrix: Float32Array,\n    edgeRadius: number,\n    verticalScale: number\n): UniformValues<FillExtrusionDepthUniformsType> => {\n    return {\n        'u_matrix': matrix,\n        'u_edge_radius': edgeRadius,\n        'u_vertical_scale': verticalScale\n    };\n};\n\nconst fillExtrusionPatternUniformValues = (\n    matrix: Float32Array,\n    painter: Painter,\n    shouldUseVerticalGradient: boolean,\n    opacity: number,\n    aoIntensityRadius: [number, number],\n    edgeRadius: number,\n    coord: OverscaledTileID,\n    tile: Tile,\n    heightLift: number,\n    zoomTransition: number,\n    mercatorCenter: [number, number],\n    invMatrix: Float32Array,\n    floodLightColor: [number, number, number],\n    verticalScale: number\n): UniformValues<FillExtrusionPatternUniformsType> => {\n    const uniformValues = fillExtrusionUniformValues(\n        matrix, painter, shouldUseVerticalGradient, opacity, aoIntensityRadius, edgeRadius, coord,\n        heightLift, zoomTransition, mercatorCenter, invMatrix, floodLightColor, verticalScale, 1.0, [0, 0, 0], 0);\n    const heightFactorUniform = {\n        'u_height_factor': -Math.pow(2, coord.overscaledZ) / tile.tileSize / 8\n    };\n    return extend(uniformValues, patternUniformValues(painter, tile), heightFactorUniform);\n};\n\nconst fillExtrusionGroundEffectUniformValues = (\n    painter: Painter,\n    matrix: Float32Array,\n    opacity: number,\n    aoPass: boolean,\n    meterToTile: number,\n    ao: [number, number],\n    floodLightIntensity: number,\n    floodLightColor: [number, number, number],\n    attenuation: number,\n    edgeRadius: number,\n    fbSize: number\n): UniformValues<FillExtrusionGroundEffectUniformsType> => {\n    const uniformValues = {\n        'u_matrix': matrix,\n        'u_opacity': opacity,\n        'u_ao_pass': aoPass ? 1 : 0,\n        'u_meter_to_tile': meterToTile,\n        'u_ao': ao,\n        'u_flood_light_intensity': floodLightIntensity,\n        'u_flood_light_color': floodLightColor,\n        'u_attenuation': attenuation,\n        'u_edge_radius': edgeRadius,\n        'u_fb': 0,\n        'u_fb_size': fbSize\n    };\n    return uniformValues;\n};\n\nexport {\n    fillExtrusionUniforms,\n    fillExtrusionDepthUniforms,\n    fillExtrusionPatternUniforms,\n    fillExtrusionUniformValues,\n    fillExtrusionDepthUniformValues,\n    fillExtrusionPatternUniformValues,\n    fillExtrusionGroundEffectUniforms,\n    fillExtrusionGroundEffectUniformValues\n};\n","// @flow\n\nimport {patternUniformValues} from './pattern.js';\nimport {\n    Uniform1i,\n    Uniform1f,\n    Uniform2f,\n    UniformMatrix4f\n} from '../uniform_binding.js';\nimport {extend} from '../../util/util.js';\n\nimport type Painter from '../painter.js';\nimport type {UniformValues} from '../uniform_binding.js';\nimport type Context from '../../gl/context.js';\nimport type Tile from '../../source/tile.js';\n\nexport type FillUniformsType = {|\n    'u_matrix': UniformMatrix4f,\n    'u_emissive_strength': Uniform1f\n|};\n\nexport type FillOutlineUniformsType = {|\n    'u_matrix': UniformMatrix4f,\n    'u_emissive_strength': Uniform1f,\n    'u_world': Uniform2f\n|};\n\nexport type FillPatternUniformsType = {|\n    'u_matrix': UniformMatrix4f,\n    'u_emissive_strength': Uniform1f,\n    // pattern uniforms:\n    'u_texsize': Uniform2f,\n    'u_image': Uniform1i,\n    'u_pixel_coord_upper': Uniform2f,\n    'u_pixel_coord_lower': Uniform2f,\n    'u_tile_units_to_pixels': Uniform1f\n|};\n\nexport type FillOutlinePatternUniformsType = {|\n    'u_matrix': UniformMatrix4f,\n    'u_emissive_strength': Uniform1f,\n    'u_world': Uniform2f,\n    // pattern uniforms:\n    'u_texsize': Uniform2f,\n    'u_image': Uniform1i,\n    'u_pixel_coord_upper': Uniform2f,\n    'u_pixel_coord_lower': Uniform2f,\n    'u_tile_units_to_pixels': Uniform1f\n|};\n\nconst fillUniforms = (context: Context): FillUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context),\n    'u_emissive_strength': new Uniform1f(context)\n});\n\nconst fillPatternUniforms = (context: Context): FillPatternUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context),\n    'u_emissive_strength': new Uniform1f(context),\n    'u_image': new Uniform1i(context),\n    'u_texsize': new Uniform2f(context),\n    'u_pixel_coord_upper': new Uniform2f(context),\n    'u_pixel_coord_lower': new Uniform2f(context),\n    'u_tile_units_to_pixels': new Uniform1f(context)\n});\n\nconst fillOutlineUniforms = (context: Context): FillOutlineUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context),\n    'u_emissive_strength': new Uniform1f(context),\n    'u_world': new Uniform2f(context)\n});\n\nconst fillOutlinePatternUniforms = (context: Context): FillOutlinePatternUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context),\n    'u_emissive_strength': new Uniform1f(context),\n    'u_world': new Uniform2f(context),\n    'u_image': new Uniform1i(context),\n    'u_texsize': new Uniform2f(context),\n    'u_pixel_coord_upper': new Uniform2f(context),\n    'u_pixel_coord_lower': new Uniform2f(context),\n    'u_tile_units_to_pixels': new Uniform1f(context)\n});\n\nconst fillUniformValues = (matrix: Float32Array, emissiveStrength: number): UniformValues<FillUniformsType> => ({\n    'u_matrix': matrix,\n    'u_emissive_strength': emissiveStrength\n});\n\nconst fillPatternUniformValues = (\n    matrix: Float32Array,\n    emissiveStrength: number,\n    painter: Painter,\n    tile: Tile\n): UniformValues<FillPatternUniformsType> => extend(\n    fillUniformValues(matrix, emissiveStrength),\n    patternUniformValues(painter, tile)\n);\n\nconst fillOutlineUniformValues = (\n    matrix: Float32Array,\n    emissiveStrength: number,\n    drawingBufferSize: [number, number]\n): UniformValues<FillOutlineUniformsType> => ({\n    'u_matrix': matrix,\n    'u_world': drawingBufferSize,\n    'u_emissive_strength': emissiveStrength\n});\n\nconst fillOutlinePatternUniformValues = (\n    matrix: Float32Array,\n    emissiveStrength: number,\n    painter: Painter,\n    tile: Tile,\n    drawingBufferSize: [number, number]\n): UniformValues<FillOutlinePatternUniformsType> => extend(\n    fillPatternUniformValues(matrix, emissiveStrength, painter, tile),\n    {\n        'u_world': drawingBufferSize\n    }\n);\n\nexport {\n    fillUniforms,\n    fillPatternUniforms,\n    fillOutlineUniforms,\n    fillOutlinePatternUniforms,\n    fillUniformValues,\n    fillPatternUniformValues,\n    fillOutlineUniformValues,\n    fillOutlinePatternUniformValues\n};\n","// @flow\n\nimport {\n    Uniform1f,\n    Uniform2f,\n    UniformMatrix4f\n} from '../uniform_binding.js';\nimport EXTENT from '../../style-spec/data/extent.js';\nimport type Context from '../../gl/context.js';\nimport type {UniformValues} from '../uniform_binding.js';\nimport type Transform from '../../geo/transform.js';\nimport type Tile from '../../source/tile.js';\nimport type Projection from '../../geo/projection/projection.js';\n\nexport type CollisionUniformsType = {|\n    'u_matrix': UniformMatrix4f,\n    'u_camera_to_center_distance': Uniform1f,\n    'u_extrude_scale': Uniform2f\n|};\n\nexport type CollisionCircleUniformsType = {|\n    'u_matrix': UniformMatrix4f,\n    'u_inv_matrix': UniformMatrix4f,\n    'u_camera_to_center_distance': Uniform1f,\n    'u_viewport_size': Uniform2f\n|};\n\nconst collisionUniforms = (context: Context): CollisionUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context),\n    'u_camera_to_center_distance': new Uniform1f(context),\n    'u_extrude_scale': new Uniform2f(context)\n});\n\nconst collisionCircleUniforms = (context: Context): CollisionCircleUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context),\n    'u_inv_matrix': new UniformMatrix4f(context),\n    'u_camera_to_center_distance': new Uniform1f(context),\n    'u_viewport_size': new Uniform2f(context)\n});\n\nconst collisionUniformValues = (\n    matrix: Float32Array,\n    transform: Transform,\n    tile: Tile,\n    projection: Projection\n): UniformValues<CollisionUniformsType> => {\n    const pixelRatio = EXTENT / tile.tileSize;\n\n    return {\n        'u_matrix': matrix,\n        'u_camera_to_center_distance': transform.getCameraToCenterDistance(projection),\n        'u_extrude_scale': [transform.pixelsToGLUnits[0] / pixelRatio,\n            transform.pixelsToGLUnits[1] / pixelRatio]\n    };\n};\n\nconst collisionCircleUniformValues = (\n    matrix: Float32Array,\n    invMatrix: Float32Array,\n    transform: Transform,\n    projection: Projection\n): UniformValues<CollisionCircleUniformsType> => {\n    return {\n        'u_matrix': matrix,\n        'u_inv_matrix': invMatrix,\n        'u_camera_to_center_distance': transform.getCameraToCenterDistance(projection),\n        'u_viewport_size': [transform.width, transform.height]\n    };\n};\n\nexport {collisionUniforms, collisionUniformValues, collisionCircleUniforms, collisionCircleUniformValues};\n","// @flow\n\nimport {\n    UniformColor,\n    UniformMatrix4f,\n    Uniform1i,\n    Uniform1f\n} from '../uniform_binding.js';\n\nimport type Context from '../../gl/context.js';\nimport type {UniformValues} from '../uniform_binding.js';\nimport type Color from '../../style-spec/util/color.js';\n\nexport type DebugUniformsType = {|\n    'u_color': UniformColor,\n    'u_matrix': UniformMatrix4f,\n    'u_overlay': Uniform1i,\n    'u_overlay_scale': Uniform1f\n|};\n\nconst debugUniforms = (context: Context): DebugUniformsType => ({\n    'u_color': new UniformColor(context),\n    'u_matrix': new UniformMatrix4f(context),\n    'u_overlay': new Uniform1i(context),\n    'u_overlay_scale':  new Uniform1f(context),\n});\n\nconst debugUniformValues = (matrix: Float32Array, color: Color, scaleRatio: number = 1): UniformValues<DebugUniformsType> => ({\n    'u_matrix': matrix,\n    'u_color': color,\n    'u_overlay': 0,\n    'u_overlay_scale': scaleRatio\n});\n\nexport {debugUniforms, debugUniformValues};\n\nexport type DebugDefinesType = 'PROJECTION_GLOBE_VIEW';\n","// @flow\n\nimport {\n    Uniform1i,\n    Uniform1f,\n    Uniform2f,\n    Uniform3f,\n    UniformMatrix4f\n} from '../uniform_binding.js';\nimport pixelsToTileUnits from '../../source/pixels_to_tile_units.js';\n\nimport type Context from '../../gl/context.js';\nimport type Tile from '../../source/tile.js';\nimport type {UniformValues} from '../uniform_binding.js';\nimport type Painter from '../painter.js';\nimport type HeatmapStyleLayer from '../../style/style_layer/heatmap_style_layer.js';\nimport {CanonicalTileID, OverscaledTileID} from '../../source/tile_id.js';\nimport {mat4} from 'gl-matrix';\nimport {globeToMercatorTransition, globePixelsToTileUnits} from '../../geo/projection/globe_util.js';\nimport EXTENT from '../../style-spec/data/extent.js';\n\nexport type HeatmapUniformsType = {|\n    'u_extrude_scale': Uniform1f,\n    'u_intensity': Uniform1f,\n    'u_matrix': UniformMatrix4f,\n    'u_inv_rot_matrix': UniformMatrix4f,\n    'u_merc_center': Uniform2f,\n    'u_tile_id': Uniform3f,\n    'u_zoom_transition': Uniform1f,\n    'u_up_dir': Uniform3f,\n|};\n\nexport type HeatmapTextureUniformsType = {|\n    'u_image': Uniform1i,\n    'u_color_ramp': Uniform1i,\n    'u_opacity': Uniform1f\n|};\n\nconst heatmapUniforms = (context: Context): HeatmapUniformsType => ({\n    'u_extrude_scale': new Uniform1f(context),\n    'u_intensity': new Uniform1f(context),\n    'u_matrix': new UniformMatrix4f(context),\n    'u_inv_rot_matrix': new UniformMatrix4f(context),\n    'u_merc_center': new Uniform2f(context),\n    'u_tile_id': new Uniform3f(context),\n    'u_zoom_transition': new Uniform1f(context),\n    'u_up_dir': new Uniform3f(context)\n});\n\nconst heatmapTextureUniforms = (context: Context): HeatmapTextureUniformsType => ({\n    'u_image': new Uniform1i(context),\n    'u_color_ramp': new Uniform1i(context),\n    'u_opacity': new Uniform1f(context)\n});\n\nconst identityMatrix = mat4.create();\n\nconst heatmapUniformValues = (\n    painter: Painter,\n    coord: OverscaledTileID,\n    tile: Tile,\n    invMatrix: Float32Array,\n    mercatorCenter: [number, number],\n    zoom: number,\n    intensity: number\n): UniformValues<HeatmapUniformsType> => {\n    const transform = painter.transform;\n    const isGlobe = transform.projection.name === 'globe';\n    const extrudeScale = isGlobe ? globePixelsToTileUnits(transform.zoom, coord.canonical) * transform._pixelsPerMercatorPixel : pixelsToTileUnits(tile, 1, zoom);\n\n    const values = {\n        'u_matrix': coord.projMatrix,\n        'u_extrude_scale': extrudeScale,\n        'u_intensity': intensity,\n        'u_inv_rot_matrix': identityMatrix,\n        'u_merc_center': [0, 0],\n        'u_tile_id': [0, 0, 0],\n        'u_zoom_transition': 0,\n        'u_up_dir': [0, 0, 0],\n    };\n\n    if (isGlobe) {\n        values['u_inv_rot_matrix'] = invMatrix;\n        values['u_merc_center'] = mercatorCenter;\n        values['u_tile_id'] = [coord.canonical.x, coord.canonical.y, 1 << coord.canonical.z];\n        values['u_zoom_transition'] = globeToMercatorTransition(transform.zoom);\n        const x = mercatorCenter[0] * EXTENT;\n        const y = mercatorCenter[1] * EXTENT;\n        values['u_up_dir'] = (transform.projection.upVector(new CanonicalTileID(0, 0, 0), x, y): any);\n    }\n\n    return values;\n};\n\nconst heatmapTextureUniformValues = (\n    painter: Painter,\n    layer: HeatmapStyleLayer,\n    textureUnit: number,\n    colorRampUnit: number\n): UniformValues<HeatmapTextureUniformsType> => {\n    return {\n        'u_image': textureUnit,\n        'u_color_ramp': colorRampUnit,\n        'u_opacity': layer.paint.get('heatmap-opacity')\n    };\n};\n\nexport {\n    heatmapUniforms,\n    heatmapTextureUniforms,\n    heatmapUniformValues,\n    heatmapTextureUniformValues\n};\n\nexport type HeatmapDefinesType = 'PROJECTION_GLOBE_VIEW';\n","// @flow\n\nfunction computeRasterColorMix(colorRampRes: number, [mixR, mixG, mixB, mixA]: [number, number, number, number], [min, max]: [number, number]): [number, number, number, number] {\n    if (min === max) return [0, 0, 0, 0];\n\n    // Together with the `offset`, the mix vector transforms the encoded integer\n    // input into a numeric value. To minimize work, we modify this vector to\n    // perform extra steps on the CPU, before rendering.\n    //\n    // To a first cut, we map `min` to the texture coordinate 0, and `max` to texture\n    // coordinate 1. However, this would align the samples with the *edges* of\n    // tabulated texels rather than the centers. This  makes it difficult to precisely\n    // position values relative to the tabulated colors.\n    //\n    // Therefore given color map resolution N, we actually map `min` to 1 / 2N and\n    // `max` to 1 - 1 / 2N. When you work out a few lines of algebra, the scale factor\n    // below is the result.\n    //\n    // Similarly, computerRasterColorOffset contains the counterpart of this equation\n    // by which the constant offset is adjusted.\n    const factor = 255 * (colorRampRes - 1) / (colorRampRes * (max - min));\n\n    return [\n        mixR * factor,\n        mixG * factor,\n        mixB * factor,\n        mixA * factor\n    ];\n}\n\nfunction computeRasterColorOffset(colorRampRes: number, offset: number, [min, max]: [number, number]): number {\n    if (min === max) return 0;\n\n    // See above for an explanation.\n    return 0.5 / colorRampRes + (offset - min) * (colorRampRes - 1) / (colorRampRes * (max - min));\n}\n\nexport {computeRasterColorMix, computeRasterColorOffset};\n","// @flow\n\nimport {\n    Uniform1i,\n    Uniform1f,\n    Uniform2f,\n    Uniform3f,\n    Uniform4f,\n    UniformMatrix3f,\n    UniformMatrix4f\n} from '../uniform_binding.js';\n\nimport {computeRasterColorMix, computeRasterColorOffset} from '../raster.js';\nimport {COLOR_RAMP_RES} from '../../style/style_layer/raster_style_layer.js';\nimport {contrastFactor, saturationFactor} from '../../util/util.js';\n\nimport type Context from '../../gl/context.js';\nimport type {UniformValues} from '../uniform_binding.js';\nimport type RasterStyleLayer from '../../style/style_layer/raster_style_layer.js';\n\nexport type RasterUniformsType = {|\n    'u_matrix': UniformMatrix4f,\n    'u_normalize_matrix': UniformMatrix4f,\n    'u_globe_matrix': UniformMatrix4f,\n    'u_merc_matrix': UniformMatrix4f,\n    'u_grid_matrix': UniformMatrix3f,\n    'u_tl_parent': Uniform2f,\n    'u_scale_parent': Uniform1f,\n    'u_fade_t': Uniform1f,\n    'u_opacity': Uniform1f,\n    'u_image0': Uniform1i,\n    'u_image1': Uniform1i,\n    'u_brightness_low': Uniform1f,\n    'u_brightness_high': Uniform1f,\n    'u_saturation_factor': Uniform1f,\n    'u_contrast_factor': Uniform1f,\n    'u_spin_weights': Uniform3f,\n    'u_perspective_transform': Uniform2f,\n    'u_raster_elevation': Uniform1f,\n    'u_zoom_transition': Uniform1f,\n    'u_merc_center': Uniform2f,\n    'u_cutoff_params': Uniform4f,\n    'u_colorization_mix': Uniform4f,\n    'u_colorization_offset': Uniform1f,\n    'u_color_ramp': Uniform1i,\n    'u_texture_offset': Uniform2f,\n    'u_texture_res': Uniform2f,\n    'u_emissive_strength': Uniform1f\n|};\n\nexport type RasterDefinesType = 'RASTER_COLOR' | 'RENDER_CUTOFF' | 'RASTER_ARRAY' | 'RASTER_ARRAY_LINEAR';\n\nconst rasterUniforms = (context: Context): RasterUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context),\n    'u_normalize_matrix': new UniformMatrix4f(context),\n    'u_globe_matrix': new UniformMatrix4f(context),\n    'u_merc_matrix': new UniformMatrix4f(context),\n    'u_grid_matrix': new UniformMatrix3f(context),\n    'u_tl_parent': new Uniform2f(context),\n    'u_scale_parent': new Uniform1f(context),\n    'u_fade_t': new Uniform1f(context),\n    'u_opacity': new Uniform1f(context),\n    'u_image0': new Uniform1i(context),\n    'u_image1': new Uniform1i(context),\n    'u_brightness_low': new Uniform1f(context),\n    'u_brightness_high': new Uniform1f(context),\n    'u_saturation_factor': new Uniform1f(context),\n    'u_contrast_factor': new Uniform1f(context),\n    'u_spin_weights': new Uniform3f(context),\n    'u_perspective_transform': new Uniform2f(context),\n    'u_raster_elevation': new Uniform1f(context),\n    'u_zoom_transition': new Uniform1f(context),\n    'u_merc_center': new Uniform2f(context),\n    'u_cutoff_params': new Uniform4f(context),\n    'u_colorization_mix': new Uniform4f(context),\n    'u_colorization_offset': new Uniform1f(context),\n    'u_color_ramp': new Uniform1i(context),\n    'u_texture_offset': new Uniform2f(context),\n    'u_texture_res': new Uniform2f(context),\n    'u_emissive_strength': new Uniform1f(context)\n});\n\nconst rasterUniformValues = (\n    matrix: Float32Array,\n    normalizeMatrix: Float32Array,\n    globeMatrix: Float32Array,\n    mercMatrix: Float32Array,\n    gridMatrix: Float32Array,\n    parentTL: [number, number],\n    zoomTransition: number,\n    mercatorCenter: [number, number],\n    cutoffParams: [number, number, number, number],\n    parentScaleBy: number,\n    fade: {mix: number, opacity: number},\n    layer: RasterStyleLayer,\n    perspectiveTransform: [number, number],\n    elevation: number,\n    colorRampUnit: number,\n    colorMix: [number, number, number, number],\n    colorOffset: number,\n    colorRange: [number, number],\n    tileSize: number,\n    buffer: number,\n    emissiveStrength: number\n): UniformValues<RasterUniformsType> => ({\n    'u_matrix': matrix,\n    'u_normalize_matrix': normalizeMatrix,\n    'u_globe_matrix': globeMatrix,\n    'u_merc_matrix': mercMatrix,\n    'u_grid_matrix': gridMatrix,\n    'u_tl_parent': parentTL,\n    'u_scale_parent': parentScaleBy,\n    'u_fade_t': fade.mix,\n    'u_opacity': fade.opacity * layer.paint.get('raster-opacity'),\n    'u_image0': 0,\n    'u_image1': 1,\n    'u_brightness_low': layer.paint.get('raster-brightness-min'),\n    'u_brightness_high': layer.paint.get('raster-brightness-max'),\n    'u_saturation_factor': saturationFactor(layer.paint.get('raster-saturation')),\n    'u_contrast_factor': contrastFactor(layer.paint.get('raster-contrast')),\n    'u_spin_weights': spinWeights(layer.paint.get('raster-hue-rotate')),\n    'u_perspective_transform': perspectiveTransform,\n    'u_raster_elevation': elevation,\n    'u_zoom_transition': zoomTransition,\n    'u_merc_center': mercatorCenter,\n    'u_cutoff_params': cutoffParams,\n    'u_colorization_mix': computeRasterColorMix(COLOR_RAMP_RES, colorMix, colorRange),\n    'u_colorization_offset': computeRasterColorOffset(COLOR_RAMP_RES, colorOffset, colorRange),\n    'u_color_ramp': colorRampUnit,\n    'u_texture_offset': [\n        buffer / (tileSize + 2 * buffer),\n        tileSize / (tileSize + 2 * buffer)\n    ],\n    'u_texture_res': [tileSize + 2 * buffer, tileSize + 2 * buffer],\n    'u_emissive_strength': emissiveStrength\n});\n\nconst rasterPoleUniformValues = (\n    matrix: Float32Array,\n    normalizeMatrix: Float32Array,\n    globeMatrix: Float32Array,\n    zoomTransition: number,\n    fade: {mix: number, opacity: number},\n    layer: RasterStyleLayer,\n    perspectiveTransform: [number, number],\n    elevation: number,\n    colorRampUnit: number,\n    colorMix: [number, number, number, number],\n    colorOffset: number,\n    colorRange: [number, number],\n    emissiveStrength: number\n): UniformValues<RasterUniformsType> => (rasterUniformValues(\n    matrix,\n    normalizeMatrix,\n    globeMatrix,\n    new Float32Array(16),\n    new Float32Array(9),\n    [0, 0],\n    zoomTransition,\n    [0, 0],\n    [0, 0, 0, 0],\n    1,\n    fade,\n    layer,\n    perspectiveTransform || [0, 0],\n    elevation,\n    colorRampUnit,\n    colorMix,\n    colorOffset,\n    colorRange,\n    1,\n    0,\n    emissiveStrength\n));\n\nfunction spinWeights(angle: number) {\n    angle *= Math.PI / 180;\n    const s = Math.sin(angle);\n    const c = Math.cos(angle);\n    return [\n        (2 * c + 1) / 3,\n        (-Math.sqrt(3) * s - c + 1) / 3,\n        (Math.sqrt(3) * s - c + 1) / 3\n    ];\n}\n\nexport {rasterUniforms, rasterUniformValues, rasterPoleUniformValues};\n","// @flow\n\nimport {\n    Uniform1i,\n    Uniform1f,\n    Uniform2f,\n    Uniform4f,\n    UniformMatrix3f,\n    UniformMatrix4f\n} from '../uniform_binding.js';\nimport {PARTICLE_POS_SCALE, PARTICLE_POS_OFFSET} from '../raster_particle_state.js';\n\nimport type Context from '../../gl/context.js';\nimport type {UniformValues} from '../uniform_binding.js';\n\nexport type RasterParticleUniformsType = {|\n    'u_matrix': UniformMatrix4f,\n    'u_normalize_matrix': UniformMatrix4f,\n    'u_globe_matrix': UniformMatrix4f,\n    'u_merc_matrix': UniformMatrix4f,\n    'u_grid_matrix': UniformMatrix3f,\n    'u_tl_parent': Uniform2f,\n    'u_scale_parent': Uniform1f,\n    'u_fade_t': Uniform1f,\n    'u_opacity': Uniform1f,\n    'u_image0': Uniform1i,\n    'u_image1': Uniform1i,\n    'u_raster_elevation': Uniform1f,\n    'u_zoom_transition': Uniform1f,\n    'u_merc_center': Uniform2f,\n    'u_cutoff_params': Uniform4f\n|};\n\nexport type RasterParticleDefinesType = 'RASTER_ARRAY' | 'RENDER_CUTOFF' | 'DATA_FORMAT_UINT32' | 'DATA_FORMAT_UINT16' | 'DATA_FORMAT_UINT8';\n\nconst rasterParticleUniforms = (context: Context): RasterParticleUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context),\n    'u_normalize_matrix': new UniformMatrix4f(context),\n    'u_globe_matrix': new UniformMatrix4f(context),\n    'u_merc_matrix': new UniformMatrix4f(context),\n    'u_grid_matrix': new UniformMatrix3f(context),\n    'u_tl_parent': new Uniform2f(context),\n    'u_scale_parent': new Uniform1f(context),\n    'u_fade_t': new Uniform1f(context),\n    'u_opacity': new Uniform1f(context),\n    'u_image0': new Uniform1i(context),\n    'u_image1': new Uniform1i(context),\n    'u_raster_elevation': new Uniform1f(context),\n    'u_zoom_transition': new Uniform1f(context),\n    'u_merc_center': new Uniform2f(context),\n    'u_cutoff_params': new Uniform4f(context)\n});\n\nconst rasterParticleUniformValues = (\n    matrix: Float32Array,\n    normalizeMatrix: Float32Array,\n    globeMatrix: Float32Array,\n    mercMatrix: Float32Array,\n    gridMatrix: Float32Array,\n    parentTL: [number, number],\n    zoomTransition: number,\n    mercatorCenter: [number, number],\n    cutoffParams: [number, number, number, number],\n    parentScaleBy: number,\n    fade: {mix: number, opacity: number},\n    elevation: number\n): UniformValues<RasterParticleUniformsType> => ({\n    'u_matrix': matrix,\n    'u_normalize_matrix': normalizeMatrix,\n    'u_globe_matrix': globeMatrix,\n    'u_merc_matrix': mercMatrix,\n    'u_grid_matrix': gridMatrix,\n    'u_tl_parent': parentTL,\n    'u_scale_parent': parentScaleBy,\n    'u_fade_t': fade.mix,\n    'u_opacity': fade.opacity,\n    'u_image0': 0,\n    'u_image1': 1,\n    'u_raster_elevation': elevation,\n    'u_zoom_transition': zoomTransition,\n    'u_merc_center': mercatorCenter,\n    'u_cutoff_params': cutoffParams\n});\n\nexport type RasterParticleTextureUniforms = {|\n    'u_texture': Uniform1i,\n    'u_opacity': Uniform1f\n|};\n\nconst rasterParticleTextureUniforms = (context: Context): RasterParticleTextureUniforms => ({\n    'u_texture': new Uniform1i(context),\n    'u_opacity': new Uniform1f(context)\n});\n\nconst rasterParticleTextureUniformValues = (\n    textureUnit: number,\n    opacity: number\n): UniformValues<RasterParticleTextureUniforms> => ({\n    'u_texture': textureUnit,\n    'u_opacity': opacity\n});\n\nexport type RasterParticleDrawUniformsType = {|\n    'u_particle_texture': Uniform1i,\n    'u_particle_texture_side_len': Uniform1f,\n    'u_tile_offset': Uniform2f,\n    'u_velocity': Uniform1i,\n    'u_color_ramp': Uniform1i,\n    'u_velocity_res': Uniform2f,\n    'u_max_speed': Uniform1f,\n    'u_uv_offset': Uniform2f,\n    'u_data_scale': Uniform4f,\n    'u_data_offset': Uniform1f,\n    'u_particle_pos_scale': Uniform1f,\n    'u_particle_pos_offset': Uniform2f\n|};\n\nconst rasterParticleDrawUniforms = (context: Context): RasterParticleDrawUniformsType => ({\n    'u_particle_texture': new Uniform1i(context),\n    'u_particle_texture_side_len': new Uniform1f(context),\n    'u_tile_offset': new Uniform2f(context),\n    'u_velocity': new Uniform1i(context),\n    'u_color_ramp': new Uniform1i(context),\n    'u_velocity_res': new Uniform2f(context),\n    'u_max_speed': new Uniform1f(context),\n    'u_uv_offset': new Uniform2f(context),\n    'u_data_scale': new Uniform4f(context),\n    'u_data_offset': new Uniform1f(context),\n    'u_particle_pos_scale': new Uniform1f(context),\n    'u_particle_pos_offset': new Uniform2f(context)\n});\n\nconst rasterParticleDrawUniformValues = (particleTextureUnit: number, particleTextureSideLen: number, tileOffset: [number, number], velocityTextureUnit: number, velocityTextureSize: [number, number], colorRampUnit: number, maxSpeed: number, textureOffset: [number, number], dataScale: [number, number, number, number], dataOffset: number): UniformValues<RasterParticleDrawUniformsType> => ({\n    'u_particle_texture': particleTextureUnit,\n    'u_particle_texture_side_len': particleTextureSideLen,\n    'u_tile_offset': tileOffset,\n    'u_velocity': velocityTextureUnit,\n    'u_color_ramp': colorRampUnit,\n    'u_velocity_res': velocityTextureSize,\n    'u_max_speed': maxSpeed,\n    'u_uv_offset': textureOffset,\n    'u_data_scale': dataScale,\n    'u_data_offset': dataOffset,\n    'u_particle_pos_scale': PARTICLE_POS_SCALE,\n    'u_particle_pos_offset': [PARTICLE_POS_OFFSET, PARTICLE_POS_OFFSET]\n});\n\nexport type RasterParticleUpdateUniformsType = {|\n    'u_particle_texture': Uniform1i,\n    'u_particle_texture_side_len': Uniform1f,\n    'u_velocity': Uniform1i,\n    'u_velocity_res': Uniform2f,\n    'u_max_speed': Uniform1f,\n    'u_speed_factor': Uniform1f,\n    'u_reset_rate': Uniform1f,\n    'u_rand_seed': Uniform1f,\n    'u_uv_offset': Uniform2f,\n    'u_data_scale': Uniform4f,\n    'u_data_offset': Uniform1f,\n    'u_particle_pos_scale': Uniform1f,\n    'u_particle_pos_offset': Uniform2f\n|};\n\nconst rasterParticleUpdateUniforms = (context: Context): RasterParticleUpdateUniformsType => ({\n    'u_particle_texture': new Uniform1i(context),\n    'u_particle_texture_side_len': new Uniform1f(context),\n    'u_velocity': new Uniform1i(context),\n    'u_velocity_res': new Uniform2f(context),\n    'u_max_speed': new Uniform1f(context),\n    'u_speed_factor': new Uniform1f(context),\n    'u_reset_rate': new Uniform1f(context),\n    'u_rand_seed': new Uniform1f(context),\n    'u_uv_offset': new Uniform2f(context),\n    'u_data_scale': new Uniform4f(context),\n    'u_data_offset': new Uniform1f(context),\n    'u_particle_pos_scale': new Uniform1f(context),\n    'u_particle_pos_offset': new Uniform2f(context)\n});\n\nconst rasterParticleUpdateUniformValues = (particleTextureUnit: number, particleTextureSideLen: number, velocityTextureUnit: number, velocityTextureSize: [number, number], maxSpeed: number, speedFactor: number, resetRate: number, textureOffset: [number, number], dataScale: [number, number, number, number], dataOffset: number): UniformValues<RasterParticleUpdateUniformsType> => ({\n    'u_particle_texture': particleTextureUnit,\n    'u_particle_texture_side_len': particleTextureSideLen,\n    'u_velocity': velocityTextureUnit,\n    'u_velocity_res': velocityTextureSize,\n    'u_max_speed': maxSpeed,\n    'u_speed_factor': speedFactor,\n    'u_reset_rate': resetRate,\n    'u_rand_seed': Math.random(),\n    'u_uv_offset': textureOffset,\n    'u_data_scale': dataScale,\n    'u_data_offset': dataOffset,\n    'u_particle_pos_scale': PARTICLE_POS_SCALE,\n    'u_particle_pos_offset': [PARTICLE_POS_OFFSET, PARTICLE_POS_OFFSET]\n});\n\nexport {rasterParticleUniforms, rasterParticleUniformValues, rasterParticleTextureUniforms, rasterParticleTextureUniformValues, rasterParticleDrawUniforms, rasterParticleDrawUniformValues, rasterParticleUpdateUniforms, rasterParticleUpdateUniformValues};\n","// @flow\n\nimport {\n    Uniform1i,\n    Uniform1f,\n    Uniform2f,\n    Uniform3f,\n    UniformMatrix4f\n} from '../uniform_binding.js';\nimport {mat4} from 'gl-matrix';\nimport {extend} from '../../util/util.js';\nimport browser from '../../util/browser.js';\nimport {OverscaledTileID} from '../../source/tile_id.js';\nimport type Context from '../../gl/context.js';\nimport type Painter from '../painter.js';\nimport type {UniformValues} from '../uniform_binding.js';\nimport {globeECEFOrigin} from '../../geo/projection/globe_util.js';\nimport type Projection from '../../geo/projection/projection.js';\n\nimport type {InterpolatedSize} from '../../symbol/symbol_size.js';\n\nexport type SymbolIconUniformsType = {|\n    'u_is_size_zoom_constant': Uniform1i,\n    'u_is_size_feature_constant': Uniform1i,\n    'u_size_t': Uniform1f,\n    'u_size': Uniform1f,\n    'u_camera_to_center_distance': Uniform1f,\n    'u_rotate_symbol': Uniform1i,\n    'u_aspect_ratio': Uniform1f,\n    'u_fade_change': Uniform1f,\n    'u_matrix': UniformMatrix4f,\n    'u_label_plane_matrix': UniformMatrix4f,\n    'u_coord_matrix': UniformMatrix4f,\n    'u_is_text': Uniform1i,\n    'u_pitch_with_map': Uniform1i,\n    'u_texsize': Uniform2f,\n    'u_tile_id': Uniform3f,\n    'u_zoom_transition': Uniform1f,\n    'u_inv_rot_matrix': UniformMatrix4f,\n    'u_merc_center': Uniform2f,\n    'u_camera_forward': Uniform3f,\n    'u_tile_matrix': UniformMatrix4f,\n    'u_up_vector': Uniform3f,\n    'u_ecef_origin': Uniform3f,\n    'u_texture': Uniform1i,\n    'u_icon_transition': Uniform1f,\n    'u_color_adj_mat': UniformMatrix4f,\n|};\n\nexport type SymbolSDFUniformsType = {|\n    'u_is_size_zoom_constant': Uniform1i,\n    'u_is_size_feature_constant': Uniform1i,\n    'u_size_t': Uniform1f,\n    'u_size': Uniform1f,\n    'u_camera_to_center_distance': Uniform1f,\n    'u_rotate_symbol': Uniform1i,\n    'u_aspect_ratio': Uniform1f,\n    'u_fade_change': Uniform1f,\n    'u_matrix': UniformMatrix4f,\n    'u_label_plane_matrix': UniformMatrix4f,\n    'u_coord_matrix': UniformMatrix4f,\n    'u_is_text': Uniform1i,\n    'u_pitch_with_map': Uniform1i,\n    'u_texsize': Uniform2f,\n    'u_texture': Uniform1i,\n    'u_gamma_scale': Uniform1f,\n    'u_device_pixel_ratio': Uniform1f,\n    'u_tile_id': Uniform3f,\n    'u_zoom_transition': Uniform1f,\n    'u_inv_rot_matrix': UniformMatrix4f,\n    'u_merc_center': Uniform2f,\n    'u_camera_forward': Uniform3f,\n    'u_tile_matrix': UniformMatrix4f,\n    'u_up_vector': Uniform3f,\n    'u_ecef_origin': Uniform3f,\n    'u_is_halo': Uniform1i\n|};\n\nexport type symbolTextAndIconUniformsType = {|\n    'u_is_size_zoom_constant': Uniform1i,\n    'u_is_size_feature_constant': Uniform1i,\n    'u_size_t': Uniform1f,\n    'u_size': Uniform1f,\n    'u_camera_to_center_distance': Uniform1f,\n    'u_rotate_symbol': Uniform1i,\n    'u_aspect_ratio': Uniform1f,\n    'u_fade_change': Uniform1f,\n    'u_matrix': UniformMatrix4f,\n    'u_label_plane_matrix': UniformMatrix4f,\n    'u_coord_matrix': UniformMatrix4f,\n    'u_is_text': Uniform1i,\n    'u_pitch_with_map': Uniform1i,\n    'u_texsize': Uniform2f,\n    'u_texsize_icon': Uniform2f,\n    'u_texture': Uniform1i,\n    'u_texture_icon': Uniform1i,\n    'u_gamma_scale': Uniform1f,\n    'u_device_pixel_ratio': Uniform1f,\n    'u_is_halo': Uniform1i\n|};\n\nexport type SymbolDefinesType = 'PITCH_WITH_MAP_TERRAIN';\n\nconst symbolIconUniforms = (context: Context): SymbolIconUniformsType => ({\n    'u_is_size_zoom_constant': new Uniform1i(context),\n    'u_is_size_feature_constant': new Uniform1i(context),\n    'u_size_t': new Uniform1f(context),\n    'u_size': new Uniform1f(context),\n    'u_camera_to_center_distance': new Uniform1f(context),\n    'u_rotate_symbol': new Uniform1i(context),\n    'u_aspect_ratio': new Uniform1f(context),\n    'u_fade_change': new Uniform1f(context),\n    'u_matrix': new UniformMatrix4f(context),\n    'u_label_plane_matrix': new UniformMatrix4f(context),\n    'u_coord_matrix': new UniformMatrix4f(context),\n    'u_is_text': new Uniform1i(context),\n    'u_pitch_with_map': new Uniform1i(context),\n    'u_texsize': new Uniform2f(context),\n    'u_tile_id': new Uniform3f(context),\n    'u_zoom_transition': new Uniform1f(context),\n    'u_inv_rot_matrix': new UniformMatrix4f(context),\n    'u_merc_center': new Uniform2f(context),\n    'u_camera_forward': new Uniform3f(context),\n    'u_tile_matrix': new UniformMatrix4f(context),\n    'u_up_vector': new Uniform3f(context),\n    'u_ecef_origin': new Uniform3f(context),\n    'u_texture': new Uniform1i(context),\n    'u_icon_transition': new Uniform1f(context),\n    'u_color_adj_mat': new UniformMatrix4f(context)\n});\n\nconst symbolSDFUniforms = (context: Context): SymbolSDFUniformsType => ({\n    'u_is_size_zoom_constant': new Uniform1i(context),\n    'u_is_size_feature_constant': new Uniform1i(context),\n    'u_size_t': new Uniform1f(context),\n    'u_size': new Uniform1f(context),\n    'u_camera_to_center_distance': new Uniform1f(context),\n    'u_rotate_symbol': new Uniform1i(context),\n    'u_aspect_ratio': new Uniform1f(context),\n    'u_fade_change': new Uniform1f(context),\n    'u_matrix': new UniformMatrix4f(context),\n    'u_label_plane_matrix': new UniformMatrix4f(context),\n    'u_coord_matrix': new UniformMatrix4f(context),\n    'u_is_text': new Uniform1i(context),\n    'u_pitch_with_map': new Uniform1i(context),\n    'u_texsize': new Uniform2f(context),\n    'u_texture': new Uniform1i(context),\n    'u_gamma_scale': new Uniform1f(context),\n    'u_device_pixel_ratio': new Uniform1f(context),\n    'u_tile_id': new Uniform3f(context),\n    'u_zoom_transition': new Uniform1f(context),\n    'u_inv_rot_matrix': new UniformMatrix4f(context),\n    'u_merc_center': new Uniform2f(context),\n    'u_camera_forward': new Uniform3f(context),\n    'u_tile_matrix': new UniformMatrix4f(context),\n    'u_up_vector': new Uniform3f(context),\n    'u_ecef_origin': new Uniform3f(context),\n    'u_is_halo': new Uniform1i(context)\n});\n\nconst symbolTextAndIconUniforms = (context: Context): symbolTextAndIconUniformsType => ({\n    'u_is_size_zoom_constant': new Uniform1i(context),\n    'u_is_size_feature_constant': new Uniform1i(context),\n    'u_size_t': new Uniform1f(context),\n    'u_size': new Uniform1f(context),\n    'u_camera_to_center_distance': new Uniform1f(context),\n    'u_rotate_symbol': new Uniform1i(context),\n    'u_aspect_ratio': new Uniform1f(context),\n    'u_fade_change': new Uniform1f(context),\n    'u_matrix': new UniformMatrix4f(context),\n    'u_label_plane_matrix': new UniformMatrix4f(context),\n    'u_coord_matrix': new UniformMatrix4f(context),\n    'u_is_text': new Uniform1i(context),\n    'u_pitch_with_map': new Uniform1i(context),\n    'u_texsize': new Uniform2f(context),\n    'u_texsize_icon': new Uniform2f(context),\n    'u_texture': new Uniform1i(context),\n    'u_texture_icon': new Uniform1i(context),\n    'u_gamma_scale': new Uniform1f(context),\n    'u_device_pixel_ratio': new Uniform1f(context),\n    'u_is_halo': new Uniform1i(context)\n});\n\nconst identityMatrix = mat4.create();\n\nconst symbolIconUniformValues = (\n    functionType: string,\n    size: ?InterpolatedSize,\n    rotateInShader: boolean,\n    pitchWithMap: boolean,\n    painter: Painter,\n    matrix: Float32Array,\n    labelPlaneMatrix: Float32Array,\n    glCoordMatrix: Float32Array,\n    isText: boolean,\n    texSize: [number, number],\n    coord: OverscaledTileID,\n    zoomTransition: number,\n    mercatorCenter: [number, number],\n    invMatrix: Float32Array,\n    upVector: [number, number, number],\n    projection: Projection,\n    colorAdjustmentMatrix: ?Float32Array,\n    transition: ?number,\n): UniformValues<SymbolIconUniformsType> => {\n    const transform = painter.transform;\n\n    const values = {\n        'u_is_size_zoom_constant': +(functionType === 'constant' || functionType === 'source'),\n        'u_is_size_feature_constant': +(functionType === 'constant' || functionType === 'camera'),\n        'u_size_t': size ? size.uSizeT : 0,\n        'u_size': size ? size.uSize : 0,\n        'u_camera_to_center_distance': transform.getCameraToCenterDistance(projection),\n        'u_rotate_symbol': +rotateInShader,\n        'u_aspect_ratio': transform.width / transform.height,\n        'u_fade_change': painter.options.fadeDuration ? painter.symbolFadeChange : 1,\n        'u_matrix': matrix,\n        'u_label_plane_matrix': labelPlaneMatrix,\n        'u_coord_matrix': glCoordMatrix,\n        'u_is_text': +isText,\n        'u_pitch_with_map': +pitchWithMap,\n        'u_texsize': texSize,\n        'u_texture': 0,\n        'u_tile_id': [0, 0, 0],\n        'u_zoom_transition': 0,\n        'u_inv_rot_matrix': identityMatrix,\n        'u_merc_center': [0, 0],\n        'u_camera_forward': [0, 0, 0],\n        'u_ecef_origin': [0, 0, 0],\n        'u_tile_matrix': identityMatrix,\n        'u_up_vector': [0, -1, 0],\n        'u_color_adj_mat': colorAdjustmentMatrix,\n        'u_icon_transition': transition ? transition : 0.0\n    };\n\n    if (projection.name === 'globe') {\n        values['u_tile_id'] = [coord.canonical.x, coord.canonical.y, 1 << coord.canonical.z];\n        values['u_zoom_transition'] = zoomTransition;\n        values['u_inv_rot_matrix'] = invMatrix;\n        values['u_merc_center'] = mercatorCenter;\n        values['u_camera_forward'] = ((transform._camera.forward(): any): [number, number, number]);\n        values['u_ecef_origin'] = globeECEFOrigin(transform.globeMatrix, coord.toUnwrapped());\n        values['u_tile_matrix'] = Float32Array.from(transform.globeMatrix);\n        values['u_up_vector'] = upVector;\n    }\n\n    /* $FlowFixMe[incompatible-return] */\n    return values;\n};\n\nconst symbolSDFUniformValues = (\n    functionType: string,\n    size: ?InterpolatedSize,\n    rotateInShader: boolean,\n    pitchWithMap: boolean,\n    painter: Painter,\n    matrix: Float32Array,\n    labelPlaneMatrix: Float32Array,\n    glCoordMatrix: Float32Array,\n    isText: boolean,\n    texSize: [number, number],\n    isHalo: boolean,\n    coord: OverscaledTileID,\n    zoomTransition: number,\n    mercatorCenter: [number, number],\n    invMatrix: Float32Array,\n    upVector: [number, number, number],\n    projection: Projection\n): UniformValues<SymbolSDFUniformsType> => {\n    return extend(symbolIconUniformValues(functionType, size, rotateInShader,\n        pitchWithMap, painter, matrix, labelPlaneMatrix, glCoordMatrix, isText,\n        texSize, coord, zoomTransition, mercatorCenter, invMatrix, upVector, projection), {\n        'u_gamma_scale': pitchWithMap ? painter.transform.getCameraToCenterDistance(projection) * Math.cos(painter.terrain ? 0 : painter.transform._pitch) : 1,\n        'u_device_pixel_ratio': browser.devicePixelRatio,\n        'u_is_halo': +isHalo,\n        undefined\n    });\n};\n\nconst symbolTextAndIconUniformValues = (\n    functionType: string,\n    size: ?InterpolatedSize,\n    rotateInShader: boolean,\n    pitchWithMap: boolean,\n    painter: Painter,\n    matrix: Float32Array,\n    labelPlaneMatrix: Float32Array,\n    glCoordMatrix: Float32Array,\n    texSizeSDF: [number, number],\n    texSizeIcon: [number, number],\n    coord: OverscaledTileID,\n    zoomTransition: number,\n    mercatorCenter: [number, number],\n    invMatrix: Float32Array,\n    upVector: [number, number, number],\n    projection: Projection\n): UniformValues<SymbolIconUniformsType> => {\n    return extend(symbolSDFUniformValues(functionType, size, rotateInShader,\n        pitchWithMap, painter, matrix, labelPlaneMatrix, glCoordMatrix, true, texSizeSDF,\n        true, coord, zoomTransition, mercatorCenter, invMatrix, upVector, projection), {\n        'u_texsize_icon': texSizeIcon,\n        'u_texture_icon': 1\n    });\n};\n\nexport {symbolIconUniforms, symbolSDFUniforms, symbolIconUniformValues, symbolSDFUniformValues, symbolTextAndIconUniformValues, symbolTextAndIconUniforms};\n","// @flow\n\nimport {bgPatternUniformValues} from './pattern.js';\nimport {\n    Uniform1i,\n    Uniform1f,\n    Uniform2f,\n    UniformColor,\n    UniformMatrix4f\n} from '../uniform_binding.js';\nimport {extend} from '../../util/util.js';\n\nimport type Painter from '../painter.js';\nimport type {UniformValues} from '../uniform_binding.js';\nimport type Context from '../../gl/context.js';\nimport type Color from '../../style-spec/util/color.js';\nimport type {OverscaledTileID} from '../../source/tile_id.js';\nimport type ResolvedImage from '../../style-spec/expression/types/resolved_image.js';\n\nexport type BackgroundUniformsType = {|\n    'u_matrix': UniformMatrix4f,\n    'u_emissive_strength': Uniform1f,\n    'u_opacity': Uniform1f,\n    'u_color': UniformColor\n|};\n\nexport type BackgroundPatternUniformsType = {|\n    'u_matrix': UniformMatrix4f,\n    'u_emissive_strength': Uniform1f,\n    'u_opacity': Uniform1f,\n    // pattern uniforms:\n    'u_image': Uniform1i,\n    'u_pattern_tl': Uniform2f,\n    'u_pattern_br': Uniform2f,\n    'u_texsize': Uniform2f,\n    'u_pattern_size': Uniform2f,\n    'u_pixel_coord_upper': Uniform2f,\n    'u_pixel_coord_lower': Uniform2f,\n    'u_tile_units_to_pixels': Uniform1f\n|};\n\nconst backgroundUniforms = (context: Context): BackgroundUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context),\n    'u_emissive_strength': new Uniform1f(context),\n    'u_opacity': new Uniform1f(context),\n    'u_color': new UniformColor(context)\n});\n\nconst backgroundPatternUniforms = (context: Context): BackgroundPatternUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context),\n    'u_emissive_strength': new Uniform1f(context),\n    'u_opacity': new Uniform1f(context),\n    'u_image': new Uniform1i(context),\n    'u_pattern_tl': new Uniform2f(context),\n    'u_pattern_br': new Uniform2f(context),\n    'u_texsize': new Uniform2f(context),\n    'u_pattern_size': new Uniform2f(context),\n    'u_pixel_coord_upper': new Uniform2f(context),\n    'u_pixel_coord_lower': new Uniform2f(context),\n    'u_tile_units_to_pixels': new Uniform1f(context)\n});\n\nconst backgroundUniformValues = (\n    matrix: Float32Array,\n    emissiveStrength: number,\n    opacity: number,\n    color: Color\n): UniformValues<BackgroundUniformsType> => ({\n    'u_matrix': matrix,\n    'u_emissive_strength': emissiveStrength,\n    'u_opacity': opacity,\n    'u_color': color\n});\n\nconst backgroundPatternUniformValues = (\n    matrix: Float32Array,\n    emissiveStrength: number,\n    opacity: number,\n    painter: Painter,\n    image: ResolvedImage,\n    scope: string,\n    tile: {tileID: OverscaledTileID, tileSize: number}\n): UniformValues<BackgroundPatternUniformsType> => extend(\n    bgPatternUniformValues(image, scope, painter, tile),\n    {\n        'u_matrix': matrix,\n        'u_emissive_strength': emissiveStrength,\n        'u_opacity': opacity\n    }\n);\n\nexport {\n    backgroundUniforms,\n    backgroundPatternUniforms,\n    backgroundUniformValues,\n    backgroundPatternUniformValues\n};\n","// @flow\n\nimport {mat3, mat4, vec3} from 'gl-matrix';\nimport {\n    Uniform1i,\n    Uniform1f,\n    Uniform3f,\n    Uniform4f,\n    UniformMatrix4f\n} from '../../../src/render/uniform_binding.js';\n\nimport Color from '../../../src/style-spec/util/color.js';\nimport ModelStyleLayer from '../../style/style_layer/model_style_layer.js';\nimport TextureSlots from '../texture_slots.js';\n\nimport type {UniformValues} from '../../../src/render/uniform_binding.js';\nimport type Context from '../../../src/gl/context.js';\nimport type Painter from '../../../src/render/painter.js';\nimport type {Material} from '../../data/model.js';\n\nexport type ModelUniformsType = {\n    'u_matrix': UniformMatrix4f,\n    'u_lighting_matrix': UniformMatrix4f,\n    'u_normal_matrix': UniformMatrix4f,\n    'u_node_matrix': UniformMatrix4f,\n    'u_lightpos': Uniform3f,\n    'u_lightintensity': Uniform1f,\n    'u_lightcolor': Uniform3f,\n    'u_camera_pos': Uniform3f,\n    'u_opacity': Uniform1f,\n    'u_baseColorFactor': Uniform4f,\n    'u_emissiveFactor': Uniform4f,\n    'u_metallicFactor': Uniform1f,\n    'u_roughnessFactor': Uniform1f,\n    'u_baseTextureIsAlpha': Uniform1i,\n    'u_alphaMask': Uniform1i,\n    'u_alphaCutoff': Uniform1f,\n    'u_baseColorTexture': Uniform1i,\n    'u_metallicRoughnessTexture': Uniform1i,\n    'u_normalTexture': Uniform1i,\n    'u_occlusionTexture': Uniform1i,\n    'u_emissionTexture': Uniform1i,\n    'u_color_mix': Uniform4f,\n    'u_aoIntensity': Uniform1f,\n    'u_emissive_strength': Uniform1f,\n    'u_occlusionTextureTransform': Uniform4f\n};\n\nconst modelUniforms = (context: Context): ModelUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context),\n    'u_lighting_matrix': new UniformMatrix4f(context),\n    'u_normal_matrix': new UniformMatrix4f(context),\n    'u_node_matrix': new UniformMatrix4f(context),\n    'u_lightpos': new Uniform3f(context),\n    'u_lightintensity': new Uniform1f(context),\n    'u_lightcolor': new Uniform3f(context),\n    'u_camera_pos': new Uniform3f(context),\n    'u_opacity': new Uniform1f(context),\n    'u_baseColorFactor': new Uniform4f(context),\n    'u_emissiveFactor': new Uniform4f(context),\n    'u_metallicFactor': new Uniform1f(context),\n    'u_roughnessFactor': new Uniform1f(context),\n    'u_baseTextureIsAlpha': new Uniform1i(context),\n    'u_alphaMask': new Uniform1i(context),\n    'u_alphaCutoff': new Uniform1f(context),\n    'u_baseColorTexture': new Uniform1i(context),\n    'u_metallicRoughnessTexture': new Uniform1i(context),\n    'u_normalTexture': new Uniform1i(context),\n    'u_occlusionTexture': new Uniform1i(context),\n    'u_emissionTexture': new Uniform1i(context),\n    'u_color_mix': new Uniform4f(context),\n    'u_aoIntensity': new Uniform1f(context),\n    'u_emissive_strength' : new Uniform1f(context),\n    'u_occlusionTextureTransform': new Uniform4f(context)\n\n});\n\nconst emptyMat4 = new Float32Array(mat4.identity([]));\n\nconst modelUniformValues = (\n    matrix: Float32Array,\n    lightingMatrix: Float32Array,\n    normalMatrix: Float32Array,\n    nodeMatrix: Float32Array,\n    painter: Painter,\n    opacity: number,\n    baseColorFactor: Color,\n    emissiveFactor: [number, number, number],\n    metallicFactor: number,\n    roughnessFactor: number,\n    material: Material,\n    emissiveStrength: number,\n    layer: ModelStyleLayer,\n    cameraPos: [number, number, number] = [0, 0, 0],\n    occlusionTextureTransform: ?[number, number, number, number]\n): UniformValues<ModelUniformsType> => {\n\n    const light = painter.style.light;\n    const _lp = light.properties.get('position');\n    const lightPos = [-_lp.x, -_lp.y, _lp.z];\n    const lightMat = mat3.create();\n    const anchor = light.properties.get('anchor');\n    if (anchor === 'viewport') {\n        mat3.fromRotation(lightMat, -painter.transform.angle);\n        vec3.transformMat3(lightPos, lightPos, lightMat);\n    }\n\n    const alphaMask = material.alphaMode === 'MASK';\n\n    const lightColor = light.properties.get('color');\n\n    const aoIntensity = layer.paint.get('model-ambient-occlusion-intensity');\n    const colorMix = layer.paint.get('model-color').constantOr(Color.white);\n    const colorMixIntensity = layer.paint.get('model-color-mix-intensity').constantOr(0.0);\n\n    const uniformValues = {\n        'u_matrix': matrix,\n        'u_lighting_matrix': lightingMatrix,\n        'u_normal_matrix': normalMatrix,\n        'u_node_matrix': nodeMatrix ? nodeMatrix : emptyMat4,\n        'u_lightpos': lightPos,\n        'u_lightintensity': light.properties.get('intensity'),\n        'u_lightcolor': [lightColor.r, lightColor.g, lightColor.b],\n        'u_camera_pos': cameraPos,\n        'u_opacity': opacity,\n        'u_baseTextureIsAlpha': 0,\n        'u_alphaMask': +alphaMask,\n        'u_alphaCutoff': material.alphaCutoff,\n        'u_baseColorFactor': [baseColorFactor.r, baseColorFactor.g, baseColorFactor.b, baseColorFactor.a],\n        'u_emissiveFactor': [emissiveFactor[0], emissiveFactor[1], emissiveFactor[2], 1.0],\n        'u_metallicFactor': metallicFactor,\n        'u_roughnessFactor': roughnessFactor,\n        'u_baseColorTexture': TextureSlots.BaseColor,\n        'u_metallicRoughnessTexture': TextureSlots.MetallicRoughness,\n        'u_normalTexture': TextureSlots.Normal,\n        'u_occlusionTexture': TextureSlots.Occlusion,\n        'u_emissionTexture': TextureSlots.Emission,\n        'u_color_mix': [colorMix.r, colorMix.g, colorMix.b, colorMixIntensity],\n        'u_aoIntensity': aoIntensity,\n        'u_emissive_strength': emissiveStrength,\n        'u_occlusionTextureTransform': occlusionTextureTransform ? occlusionTextureTransform : [0, 0, 0, 0]\n    };\n\n    return uniformValues;\n};\n\nexport type ModelDepthUniformsType = {|\n    'u_matrix': UniformMatrix4f,\n    'u_instance': UniformMatrix4f,\n    'u_node_matrix': UniformMatrix4f\n|};\n\nconst modelDepthUniforms = (context: Context): ModelDepthUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context),\n    'u_instance': new UniformMatrix4f(context),\n    'u_node_matrix': new UniformMatrix4f(context)\n});\n\nconst modelDepthUniformValues = (\n    matrix: Float32Array,\n    instance: Float32Array = emptyMat4,\n    nodeMatrix: Float32Array = emptyMat4\n): UniformValues<ModelDepthUniformsType> => {\n    return {\n        'u_matrix': matrix,\n        'u_instance': instance,\n        'u_node_matrix': nodeMatrix\n    };\n};\n\nexport {\n    modelUniforms,\n    modelUniformValues,\n    modelDepthUniforms,\n    modelDepthUniformValues\n};\n","// @flow\n\nimport type {CircleDefinesType} from './circle_program.js';\nimport type {RasterDefinesType} from './raster_program.js';\nimport type {RasterParticleDefinesType} from './raster_particle_program.js';\nimport type {SymbolDefinesType} from './symbol_program.js';\nimport type {LineDefinesType} from './line_program.js';\nimport type {HillshadeDefinesType} from \"./hillshade_program.js\";\nimport {fillExtrusionDepthUniforms, fillExtrusionUniforms, fillExtrusionPatternUniforms, fillExtrusionGroundEffectUniforms} from './fill_extrusion_program.js';\nimport {fillUniforms, fillPatternUniforms, fillOutlineUniforms, fillOutlinePatternUniforms} from './fill_program.js';\nimport {circleUniforms} from './circle_program.js';\nimport {collisionUniforms, collisionCircleUniforms} from './collision_program.js';\nimport {debugUniforms} from './debug_program.js';\nimport {clippingMaskUniforms} from './clipping_mask_program.js';\nimport {heatmapUniforms, heatmapTextureUniforms} from './heatmap_program.js';\nimport {hillshadeUniforms, hillshadePrepareUniforms} from './hillshade_program.js';\nimport {lineUniforms, linePatternUniforms} from './line_program.js';\nimport {rasterUniforms} from './raster_program.js';\nimport {rasterParticleUniforms, rasterParticleTextureUniforms, rasterParticleDrawUniforms, rasterParticleUpdateUniforms} from './raster_particle_program.js';\nimport {symbolIconUniforms, symbolSDFUniforms, symbolTextAndIconUniforms} from './symbol_program.js';\nimport {backgroundUniforms, backgroundPatternUniforms} from './background_program.js';\nimport {terrainRasterUniforms} from '../../terrain/terrain_raster_program.js';\nimport {skyboxUniforms, skyboxGradientUniforms} from './skybox_program.js';\nimport {skyboxCaptureUniforms} from './skybox_capture_program.js';\nimport {globeRasterUniforms, atmosphereUniforms} from '../../terrain/globe_raster_program.js';\nimport type {HeatmapDefinesType} from './heatmap_program.js';\nimport type {DebugDefinesType} from './debug_program.js';\nimport type {GlobeDefinesType} from '../../terrain/globe_raster_program.js';\n\nimport {modelUniforms, modelDepthUniforms} from '../../../3d-style/render/program/model_program.js';\nimport {groundShadowUniforms} from '../../../3d-style/render/program/ground_shadow_program.js';\nimport {starsUniforms} from '../../terrain/stars_program.js';\n\nexport type FogDefinesType = ['FOG', 'FOG_DITHERING'];\nexport type DynamicDefinesType = CircleDefinesType | SymbolDefinesType | LineDefinesType | HeatmapDefinesType | DebugDefinesType | GlobeDefinesType | RasterDefinesType | RasterParticleDefinesType | FogDefinesType | HillshadeDefinesType;\n\nexport const programUniforms = {\n    fillExtrusion: fillExtrusionUniforms,\n    fillExtrusionDepth: fillExtrusionDepthUniforms,\n    fillExtrusionPattern: fillExtrusionPatternUniforms,\n    fillExtrusionGroundEffect: fillExtrusionGroundEffectUniforms,\n    fill: fillUniforms,\n    fillPattern: fillPatternUniforms,\n    fillOutline: fillOutlineUniforms,\n    fillOutlinePattern: fillOutlinePatternUniforms,\n    circle: circleUniforms,\n    collisionBox: collisionUniforms,\n    collisionCircle: collisionCircleUniforms,\n    debug: debugUniforms,\n    clippingMask: clippingMaskUniforms,\n    heatmap: heatmapUniforms,\n    heatmapTexture: heatmapTextureUniforms,\n    hillshade: hillshadeUniforms,\n    hillshadePrepare: hillshadePrepareUniforms,\n    line: lineUniforms,\n    linePattern: linePatternUniforms,\n    raster: rasterUniforms,\n    rasterParticle: rasterParticleUniforms,\n    rasterParticleTexture: rasterParticleTextureUniforms,\n    rasterParticleDraw: rasterParticleDrawUniforms,\n    rasterParticleUpdate: rasterParticleUpdateUniforms,\n    symbolIcon: symbolIconUniforms,\n    symbolSDF: symbolSDFUniforms,\n    symbolTextAndIcon: symbolTextAndIconUniforms,\n    background: backgroundUniforms,\n    backgroundPattern: backgroundPatternUniforms,\n    terrainRaster: terrainRasterUniforms,\n    terrainDepth: terrainRasterUniforms,\n    skybox: skyboxUniforms,\n    skyboxGradient: skyboxGradientUniforms,\n    skyboxCapture: skyboxCaptureUniforms,\n    globeRaster: globeRasterUniforms,\n    globeAtmosphere: atmosphereUniforms,\n    model: modelUniforms,\n    modelDepth: modelDepthUniforms,\n    groundShadow: groundShadowUniforms,\n    stars: starsUniforms,\n};\n","// @flow\n\nimport {\n    UniformMatrix4f,\n    Uniform1i,\n    Uniform3f,\n    Uniform1f\n} from '../uniform_binding.js';\nimport {degToRad} from '../../util/util.js';\n\nimport type {UniformValues} from '../uniform_binding.js';\nimport type Context from '../../gl/context.js';\n\nexport type SkyboxUniformsType = {|\n    'u_matrix': UniformMatrix4f,\n    'u_sun_direction': Uniform3f,\n    'u_cubemap': Uniform1i,\n    'u_opacity': Uniform1f,\n    'u_temporal_offset': Uniform1f\n|};\n\nexport type SkyboxGradientlUniformsType = {|\n    'u_matrix': UniformMatrix4f,\n    'u_color_ramp': Uniform1i,\n    'u_center_direction': Uniform3f,\n    'u_radius': Uniform1f,\n    'u_opacity': Uniform1f,\n    'u_temporal_offset': Uniform1f,\n|};\n\nconst skyboxUniforms = (context: Context): SkyboxUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context),\n    'u_sun_direction': new Uniform3f(context),\n    'u_cubemap': new Uniform1i(context),\n    'u_opacity': new Uniform1f(context),\n    'u_temporal_offset': new Uniform1f(context)\n\n});\n\nconst skyboxUniformValues = (\n    matrix: Float32Array,\n    sunDirection: [number, number, number],\n    cubemap: number,\n    opacity: number,\n    temporalOffset: number\n): UniformValues<SkyboxUniformsType> => ({\n    'u_matrix': matrix,\n    'u_sun_direction': sunDirection,\n    'u_cubemap': cubemap,\n    'u_opacity': opacity,\n    'u_temporal_offset': temporalOffset\n});\n\nconst skyboxGradientUniforms = (context: Context): SkyboxGradientlUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context),\n    'u_color_ramp': new Uniform1i(context),\n    // radial gradient uniforms\n    'u_center_direction': new Uniform3f(context),\n    'u_radius': new Uniform1f(context),\n    'u_opacity': new Uniform1f(context),\n    'u_temporal_offset': new Uniform1f(context)\n});\n\nconst skyboxGradientUniformValues = (\n    matrix: Float32Array,\n    centerDirection: [number, number, number],\n    radius: number, //degrees\n    opacity: number,\n    temporalOffset: number\n): UniformValues<SkyboxGradientlUniformsType> => {\n    return {\n        'u_matrix': matrix,\n        'u_color_ramp': 0,\n        'u_center_direction': centerDirection,\n        'u_radius': degToRad(radius),\n        'u_opacity': opacity,\n        'u_temporal_offset': temporalOffset\n    };\n};\n\nexport {\n    skyboxUniforms,\n    skyboxUniformValues,\n    skyboxGradientUniforms,\n    skyboxGradientUniformValues\n};\n","// @flow\n\nimport type Color from '../../style-spec/util/color.js';\n\nimport {\n    UniformMatrix3f,\n    Uniform1f,\n    Uniform3f,\n    Uniform4f,\n} from '../uniform_binding.js';\nimport type {UniformValues} from '../uniform_binding.js';\nimport type Context from '../../gl/context.js';\n\nexport type SkyboxCaptureUniformsType = {|\n    'u_matrix_3f': UniformMatrix3f,\n    'u_sun_direction': Uniform3f,\n    'u_sun_intensity': Uniform1f,\n    'u_color_tint_r': Uniform4f,\n    'u_color_tint_m': Uniform4f,\n    'u_luminance': Uniform1f,\n|};\n\nconst skyboxCaptureUniforms = (context: Context): SkyboxCaptureUniformsType => ({\n    'u_matrix_3f': new UniformMatrix3f(context),\n    'u_sun_direction': new Uniform3f(context),\n    'u_sun_intensity': new Uniform1f(context),\n    'u_color_tint_r': new Uniform4f(context),\n    'u_color_tint_m': new Uniform4f(context),\n    'u_luminance': new Uniform1f(context),\n});\n\nconst skyboxCaptureUniformValues = (\n    matrix: Float32Array,\n    sunDirection: [number, number, number],\n    sunIntensity: number,\n    atmosphereColor: Color,\n    atmosphereHaloColor: Color\n): UniformValues<SkyboxCaptureUniformsType> => ({\n    'u_matrix_3f': matrix,\n    'u_sun_direction': sunDirection,\n    'u_sun_intensity': sunIntensity,\n    'u_color_tint_r': [\n        atmosphereColor.r,\n        atmosphereColor.g,\n        atmosphereColor.b,\n        atmosphereColor.a\n    ],\n    'u_color_tint_m': [\n        atmosphereHaloColor.r,\n        atmosphereHaloColor.g,\n        atmosphereHaloColor.b,\n        atmosphereHaloColor.a\n    ],\n    'u_luminance': 5e-5,\n});\n\nexport {\n    skyboxCaptureUniforms,\n    skyboxCaptureUniformValues,\n};\n","// @flow\n\nimport {\n    Uniform3f,\n    UniformMatrix4f,\n    Uniform1f,\n} from '../render/uniform_binding.js';\n\nimport type Context from '../gl/context.js';\nimport type {UniformValues} from '../render/uniform_binding.js';\nimport type {Mat4} from 'gl-matrix';\n\nexport type StarsUniformsType = {\n    'u_matrix': UniformMatrix4f,\n    'u_up': Uniform3f,\n    'u_right': Uniform3f,\n    'u_intensity_multiplier': Uniform1f\n};\n\nconst starsUniforms = (context: Context): StarsUniformsType => ({\n    'u_matrix': new UniformMatrix4f(context),\n    'u_up': new Uniform3f(context),\n    'u_right': new Uniform3f(context),\n    'u_intensity_multiplier': new Uniform1f(context),\n});\n\nconst starsUniformValues = (\n    matrix: Mat4,\n    up: [number, number, number],\n    right: [number, number, number],\n    intensityMultiplier: number,\n): UniformValues<StarsUniformsType> => ({\n    'u_matrix': Float32Array.from(matrix),\n    'u_up': up,\n    'u_right': right,\n    'u_intensity_multiplier': intensityMultiplier\n});\n\nexport {starsUniforms, starsUniformValues};\n","// @flow\n\nimport DepthMode from '../gl/depth_mode.js';\nimport StencilMode from '../gl/stencil_mode.js';\nimport CullFaceMode from '../gl/cull_face_mode.js';\nimport {collisionUniformValues, collisionCircleUniformValues} from './program/collision_program.js';\nimport {QuadTriangleArray, CollisionCircleLayoutArray} from '../data/array_types.js';\nimport {collisionCircleLayout} from '../data/bucket/symbol_attributes.js';\nimport SegmentVector from '../data/segment.js';\nimport {mat4} from 'gl-matrix';\nimport {getCollisionDebugTileProjectionMatrix} from '../geo/projection/projection_util.js';\nimport VertexBuffer from '../gl/vertex_buffer.js';\nimport IndexBuffer from '../gl/index_buffer.js';\n\nimport type Painter from './painter.js';\nimport type SourceCache from '../source/source_cache.js';\nimport type StyleLayer from '../style/style_layer.js';\nimport type {OverscaledTileID} from '../source/tile_id.js';\nimport type SymbolBucket from '../data/bucket/symbol_bucket.js';\nimport type Projection from '../geo/projection/projection.js';\n\nexport default drawCollisionDebug;\n\ntype TileBatch = {\n    circleArray: Array<number>,\n    circleOffset: number,\n    transform: Float32Array,\n    invTransform: Float32Array,\n    projection: Projection\n};\n\nlet quadTriangles: ?QuadTriangleArray;\n\nfunction drawCollisionDebug(painter: Painter, sourceCache: SourceCache, layer: StyleLayer, coords: Array<OverscaledTileID>, translate: [number, number], translateAnchor: 'map' | 'viewport', isText: boolean) {\n    const context = painter.context;\n    const gl = context.gl;\n    const tr = painter.transform;\n    const program = painter.getOrCreateProgram('collisionBox');\n    const tileBatches: Array<TileBatch> = [];\n    let circleCount = 0;\n    let circleOffset = 0;\n\n    for (let i = 0; i < coords.length; i++) {\n        const coord = coords[i];\n        const tile = sourceCache.getTile(coord);\n        const bucket: ?SymbolBucket = (tile.getBucket(layer): any);\n        if (!bucket) continue;\n\n        const tileMatrix = getCollisionDebugTileProjectionMatrix(coord, bucket, tr);\n\n        let posMatrix = tileMatrix;\n        if (translate[0] !== 0 || translate[1] !== 0) {\n            posMatrix = painter.translatePosMatrix(tileMatrix, tile, translate, translateAnchor);\n        }\n        const buffers = isText ? bucket.textCollisionBox : bucket.iconCollisionBox;\n        // Get collision circle data of this bucket\n        const circleArray: Array<number> = bucket.collisionCircleArray;\n        if (circleArray.length > 0) {\n            // We need to know the projection matrix that was used for projecting collision circles to the screen.\n            // This might vary between buckets as the symbol placement is a continous process. This matrix is\n            // required for transforming points from previous screen space to the current one\n            const invTransform = mat4.create();\n            const transform = posMatrix;\n\n            mat4.mul(invTransform, bucket.placementInvProjMatrix, tr.glCoordMatrix);\n            mat4.mul(invTransform, invTransform, bucket.placementViewportMatrix);\n\n            tileBatches.push({\n                circleArray,\n                circleOffset,\n                transform,\n                invTransform,\n                projection: bucket.getProjection()\n            });\n\n            circleCount += circleArray.length / 4;  // 4 values per circle\n            circleOffset = circleCount;\n        }\n        if (!buffers) continue;\n        if (painter.terrain) painter.terrain.setupElevationDraw(tile, program);\n        program.draw(painter, gl.LINES,\n            DepthMode.disabled, StencilMode.disabled,\n            painter.colorModeForRenderPass(),\n            CullFaceMode.disabled,\n            collisionUniformValues(posMatrix, tr, tile, bucket.getProjection()),\n            layer.id, buffers.layoutVertexBuffer, buffers.indexBuffer,\n            buffers.segments, null, tr.zoom, null,\n            [buffers.collisionVertexBuffer, buffers.collisionVertexBufferExt]);\n    }\n\n    if (!isText || !tileBatches.length) {\n        return;\n    }\n\n    // Render collision circles\n    const circleProgram = painter.getOrCreateProgram('collisionCircle');\n\n    // Construct vertex data\n    const vertexData = new CollisionCircleLayoutArray();\n    vertexData.resize(circleCount * 4);\n    vertexData._trim();\n\n    let vertexOffset = 0;\n\n    for (const batch of tileBatches) {\n        for (let i = 0; i < batch.circleArray.length / 4; i++) {\n            const circleIdx = i * 4;\n            const x = batch.circleArray[circleIdx + 0];\n            const y = batch.circleArray[circleIdx + 1];\n            const radius = batch.circleArray[circleIdx + 2];\n            const collision = batch.circleArray[circleIdx + 3];\n\n            // 4 floats per vertex, 4 vertices per quad\n            vertexData.emplace(vertexOffset++, x, y, radius, collision, 0);\n            vertexData.emplace(vertexOffset++, x, y, radius, collision, 1);\n            vertexData.emplace(vertexOffset++, x, y, radius, collision, 2);\n            vertexData.emplace(vertexOffset++, x, y, radius, collision, 3);\n        }\n    }\n    if (!quadTriangles || quadTriangles.length < circleCount * 2) {\n        quadTriangles = createQuadTriangles(circleCount);\n    }\n\n    const indexBuffer: IndexBuffer = context.createIndexBuffer(quadTriangles, true);\n    const vertexBuffer: VertexBuffer = context.createVertexBuffer(vertexData, collisionCircleLayout.members, true);\n\n    // Render batches\n    for (const batch of tileBatches) {\n        const uniforms = collisionCircleUniformValues(batch.transform, batch.invTransform, tr, batch.projection);\n\n        circleProgram.draw(\n            painter,\n            gl.TRIANGLES,\n            DepthMode.disabled,\n            StencilMode.disabled,\n            painter.colorModeForRenderPass(),\n            CullFaceMode.disabled,\n            uniforms,\n            layer.id,\n            vertexBuffer,\n            indexBuffer,\n            SegmentVector.simpleSegment(0, batch.circleOffset * 2, batch.circleArray.length, batch.circleArray.length / 2),\n            null,\n            tr.zoom);\n    }\n\n    vertexBuffer.destroy();\n    indexBuffer.destroy();\n}\n\nfunction createQuadTriangles(quadCount: number): QuadTriangleArray {\n    const triCount = quadCount * 2;\n    const array = new QuadTriangleArray();\n\n    array.resize(triCount);\n    array._trim();\n\n    // Two triangles and 4 vertices per quad.\n    for (let i = 0; i < triCount; i++) {\n        const idx = i * 6;\n\n        array.uint16[idx + 0] = i * 4 + 0;\n        array.uint16[idx + 1] = i * 4 + 1;\n        array.uint16[idx + 2] = i * 4 + 2;\n        array.uint16[idx + 3] = i * 4 + 2;\n        array.uint16[idx + 4] = i * 4 + 3;\n        array.uint16[idx + 5] = i * 4 + 0;\n    }\n\n    return array;\n}\n","// @flow\n\nimport Point from '@mapbox/point-geometry';\nimport drawCollisionDebug from './draw_collision_debug.js';\n\nimport SegmentVector from '../data/segment.js';\nimport * as symbolProjection from '../symbol/projection.js';\nimport * as symbolSize from '../symbol/symbol_size.js';\nimport {mat4, vec3, vec4} from 'gl-matrix';\nconst identityMat4 = mat4.create();\nimport StencilMode from '../gl/stencil_mode.js';\nimport DepthMode from '../gl/depth_mode.js';\nimport CullFaceMode from '../gl/cull_face_mode.js';\nimport {addDynamicAttributes} from '../data/bucket/symbol_bucket.js';\nimport {getAnchorAlignment, WritingMode} from '../symbol/shaping.js';\nimport ONE_EM from '../symbol/one_em.js';\nimport {evaluateVariableOffset} from '../symbol/symbol_layout.js';\nimport Tile from '../source/tile.js';\nimport type Transform from '../geo/transform.js';\nimport {\n    mercatorXfromLng,\n    mercatorYfromLat\n} from '../geo/mercator_coordinate.js';\nimport {globeToMercatorTransition} from '../geo/projection/globe_util.js';\n\nimport {\n    symbolIconUniformValues,\n    symbolSDFUniformValues,\n    symbolTextAndIconUniformValues\n} from './program/symbol_program.js';\nimport {getSymbolTileProjectionMatrix} from '../geo/projection/projection_util.js';\nimport type Painter from './painter.js';\nimport type SourceCache from '../source/source_cache.js';\nimport type SymbolStyleLayer from '../style/style_layer/symbol_style_layer.js';\nimport type SymbolBucket from '../data/bucket/symbol_bucket.js';\nimport type {SymbolBuffers} from '../data/bucket/symbol_bucket.js';\nimport Texture from '../render/texture.js';\nimport type ColorMode from '../gl/color_mode.js';\nimport {OverscaledTileID} from '../source/tile_id.js';\nimport type {UniformValues} from './uniform_binding.js';\nimport type {SymbolSDFUniformsType} from '../render/program/symbol_program.js';\nimport type {CrossTileID, VariableOffset} from '../symbol/placement.js';\nimport type {InterpolatedSize} from '../symbol/symbol_size';\nexport default drawSymbols;\n\ntype SymbolTileRenderState = {\n    segments: SegmentVector,\n    sortKey: number,\n    state: {\n        program: any,\n        buffers: SymbolBuffers,\n        uniformValues: any,\n        atlasTexture: Texture | null,\n        atlasTextureIcon: Texture | null,\n        atlasInterpolation: any,\n        atlasInterpolationIcon: any,\n        isSDF: boolean,\n        hasHalo: boolean,\n        tile: Tile,\n        labelPlaneMatrixInv: ?Float32Array\n    } | null\n};\n\ntype Alignment = 'auto' | 'map' | 'viewport';\n\nfunction drawSymbols(painter: Painter, sourceCache: SourceCache, layer: SymbolStyleLayer, coords: Array<OverscaledTileID>, variableOffsets: {[_: CrossTileID]: VariableOffset}) {\n    if (painter.renderPass !== 'translucent') return;\n\n    // Disable the stencil test so that labels aren't clipped to tile boundaries.\n    const stencilMode = StencilMode.disabled;\n    const colorMode = painter.colorModeForRenderPass();\n    const variablePlacement = layer.layout.get('text-variable-anchor');\n\n    //Compute variable-offsets before painting since icons and text data positioning\n    //depend on each other in this case.\n    if (variablePlacement) {\n        updateVariableAnchors(coords, painter, layer, sourceCache,\n            layer.layout.get('text-rotation-alignment'),\n            layer.layout.get('text-pitch-alignment'),\n            variableOffsets\n        );\n    }\n\n    const areIconsVisible = layer.paint.get('icon-opacity').constantOr(1) !== 0;\n    const areTextsVisible = layer.paint.get('text-opacity').constantOr(1) !== 0;\n\n    // Support of ordering of symbols and texts comes with possible sacrificing of performance\n    // because of switching of shader program for every render state from icon to SDF.\n    // To address this problem, let's use one-phase rendering only when sort key provided\n    if (layer.layout.get('symbol-sort-key').constantOr(1) !== undefined && (areIconsVisible || areTextsVisible)) {\n        drawLayerSymbols(painter, sourceCache, layer, coords, stencilMode, colorMode);\n    } else {\n        if (areIconsVisible) {\n            drawLayerSymbols(painter, sourceCache, layer, coords, stencilMode, colorMode, {onlyIcons: true});\n        }\n        if (areTextsVisible) {\n            drawLayerSymbols(painter, sourceCache, layer, coords, stencilMode, colorMode, {onlyText: true});\n        }\n    }\n\n    if (sourceCache.map.showCollisionBoxes) {\n        drawCollisionDebug(painter, sourceCache, layer, coords, layer.paint.get('text-translate'),\n            layer.paint.get('text-translate-anchor'), true);\n        drawCollisionDebug(painter, sourceCache, layer, coords, layer.paint.get('icon-translate'),\n            layer.paint.get('icon-translate-anchor'), false);\n    }\n}\n\nfunction computeGlobeCameraUp(transform: Transform): [number, number, number] {\n    const viewMatrix = transform._camera.getWorldToCamera(transform.worldSize, 1);\n    const viewToEcef = mat4.multiply([], viewMatrix, transform.globeMatrix);\n    mat4.invert(viewToEcef, viewToEcef);\n\n    const cameraUpVector = [0, 0, 0];\n    const up = [0, 1, 0, 0];\n    vec4.transformMat4(up, up,  viewToEcef);\n    cameraUpVector[0] = up[0];\n    cameraUpVector[1] = up[1];\n    cameraUpVector[2] = up[2];\n    vec3.normalize(cameraUpVector, cameraUpVector);\n\n    return cameraUpVector;\n}\n\nfunction calculateVariableRenderShift({width, height, anchor, textOffset, textScale}: VariableOffset, renderTextSize: number): Point {\n    const {horizontalAlign, verticalAlign} = getAnchorAlignment(anchor);\n    const shiftX = -(horizontalAlign - 0.5) * width;\n    const shiftY = -(verticalAlign - 0.5) * height;\n    const variableOffset = evaluateVariableOffset(anchor, textOffset);\n    return new Point(\n        (shiftX / textScale + variableOffset[0]) * renderTextSize,\n        (shiftY / textScale + variableOffset[1]) * renderTextSize\n    );\n}\n\nfunction updateVariableAnchors(coords: Array<OverscaledTileID>, painter: Painter, layer: SymbolStyleLayer, sourceCache: SourceCache, rotationAlignment: Alignment, pitchAlignment: Alignment, variableOffsets: { [_: CrossTileID]: VariableOffset }) {\n    const tr = painter.transform;\n    const rotateWithMap = rotationAlignment === 'map';\n    const pitchWithMap = pitchAlignment === 'map';\n\n    for (const coord of coords) {\n        const tile = sourceCache.getTile(coord);\n        const bucket: SymbolBucket = (tile.getBucket(layer): any);\n        if (!bucket || !bucket.text || !bucket.text.segments.get().length) {\n            continue;\n        }\n\n        const sizeData = bucket.textSizeData;\n        const size = symbolSize.evaluateSizeForZoom(sizeData, tr.zoom);\n        const tileMatrix = getSymbolTileProjectionMatrix(coord, bucket.getProjection(), tr);\n\n        const pixelsToTileUnits = tr.calculatePixelsToTileUnitsMatrix(tile);\n        const labelPlaneMatrix = symbolProjection.getLabelPlaneMatrixForRendering(tileMatrix, tile.tileID.canonical, pitchWithMap, rotateWithMap, tr, bucket.getProjection(), pixelsToTileUnits);\n        const updateTextFitIcon = bucket.hasIconTextFit() &&  bucket.hasIconData();\n\n        if (size) {\n            const tileScale = Math.pow(2, tr.zoom - tile.tileID.overscaledZ);\n            updateVariableAnchorsForBucket(bucket, rotateWithMap, pitchWithMap, variableOffsets, symbolSize,\n                                  tr, labelPlaneMatrix, coord, tileScale, size, updateTextFitIcon);\n        }\n    }\n}\n\nfunction updateVariableAnchorsForBucket(bucket: SymbolBucket, rotateWithMap: boolean, pitchWithMap: boolean, variableOffsets: { [_: CrossTileID]: VariableOffset }, symbolSize: typeof symbolSize, transform: Transform, labelPlaneMatrix: Float32Array, coord: OverscaledTileID, tileScale: number, size: InterpolatedSize, updateTextFitIcon: boolean) {\n    const placedSymbols = bucket.text.placedSymbolArray;\n    const dynamicTextLayoutVertexArray = bucket.text.dynamicLayoutVertexArray;\n    const dynamicIconLayoutVertexArray = bucket.icon.dynamicLayoutVertexArray;\n    const placedTextShifts = {};\n    const projection = bucket.getProjection();\n    const tileMatrix = getSymbolTileProjectionMatrix(coord, projection, transform);\n    const elevation = transform.elevation;\n    const metersToTile = projection.upVectorScale(coord.canonical, transform.center.lat, transform.worldSize).metersToTile;\n\n    dynamicTextLayoutVertexArray.clear();\n    for (let s = 0; s < placedSymbols.length; s++) {\n        const symbol = placedSymbols.get(s);\n        const {tileAnchorX, tileAnchorY, numGlyphs} = symbol;\n        const skipOrientation = bucket.allowVerticalPlacement && !symbol.placedOrientation;\n        const variableOffset = (!symbol.hidden && symbol.crossTileID && !skipOrientation) ? variableOffsets[symbol.crossTileID] : null;\n\n        if (!variableOffset) {\n            // These symbols are from a justification that is not being used, or a label that wasn't placed\n            // so we don't need to do the extra math to figure out what incremental shift to apply.\n            symbolProjection.hideGlyphs(numGlyphs, dynamicTextLayoutVertexArray);\n\n        } else  {\n            let dx = 0, dy = 0, dz = 0;\n            if (elevation) {\n                const h = elevation ? elevation.getAtTileOffset(coord, tileAnchorX, tileAnchorY) : 0.0;\n                const [ux, uy, uz] = projection.upVector(coord.canonical, tileAnchorX, tileAnchorY);\n                dx = h * ux * metersToTile;\n                dy = h * uy * metersToTile;\n                dz = h * uz * metersToTile;\n            }\n            let [x, y, z, w] = symbolProjection.project(\n                symbol.projectedAnchorX + dx,\n                symbol.projectedAnchorY + dy,\n                symbol.projectedAnchorZ + dz,\n                pitchWithMap ? tileMatrix : labelPlaneMatrix);\n\n            const perspectiveRatio = symbolProjection.getPerspectiveRatio(transform.getCameraToCenterDistance(projection), w);\n            let renderTextSize = symbolSize.evaluateSizeForFeature(bucket.textSizeData, size, symbol) * perspectiveRatio / ONE_EM;\n            if (pitchWithMap) {\n                // Go from size in pixels to equivalent size in tile units\n                renderTextSize *= bucket.tilePixelRatio / tileScale;\n            }\n\n            const shift = calculateVariableRenderShift(variableOffset, renderTextSize);\n\n            // Usual case is that we take the projected anchor and add the pixel-based shift\n            // calculated above. In the (somewhat weird) case of pitch-aligned text, we add an equivalent\n            // tile-unit based shift to the anchor before projecting to the label plane.\n            if (pitchWithMap) {\n                ({x, y, z} = projection.projectTilePoint(tileAnchorX + shift.x, tileAnchorY + shift.y, coord.canonical));\n                [x, y, z] = symbolProjection.project(x + dx, y + dy, z + dz, labelPlaneMatrix);\n\n            } else {\n                if (rotateWithMap) shift._rotate(-transform.angle);\n                x += shift.x;\n                y += shift.y;\n                z = 0;\n            }\n\n            const angle = (bucket.allowVerticalPlacement && symbol.placedOrientation === WritingMode.vertical) ? Math.PI / 2 : 0;\n            for (let g = 0; g < numGlyphs; g++) {\n                addDynamicAttributes(dynamicTextLayoutVertexArray, x, y, z, angle);\n            }\n            //Only offset horizontal text icons\n            if (updateTextFitIcon && symbol.associatedIconIndex >= 0) {\n                placedTextShifts[symbol.associatedIconIndex] = {x, y, z, angle};\n            }\n        }\n    }\n\n    if (updateTextFitIcon) {\n        dynamicIconLayoutVertexArray.clear();\n        const placedIcons = bucket.icon.placedSymbolArray;\n        for (let i = 0; i < placedIcons.length; i++) {\n            const placedIcon = placedIcons.get(i);\n            const {numGlyphs} = placedIcon;\n            const shift = placedTextShifts[i];\n\n            if (placedIcon.hidden || !shift) {\n                symbolProjection.hideGlyphs(numGlyphs, dynamicIconLayoutVertexArray);\n            } else {\n                const {x, y, z, angle} = shift;\n                for (let g = 0; g < numGlyphs; g++) {\n                    addDynamicAttributes(dynamicIconLayoutVertexArray, x, y, z, angle);\n                }\n            }\n        }\n        bucket.icon.dynamicLayoutVertexBuffer.updateData(dynamicIconLayoutVertexArray);\n    }\n    bucket.text.dynamicLayoutVertexBuffer.updateData(dynamicTextLayoutVertexArray);\n}\n\ntype DrawLayerSymbolsOptions = {\n    onlyIcons?: boolean;\n    onlyText?: boolean;\n}\n\nfunction drawLayerSymbols(\n    painter: Painter,\n    sourceCache: SourceCache,\n    layer: SymbolStyleLayer,\n    coords: Array<OverscaledTileID>,\n    stencilMode: StencilMode,\n    colorMode: ColorMode,\n    options: DrawLayerSymbolsOptions = {}\n) {\n    const iconTranslate = layer.paint.get('icon-translate');\n    const textTranslate = layer.paint.get('text-translate');\n    const iconTranslateAnchor = layer.paint.get('icon-translate-anchor');\n    const textTranslateAnchor = layer.paint.get('text-translate-anchor');\n    const iconRotationAlignment = layer.layout.get('icon-rotation-alignment');\n    const textRotationAlignment = layer.layout.get('text-rotation-alignment');\n    const iconPitchAlignment = layer.layout.get('icon-pitch-alignment');\n    const textPitchAlignment = layer.layout.get('text-pitch-alignment');\n    const iconKeepUpright = layer.layout.get('icon-keep-upright');\n    const textKeepUpright = layer.layout.get('text-keep-upright');\n    const iconSaturation = layer.paint.get('icon-color-saturation');\n    const iconContrast = layer.paint.get('icon-color-contrast');\n    const iconBrightnessMin = layer.paint.get('icon-color-brightness-min');\n    const iconBrightnessMax = layer.paint.get('icon-color-brightness-max');\n\n    const context = painter.context;\n    const gl = context.gl;\n    const tr = painter.transform;\n\n    const iconRotateWithMap = iconRotationAlignment === 'map';\n    const textRotateWithMap = textRotationAlignment === 'map';\n    const iconPitchWithMap = iconPitchAlignment === 'map';\n    const textPitchWithMap = textPitchAlignment === 'map';\n\n    const hasSortKey = layer.layout.get('symbol-sort-key').constantOr(1) !== undefined;\n    let sortFeaturesByKey = false;\n\n    const depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly);\n    const mercatorCenter = [\n        mercatorXfromLng(tr.center.lng),\n        mercatorYfromLat(tr.center.lat)\n    ];\n    const variablePlacement = layer.layout.get('text-variable-anchor');\n    const isGlobeProjection = tr.projection.name === 'globe';\n    const tileRenderState: Array<SymbolTileRenderState> = [];\n\n    const mercatorCameraUp = [0, -1, 0];\n\n    for (const coord of coords) {\n        const tile = sourceCache.getTile(coord);\n        const bucket: SymbolBucket = (tile.getBucket(layer): any);\n        if (!bucket) continue;\n        // Allow rendering of buckets built for globe projection in mercator mode\n        // until the substitute tile has been loaded\n        if (bucket.projection.name === 'mercator' && isGlobeProjection) {\n            continue;\n        }\n\n        if (bucket.fullyClipped) continue;\n\n        const bucketIsGlobeProjection = bucket.projection.name === 'globe';\n        const globeToMercator =  bucketIsGlobeProjection ? globeToMercatorTransition(tr.zoom) : 0.0;\n        const tileMatrix = getSymbolTileProjectionMatrix(coord, bucket.getProjection(), tr);\n\n        const s = tr.calculatePixelsToTileUnitsMatrix(tile);\n\n        const hasVariableAnchors = variablePlacement && bucket.hasTextData();\n        const updateTextFitIcon = bucket.hasIconTextFit() &&\n            hasVariableAnchors &&\n            bucket.hasIconData();\n\n        const invMatrix = bucket.getProjection().createInversionMatrix(tr, coord.canonical);\n\n        const getIconState = () => {\n            const alongLine = iconRotateWithMap && layer.layout.get('symbol-placement') !== 'point';\n\n            const baseDefines = ([]: any);\n            const projectedPosOnLabelSpace = alongLine || updateTextFitIcon;\n            const transitionProgress = layer.paint.get('icon-image-cross-fade').constantOr(0.0);\n            if (painter.terrainRenderModeElevated() && iconPitchWithMap) {\n                baseDefines.push('PITCH_WITH_MAP_TERRAIN');\n            }\n            if (bucketIsGlobeProjection) {\n                baseDefines.push('PROJECTION_GLOBE_VIEW');\n                if (projectedPosOnLabelSpace) {\n                    baseDefines.push('PROJECTED_POS_ON_VIEWPORT');\n                }\n            }\n            if (transitionProgress > 0.0) {\n                baseDefines.push('ICON_TRANSITION');\n            }\n            if (bucket.icon.zOffsetVertexBuffer) {\n                baseDefines.push('Z_OFFSET');\n            }\n\n            if (iconSaturation !== 0 || iconContrast !== 0 || iconBrightnessMin !== 0 || iconBrightnessMax !== 1) {\n                baseDefines.push('COLOR_ADJUSTMENT');\n            }\n\n            const programConfiguration = bucket.icon.programConfigurations.get(layer.id);\n            const program = painter.getOrCreateProgram(bucket.sdfIcons ? 'symbolSDF' : 'symbolIcon', {config: programConfiguration, defines: baseDefines});\n\n            let uniformValues;\n            const texSize = tile.imageAtlasTexture ? tile.imageAtlasTexture.size : [0, 0];\n            const sizeData = bucket.iconSizeData;\n            const size = symbolSize.evaluateSizeForZoom(sizeData, tr.zoom);\n            const transformed = iconPitchWithMap || tr.pitch !== 0;\n\n            const labelPlaneMatrixRendering = symbolProjection.getLabelPlaneMatrixForRendering(tileMatrix, tile.tileID.canonical, iconPitchWithMap, iconRotateWithMap, tr, bucket.getProjection(), s);\n            // labelPlaneMatrixInv is used for converting vertex pos to tile coordinates needed for sampling elevation.\n            const glCoordMatrix = symbolProjection.getGlCoordMatrix(tileMatrix, tile.tileID.canonical, iconPitchWithMap, iconRotateWithMap, tr, bucket.getProjection(), s);\n            const uglCoordMatrix = painter.translatePosMatrix(glCoordMatrix, tile, iconTranslate, iconTranslateAnchor, true);\n            const matrix = painter.translatePosMatrix(tileMatrix, tile, iconTranslate, iconTranslateAnchor);\n            const uLabelPlaneMatrix = projectedPosOnLabelSpace ? identityMat4 : labelPlaneMatrixRendering;\n            const rotateInShader = iconRotateWithMap && !iconPitchWithMap && !alongLine;\n\n            let globeCameraUp: [number, number, number] = mercatorCameraUp;\n            if ((isGlobeProjection || tr.mercatorFromTransition) && !iconRotateWithMap) {\n                // Each symbol rotating with the viewport requires per-instance information about\n                // how to align with the viewport. In 2D case rotation is shared between all of the symbols and\n                // hence embedded in the label plane matrix but in globe view this needs to be computed at runtime.\n                // Camera up vector together with surface normals can be used to find the correct orientation for each symbol.\n                globeCameraUp = computeGlobeCameraUp(tr);\n            }\n\n            const cameraUpVector = bucketIsGlobeProjection ? globeCameraUp : mercatorCameraUp;\n\n            if (bucket.sdfIcons && !bucket.iconsInText) {\n                uniformValues = symbolSDFUniformValues(sizeData.kind, size, rotateInShader, iconPitchWithMap, painter,\n                    matrix, uLabelPlaneMatrix, uglCoordMatrix, false, texSize, true, coord, globeToMercator, mercatorCenter, invMatrix, cameraUpVector, bucket.getProjection());\n            } else {\n                const colorAdjustmentMatrix = layer.getColorAdjustmentMatrix(iconSaturation, iconContrast, iconBrightnessMin, iconBrightnessMax);\n                uniformValues = symbolIconUniformValues(sizeData.kind, size, rotateInShader, iconPitchWithMap, painter, matrix,\n                    uLabelPlaneMatrix, uglCoordMatrix, false, texSize, coord, globeToMercator, mercatorCenter, invMatrix, cameraUpVector, bucket.getProjection(), colorAdjustmentMatrix, transitionProgress);\n            }\n\n            const atlasTexture = tile.imageAtlasTexture ? tile.imageAtlasTexture : null;\n            const iconScaled = layer.layout.get('icon-size').constantOr(0) !== 1 || bucket.iconsNeedLinear;\n            const atlasInterpolation = bucket.sdfIcons || painter.options.rotating || painter.options.zooming || iconScaled || transformed ? gl.LINEAR : gl.NEAREST;\n            const hasHalo = bucket.sdfIcons && layer.paint.get('icon-halo-width').constantOr(1) !== 0;\n            const labelPlaneMatrixInv = painter.terrain && iconPitchWithMap && alongLine ? mat4.invert(mat4.create(), labelPlaneMatrixRendering) : identityMat4;\n\n            // Line label rotation happens in `updateLineLabels`\n            // Pitched point labels are automatically rotated by the labelPlaneMatrix projection\n            // Unpitched point labels need to have their rotation applied after projection\n\n            if (alongLine && bucket.icon) {\n                const elevation = tr.elevation;\n                const getElevation = elevation ? elevation.getAtTileOffsetFunc(coord, tr.center.lat, tr.worldSize, bucket.getProjection()) : null;\n                const labelPlaneMatrixPlacement = symbolProjection.getLabelPlaneMatrixForPlacement(tileMatrix, tile.tileID.canonical, iconPitchWithMap, iconRotateWithMap, tr, bucket.getProjection(), s);\n\n                symbolProjection.updateLineLabels(bucket, tileMatrix, painter, false, labelPlaneMatrixPlacement, glCoordMatrix, iconPitchWithMap, iconKeepUpright, getElevation, coord);\n            }\n\n            return {\n                program,\n                buffers: bucket.icon,\n                uniformValues,\n                atlasTexture,\n                atlasTextureIcon: null,\n                atlasInterpolation,\n                atlasInterpolationIcon: null,\n                isSDF: bucket.sdfIcons,\n                hasHalo,\n                tile,\n                labelPlaneMatrixInv,\n            };\n        };\n\n        const getTextState = () => {\n            const alongLine = textRotateWithMap && layer.layout.get('symbol-placement') !== 'point';\n            const baseDefines = ([]: any);\n            const projectedPosOnLabelSpace = alongLine || variablePlacement || updateTextFitIcon;\n            if (painter.terrainRenderModeElevated() && textPitchWithMap) {\n                baseDefines.push('PITCH_WITH_MAP_TERRAIN');\n            }\n            if (bucketIsGlobeProjection) {\n                baseDefines.push('PROJECTION_GLOBE_VIEW');\n                if (projectedPosOnLabelSpace) {\n                    baseDefines.push('PROJECTED_POS_ON_VIEWPORT');\n                }\n            }\n            if (bucket.text.zOffsetVertexBuffer) {\n                baseDefines.push('Z_OFFSET');\n            }\n\n            const programConfiguration = bucket.text.programConfigurations.get(layer.id);\n            const program = painter.getOrCreateProgram(bucket.iconsInText ? 'symbolTextAndIcon' : 'symbolSDF', {config: programConfiguration, defines: baseDefines});\n\n            let texSizeIcon: [number, number] = [0, 0];\n            let atlasTextureIcon: Texture | null = null;\n            let atlasInterpolationIcon;\n\n            const sizeData = bucket.textSizeData;\n\n            if (bucket.iconsInText) {\n                texSizeIcon = tile.imageAtlasTexture ? tile.imageAtlasTexture.size : [0, 0];\n                atlasTextureIcon = tile.imageAtlasTexture ? tile.imageAtlasTexture : null;\n                const transformed = textPitchWithMap || tr.pitch !== 0;\n                const zoomDependentSize = sizeData.kind === 'composite' || sizeData.kind === 'camera';\n                atlasInterpolationIcon = transformed || painter.options.rotating || painter.options.zooming || zoomDependentSize ? gl.LINEAR : gl.NEAREST;\n            }\n\n            const texSize = tile.glyphAtlasTexture ? tile.glyphAtlasTexture.size : [0, 0];\n            const size = symbolSize.evaluateSizeForZoom(sizeData, tr.zoom);\n            const labelPlaneMatrixRendering = symbolProjection.getLabelPlaneMatrixForRendering(tileMatrix, tile.tileID.canonical, textPitchWithMap, textRotateWithMap, tr, bucket.getProjection(), s);\n            // labelPlaneMatrixInv is used for converting vertex pos to tile coordinates needed for sampling elevation.\n            const glCoordMatrix = symbolProjection.getGlCoordMatrix(tileMatrix, tile.tileID.canonical, textPitchWithMap, textRotateWithMap, tr, bucket.getProjection(), s);\n            const uglCoordMatrix = painter.translatePosMatrix(glCoordMatrix, tile, textTranslate, textTranslateAnchor, true);\n            const matrix = painter.translatePosMatrix(tileMatrix, tile, textTranslate, textTranslateAnchor);\n            const uLabelPlaneMatrix = projectedPosOnLabelSpace ? identityMat4 : labelPlaneMatrixRendering;\n\n            // Line label rotation happens in `updateLineLabels`\n            // Pitched point labels are automatically rotated by the labelPlaneMatrix projection\n            // Unpitched point labels need to have their rotation applied after projection\n            const rotateInShader = textRotateWithMap && !textPitchWithMap && !alongLine;\n\n            let globeCameraUp: [number, number, number] = mercatorCameraUp;\n            if ((isGlobeProjection || tr.mercatorFromTransition) && !textRotateWithMap) {\n                // Each symbol rotating with the viewport requires per-instance information about\n                // how to align with the viewport. In 2D case rotation is shared between all of the symbols and\n                // hence embedded in the label plane matrix but in globe view this needs to be computed at runtime.\n                // Camera up vector together with surface normals can be used to find the correct orientation for each symbol.\n                globeCameraUp = computeGlobeCameraUp(tr);\n            }\n\n            const cameraUpVector = bucketIsGlobeProjection ? globeCameraUp : mercatorCameraUp;\n\n            let uniformValues;\n\n            if (!bucket.iconsInText) {\n                uniformValues = symbolSDFUniformValues(sizeData.kind, size, rotateInShader, textPitchWithMap, painter,\n                    matrix, uLabelPlaneMatrix, uglCoordMatrix, true, texSize, true, coord, globeToMercator, mercatorCenter, invMatrix, cameraUpVector, bucket.getProjection());\n            } else {\n                uniformValues = symbolTextAndIconUniformValues(sizeData.kind, size, rotateInShader, textPitchWithMap, painter,\n                    matrix, uLabelPlaneMatrix, uglCoordMatrix, texSize, texSizeIcon, coord, globeToMercator, mercatorCenter, invMatrix, cameraUpVector, bucket.getProjection());\n            }\n\n            const atlasTexture = tile.glyphAtlasTexture ? tile.glyphAtlasTexture : null;\n            const atlasInterpolation = gl.LINEAR;\n            const hasHalo = layer.paint.get('text-halo-width').constantOr(1) !== 0;\n            const labelPlaneMatrixInv = painter.terrain && textPitchWithMap && alongLine ? mat4.invert(mat4.create(), labelPlaneMatrixRendering) : identityMat4;\n\n            if (alongLine && bucket.text) {\n                const elevation = tr.elevation;\n                const getElevation = elevation ? elevation.getAtTileOffsetFunc(coord, tr.center.lat, tr.worldSize, bucket.getProjection()) : null;\n                const labelPlaneMatrixPlacement = symbolProjection.getLabelPlaneMatrixForPlacement(tileMatrix, tile.tileID.canonical, textPitchWithMap, textRotateWithMap, tr, bucket.getProjection(), s);\n\n                symbolProjection.updateLineLabels(bucket, tileMatrix, painter, true, labelPlaneMatrixPlacement, glCoordMatrix, textPitchWithMap, textKeepUpright, getElevation, coord);\n            }\n\n            return {\n                program,\n                buffers: bucket.text,\n                uniformValues,\n                atlasTexture,\n                atlasTextureIcon,\n                atlasInterpolation,\n                atlasInterpolationIcon,\n                isSDF: true,\n                hasHalo,\n                tile,\n                labelPlaneMatrixInv,\n            };\n        };\n\n        const iconSegmentsLength = bucket.icon.segments.get().length;\n        const textSegmentsLength = bucket.text.segments.get().length;\n        const iconState = iconSegmentsLength && !options.onlyText ? getIconState() : null;\n        const textState = textSegmentsLength && !options.onlyIcons ? getTextState() : null;\n        const iconOpacity = layer.paint.get('icon-opacity').constantOr(1.0);\n        const textOpacity = layer.paint.get('text-opacity').constantOr(1.0);\n\n        if (hasSortKey && bucket.canOverlap) {\n            sortFeaturesByKey = true;\n            const oldIconSegments = iconOpacity && !options.onlyText ? bucket.icon.segments.get() : [];\n            const oldTextSegments = textOpacity && !options.onlyIcons ? bucket.text.segments.get() : [];\n\n            for (const segment of oldIconSegments) {\n                tileRenderState.push({\n                    segments: new SegmentVector([segment]),\n                    sortKey: ((segment.sortKey: any): number),\n                    state: iconState\n                });\n            }\n\n            for (const segment of oldTextSegments) {\n                tileRenderState.push({\n                    segments: new SegmentVector([segment]),\n                    sortKey: ((segment.sortKey: any): number),\n                    state: textState\n                });\n            }\n        } else {\n            if (!options.onlyText) {\n                tileRenderState.push({\n                    segments: iconOpacity ? bucket.icon.segments : new SegmentVector([]),\n                    sortKey: 0,\n                    state: iconState\n                });\n            }\n\n            if (!options.onlyIcons) {\n                tileRenderState.push({\n                    segments: textOpacity ? bucket.text.segments : new SegmentVector([]),\n                    sortKey: 0,\n                    state: textState\n                });\n            }\n        }\n    }\n\n    if (sortFeaturesByKey) {\n        tileRenderState.sort((a, b) => a.sortKey - b.sortKey);\n    }\n\n    for (const segmentState of tileRenderState) {\n        const state = segmentState.state;\n\n        if (!state) {\n            continue;\n        }\n\n        if (painter.terrain) {\n            const options = {\n                useDepthForOcclusion: tr.depthOcclusionForSymbolsAndCircles,\n                labelPlaneMatrixInv: state.labelPlaneMatrixInv\n            };\n            painter.terrain.setupElevationDraw(state.tile, state.program, options);\n        }\n        context.activeTexture.set(gl.TEXTURE0);\n        if (state.atlasTexture) {\n            state.atlasTexture.bind(state.atlasInterpolation, gl.CLAMP_TO_EDGE, true);\n        }\n        if (state.atlasTextureIcon) {\n            context.activeTexture.set(gl.TEXTURE1);\n            if (state.atlasTextureIcon) {\n                state.atlasTextureIcon.bind(state.atlasInterpolationIcon, gl.CLAMP_TO_EDGE, true);\n            }\n        }\n\n        painter.uploadCommonLightUniforms(painter.context, state.program);\n\n        if (state.hasHalo) {\n            const uniformValues = ((state.uniformValues: any): UniformValues<SymbolSDFUniformsType>);\n            uniformValues['u_is_halo'] = 1;\n            drawSymbolElements(state.buffers, segmentState.segments, layer, painter, state.program, depthMode, stencilMode, colorMode, uniformValues, 2);\n            uniformValues['u_is_halo'] = 0;\n        } else {\n            if (state.isSDF) {\n                const uniformValues = ((state.uniformValues: any): UniformValues<SymbolSDFUniformsType>);\n                if (state.hasHalo) {\n                    uniformValues['u_is_halo'] = 1;\n                    drawSymbolElements(state.buffers, segmentState.segments, layer, painter, state.program, depthMode, stencilMode, colorMode, uniformValues, 1);\n                }\n                uniformValues['u_is_halo'] = 0;\n            }\n            drawSymbolElements(state.buffers, segmentState.segments, layer, painter, state.program, depthMode, stencilMode, colorMode, state.uniformValues, 1);\n        }\n    }\n}\n\nfunction drawSymbolElements(buffers: SymbolBuffers, segments: SegmentVector, layer: SymbolStyleLayer, painter: Painter, program: any, depthMode: DepthMode, stencilMode: StencilMode, colorMode: ColorMode, uniformValues: UniformValues<SymbolSDFUniformsType>, instanceCount: number) {\n    const context = painter.context;\n    const gl = context.gl;\n    const dynamicBuffers = [buffers.dynamicLayoutVertexBuffer, buffers.opacityVertexBuffer, buffers.iconTransitioningVertexBuffer, buffers.globeExtVertexBuffer, buffers.zOffsetVertexBuffer];\n    program.draw(painter, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled,\n        uniformValues, layer.id, buffers.layoutVertexBuffer,\n        buffers.indexBuffer, segments, layer.paint,\n        painter.transform.zoom, buffers.programConfigurations.get(layer.id), dynamicBuffers,\n        instanceCount);\n}\n","// @flow\n\nimport Color from '../style-spec/util/color.js';\nimport DepthMode from '../gl/depth_mode.js';\nimport CullFaceMode from '../gl/cull_face_mode.js';\nimport {\n    fillUniformValues,\n    fillPatternUniformValues,\n    fillOutlineUniformValues,\n    fillOutlinePatternUniformValues\n} from './program/fill_program.js';\n\nimport type Painter from './painter.js';\nimport type SourceCache from '../source/source_cache.js';\nimport type FillStyleLayer from '../style/style_layer/fill_style_layer.js';\nimport type FillBucket from '../data/bucket/fill_bucket.js';\nimport type ColorMode from '../gl/color_mode.js';\nimport type {OverscaledTileID} from '../source/tile_id.js';\n\nexport default drawFill;\n\nfunction drawFill(painter: Painter, sourceCache: SourceCache, layer: FillStyleLayer, coords: Array<OverscaledTileID>) {\n    const color = layer.paint.get('fill-color');\n    const opacity = layer.paint.get('fill-opacity');\n\n    if (opacity.constantOr(1) === 0) {\n        return;\n    }\n\n    const emissiveStrength = layer.paint.get('fill-emissive-strength');\n    const colorMode = painter.colorModeForDrapableLayerRenderPass(emissiveStrength);\n\n    const pattern = layer.paint.get('fill-pattern');\n    const pass = painter.opaquePassEnabledForLayer() &&\n        (!pattern.constantOr((1: any)) &&\n        color.constantOr(Color.transparent).a === 1 &&\n        opacity.constantOr(0) === 1) ? 'opaque' : 'translucent';\n\n    // Draw fill\n    if (painter.renderPass === pass) {\n        const depthMode = painter.depthModeForSublayer(\n            1, painter.renderPass === 'opaque' ? DepthMode.ReadWrite : DepthMode.ReadOnly);\n        drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode, false);\n    }\n\n    // Draw stroke\n    if (painter.renderPass === 'translucent' && layer.paint.get('fill-antialias')) {\n\n        // If we defined a different color for the fill outline, we are\n        // going to ignore the bits in 0x07 and just care about the global\n        // clipping mask.\n        // Otherwise, we only want to drawFill the antialiased parts that are\n        // *outside* the current shape. This is important in case the fill\n        // or stroke color is translucent. If we wouldn't clip to outside\n        // the current shape, some pixels from the outline stroke overlapped\n        // the (non-antialiased) fill.\n        const depthMode = painter.depthModeForSublayer(\n            layer.getPaintProperty('fill-outline-color') ? 2 : 0, DepthMode.ReadOnly);\n        drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode, true);\n    }\n}\n\nfunction drawFillTiles(painter: Painter, sourceCache: SourceCache, layer: FillStyleLayer, coords: Array<OverscaledTileID>, depthMode: DepthMode, colorMode: ColorMode, isOutline: boolean) {\n    const gl = painter.context.gl;\n\n    const patternProperty = layer.paint.get('fill-pattern');\n    const image = patternProperty && patternProperty.constantOr((1: any));\n    let drawMode, programName, uniformValues, indexBuffer, segments;\n\n    if (!isOutline) {\n        programName = image ? 'fillPattern' : 'fill';\n        drawMode = gl.TRIANGLES;\n    } else {\n        programName = image && !layer.getPaintProperty('fill-outline-color') ? 'fillOutlinePattern' : 'fillOutline';\n        drawMode = gl.LINES;\n    }\n\n    for (const coord of coords) {\n        const tile = sourceCache.getTile(coord);\n        if (image && !tile.patternsLoaded()) continue;\n\n        const bucket: ?FillBucket = (tile.getBucket(layer): any);\n        if (!bucket) continue;\n        painter.prepareDrawTile();\n\n        const programConfiguration = bucket.programConfigurations.get(layer.id);\n        const affectedByFog = painter.isTileAffectedByFog(coord);\n        const program = painter.getOrCreateProgram(programName, {config: programConfiguration, overrideFog: affectedByFog});\n\n        if (image) {\n            painter.context.activeTexture.set(gl.TEXTURE0);\n            if (tile.imageAtlasTexture) {\n                tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n            }\n            programConfiguration.updatePaintBuffers();\n        }\n\n        const constantPattern = patternProperty.constantOr(null);\n        if (constantPattern && tile.imageAtlas) {\n            const atlas = tile.imageAtlas;\n            const posTo = atlas.patternPositions[constantPattern.toString()];\n            if (posTo) programConfiguration.setConstantPatternPositions(posTo);\n        }\n\n        const tileMatrix = painter.translatePosMatrix(coord.projMatrix, tile,\n            layer.paint.get('fill-translate'), layer.paint.get('fill-translate-anchor'));\n\n        const emissiveStrength = layer.paint.get('fill-emissive-strength');\n\n        if (!isOutline) {\n            indexBuffer = bucket.indexBuffer;\n            segments = bucket.segments;\n            uniformValues = image ?\n                fillPatternUniformValues(tileMatrix, emissiveStrength, painter, tile) :\n                fillUniformValues(tileMatrix, emissiveStrength);\n        } else {\n            indexBuffer = bucket.indexBuffer2;\n            segments = bucket.segments2;\n            const drawingBufferSize = (painter.terrain && painter.terrain.renderingToTexture) ? painter.terrain.drapeBufferSize : [gl.drawingBufferWidth, gl.drawingBufferHeight];\n            uniformValues = (programName === 'fillOutlinePattern' && image) ?\n                fillOutlinePatternUniformValues(tileMatrix, emissiveStrength, painter, tile, drawingBufferSize) :\n                fillOutlineUniformValues(tileMatrix, emissiveStrength, drawingBufferSize);\n        }\n\n        painter.uploadCommonUniforms(painter.context, program, coord.toUnwrapped());\n\n        program.draw(painter, drawMode, depthMode,\n            painter.stencilModeForClipping(coord), colorMode, CullFaceMode.disabled, uniformValues,\n            layer.id, bucket.layoutVertexBuffer, indexBuffer, segments,\n            layer.paint, painter.transform.zoom, programConfiguration, undefined);\n    }\n}\n","// @flow\n\nimport DepthMode from '../gl/depth_mode.js';\nimport StencilMode from '../gl/stencil_mode.js';\nimport ColorMode from '../gl/color_mode.js';\nimport CullFaceMode from '../gl/cull_face_mode.js';\nimport EXTENT from '../style-spec/data/extent.js';\nimport FillExtrusionBucket, {\n    GroundEffect,\n    fillExtrusionHeightLift,\n    PartData,\n    ELEVATION_SCALE,\n    ELEVATION_OFFSET,\n    HIDDEN_BY_REPLACEMENT,\n} from '../data/bucket/fill_extrusion_bucket.js';\nimport {\n    fillExtrusionUniformValues,\n    fillExtrusionDepthUniformValues,\n    fillExtrusionPatternUniformValues,\n    fillExtrusionGroundEffectUniformValues\n} from './program/fill_extrusion_program.js';\nimport Point from '@mapbox/point-geometry';\nimport {OverscaledTileID, neighborCoord} from '../source/tile_id.js';\nimport assert from 'assert';\nimport {mercatorXfromLng, mercatorYfromLat} from '../geo/mercator_coordinate.js';\nimport {globeToMercatorTransition} from '../geo/projection/globe_util.js';\nimport Context from '../gl/context.js';\nimport {Terrain} from '../terrain/terrain.js';\nimport Color from '../style-spec/util/color.js';\nimport Tile from '../source/tile.js';\nimport {calculateGroundShadowFactor} from '../../3d-style/render/shadow_renderer.js';\nimport {RGBAImage} from \"../util/image.js\";\nimport Texture from './texture.js';\n\nimport type Painter from './painter.js';\nimport type SourceCache from '../source/source_cache.js';\nimport type FillExtrusionStyleLayer from '../style/style_layer/fill_extrusion_style_layer.js';\nimport {Frustum} from '../util/primitives.js';\nimport {mat4} from \"gl-matrix\";\nimport {getCutoffParams} from './cutoff.js';\nimport {ZoomDependentExpression} from '../style-spec/expression/index.js';\n\nexport default draw;\n\ntype GroundEffectSubpassType = 'clear' | 'sdf' | 'color';\n\nfunction draw(painter: Painter, source: SourceCache, layer: FillExtrusionStyleLayer, coords: Array<OverscaledTileID>) {\n    const opacity = layer.paint.get('fill-extrusion-opacity');\n    const context = painter.context;\n    const gl = context.gl;\n    const terrain = painter.terrain;\n    const rtt = terrain && terrain.renderingToTexture;\n    if (opacity === 0) {\n        return;\n    }\n\n    // Update replacement used with model layer conflation\n    const conflateLayer = painter.conflationActive && painter.layerUsedInConflation(layer, source.getSource());\n\n    if (conflateLayer) {\n        updateReplacement(painter, source, layer, coords);\n    }\n\n    if (terrain || conflateLayer) {\n        for (const coord of coords) {\n            const tile = source.getTile(coord);\n            const bucket: ?FillExtrusionBucket = (tile.getBucket(layer): any);\n            if (!bucket) {\n                continue;\n            }\n\n            updateBorders(painter.context, source, coord, bucket, layer, terrain, conflateLayer);\n        }\n    }\n\n    if (painter.renderPass === 'shadow' && painter.shadowRenderer) {\n        const shadowRenderer = painter.shadowRenderer;\n        if (terrain) {\n            const noShadowCutoff = 0.65;\n            if (opacity < noShadowCutoff) {\n                const expression = layer._transitionablePaint._values['fill-extrusion-opacity'].value.expression;\n                if (expression instanceof ZoomDependentExpression) {\n                    // avoid rendering shadows during fade in / fade out on terrain\n                    return;\n                }\n            }\n        }\n        const depthMode = shadowRenderer.getShadowPassDepthMode();\n        const colorMode = shadowRenderer.getShadowPassColorMode();\n\n        drawExtrusionTiles(painter, source, layer, coords, depthMode, StencilMode.disabled, colorMode, conflateLayer);\n    } else if (painter.renderPass === 'translucent') {\n\n        const noPattern = !layer.paint.get('fill-extrusion-pattern').constantOr((1: any));\n        const color = layer.paint.get('fill-extrusion-color').constantOr(Color.white);\n\n        if (!rtt && color.a !== 0.0) {\n            const depthMode = new DepthMode(painter.context.gl.LEQUAL, DepthMode.ReadWrite, painter.depthRangeFor3D);\n\n            if (opacity === 1 && noPattern) {\n                drawExtrusionTiles(painter, source, layer, coords, depthMode, StencilMode.disabled, ColorMode.unblended, conflateLayer);\n            } else {\n                // Draw transparent buildings in two passes so that only the closest surface is drawn.\n                // First draw all the extrusions into only the depth buffer. No colors are drawn.\n                drawExtrusionTiles(painter, source, layer, coords, depthMode,\n                    StencilMode.disabled,\n                    ColorMode.disabled,\n                    conflateLayer);\n\n                // Then draw all the extrusions a second type, only coloring fragments if they have the\n                // same depth value as the closest fragment in the previous pass. Use the stencil buffer\n                // to prevent the second draw in cases where we have coincident polygons.\n                drawExtrusionTiles(painter, source, layer, coords, depthMode,\n                    painter.stencilModeFor3D(),\n                    painter.colorModeForRenderPass(),\n                    conflateLayer);\n\n                painter.resetStencilClippingMasks();\n            }\n        }\n\n        // Note that when rendering ground effects in immediate mode the implementation below assumes that the alpha channel of the main framebuffer is unused and set to 1.\n        // In draped mode this assumption no longer holds (since layer emissiveness is also encoded in the alpha channel) and therefore few more steps are required to implement the ground flood light and AO correctly.\n        const lighting3DMode = painter.style.enable3dLights();\n        const noTerrain = !terrain;\n        const noGlobe = painter.transform.projection.name !== 'globe';\n        const immediateMode = noTerrain && noGlobe;\n\n        if (lighting3DMode && noPattern && (immediateMode || rtt)) {\n            assert(immediateMode ? !rtt : !!rtt);\n\n            const opacity = layer.paint.get('fill-extrusion-opacity');\n            const aoIntensity = layer.paint.get('fill-extrusion-ambient-occlusion-intensity');\n            const aoRadius = layer.paint.get('fill-extrusion-ambient-occlusion-ground-radius');\n            const floodLightIntensity = layer.paint.get('fill-extrusion-flood-light-intensity');\n            const floodLightColor = layer.paint.get('fill-extrusion-flood-light-color').toArray01().slice(0, 3);\n            const aoEnabled = aoIntensity > 0 && aoRadius > 0;\n            const floodLightEnabled = floodLightIntensity > 0;\n\n            const lerp = (a: number, b: number, t: number) => { return (1 - t) * a + t * b; };\n\n            const passImmediate = (aoPass: boolean) => {\n                const depthMode = painter.depthModeForSublayer(1, DepthMode.ReadOnly, gl.LEQUAL, true);\n                const t = aoPass ? layer.paint.get('fill-extrusion-ambient-occlusion-ground-attenuation') : layer.paint.get('fill-extrusion-flood-light-ground-attenuation');\n                const attenuation = lerp(0.1, 3, t);\n                const showOverdraw = painter._showOverdrawInspector;\n\n                if (!showOverdraw) {\n                    // Mark the alpha channel with the DF values (that determine the intensity of the effects). No color is written.\n                    /* $FlowFixMe[incompatible-call] */\n                    const stencilSdfPass = new StencilMode({func: gl.ALWAYS, mask: 0xFF}, 0xFF, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE);\n                    const colorSdfPass = new ColorMode([gl.ONE, gl.ONE, gl.ONE, gl.ONE], Color.transparent, [false, false, false, true], gl.MIN);\n                    drawGroundEffect(painter, source, layer, coords, depthMode, stencilSdfPass, colorSdfPass, CullFaceMode.disabled, aoPass, 'sdf', opacity, aoIntensity, aoRadius, floodLightIntensity, floodLightColor, attenuation, conflateLayer, false);\n                }\n\n                {\n                    // Draw the effects.\n                    const stencilColorPass = showOverdraw ? StencilMode.disabled : new StencilMode({func: gl.EQUAL, mask: 0xFF}, 0xFF, 0xFF, gl.KEEP, gl.DECR, gl.DECR);\n                    const colorColorPass = showOverdraw ? painter.colorModeForRenderPass() : new ColorMode([gl.ONE_MINUS_DST_ALPHA, gl.DST_ALPHA, gl.ONE, gl.ONE], Color.transparent, [true, true, true, true]);\n                    drawGroundEffect(painter, source, layer, coords, depthMode, stencilColorPass, colorColorPass, CullFaceMode.disabled, aoPass, 'color', opacity, aoIntensity, aoRadius, floodLightIntensity, floodLightColor, attenuation, conflateLayer, false);\n                }\n            };\n\n            if (rtt) {\n                const passDraped = (aoPass: boolean, renderNeighbors: boolean, framebufferCopyTexture?: Texture) => {\n                    assert(framebufferCopyTexture);\n\n                    const depthMode = painter.depthModeForSublayer(1, DepthMode.ReadOnly, gl.LEQUAL, false);\n                    const t = aoPass ? layer.paint.get('fill-extrusion-ambient-occlusion-ground-attenuation') : layer.paint.get('fill-extrusion-flood-light-ground-attenuation');\n                    const attenuation = lerp(0.1, 3, t);\n\n                    {\n                        // Clear framebuffer's alpha channel to 1 since we're using gl.MIN blend operation in the subsequent steps.\n                        const colorMode = new ColorMode([gl.ONE, gl.ONE, gl.ONE, gl.ONE], Color.transparent, [false, false, false, true]);\n                        drawGroundEffect(painter, source, layer, coords, depthMode, StencilMode.disabled, colorMode, CullFaceMode.disabled, aoPass, 'clear', opacity, aoIntensity, aoRadius, floodLightIntensity, floodLightColor, attenuation, conflateLayer, renderNeighbors);\n                    }\n\n                    {\n                        // Mark the alpha channel with the DF values (that determine the intensity of the effects). No color is written.\n                        /* $FlowFixMe[incompatible-call] */\n                        const stencilSdfPass = new StencilMode({func: gl.ALWAYS, mask: 0xFF}, 0xFF, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE);\n                        const colorSdfPass = new ColorMode([gl.ONE, gl.ONE, gl.ONE, gl.ONE], Color.transparent, [false, false, false, true], gl.MIN);\n                        drawGroundEffect(painter, source, layer, coords, depthMode, stencilSdfPass, colorSdfPass, CullFaceMode.disabled, aoPass, 'sdf', opacity, aoIntensity, aoRadius, floodLightIntensity, floodLightColor, attenuation, conflateLayer, renderNeighbors);\n                    }\n\n                    {\n                        // Draw the effects. The inverse of the alpha channel is used so that in the next pass we can correctly incorporate it with the emissive strength values that are also encoded in the alpha channel (now present in the texture).\n                        const srcColorFactor = aoPass ? gl.ZERO : gl.ONE_MINUS_DST_ALPHA; // For AO, it's enough to multiply the color with the intensity.\n                        const stencilColorPass = new StencilMode({func: gl.EQUAL, mask: 0xFF}, 0xFF, 0xFF, gl.KEEP, gl.DECR, gl.DECR);\n                        const colorColorPass = new ColorMode([srcColorFactor, gl.DST_ALPHA, gl.ONE_MINUS_DST_ALPHA, gl.ZERO], Color.transparent, [true, true, true, true]);\n                        drawGroundEffect(painter, source, layer, coords, depthMode, stencilColorPass, colorColorPass, CullFaceMode.disabled, aoPass, 'color', opacity, aoIntensity, aoRadius, floodLightIntensity, floodLightColor, attenuation, conflateLayer, renderNeighbors);\n                    }\n\n                    {\n                        // Re-write to the alpha channel of the framebuffer based on existing values (of ground effects) and emissive values (saved to texture in earlier step).\n                        // Note that in draped mode an alpha value of 1 indicates fully emissiveness for a fragment and a value of 0 means fully lit (3d lighting).\n\n                        // We don't really need to encode the alpha values for AO as the layers have already been multiplied by its intensity. The gl.FUNC_ADD (as blending equation) and gl.ZERO (as dest alpha factor) would ensure this.\n                        const dstAlphaFactor = aoPass ? gl.ZERO : gl.ONE;\n                        const blendEquation = aoPass ? gl.FUNC_ADD : gl.MAX;\n                        const colorMode = new ColorMode([gl.ONE, gl.ONE, gl.ONE, dstAlphaFactor], Color.transparent, [false, false, false, true], blendEquation);\n                        drawGroundEffect(painter, source, layer, coords, depthMode, StencilMode.disabled, colorMode, CullFaceMode.disabled, aoPass, 'clear', opacity, aoIntensity, aoRadius, floodLightIntensity, floodLightColor, attenuation, conflateLayer, renderNeighbors, framebufferCopyTexture);\n                    }\n                };\n\n                if (aoEnabled || floodLightEnabled) {\n                    painter.prepareDrawTile();\n                    let framebufferCopyTexture;\n                    // Save the alpha channel of the framebuffer used by emissive layers.\n                    if (terrain) { // Condition is anywyas guaranteed by rtt variable. Used only to suppress flow errors.\n                        const width = terrain.drapeBufferSize[0];\n                        const height = terrain.drapeBufferSize[1];\n                        framebufferCopyTexture = terrain.framebufferCopyTexture;\n                        if (!framebufferCopyTexture || (framebufferCopyTexture && (framebufferCopyTexture.size[0] !== width || framebufferCopyTexture.size[1] !== height))) {\n                            if (framebufferCopyTexture) framebufferCopyTexture.destroy();\n                            framebufferCopyTexture = terrain.framebufferCopyTexture = new Texture(context,\n                                new RGBAImage({width, height}), gl.RGBA);\n                        }\n                        framebufferCopyTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n                        gl.copyTexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 0, 0, width, height, 0);\n                    }\n                    // Render ground AO.\n                    if (aoEnabled) {\n                        passDraped(true, false, framebufferCopyTexture);\n                    }\n                    // Render ground flood light.\n                    if (floodLightEnabled) {\n                        passDraped(false, true, framebufferCopyTexture);\n                    }\n                }\n            } else { // immediate mode\n                // Render ground AO.\n                if (aoEnabled) {\n                    passImmediate(true);\n                }\n                // Render ground flood light.\n                if (floodLightEnabled) {\n                    passImmediate(false);\n                }\n            }\n        }\n    }\n}\n\nfunction drawExtrusionTiles(painter: Painter, source: SourceCache, layer: FillExtrusionStyleLayer, coords: Array<OverscaledTileID>, depthMode: DepthMode, stencilMode: StencilMode, colorMode: ColorMode, replacementActive: boolean) {\n    layer.resetLayerRenderingStats(painter);\n    const context = painter.context;\n    const gl = context.gl;\n    const tr = painter.transform;\n    const patternProperty = layer.paint.get('fill-extrusion-pattern');\n    const image = patternProperty.constantOr((1: any));\n    const opacity = layer.paint.get('fill-extrusion-opacity');\n    const lighting3DMode = painter.style.enable3dLights();\n    const aoRadius = (lighting3DMode && !image) ? layer.paint.get('fill-extrusion-ambient-occlusion-wall-radius') : layer.paint.get('fill-extrusion-ambient-occlusion-radius');\n    const ao = [layer.paint.get('fill-extrusion-ambient-occlusion-intensity'), aoRadius];\n    const edgeRadius = layer.layout.get('fill-extrusion-edge-radius');\n    const zeroRoofRadius = edgeRadius > 0 && !layer.paint.get('fill-extrusion-rounded-roof');\n    const roofEdgeRadius = zeroRoofRadius ? 0.0 : edgeRadius;\n    const heightLift = tr.projection.name === 'globe' ? fillExtrusionHeightLift() : 0;\n    const isGlobeProjection = tr.projection.name === 'globe';\n    const globeToMercator = isGlobeProjection ? globeToMercatorTransition(tr.zoom) : 0.0;\n    const mercatorCenter = [mercatorXfromLng(tr.center.lng), mercatorYfromLat(tr.center.lat)];\n    const floodLightColor = (layer.paint.get('fill-extrusion-flood-light-color').toArray01().slice(0, 3): any);\n    const floodLightIntensity = layer.paint.get('fill-extrusion-flood-light-intensity');\n    const verticalScale = layer.paint.get('fill-extrusion-vertical-scale');\n    const cutoffParams = getCutoffParams(painter, layer.paint.get('fill-extrusion-cutoff-fade-range'));\n    const emissiveStrength = layer.paint.get('fill-extrusion-emissive-strength');\n    const baseDefines = ([]: any);\n    if (isGlobeProjection) {\n        baseDefines.push('PROJECTION_GLOBE_VIEW');\n    }\n    if (ao[0] > 0) { // intensity\n        baseDefines.push('FAUX_AO');\n    }\n    if (zeroRoofRadius) {\n        baseDefines.push('ZERO_ROOF_RADIUS');\n    }\n    if (replacementActive) {\n        baseDefines.push('HAS_CENTROID');\n    }\n    if (floodLightIntensity > 0) {\n        baseDefines.push('FLOOD_LIGHT');\n    }\n    if (cutoffParams.shouldRenderCutoff) {\n        baseDefines.push('RENDER_CUTOFF');\n    }\n\n    let singleCascadeDefines;\n\n    const isShadowPass = painter.renderPass === 'shadow';\n    const shadowRenderer = painter.shadowRenderer;\n    const drawDepth = isShadowPass && !!shadowRenderer;\n    if (painter.shadowRenderer) painter.shadowRenderer.useNormalOffset = true;\n\n    let groundShadowFactor: [number, number, number] = [0, 0, 0];\n    if (shadowRenderer) {\n        const directionalLight = painter.style.directionalLight;\n        const ambientLight = painter.style.ambientLight;\n        if (directionalLight && ambientLight) {\n            groundShadowFactor = calculateGroundShadowFactor(directionalLight, ambientLight);\n        }\n\n        singleCascadeDefines = baseDefines.concat(['SHADOWS_SINGLE_CASCADE']);\n    }\n\n    const programName = drawDepth ? 'fillExtrusionDepth' : (image ? 'fillExtrusionPattern' : 'fillExtrusion');\n    const stats = layer.getLayerRenderingStats();\n    for (const coord of coords) {\n        const tile = source.getTile(coord);\n        const bucket: ?FillExtrusionBucket = (tile.getBucket(layer): any);\n        if (!bucket || bucket.projection.name !== tr.projection.name) continue;\n\n        let singleCascade = false;\n        if (shadowRenderer) {\n            singleCascade = shadowRenderer.getMaxCascadeForTile(coord.toUnwrapped()) === 0;\n        }\n\n        const affectedByFog = painter.isTileAffectedByFog(coord);\n        const programConfiguration = bucket.programConfigurations.get(layer.id);\n        const program = painter.getOrCreateProgram(programName,\n            {config: programConfiguration, defines: singleCascade ? singleCascadeDefines : baseDefines, overrideFog: affectedByFog});\n\n        if (painter.terrain) {\n            const terrain = painter.terrain;\n            terrain.setupElevationDraw(tile, program, {useMeterToDem: true});\n        }\n\n        if (!bucket.centroidVertexBuffer) {\n            const attrIndex: number | void = program.attributes['a_centroid_pos'];\n            if (attrIndex !== undefined) gl.vertexAttrib2f(attrIndex, 0, 0);\n        }\n\n        if (!isShadowPass && shadowRenderer) {\n            shadowRenderer.setupShadows(tile.tileID.toUnwrapped(), program, 'vector-tile', tile.tileID.overscaledZ);\n        }\n\n        if (image) {\n            painter.context.activeTexture.set(gl.TEXTURE0);\n            if (tile.imageAtlasTexture) {\n                tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n            }\n            programConfiguration.updatePaintBuffers();\n        }\n        const constantPattern = patternProperty.constantOr(null);\n        if (constantPattern && tile.imageAtlas) {\n            const atlas = tile.imageAtlas;\n            const posTo = atlas.patternPositions[constantPattern.toString()];\n            if (posTo) programConfiguration.setConstantPatternPositions(posTo);\n        }\n\n        const shouldUseVerticalGradient = layer.paint.get('fill-extrusion-vertical-gradient');\n        let uniformValues;\n        if (isShadowPass && shadowRenderer) {\n            if (frustumCullShadowCaster(tile.tileID, bucket, painter)) {\n                continue;\n            }\n            const tileMatrix = shadowRenderer.calculateShadowPassMatrixFromTile(tile.tileID.toUnwrapped());\n            uniformValues = fillExtrusionDepthUniformValues(tileMatrix, roofEdgeRadius, verticalScale);\n        } else {\n            const matrix = painter.translatePosMatrix(\n                coord.expandedProjMatrix,\n                tile,\n                layer.paint.get('fill-extrusion-translate'),\n                layer.paint.get('fill-extrusion-translate-anchor'));\n\n            const invMatrix = tr.projection.createInversionMatrix(tr, coord.canonical);\n\n            if (image) {\n                uniformValues = fillExtrusionPatternUniformValues(matrix, painter, shouldUseVerticalGradient, opacity, ao, roofEdgeRadius, coord,\n                    tile, heightLift, globeToMercator, mercatorCenter, invMatrix, floodLightColor, verticalScale);\n            } else {\n                uniformValues = fillExtrusionUniformValues(matrix, painter, shouldUseVerticalGradient, opacity, ao, roofEdgeRadius, coord,\n                    heightLift, globeToMercator, mercatorCenter, invMatrix, floodLightColor, verticalScale, floodLightIntensity, groundShadowFactor, emissiveStrength);\n            }\n        }\n\n        painter.uploadCommonUniforms(context, program, coord.toUnwrapped(), null, cutoffParams);\n\n        assert(!isGlobeProjection || bucket.layoutVertexExtBuffer);\n\n        let segments = bucket.segments;\n        if (tr.projection.name === 'mercator' && !isShadowPass) {\n            segments = bucket.getVisibleSegments(tile.tileID, painter.terrain, painter.transform.getFrustum(0));\n            if (!segments.get().length) {\n                continue;\n            }\n        }\n        if (stats) {\n            if (!isShadowPass) {\n                for (const segment of segments.get()) {\n                    stats.numRenderedVerticesInTransparentPass += segment.primitiveLength;\n                }\n            } else {\n                for (const segment of segments.get()) {\n                    stats.numRenderedVerticesInShadowPass += segment.primitiveLength;\n                }\n            }\n        }\n        const dynamicBuffers = [];\n        if (painter.terrain || replacementActive) dynamicBuffers.push(bucket.centroidVertexBuffer);\n        if (isGlobeProjection) dynamicBuffers.push(bucket.layoutVertexExtBuffer);\n\n        program.draw(painter, context.gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.backCCW,\n            uniformValues, layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer,\n            segments, layer.paint, painter.transform.zoom,\n            programConfiguration, dynamicBuffers);\n    }\n\n    if (painter.shadowRenderer) painter.shadowRenderer.useNormalOffset = false;\n}\n\nfunction updateReplacement(painter: Painter, source: SourceCache, layer: FillExtrusionStyleLayer, coords: Array<OverscaledTileID>) {\n    for (const coord of coords) {\n        const tile = source.getTile(coord);\n        const bucket: ?FillExtrusionBucket = (tile.getBucket(layer): any);\n        if (!bucket) {\n            continue;\n        }\n        bucket.updateReplacement(coord, painter.replacementSource);\n        bucket.uploadCentroid(painter.context);\n    }\n}\n\nfunction drawGroundEffect(painter: Painter, source: SourceCache, layer: FillExtrusionStyleLayer, coords: Array<OverscaledTileID>, depthMode: DepthMode, stencilMode: StencilMode, colorMode: ColorMode, cullFaceMode: CullFaceMode, aoPass: boolean, subpass: GroundEffectSubpassType, opacity: number, aoIntensity: number, aoRadius: number, floodLightIntensity: number, floodLightColor: any, attenuation: number, replacementActive: boolean, renderNeighbors: boolean, framebufferCopyTexture: ?Texture) {\n    const context = painter.context;\n    const gl = context.gl;\n    const tr = painter.transform;\n    const zoom = painter.transform.zoom;\n    const defines = ([]: any);\n    const cutoffParams = getCutoffParams(painter, layer.paint.get('fill-extrusion-cutoff-fade-range'));\n    if (subpass === 'clear') {\n        defines.push('CLEAR_SUBPASS');\n        if (framebufferCopyTexture) {\n            defines.push('CLEAR_FROM_TEXTURE');\n            context.activeTexture.set(gl.TEXTURE0);\n            framebufferCopyTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n        }\n    } else if (subpass === 'sdf') {\n        defines.push('SDF_SUBPASS');\n    }\n    if (replacementActive) {\n        defines.push('HAS_CENTROID');\n    }\n    if (cutoffParams.shouldRenderCutoff) {\n        defines.push('RENDER_CUTOFF');\n    }\n    const edgeRadius = layer.layout.get('fill-extrusion-edge-radius');\n\n    const renderGroundEffectTile = (coord: OverscaledTileID, groundEffect: GroundEffect, segments: any, matrix: Float32Array, meterToTile: number) => {\n        const programConfiguration = groundEffect.programConfigurations.get(layer.id);\n        const affectedByFog = painter.isTileAffectedByFog(coord);\n        const program = painter.getOrCreateProgram('fillExtrusionGroundEffect', {config: programConfiguration, defines, overrideFog: affectedByFog});\n\n        const ao = [aoIntensity, aoRadius * meterToTile];\n        const edgeRadiusTile = zoom >= 17 ? 0 : edgeRadius * meterToTile;\n        const fbSize = framebufferCopyTexture ? framebufferCopyTexture.size[0] : 0;\n        const uniformValues = fillExtrusionGroundEffectUniformValues(painter, matrix, opacity, aoPass, meterToTile, ao, floodLightIntensity, floodLightColor, attenuation, edgeRadiusTile, fbSize);\n\n        const dynamicBuffers = [];\n        if (replacementActive) dynamicBuffers.push(groundEffect.hiddenByLandmarkVertexBuffer);\n\n        painter.uploadCommonUniforms(context, program, coord.toUnwrapped(), null, cutoffParams);\n\n        program.draw(painter, context.gl.TRIANGLES, depthMode, stencilMode, colorMode, cullFaceMode,\n            uniformValues, layer.id, groundEffect.vertexBuffer, groundEffect.indexBuffer,\n            segments, layer.paint, zoom,\n            programConfiguration, dynamicBuffers);\n    };\n\n    for (const coord of coords) {\n        const tile = source.getTile(coord);\n        const bucket: ?FillExtrusionBucket = (tile.getBucket(layer): any);\n        if (!bucket || bucket.projection.name !== tr.projection.name || !bucket.groundEffect || (bucket.groundEffect && !bucket.groundEffect.hasData())) continue;\n\n        const groundEffect: GroundEffect = (bucket.groundEffect: any);\n        const meterToTile = 1 / bucket.tileToMeter;\n        {\n            const matrix = painter.translatePosMatrix(\n                coord.projMatrix,\n                tile,\n                layer.paint.get('fill-extrusion-translate'),\n                layer.paint.get('fill-extrusion-translate-anchor'));\n\n            const segments = groundEffect.getDefaultSegment();\n            renderGroundEffectTile(coord, groundEffect, segments, matrix, meterToTile);\n        }\n\n        if (renderNeighbors) {\n            for (let i = 0; i < 4; i++) {\n                const nCoord = neighborCoord[i](coord);\n                const nTile = source.getTile(nCoord);\n                if (!nTile) continue;\n\n                const nBucket: ?FillExtrusionBucket = (nTile.getBucket(layer): any);\n                if (!nBucket || nBucket.projection.name !== tr.projection.name || !nBucket.groundEffect || (nBucket.groundEffect && !nBucket.groundEffect.hasData())) continue;\n\n                const nGroundEffect: GroundEffect = (nBucket.groundEffect: any);\n                assert(nGroundEffect.regionSegments);\n\n                let translation, regionId;\n                if (i === 0) { // left\n                    translation = [-EXTENT, 0, 0];\n                    regionId = 1;\n                } else if (i === 1) { // right\n                    translation = [EXTENT, 0, 0];\n                    regionId = 0;\n                } else if (i === 2) { // top\n                    translation = [0, -EXTENT, 0];\n                    regionId = 3;\n                } else { // bottom\n                    translation = [0, EXTENT, 0];\n                    regionId = 2;\n                }\n\n                const segments = nGroundEffect.regionSegments[regionId];\n                // No geometry from the neighbour tile intersects the current tile.\n                if (!segments) continue;\n\n                const proj = new Float32Array(16);\n                mat4.translate(proj, coord.projMatrix, translation);\n                const matrix = painter.translatePosMatrix(\n                    proj,\n                    tile,\n                    layer.paint.get('fill-extrusion-translate'),\n                    layer.paint.get('fill-extrusion-translate-anchor'));\n                renderGroundEffectTile(coord, nGroundEffect, segments, matrix, meterToTile);\n            }\n        }\n    }\n}\n\n// Flat roofs array is prepared in the bucket, except for buildings that are on tile borders.\n// For them, join pieces, calculate joined size here, and then upload data.\nfunction updateBorders(context: Context, source: SourceCache, coord: OverscaledTileID, bucket: FillExtrusionBucket, layer: FillExtrusionStyleLayer, terrain: ?Terrain, reconcileReplacementState: boolean) {\n    if (bucket.centroidVertexArray.length === 0) {\n        bucket.createCentroidsBuffer();\n    }\n\n    const demTile = terrain ? terrain.findDEMTileFor(coord) : null;\n    if ((!demTile || !demTile.dem) && !reconcileReplacementState) {\n        return;     // defer update until an elevation tile is available.\n    }\n\n    const reconcileReplacement = (centroid1: PartData, centroid2: PartData) => {\n        const hiddenFlag = (centroid1.flags | centroid2.flags) & HIDDEN_BY_REPLACEMENT;\n        if (hiddenFlag) {\n            centroid1.flags |= HIDDEN_BY_REPLACEMENT;\n            centroid2.flags |= HIDDEN_BY_REPLACEMENT;\n        } else {\n            centroid1.flags &= ~HIDDEN_BY_REPLACEMENT;\n            centroid2.flags &= ~HIDDEN_BY_REPLACEMENT;\n        }\n    };\n\n    const encodeHeightAsCentroid = (height: number) => {\n        return new Point(Math.ceil((height + ELEVATION_OFFSET) * ELEVATION_SCALE), 0);\n    };\n\n    const getLoadedBucket = (nid: OverscaledTileID) => {\n        const minzoom = source.getSource().minzoom;\n        const getBucket = (key: number) => {\n            const n = source.getTileByID(key);\n            if (n && n.hasData()) {\n                return n.getBucket(layer);\n            }\n        };\n        // Look one tile zoom above and under. We do this to avoid flickering and\n        // use the content in Z-1 and Z+1 buckets until Z bucket is loaded or handle\n        // behavior on borders between different zooms.\n        const zoomLevels = [0, -1, 1];\n        for (const i of zoomLevels) {\n            const z = nid.overscaledZ + i;\n            if (z < minzoom) continue;\n            const key = nid.calculateScaledKey(nid.overscaledZ + i);\n            const b = getBucket(key);\n            if (b) {\n                return b;\n            }\n        }\n    };\n\n    const projectedToBorder = [0, 0, 0]; // [min, max, maxOffsetFromBorder]\n    const xjoin = (a: PartData, b: PartData) => {\n        projectedToBorder[0] = Math.min(a.min.y, b.min.y);\n        projectedToBorder[1] = Math.max(a.max.y, b.max.y);\n        projectedToBorder[2] = EXTENT - b.min.x > a.max.x ? b.min.x - EXTENT : a.max.x;\n        return projectedToBorder;\n    };\n    const yjoin = (a: PartData, b: PartData) => {\n        projectedToBorder[0] = Math.min(a.min.x, b.min.x);\n        projectedToBorder[1] = Math.max(a.max.x, b.max.x);\n        projectedToBorder[2] = EXTENT - b.min.y > a.max.y ? b.min.y - EXTENT : a.max.y;\n        return projectedToBorder;\n    };\n    const projectCombinedSpanToBorder = [\n        (a: PartData, b: PartData) => xjoin(a, b),\n        (a: PartData, b: PartData) => xjoin(b, a),\n        (a: PartData, b: PartData) => yjoin(a, b),\n        (a: PartData, b: PartData) => yjoin(b, a)\n    ];\n\n    const error = 3; // Allow intrusion of a building to the building with adjacent wall.\n\n    const flatBase = (min: number, max: number, edge: number, neighborDEMTile: Tile, neighborTileID: OverscaledTileID, verticalEdge: boolean, maxOffsetFromBorder: number) => {\n        if (!terrain) {\n            return 0;\n        }\n        const points = [[verticalEdge ? edge : min, verticalEdge ? min : edge, 0], [verticalEdge ? edge : max, verticalEdge ? max : edge, 0]];\n\n        const coord3 = maxOffsetFromBorder < 0 ? EXTENT + maxOffsetFromBorder : maxOffsetFromBorder;\n        const thirdPoint = [verticalEdge ? coord3 : (min + max) / 2, verticalEdge ? (min + max) / 2 : coord3, 0];\n        if ((edge === 0 && maxOffsetFromBorder < 0) || (edge !== 0 && maxOffsetFromBorder > 0)) {\n            // Third point is inside neighbor tile, not in the |coord| tile.\n            terrain.getForTilePoints(neighborTileID, [thirdPoint], true, neighborDEMTile);\n        } else {\n            points.push(thirdPoint);\n        }\n        terrain.getForTilePoints(coord, points, true, demTile);\n        return Math.max(points[0][2], points[1][2], thirdPoint[2]) / terrain.exaggeration();\n    };\n\n    // Process all four borders: get neighboring tile\n    for (let i = 0; i < 4; i++) {\n        // sorted by border intersection area minimums, ascending.\n        const a = bucket.borderFeatureIndices[i];\n        if (a.length === 0) {\n            continue;\n        }\n\n        // Look up the neighbor tile's bucket\n        const nid = neighborCoord[i](coord);\n        const nBucket = getLoadedBucket(nid);\n        if (!nBucket || !(nBucket instanceof FillExtrusionBucket)) {\n            continue;\n        }\n        if (bucket.borderDoneWithNeighborZ[i] === nBucket.canonical.z) {\n            continue;\n        }\n\n        if (nBucket.centroidVertexArray.length === 0) {\n            nBucket.createCentroidsBuffer();\n        }\n\n        // Look up the neighbor DEM tile\n        const neighborDEMTile = terrain ? terrain.findDEMTileFor(nid) : null;\n        if ((!neighborDEMTile || !neighborDEMTile.dem) && !reconcileReplacementState) {\n            continue;\n        }\n\n        const j = (i < 2 ? 1 : 5) - i;\n        const updateNeighbor = nBucket.borderDoneWithNeighborZ[j] !== bucket.canonical.z;\n        const b = nBucket.borderFeatureIndices[j];\n        let ib = 0;\n\n        // If neighbors are of different canonical z, we cannot join parts but show\n        // all without flat roofs.\n        if (bucket.canonical.z !== nBucket.canonical.z) {\n            for (const index of a) {\n                bucket.showCentroid(bucket.featuresOnBorder[index]);\n            }\n            if (updateNeighbor) {\n                for (const index of b) {\n                    nBucket.showCentroid(nBucket.featuresOnBorder[index]);\n                }\n            }\n            bucket.borderDoneWithNeighborZ[i] = nBucket.canonical.z;\n            nBucket.borderDoneWithNeighborZ[j] = bucket.canonical.z;\n        }\n\n        for (const ia of a) {\n            const partA = bucket.featuresOnBorder[ia];\n            const centroidA = bucket.centroidData[partA.centroidDataIndex];\n            assert(partA.borders);\n            const partABorderRange = (partA.borders: any)[i];\n\n            // Find all nBucket parts that share the border overlap\n            let partB;\n            while (ib < b.length) {\n                // Pass all that are before the overlap\n                partB = nBucket.featuresOnBorder[b[ib]];\n                assert(partB.borders);\n                const partBBorderRange = (partB.borders: any)[j];\n                if (partBBorderRange[1] > partABorderRange[0] + error ||\n                    partBBorderRange[0] > partABorderRange[0] - error) {\n                    break;\n                }\n                nBucket.showCentroid(partB);\n                ib++;\n            }\n\n            if (partB && ib < b.length) {\n                const saveIb = ib;\n                let count = 0;\n                while (true) {\n                    // Collect all parts overlapping parta on the edge, to make sure it is only one.\n                    assert(partB.borders);\n                    const partBBorderRange = (partB.borders: any)[j];\n                    if (partBBorderRange[0] > partABorderRange[1] - error) {\n                        break;\n                    }\n                    count++;\n                    if (++ib === b.length) {\n                        break;\n                    }\n                    partB = nBucket.featuresOnBorder[b[ib]];\n                }\n                partB = nBucket.featuresOnBorder[b[saveIb]];\n                if (count > 1) {\n                    // if it can be concluded that it is the piece of the same feature,\n                    // use it, even following features (inner details) overlap on border edge.\n                    assert(partB.borders);\n                    const partBBorderRange = (partB.borders: any)[j];\n                    if (Math.abs(partABorderRange[0] - partBBorderRange[0]) < error &&\n                        Math.abs(partABorderRange[1] - partBBorderRange[1]) < error) {\n                        count = 1;\n                        ib = saveIb + 1;\n                    }\n                } else if (count === 0) {\n                    // No B for A, show it, no flat roofs.\n                    bucket.showCentroid(partA);\n                    continue;\n                }\n\n                const centroidB = nBucket.centroidData[partB.centroidDataIndex];\n                if (reconcileReplacementState && count === 1) {\n                    reconcileReplacement(centroidA, centroidB);\n                }\n\n                const moreThanOneBorderIntersected = partA.intersectsCount() > 1 || partB.intersectsCount() > 1;\n                if (count > 1) {\n                    ib = saveIb;    // rewind unprocessed ib so that it is processed again for the next ia.\n                    centroidA.centroidXY = centroidB.centroidXY = new Point(0, 0);\n                } else if (neighborDEMTile && neighborDEMTile.dem && !moreThanOneBorderIntersected) {\n                    // If any of a or b crosses more than one tile edge, don't support flat roof.\n                    // Now we have 1-1 matching of parts in both tiles that share the edge. Calculate flat base\n                    // elevation as average of three points: 2 are edge points (combined span projected to border) and\n                    // one is point of span that has maximum offset to border.\n                    const span = projectCombinedSpanToBorder[i](centroidA, centroidB);\n                    const edge = (i % 2) ? EXTENT - 1 : 0;\n\n                    const height = flatBase(span[0], Math.min(EXTENT - 1, span[1]), edge, neighborDEMTile, nid, i < 2, span[2]);\n                    centroidA.centroidXY = centroidB.centroidXY = encodeHeightAsCentroid(height);\n                }  else if (moreThanOneBorderIntersected) {\n                    centroidA.centroidXY = centroidB.centroidXY = new Point(0, 0);\n                } else {\n                    centroidA.centroidXY = bucket.encodeBorderCentroid(partA);\n                    centroidB.centroidXY = nBucket.encodeBorderCentroid(partB);\n                }\n\n                bucket.writeCentroidToBuffer(centroidA);\n                nBucket.writeCentroidToBuffer(centroidB);\n            } else {\n                bucket.showCentroid(partA);\n            }\n        }\n\n        bucket.borderDoneWithNeighborZ[i] = nBucket.canonical.z;\n        nBucket.borderDoneWithNeighborZ[j] = bucket.canonical.z;\n    }\n\n    if (bucket.needsCentroidUpdate || (!bucket.centroidVertexBuffer && bucket.centroidVertexArray.length !== 0)) {\n        bucket.uploadCentroid(context);\n    }\n}\n\nconst XAxis = [1, 0, 0];\nconst YAxis = [0, 1, 0];\nconst ZAxis = [0, 0, 1];\n\nfunction frustumCullShadowCaster(id: OverscaledTileID, bucket: FillExtrusionBucket, painter: Painter): boolean {\n    const transform = painter.transform;\n    const shadowRenderer = painter.shadowRenderer;\n    if (!shadowRenderer) {\n        return true;\n    }\n\n    const unwrappedId = id.toUnwrapped();\n\n    const ws = transform.tileSize * shadowRenderer._cascades[painter.currentShadowCascade].scale;\n\n    let height = bucket.maxHeight;\n    if (transform.elevation) {\n        const minmax = transform.elevation.getMinMaxForTile(id);\n        if (minmax) {\n            height += minmax.max;\n        }\n    }\n    const shadowDir = [...shadowRenderer.shadowDirection];\n    shadowDir[2] = -shadowDir[2];\n\n    const tileShadowVolume = shadowRenderer.computeSimplifiedTileShadowVolume(unwrappedId, height, ws, shadowDir);\n    if (!tileShadowVolume) {\n        return false;\n    }\n\n    // Projected shadow volume has 3-6 unique edge direction vectors.\n    // These are used for computing remaining separating axes for the intersection test\n    const edges = [XAxis, YAxis, ZAxis, shadowDir, [shadowDir[0], 0, shadowDir[2]], [0, shadowDir[1], shadowDir[2]]];\n    const isGlobe = transform.projection.name === 'globe';\n    const zoom = transform.scaleZoom(ws);\n    const cameraFrustum = Frustum.fromInvProjectionMatrix(transform.invProjMatrix, transform.worldSize, zoom, !isGlobe);\n    const cascadeFrustum = shadowRenderer.getCurrentCascadeFrustum();\n    if (cameraFrustum.intersectsPrecise(tileShadowVolume.vertices, tileShadowVolume.planes, edges) === 0) {\n        return true;\n    }\n    if (cascadeFrustum.intersectsPrecise(tileShadowVolume.vertices, tileShadowVolume.planes, edges) === 0) {\n        return true;\n    }\n    return false;\n}\n","// @flow\n\nimport assert from 'assert';\nimport ImageSource from '../source/image_source.js';\nimport StencilMode from '../gl/stencil_mode.js';\nimport DepthMode from '../gl/depth_mode.js';\nimport CullFaceMode from '../gl/cull_face_mode.js';\nimport Texture from './texture.js';\nimport {rasterPoleUniformValues, rasterUniformValues} from './program/raster_program.js';\n\nimport {OverscaledTileID, CanonicalTileID} from '../source/tile_id.js';\nimport rasterFade from './raster_fade.js';\nimport {\n    calculateGlobeMercatorMatrix,\n    getGridMatrix,\n    globeNormalizeECEF,\n    globePoleMatrixForTile,\n    globeTileBounds,\n    globeToMercatorTransition,\n    getLatitudinalLod,\n    tileCornersToBounds,\n} from \"../geo/projection/globe_util.js\";\nimport {GLOBE_ZOOM_THRESHOLD_MIN} from '../geo/projection/globe_constants.js';\nimport {mat4} from \"gl-matrix\";\nimport {mercatorXfromLng, mercatorYfromLat} from \"../geo/mercator_coordinate.js\";\nimport Transform from '../geo/transform.js';\nimport {COLOR_MIX_FACTOR} from '../style/style_layer/raster_style_layer.js';\nimport RasterArrayTile from '../source/raster_array_tile.js';\nimport RasterArrayTileSource from '../source/raster_array_tile_source.js';\n\nimport type Tile from '../source/tile.js';\nimport type Context from '../gl/context.js';\nimport type Painter from './painter.js';\nimport type SourceCache from '../source/source_cache.js';\nimport type RasterStyleLayer from '../style/style_layer/raster_style_layer.js';\nimport type {Source} from '../source/source.js';\nimport type {UserManagedTexture} from './texture.js';\nimport type {DynamicDefinesType} from '../render/program/program_uniforms.js';\n\nexport default drawRaster;\n\nconst RASTER_COLOR_TEXTURE_UNIT = 2;\n\ntype RasterConfig = {\n    defines: DynamicDefinesType[];\n    mix: [number, number, number, number];\n    range: [number, number];\n    offset: number;\n    resampling: number;\n};\n\nfunction adjustColorMix(colorMix: [number, number, number, number]): [number, number, number, number] {\n    // Adjust colorMix by the color mix factor to get the proper values for the `computeRasterColorMix` function\n    // For more details refer to `computeRasterColorMix` in src/style/style_layer/raster_style_layer.js\n    return [\n        colorMix[0] * COLOR_MIX_FACTOR,\n        colorMix[1] * COLOR_MIX_FACTOR,\n        colorMix[2] * COLOR_MIX_FACTOR,\n        0\n    ];\n}\n\nfunction drawRaster(painter: Painter, sourceCache: SourceCache, layer: RasterStyleLayer, tileIDs: Array<OverscaledTileID>, variableOffsets: any, isInitialLoad: boolean) {\n    if (painter.renderPass !== 'translucent') return;\n    if (layer.paint.get('raster-opacity') === 0) return;\n    const isGlobeProjection = painter.transform.projection.name === 'globe';\n    const renderingWithElevation = layer.paint.get('raster-elevation') !== 0.0;\n    const renderingElevatedOnGlobe = renderingWithElevation && isGlobeProjection;\n    if (painter.renderElevatedRasterBackface && !renderingElevatedOnGlobe) {\n        return;\n    }\n\n    const context = painter.context;\n    const gl = context.gl;\n    const source = sourceCache.getSource();\n\n    const rasterConfig = configureRaster(source, layer, context, gl);\n\n    if (source instanceof ImageSource && !tileIDs.length) {\n        if (!isGlobeProjection) {\n            return;\n        }\n    }\n\n    const emissiveStrength = layer.paint.get('raster-emissive-strength');\n    const colorMode = painter.colorModeForDrapableLayerRenderPass(emissiveStrength);\n\n    // When rendering to texture, coordinates are already sorted: primary by\n    // proxy id and secondary sort is by Z.\n    const renderingToTexture = painter.terrain && painter.terrain.renderingToTexture;\n\n    const align = !painter.options.moving;\n    const textureFilter = layer.paint.get('raster-resampling') === 'nearest' ? gl.NEAREST : gl.LINEAR;\n\n    if (source instanceof ImageSource && !tileIDs.length && (source.onNorthPole || source.onSouthPole)) {\n        const stencilMode = renderingWithElevation ? painter.stencilModeFor3D() : StencilMode.disabled;\n        if (source.onNorthPole) {\n            drawPole(true, null, painter, sourceCache, layer, emissiveStrength, rasterConfig, CullFaceMode.disabled, stencilMode);\n        } else {\n            drawPole(false, null, painter, sourceCache, layer, emissiveStrength, rasterConfig, CullFaceMode.disabled, stencilMode);\n        }\n        return;\n    }\n\n    if (!tileIDs.length) {\n        return;\n    }\n    const [stencilModes, coords] = source instanceof ImageSource || renderingToTexture ? [{}, tileIDs] :\n        painter.stencilConfigForOverlap(tileIDs);\n    const minTileZ = coords[coords.length - 1].overscaledZ;\n\n    if (renderingElevatedOnGlobe) {\n        rasterConfig.defines.push(\"PROJECTION_GLOBE_VIEW\");\n    }\n    if (renderingWithElevation) {\n        rasterConfig.defines.push(\"RENDER_CUTOFF\");\n    }\n\n    const drawTiles = (tiles: Array<OverscaledTileID>, cullFaceMode: CullFaceMode, elevatedStencilMode?: StencilMode) => {\n        for (const coord of tiles) {\n            const unwrappedTileID = coord.toUnwrapped();\n            const tile = sourceCache.getTile(coord);\n            if (renderingToTexture && !(tile && tile.hasData())) continue;\n\n            context.activeTexture.set(gl.TEXTURE0);\n            const textureDescriptor = getTextureDescriptor(tile, source, layer, rasterConfig);\n            if (!textureDescriptor || !textureDescriptor.texture) continue;\n            const {texture, mix: rasterColorMix, offset: rasterColorOffset, tileSize, buffer} = textureDescriptor;\n\n            let depthMode;\n            let projMatrix;\n            if (renderingToTexture) {\n                depthMode = DepthMode.disabled;\n                projMatrix = coord.projMatrix;\n            } else if (renderingWithElevation) {\n                depthMode = new DepthMode(gl.LEQUAL, DepthMode.ReadWrite, painter.depthRangeFor3D);\n                projMatrix = isGlobeProjection ? Float32Array.from(painter.transform.expandedFarZProjMatrix) : painter.transform.calculateProjMatrix(unwrappedTileID, align);\n            } else {\n                // Set the lower zoom level to sublayer 0, and higher zoom levels to higher sublayers\n                // Use gl.LESS to prevent double drawing in areas where tiles overlap.\n                depthMode = painter.depthModeForSublayer(coord.overscaledZ - minTileZ,\n                    layer.paint.get('raster-opacity') === 1 ? DepthMode.ReadWrite : DepthMode.ReadOnly, gl.LESS);\n                projMatrix = painter.transform.calculateProjMatrix(unwrappedTileID, align);\n            }\n\n            const stencilMode = painter.terrain && renderingToTexture ?\n                painter.terrain.stencilModeForRTTOverlap(coord) :\n                stencilModes[coord.overscaledZ];\n\n            const rasterFadeDuration = isInitialLoad ? 0 : layer.paint.get('raster-fade-duration');\n            tile.registerFadeDuration(rasterFadeDuration);\n\n            const parentTile = sourceCache.findLoadedParent(coord, 0);\n            const fade = rasterFade(tile, parentTile, sourceCache, painter.transform, rasterFadeDuration);\n            if (painter.terrain) painter.terrain.prepareDrawTile();\n\n            let parentScaleBy, parentTL;\n\n            context.activeTexture.set(gl.TEXTURE0);\n            texture.bind(textureFilter, gl.CLAMP_TO_EDGE);\n\n            context.activeTexture.set(gl.TEXTURE1);\n\n            if (parentTile) {\n                if (parentTile.texture) {\n                    parentTile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE);\n                }\n                parentScaleBy = Math.pow(2, parentTile.tileID.overscaledZ - tile.tileID.overscaledZ);\n                parentTL = [tile.tileID.canonical.x * parentScaleBy % 1, tile.tileID.canonical.y * parentScaleBy % 1];\n\n            } else {\n                texture.bind(textureFilter, gl.CLAMP_TO_EDGE);\n            }\n\n            // Enable trilinear filtering on tiles only beyond 20 degrees pitch,\n            // to prevent it from compromising image crispness on flat or low tilted maps.\n            if (texture.useMipmap && context.extTextureFilterAnisotropic && painter.transform.pitch > 20) {\n                gl.texParameterf(gl.TEXTURE_2D, context.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT, context.extTextureFilterAnisotropicMax);\n            }\n\n            const tr = painter.transform;\n            let perspectiveTransform: [number, number];\n            const cutoffParams = renderingWithElevation ? cutoffParamsForElevation(tr) : [0, 0, 0, 0];\n\n            let normalizeMatrix: Float32Array;\n            let globeMatrix: Float32Array;\n            let globeMercatorMatrix: Float32Array;\n            let mercatorCenter: [number, number];\n            let gridMatrix: Float32Array;\n            let latitudinalLod = 0;\n\n            if (renderingElevatedOnGlobe && source instanceof ImageSource && source.coordinates.length > 3) {\n                normalizeMatrix = Float32Array.from(globeNormalizeECEF(globeTileBounds(new CanonicalTileID(0, 0, 0))));\n                globeMatrix = Float32Array.from(tr.globeMatrix);\n                globeMercatorMatrix = Float32Array.from(calculateGlobeMercatorMatrix(tr));\n                mercatorCenter = [mercatorXfromLng(tr.center.lng), mercatorYfromLat(tr.center.lat)];\n                perspectiveTransform = source.elevatedGlobePerspectiveTransform;\n                gridMatrix = source.elevatedGlobeGridMatrix || new Float32Array(9);\n            } else if (renderingElevatedOnGlobe) {\n                const tileBounds = tileCornersToBounds(coord.canonical);\n                latitudinalLod = getLatitudinalLod(tileBounds.getCenter().lat);\n                normalizeMatrix = Float32Array.from(globeNormalizeECEF(globeTileBounds(coord.canonical)));\n                globeMatrix = Float32Array.from(tr.globeMatrix);\n                globeMercatorMatrix = Float32Array.from(calculateGlobeMercatorMatrix(tr));\n                mercatorCenter = [mercatorXfromLng(tr.center.lng), mercatorYfromLat(tr.center.lat)];\n                perspectiveTransform = [0, 0];\n                gridMatrix = Float32Array.from(getGridMatrix(coord.canonical, tileBounds, latitudinalLod, tr.worldSize / tr._pixelsPerMercatorPixel));\n            } else {\n                perspectiveTransform = source instanceof ImageSource ? source.perspectiveTransform : [0, 0];\n                normalizeMatrix = new Float32Array(16);\n                globeMatrix = new Float32Array(9);\n                globeMercatorMatrix = new Float32Array(16);\n                mercatorCenter = [0, 0];\n                gridMatrix = new Float32Array(9);\n            }\n\n            const uniformValues = rasterUniformValues(\n                projMatrix,\n                normalizeMatrix,\n                globeMatrix,\n                globeMercatorMatrix,\n                gridMatrix,\n                parentTL || [0, 0],\n                globeToMercatorTransition(painter.transform.zoom),\n                mercatorCenter,\n                cutoffParams,\n                parentScaleBy || 1,\n                fade,\n                layer,\n                perspectiveTransform,\n                renderingWithElevation ? layer.paint.get('raster-elevation') : 0.0,\n                RASTER_COLOR_TEXTURE_UNIT,\n                rasterColorMix,\n                rasterColorOffset,\n                rasterConfig.range,\n                tileSize,\n                buffer,\n                emissiveStrength\n            );\n            const affectedByFog = painter.isTileAffectedByFog(coord);\n\n            const program = painter.getOrCreateProgram('raster', {defines: rasterConfig.defines, overrideFog: affectedByFog});\n\n            painter.uploadCommonUniforms(context, program, unwrappedTileID);\n\n            if (source instanceof ImageSource) {\n                const elevatedGlobeVertexBuffer = source.elevatedGlobeVertexBuffer;\n                const elevatedGlobeIndexBuffer = source.elevatedGlobeIndexBuffer;\n                if (renderingToTexture || !isGlobeProjection) {\n                    if (source.boundsBuffer && source.boundsSegments) program.draw(\n                        painter, gl.TRIANGLES, depthMode, StencilMode.disabled, colorMode, CullFaceMode.disabled,\n                        uniformValues, layer.id, source.boundsBuffer,\n                        painter.quadTriangleIndexBuffer, source.boundsSegments);\n                } else if (elevatedGlobeVertexBuffer && elevatedGlobeIndexBuffer) {\n                    const segments = tr.zoom <= GLOBE_ZOOM_THRESHOLD_MIN ?\n                        source.elevatedGlobeSegments :\n                        source.getSegmentsForLongitude(tr.center.lng);\n                    if (segments) {\n                        program.draw(\n                            painter, gl.TRIANGLES, depthMode, StencilMode.disabled, colorMode, cullFaceMode,\n                            uniformValues, layer.id, elevatedGlobeVertexBuffer,\n                            elevatedGlobeIndexBuffer, segments);\n                    }\n                }\n            } else if (renderingElevatedOnGlobe) {\n                depthMode = new DepthMode(gl.LEQUAL, DepthMode.ReadOnly, painter.depthRangeFor3D);\n                const sharedBuffers = painter.globeSharedBuffers;\n                if (sharedBuffers) {\n                    const [buffer, indexBuffer, segments] = sharedBuffers.getGridBuffers(latitudinalLod, false);\n                    assert(buffer);\n                    assert(indexBuffer);\n                    assert(segments);\n                    program.draw(painter, gl.TRIANGLES, depthMode, elevatedStencilMode || stencilMode, painter.colorModeForRenderPass(), cullFaceMode, uniformValues, layer.id, buffer, indexBuffer, segments);\n                }\n            } else {\n                const {tileBoundsBuffer, tileBoundsIndexBuffer, tileBoundsSegments} = painter.getTileBoundsBuffers(tile);\n\n                program.draw(painter, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled,\n                    uniformValues, layer.id, tileBoundsBuffer,\n                    tileBoundsIndexBuffer, tileBoundsSegments);\n            }\n        }\n\n        if (!(source instanceof ImageSource) && renderingElevatedOnGlobe) {\n            for (const coord of tiles) {\n                const topCap = coord.canonical.y === 0;\n                const bottomCap = coord.canonical.y === (1 << coord.canonical.z) - 1;\n                if (topCap) {\n                    drawPole(true, coord, painter, sourceCache, layer, emissiveStrength, rasterConfig, cullFaceMode, elevatedStencilMode || StencilMode.disabled);\n                }\n                if (bottomCap) {\n                    drawPole(false, coord, painter, sourceCache, layer, emissiveStrength, rasterConfig, cullFaceMode === CullFaceMode.frontCW ? CullFaceMode.backCW : CullFaceMode.frontCW, elevatedStencilMode || StencilMode.disabled);\n                }\n            }\n        }\n    };\n\n    if (renderingElevatedOnGlobe) {\n        if (painter.renderElevatedRasterBackface) {\n            drawTiles(coords, CullFaceMode.backCW, painter.stencilModeFor3D());\n        } else {\n            drawTiles(coords, CullFaceMode.frontCW, painter.stencilModeFor3D());\n        }\n    } else {\n        drawTiles(coords, CullFaceMode.disabled, undefined);\n    }\n\n    painter.resetStencilClippingMasks();\n}\n\nfunction drawPole(isNorth: boolean, coord: ?OverscaledTileID, painter: Painter, sourceCache: SourceCache, layer: RasterStyleLayer, emissiveStrength: number, rasterConfig: any, cullFaceMode: CullFaceMode, stencilMode: StencilMode) {\n    const source = sourceCache.getSource();\n    const sharedBuffers = painter.globeSharedBuffers;\n    if (!sharedBuffers) return;\n\n    let tile;\n    if (coord) {\n        tile = sourceCache.getTile(coord);\n    }\n    let texture;\n    let globeMatrix;\n    if (source instanceof ImageSource) {\n        texture = source.texture;\n        globeMatrix = globePoleMatrixForTile(0, 0, painter.transform);\n    } else if (tile && coord) {\n        texture = tile.texture;\n        globeMatrix = globePoleMatrixForTile(coord.canonical.z, coord.canonical.x, painter.transform);\n    }\n    if (!texture || !globeMatrix) return;\n\n    if (!isNorth) {\n        globeMatrix = mat4.scale(mat4.create(), globeMatrix, [1, -1, 1]);\n    }\n\n    const context = painter.context;\n    const gl = context.gl;\n    const textureFilter = layer.paint.get('raster-resampling') === 'nearest' ? gl.NEAREST : gl.LINEAR;\n    const colorMode = painter.colorModeForDrapableLayerRenderPass(emissiveStrength);\n    const defines = rasterConfig.defines;\n    defines.push(\"GLOBE_POLES\");\n\n    const depthMode = new DepthMode(gl.LEQUAL, DepthMode.ReadWrite, painter.depthRangeFor3D);\n    const projMatrix = Float32Array.from(painter.transform.expandedFarZProjMatrix);\n    const normalizeMatrix = Float32Array.from(globeNormalizeECEF(globeTileBounds(new CanonicalTileID(0, 0, 0))));\n    const fade = {opacity: 1, mix: 0};\n\n    if (painter.terrain) painter.terrain.prepareDrawTile();\n\n    context.activeTexture.set(gl.TEXTURE0);\n    texture.bind(textureFilter, gl.CLAMP_TO_EDGE);\n    context.activeTexture.set(gl.TEXTURE1);\n    texture.bind(textureFilter, gl.CLAMP_TO_EDGE);\n\n    // Enable trilinear filtering on tiles only beyond 20 degrees pitch,\n    // to prevent it from compromising image crispness on flat or low tilted maps.\n    if (texture.useMipmap && context.extTextureFilterAnisotropic && painter.transform.pitch > 20) {\n        gl.texParameterf(gl.TEXTURE_2D, context.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT, context.extTextureFilterAnisotropicMax);\n    }\n\n    const [\n        northPoleBuffer,\n        southPoleBuffer,\n        indexBuffer,\n        segment\n    ] = coord ? sharedBuffers.getPoleBuffers(coord.canonical.z, false) : sharedBuffers.getPoleBuffers(0, true);\n    const elevation = layer.paint.get('raster-elevation');\n    let vertexBuffer;\n    if (isNorth) {\n        vertexBuffer = northPoleBuffer;\n        painter.renderDefaultNorthPole = elevation !== 0.0;\n    } else {\n        vertexBuffer = southPoleBuffer;\n        painter.renderDefaultSouthPole = elevation !== 0.0;\n    }\n    const rasterColorMix = adjustColorMix(rasterConfig.mix);\n    const uniformValues = rasterPoleUniformValues(projMatrix, normalizeMatrix, globeMatrix, globeToMercatorTransition(painter.transform.zoom), fade, layer, [0, 0], elevation, RASTER_COLOR_TEXTURE_UNIT, rasterColorMix, rasterConfig.offset, rasterConfig.range, emissiveStrength);\n    const program = painter.getOrCreateProgram('raster', {defines});\n\n    painter.uploadCommonUniforms(context, program, null);\n    program.draw(\n        painter, gl.TRIANGLES, depthMode, stencilMode, colorMode, cullFaceMode,\n        uniformValues, layer.id, vertexBuffer,\n        indexBuffer, segment);\n}\n\n// Configure a fade out effect for elevated raster layers when they're close to the camera\nfunction cutoffParamsForElevation(tr: Transform): [number, number, number, number] {\n    const near = tr._nearZ;\n    const far = tr.projection.farthestPixelDistance(tr);\n    const zRange = far - near;\n    const fadeRangePixels = tr.height * 0.2;\n    const cutoffDistance = near + fadeRangePixels;\n    const relativeCutoffDistance = ((cutoffDistance - near) / zRange);\n    const relativeCutoffFadeDistance = ((cutoffDistance - fadeRangePixels - near) / zRange);\n    return [near, far, relativeCutoffFadeDistance, relativeCutoffDistance];\n}\n\nexport function prepare(layer: RasterStyleLayer, sourceCache: SourceCache, _: Painter): void {\n    const source = sourceCache.getSource();\n    if (!(source instanceof RasterArrayTileSource) || !source.loaded()) return;\n\n    const sourceLayer = layer.sourceLayer || (source.rasterLayerIds && source.rasterLayerIds[0]);\n    if (!sourceLayer) return;\n\n    const band = layer.paint.get('raster-array-band') || source.getInitialBand(sourceLayer);\n    if (band == null) return;\n\n    // $FlowFixMe[incompatible-type]\n    const tiles: Array<RasterArrayTile> = sourceCache.getIds().map(id => sourceCache.getTileByID(id));\n    for (const tile of tiles) {\n        if (tile.updateNeeded(sourceLayer, band)) {\n            source.prepareTile(tile, sourceLayer, band);\n        }\n    }\n}\n\nexport type TextureDescriptor = {\n    texture: ?Texture | ?UserManagedTexture,\n    mix: [number, number, number, number],\n    offset: number,\n    buffer: number,\n    tileSize: number,\n};\n\nfunction getTextureDescriptor(tile: ?Tile | ?RasterArrayTile, source: Source | RasterArrayTileSource, layer: RasterStyleLayer, rasterConfig: RasterConfig): TextureDescriptor | void {\n    if (!tile) return;\n\n    if (source instanceof RasterArrayTileSource && tile instanceof RasterArrayTile) {\n        return ((source.getTextureDescriptor(tile, layer, true): any): TextureDescriptor);\n    }\n\n    return {\n        texture: tile.texture,\n        mix: adjustColorMix(rasterConfig.mix),\n        offset: rasterConfig.offset,\n        buffer: 0,\n        tileSize: 1,\n    };\n}\n\nfunction configureRaster(source: Source, layer: RasterStyleLayer, context: Context, gl: WebGL2RenderingContext): RasterConfig {\n    const isRasterColor = layer.paint.get('raster-color');\n    const isRasterArray = source.type === 'raster-array';\n\n    const defines: DynamicDefinesType[] = [];\n    const inputResampling = layer.paint.get('raster-resampling');\n    const inputMix = layer.paint.get('raster-color-mix');\n    let range = layer.paint.get('raster-color-range');\n\n    // Unpack the offset for use in a separate uniform\n    const mix = [inputMix[0], inputMix[1], inputMix[2], 0];\n    const offset = inputMix[3];\n\n    let resampling = inputResampling === 'nearest' ? gl.NEAREST : gl.LINEAR;\n\n    if (isRasterArray) {\n        defines.push('RASTER_ARRAY');\n\n        // Raster-array sources require RASTER_COLOR for raster array data decoding and binary 0/1 mask interpolation\n        if (!isRasterColor) defines.push('RASTER_COLOR');\n\n        // Raster-array sources require in-shader linear interpolation in order to decode without\n        // artifacts, so force nearest filtering.\n        if (inputResampling === 'linear') defines.push('RASTER_ARRAY_LINEAR');\n        resampling = gl.NEAREST;\n\n        if (!range) {\n            if (source.rasterLayers) {\n                const foundLayer = source.rasterLayers.find(({id}) => id === layer.sourceLayer);\n                if (foundLayer && foundLayer.fields && foundLayer.fields.range) {\n                    range = foundLayer.fields.range;\n                }\n            }\n        }\n    }\n\n    // In all cases, having checked for a preferred color ramp, we now supply a default,\n    // to be used in case nothing else has been specified.\n    range = range || [0, 1];\n\n    if (isRasterColor) {\n        defines.push('RASTER_COLOR');\n        // Allocate a texture if not allocated\n        context.activeTexture.set(gl.TEXTURE2);\n\n        // Update the color ramp defensively. Duplicate calls with the same bounds\n        // will not trigger recomputation.\n        layer.updateColorRamp(range);\n\n        let tex = layer.colorRampTexture;\n        if (!tex) tex = layer.colorRampTexture = new Texture(context, layer.colorRamp, gl.RGBA);\n        tex.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n    }\n\n    return {\n        mix,\n        range,\n        offset,\n        defines,\n        resampling\n    };\n}\n","// @flow\n\nimport browser from '../util/browser.js';\nimport Color from '../style-spec/util/color.js';\nimport ColorMode from '../gl/color_mode.js';\nimport CullFaceMode from '../gl/cull_face_mode.js';\nimport DepthMode from '../gl/depth_mode.js';\nimport StencilMode from '../gl/stencil_mode.js';\nimport {rasterParticleUniformValues, rasterParticleTextureUniformValues, rasterParticleDrawUniformValues, rasterParticleUpdateUniformValues} from './program/raster_particle_program.js';\nimport {computeRasterColorMix, computeRasterColorOffset} from './raster.js';\nimport {COLOR_RAMP_RES} from '../style/style_layer/raster_particle_style_layer.js';\nimport RasterArrayTile from '../source/raster_array_tile.js';\nimport RasterArrayTileSource from '../source/raster_array_tile_source.js';\n\nimport type {DynamicDefinesType} from \"./program/program_uniforms\";\nimport type Painter from './painter.js';\nimport type SourceCache from '../source/source_cache.js';\nimport type RasterParticleStyleLayer from '../style/style_layer/raster_particle_style_layer.js';\nimport {OverscaledTileID, neighborCoord} from '../source/tile_id.js';\nimport {\n    calculateGlobeMercatorMatrix,\n    getGridMatrix,\n    globeNormalizeECEF,\n    globeTileBounds,\n    globeToMercatorTransition,\n    getLatitudinalLod,\n    tileCornersToBounds} from \"../geo/projection/globe_util.js\";\nimport RasterParticleState from './raster_particle_state.js';\nimport Texture from './texture.js';\nimport {mercatorXfromLng, mercatorYfromLat} from \"../geo/mercator_coordinate.js\";\nimport Transform from '../geo/transform.js';\nimport rasterFade from './raster_fade.js';\nimport assert from 'assert';\n\nexport default drawRasterParticle;\n\nconst VELOCITY_TEXTURE_UNIT = 0;\nconst RASTER_PARTICLE_TEXTURE_UNIT = 1;\nconst RASTER_COLOR_TEXTURE_UNIT = 2;\nconst SPEED_MAX_VALUE = 0.3;\n\nfunction drawRasterParticle(painter: Painter, sourceCache: SourceCache, layer: RasterParticleStyleLayer, tileIDs: Array<OverscaledTileID>, _: any, isInitialLoad: boolean) {\n    if (painter.renderPass === 'offscreen') {\n        renderParticlesToTexture(painter, sourceCache, layer, tileIDs);\n    }\n\n    if (painter.renderPass === 'translucent') {\n        renderTextureToMap(painter, sourceCache, layer, tileIDs, isInitialLoad);\n        painter.style.map.triggerRepaint();\n    }\n}\n\nfunction renderParticlesToTexture(painter: Painter, sourceCache: SourceCache, layer: RasterParticleStyleLayer, tileIDs: Array<OverscaledTileID>) {\n    if (!tileIDs.length) {\n        return;\n    }\n\n    const context = painter.context;\n    const gl = context.gl;\n    const source = sourceCache.getSource();\n    if (!(source instanceof RasterArrayTileSource)) return;\n\n    // update layer resources\n\n    const particleTextureDimension = Math.ceil(Math.sqrt(layer.paint.get('raster-particle-count')));\n    let particleFramebuffer = layer.particleFramebuffer;\n    if (!particleFramebuffer) {\n        particleFramebuffer = layer.particleFramebuffer = context.createFramebuffer(particleTextureDimension, particleTextureDimension, true, null);\n    } else if (particleFramebuffer.width !== particleTextureDimension) {\n        assert(particleFramebuffer.width === particleFramebuffer.height);\n        particleFramebuffer.destroy();\n        particleFramebuffer = layer.particleFramebuffer = context.createFramebuffer(particleTextureDimension, particleTextureDimension, true, null);\n    }\n\n    // acquire and update tiles\n\n    const tiles: Array<[OverscaledTileID, TileData, RasterParticleState, boolean]> = [];\n    for (const id of tileIDs) {\n        const tile = sourceCache.getTile(id);\n        if (!(tile instanceof RasterArrayTile)) continue;\n\n        const data = getTileData(tile, source, layer);\n        if (!data) continue;\n        assert(data.texture);\n\n        const textureSize = [tile.tileSize, tile.tileSize];\n        let tileFramebuffer = layer.tileFramebuffer;\n        if (!tileFramebuffer) {\n            const fbWidth = textureSize[0];\n            const fbHeight = textureSize[1];\n            tileFramebuffer = layer.tileFramebuffer = context.createFramebuffer(fbWidth, fbHeight, true, null);\n        }\n        assert(tileFramebuffer.width === textureSize[0] && tileFramebuffer.height === textureSize[1]);\n\n        let state = tile.rasterParticleState;\n        if (!state) {\n            state = tile.rasterParticleState = new RasterParticleState(context, id, textureSize, particleTextureDimension);\n        }\n\n        const renderBackground = state.update(layer.lastInvalidatedAt);\n\n        if (state.particleTextureDimension !== particleTextureDimension) {\n            state.setParticleTextureDimension(id, particleTextureDimension);\n        }\n\n        const t = state.targetColorTexture;\n        state.targetColorTexture = state.backgroundColorTexture;\n        state.backgroundColorTexture = t;\n\n        const p = state.particleTexture0;\n        state.particleTexture0 = state.particleTexture1;\n        state.particleTexture1 = p;\n\n        tiles.push([id, data, state, renderBackground]);\n    }\n\n    if (tiles.length === 0) {\n        return;\n    }\n\n    const now = browser.now();\n    const frameDeltaSeconds = layer.previousDrawTimestamp ? 0.001 * (now - layer.previousDrawTimestamp) : 0.0167;\n    layer.previousDrawTimestamp = now;\n\n    if (layer.hasColorMap()) {\n        // Allocate a texture if not allocated\n        context.activeTexture.set(gl.TEXTURE0 + RASTER_COLOR_TEXTURE_UNIT);\n        let tex = layer.colorRampTexture;\n        if (!tex) tex = layer.colorRampTexture = new Texture(context, layer.colorRamp, gl.RGBA);\n        tex.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n    }\n\n    // render and update the particle state\n\n    context.bindFramebuffer.set(layer.tileFramebuffer.framebuffer);\n    renderBackground(painter, layer, tiles);\n    renderParticles(painter, sourceCache, layer, tiles);\n    context.bindFramebuffer.set(layer.particleFramebuffer.framebuffer);\n    updateParticles(painter, layer, tiles, frameDeltaSeconds);\n}\n\ntype TileData = {|\n    texture: Texture,\n    textureOffset: [number, number],\n    tileSize: number,\n    scalarData: boolean,\n    scale: [number, number, number, number],\n    offset: number,\n    defines: DynamicDefinesType[]\n|};\n\nfunction getTileData(tile: RasterArrayTile, source: RasterArrayTileSource, layer: RasterParticleStyleLayer): ?TileData {\n    if (!tile) {\n        return null;\n    }\n\n    const textureDesc = source.getTextureDescriptor(tile, layer, true);\n\n    if (!textureDesc) {\n        return null;\n    }\n    let {texture, mix, offset, tileSize, buffer, format} = textureDesc;\n    if (!texture || !format) {\n        return null;\n    }\n\n    let scalarData = false;\n    if (format === 'uint32') {\n        scalarData = true;\n        mix[3] = 0;\n        mix = computeRasterColorMix(COLOR_RAMP_RES, mix, [0, layer.paint.get('raster-particle-max-speed')]);\n        offset = computeRasterColorOffset(COLOR_RAMP_RES, offset, [0, layer.paint.get('raster-particle-max-speed')]);\n    }\n    const dataFormatDefine = {\n        uint8: 'DATA_FORMAT_UINT8',\n        uint16: 'DATA_FORMAT_UINT16',\n        uint32: 'DATA_FORMAT_UINT32',\n    }[format];\n\n    return {\n        texture,\n        textureOffset: [ buffer / (tileSize + 2 * buffer), tileSize / (tileSize + 2 * buffer)],\n        tileSize,\n        scalarData,\n        scale: mix,\n        offset,\n        defines: ['RASTER_ARRAY', dataFormatDefine]\n    };\n}\n\nfunction renderBackground(painter: Painter, layer: RasterParticleStyleLayer, tiles: Array<[OverscaledTileID, TileData, RasterParticleState, boolean]>) {\n    const context = painter.context;\n    const gl = context.gl;\n    const framebuffer = layer.tileFramebuffer;\n\n    context.activeTexture.set(gl.TEXTURE0);\n\n    const textureUnit = 0;\n    const opacityValue = fadeOpacityCurve(layer.paint.get('raster-particle-fade-opacity-factor'));\n    const uniforms = rasterParticleTextureUniformValues(textureUnit, opacityValue);\n    const program = painter.getOrCreateProgram('rasterParticleTexture', {defines: [], overrideFog: false});\n\n    for (const tile of tiles) {\n        const [, , particleState, renderBackground] = tile;\n        framebuffer.colorAttachment.set(particleState.targetColorTexture.texture);\n        context.viewport.set([0, 0, framebuffer.width, framebuffer.height]);\n        context.clear({color: Color.transparent});\n        if (!renderBackground) continue;\n        particleState.backgroundColorTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE);\n        program.draw(\n            painter,\n            gl.TRIANGLES,\n            DepthMode.disabled,\n            StencilMode.disabled,\n            ColorMode.alphaBlended,\n            CullFaceMode.disabled,\n            uniforms,\n            layer.id,\n            painter.viewportBuffer,\n            painter.quadTriangleIndexBuffer,\n            painter.viewportSegments);\n    }\n}\n\nfunction fadeOpacityCurve(fadeOpacityFactor: number): number {\n    // The opacity factor has a very non-linear visual effect in its linear [0, 1] range. Particle trails\n    // are visible only roughly after a value of 0.7. Applying a curve which significantly boosts values\n    // close to 0 ensures that linearly increasing the fade opacity factor from 0 to 1 results in a visually\n    // linear increase in trail length.\n    //\n    // A curve of the form (1 + a)(x / (x + a)) boosts values close to 0, and results in a number in the\n    // [0, 1] range.\n\n    const x = fadeOpacityFactor;\n    const a = 0.05;\n    return (1.0 + a) * x / (x + a);\n}\n\nfunction resetRateCurve(resetRate: number): number {\n    // Even small reset rates (close to zero) result in fast reset period. Values at >0.4 visually appear to\n    // respawn very fast. Applying a power curve (x^n) to the reset rate ensures that we can linearly increase\n    // the reset rate from 0 to 1 and see a more gradual increase in the reset rate.\n\n    return Math.pow(resetRate, 6.0);\n}\n\nfunction renderParticles(painter: Painter, sourceCache: SourceCache, layer: RasterParticleStyleLayer, tiles: Array<[OverscaledTileID, TileData, RasterParticleState, boolean]>) {\n    const context = painter.context;\n    const gl = context.gl;\n\n    const framebuffer = layer.tileFramebuffer;\n    const isGlobeProjection = painter.transform.projection.name === 'globe';\n    const maxSpeed = layer.paint.get('raster-particle-max-speed');\n    for (const targetTile of tiles) {\n        const [targetTileID, targetTileData, targetTileState, ] = targetTile;\n\n        context.activeTexture.set(gl.TEXTURE0 + VELOCITY_TEXTURE_UNIT);\n        targetTileData.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n        framebuffer.colorAttachment.set(targetTileState.targetColorTexture.texture);\n        const defines = targetTileData.defines;\n        const program = painter.getOrCreateProgram('rasterParticleDraw', {defines, overrideFog: false});\n\n        context.activeTexture.set(gl.TEXTURE0 + RASTER_PARTICLE_TEXTURE_UNIT);\n        const tileIDs = targetTileData.scalarData ? [] : [0, 1, 2, 3].map(idx => neighborCoord[idx](targetTileID));\n        tileIDs.push(targetTileID);\n        const x = targetTileID.canonical.x;\n        const y = targetTileID.canonical.y;\n        for (const tileID of tileIDs) {\n            const tile = sourceCache.getTile(isGlobeProjection ? tileID.wrapped() : tileID);\n            if (!tile) continue;\n            const state = tile.rasterParticleState;\n            if (!state) continue;\n\n            // NOTE: tiles adjacent to the antimeridian need their x coordinates shifted by (2^z) in order for (nx - x)\n            // to be contained in [-1, 1].\n            const wrapDelta = tileID.wrap - targetTileID.wrap;\n            const nx = tileID.canonical.x + (1 << tileID.canonical.z) * wrapDelta;\n            const ny = tileID.canonical.y;\n\n            state.particleTexture0.bind(gl.NEAREST, gl.CLAMP_TO_EDGE);\n            const rasterParticleTextureRes = state.particleTexture0.size;\n            assert(rasterParticleTextureRes[0] === rasterParticleTextureRes[1]);\n            const rasterParticleTextureSideLen = rasterParticleTextureRes[0];\n            const tileOffset = [nx - x, ny - y];\n            const uniforms = rasterParticleDrawUniformValues(\n                RASTER_PARTICLE_TEXTURE_UNIT,\n                rasterParticleTextureSideLen,\n                tileOffset,\n                VELOCITY_TEXTURE_UNIT,\n                targetTileData.texture.size,\n                RASTER_COLOR_TEXTURE_UNIT,\n                maxSpeed,\n                targetTileData.textureOffset,\n                targetTileData.scale,\n                targetTileData.offset\n            );\n            program.draw(\n                painter,\n                gl.POINTS,\n                DepthMode.disabled,\n                StencilMode.disabled,\n                ColorMode.alphaBlended,\n                CullFaceMode.disabled,\n                uniforms,\n                layer.id,\n                state.particleIndexBuffer,\n                undefined,\n                state.particleSegment\n            );\n        }\n    }\n}\n\nfunction updateParticles(painter: Painter, layer: RasterParticleStyleLayer, tiles: Array<[OverscaledTileID, TileData, RasterParticleState, boolean]>, frameDeltaSeconds: number) {\n    const context = painter.context;\n    const gl = context.gl;\n\n    const maxSpeed = layer.paint.get('raster-particle-max-speed');\n    const speedFactor = frameDeltaSeconds * layer.paint.get('raster-particle-speed-factor') * SPEED_MAX_VALUE;\n    const resetRateFactor = layer.paint.get('raster-particle-reset-rate-factor');\n    const resetRate = resetRateCurve(0.01 + resetRateFactor * 1.0);\n    const particleFramebuffer = layer.particleFramebuffer;\n    context.viewport.set([0, 0, particleFramebuffer.width, particleFramebuffer.height]);\n\n    for (const tile of tiles) {\n        const [, data, state, ] = tile;\n\n        context.activeTexture.set(gl.TEXTURE0 + VELOCITY_TEXTURE_UNIT);\n        data.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n        context.activeTexture.set(gl.TEXTURE0 + RASTER_PARTICLE_TEXTURE_UNIT);\n        const particleTexture = state.particleTexture0;\n        particleTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE);\n        const uniforms = rasterParticleUpdateUniformValues(\n            RASTER_PARTICLE_TEXTURE_UNIT,\n            particleTexture.size[0],\n            VELOCITY_TEXTURE_UNIT,\n            data.texture.size,\n            maxSpeed,\n            speedFactor,\n            resetRate,\n            data.textureOffset,\n            data.scale,\n            data.offset\n        );\n        particleFramebuffer.colorAttachment.set(state.particleTexture1.texture);\n        context.clear({color: Color.transparent});\n        const updateProgram = painter.getOrCreateProgram('rasterParticleUpdate', {defines: data.defines});\n        updateProgram.draw(\n            painter,\n            gl.TRIANGLES,\n            DepthMode.disabled,\n            StencilMode.disabled,\n            ColorMode.unblended,\n            CullFaceMode.disabled,\n            uniforms,\n            layer.id,\n            painter.viewportBuffer,\n            painter.quadTriangleIndexBuffer,\n            painter.viewportSegments);\n    }\n}\n\nfunction renderTextureToMap(painter: Painter, sourceCache: SourceCache, layer: RasterParticleStyleLayer, tileIDs: Array<OverscaledTileID>, _: boolean) {\n    const context = painter.context;\n    const gl = context.gl;\n\n    const rasterElevation = 250.0;\n    const align = !painter.options.moving;\n    const isGlobeProjection = painter.transform.projection.name === 'globe';\n\n    if (!tileIDs.length) {\n        return;\n    }\n    const [stencilModes, coords] = painter.stencilConfigForOverlap(tileIDs);\n\n    const defines: DynamicDefinesType[] = [];\n    if (isGlobeProjection) {\n        defines.push(\"PROJECTION_GLOBE_VIEW\");\n    }\n\n    const stencilMode = painter.stencilModeFor3D();\n\n    for (const coord of coords) {\n        const unwrappedTileID = coord.toUnwrapped();\n        const tile = sourceCache.getTile(coord);\n        if (!tile.rasterParticleState) continue;\n        const particleState = tile.rasterParticleState;\n\n        // NOTE: workaround for https://mapbox.atlassian.net/browse/GLJS-675\n        const rasterFadeDuration = 100;\n        tile.registerFadeDuration(rasterFadeDuration);\n\n        const parentTile = sourceCache.findLoadedParent(coord, 0);\n        const fade = rasterFade(tile, parentTile, sourceCache, painter.transform, rasterFadeDuration);\n        if (painter.terrain) painter.terrain.prepareDrawTile();\n\n        context.activeTexture.set(gl.TEXTURE0);\n        particleState.targetColorTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n\n        context.activeTexture.set(gl.TEXTURE1);\n\n        let parentScaleBy, parentTL;\n        if (parentTile && parentTile.rasterParticleState) {\n            parentTile.rasterParticleState.targetColorTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n            parentScaleBy = Math.pow(2, parentTile.tileID.overscaledZ - tile.tileID.overscaledZ);\n            parentTL = [tile.tileID.canonical.x * parentScaleBy % 1, tile.tileID.canonical.y * parentScaleBy % 1];\n        } else  {\n            particleState.targetColorTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n        }\n\n        const projMatrix = isGlobeProjection ? Float32Array.from(painter.transform.expandedFarZProjMatrix) : painter.transform.calculateProjMatrix(unwrappedTileID, align);\n\n        const tr = painter.transform;\n        const cutoffParams = cutoffParamsForElevation(tr);\n        const tileBounds = tileCornersToBounds(coord.canonical);\n        const latitudinalLod = getLatitudinalLod(tileBounds.getCenter().lat);\n\n        let normalizeMatrix: Float32Array;\n        let globeMatrix: Float32Array;\n        let globeMercatorMatrix: Float32Array;\n        let mercatorCenter: [number, number];\n        let gridMatrix: Float32Array;\n\n        if (isGlobeProjection) {\n            normalizeMatrix = Float32Array.from(globeNormalizeECEF(globeTileBounds(coord.canonical)));\n            globeMatrix = Float32Array.from(tr.globeMatrix);\n            globeMercatorMatrix = Float32Array.from(calculateGlobeMercatorMatrix(tr));\n            mercatorCenter = [mercatorXfromLng(tr.center.lng), mercatorYfromLat(tr.center.lat)];\n            gridMatrix = Float32Array.from(getGridMatrix(coord.canonical, tileBounds, latitudinalLod, tr.worldSize / tr._pixelsPerMercatorPixel));\n        } else {\n            normalizeMatrix = new Float32Array(16);\n            globeMatrix = new Float32Array(9);\n            globeMercatorMatrix = new Float32Array(16);\n            mercatorCenter = [0, 0];\n            gridMatrix = new Float32Array(9);\n        }\n\n        const uniformValues = rasterParticleUniformValues(\n            projMatrix,\n            normalizeMatrix,\n            globeMatrix,\n            globeMercatorMatrix,\n            gridMatrix,\n            parentTL || [0, 0],\n            globeToMercatorTransition(painter.transform.zoom),\n            mercatorCenter,\n            cutoffParams,\n            parentScaleBy || 1,\n            fade,\n            rasterElevation\n        );\n        const overrideFog = painter.isTileAffectedByFog(coord);\n        const program = painter.getOrCreateProgram('rasterParticle', {defines, overrideFog});\n\n        painter.uploadCommonUniforms(context, program, unwrappedTileID);\n\n        if (isGlobeProjection) {\n            const depthMode = new DepthMode(gl.LEQUAL, DepthMode.ReadWrite, painter.depthRangeFor3D);\n            const skirtHeightValue = 0;\n            const sharedBuffers = painter.globeSharedBuffers;\n            if (sharedBuffers) {\n                const [buffer, indexBuffer, segments] = sharedBuffers.getGridBuffers(latitudinalLod, skirtHeightValue !== 0);\n                assert(buffer);\n                assert(indexBuffer);\n                assert(segments);\n                program.draw(painter, gl.TRIANGLES, depthMode, stencilMode, ColorMode.alphaBlended, CullFaceMode.backCCW, uniformValues, layer.id, buffer, indexBuffer, segments);\n            }\n        } else {\n            const depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly);\n            const stencilMode = stencilModes[coord.overscaledZ];\n            const {tileBoundsBuffer, tileBoundsIndexBuffer, tileBoundsSegments} = painter.getTileBoundsBuffers(tile);\n\n            program.draw(painter, gl.TRIANGLES, depthMode, stencilMode, ColorMode.alphaBlended, CullFaceMode.disabled,\n                uniformValues, layer.id, tileBoundsBuffer,\n                tileBoundsIndexBuffer, tileBoundsSegments);\n        }\n    }\n\n    painter.resetStencilClippingMasks();\n}\n\nfunction cutoffParamsForElevation(tr: Transform): [number, number, number, number] {\n    const near = tr._nearZ;\n    const far = tr.projection.farthestPixelDistance(tr);\n    const zRange = far - near;\n    const fadeRangePixels = tr.height * 0.2;\n    const cutoffDistance = near + fadeRangePixels;\n    const relativeCutoffDistance = ((cutoffDistance - near) / zRange);\n    const relativeCutoffFadeDistance = ((cutoffDistance - fadeRangePixels - near) / zRange);\n    return [near, far, relativeCutoffFadeDistance, relativeCutoffDistance];\n}\n\nexport function prepare(layer: RasterParticleStyleLayer, sourceCache: SourceCache, _: Painter): void {\n    const source = sourceCache.getSource();\n    if (!(source instanceof RasterArrayTileSource) || !source.loaded()) return;\n\n    const sourceLayer = layer.sourceLayer || (source.rasterLayerIds && source.rasterLayerIds[0]);\n    if (!sourceLayer) return;\n\n    const band = layer.paint.get('raster-particle-array-band') || source.getInitialBand(sourceLayer);\n    if (band == null) return;\n\n    // $FlowFixMe[incompatible-type]\n    const tiles: Array<RasterArrayTile> = sourceCache.getIds().map(id => sourceCache.getTileByID(id));\n    for (const tile of tiles) {\n        if (tile.updateNeeded(sourceLayer, band)) {\n            source.prepareTile(tile, sourceLayer, band);\n        }\n    }\n}\n","// @flow\n\nimport DepthMode from '../gl/depth_mode.js';\nimport StencilMode from '../gl/stencil_mode.js';\nimport CullFaceMode from '../gl/cull_face_mode.js';\nimport {debugUniformValues} from './program/debug_program.js';\nimport Color from '../style-spec/util/color.js';\nimport ColorMode from '../gl/color_mode.js';\nimport browser from '../util/browser.js';\nimport {globeDenormalizeECEF, transitionTileAABBinECEF, globeToMercatorTransition} from '../geo/projection/globe_util.js';\nimport {mat4} from 'gl-matrix';\n\nimport type Painter from './painter.js';\nimport type SourceCache from '../source/source_cache.js';\nimport type {OverscaledTileID} from '../source/tile_id.js';\n\nconst topColor = new Color(1, 0, 0, 1);\nconst btmColor = new Color(0, 1, 0, 1);\nconst leftColor = new Color(0, 0, 1, 1);\nconst rightColor = new Color(1, 0, 1, 1);\nconst centerColor = new Color(0, 1, 1, 1);\n\nexport default function drawDebug(painter: Painter, sourceCache: SourceCache, coords: Array<OverscaledTileID>, color: Color, silhouette: boolean, showParseStatus: boolean) {\n    for (let i = 0; i < coords.length; i++) {\n        if (silhouette) {\n            const radius = 1;\n            const darkenFactor = 0.8;\n            const colorMiddle = new Color(color.r * darkenFactor, color.g * darkenFactor, color.b * darkenFactor, 1.0);\n            drawDebugTile(painter, sourceCache, coords[i], color, -radius, -radius, showParseStatus);\n            drawDebugTile(painter, sourceCache, coords[i], color, -radius, radius, showParseStatus);\n            drawDebugTile(painter, sourceCache, coords[i], color, radius, radius, showParseStatus);\n            drawDebugTile(painter, sourceCache, coords[i], color, radius, -radius, showParseStatus);\n            drawDebugTile(painter, sourceCache, coords[i], colorMiddle, 0, 0, showParseStatus);\n        } else {\n            drawDebugTile(painter, sourceCache, coords[i], color, 0, 0, showParseStatus);\n        }\n    }\n}\n\nexport function drawDebugPadding(painter: Painter) {\n    const padding = painter.transform.padding;\n    const lineWidth = 3;\n    // Top\n    drawHorizontalLine(painter, painter.transform.height - (padding.top || 0), lineWidth, topColor);\n    // Bottom\n    drawHorizontalLine(painter, padding.bottom || 0, lineWidth, btmColor);\n    // Left\n    drawVerticalLine(painter, padding.left || 0, lineWidth, leftColor);\n    // Right\n    drawVerticalLine(painter, painter.transform.width - (padding.right || 0), lineWidth, rightColor);\n    // Center\n    const center = painter.transform.centerPoint;\n    drawCrosshair(painter, center.x, painter.transform.height - center.y, centerColor);\n}\n\nexport function drawDebugQueryGeometry(painter: Painter, sourceCache: SourceCache, coords: Array<OverscaledTileID>) {\n    for (let i = 0; i < coords.length; i++) {\n        drawTileQueryGeometry(painter, sourceCache, coords[i]);\n    }\n}\n\nfunction drawDebugTile(painter: Painter, sourceCache: SourceCache, coord: OverscaledTileID, color: Color, offsetX: number, offsetY: number, showParseStatus: boolean) {\n    const context = painter.context;\n    const tr = painter.transform;\n    const gl = context.gl;\n\n    const isGlobeProjection = tr.projection.name === 'globe';\n    const definesValues = isGlobeProjection ? ['PROJECTION_GLOBE_VIEW'] : [];\n\n    let posMatrix = mat4.clone(coord.projMatrix);\n\n    if (isGlobeProjection && globeToMercatorTransition(tr.zoom) > 0) {\n        // We use a custom tile matrix here in order to handle the globe-to-mercator transition\n        // the following is equivalent to transform.calculatePosMatrix,\n        // except we use transitionTileAABBinECEF instead of globeTileBounds to account for the transition.\n        const bounds = transitionTileAABBinECEF(coord.canonical, tr);\n        const decode = globeDenormalizeECEF(bounds);\n        posMatrix = mat4.multiply(new Float32Array(16), tr.globeMatrix, decode);\n\n        mat4.multiply(posMatrix, tr.projMatrix, posMatrix);\n    }\n\n    const jitterMatrix = mat4.create();\n    jitterMatrix[12] += 2 * offsetX / (browser.devicePixelRatio * tr.width);\n    jitterMatrix[13] += 2 * offsetY / (browser.devicePixelRatio * tr.height);\n\n    mat4.multiply(posMatrix, jitterMatrix, posMatrix);\n\n    const program = painter.getOrCreateProgram('debug', {defines: definesValues});\n    const tile = sourceCache.getTileByID(coord.key);\n    if (painter.terrain) painter.terrain.setupElevationDraw(tile, program);\n\n    const depthMode = DepthMode.disabled;\n    const stencilMode = StencilMode.disabled;\n    const colorMode = painter.colorModeForRenderPass();\n    const id = '$debug';\n\n    context.activeTexture.set(gl.TEXTURE0);\n    // Bind the empty texture for drawing outlines\n    painter.emptyTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n\n    if (isGlobeProjection) {\n        tile._makeGlobeTileDebugBuffers(painter.context, tr);\n    } else {\n        tile._makeDebugTileBoundsBuffers(painter.context, tr.projection);\n    }\n\n    const debugBuffer = tile._tileDebugBuffer || painter.debugBuffer;\n    const debugIndexBuffer = tile._tileDebugIndexBuffer || painter.debugIndexBuffer;\n    const debugSegments = tile._tileDebugSegments || painter.debugSegments;\n\n    program.draw(painter, gl.LINE_STRIP, depthMode, stencilMode, colorMode, CullFaceMode.disabled,\n        debugUniformValues(posMatrix, color), id,\n        debugBuffer, debugIndexBuffer, debugSegments,\n        null, null, null, [tile._globeTileDebugBorderBuffer]);\n\n    if (showParseStatus) {\n        const tileRawData = tile.latestRawTileData;\n        const tileByteLength = (tileRawData && tileRawData.byteLength) || 0;\n        const tileSizeKb = Math.floor(tileByteLength / 1024);\n        let tileLabel = coord.canonical.toString();\n        if (coord.overscaledZ !== coord.canonical.z) {\n            tileLabel += ` => ${coord.overscaledZ}`;\n        }\n        tileLabel += ` ${tile.state}`;\n        tileLabel += ` ${tileSizeKb}kb`;\n        drawTextToOverlay(painter, tileLabel);\n    }\n\n    const tileSize = sourceCache.getTile(coord).tileSize;\n    const scaleRatio = (512 / Math.min(tileSize, 512) * (coord.overscaledZ / tr.zoom)) * 0.5;\n    const debugTextBuffer = tile._tileDebugTextBuffer || painter.debugBuffer;\n    const debugTextIndexBuffer = tile._tileDebugTextIndexBuffer || painter.quadTriangleIndexBuffer;\n    const debugTextSegments = tile._tileDebugTextSegments || painter.debugSegments;\n\n    program.draw(painter, gl.TRIANGLES, depthMode, stencilMode, ColorMode.alphaBlended, CullFaceMode.disabled,\n        debugUniformValues(posMatrix, Color.transparent, scaleRatio), id,\n        debugTextBuffer, debugTextIndexBuffer, debugTextSegments,\n        null, null, null, [tile._globeTileDebugTextBuffer]);\n}\n\nfunction drawCrosshair(painter: Painter, x: number, y: number, color: Color) {\n    const size = 20;\n    const lineWidth = 2;\n    //Vertical line\n    drawDebugSSRect(painter, x - lineWidth / 2, y - size / 2, lineWidth, size, color);\n    //Horizontal line\n    drawDebugSSRect(painter, x - size / 2, y - lineWidth / 2, size, lineWidth, color);\n}\n\nfunction drawHorizontalLine(painter: Painter, y: number, lineWidth: number, color: Color) {\n    drawDebugSSRect(painter, 0, y  + lineWidth / 2, painter.transform.width,  lineWidth, color);\n}\n\nfunction drawVerticalLine(painter: Painter, x: number, lineWidth: number, color: Color) {\n    drawDebugSSRect(painter, x - lineWidth / 2, 0, lineWidth,  painter.transform.height, color);\n}\n\nfunction drawDebugSSRect(painter: Painter, x: number, y: number, width: number, height: number, color: Color) {\n    const context = painter.context;\n    const gl = context.gl;\n\n    gl.enable(gl.SCISSOR_TEST);\n    gl.scissor(x * browser.devicePixelRatio, y * browser.devicePixelRatio, width * browser.devicePixelRatio, height * browser.devicePixelRatio);\n    context.clear({color});\n    gl.disable(gl.SCISSOR_TEST);\n}\n\nfunction drawTileQueryGeometry(painter: Painter, sourceCache: SourceCache, coord: OverscaledTileID) {\n    const context = painter.context;\n    const gl = context.gl;\n\n    const posMatrix = coord.projMatrix;\n    const program = painter.getOrCreateProgram('debug');\n    const tile = sourceCache.getTileByID(coord.key);\n    if (painter.terrain) painter.terrain.setupElevationDraw(tile, program);\n\n    const depthMode = DepthMode.disabled;\n    const stencilMode = StencilMode.disabled;\n    const colorMode = painter.colorModeForRenderPass();\n    const id = '$debug';\n\n    context.activeTexture.set(gl.TEXTURE0);\n    // Bind the empty texture for drawing outlines\n    painter.emptyTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n\n    const queryViz = tile.queryGeometryDebugViz;\n    const boundsViz = tile.queryBoundsDebugViz;\n\n    if (queryViz && queryViz.vertices.length > 0) {\n        queryViz.lazyUpload(context);\n        const vertexBuffer = queryViz.vertexBuffer;\n        const indexBuffer = queryViz.indexBuffer;\n        const segments = queryViz.segments;\n        if (vertexBuffer != null && indexBuffer != null && segments != null) {\n            program.draw(painter, gl.LINE_STRIP, depthMode, stencilMode, colorMode, CullFaceMode.disabled,\n                debugUniformValues(posMatrix, queryViz.color), id,\n                vertexBuffer, indexBuffer, segments);\n        }\n    }\n\n    if (boundsViz && boundsViz.vertices.length > 0) {\n        boundsViz.lazyUpload(context);\n        const vertexBuffer = boundsViz.vertexBuffer;\n        const indexBuffer = boundsViz.indexBuffer;\n        const segments = boundsViz.segments;\n        if (vertexBuffer != null && indexBuffer != null && segments != null) {\n            program.draw(painter, gl.LINE_STRIP, depthMode, stencilMode, colorMode, CullFaceMode.disabled,\n                debugUniformValues(posMatrix, boundsViz.color), id,\n                vertexBuffer, indexBuffer, segments);\n        }\n    }\n}\n\nfunction drawTextToOverlay(painter: Painter, text: string) {\n    painter.initDebugOverlayCanvas();\n    const canvas = painter.debugOverlayCanvas;\n    const gl = painter.context.gl;\n    const ctx2d = painter.debugOverlayCanvas.getContext('2d');\n    ctx2d.clearRect(0, 0, canvas.width, canvas.height);\n\n    ctx2d.shadowColor = 'white';\n    ctx2d.shadowBlur = 2;\n    ctx2d.lineWidth = 1.5;\n    ctx2d.strokeStyle = 'white';\n    ctx2d.textBaseline = 'top';\n    ctx2d.font = `bold ${36}px Open Sans, sans-serif`;\n    ctx2d.fillText(text, 5, 5);\n    ctx2d.strokeText(text, 5, 5);\n\n    painter.debugOverlayTexture.update(canvas);\n    painter.debugOverlayTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n}\n","// @flow\nimport {createLayout} from '../util/struct_array.js';\n\nimport type {StructArrayLayout} from '../util/struct_array.js';\n\nexport const skyboxAttributes: StructArrayLayout = createLayout([\n    {name: 'a_pos_3f',  components: 3, type: 'Float32'}\n]);\n\nexport default skyboxAttributes;\nexport const {members, size, alignment} = skyboxAttributes;\n","// @flow\n\nimport {members as skyboxAttributes} from './skybox_attributes.js';\nimport {SkyboxVertexArray, TriangleIndexArray} from '../data/array_types.js';\nimport SegmentVector from '../data/segment.js';\nimport type IndexBuffer from '../gl/index_buffer.js';\nimport type VertexBuffer from '../gl/vertex_buffer.js';\nimport type Context from '../gl/context.js';\n\nfunction addVertex(vertexArray: SkyboxVertexArray, x: number, y: number, z: number) {\n    vertexArray.emplaceBack(\n        // a_pos\n        x,\n        y,\n        z\n    );\n}\n\nclass SkyboxGeometry {\n    vertexArray: SkyboxVertexArray;\n    vertexBuffer: VertexBuffer;\n    indices: TriangleIndexArray;\n    indexBuffer: IndexBuffer;\n    segment: SegmentVector;\n\n    constructor(context: Context) {\n        this.vertexArray = new SkyboxVertexArray();\n        this.indices = new TriangleIndexArray();\n\n        addVertex(this.vertexArray, -1.0, -1.0,  1.0);\n        addVertex(this.vertexArray,  1.0, -1.0,  1.0);\n        addVertex(this.vertexArray, -1.0,  1.0,  1.0);\n        addVertex(this.vertexArray,  1.0,  1.0,  1.0);\n        addVertex(this.vertexArray, -1.0, -1.0, -1.0);\n        addVertex(this.vertexArray,  1.0, -1.0, -1.0);\n        addVertex(this.vertexArray, -1.0,  1.0, -1.0);\n        addVertex(this.vertexArray,  1.0,  1.0, -1.0);\n\n        // +x\n        this.indices.emplaceBack(5, 1, 3);\n        this.indices.emplaceBack(3, 7, 5);\n        // -x\n        this.indices.emplaceBack(6, 2, 0);\n        this.indices.emplaceBack(0, 4, 6);\n        // +y\n        this.indices.emplaceBack(2, 6, 7);\n        this.indices.emplaceBack(7, 3, 2);\n        // -y\n        this.indices.emplaceBack(5, 4, 0);\n        this.indices.emplaceBack(0, 1, 5);\n        // +z\n        this.indices.emplaceBack(0, 2, 3);\n        this.indices.emplaceBack(3, 1, 0);\n        // -z\n        this.indices.emplaceBack(7, 6, 4);\n        this.indices.emplaceBack(4, 5, 7);\n\n        this.vertexBuffer = context.createVertexBuffer(this.vertexArray, skyboxAttributes);\n        this.indexBuffer = context.createIndexBuffer(this.indices);\n\n        this.segment = SegmentVector.simpleSegment(0, 0, 36, 12);\n    }\n}\n\nexport default SkyboxGeometry;\n","// @flow\n\nimport StencilMode from '../gl/stencil_mode.js';\nimport DepthMode from '../gl/depth_mode.js';\nimport ColorMode from '../gl/color_mode.js';\nimport CullFaceMode from '../gl/cull_face_mode.js';\nimport Texture from './texture.js';\nimport Program from './program.js';\nimport SkyboxGeometry from './skybox_geometry.js';\nimport {skyboxUniformValues, skyboxGradientUniformValues} from './program/skybox_program.js';\nimport {skyboxCaptureUniformValues} from './program/skybox_capture_program.js';\nimport SkyLayer from '../style/style_layer/sky_style_layer.js';\nimport {mat3, mat4} from 'gl-matrix';\nimport assert from 'assert';\nimport {globeToMercatorTransition} from '../geo/projection/globe_util.js';\n\nimport type SourceCache from '../source/source_cache.js';\nimport type Painter from './painter.js';\nimport type {Mat4} from 'gl-matrix';\n\nexport default drawSky;\n\nfunction drawSky(painter: Painter, sourceCache: SourceCache, layer: SkyLayer) {\n    const tr = painter.transform;\n    // Note: we render sky for globe projection during the transition to mercator or if atmosphere is disabled.\n    const transitionOpacity = !painter._atmosphere ? 1.0 : globeToMercatorTransition(tr.zoom);\n    const opacity = layer.paint.get('sky-opacity') * transitionOpacity;\n    if (opacity === 0) {\n        return;\n    }\n\n    const context = painter.context;\n    const type = layer.paint.get('sky-type');\n    const depthMode = new DepthMode(context.gl.LEQUAL, DepthMode.ReadOnly, [0, 1]);\n    const temporalOffset = (painter.frameCounter / 1000.0) % 1;\n\n    if (type === 'atmosphere') {\n        if (painter.renderPass === 'offscreen') {\n            if (layer.needsSkyboxCapture(painter)) {\n                captureSkybox(painter, layer, 32, 32);\n                layer.markSkyboxValid(painter);\n            }\n        } else if (painter.renderPass === 'sky') {\n            drawSkyboxFromCapture(painter, layer, depthMode, opacity, temporalOffset);\n        }\n    } else if (type === 'gradient') {\n        if (painter.renderPass === 'sky') {\n            drawSkyboxGradient(painter, layer, depthMode, opacity, temporalOffset);\n        }\n    } else {\n        assert(false, `${type} is unsupported sky-type`);\n    }\n}\n\nfunction drawSkyboxGradient(painter: Painter, layer: SkyLayer, depthMode: DepthMode, opacity: number, temporalOffset: number) {\n    const context = painter.context;\n    const gl = context.gl;\n    const transform = painter.transform;\n    const program = painter.getOrCreateProgram('skyboxGradient');\n\n    // Lazily initialize geometry and texture if they havent been created yet.\n    if (!layer.skyboxGeometry) {\n        layer.skyboxGeometry = new SkyboxGeometry(context);\n    }\n    context.activeTexture.set(gl.TEXTURE0);\n    let colorRampTexture = layer.colorRampTexture;\n    if (!colorRampTexture) {\n        colorRampTexture = layer.colorRampTexture = new Texture(context, layer.colorRamp, gl.RGBA);\n    }\n    colorRampTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n    const uniformValues = skyboxGradientUniformValues(\n        transform.skyboxMatrix,\n        layer.getCenter(painter, false),\n        layer.paint.get('sky-gradient-radius'),\n        opacity,\n        temporalOffset\n    );\n\n    painter.uploadCommonUniforms(context, program);\n\n    program.draw(painter, gl.TRIANGLES, depthMode, StencilMode.disabled,\n        painter.colorModeForRenderPass(), CullFaceMode.backCW,\n        uniformValues, 'skyboxGradient', layer.skyboxGeometry.vertexBuffer,\n        layer.skyboxGeometry.indexBuffer, layer.skyboxGeometry.segment);\n}\n\nfunction drawSkyboxFromCapture(painter: Painter, layer: SkyLayer, depthMode: DepthMode, opacity: number, temporalOffset: number) {\n    const context = painter.context;\n    const gl = context.gl;\n    const transform = painter.transform;\n    const program = painter.getOrCreateProgram('skybox');\n\n    context.activeTexture.set(gl.TEXTURE0);\n\n    gl.bindTexture(gl.TEXTURE_CUBE_MAP, layer.skyboxTexture);\n\n    const uniformValues = skyboxUniformValues(transform.skyboxMatrix, layer.getCenter(painter, false), 0, opacity, temporalOffset);\n\n    painter.uploadCommonUniforms(context, program);\n\n    program.draw(painter, gl.TRIANGLES, depthMode, StencilMode.disabled,\n        painter.colorModeForRenderPass(), CullFaceMode.backCW,\n        uniformValues, 'skybox', layer.skyboxGeometry.vertexBuffer,\n        layer.skyboxGeometry.indexBuffer, layer.skyboxGeometry.segment);\n}\n\nfunction drawSkyboxFace(painter: Painter, layer: SkyLayer, program: Program<any>, faceRotate: Mat4, sunDirection: [number, number, number], i: number) {\n    const context = painter.context;\n    const gl = context.gl;\n\n    const atmosphereColor = layer.paint.get('sky-atmosphere-color');\n    const atmosphereHaloColor = layer.paint.get('sky-atmosphere-halo-color');\n    const sunIntensity = layer.paint.get('sky-atmosphere-sun-intensity');\n\n    const uniformValues = skyboxCaptureUniformValues(\n        mat3.fromMat4(mat3.create(), faceRotate),\n        sunDirection,\n        sunIntensity,\n        atmosphereColor,\n        atmosphereHaloColor);\n\n    const glFace = gl.TEXTURE_CUBE_MAP_POSITIVE_X + i;\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, glFace, layer.skyboxTexture, 0);\n\n    program.draw(painter, gl.TRIANGLES, DepthMode.disabled, StencilMode.disabled, ColorMode.unblended, CullFaceMode.frontCW,\n        uniformValues, 'skyboxCapture', layer.skyboxGeometry.vertexBuffer,\n        layer.skyboxGeometry.indexBuffer, layer.skyboxGeometry.segment);\n}\n\nfunction captureSkybox(painter: Painter, layer: SkyLayer, width: number, height: number) {\n    const context = painter.context;\n    const gl = context.gl;\n    let fbo = layer.skyboxFbo;\n\n    // Using absence of fbo as a signal for lazy initialization of all resources, cache resources in layer object\n    if (!fbo) {\n        fbo = layer.skyboxFbo = context.createFramebuffer(width, height, true, null);\n        layer.skyboxGeometry = new SkyboxGeometry(context);\n        layer.skyboxTexture = context.gl.createTexture();\n\n        gl.bindTexture(gl.TEXTURE_CUBE_MAP, layer.skyboxTexture);\n        gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n        gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\n        for (let i = 0; i < 6; ++i) {\n            const glFace = gl.TEXTURE_CUBE_MAP_POSITIVE_X + i;\n\n            // The format here could be RGB, but render tests are not happy with rendering to such a format\n            gl.texImage2D(glFace, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n        }\n    }\n\n    context.bindFramebuffer.set(fbo.framebuffer);\n    context.viewport.set([0, 0, width, height]);\n\n    const sunDirection = layer.getCenter(painter, true);\n    const program = painter.getOrCreateProgram('skyboxCapture');\n    const faceRotate = new Float64Array(16);\n\n    // +x;\n    mat4.identity(faceRotate);\n    mat4.rotateY(faceRotate, faceRotate, -Math.PI * 0.5);\n    drawSkyboxFace(painter, layer, program, faceRotate, sunDirection, 0);\n    // -x\n    mat4.identity(faceRotate);\n    mat4.rotateY(faceRotate, faceRotate, Math.PI * 0.5);\n    drawSkyboxFace(painter, layer, program, faceRotate, sunDirection, 1);\n    // +y\n    mat4.identity(faceRotate);\n    mat4.rotateX(faceRotate, faceRotate, -Math.PI * 0.5);\n    drawSkyboxFace(painter, layer, program, faceRotate, sunDirection, 2);\n    // -y\n    mat4.identity(faceRotate);\n    mat4.rotateX(faceRotate, faceRotate, Math.PI * 0.5);\n    drawSkyboxFace(painter, layer, program, faceRotate, sunDirection, 3);\n    // +z\n    mat4.identity(faceRotate);\n    drawSkyboxFace(painter, layer, program, faceRotate, sunDirection, 4);\n    // -z\n    mat4.identity(faceRotate);\n    mat4.rotateY(faceRotate, faceRotate, Math.PI);\n    drawSkyboxFace(painter, layer, program, faceRotate, sunDirection, 5);\n\n    context.viewport.set([0, 0, painter.width, painter.height]);\n}\n","// @flow\nimport {createLayout} from '../util/struct_array.js';\n\nimport type {StructArrayLayout} from '../util/struct_array.js';\n\nexport const atmosphereLayout: StructArrayLayout = createLayout([\n    {type: 'Float32', name: 'a_pos', components: 3},\n    {type: 'Float32', name: 'a_uv', components: 2}\n]);\n","// @flow\nimport type IndexBuffer from '../gl/index_buffer.js';\nimport type VertexBuffer from '../gl/vertex_buffer.js';\nimport SegmentVector from '../data/segment.js';\nimport type Context from '../gl/context.js';\nimport {atmosphereLayout} from './atmosphere_attributes.js';\nimport {TriangleIndexArray, AtmosphereVertexArray} from '../data/array_types.js';\n\nexport class AtmosphereBuffer {\n    vertexBuffer: VertexBuffer;\n    indexBuffer: IndexBuffer;\n    segments: SegmentVector;\n\n    constructor(context: Context) {\n        const vertices = new AtmosphereVertexArray();\n        vertices.emplaceBack(-1, 1, 1, 0, 0);\n        vertices.emplaceBack(1, 1, 1, 1, 0);\n        vertices.emplaceBack(1, -1, 1, 1, 1);\n        vertices.emplaceBack(-1, -1, 1, 0, 1);\n\n        const triangles = new TriangleIndexArray();\n        triangles.emplaceBack(0, 1, 2);\n        triangles.emplaceBack(2, 3, 0);\n\n        this.vertexBuffer = context.createVertexBuffer(vertices, atmosphereLayout.members);\n        this.indexBuffer = context.createIndexBuffer(triangles);\n        this.segments = SegmentVector.simpleSegment(0, 0, 4, 2);\n    }\n\n    destroy() {\n        this.vertexBuffer.destroy();\n        this.indexBuffer.destroy();\n        this.segments.destroy();\n    }\n}\n","// @flow\nimport {createLayout} from '../util/struct_array.js';\n\nimport type {StructArrayLayout} from '../util/struct_array.js';\n\nexport const starsLayout: StructArrayLayout = createLayout([\n    {type: 'Float32', name: 'a_pos_3f', components: 3},\n    {type: 'Float32', name: 'a_uv', components: 2},\n    {type: 'Float32', name: 'a_size_scale', components: 1},\n    {type: 'Float32', name: 'a_fade_opacity', components: 1}\n]);\n","// @flow\nimport Color from '../style-spec/util/color.js';\n\nimport StencilMode from '../gl/stencil_mode.js';\nimport DepthMode from '../gl/depth_mode.js';\nimport {default as ColorMode, ZERO, ONE, ONE_MINUS_SRC_ALPHA} from '../gl/color_mode.js';\nimport CullFaceMode from '../gl/cull_face_mode.js';\nimport {\n    globeToMercatorTransition,\n    globeUseCustomAntiAliasing\n} from './../geo/projection/globe_util.js';\nimport {atmosphereUniformValues} from '../terrain/globe_raster_program.js';\nimport {AtmosphereBuffer} from '../render/atmosphere_buffer.js';\nimport {degToRad, mapValue, clamp} from '../util/util.js';\nimport {mat3, vec3, mat4, quat} from 'gl-matrix';\nimport Fog from '../style/fog.js';\nimport SegmentVector from '../data/segment.js';\nimport {TriangleIndexArray, StarsVertexArray} from '../data/array_types.js';\nimport {starsLayout} from './stars_attributes.js';\nimport {starsUniformValues} from '../terrain/stars_program.js';\nimport {mulberry32} from '../style-spec/util/random.js';\nimport type Painter from './painter.js';\nimport type {Vec3} from 'gl-matrix';\nimport type IndexBuffer from '../gl/index_buffer.js';\nimport type VertexBuffer from '../gl/vertex_buffer.js';\nimport type {DynamicDefinesType} from './program/program_uniforms.js';\n\nfunction generateUniformDistributedPointsOnSphere(pointsCount: number): Array<Vec3> {\n    const sRand = mulberry32(30);\n\n    const points: Array<Vec3> = [];\n    for (let i = 0; i < pointsCount; ++i) {\n        const lon = 2 * Math.PI * sRand();\n        const lat = Math.acos(1 - 2 * sRand()) - Math.PI * 0.5;\n\n        points.push(vec3.fromValues(Math.cos(lat) * Math.cos(lon), Math.cos(lat) * Math.sin(lon), Math.sin(lat)));\n    }\n\n    return points;\n}\n\nclass StarsParams {\n    starsCount: number;\n    sizeMultiplier: number;\n    sizeRange: number;\n    intensityRange: number;\n\n    constructor() {\n        this.starsCount = 16000;\n        this.sizeMultiplier = 0.15;\n        this.sizeRange = 100;\n        this.intensityRange = 200;\n    }\n}\nclass Atmosphere {\n    atmosphereBuffer: ?AtmosphereBuffer;\n    starsVx: ?VertexBuffer;\n    starsIdx: ?IndexBuffer;\n    starsSegments: SegmentVector;\n    colorModeAlphaBlendedWriteRGB: ColorMode;\n    colorModeWriteAlpha: ColorMode;\n    updateNeeded: boolean;\n\n    params: StarsParams;\n\n    constructor(painter: Painter) {\n        this.colorModeAlphaBlendedWriteRGB = new ColorMode([ONE, ONE_MINUS_SRC_ALPHA, ONE, ONE_MINUS_SRC_ALPHA], Color.transparent, [true, true, true, false]);\n        this.colorModeWriteAlpha = new ColorMode([ONE, ZERO, ONE, ZERO], Color.transparent, [false, false, false, true]);\n\n        this.params = new StarsParams();\n        this.updateNeeded = true;\n\n        painter.tp.registerParameter(this.params, [\"Stars\"], \"starsCount\", {min:100, max: 16000, step:1}, () => { this.updateNeeded = true; });\n        painter.tp.registerParameter(this.params, [\"Stars\"], \"sizeMultiplier\", {min:0.01, max: 2.0, step:0.01});\n        painter.tp.registerParameter(this.params, [\"Stars\"], \"sizeRange\", {min:0.0, max: 200.0, step:1}, () => { this.updateNeeded = true; });\n        painter.tp.registerParameter(this.params, [\"Stars\"], \"intensityRange\", {min:0.0, max: 200.0, step:1}, () => { this.updateNeeded = true; });\n    }\n\n    update(painter: Painter) {\n        const context = painter.context;\n\n        if (!this.atmosphereBuffer || this.updateNeeded) {\n            this.updateNeeded = false;\n\n            this.atmosphereBuffer = new AtmosphereBuffer(context);\n\n            // Part of internal stlye spec, not exposed to gl-js\n            const sizeRange = this.params.sizeRange;\n            const intensityRange = this.params.intensityRange;\n\n            const stars = generateUniformDistributedPointsOnSphere(this.params.starsCount);\n            const sRand = mulberry32(300);\n\n            const vertices = new StarsVertexArray();\n            const triangles = new TriangleIndexArray();\n\n            let base = 0;\n            for (let i = 0; i < stars.length; ++i) {\n\n                const star = vec3.scale([], stars[i], 200.0);\n\n                const size = Math.max(0, 1.0 + 0.01 * sizeRange * (-0.5 + 1.0 * sRand()));\n                const intensity = Math.max(0, 1.0 + 0.01 * intensityRange * (-0.5 + 1.0 * sRand()));\n\n                vertices.emplaceBack(star[0], star[1], star[2], -1, -1, size, intensity);\n                vertices.emplaceBack(star[0], star[1], star[2], 1, -1, size, intensity);\n                vertices.emplaceBack(star[0], star[1], star[2], 1, 1, size, intensity);\n                vertices.emplaceBack(star[0], star[1], star[2], -1, 1, size, intensity);\n\n                triangles.emplaceBack(base + 0, base + 1, base + 2);\n                triangles.emplaceBack(base + 0, base + 2, base + 3);\n\n                base += 4;\n            }\n\n            this.starsVx = context.createVertexBuffer(vertices, starsLayout.members);\n            this.starsIdx = context.createIndexBuffer(triangles);\n            this.starsSegments = SegmentVector.simpleSegment(0, 0, vertices.length, triangles.length);\n        }\n    }\n\n    destroy() {\n        if (this.atmosphereBuffer) {\n            this.atmosphereBuffer.destroy();\n        }\n        if (this.starsVx) {\n            this.starsVx.destroy();\n        }\n        if (this.starsIdx) {\n            this.starsIdx.destroy();\n        }\n    }\n\n    drawAtmosphereGlow(painter: Painter, fog: Fog) {\n        const context = painter.context;\n        const gl = context.gl;\n        const tr = painter.transform;\n        const depthMode = new DepthMode(gl.LEQUAL, DepthMode.ReadOnly, [0, 1]);\n\n        const transitionT = globeToMercatorTransition(tr.zoom);\n\n        const fogColor = fog.properties.get('color').toArray01();\n        const highColor = fog.properties.get('high-color').toArray01();\n        const spaceColor = fog.properties.get('space-color').toArray01PremultipliedAlpha();\n\n        // https://www.desmos.com/calculator/oanvvpr36d\n        // Ensure horizon blend is 0-exclusive to prevent division by 0 in the shader\n        const minHorizonBlend = 0.0005;\n        const horizonBlend = mapValue(fog.properties.get('horizon-blend'), 0.0, 1.0, minHorizonBlend, 0.25);\n\n        // Use a slightly smaller size of the globe to account for custom\n        // antialiasing that reduces the size of the globe of two pixels\n        // https://www.desmos.com/calculator/xpgmzghc37\n        const globeRadius = globeUseCustomAntiAliasing(painter, context, tr) && horizonBlend === minHorizonBlend ?\n            tr.worldSize / (2.0 * Math.PI * 1.025) - 1.0 : tr.globeRadius;\n\n        const temporalOffset = (painter.frameCounter / 1000.0) % 1;\n        const globeCenterInViewSpace = (((tr.globeCenterInViewSpace): any): Array<number>);\n        const globeCenterDistance = vec3.length(globeCenterInViewSpace);\n        const distanceToHorizon = Math.sqrt(Math.pow(globeCenterDistance, 2.0) - Math.pow(globeRadius, 2.0));\n        const horizonAngle = Math.acos(distanceToHorizon / globeCenterDistance);\n\n        const draw = (alphaPass: boolean) => {\n            const defines = tr.projection.name === 'globe' ? ['PROJECTION_GLOBE_VIEW', 'FOG'] : ['FOG'];\n            if (alphaPass) {\n                defines.push(\"ALPHA_PASS\");\n            }\n            const program = painter.getOrCreateProgram('globeAtmosphere', {defines: ((defines: any): DynamicDefinesType[])});\n\n            const uniforms = atmosphereUniformValues(\n                tr.frustumCorners.TL,\n                tr.frustumCorners.TR,\n                tr.frustumCorners.BR,\n                tr.frustumCorners.BL,\n                tr.frustumCorners.horizon,\n                transitionT,\n                horizonBlend,\n                fogColor,\n                highColor,\n                spaceColor,\n                temporalOffset,\n                horizonAngle);\n\n            painter.uploadCommonUniforms(context, program);\n\n            const buffer = this.atmosphereBuffer;\n            const colorMode = alphaPass ? this.colorModeWriteAlpha : this.colorModeAlphaBlendedWriteRGB;\n            const name = alphaPass ? \"atmosphere_glow_alpha\" : \"atmosphere_glow\";\n            if (buffer) {\n                program.draw(painter, gl.TRIANGLES, depthMode, StencilMode.disabled,\n                        colorMode, CullFaceMode.backCW, uniforms, name,\n                        buffer.vertexBuffer, buffer.indexBuffer, buffer.segments);\n            }\n        };\n\n        // Write atmosphere color\n        draw(false);\n\n        // Write atmosphere alpha - transparent areas need to be explicitly marked in a separate pass\n        draw(true);\n    }\n\n    drawStars(painter: Painter, fog: Fog) {\n        const starIntensity = clamp(fog.properties.get('star-intensity'), 0.0, 1.0);\n\n        if (starIntensity === 0) {\n            return;\n        }\n\n        const context = painter.context;\n        const gl = context.gl;\n        const tr = painter.transform;\n\n        const program = painter.getOrCreateProgram('stars');\n\n        const orientation = quat.identity([]);\n\n        quat.rotateX(orientation, orientation, -tr._pitch);\n        quat.rotateZ(orientation, orientation, -tr.angle);\n        quat.rotateX(orientation, orientation, degToRad(tr._center.lat));\n        quat.rotateY(orientation, orientation, -degToRad(tr._center.lng));\n\n        const rotationMatrix = mat4.fromQuat(new Float32Array(16), orientation);\n\n        const mvp = mat4.multiply([], tr.starsProjMatrix, rotationMatrix);\n\n        const modelView3 = mat3.fromMat4([], rotationMatrix);\n\n        const modelviewInv = mat3.invert([], modelView3);\n\n        const camUp = [0, 1, 0];\n        vec3.transformMat3(camUp, camUp, modelviewInv);\n        vec3.scale(camUp, camUp, this.params.sizeMultiplier);\n        const camRight = [1, 0, 0];\n        vec3.transformMat3(camRight, camRight, modelviewInv);\n        vec3.scale(camRight, camRight, this.params.sizeMultiplier);\n\n        const uniforms = starsUniformValues(\n              mvp,\n              camUp,\n              camRight,\n              starIntensity);\n\n        painter.uploadCommonUniforms(context, program);\n\n        if (this.starsVx && this.starsIdx) {\n            program.draw(painter, gl.TRIANGLES, DepthMode.disabled, StencilMode.disabled,\n                this.colorModeAlphaBlendedWriteRGB, CullFaceMode.disabled, uniforms, \"atmosphere_stars\",\n                this.starsVx, this.starsIdx, this.starsSegments);\n        }\n    }\n\n}\n\nexport default Atmosphere;\n","// @flow\n\nimport {modelUniformValues, modelDepthUniformValues} from './program/model_program.js';\nimport {ModelTraits, DefaultModelScale} from '../data/model.js';\n\nimport Transform from '../../src/geo/transform.js';\nimport EXTENT from '../../src/style-spec/data/extent.js';\nimport StencilMode from '../../src/gl/stencil_mode.js';\nimport ColorMode from '../../src/gl/color_mode.js';\nimport DepthMode from '../../src/gl/depth_mode.js';\nimport CullFaceMode from '../../src/gl/cull_face_mode.js';\nimport {mat4, vec3} from 'gl-matrix';\nimport {getMetersPerPixelAtLatitude, mercatorZfromAltitude} from '../../src/geo/mercator_coordinate.js';\nimport TextureSlots from './texture_slots.js';\nimport {convertModelMatrixForGlobe} from '../util/model_util.js';\nimport {clamp, warnOnce} from '../../src/util/util.js';\nimport ModelBucket from '../data/bucket/model_bucket.js';\nimport assert from 'assert';\nimport {DEMSampler} from '../../src/terrain/elevation.js';\nimport {OverscaledTileID} from '../../src/source/tile_id.js';\nimport {Aabb} from '../../src/util/primitives.js';\nimport {getCutoffParams} from '../../src/render/cutoff.js';\nimport {FOG_OPACITY_THRESHOLD} from '../../src/style/fog_helpers.js';\nimport {ZoomDependentExpression} from '../../src/style-spec/expression/index.js';\n\nimport type Tiled3dModelBucket from '../data/bucket/tiled_3d_model_bucket.js';\nimport type Painter from '../../src/render/painter.js';\nimport type {CreateProgramParams} from '../../src/render/painter.js';\nimport type SourceCache from '../../src/source/source_cache.js';\nimport type ModelStyleLayer from '../style/style_layer/model_style_layer.js';\nimport type {Mesh, Node, ModelTexture} from '../data/model.js';\nimport type {DynamicDefinesType} from '../../src/render/program/program_uniforms.js';\nimport type {Mat4} from 'gl-matrix';\nimport type VertexBuffer from '../../src/gl/vertex_buffer.js';\n\nexport default drawModels;\n\ntype ModelParameters = {\n    zScaleMatrix: Mat4;\n    negCameraPosMatrix: Mat4;\n}\n\ntype SortedMesh = {\n    mesh: Mesh;\n    depth: number;\n    modelIndex: number;\n    worldViewProjection: Mat4;\n    nodeModelMatrix: Mat4;\n}\n\ntype RenderData = {\n    shadowUniformsInitialized: boolean;\n    useSingleShadowCascade: boolean;\n    tileMatrix: Float64Array;\n    shadowTileMatrix: Float32Array;\n    aabb: Aabb;\n}\n\nfunction fogMatrixForModel(modelMatrix: Mat4, transform: Transform): Mat4 {\n    // convert model matrix from the default world size to the one used by the fog\n    const fogMatrix = [...modelMatrix];\n    const scale = transform.cameraWorldSizeForFog / transform.worldSize;\n    const scaleMatrix = mat4.identity([]);\n    mat4.scale(scaleMatrix, scaleMatrix, [scale, scale, 1]);\n    mat4.multiply(fogMatrix, scaleMatrix, fogMatrix);\n    mat4.multiply(fogMatrix, transform.worldToFogMatrix, fogMatrix);\n    return fogMatrix;\n}\n\n// Collect defines and dynamic buffers (colors, normals, uv) and bind textures. Used for single mesh and instanced draw.\nfunction setupMeshDraw(definesValues: Array<string>, dynamicBuffers: Array<?VertexBuffer>, mesh: Mesh, painter: Painter) {\n    const material = mesh.material;\n    const context = painter.context;\n\n    const {baseColorTexture, metallicRoughnessTexture} = material.pbrMetallicRoughness;\n    const {normalTexture, occlusionTexture, emissionTexture} = material;\n\n    function setupTexture(texture: ?ModelTexture, define: string, slot: number) {\n        if (!texture) return;\n\n        definesValues.push(define);\n        context.activeTexture.set(context.gl.TEXTURE0 + slot);\n        if (texture.gfxTexture) {\n            const {minFilter, magFilter, wrapS, wrapT} = texture.sampler;\n            texture.gfxTexture.bindExtraParam(minFilter, magFilter, wrapS, wrapT);\n        }\n    }\n\n    // Textures\n    setupTexture(baseColorTexture, 'HAS_TEXTURE_u_baseColorTexture', TextureSlots.BaseColor);\n    setupTexture(metallicRoughnessTexture, 'HAS_TEXTURE_u_metallicRoughnessTexture', TextureSlots.MetallicRoughness);\n    setupTexture(normalTexture, 'HAS_TEXTURE_u_normalTexture', TextureSlots.Normal);\n    setupTexture(occlusionTexture, 'HAS_TEXTURE_u_occlusionTexture', TextureSlots.Occlusion);\n    setupTexture(emissionTexture, 'HAS_TEXTURE_u_emissionTexture', TextureSlots.Emission);\n\n    if (mesh.texcoordBuffer) {\n        definesValues.push('HAS_ATTRIBUTE_a_uv_2f');\n        dynamicBuffers.push(mesh.texcoordBuffer);\n    }\n    if (mesh.colorBuffer) {\n        const colorDefine = (mesh.colorBuffer.itemSize === 12) ? 'HAS_ATTRIBUTE_a_color_3f' : 'HAS_ATTRIBUTE_a_color_4f';\n        definesValues.push(colorDefine);\n        dynamicBuffers.push(mesh.colorBuffer);\n    }\n    if (mesh.normalBuffer) {\n        definesValues.push('HAS_ATTRIBUTE_a_normal_3f');\n        dynamicBuffers.push(mesh.normalBuffer);\n    }\n\n    if (mesh.pbrBuffer) {\n        definesValues.push('HAS_ATTRIBUTE_a_pbr');\n        definesValues.push('HAS_ATTRIBUTE_a_heightBasedEmissiveStrength');\n        dynamicBuffers.push(mesh.pbrBuffer);\n    }\n\n    if (material.alphaMode === 'OPAQUE' || material.alphaMode === 'MASK') {\n        definesValues.push('UNPREMULT_TEXTURE_IN_SHADER');\n    }\n\n    // just to make the rendertests the same than native\n    if (!material.defined) {\n        definesValues.push('DIFFUSE_SHADED');\n    }\n\n    definesValues.push('USE_STANDARD_DERIVATIVES');\n}\n\nfunction drawMesh(sortedMesh: SortedMesh, painter: Painter, layer: ModelStyleLayer, modelParameters: ModelParameters, stencilMode: StencilMode, colorMode: ColorMode) {\n    const opacity = layer.paint.get('model-opacity');\n    assert(opacity > 0);\n    const context = painter.context;\n    const depthMode = new DepthMode(painter.context.gl.LEQUAL, DepthMode.ReadWrite, painter.depthRangeFor3D);\n    const tr = painter.transform;\n\n    const mesh = sortedMesh.mesh;\n    const material = mesh.material;\n    const pbr = material.pbrMetallicRoughness;\n    const fog = painter.style.fog;\n\n    let lightingMatrix;\n    if (painter.transform.projection.zAxisUnit === \"pixels\") {\n        lightingMatrix = [...sortedMesh.nodeModelMatrix];\n    } else {\n        lightingMatrix = mat4.multiply([], modelParameters.zScaleMatrix, sortedMesh.nodeModelMatrix);\n    }\n    mat4.multiply(lightingMatrix, modelParameters.negCameraPosMatrix, lightingMatrix);\n    const normalMatrix = mat4.invert([], lightingMatrix);\n    mat4.transpose(normalMatrix, normalMatrix);\n\n    const emissiveStrength = layer.paint.get('model-emissive-strength').constantOr(0.0);\n    const uniformValues = modelUniformValues(\n        new Float32Array(sortedMesh.worldViewProjection),\n        new Float32Array(lightingMatrix),\n        new Float32Array(normalMatrix),\n        /* $FlowIgnore[incompatible-call] we can safely pass null for node.matrix as it is handled in the modelUniformValues constructor */\n        null,\n        painter,\n        opacity,\n        pbr.baseColorFactor,\n        material.emissiveFactor,\n        pbr.metallicFactor,\n        pbr.roughnessFactor,\n        material,\n        emissiveStrength,\n        layer);\n\n    const programOptions: CreateProgramParams = {\n        defines: []\n    };\n\n    // Extra buffers (colors, normals, texCoords)\n    const dynamicBuffers = [];\n\n    setupMeshDraw(((programOptions.defines: any): Array<string>), dynamicBuffers, mesh, painter);\n    const shadowRenderer = painter.shadowRenderer;\n    if (shadowRenderer) { shadowRenderer.useNormalOffset = false; }\n\n    let fogMatrixArray = null;\n    if (fog) {\n        const fogMatrix = fogMatrixForModel(sortedMesh.nodeModelMatrix, painter.transform);\n        fogMatrixArray = new Float32Array(fogMatrix);\n\n        if (tr.projection.name !== 'globe') {\n            const min = mesh.aabb.min;\n            const max = mesh.aabb.max;\n            const [minOpacity, maxOpacity] = fog.getOpacityForBounds(fogMatrix, min[0], min[1], max[0], max[1]);\n            programOptions.overrideFog = minOpacity >= FOG_OPACITY_THRESHOLD || maxOpacity >= FOG_OPACITY_THRESHOLD;\n        }\n    }\n\n    const cutoffParams = getCutoffParams(painter, layer.paint.get('model-cutoff-fade-range'));\n    if (cutoffParams.shouldRenderCutoff) {\n        (programOptions.defines: any).push('RENDER_CUTOFF');\n    }\n\n    const program = painter.getOrCreateProgram('model', programOptions);\n\n    painter.uploadCommonUniforms(context, program, null, fogMatrixArray, cutoffParams);\n\n    const isShadowPass = painter.renderPass === 'shadow';\n\n    if (!isShadowPass && shadowRenderer) {\n        shadowRenderer.setupShadowsFromMatrix(sortedMesh.nodeModelMatrix, program);\n    }\n\n    const cullFaceMode = mesh.material.doubleSided ? CullFaceMode.disabled : CullFaceMode.backCCW;\n\n    program.draw(painter, context.gl.TRIANGLES, depthMode, stencilMode, colorMode, cullFaceMode,\n            uniformValues, layer.id, mesh.vertexBuffer, mesh.indexBuffer, mesh.segments, layer.paint, painter.transform.zoom,\n            undefined, dynamicBuffers);\n}\n\nexport function prepare(layer: ModelStyleLayer, sourceCache: SourceCache, painter: Painter) {\n    const modelSource = sourceCache.getSource();\n    if (!modelSource.loaded()) return;\n    if (modelSource.type === 'vector' || modelSource.type === 'geojson') {\n        const scope = modelSource.type === 'vector' ? layer.scope : \"\";\n        if (painter.modelManager) {\n            // Do it here, to prevent modelManager handling in Painter.\n            // geojson models are always set in the root scope to avoid model duplication\n            painter.modelManager.upload(painter, scope);\n        }\n        return;\n    }\n    if (modelSource.type === 'batched-model') {\n        // batched models uploads happen in tile_3d_bucket\n        return;\n    }\n    const models = (modelSource: any).getModels();\n    // Upload models\n    for (const model of models) {\n        model.upload(painter.context);\n    }\n}\n\nfunction prepareMeshes(transform: Transform, node: Node, modelMatrix: Mat4, projectionMatrix: Mat4, modelIndex: number, transparentMeshes: Array<SortedMesh>,  opaqueMeshes: Array<SortedMesh>) {\n\n    let nodeModelMatrix;\n    if (transform.projection.name === 'globe') {\n        nodeModelMatrix = convertModelMatrixForGlobe(modelMatrix, transform);\n    } else {\n        nodeModelMatrix = [...modelMatrix];\n    }\n    mat4.multiply(nodeModelMatrix, nodeModelMatrix, node.matrix);\n    const worldViewProjection = mat4.multiply([], projectionMatrix, nodeModelMatrix);\n    if (node.meshes) {\n        for (const mesh of node.meshes) {\n            if (mesh.material.alphaMode !== 'BLEND') {\n                const opaqueMesh: SortedMesh = {mesh, depth: 0.0, modelIndex, worldViewProjection, nodeModelMatrix};\n                opaqueMeshes.push(opaqueMesh);\n                continue;\n            }\n\n            const centroidPos = vec3.transformMat4([], mesh.centroid, worldViewProjection);\n            // Filter meshes behind the camera\n            if (centroidPos[2] > 0.0) {\n                const transparentMesh: SortedMesh = {mesh, depth: centroidPos[2], modelIndex, worldViewProjection, nodeModelMatrix};\n                transparentMeshes.push(transparentMesh);\n            }\n        }\n    }\n    if (node.children) {\n        for (const child of node.children) {\n            prepareMeshes(transform, child, modelMatrix, projectionMatrix, modelIndex, transparentMeshes, opaqueMeshes);\n        }\n    }\n}\n\nfunction drawShadowCaster(mesh: Mesh, matrix: Mat4, painter: Painter, layer: ModelStyleLayer) {\n    const shadowRenderer = painter.shadowRenderer;\n    if (!shadowRenderer) return;\n    const depthMode = shadowRenderer.getShadowPassDepthMode();\n    const colorMode = shadowRenderer.getShadowPassColorMode();\n    const shadowMatrix = shadowRenderer.calculateShadowPassMatrixFromMatrix(matrix);\n    const uniformValues = modelDepthUniformValues(shadowMatrix);\n    const definesValues = (painter._shadowMapDebug) ? [] : ['DEPTH_TEXTURE'];\n    const program = painter.getOrCreateProgram('modelDepth', {defines: ((definesValues: any): DynamicDefinesType[])});\n    const context = painter.context;\n    program.draw(painter, context.gl.TRIANGLES, depthMode, StencilMode.disabled, colorMode, CullFaceMode.backCCW,\n            uniformValues, layer.id, mesh.vertexBuffer, mesh.indexBuffer, mesh.segments, layer.paint, painter.transform.zoom,\n            undefined, undefined);\n}\n\nfunction drawModels(painter: Painter, sourceCache: SourceCache, layer: ModelStyleLayer, coords: Array<OverscaledTileID>) {\n    if (painter.renderPass === 'opaque') {\n        return;\n    }\n    // early return if totally transparent\n    const opacity = layer.paint.get('model-opacity');\n    if (opacity === 0) {\n        return;\n    }\n    const castShadows = layer.paint.get('model-cast-shadows');\n    if (painter.renderPass === 'shadow') {\n        if (!castShadows) {\n            return;\n        }\n        if (painter.terrain) {\n            const noShadowCutoff = 0.65;\n            if (opacity < noShadowCutoff) {\n                const expression = layer._transitionablePaint._values['model-opacity'].value.expression;\n                if (expression instanceof ZoomDependentExpression) {\n                    // avoid rendering shadows during fade in / fade out on terrain\n                    return;\n                }\n            }\n        }\n    }\n    const shadowRenderer = painter.shadowRenderer;\n    const receiveShadows = layer.paint.get('model-receive-shadows');\n    if (shadowRenderer) {\n        shadowRenderer.useNormalOffset = true;\n        if (!receiveShadows) {\n            shadowRenderer.enabled = false;\n        }\n    }\n    const cleanup = () => {\n        if (shadowRenderer) {\n            shadowRenderer.useNormalOffset = true;\n            if (!receiveShadows) {\n                shadowRenderer.enabled = true;\n            }\n        }\n    };\n\n    const modelSource = sourceCache.getSource();\n    if (painter.renderPass === 'light-beam' && modelSource.type !== 'batched-model') {\n        return;\n    }\n\n    if (modelSource.type === 'vector' || modelSource.type === 'geojson') {\n        const scope = modelSource.type === 'vector' ? layer.scope : \"\";\n        drawVectorLayerModels(painter, sourceCache, layer, coords, scope);\n        cleanup();\n        return;\n    }\n\n    if (!modelSource.loaded()) return;\n\n    if (modelSource.type === 'batched-model') {\n        drawBatchedModels(painter, sourceCache, layer, coords);\n        cleanup();\n        return;\n    }\n    const models = (modelSource: any).getModels();\n    const modelParametersVector: ModelParameters[] = [];\n\n    const mercCameraPos = (painter.transform.getFreeCameraOptions().position: any);\n    const cameraPos = vec3.scale([], [mercCameraPos.x, mercCameraPos.y, mercCameraPos.z], painter.transform.worldSize);\n    vec3.negate(cameraPos, cameraPos);\n    const transparentMeshes: SortedMesh[] = [];\n    const opaqueMeshes: SortedMesh[] = [];\n    let modelIndex = 0;\n    // Draw models\n    for (const model of models) {\n        const rotation = layer.paint.get('model-rotation').constantOr((null: any));\n        const scale = layer.paint.get('model-scale').constantOr((null: any));\n        const translation = layer.paint.get('model-translation').constantOr((null: any));\n        // update model matrices\n        model.computeModelMatrix(painter, rotation, scale, translation, true, true, false);\n\n        // compute model parameters matrices\n        const negCameraPosMatrix = mat4.identity([]);\n        const modelMetersPerPixel = getMetersPerPixelAtLatitude(model.position.lat, painter.transform.zoom);\n        const modelPixelsPerMeter = 1.0 / modelMetersPerPixel;\n        const zScaleMatrix = mat4.fromScaling([], [1.0, 1.0, modelPixelsPerMeter]);\n        mat4.translate(negCameraPosMatrix, negCameraPosMatrix, cameraPos);\n        const modelParameters = {zScaleMatrix, negCameraPosMatrix};\n        modelParametersVector.push(modelParameters);\n        for (const node of model.nodes) {\n            prepareMeshes(painter.transform, node, model.matrix, painter.transform.expandedFarZProjMatrix, modelIndex, transparentMeshes, opaqueMeshes);\n        }\n        modelIndex++;\n    }\n    // Sort the transparent meshes by depth\n    transparentMeshes.sort((a, b) => {\n        return b.depth - a.depth;\n    });\n\n    if (painter.renderPass === 'shadow') {\n        for (const opaqueMesh of opaqueMeshes) {\n            drawShadowCaster(opaqueMesh.mesh, opaqueMesh.nodeModelMatrix, painter, layer);\n        }\n        // Draw transparent sorted meshes\n        for (const transparentMesh of transparentMeshes) {\n            drawShadowCaster(transparentMesh.mesh, transparentMesh.nodeModelMatrix, painter, layer);\n        }\n        // Finish the render pass\n        cleanup();\n        return;\n    }\n\n    // Draw opaque meshes\n    if (opacity === 1) {\n        for (const opaqueMesh of opaqueMeshes) {\n            drawMesh(opaqueMesh, painter, layer, modelParametersVector[opaqueMesh.modelIndex], StencilMode.disabled, painter.colorModeForRenderPass());\n        }\n    } else {\n        for (const opaqueMesh of opaqueMeshes) {\n            // If we have layer opacity draw with two passes opaque meshes\n            drawMesh(opaqueMesh, painter, layer, modelParametersVector[opaqueMesh.modelIndex], StencilMode.disabled, ColorMode.disabled);\n        }\n        for (const opaqueMesh of opaqueMeshes) {\n            drawMesh(opaqueMesh, painter, layer, modelParametersVector[opaqueMesh.modelIndex], painter.stencilModeFor3D(), painter.colorModeForRenderPass());\n        }\n        painter.resetStencilClippingMasks();\n    }\n\n    // Draw transparent sorted meshes\n    for (const transparentMesh of transparentMeshes) {\n        drawMesh(transparentMesh, painter, layer, modelParametersVector[transparentMesh.modelIndex], StencilMode.disabled, painter.colorModeForRenderPass());\n    }\n    cleanup();\n}\n\n// If terrain changes, update elevations (baked in translation).\nfunction updateModelBucketsElevation(painter: Painter, bucket: ModelBucket, bucketTileID: OverscaledTileID): boolean {\n    let exaggeration = painter.terrain ? painter.terrain.exaggeration() : 0;\n    let dem: ?DEMSampler;\n    if (painter.terrain && exaggeration > 0) {\n        const terrain = painter.terrain;\n        const demTile = terrain.findDEMTileFor(bucketTileID);\n        if (demTile && demTile.dem) {\n            dem = DEMSampler.create(terrain, bucketTileID, demTile);\n        } else {\n            exaggeration = 0;\n        }\n    }\n\n    if (exaggeration === 0) {\n        bucket.terrainElevationMin = 0;\n        bucket.terrainElevationMax = 0;\n    }\n\n    if (exaggeration === bucket.validForExaggeration &&\n        (exaggeration === 0 || (dem && dem._demTile && dem._demTile.tileID === bucket.validForDEMTile.id && dem._dem._timestamp === bucket.validForDEMTile.timestamp))) {\n        return false;\n    }\n\n    let elevationMin: ?number;\n    let elevationMax: ?number;\n\n    for (const modelId in bucket.instancesPerModel) {\n        const instances = bucket.instancesPerModel[modelId];\n        assert(instances.instancedDataArray.bytesPerElement === 64);\n        for (let i = 0; i < instances.instancedDataArray.length; ++i) {\n            const x = instances.instancedDataArray.float32[i * 16] | 0;\n            const y = instances.instancedDataArray.float32[i * 16 + 1] | 0;\n            const elevation = (dem ? exaggeration * dem.getElevationAt(x, y, true, true) : 0) + instances.instancesEvaluatedElevation[i];\n            instances.instancedDataArray.float32[i * 16 + 6] = elevation;\n            elevationMin = elevationMin ? Math.min(bucket.terrainElevationMin, elevation) : elevation;\n            elevationMax = elevationMax ? Math.max(bucket.terrainElevationMax, elevation) : elevation;\n        }\n    }\n\n    bucket.terrainElevationMin = elevationMin ? elevationMin : 0;\n    bucket.terrainElevationMax = elevationMax ? elevationMax : 0;\n\n    bucket.validForExaggeration = exaggeration;\n    bucket.validForDEMTile = dem && dem._demTile ? {id: dem._demTile.tileID, timestamp: dem._dem._timestamp} : {id: undefined, timestamp: 0};\n\n    return true;\n}\n\nfunction updateModelBucketData(painter: Painter, bucket: ModelBucket, bucketTileID: OverscaledTileID) {\n    const bucketContentsUpdatedByZoom = bucket.updateZoomBasedPaintProperties();\n    const bucketContentsUpdatedByElevation = updateModelBucketsElevation(painter, bucket, bucketTileID);\n\n    if (bucketContentsUpdatedByZoom || bucketContentsUpdatedByElevation) {\n        bucket.uploaded = false;\n        bucket.upload(painter.context);\n    }\n}\n\n// preallocate structure used to reduce re-allocation during rendering and flow checks\nconst renderData: RenderData = {\n    shadowUniformsInitialized: false,\n    useSingleShadowCascade: false,\n    tileMatrix: new Float64Array(16),\n    shadowTileMatrix: new Float32Array(16),\n    aabb: new Aabb([0, 0, 0], [EXTENT, EXTENT, 0])\n};\n\nfunction calculateTileZoom(id: OverscaledTileID, tr: Transform): number {\n    const tiles = 1 << id.canonical.z;\n    const cameraPos = (tr.getFreeCameraOptions().position: any);\n    const elevation = tr.elevation;\n\n    // Compute tile zoom from the distance between the camera and\n    // the closest point on either tile's bottom plane or on a plane\n    // elevated to center altitude, whichever is higher. Using center altitude\n    // allows us to compensate tall tiles that have high variance in\n    // instance placement on z-axis.\n    const minx = id.canonical.x / tiles;\n    const maxx = (id.canonical.x + 1) / tiles;\n    const miny = id.canonical.y / tiles;\n    const maxy = (id.canonical.y + 1) / tiles;\n    let height = tr._centerAltitude;\n\n    if (elevation) {\n        const minmax = elevation.getMinMaxForTile(id);\n\n        if (minmax && minmax.max > height) {\n            height = minmax.max;\n        }\n    }\n\n    const distx = clamp(cameraPos.x, minx, maxx) - cameraPos.x;\n    const disty = clamp(cameraPos.y, miny, maxy) - cameraPos.y;\n    const distz = mercatorZfromAltitude(height, tr.center.lat) - cameraPos.z;\n\n    return tr._zoomFromMercatorZ(Math.sqrt(distx * distx + disty * disty + distz * distz));\n}\n\nfunction drawVectorLayerModels(painter: Painter, source: SourceCache, layer: ModelStyleLayer, coords: Array<OverscaledTileID>, scope: string) {\n    const tr = painter.transform;\n    if (tr.projection.name !== 'mercator') {\n        warnOnce(`Drawing 3D models for ${tr.projection.name} projection is not yet implemented`);\n        return;\n    }\n\n    const mercCameraPos = (tr.getFreeCameraOptions().position: any);\n    if (!painter.modelManager) return;\n    const modelManager = painter.modelManager;\n    layer.modelManager = modelManager;\n    const shadowRenderer = painter.shadowRenderer;\n\n    if (!layer._unevaluatedLayout._values.hasOwnProperty('model-id')) { return; }\n\n    const modelIdUnevaluatedProperty = layer._unevaluatedLayout._values['model-id'];\n    const evaluationParameters = {...layer.layout.get(\"model-id\").parameters};\n\n    for (const coord of coords) {\n        const tile = source.getTile(coord);\n        const bucket: ?ModelBucket = (tile.getBucket(layer): any);\n        if (!bucket || bucket.projection.name !== tr.projection.name) continue;\n        const modelUris = bucket.getModelUris();\n        if (modelUris && !bucket.modelsRequested) {\n            // geojson models are always set in the root scope to avoid model duplication\n            modelManager.addModelsFromBucket(modelUris, scope);\n            bucket.modelsRequested = true;\n        }\n\n        const tileZoom = calculateTileZoom(coord, tr);\n        evaluationParameters.zoom = tileZoom;\n        const modelIdProperty = modelIdUnevaluatedProperty.possiblyEvaluate(evaluationParameters);\n        updateModelBucketData(painter, bucket, coord);\n\n        renderData.shadowUniformsInitialized = false;\n        renderData.useSingleShadowCascade = !!shadowRenderer && shadowRenderer.getMaxCascadeForTile(coord.toUnwrapped()) === 0;\n        if (painter.renderPass === 'shadow' && shadowRenderer) {\n            if (painter.currentShadowCascade === 1 && bucket.isInsideFirstShadowMapFrustum) continue;\n\n            const tileMatrix = tr.calculatePosMatrix(coord.toUnwrapped(), tr.worldSize);\n            renderData.tileMatrix.set(tileMatrix);\n            renderData.shadowTileMatrix = Float32Array.from(shadowRenderer.calculateShadowPassMatrixFromMatrix(tileMatrix));\n            renderData.aabb.min.fill(0);\n            renderData.aabb.max[0] = renderData.aabb.max[1] = EXTENT;\n            renderData.aabb.max[2] = 0;\n            if (calculateTileShadowPassCulling(bucket, renderData, painter, layer.scope)) continue;\n        }\n\n        // camera position in the tile coordinates\n        const tiles = 1 << coord.canonical.z;\n        const cameraPos = [\n            ((mercCameraPos.x - coord.wrap) * tiles - coord.canonical.x) * EXTENT,\n            (mercCameraPos.y * tiles - coord.canonical.y) * EXTENT,\n            mercCameraPos.z * tiles * EXTENT\n        ];\n\n        for (let modelId in bucket.instancesPerModel) {\n            // From effective tile zoom (distance to camera) and calculate model to use.\n            const modelInstances = bucket.instancesPerModel[modelId];\n            if (modelInstances.features.length > 0) {\n                modelId = modelIdProperty.evaluate(modelInstances.features[0].feature, {});\n            }\n\n            const model = modelManager.getModel(modelId, scope);\n            if (!model || !model.uploaded) continue;\n\n            for (const node of model.nodes) {\n                drawInstancedNode(painter, layer, node, modelInstances, cameraPos, coord, renderData);\n            }\n        }\n    }\n}\n\nconst minimumInstanceCount = 20;\n\nfunction drawInstancedNode(painter: Painter, layer: ModelStyleLayer, node: Node, modelInstances: any, cameraPos: [number, number, number], coord: OverscaledTileID, renderData: RenderData) {\n    const context = painter.context;\n    const isShadowPass = painter.renderPass === 'shadow';\n    const shadowRenderer = painter.shadowRenderer;\n    const depthMode = isShadowPass && shadowRenderer ? shadowRenderer.getShadowPassDepthMode() : new DepthMode(context.gl.LEQUAL, DepthMode.ReadWrite, painter.depthRangeFor3D);\n    const affectedByFog = painter.isTileAffectedByFog(coord);\n\n    if (node.meshes) {\n        for (const mesh of node.meshes) {\n            const definesValues = ['MODEL_POSITION_ON_GPU'];\n            const dynamicBuffers = [];\n            let program;\n            let uniformValues;\n            let colorMode;\n\n            if (modelInstances.instancedDataArray.length > minimumInstanceCount) {\n                definesValues.push('INSTANCED_ARRAYS');\n            }\n\n            const cutoffParams = getCutoffParams(painter, layer.paint.get('model-cutoff-fade-range'));\n            if (cutoffParams.shouldRenderCutoff) {\n                definesValues.push('RENDER_CUTOFF');\n            }\n            if (isShadowPass && shadowRenderer) {\n                program = painter.getOrCreateProgram('modelDepth', {defines: ((definesValues: any): DynamicDefinesType[])});\n                uniformValues = modelDepthUniformValues(renderData.shadowTileMatrix, renderData.shadowTileMatrix, Float32Array.from(node.matrix));\n                colorMode = shadowRenderer.getShadowPassColorMode();\n            } else {\n                setupMeshDraw(definesValues, dynamicBuffers, mesh, painter);\n                program = painter.getOrCreateProgram('model', {defines: ((definesValues: any): DynamicDefinesType[]), overrideFog: affectedByFog});\n                const material = mesh.material;\n                const pbr = material.pbrMetallicRoughness;\n                const layerOpacity = layer.paint.get('model-opacity');\n\n                const emissiveStrength = layer.paint.get('model-emissive-strength').constantOr(0.0);\n                uniformValues = modelUniformValues(\n                    coord.expandedProjMatrix,\n                    Float32Array.from(node.matrix),\n                    new Float32Array(16),\n                    /* $FlowIgnore[incompatible-call] we can safely pass null for node.matrix as it is handled in the modelUniformValues constructor */\n                    null,\n                    painter,\n                    layerOpacity,\n                    pbr.baseColorFactor,\n                    material.emissiveFactor,\n                    pbr.metallicFactor,\n                    pbr.roughnessFactor,\n                    material,\n                    emissiveStrength,\n                    layer,\n                    cameraPos\n                );\n                if (shadowRenderer) {\n                    if (!renderData.shadowUniformsInitialized) {\n                        shadowRenderer.setupShadows(coord.toUnwrapped(), program, 'model-tile', coord.overscaledZ);\n                        renderData.shadowUniformsInitialized = true;\n                    } else {\n                        program.setShadowUniformValues(context, shadowRenderer.getShadowUniformValues());\n                    }\n                }\n\n                const needsBlending = cutoffParams.shouldRenderCutoff || layerOpacity < 1.0 || material.alphaMode !== 'OPAQUE';\n                colorMode = needsBlending ? ColorMode.alphaBlended : ColorMode.unblended;\n            }\n\n            painter.uploadCommonUniforms(context, program, coord.toUnwrapped(), null, cutoffParams);\n\n            assert(modelInstances.instancedDataArray.bytesPerElement === 64);\n            const cullFaceMode = mesh.material.doubleSided ? CullFaceMode.disabled : CullFaceMode.backCCW;\n            if  (modelInstances.instancedDataArray.length > minimumInstanceCount) {\n                dynamicBuffers.push(modelInstances.instancedDataBuffer);\n                program.draw(painter, context.gl.TRIANGLES, depthMode, StencilMode.disabled, colorMode, cullFaceMode,\n                uniformValues, layer.id, mesh.vertexBuffer, mesh.indexBuffer, mesh.segments, layer.paint, painter.transform.zoom,\n                undefined, dynamicBuffers, modelInstances.instancedDataArray.length);\n            } else {\n                const instanceUniform = isShadowPass ? \"u_instance\" : \"u_normal_matrix\";\n                for (let i = 0; i < modelInstances.instancedDataArray.length; ++i) {\n                    /* $FlowIgnore[prop-missing] modelDepth uses u_instance and model uses u_normal_matrix for packing instance data */\n                    uniformValues[instanceUniform] = new Float32Array(modelInstances.instancedDataArray.arrayBuffer, i * 64, 16);\n                    program.draw(painter, context.gl.TRIANGLES, depthMode, StencilMode.disabled, colorMode, cullFaceMode,\n                    uniformValues, layer.id, mesh.vertexBuffer, mesh.indexBuffer, mesh.segments, layer.paint, painter.transform.zoom,\n                    undefined, dynamicBuffers);\n                }\n            }\n        }\n    }\n    if (node.children) {\n        for (const child of node.children) {\n            drawInstancedNode(painter, layer, child, modelInstances, cameraPos, coord, renderData);\n        }\n    }\n}\n\nconst normalScale = [1.0, -1.0, 1.0];\n\nfunction prepareBatched(painter: Painter, source: SourceCache, layer: ModelStyleLayer, coords: Array<OverscaledTileID>) {\n    const exaggeration = painter.terrain ? painter.terrain.exaggeration() : 0;\n    const zoom = painter.transform.zoom;\n    for (const coord of coords) {\n        const tile = source.getTile(coord);\n        const bucket: ?Tiled3dModelBucket = (tile.getBucket(layer): any);\n        if (!bucket) continue;\n        // Conflation\n        if (painter.conflationActive) bucket.updateReplacement(coord, painter.replacementSource);\n        // evaluate scale\n        bucket.evaluateScale(painter, layer);\n        // Compute elevation\n        if (painter.terrain && exaggeration > 0) {\n            bucket.elevationUpdate(painter.terrain, exaggeration, coord, layer.source);\n        }\n        if (bucket.needsReEvaluation(painter, zoom, layer)) {\n            bucket.evaluate(layer);\n        }\n    }\n}\n\nfunction drawBatchedModels(painter: Painter, source: SourceCache, layer: ModelStyleLayer, coords: Array<OverscaledTileID>) {\n    layer.resetLayerRenderingStats(painter);\n    const context = painter.context;\n    const tr = painter.transform;\n    const fog = painter.style.fog;\n    const shadowRenderer = painter.shadowRenderer;\n    if (tr.projection.name !== 'mercator') {\n        warnOnce(`Drawing 3D landmark models for ${tr.projection.name} projection is not yet implemented`);\n        return;\n    }\n\n    const mercCameraPos = (painter.transform.getFreeCameraOptions().position: any);\n    const cameraPos = vec3.scale([], [mercCameraPos.x, mercCameraPos.y, mercCameraPos.z], painter.transform.worldSize);\n    vec3.negate(cameraPos, cameraPos);\n    // compute model parameters matrices\n    const negCameraPosMatrix = mat4.identity([]);\n    const metersPerPixel = getMetersPerPixelAtLatitude(tr.center.lat, tr.zoom);\n    const pixelsPerMeter = 1.0 / metersPerPixel;\n    const zScaleMatrix = mat4.fromScaling([], [1.0, 1.0, pixelsPerMeter]);\n    mat4.translate(negCameraPosMatrix, negCameraPosMatrix, cameraPos);\n    const layerOpacity = layer.paint.get('model-opacity');\n\n    const depthModeRW = new DepthMode(context.gl.LEQUAL, DepthMode.ReadWrite, painter.depthRangeFor3D);\n    const depthModeRO = new DepthMode(context.gl.LEQUAL, DepthMode.ReadOnly, painter.depthRangeFor3D);\n\n    const aabb = new Aabb([Infinity, Infinity, Infinity], [-Infinity, -Infinity, -Infinity]);\n    const isShadowPass = painter.renderPass === 'shadow';\n    const frustum = isShadowPass && shadowRenderer ? shadowRenderer.getCurrentCascadeFrustum() : tr.getFrustum(tr.scaleZoom(tr.worldSize));\n\n    const stats = layer.getLayerRenderingStats();\n    const drawTiles = function(enableColor: boolean, depthWrite: boolean) {\n        for (const coord of coords) {\n            const tile = source.getTile(coord);\n            const bucket: ?Tiled3dModelBucket = (tile.getBucket(layer): any);\n            if (!bucket || !bucket.uploaded) continue;\n\n            let singleCascade = false;\n            if (shadowRenderer) {\n                singleCascade = shadowRenderer.getMaxCascadeForTile(coord.toUnwrapped()) === 0;\n            }\n            const tileMatrix = tr.calculatePosMatrix(coord.toUnwrapped(), tr.worldSize);\n            const modelTraits = bucket.modelTraits;\n\n            for (const nodeInfo of bucket.getNodesInfo()) {\n                if (nodeInfo.hiddenByReplacement) continue;\n                if (!nodeInfo.node.meshes) continue;\n\n                const scale = nodeInfo.evaluatedScale;\n                const node = nodeInfo.node;\n                let elevation = 0;\n                if (painter.terrain && node.elevation) {\n                    elevation = node.elevation * painter.terrain.exaggeration();\n                }\n\n                const nodeAabb = () => {\n                    const localBounds = nodeInfo.getLocalBounds();\n                    aabb.min = [...localBounds.min];\n                    aabb.max = [...localBounds.max];\n                    aabb.min[2] += elevation;\n                    aabb.max[2] += elevation;\n                    vec3.transformMat4(aabb.min, aabb.min, tileMatrix);\n                    vec3.transformMat4(aabb.max, aabb.max, tileMatrix);\n                    return aabb;\n                };\n\n                if (scale[0] <= 1 && scale[1] <= 1 && scale[2] <= 1 && nodeAabb().intersects(frustum) === 0) {\n                    // While it is possible to use arbitrary scale for landmarks, it is highly unlikely\n                    // and frustum culling optimization could be skipped in that case.\n                    continue;\n                }\n\n                const tileModelMatrix = [...tileMatrix];\n\n                const anchorX = node.anchor ? node.anchor[0] : 0;\n                const anchorY = node.anchor ? node.anchor[1] : 0;\n\n                mat4.translate(tileModelMatrix, tileModelMatrix, [anchorX * (scale[0] - 1),\n                    anchorY * (scale[1] - 1),\n                    elevation]);\n                /* $FlowIgnore[incompatible-call] scale should always be an array */\n                if (!vec3.exactEquals(scale, DefaultModelScale)) {\n                    /* $FlowIgnore[incompatible-call] scale should always be an array */\n                    mat4.scale(tileModelMatrix, tileModelMatrix, scale);\n                }\n                // keep model and nodemodel matrices separate for rendering door lights\n                const nodeModelMatrix = mat4.multiply([], tileModelMatrix, node.matrix);\n\n                let lightingMatrix = mat4.multiply([], zScaleMatrix, tileModelMatrix);\n                mat4.multiply(lightingMatrix, negCameraPosMatrix, lightingMatrix);\n                const normalMatrix = mat4.invert([], lightingMatrix);\n                mat4.transpose(normalMatrix, normalMatrix);\n                mat4.scale(normalMatrix, normalMatrix, normalScale);\n\n                // lighting matrix should take node.matrix into account\n                lightingMatrix = mat4.multiply(lightingMatrix, lightingMatrix, node.matrix);\n\n                const isLightBeamPass = painter.renderPass === 'light-beam';\n                const wpvForNode = mat4.multiply([], tr.expandedFarZProjMatrix, nodeModelMatrix);\n                // Lights come in tilespace so wvp should not include node.matrix when rendering door ligths\n                const wpvForTile = mat4.multiply([], tr.expandedFarZProjMatrix, tileModelMatrix);\n                const hasMapboxFeatures = modelTraits & ModelTraits.HasMapboxMeshFeatures;\n                const emissiveStrength = hasMapboxFeatures ? 0.0 : nodeInfo.evaluatedRMEA[0][2];\n\n                for (let i = 0; i < node.meshes.length; ++i) {\n                    const mesh = node.meshes[i];\n                    const isLight = i === node.lightMeshIndex;\n                    let worldViewProjection = wpvForNode;\n                    if (isLight) {\n                        if (!isLightBeamPass && !painter.terrain && painter.shadowRenderer) {\n                            if (painter.currentLayer < painter.firstLightBeamLayer) {\n                                painter.firstLightBeamLayer = painter.currentLayer;\n                            }\n                            continue;\n                        }\n                        // Lights come in tilespace\n                        worldViewProjection = wpvForTile;\n                    } else if (isLightBeamPass) {\n                        continue;\n                    }\n\n                    const programOptions: CreateProgramParams = {\n                        defines: []\n                    };\n                    const dynamicBuffers = [];\n                    setupMeshDraw(((programOptions.defines: any): Array<string>), dynamicBuffers, mesh, painter);\n                    if (!hasMapboxFeatures) {\n                        (programOptions.defines: any).push('DIFFUSE_SHADED');\n                    }\n\n                    if (singleCascade) {\n                        (programOptions.defines: any).push('SHADOWS_SINGLE_CASCADE');\n                    }\n\n                    if (stats) {\n                        if (!isShadowPass) {\n                            stats.numRenderedVerticesInTransparentPass += mesh.vertexArray.length;\n                        } else {\n                            stats.numRenderedVerticesInShadowPass += mesh.vertexArray.length;\n                        }\n                    }\n\n                    if (isShadowPass) {\n                        drawShadowCaster(mesh, nodeModelMatrix, painter, layer);\n                        continue;\n                    }\n\n                    let fogMatrixArray = null;\n                    if (fog) {\n                        const fogMatrix = fogMatrixForModel(nodeModelMatrix, painter.transform);\n                        fogMatrixArray = new Float32Array(fogMatrix);\n\n                        if (tr.projection.name !== 'globe') {\n                            const min = mesh.aabb.min;\n                            const max = mesh.aabb.max;\n                            const [minOpacity, maxOpacity] = fog.getOpacityForBounds(fogMatrix, min[0], min[1], max[0], max[1]);\n                            programOptions.overrideFog = minOpacity >= FOG_OPACITY_THRESHOLD || maxOpacity >= FOG_OPACITY_THRESHOLD;\n                        }\n                    }\n\n                    const material = mesh.material;\n                    let occlusionTextureTransform;\n                    // Handle Texture transform\n                    if (material.occlusionTexture && material.occlusionTexture.offsetScale) {\n                        occlusionTextureTransform = material.occlusionTexture.offsetScale;\n                        (programOptions.defines: any).push('OCCLUSION_TEXTURE_TRANSFORM');\n                    }\n\n                    if (!isShadowPass && shadowRenderer) {\n                        // Set normal offset before program creation, as it adds/remove necessary defines under the hood\n                        shadowRenderer.useNormalOffset = !!mesh.normalBuffer;\n                    }\n\n                    const program = painter.getOrCreateProgram('model', programOptions);\n\n                    if (!isShadowPass && shadowRenderer) {\n                        // The shadow matrix does not need to include node transforms,\n                        // as shadow_pos will be performing that transform in the shader\n                        shadowRenderer.setupShadowsFromMatrix(tileModelMatrix, program, shadowRenderer.useNormalOffset);\n                    }\n\n                    painter.uploadCommonUniforms(context, program, null, fogMatrixArray);\n\n                    const pbr = material.pbrMetallicRoughness;\n                    // These values were taken from the tilesets used for testing\n                    pbr.metallicFactor = 0.9;\n                    pbr.roughnessFactor = 0.5;\n\n                    // Set emissive strength to zero for landmarks, as it is already used embedded in the PBR buffer.\n                    const uniformValues = modelUniformValues(\n                            new Float32Array(worldViewProjection),\n                            new Float32Array(lightingMatrix),\n                            new Float32Array(normalMatrix),\n                            new Float32Array(node.matrix),\n                            painter,\n                            layerOpacity,\n                            pbr.baseColorFactor,\n                            material.emissiveFactor,\n                            pbr.metallicFactor,\n                            pbr.roughnessFactor,\n                            material,\n                            emissiveStrength,\n                            layer,\n                            [0, 0, 0],\n                            occlusionTextureTransform\n                    );\n\n                    const meshNeedsBlending = isLight || layerOpacity < 1.0 || nodeInfo.hasTranslucentParts;\n                    const colorMode = enableColor ? (meshNeedsBlending ? ColorMode.alphaBlended : ColorMode.unblended) : ColorMode.disabled;\n                    const depthMode = (depthWrite && !isLight) ? depthModeRW : depthModeRO;\n\n                    program.draw(painter, context.gl.TRIANGLES, depthMode, StencilMode.disabled, colorMode, CullFaceMode.backCCW,\n                        uniformValues, layer.id, mesh.vertexBuffer, mesh.indexBuffer, mesh.segments, layer.paint, painter.transform.zoom,\n                        undefined, dynamicBuffers);\n                }\n            }\n        }\n    };\n\n    // Evaluate bucket and prepare for rendering\n    prepareBatched(painter, source, layer, coords);\n\n    if (layerOpacity === 1.0) {\n        drawTiles(true, true);\n    } else {\n        // Draw transparent buildings in two passes so that only the closest surface is drawn.\n        // First draw all the extrusions into only the depth buffer. No colors are drawn.\n        // Then draw all the extrusions a second type, only coloring fragments if they have the\n        // same depth value as the closest fragment in the previous pass. Use the stencil buffer\n        // to prevent the second draw in cases where we have coincident polygons.\n        drawTiles(false, true);\n        drawTiles(true, false);\n    }\n}\n\nfunction calculateTileShadowPassCulling(bucket: ModelBucket, renderData: RenderData, painter: Painter, scope: string) {\n    if (!painter.modelManager) return true;\n    const modelManager = painter.modelManager;\n    if (!painter.shadowRenderer) return true;\n    const shadowRenderer = painter.shadowRenderer;\n    assert(painter.renderPass === 'shadow');\n    const aabb = renderData.aabb;\n    let allModelsLoaded = true;\n    let maxHeight = bucket.maxHeight;\n    if (maxHeight === 0) {\n        let maxDim = 0;\n        for (const modelId in bucket.instancesPerModel) {\n            const model = modelManager.getModel(modelId, scope);\n            if (!model) {\n                allModelsLoaded = false;\n                continue;\n            }\n            maxDim = Math.max(maxDim, Math.max(Math.max(model.aabb.max[0], model.aabb.max[1]), model.aabb.max[2]));\n        }\n        maxHeight = bucket.maxScale * maxDim * 1.41 + bucket.maxVerticalOffset;\n        if (allModelsLoaded) bucket.maxHeight = maxHeight;\n    }\n    aabb.max[2] = maxHeight;\n\n    // Take into account bucket placement on DEM\n    aabb.min[2] += bucket.terrainElevationMin;\n    aabb.max[2] += bucket.terrainElevationMax;\n\n    vec3.transformMat4(aabb.min, aabb.min, renderData.tileMatrix);\n    vec3.transformMat4(aabb.max, aabb.max, renderData.tileMatrix);\n    const intersection = aabb.intersects(shadowRenderer.getCurrentCascadeFrustum());\n    if (painter.currentShadowCascade === 0) {\n        bucket.isInsideFirstShadowMapFrustum = intersection === 2;\n    }\n    return intersection === 0;\n}\n\n","// @flow\n\nimport IndexBuffer from '../gl/index_buffer.js';\nimport Context from '../gl/context.js';\nimport {LineIndexArray} from '../data/index_array_type.js';\n\nclass CacheEntry {\n    buf: IndexBuffer;\n    lastUsedFrameIdx: number;\n}\n\nconst TimeoutFrames = 30;\n\nexport class WireframeDebugCache {\n    _storage: Map<number, CacheEntry>;\n\n    constructor() {\n        this._storage = new Map();\n    }\n\n    getLinesFromTrianglesBuffer(frameIdx: number, indexBuffer: IndexBuffer, context: Context): ?IndexBuffer {\n        {\n            const entry = this._storage.get(indexBuffer.id);\n            if (entry) {\n                entry.lastUsedFrameIdx = frameIdx;\n                return entry.buf;\n            }\n        }\n\n        const gl = context.gl;\n\n        const bufSize = gl.getBufferParameter(gl.ELEMENT_ARRAY_BUFFER, gl.BUFFER_SIZE);\n        const bufTmp = new ArrayBuffer(bufSize);\n        const intView = new Int16Array(bufTmp);\n        gl.getBufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, new Int16Array(bufTmp));\n\n        const lineIndexArray = new LineIndexArray();\n\n        for (let i = 0; i < bufSize / 2; i += 3) {\n            const i0 = intView[i];\n            const i1 = intView[i + 1];\n            const i2 = intView[i + 2];\n\n            lineIndexArray.emplaceBack(i0, i1);\n            lineIndexArray.emplaceBack(i1, i2);\n            lineIndexArray.emplaceBack(i2, i0);\n        }\n\n        // Save and restore current VAO since it is reset on IndexBuffer creation\n        const previousBoundVAO = context.bindVertexArrayOES.current;\n\n        const newEntry = new CacheEntry();\n        newEntry.buf = new IndexBuffer(context, lineIndexArray);\n        newEntry.lastUsedFrameIdx = frameIdx;\n        this._storage.set(indexBuffer.id, newEntry);\n\n        context.bindVertexArrayOES.set(previousBoundVAO);\n\n        return newEntry.buf;\n    }\n\n    update(frameIdx: number) {\n        for (const [key, obj] of this._storage) {\n\n            if (frameIdx - obj.lastUsedFrameIdx > TimeoutFrames) {\n                // Delete object from cache\n                obj.buf.destroy();\n                this._storage.delete(key);\n            }\n        }\n    }\n\n    destroy() {\n        for (const [key, obj] of this._storage) {\n            obj.buf.destroy();\n            this._storage.delete(key);\n        }\n    }\n}\n","// @flow\n\nimport browser from '../util/browser.js';\n\nimport {mat4} from 'gl-matrix';\nimport SourceCache from '../source/source_cache.js';\nimport EXTENT from '../style-spec/data/extent.js';\nimport pixelsToTileUnits from '../source/pixels_to_tile_units.js';\nimport SegmentVector from '../data/segment.js';\nimport {PosArray, TileBoundsArray, TriangleIndexArray, LineStripIndexArray} from '../data/array_types.js';\nimport {isMapAuthenticated} from '../util/mapbox.js';\nimport posAttributes from '../data/pos_attributes.js';\nimport boundsAttributes from '../data/bounds_attributes.js';\nimport ProgramConfiguration from '../data/program_configuration.js';\nimport shaders from '../shaders/shaders.js';\nimport Program from './program.js';\nimport {programUniforms} from './program/program_uniforms.js';\nimport Context from '../gl/context.js';\nimport {fogUniformValues} from '../render/fog.js';\nimport DepthMode from '../gl/depth_mode.js';\nimport StencilMode from '../gl/stencil_mode.js';\nimport ColorMode from '../gl/color_mode.js';\nimport CullFaceMode from '../gl/cull_face_mode.js';\nimport Texture from './texture.js';\nimport {clippingMaskUniformValues} from './program/clipping_mask_program.js';\nimport Color from '../style-spec/util/color.js';\nimport symbol from './draw_symbol.js';\nimport circle from './draw_circle.js';\nimport assert from 'assert';\nimport heatmap from './draw_heatmap.js';\nimport line from './draw_line.js';\nimport fill from './draw_fill.js';\nimport fillExtrusion from './draw_fill_extrusion.js';\nimport hillshade from './draw_hillshade.js';\nimport raster, {prepare as prepareRaster} from './draw_raster.js';\nimport rasterParticle, {prepare as prepareRasterParticle} from './draw_raster_particle.js';\nimport background from './draw_background.js';\nimport debug, {drawDebugPadding, drawDebugQueryGeometry} from './draw_debug.js';\nimport custom from './draw_custom.js';\nimport sky from './draw_sky.js';\nimport Atmosphere from './draw_atmosphere.js';\nimport {GlobeSharedBuffers, globeToMercatorTransition} from '../geo/projection/globe_util.js';\nimport {Terrain} from '../terrain/terrain.js';\nimport {Debug} from '../util/debug.js';\nimport Tile from '../source/tile.js';\nimport {RGBAImage} from '../util/image.js';\nimport {ReplacementSource} from '../../3d-style/source/replacement_source.js';\nimport type {Source} from '../source/source.js';\nimport type {CutoffParams} from '../render/cutoff.js';\n\n// 3D-style related\nimport model, {prepare as modelPrepare} from '../../3d-style/render/draw_model.js';\nimport {lightsUniformValues} from '../../3d-style/render/lights.js';\nimport {ShadowRenderer} from '../../3d-style/render/shadow_renderer.js';\nimport {WireframeDebugCache} from \"./wireframe_cache.js\";\n\nimport type Transform from '../geo/transform.js';\nimport type {OverscaledTileID, UnwrappedTileID} from '../source/tile_id.js';\nimport type Style from '../style/style.js';\nimport type StyleLayer from '../style/style_layer.js';\nimport type ImageManager from './image_manager.js';\nimport type GlyphManager from './glyph_manager.js';\nimport type ModelManager from '../../3d-style/render/model_manager.js';\nimport type VertexBuffer from '../gl/vertex_buffer.js';\nimport type IndexBuffer from '../gl/index_buffer.js';\nimport type {DepthRangeType, DepthMaskType, DepthFuncType} from '../gl/types.js';\nimport type ResolvedImage from '../style-spec/expression/types/resolved_image.js';\nimport type {DynamicDefinesType} from './program/program_uniforms.js';\nimport {FOG_OPACITY_THRESHOLD} from '../style/fog_helpers.js';\nimport type {ContextOptions} from '../gl/context.js';\nimport type {ITrackedParameters} from 'tracked_parameters_proxy';\n\nexport type RenderPass = 'offscreen' | 'opaque' | 'translucent' | 'sky' | 'shadow' | 'light-beam';\nexport type CanvasCopyInstances = {\n    canvasCopies: WebGLTexture[],\n    timeStamps: number[]\n}\n\nexport type CreateProgramParams = {\n    config?: ProgramConfiguration,\n    defines?: DynamicDefinesType[],\n    overrideFog?: boolean,\n    overrideRtt?: boolean\n}\n\ntype WireframeOptions = {\n    terrain: boolean,\n    layers2D: boolean,\n    layers3D: boolean,\n};\n\ntype PainterOptions = {\n    showOverdrawInspector: boolean,\n    showTileBoundaries: boolean,\n    showParseStatus: boolean,\n    showQueryGeometry: boolean,\n    showTileAABBs: boolean,\n    showPadding: boolean,\n    rotating: boolean,\n    zooming: boolean,\n    moving: boolean,\n    gpuTiming: boolean,\n    gpuTimingDeferredRender: boolean,\n    fadeDuration: number,\n    isInitialLoad: boolean,\n    speedIndexTiming: boolean,\n    wireframe: WireframeOptions,\n}\n\ntype TileBoundsBuffers = {|\n  tileBoundsBuffer: VertexBuffer,\n  tileBoundsIndexBuffer: IndexBuffer,\n  tileBoundsSegments: SegmentVector,\n|};\n\ntype GPUTimers = {[layerId: string]: any};\n\nconst draw = {\n    symbol,\n    circle,\n    heatmap,\n    line,\n    fill,\n    'fill-extrusion': fillExtrusion,\n    hillshade,\n    raster,\n    'raster-particle': rasterParticle,\n    background,\n    sky,\n    debug,\n    custom,\n    model\n};\n\nconst prepare = {\n    model: modelPrepare,\n    raster: prepareRaster,\n    'raster-particle': prepareRasterParticle\n};\n\n/**\n * Initialize a new painter object.\n *\n * @param {Canvas} gl an experimental-webgl drawing context\n * @private\n */\nclass Painter {\n    context: Context;\n    transform: Transform;\n    _tileTextures: {[_: number]: Array<Texture> };\n    numSublayers: number;\n    depthEpsilon: number;\n    emptyProgramConfiguration: ProgramConfiguration;\n    width: number;\n    height: number;\n    tileExtentBuffer: VertexBuffer;\n    tileExtentSegments: SegmentVector;\n    debugBuffer: VertexBuffer;\n    debugIndexBuffer: IndexBuffer;\n    debugSegments: SegmentVector;\n    viewportBuffer: VertexBuffer;\n    viewportSegments: SegmentVector;\n    quadTriangleIndexBuffer: IndexBuffer;\n    mercatorBoundsBuffer: VertexBuffer;\n    mercatorBoundsSegments: SegmentVector;\n    _tileClippingMaskIDs: {[_: number]: number };\n    stencilClearMode: StencilMode;\n    style: Style;\n    options: PainterOptions;\n    imageManager: ImageManager;\n    glyphManager: GlyphManager;\n    modelManager: ModelManager;\n    depthRangeFor3D: DepthRangeType;\n    opaquePassCutoff: number;\n    frameCounter: number;\n    renderPass: RenderPass;\n    currentLayer: number;\n    currentStencilSource: ?string;\n    currentShadowCascade: number;\n    nextStencilID: number;\n    id: string;\n    _showOverdrawInspector: boolean;\n    _shadowMapDebug: boolean;\n    cache: {[_: string]: Program<*> };\n    symbolFadeChange: number;\n    gpuTimers: GPUTimers;\n    deferredRenderGpuTimeQueries: Array<any>;\n    emptyTexture: Texture;\n    identityMat: Float32Array;\n    debugOverlayTexture: Texture;\n    debugOverlayCanvas: HTMLCanvasElement;\n    _terrain: ?Terrain;\n    globeSharedBuffers: ?GlobeSharedBuffers;\n    tileLoaded: boolean;\n    frameCopies: Array<WebGLTexture>;\n    loadTimeStamps: Array<number>;\n    _backgroundTiles: {[key: number]: Tile};\n    _atmosphere: ?Atmosphere;\n    replacementSource: ReplacementSource;\n    conflationActive: boolean;\n    firstLightBeamLayer: number;\n    longestCutoffRange: number;\n    minCutoffZoom: number;\n    renderDefaultNorthPole: boolean;\n    renderDefaultSouthPole: boolean;\n    renderElevatedRasterBackface: boolean;\n    _fogVisible: boolean;\n    _cachedTileFogOpacities: {[number]: [number, number]};\n\n    _shadowRenderer: ?ShadowRenderer;\n\n    _wireframeDebugCache: WireframeDebugCache;\n\n    tp: ITrackedParameters;\n\n    _debugParams: {\n        showTerrainProxyTiles: boolean;\n        fpsWindow: number;\n        continousRedraw: boolean;\n        enabledLayers: any;\n    }\n\n    _timeStamp: number;\n    _averageFPS: number;\n\n    _fpsHistory: Array<number>;\n\n    constructor(gl: WebGL2RenderingContext, contextCreateOptions: ContextOptions, transform: Transform, tp: ITrackedParameters) {\n        this.context = new Context(gl, contextCreateOptions);\n        this.transform = transform;\n        this._tileTextures = {};\n        this.frameCopies = [];\n        this.loadTimeStamps = [];\n        this.tp = tp;\n        this._timeStamp = new Date().getTime();\n        this._averageFPS = 0;\n        this._fpsHistory = [];\n\n        this._debugParams = {\n            showTerrainProxyTiles: false,\n            fpsWindow: 30,\n            continousRedraw:false,\n            enabledLayers: {\n            }\n        };\n\n        const layerTypes = [\"fill\", \"line\", \"symbol\", \"circle\", \"heatmap\", \"fill-extrusion\", \"raster\", \"raster-particle\", \"hillshade\", \"model\", \"background\", \"sky\"];\n\n        for (const layerType of layerTypes) {\n            this._debugParams.enabledLayers[layerType] = true;\n        }\n\n        tp.registerParameter(this._debugParams, [\"Terrain\"], \"showTerrainProxyTiles\", {}, () => {\n            this.style.map.triggerRepaint();\n        });\n\n        tp.registerParameter(this._debugParams, [\"FPS\"], \"fpsWindow\", {min: 1, max: 100, step: 1});\n        tp.registerBinding(this._debugParams, [\"FPS\"], 'continousRedraw', {\n            readonly:true,\n            label: \"continuous redraw\"\n        });\n        tp.registerBinding(this, [\"FPS\"], '_averageFPS', {\n            readonly:true,\n            label: \"value\"\n        });\n        tp.registerBinding(this, [\"FPS\"], '_averageFPS', {\n            readonly:true,\n            label: \"graph\",\n            view:'graph',\n            min: 0,\n            max: 200\n        });\n        // Layers\n        for (const layerType of layerTypes) {\n            tp.registerParameter(this._debugParams.enabledLayers, [\"Debug\", \"Layers\"], layerType);\n        }\n\n        this.setup();\n\n        // Within each layer there are multiple distinct z-planes that can be drawn to.\n        // This is implemented using the WebGL depth buffer.\n        this.numSublayers = SourceCache.maxUnderzooming + SourceCache.maxOverzooming + 1;\n        this.depthEpsilon = 1 / Math.pow(2, 16);\n\n        this.deferredRenderGpuTimeQueries = [];\n        this.gpuTimers = {};\n        this.frameCounter = 0;\n        this._backgroundTiles = {};\n\n        this.conflationActive = false;\n        this.replacementSource = new ReplacementSource();\n        this.longestCutoffRange = 0.0;\n        this.minCutoffZoom = 0.0;\n        this._fogVisible = false;\n        this._cachedTileFogOpacities = {};\n        this._shadowRenderer = new ShadowRenderer(this);\n\n        this._wireframeDebugCache = new WireframeDebugCache();\n        this.renderDefaultNorthPole = true;\n        this.renderDefaultSouthPole = true;\n    }\n\n    updateTerrain(style: Style, adaptCameraAltitude: boolean) {\n        const enabled = !!style && !!style.terrain && this.transform.projection.supportsTerrain;\n        if (!enabled && (!this._terrain || !this._terrain.enabled)) return;\n\n        if (!this._terrain) {\n            this._terrain = new Terrain(this, style);\n        }\n        const terrain: Terrain = this._terrain;\n        this.transform.elevation = enabled ? terrain : null;\n        terrain.update(style, this.transform, adaptCameraAltitude);\n        if (this.transform.elevation && !terrain.enabled) {\n            // for zoom based exaggeration change, terrain.update can disable terrain.\n            this.transform.elevation = null;\n        }\n    }\n\n    _updateFog(style: Style) {\n        // Globe makes use of thin fog overlay with a fixed fog range,\n        // so we can skip updating fog tile culling for this projection\n        const isGlobe = this.transform.projection.name === 'globe';\n\n        const fog = style.fog;\n        if (!fog || isGlobe || fog.getOpacity(this.transform.pitch) < 1 || fog.properties.get('horizon-blend') < 0.03) {\n            this.transform.fogCullDistSq = null;\n            return;\n        }\n\n        // We start culling where the fog opacity function hits\n        // 98% which leaves a non-noticeable change threshold.\n        const [start, end] = fog.getFovAdjustedRange(this.transform._fov);\n\n        if (start > end) {\n            this.transform.fogCullDistSq = null;\n            return;\n        }\n\n        const fogBoundFraction = 0.78;\n        const fogCullDist = start + (end - start) * fogBoundFraction;\n\n        this.transform.fogCullDistSq = fogCullDist * fogCullDist;\n    }\n\n    get terrain(): ?Terrain {\n        return this.transform._terrainEnabled() && this._terrain && this._terrain.enabled ? this._terrain : null;\n    }\n\n    get shadowRenderer(): ?ShadowRenderer {\n        return this._shadowRenderer && this._shadowRenderer.enabled ? this._shadowRenderer : null;\n    }\n\n    get wireframeDebugCache(): WireframeDebugCache {\n        return this._wireframeDebugCache;\n    }\n\n    /*\n     * Update the GL viewport, projection matrix, and transforms to compensate\n     * for a new width and height value.\n     */\n    resize(width: number, height: number) {\n        this.width = width * browser.devicePixelRatio;\n        this.height = height * browser.devicePixelRatio;\n        this.context.viewport.set([0, 0, this.width, this.height]);\n\n        if (this.style) {\n            for (const layerId of this.style.order) {\n                this.style._mergedLayers[layerId].resize();\n            }\n        }\n    }\n\n    setup() {\n        const context = this.context;\n\n        const tileExtentArray = new PosArray();\n        tileExtentArray.emplaceBack(0, 0);\n        tileExtentArray.emplaceBack(EXTENT, 0);\n        tileExtentArray.emplaceBack(0, EXTENT);\n        tileExtentArray.emplaceBack(EXTENT, EXTENT);\n        this.tileExtentBuffer = context.createVertexBuffer(tileExtentArray, posAttributes.members);\n        this.tileExtentSegments = SegmentVector.simpleSegment(0, 0, 4, 2);\n\n        const debugArray = new PosArray();\n        debugArray.emplaceBack(0, 0);\n        debugArray.emplaceBack(EXTENT, 0);\n        debugArray.emplaceBack(0, EXTENT);\n        debugArray.emplaceBack(EXTENT, EXTENT);\n        this.debugBuffer = context.createVertexBuffer(debugArray, posAttributes.members);\n        this.debugSegments = SegmentVector.simpleSegment(0, 0, 4, 5);\n\n        const viewportArray = new PosArray();\n        viewportArray.emplaceBack(-1, -1);\n        viewportArray.emplaceBack(1, -1);\n        viewportArray.emplaceBack(-1, 1);\n        viewportArray.emplaceBack(1, 1);\n        this.viewportBuffer = context.createVertexBuffer(viewportArray, posAttributes.members);\n        this.viewportSegments = SegmentVector.simpleSegment(0, 0, 4, 2);\n\n        const tileBoundsArray = new TileBoundsArray();\n        tileBoundsArray.emplaceBack(0, 0, 0, 0);\n        tileBoundsArray.emplaceBack(EXTENT, 0, EXTENT, 0);\n        tileBoundsArray.emplaceBack(0, EXTENT, 0, EXTENT);\n        tileBoundsArray.emplaceBack(EXTENT, EXTENT, EXTENT, EXTENT);\n        this.mercatorBoundsBuffer = context.createVertexBuffer(tileBoundsArray, boundsAttributes.members);\n        this.mercatorBoundsSegments = SegmentVector.simpleSegment(0, 0, 4, 2);\n\n        const quadTriangleIndices = new TriangleIndexArray();\n        quadTriangleIndices.emplaceBack(0, 1, 2);\n        quadTriangleIndices.emplaceBack(2, 1, 3);\n        this.quadTriangleIndexBuffer = context.createIndexBuffer(quadTriangleIndices);\n\n        const tileLineStripIndices = new LineStripIndexArray();\n        for (const i of [0, 1, 3, 2, 0]) tileLineStripIndices.emplaceBack(i);\n        this.debugIndexBuffer = context.createIndexBuffer(tileLineStripIndices);\n\n        this.emptyTexture = new Texture(context,\n            new RGBAImage({width: 1, height: 1}, Uint8Array.of(0, 0, 0, 0)), context.gl.RGBA);\n\n        this.identityMat = mat4.create();\n\n        const gl = this.context.gl;\n        this.stencilClearMode = new StencilMode({func: gl.ALWAYS, mask: 0}, 0x0, 0xFF, gl.ZERO, gl.ZERO, gl.ZERO);\n        this.loadTimeStamps.push(performance.now());\n    }\n\n    getMercatorTileBoundsBuffers(): TileBoundsBuffers {\n        return {\n            tileBoundsBuffer: this.mercatorBoundsBuffer,\n            tileBoundsIndexBuffer: this.quadTriangleIndexBuffer,\n            tileBoundsSegments: this.mercatorBoundsSegments\n        };\n    }\n\n    getTileBoundsBuffers(tile: Tile): TileBoundsBuffers {\n        tile._makeTileBoundsBuffers(this.context, this.transform.projection);\n        if (tile._tileBoundsBuffer) {\n            const tileBoundsBuffer = tile._tileBoundsBuffer;\n            const tileBoundsIndexBuffer = tile._tileBoundsIndexBuffer;\n            const tileBoundsSegments = tile._tileBoundsSegments;\n            return {tileBoundsBuffer, tileBoundsIndexBuffer, tileBoundsSegments};\n        } else {\n            return this.getMercatorTileBoundsBuffers();\n        }\n    }\n\n    /*\n     * Reset the drawing canvas by clearing the stencil buffer so that we can draw\n     * new tiles at the same location, while retaining previously drawn pixels.\n     */\n    clearStencil() {\n        const context = this.context;\n        const gl = context.gl;\n\n        this.nextStencilID = 1;\n        this.currentStencilSource = undefined;\n        this._tileClippingMaskIDs = {};\n\n        // As a temporary workaround for https://github.com/mapbox/mapbox-gl-js/issues/5490,\n        // pending an upstream fix, we draw a fullscreen stencil=0 clipping mask here,\n        // effectively clearing the stencil buffer: once an upstream patch lands, remove\n        // this function in favor of context.clear({ stencil: 0x0 })\n        this.getOrCreateProgram('clippingMask').draw(this, gl.TRIANGLES,\n            DepthMode.disabled, this.stencilClearMode, ColorMode.disabled, CullFaceMode.disabled,\n            clippingMaskUniformValues(this.identityMat),\n            '$clipping', this.viewportBuffer,\n            this.quadTriangleIndexBuffer, this.viewportSegments);\n    }\n\n    resetStencilClippingMasks() {\n        if (!this.terrain) {\n            this.currentStencilSource = undefined;\n            this._tileClippingMaskIDs = {};\n        }\n    }\n\n    _renderTileClippingMasks(layer: StyleLayer, sourceCache?: SourceCache, tileIDs?: Array<OverscaledTileID>) {\n        if (!sourceCache || this.currentStencilSource === sourceCache.id || !layer.isTileClipped() || !tileIDs || tileIDs.length === 0) {\n            return;\n        }\n\n        if (this._tileClippingMaskIDs && !this.terrain) {\n            let dirtyStencilClippingMasks = false;\n            // Equivalent tile set is already rendered in stencil\n            for (const coord of tileIDs) {\n                if (this._tileClippingMaskIDs[coord.key] === undefined) {\n                    dirtyStencilClippingMasks = true;\n                    break;\n                }\n            }\n            if (!dirtyStencilClippingMasks) {\n                return;\n            }\n        }\n\n        this.currentStencilSource = sourceCache.id;\n\n        const context = this.context;\n        const gl = context.gl;\n\n        if (this.nextStencilID + tileIDs.length > 256) {\n            // we'll run out of fresh IDs so we need to clear and start from scratch\n            this.clearStencil();\n        }\n\n        context.setColorMode(ColorMode.disabled);\n        context.setDepthMode(DepthMode.disabled);\n\n        const program = this.getOrCreateProgram('clippingMask');\n\n        this._tileClippingMaskIDs = {};\n\n        for (const tileID of tileIDs) {\n            const tile = sourceCache.getTile(tileID);\n            const id = this._tileClippingMaskIDs[tileID.key] = this.nextStencilID++;\n            const {tileBoundsBuffer, tileBoundsIndexBuffer, tileBoundsSegments} = this.getTileBoundsBuffers(tile);\n\n            program.draw(this, gl.TRIANGLES, DepthMode.disabled,\n            // Tests will always pass, and ref value will be written to stencil buffer.\n            new StencilMode({func: gl.ALWAYS, mask: 0}, id, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE),\n            ColorMode.disabled, CullFaceMode.disabled, clippingMaskUniformValues(tileID.projMatrix),\n            '$clipping', tileBoundsBuffer,\n            tileBoundsIndexBuffer, tileBoundsSegments);\n        }\n    }\n\n    stencilModeFor3D(): StencilMode {\n        this.currentStencilSource = undefined;\n\n        if (this.nextStencilID + 1 > 256) {\n            this.clearStencil();\n        }\n\n        const id = this.nextStencilID++;\n        const gl = this.context.gl;\n        return new StencilMode({func: gl.NOTEQUAL, mask: 0xFF}, id, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE);\n    }\n\n    stencilModeForClipping(tileID: OverscaledTileID): $ReadOnly<StencilMode>  {\n        if (this.terrain) return this.terrain.stencilModeForRTTOverlap(tileID);\n        const gl = this.context.gl;\n        return new StencilMode({func: gl.EQUAL, mask: 0xFF}, this._tileClippingMaskIDs[tileID.key], 0x00, gl.KEEP, gl.KEEP, gl.REPLACE);\n    }\n\n    /*\n     * Sort coordinates by Z as drawing tiles is done in Z-descending order.\n     * All children with the same Z write the same stencil value.  Children\n     * stencil values are greater than parent's.  This is used only for raster\n     * and raster-dem tiles, which are already clipped to tile boundaries, to\n     * mask area of tile overlapped by children tiles.\n     * Stencil ref values continue range used in _tileClippingMaskIDs.\n     *\n     * Returns [StencilMode for tile overscaleZ map, sortedCoords].\n     */\n    stencilConfigForOverlap(tileIDs: Array<OverscaledTileID>): [{[_: number]: $ReadOnly<StencilMode>}, Array<OverscaledTileID>] {\n        const gl = this.context.gl;\n        const coords = tileIDs.sort((a, b) => b.overscaledZ - a.overscaledZ);\n        const minTileZ = coords[coords.length - 1].overscaledZ;\n        const stencilValues = coords[0].overscaledZ - minTileZ + 1;\n        if (stencilValues > 1) {\n            this.currentStencilSource = undefined;\n            if (this.nextStencilID + stencilValues > 256) {\n                this.clearStencil();\n            }\n            const zToStencilMode = {};\n            for (let i = 0; i < stencilValues; i++) {\n                zToStencilMode[i + minTileZ] = new StencilMode({func: gl.GEQUAL, mask: 0xFF}, i + this.nextStencilID, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE);\n            }\n            this.nextStencilID += stencilValues;\n            return [zToStencilMode, coords];\n        }\n        return [{[minTileZ]: StencilMode.disabled}, coords];\n    }\n\n    colorModeForRenderPass(): $ReadOnly<ColorMode> {\n        const gl = this.context.gl;\n        if (this._showOverdrawInspector) {\n            const numOverdrawSteps = 8;\n            const a = 1 / numOverdrawSteps;\n\n            return new ColorMode([gl.CONSTANT_COLOR, gl.ONE, gl.CONSTANT_COLOR, gl.ONE], new Color(a, a, a, 0), [true, true, true, true]);\n        } else if (this.renderPass === 'opaque') {\n            return ColorMode.unblended;\n        } else {\n            return ColorMode.alphaBlended;\n        }\n    }\n\n    colorModeForDrapableLayerRenderPass(emissiveStrengthForDrapedLayers?: number): $ReadOnly<ColorMode> {\n        const deferredDrapingEnabled = () => {\n            return this.style && this.style.enable3dLights() && this.terrain && this.terrain.renderingToTexture;\n        };\n\n        const gl = this.context.gl;\n        if (deferredDrapingEnabled() && this.renderPass === 'translucent') {\n            return new ColorMode([gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.CONSTANT_ALPHA, gl.ONE_MINUS_SRC_ALPHA],\n                new Color(0, 0, 0, emissiveStrengthForDrapedLayers === undefined ? 0 : emissiveStrengthForDrapedLayers), [true, true, true, true]);\n        } else {\n            return this.colorModeForRenderPass();\n        }\n    }\n\n    depthModeForSublayer(n: number, mask: DepthMaskType, func: ?DepthFuncType, skipOpaquePassCutoff: boolean = false): $ReadOnly<DepthMode> {\n        if (!this.opaquePassEnabledForLayer() && !skipOpaquePassCutoff) return DepthMode.disabled;\n        const depth = 1 - ((1 + this.currentLayer) * this.numSublayers + n) * this.depthEpsilon;\n        return new DepthMode(func || this.context.gl.LEQUAL, mask, [depth, depth]);\n    }\n\n    /*\n     * The opaque pass and 3D layers both use the depth buffer.\n     * Layers drawn above 3D layers need to be drawn using the\n     * painter's algorithm so that they appear above 3D features.\n     * This returns true for layers that can be drawn using the\n     * opaque pass.\n     */\n    opaquePassEnabledForLayer(): boolean {\n        return this.currentLayer < this.opaquePassCutoff;\n    }\n\n    updateAverageFPS() {\n        const curTime = new Date().getTime();\n        const dt = curTime - this._timeStamp;\n        this._timeStamp = curTime;\n\n        const fps = dt === 0 ? 0 : 1000.0 / dt;\n\n        this._fpsHistory.push(fps);\n        if (this._fpsHistory.length > this._debugParams.fpsWindow) {\n            this._fpsHistory.splice(0, this._fpsHistory.length - this._debugParams.fpsWindow);\n        }\n\n        this._averageFPS = Math.round(this._fpsHistory.reduce((accum: number, current: number) => { return accum + current / this._fpsHistory.length; }, 0));\n    }\n\n    render(style: Style, options: PainterOptions) {\n        Debug.run(() => { this.updateAverageFPS(); });\n\n        // Update debug cache, i.e. clear all unused buffers\n        this._wireframeDebugCache.update(this.frameCounter);\n\n        this._debugParams.continousRedraw = style.map.repaint;\n        this.style = style;\n        this.options = options;\n\n        const layers = this.style._mergedLayers;\n\n        const layerIds = this.style.order.filter((id) => {\n            const layer = layers[id];\n\n            if (layer.type in this._debugParams.enabledLayers) {\n                return this._debugParams.enabledLayers[layer.type];\n            }\n\n            return true;\n        });\n\n        const orderedLayers = layerIds.map(id => layers[id]);\n        const sourceCaches = this.style._mergedSourceCaches;\n\n        this.imageManager = style.imageManager;\n        this.modelManager = style.modelManager;\n\n        this.symbolFadeChange = style.placement.symbolFadeChange(browser.now());\n\n        this.imageManager.beginFrame();\n\n        let conflationSourcesInStyle = 0;\n        let conflationActiveThisFrame = false;\n\n        for (const id in sourceCaches) {\n            const sourceCache = sourceCaches[id];\n            if (sourceCache.used) {\n                sourceCache.prepare(this.context);\n\n                if (sourceCache.getSource().usedInConflation) {\n                    ++conflationSourcesInStyle;\n                }\n            }\n        }\n\n        for (const layer of orderedLayers) {\n            if (layer.isHidden(this.transform.zoom)) continue;\n            this.prepareLayer(layer);\n        }\n\n        const coordsAscending: {[_: string]: Array<OverscaledTileID>} = {};\n        const coordsDescending: {[_: string]: Array<OverscaledTileID>} = {};\n        const coordsDescendingSymbol: {[_: string]: Array<OverscaledTileID>} = {};\n        const coordsShadowCasters: {[_: string]: Array<OverscaledTileID>} = {};\n        const coordsSortedByDistance: {[_: string]: Array<OverscaledTileID>} = {};\n\n        for (const id in sourceCaches) {\n            const sourceCache = sourceCaches[id];\n            coordsAscending[id] = sourceCache.getVisibleCoordinates();\n            coordsDescending[id] = coordsAscending[id].slice().reverse();\n            coordsDescendingSymbol[id] = sourceCache.getVisibleCoordinates(true).reverse();\n            coordsShadowCasters[id] = sourceCache.getShadowCasterCoordinates();\n            coordsSortedByDistance[id] = sourceCache.sortCoordinatesByDistance(coordsAscending[id]);\n        }\n\n        const getLayerSource = (layer: StyleLayer) => {\n            const cache = this.style.getLayerSourceCache(layer);\n            if (!cache || !cache.used) return null;\n            return cache.getSource();\n        };\n\n        if (conflationSourcesInStyle) {\n            const conflationLayersInStyle = [];\n\n            for (const layer of orderedLayers) {\n                if (this.layerUsedInConflation(layer, getLayerSource(layer))) {\n                    conflationLayersInStyle.push(layer);\n                }\n            }\n\n            // Check we have more than one conflation layer\n            if (conflationLayersInStyle && conflationLayersInStyle.length > 1) {\n                // Some layer types such as fill extrusions and models might have interdependencies\n                // where certain features should be replaced by overlapping features from another layer with higher\n                // precedence. A special data structure 'replacementSource' is used to compute regions\n                // on visible tiles where potential overlap might occur between features of different layers.\n                const conflationSources = [];\n\n                for (const layer of conflationLayersInStyle) {\n                    const sourceCache = this.style.getLayerSourceCache(layer);\n\n                    if (!sourceCache || !sourceCache.used || !sourceCache.getSource().usedInConflation) {\n                        continue;\n                    }\n\n                    conflationSources.push({layer: layer.fqid, cache: sourceCache});\n                }\n\n                this.replacementSource.setSources(conflationSources);\n                conflationActiveThisFrame = true;\n            }\n        }\n\n        if (!conflationActiveThisFrame) {\n            this.replacementSource.clear();\n        }\n\n        // Mark conflation as active for one frame after the deactivation to give\n        // consumers of the feature an opportunity to clean up\n        this.conflationActive = conflationActiveThisFrame;\n\n        // Tiles on zoom level lower than the minCutoffZoom will be cut for layers with non-zero cutoffRange\n        this.minCutoffZoom = 0.0;\n        // The longest cutoff range will be used for cutting shadows if any layer has non-zero cutoffRange\n        this.longestCutoffRange = 0.0;\n        for (const layer of orderedLayers) {\n            const cutoffRange = layer.cutoffRange();\n            this.longestCutoffRange = Math.max(cutoffRange, this.longestCutoffRange);\n            if (cutoffRange > 0.0) {\n                const source = getLayerSource(layer);\n                if (source) {\n                    this.minCutoffZoom = Math.max(source.minzoom, this.minCutoffZoom);\n                }\n                if (layer.minzoom) {\n                    this.minCutoffZoom = Math.max(layer.minzoom, this.minCutoffZoom);\n                }\n            }\n        }\n\n        this.opaquePassCutoff = Infinity;\n        for (let i = 0; i < orderedLayers.length; i++) {\n            const layer = orderedLayers[i];\n            if (layer.is3D()) {\n                this.opaquePassCutoff = i;\n                break;\n            }\n        }\n\n        // Disable fog for the frame if it doesn't contribute to the final output at all\n        const fog = this.style && this.style.fog;\n\n        if (fog) {\n            this._fogVisible = fog.getOpacity(this.transform.pitch) !== 0.0;\n\n            if (this._fogVisible && this.transform.projection.name !== 'globe') {\n                this._fogVisible = fog.isVisibleOnFrustum(this.transform.cameraFrustum);\n            }\n        } else {\n            this._fogVisible = false;\n        }\n\n        this._cachedTileFogOpacities = {};\n\n        if (this.terrain) {\n            this.terrain.updateTileBinding(coordsDescendingSymbol);\n            // All render to texture is done in translucent pass to remove need\n            // for depth buffer allocation per tile.\n            this.opaquePassCutoff = 0;\n        }\n\n        const shadowRenderer = this._shadowRenderer;\n        if (shadowRenderer) {\n            shadowRenderer.updateShadowParameters(this.transform, this.style.directionalLight);\n\n            for (const id in sourceCaches) {\n                for (const coord of coordsAscending[id]) {\n                    let tileHeight = {min: 0, max: 0};\n                    if (this.terrain) {\n                        tileHeight = this.terrain.getMinMaxForTile(coord) || tileHeight;\n                    }\n\n                    // This doesn't consider any 3D layers to have height above the ground.\n                    // It was decided to not compute the real tile height, because all the tiles would need to be\n                    // seperately iterated before any rendering starts. The current code that calculates ShadowReceiver.lastCascade\n                    // doesn't check the Z axis in shadow cascade space. That in combination with missing tile height could in theory\n                    // lead to a situation where a tile is thought to fit in cascade 0, but actually extends into cascade 1.\n                    // The proper fix would be to update ShadowReceiver.lastCascade calculation to consider shadow cascade bounds accurately.\n                    shadowRenderer.addShadowReceiver(coord.toUnwrapped(), tileHeight.min, tileHeight.max);\n                }\n            }\n        }\n\n        if (this.transform.projection.name === 'globe' && !this.globeSharedBuffers) {\n            this.globeSharedBuffers = new GlobeSharedBuffers(this.context);\n        }\n\n        if (this.style.fog && this.transform.projection.supportsFog) {\n            if (!this._atmosphere) {\n                this._atmosphere = new Atmosphere(this);\n            }\n\n            this._atmosphere.update(this);\n        } else {\n            if (this._atmosphere) {\n                this._atmosphere.destroy();\n                this._atmosphere = undefined;\n            }\n        }\n\n        // Following line is billing related code. Do not change. See LICENSE.txt\n        if (!isMapAuthenticated(this.context.gl)) return;\n\n        // Offscreen pass ===============================================\n        // We first do all rendering that requires rendering to a separate\n        // framebuffer, and then save those for rendering back to the map\n        // later: in doing this we avoid doing expensive framebuffer restores.\n        this.renderPass = 'offscreen';\n\n        for (const layer of orderedLayers) {\n            const sourceCache = style.getLayerSourceCache(layer);\n            if (!layer.hasOffscreenPass() || layer.isHidden(this.transform.zoom)) continue;\n\n            const coords = sourceCache ? coordsDescending[sourceCache.id] : undefined;\n            if (!(layer.type === 'custom' || layer.type === 'raster' || layer.type === 'raster-particle' || layer.isSky()) && !(coords && coords.length)) continue;\n\n            this.renderLayer(this, sourceCache, layer, coords);\n        }\n\n        this.depthRangeFor3D = [0, 1 - ((orderedLayers.length + 2) * this.numSublayers * this.depthEpsilon)];\n\n        // Terrain depth offscreen render pass ==========================\n        // With terrain on, renders the depth buffer into a texture.\n        // This texture is used for occlusion testing (labels).\n        // When orthographic camera is in use we don't really need the depth occlusion testing (see https://mapbox.atlassian.net/browse/MAPS3D-1132)\n        // Therefore we can safely skip the rendering to the depth texture.\n        const terrain = this.terrain;\n        if (terrain && (this.style.hasSymbolLayers() || this.style.hasCircleLayers()) && !this.transform.isOrthographic) {\n            terrain.drawDepth();\n        }\n\n        // Shadow pass ==================================================\n        if (this._shadowRenderer) {\n            this.renderPass = 'shadow';\n            this._shadowRenderer.drawShadowPass(this.style, coordsShadowCasters);\n        }\n\n        // Rebind the main framebuffer now that all offscreen layers have been rendered:\n        this.context.bindFramebuffer.set(null);\n        this.context.viewport.set([0, 0, this.width, this.height]);\n\n        const shouldRenderAtmosphere = this.transform.projection.name === \"globe\" || this.transform.isHorizonVisible();\n\n        // Clear buffers in preparation for drawing to the main framebuffer\n        const clearColor = (() => {\n            if (options.showOverdrawInspector) {\n                return Color.black;\n            }\n\n            if (this.style.fog && this.transform.projection.supportsFog && !shouldRenderAtmosphere) {\n                const fogColor = this.style.fog.properties.get('color').toArray01();\n\n                return new Color(...fogColor);\n            }\n\n            if (this.style.fog && this.transform.projection.supportsFog && shouldRenderAtmosphere) {\n                const spaceColor = this.style.fog.properties.get('space-color').toArray01();\n\n                return new Color(...spaceColor);\n            }\n\n            return Color.transparent;\n        })();\n\n        this.context.clear({color: clearColor, depth: 1});\n\n        this.clearStencil();\n\n        this._showOverdrawInspector = options.showOverdrawInspector;\n\n        // Opaque pass ===============================================\n        // Draw opaque layers top-to-bottom first.\n        this.renderPass = 'opaque';\n\n        if (this.style.fog && this.transform.projection.supportsFog && this._atmosphere && !this._showOverdrawInspector && shouldRenderAtmosphere) {\n            this._atmosphere.drawStars(this, this.style.fog);\n        }\n\n        if (!this.terrain) {\n            for (this.currentLayer = layerIds.length - 1; this.currentLayer >= 0; this.currentLayer--) {\n                const layer = orderedLayers[this.currentLayer];\n                const sourceCache = style.getLayerSourceCache(layer);\n                if (layer.isSky()) continue;\n                const coords = sourceCache ? (layer.is3D() ? coordsSortedByDistance : coordsDescending)[sourceCache.id] : undefined;\n                this._renderTileClippingMasks(layer, sourceCache, coords);\n                this.renderLayer(this, sourceCache, layer, coords);\n            }\n        }\n\n        if (this.style.fog && this.transform.projection.supportsFog && this._atmosphere && !this._showOverdrawInspector && shouldRenderAtmosphere) {\n            this._atmosphere.drawAtmosphereGlow(this, this.style.fog);\n        }\n\n        // Sky pass ======================================================\n        // Draw all sky layers bottom to top.\n        // They are drawn at max depth, they are drawn after opaque and before\n        // translucent to fail depth testing and mix with translucent objects.\n        this.renderPass = 'sky';\n        const drawSkyOnGlobe = !this._atmosphere || globeToMercatorTransition(this.transform.zoom) > 0.0;\n        if (drawSkyOnGlobe && (this.transform.projection.name === 'globe' || this.transform.isHorizonVisible())) {\n            for (this.currentLayer = 0; this.currentLayer < layerIds.length; this.currentLayer++) {\n                const layer = orderedLayers[this.currentLayer];\n                const sourceCache = style.getLayerSourceCache(layer);\n                if (!layer.isSky()) continue;\n                const coords = sourceCache ? coordsDescending[sourceCache.id] : undefined;\n\n                this.renderLayer(this, sourceCache, layer, coords);\n            }\n        }\n\n        // Translucent pass ===============================================\n        // Draw all other layers bottom-to-top.\n        this.renderPass = 'translucent';\n\n        function coordsForTranslucentLayer(layer: StyleLayer, sourceCache?: SourceCache) {\n            // For symbol layers in the translucent pass, we add extra tiles to the renderable set\n            // for cross-tile symbol fading. Symbol layers don't use tile clipping, so no need to render\n            // separate clipping masks\n            let coords: ?Array<OverscaledTileID>;\n\n            if (sourceCache) {\n                const coordsSet = layer.type === 'symbol' ? coordsDescendingSymbol :\n                    (layer.is3D() ? coordsSortedByDistance : coordsDescending);\n\n                coords = coordsSet[sourceCache.id];\n            }\n            return coords;\n        }\n\n        // Render elevated raster layers behind the globe\n        const isGlobe = this.transform.projection.name === 'globe';\n        if (isGlobe) {\n            this.renderElevatedRasterBackface = true;\n            this.currentLayer = 0;\n            while (this.currentLayer < layerIds.length) {\n                const layer = orderedLayers[this.currentLayer];\n                if (layer.type === \"raster\") {\n                    const sourceCache = style.getLayerSourceCache(layer);\n                    this.renderLayer(this, sourceCache, layer, coordsForTranslucentLayer(layer, sourceCache));\n                }\n                ++this.currentLayer;\n            }\n            this.renderElevatedRasterBackface = false;\n        }\n\n        this.currentLayer = 0;\n        this.firstLightBeamLayer = Number.MAX_SAFE_INTEGER;\n\n        let shadowLayers = 0;\n        if (shadowRenderer) {\n            shadowLayers = shadowRenderer.getShadowCastingLayerCount();\n        }\n\n        while (this.currentLayer < layerIds.length) {\n            const layer = orderedLayers[this.currentLayer];\n            const sourceCache = style.getLayerSourceCache(layer);\n\n            // Nothing to draw in translucent pass for sky layers, advance\n            if (layer.isSky()) {\n                ++this.currentLayer;\n                continue;\n            }\n\n            // With terrain on and for draped layers only, issue rendering and progress\n            // this.currentLayer until the next non-draped layer.\n            // Otherwise we interleave terrain draped render with non-draped layers on top\n            if (terrain && this.style.isLayerDraped(layer)) {\n                if (layer.isHidden(this.transform.zoom)) {\n                    ++this.currentLayer;\n                    continue;\n                }\n                const prevLayer = this.currentLayer;\n                this.currentLayer = terrain.renderBatch(this.currentLayer);\n                assert(this.context.bindFramebuffer.current === null);\n                assert(this.currentLayer > prevLayer);\n                continue;\n            }\n\n            this._renderTileClippingMasks(layer, sourceCache, sourceCache ? coordsAscending[sourceCache.id] : undefined);\n            this.renderLayer(this, sourceCache, layer, coordsForTranslucentLayer(layer, sourceCache));\n\n            // Render ground shadows after the last shadow caster layer\n            if (!terrain && shadowRenderer && shadowLayers > 0 && layer.hasShadowPass() && --shadowLayers === 0) {\n                shadowRenderer.drawGroundShadows();\n\n                if (this.firstLightBeamLayer <= this.currentLayer) { // render light beams for 3D models (all are before ground shadows)\n                    const saveCurrentLayer = this.currentLayer;\n                    this.renderPass = 'light-beam';\n                    for (this.currentLayer = this.firstLightBeamLayer; this.currentLayer <= saveCurrentLayer; this.currentLayer++) {\n                        const layer = orderedLayers[this.currentLayer];\n                        if (!layer.hasLightBeamPass()) continue;\n\n                        const sourceCache = style.getLayerSourceCache(layer);\n                        const coords = sourceCache ? coordsDescending[sourceCache.id] : undefined;\n                        this.renderLayer(this, sourceCache, layer, coords);\n                    }\n                    this.currentLayer = saveCurrentLayer;\n                    this.renderPass = 'translucent';\n                }\n            }\n\n            ++this.currentLayer;\n        }\n\n        if (this.terrain) {\n            this.terrain.postRender();\n        }\n\n        if (this.options.showTileBoundaries || this.options.showQueryGeometry || this.options.showTileAABBs) {\n            // Use source with highest maxzoom\n            let selectedSource = null;\n            orderedLayers.forEach((layer) => {\n                const sourceCache = style.getLayerSourceCache(layer);\n                if (sourceCache && !layer.isHidden(this.transform.zoom) && sourceCache.getVisibleCoordinates().length) {\n                    if (!selectedSource || (selectedSource.getSource().maxzoom < sourceCache.getSource().maxzoom)) {\n                        selectedSource = sourceCache;\n                    }\n                }\n            });\n            if (selectedSource) {\n                if (this.options.showTileBoundaries) {\n                    draw.debug(this, selectedSource, selectedSource.getVisibleCoordinates(), Color.red, false, this.options.showParseStatus);\n                }\n\n                Debug.run(() => {\n                    if (!selectedSource) return;\n                    if (this.options.showQueryGeometry) {\n                        drawDebugQueryGeometry(this, selectedSource, selectedSource.getVisibleCoordinates());\n                    }\n                    if (this.options.showTileAABBs) {\n                        Debug.drawAabbs(this, selectedSource, selectedSource.getVisibleCoordinates());\n                    }\n                });\n            }\n        }\n\n        if (this.terrain && this._debugParams.showTerrainProxyTiles) {\n            draw.debug(this, this.terrain.proxySourceCache, this.terrain.proxyCoords, new Color(1.0, 0.8, 0.1, 1.0), true, this.options.showParseStatus);\n        }\n\n        if (this.options.showPadding) {\n            drawDebugPadding(this);\n        }\n\n        // Set defaults for most GL values so that anyone using the state after the render\n        // encounters more expected values.\n        this.context.setDefault();\n        this.frameCounter = (this.frameCounter + 1) % Number.MAX_SAFE_INTEGER;\n\n        if (this.tileLoaded && this.options.speedIndexTiming) {\n            this.loadTimeStamps.push(performance.now());\n            this.saveCanvasCopy();\n        }\n\n        if (!conflationActiveThisFrame) {\n            this.conflationActive = false;\n        }\n    }\n\n    prepareLayer(layer: StyleLayer) {\n        this.gpuTimingStart(layer);\n\n        const {unsupportedLayers} = this.transform.projection;\n        const isLayerSupported = unsupportedLayers ? !unsupportedLayers.includes(layer.type) : true;\n        const isCustomLayerWithTerrain = this.terrain && layer.type === 'custom';\n\n        if (prepare[layer.type] && (isLayerSupported || isCustomLayerWithTerrain)) {\n            const sourceCache = this.style.getLayerSourceCache(layer);\n            prepare[layer.type](layer, sourceCache, this);\n        }\n\n        this.gpuTimingEnd();\n    }\n\n    renderLayer(painter: Painter, sourceCache?: SourceCache, layer: StyleLayer, coords?: Array<OverscaledTileID>) {\n        if (layer.isHidden(this.transform.zoom)) return;\n        if (layer.type !== 'background' && layer.type !== 'sky' && layer.type !== 'custom' && layer.type !== 'model' && layer.type !== 'raster' && layer.type !== 'raster-particle' && !(coords && coords.length)) return;\n\n        this.id = layer.id;\n\n        this.gpuTimingStart(layer);\n        if (!painter.transform.projection.unsupportedLayers || !painter.transform.projection.unsupportedLayers.includes(layer.type) ||\n            (painter.terrain && layer.type === 'custom')) {\n            draw[layer.type](painter, sourceCache, layer, coords, this.style.placement.variableOffsets, this.options.isInitialLoad);\n        }\n        this.gpuTimingEnd();\n    }\n\n    gpuTimingStart(layer: StyleLayer) {\n        if (!this.options.gpuTiming) return;\n        const ext = this.context.extTimerQuery;\n        const gl = this.context.gl;\n        // This tries to time the draw call itself, but note that the cost for drawing a layer\n        // may be dominated by the cost of uploading vertices to the GPU.\n        // To instrument that, we'd need to pass the layerTimers object down into the bucket\n        // uploading logic.\n        let layerTimer = this.gpuTimers[layer.id];\n        if (!layerTimer) {\n            layerTimer = this.gpuTimers[layer.id] = {\n                calls: 0,\n                cpuTime: 0,\n                query: gl.createQuery()\n            };\n        }\n        layerTimer.calls++;\n        gl.beginQuery(ext.TIME_ELAPSED_EXT, layerTimer.query);\n    }\n\n    gpuTimingDeferredRenderStart() {\n        if (this.options.gpuTimingDeferredRender) {\n            const ext = this.context.extTimerQuery;\n            const gl = this.context.gl;\n            const query = gl.createQuery();\n            this.deferredRenderGpuTimeQueries.push(query);\n            gl.beginQuery(ext.TIME_ELAPSED_EXT, query);\n        }\n    }\n\n    gpuTimingDeferredRenderEnd() {\n        if (!this.options.gpuTimingDeferredRender) return;\n        const ext = this.context.extTimerQuery;\n        const gl = this.context.gl;\n        gl.endQuery(ext.TIME_ELAPSED_EXT);\n    }\n\n    gpuTimingEnd() {\n        if (!this.options.gpuTiming) return;\n        const ext = this.context.extTimerQuery;\n        const gl = this.context.gl;\n        gl.endQuery(ext.TIME_ELAPSED_EXT);\n    }\n\n    collectGpuTimers(): GPUTimers {\n        const currentLayerTimers = this.gpuTimers;\n        this.gpuTimers = {};\n        return currentLayerTimers;\n    }\n\n    collectDeferredRenderGpuQueries(): Array<any> {\n        const currentQueries = this.deferredRenderGpuTimeQueries;\n        this.deferredRenderGpuTimeQueries = [];\n        return currentQueries;\n    }\n\n    queryGpuTimers(gpuTimers: GPUTimers): {[layerId: string]: number} {\n        const layers = {};\n        for (const layerId in gpuTimers) {\n            const gpuTimer = gpuTimers[layerId];\n            const ext = this.context.extTimerQuery;\n            const gl = this.context.gl;\n            const gpuTime = ext.getQueryParameter(gpuTimer.query, gl.QUERY_RESULT) / (1000 * 1000);\n            ext.deleteQueryEXT(gpuTimer.query);\n            layers[layerId] = (gpuTime: number);\n        }\n        return layers;\n    }\n\n    queryGpuTimeDeferredRender(gpuQueries: Array<any>): number {\n        if (!this.options.gpuTimingDeferredRender) return 0;\n        const ext = this.context.extTimerQuery;\n        const gl = this.context.gl;\n\n        let gpuTime = 0;\n        for (const query of gpuQueries) {\n            gpuTime += ext.getQueryParameter(query, gl.QUERY_RESULT) / (1000 * 1000);\n            ext.deleteQueryEXT(query);\n        }\n\n        return gpuTime;\n    }\n\n    /**\n     * Transform a matrix to incorporate the *-translate and *-translate-anchor properties into it.\n     * @param inViewportPixelUnitsUnits True when the units accepted by the matrix are in viewport pixels instead of tile units.\n     * @returns {Float32Array} matrix\n     * @private\n     */\n    translatePosMatrix(matrix: Float32Array, tile: Tile, translate: [number, number], translateAnchor: 'map' | 'viewport', inViewportPixelUnitsUnits?: boolean): Float32Array {\n        if (!translate[0] && !translate[1]) return matrix;\n\n        const angle = inViewportPixelUnitsUnits ?\n            (translateAnchor === 'map' ? this.transform.angle : 0) :\n            (translateAnchor === 'viewport' ? -this.transform.angle : 0);\n\n        if (angle) {\n            const sinA = Math.sin(angle);\n            const cosA = Math.cos(angle);\n            translate = [\n                translate[0] * cosA - translate[1] * sinA,\n                translate[0] * sinA + translate[1] * cosA\n            ];\n        }\n\n        const translation = [\n            inViewportPixelUnitsUnits ? translate[0] : pixelsToTileUnits(tile, translate[0], this.transform.zoom),\n            inViewportPixelUnitsUnits ? translate[1] : pixelsToTileUnits(tile, translate[1], this.transform.zoom),\n            0\n        ];\n\n        const translatedMatrix = new Float32Array(16);\n        mat4.translate(translatedMatrix, matrix, translation);\n        return translatedMatrix;\n    }\n\n    /**\n     * Saves the tile texture for re-use when another tile is loaded.\n     *\n     * @returns true if the tile was cached, false if the tile was not cached and should be destroyed.\n     * @private\n     */\n    saveTileTexture(texture: Texture) {\n        const tileSize = texture.size[0];\n        const textures = this._tileTextures[tileSize];\n        if (!textures) {\n            this._tileTextures[tileSize] = [texture];\n        } else {\n            textures.push(texture);\n        }\n    }\n\n    getTileTexture(size: number): null | Texture {\n        const textures = this._tileTextures[size];\n        return textures && textures.length > 0 ? textures.pop() : null;\n    }\n\n    /**\n     * Checks whether a pattern image is needed, and if it is, whether it is not loaded.\n     *\n     * @returns true if a needed image is missing and rendering needs to be skipped.\n     * @private\n     */\n    isPatternMissing(image: ?ResolvedImage, scope: string): boolean {\n        if (image === null) return true;\n        if (image === undefined) return false;\n        return !this.imageManager.getPattern(image.toString(), scope);\n    }\n\n    terrainRenderModeElevated(): boolean {\n        // Whether elevation sampling should be enabled in the vertex shader.\n        return this.style && !!this.style.getTerrain() && !!this.terrain && !this.terrain.renderingToTexture;\n    }\n\n    linearFloatFilteringSupported(): boolean {\n        const context = this.context;\n        return context.extTextureFloatLinear != null;\n    }\n\n    /**\n     * Returns #defines that would need to be injected into every Program\n     * based on the current state of Painter.\n     *\n     * @returns {string[]}\n     * @private\n     */\n    currentGlobalDefines(name: string, overrideFog: ?boolean, overrideRtt: ?boolean): string[] {\n        const rtt = (overrideRtt === undefined) ? this.terrain && this.terrain.renderingToTexture : overrideRtt;\n        const zeroExaggeration = this.terrain && this.terrain.exaggeration() === 0.0;\n        const defines = [];\n\n        if (this.style && this.style.enable3dLights()) {\n            // In case of terrain and map optimized for terrain mode flag\n            // Lighting is deferred to terrain stage\n            if (name === 'globeRaster' || name === 'terrainRaster') {\n                defines.push('LIGHTING_3D_MODE');\n                defines.push('LIGHTING_3D_ALPHA_EMISSIVENESS');\n            } else {\n                if (!rtt) {\n                    defines.push('LIGHTING_3D_MODE');\n                }\n            }\n        }\n        if (this.renderPass === 'shadow') {\n            if (!this._shadowMapDebug) defines.push('DEPTH_TEXTURE');\n        } else if (this.shadowRenderer) {\n            if (this.shadowRenderer.useNormalOffset) {\n                defines.push('RENDER_SHADOWS', 'DEPTH_TEXTURE', 'NORMAL_OFFSET');\n            } else {\n                defines.push('RENDER_SHADOWS', 'DEPTH_TEXTURE');\n            }\n        }\n        if (this.terrainRenderModeElevated()) {\n            defines.push('TERRAIN');\n            if (this.linearFloatFilteringSupported()) defines.push('TERRAIN_DEM_FLOAT_FORMAT');\n            if (zeroExaggeration) defines.push('ZERO_EXAGGERATION');\n        }\n        if (this.transform.projection.name === 'globe') defines.push('GLOBE');\n        // When terrain is active, fog is rendered as part of draping, not as part of tile\n        // rendering. Removing the fog flag during tile rendering avoids additional defines.\n        if (this._fogVisible && !rtt && (overrideFog === undefined || overrideFog)) {\n            defines.push('FOG', 'FOG_DITHERING');\n        }\n        if (rtt) defines.push('RENDER_TO_TEXTURE');\n        if (this._showOverdrawInspector) defines.push('OVERDRAW_INSPECTOR');\n        return defines;\n    }\n\n    getOrCreateProgram(name: string, options?: CreateProgramParams): Program<any> {\n        this.cache = this.cache || {};\n        const defines = ((((options && options.defines) || []): any): string[]);\n        const config = options && options.config;\n        const overrideFog = options && options.overrideFog;\n        const overrideRtt = options && options.overrideRtt;\n\n        const globalDefines = this.currentGlobalDefines(name, overrideFog, overrideRtt);\n        const allDefines = globalDefines.concat(defines);\n        const key = Program.cacheKey(shaders[name], name, allDefines, config);\n\n        if (!this.cache[key]) {\n            this.cache[key] = new Program(this.context, name, shaders[name], config, programUniforms[name], allDefines);\n        }\n        return this.cache[key];\n    }\n\n    /*\n     * Reset some GL state to default values to avoid hard-to-debug bugs\n     * in custom layers.\n     */\n    setCustomLayerDefaults() {\n        // Prevent custom layers from unintentionally modify the last VAO used.\n        // All other state is state is restored on it's own, but for VAOs it's\n        // simpler to unbind so that we don't have to track the state of VAOs.\n        this.context.unbindVAO();\n\n        // The default values for this state is meaningful and often expected.\n        // Leaving this state dirty could cause a lot of confusion for users.\n        this.context.cullFace.setDefault();\n        this.context.frontFace.setDefault();\n        this.context.cullFaceSide.setDefault();\n        this.context.activeTexture.setDefault();\n        this.context.pixelStoreUnpack.setDefault();\n        this.context.pixelStoreUnpackPremultiplyAlpha.setDefault();\n        this.context.pixelStoreUnpackFlipY.setDefault();\n    }\n\n    /*\n     * Set GL state that is shared by all layers.\n     */\n    setBaseState() {\n        const gl = this.context.gl;\n        this.context.cullFace.set(false);\n        this.context.viewport.set([0, 0, this.width, this.height]);\n        this.context.blendEquation.set(gl.FUNC_ADD);\n    }\n\n    initDebugOverlayCanvas() {\n        if (this.debugOverlayCanvas == null) {\n            this.debugOverlayCanvas = document.createElement('canvas');\n            this.debugOverlayCanvas.width = 512;\n            this.debugOverlayCanvas.height = 512;\n            const gl = this.context.gl;\n            this.debugOverlayTexture = new Texture(this.context, this.debugOverlayCanvas, gl.RGBA);\n        }\n    }\n\n    destroy() {\n        if (this._terrain) {\n            this._terrain.destroy();\n        }\n        if (this._atmosphere) {\n            this._atmosphere.destroy();\n            this._atmosphere = undefined;\n        }\n        if (this.globeSharedBuffers) {\n            this.globeSharedBuffers.destroy();\n        }\n        this.emptyTexture.destroy();\n        if (this.debugOverlayTexture) {\n            this.debugOverlayTexture.destroy();\n        }\n        this._wireframeDebugCache.destroy();\n    }\n\n    prepareDrawTile() {\n        if (this.terrain) {\n            this.terrain.prepareDrawTile();\n        }\n    }\n\n    uploadCommonLightUniforms(context: Context, program: Program<*>) {\n        if (this.style.enable3dLights()) {\n            const directionalLight = this.style.directionalLight;\n            const ambientLight = this.style.ambientLight;\n\n            if (directionalLight && ambientLight) {\n                const lightsUniforms = lightsUniformValues(directionalLight, ambientLight);\n                program.setLightsUniformValues(context, lightsUniforms);\n            }\n        }\n    }\n\n    uploadCommonUniforms(context: Context, program: Program<*>, tileID: ?UnwrappedTileID, fogMatrix: ?Float32Array, cutoffParams: ?CutoffParams) {\n        this.uploadCommonLightUniforms(context, program);\n\n        // Fog is not enabled when rendering to texture so we\n        // can safely skip uploading uniforms in that case\n        if (this.terrain && this.terrain.renderingToTexture) {\n            return;\n        }\n\n        const fog = this.style.fog;\n\n        if (fog) {\n            const fogOpacity = fog.getOpacity(this.transform.pitch);\n            const fogUniforms = fogUniformValues(\n                this, fog, tileID, fogOpacity,\n                this.transform.frustumCorners.TL,\n                this.transform.frustumCorners.TR,\n                this.transform.frustumCorners.BR,\n                this.transform.frustumCorners.BL,\n                this.transform.globeCenterInViewSpace,\n                this.transform.globeRadius,\n                [\n                    this.transform.width * browser.devicePixelRatio,\n                    this.transform.height * browser.devicePixelRatio\n                ],\n                fogMatrix);\n\n            program.setFogUniformValues(context, fogUniforms);\n        }\n\n        if (cutoffParams) {\n            program.setCutoffUniformValues(context, cutoffParams.uniformValues);\n        }\n    }\n\n    setTileLoadedFlag(flag: boolean) {\n        this.tileLoaded = flag;\n    }\n\n    saveCanvasCopy() {\n        const canvas = this.canvasCopy();\n        if (!canvas) return;\n        this.frameCopies.push(canvas);\n        this.tileLoaded = false;\n    }\n\n    canvasCopy(): ?WebGLTexture {\n        const gl = this.context.gl;\n        const texture = gl.createTexture();\n        gl.bindTexture(gl.TEXTURE_2D, texture);\n        gl.copyTexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight, 0);\n        return texture;\n    }\n\n    getCanvasCopiesAndTimestamps(): CanvasCopyInstances {\n        return {\n            canvasCopies: this.frameCopies,\n            timeStamps: this.loadTimeStamps\n        };\n    }\n\n    averageElevationNeedsEasing(): boolean {\n        if (!this.transform._elevation) return false;\n\n        const fog = this.style && this.style.fog;\n        if (!fog) return false;\n\n        const fogOpacity = fog.getOpacity(this.transform.pitch);\n        if (fogOpacity === 0) return false;\n\n        return true;\n    }\n\n    getBackgroundTiles(): {[key: number]: Tile} {\n        const oldTiles = this._backgroundTiles;\n        const newTiles = this._backgroundTiles = {};\n\n        const tileSize = 512;\n        const tileIDs = this.transform.coveringTiles({tileSize});\n        for (const tileID of tileIDs) {\n            newTiles[tileID.key] = oldTiles[tileID.key] || new Tile(tileID, tileSize, this.transform.tileZoom, this);\n        }\n        return newTiles;\n    }\n\n    clearBackgroundTiles() {\n        this._backgroundTiles = {};\n    }\n\n    /*\n     * Replacement source's features get precedence over features defined in other sources.\n     * E.g. landmark features replace fill extrusion buildings at the same position.\n     * Initially planned to be used for Tiled3DModelSource, 2D source that is used with ModelLayer of buildings type and\n     * custom layer buildings.\n     */\n    layerUsedInConflation(layer: StyleLayer, source: ?Source): boolean {\n        if (!layer.is3D()) {\n            return false;\n        }\n\n        if (layer.minzoom && layer.minzoom > this.transform.zoom) {\n            return false;\n        }\n\n        if (layer.sourceLayer === \"building\") {\n            return true;\n        }\n\n        return !!source && source.type === \"batched-model\";\n    }\n\n    isTileAffectedByFog(id: OverscaledTileID): boolean {\n        if (!this.style || !this.style.fog) return false;\n        if (this.transform.projection.name === 'globe') return true;\n\n        let cachedRange = this._cachedTileFogOpacities[id.key];\n        if (!cachedRange) {\n            this._cachedTileFogOpacities[id.key] = cachedRange = this.style.fog.getOpacityForTile(id);\n        }\n\n        return cachedRange[0] >= FOG_OPACITY_THRESHOLD || cachedRange[1] >= FOG_OPACITY_THRESHOLD;\n    }\n}\n\nexport default Painter;\n","// @flow\n\nimport StencilMode from '../gl/stencil_mode.js';\nimport DepthMode from '../gl/depth_mode.js';\nimport CullFaceMode from '../gl/cull_face_mode.js';\nimport Program from './program.js';\nimport {circleUniformValues, circleDefinesValues} from './program/circle_program.js';\nimport SegmentVector from '../data/segment.js';\nimport {OverscaledTileID} from '../source/tile_id.js';\nimport {mercatorXfromLng, mercatorYfromLat} from '../geo/mercator_coordinate.js';\n\nimport type Painter from './painter.js';\nimport type SourceCache from '../source/source_cache.js';\nimport type CircleStyleLayer from '../style/style_layer/circle_style_layer.js';\nimport type CircleBucket from '../data/bucket/circle_bucket.js';\nimport type ProgramConfiguration from '../data/program_configuration.js';\nimport type VertexBuffer from '../gl/vertex_buffer.js';\nimport type IndexBuffer from '../gl/index_buffer.js';\nimport type {UniformValues} from './uniform_binding.js';\nimport type {CircleUniformsType} from './program/circle_program.js';\nimport type Tile from '../source/tile.js';\nimport type {DynamicDefinesType} from './program/program_uniforms.js';\n\nexport default drawCircles;\n\ntype TileRenderState = {\n    programConfiguration: ProgramConfiguration,\n    program: Program<*>,\n    layoutVertexBuffer: VertexBuffer,\n    globeExtVertexBuffer: ?VertexBuffer,\n    indexBuffer: IndexBuffer,\n    uniformValues: UniformValues<CircleUniformsType>,\n    tile: Tile\n};\n\ntype SegmentsTileRenderState = {\n    segments: SegmentVector,\n    sortKey: number,\n    state: TileRenderState\n};\n\nfunction drawCircles(painter: Painter, sourceCache: SourceCache, layer: CircleStyleLayer, coords: Array<OverscaledTileID>) {\n    if (painter.renderPass !== 'translucent') return;\n\n    const opacity = layer.paint.get('circle-opacity');\n    const strokeWidth = layer.paint.get('circle-stroke-width');\n    const strokeOpacity = layer.paint.get('circle-stroke-opacity');\n    const sortFeaturesByKey = layer.layout.get('circle-sort-key').constantOr(1) !== undefined;\n    const emissiveStrength = layer.paint.get('circle-emissive-strength');\n\n    if (opacity.constantOr(1) === 0 && (strokeWidth.constantOr(1) === 0 || strokeOpacity.constantOr(1) === 0)) {\n        return;\n    }\n\n    const context = painter.context;\n    const gl = context.gl;\n    const tr = painter.transform;\n\n    const depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly);\n    // Turn off stencil testing to allow circles to be drawn across boundaries,\n    // so that large circles are not clipped to tiles\n    const stencilMode = StencilMode.disabled;\n    const colorMode = painter.colorModeForDrapableLayerRenderPass(emissiveStrength);\n    const isGlobeProjection = tr.projection.name === 'globe';\n    const mercatorCenter = [mercatorXfromLng(tr.center.lng), mercatorYfromLat(tr.center.lat)];\n\n    const segmentsRenderStates: Array<SegmentsTileRenderState> = [];\n\n    for (let i = 0; i < coords.length; i++) {\n        const coord = coords[i];\n\n        const tile = sourceCache.getTile(coord);\n        const bucket: ?CircleBucket<*> = (tile.getBucket(layer): any);\n        if (!bucket || bucket.projection.name !== tr.projection.name) continue;\n\n        const programConfiguration = bucket.programConfigurations.get(layer.id);\n        const definesValues = ((circleDefinesValues(layer): any): DynamicDefinesType[]);\n        const affectedByFog = painter.isTileAffectedByFog(coord);\n        if (isGlobeProjection) {\n            definesValues.push('PROJECTION_GLOBE_VIEW');\n        }\n        const program = painter.getOrCreateProgram('circle', {config: programConfiguration, defines: definesValues, overrideFog: affectedByFog});\n        const layoutVertexBuffer = bucket.layoutVertexBuffer;\n        const globeExtVertexBuffer = bucket.globeExtVertexBuffer;\n        const indexBuffer = bucket.indexBuffer;\n        const invMatrix = tr.projection.createInversionMatrix(tr, coord.canonical);\n        const uniformValues = circleUniformValues(painter, coord, tile, invMatrix, mercatorCenter, layer);\n\n        const state: TileRenderState = {\n            programConfiguration,\n            program,\n            layoutVertexBuffer,\n            globeExtVertexBuffer,\n            indexBuffer,\n            uniformValues,\n            tile\n        };\n\n        if (sortFeaturesByKey) {\n            const oldSegments = bucket.segments.get();\n            for (const segment of oldSegments) {\n                segmentsRenderStates.push({\n                    segments: new SegmentVector([segment]),\n                    sortKey: ((segment.sortKey: any): number),\n                    state\n                });\n            }\n        } else {\n            segmentsRenderStates.push({\n                segments: bucket.segments,\n                sortKey: 0,\n                state\n            });\n        }\n\n    }\n\n    if (sortFeaturesByKey) {\n        segmentsRenderStates.sort((a, b) => a.sortKey - b.sortKey);\n    }\n\n    const terrainOptions = {useDepthForOcclusion: tr.depthOcclusionForSymbolsAndCircles};\n\n    for (const segmentsState of segmentsRenderStates) {\n        const {programConfiguration, program, layoutVertexBuffer, globeExtVertexBuffer, indexBuffer, uniformValues, tile} = segmentsState.state;\n        const segments = segmentsState.segments;\n\n        if (painter.terrain) painter.terrain.setupElevationDraw(tile, program, terrainOptions);\n\n        painter.uploadCommonUniforms(context, program, tile.tileID.toUnwrapped());\n\n        program.draw(painter, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled,\n            uniformValues, layer.id, layoutVertexBuffer, indexBuffer, segments,\n            layer.paint, tr.zoom, programConfiguration, [globeExtVertexBuffer]);\n    }\n}\n","// @flow\n\nimport Texture from './texture.js';\nimport Color from '../style-spec/util/color.js';\nimport DepthMode from '../gl/depth_mode.js';\nimport StencilMode from '../gl/stencil_mode.js';\nimport ColorMode from '../gl/color_mode.js';\nimport CullFaceMode from '../gl/cull_face_mode.js';\nimport {\n    heatmapUniformValues,\n    heatmapTextureUniformValues\n} from './program/heatmap_program.js';\nimport {mercatorXfromLng, mercatorYfromLat} from '../geo/mercator_coordinate.js';\n\nimport type Painter from './painter.js';\nimport type Context from '../gl/context.js';\nimport type Framebuffer from '../gl/framebuffer.js';\nimport type SourceCache from '../source/source_cache.js';\nimport type HeatmapStyleLayer from '../style/style_layer/heatmap_style_layer.js';\nimport type HeatmapBucket from '../data/bucket/heatmap_bucket.js';\nimport type {OverscaledTileID} from '../source/tile_id.js';\n\nexport default drawHeatmap;\n\nfunction drawHeatmap(painter: Painter, sourceCache: SourceCache, layer: HeatmapStyleLayer, coords: Array<OverscaledTileID>) {\n    if (layer.paint.get('heatmap-opacity') === 0) {\n        return;\n    }\n\n    if (painter.renderPass === 'offscreen') {\n        const context = painter.context;\n        const gl = context.gl;\n\n        // Allow kernels to be drawn across boundaries, so that\n        // large kernels are not clipped to tiles\n        const stencilMode = StencilMode.disabled;\n        // Turn on additive blending for kernels, which is a key aspect of kernel density estimation formula\n        const colorMode = new ColorMode([gl.ONE, gl.ONE, gl.ONE, gl.ONE], Color.transparent, [true, true, true, true]);\n        const resolutionScaling = painter.transform.projection.name === 'globe' ? 0.5 : 0.25;\n\n        bindFramebuffer(context, painter, layer, resolutionScaling);\n\n        context.clear({color: Color.transparent});\n\n        const tr = painter.transform;\n\n        const isGlobeProjection = tr.projection.name === 'globe';\n\n        const definesValues = isGlobeProjection ? ['PROJECTION_GLOBE_VIEW'] : [];\n        const cullMode = isGlobeProjection ? CullFaceMode.frontCCW : CullFaceMode.disabled;\n\n        const mercatorCenter = [mercatorXfromLng(tr.center.lng), mercatorYfromLat(tr.center.lat)];\n\n        for (let i = 0; i < coords.length; i++) {\n            const coord = coords[i];\n\n            // Skip tiles that have uncovered parents to avoid flickering; we don't need\n            // to use complex tile masking here because the change between zoom levels is subtle,\n            // so it's fine to simply render the parent until all its 4 children are loaded\n            if (sourceCache.hasRenderableParent(coord)) continue;\n\n            const tile = sourceCache.getTile(coord);\n            const bucket: ?HeatmapBucket = (tile.getBucket(layer): any);\n            if (!bucket || bucket.projection.name !== tr.projection.name) continue;\n\n            const affectedByFog = painter.isTileAffectedByFog(coord);\n            const programConfiguration = bucket.programConfigurations.get(layer.id);\n            const program = painter.getOrCreateProgram('heatmap', {config: programConfiguration, defines: definesValues, overrideFog: affectedByFog});\n            const {zoom} = painter.transform;\n            if (painter.terrain) painter.terrain.setupElevationDraw(tile, program);\n\n            painter.uploadCommonUniforms(context, program, coord.toUnwrapped());\n\n            const invMatrix = tr.projection.createInversionMatrix(tr, coord.canonical);\n\n            program.draw(painter, gl.TRIANGLES, DepthMode.disabled, stencilMode, colorMode, cullMode,\n                heatmapUniformValues(painter, coord,\n                    tile, invMatrix, mercatorCenter, zoom, layer.paint.get('heatmap-intensity')),\n                layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer,\n                bucket.segments, layer.paint, painter.transform.zoom,\n                programConfiguration, isGlobeProjection ? [bucket.globeExtVertexBuffer] : null);\n        }\n\n        context.viewport.set([0, 0, painter.width, painter.height]);\n\n    } else if (painter.renderPass === 'translucent') {\n        painter.context.setColorMode(painter.colorModeForRenderPass());\n        renderTextureToMap(painter, layer);\n    }\n}\n\nfunction bindFramebuffer(context: Context, painter: Painter, layer: HeatmapStyleLayer, scaling: number) {\n    const gl = context.gl;\n    const width = painter.width * scaling;\n    const height = painter.height * scaling;\n\n    context.activeTexture.set(gl.TEXTURE1);\n    context.viewport.set([0, 0, width, height]);\n\n    let fbo = layer.heatmapFbo;\n\n    if (!fbo || (fbo && (fbo.width !== width || fbo.height !== height))) {\n        if (fbo) { fbo.destroy(); }\n\n        const texture = gl.createTexture();\n        gl.bindTexture(gl.TEXTURE_2D, texture);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\n        fbo = layer.heatmapFbo = context.createFramebuffer(width, height, true, null);\n\n        bindTextureToFramebuffer(context, painter, texture, fbo, width, height);\n\n    } else {\n        gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get());\n        context.bindFramebuffer.set(fbo.framebuffer);\n    }\n}\n\nfunction bindTextureToFramebuffer(context: Context, painter: Painter, texture: ?WebGLTexture, fbo: Framebuffer, width: number, height: number) {\n    const gl = context.gl;\n    // Use the higher precision half-float texture where available (producing much smoother looking heatmaps);\n    // Otherwise, fall back to a low precision texture\n    const type = context.extRenderToTextureHalfFloat ? gl.HALF_FLOAT : gl.UNSIGNED_BYTE;\n    gl.texImage2D(gl.TEXTURE_2D, 0, context.extRenderToTextureHalfFloat ? gl.RGBA16F : gl.RGBA, width, height, 0, gl.RGBA, type, null);\n    fbo.colorAttachment.set(texture);\n}\n\nfunction renderTextureToMap(painter: Painter, layer: HeatmapStyleLayer) {\n    const context = painter.context;\n    const gl = context.gl;\n\n    // Here we bind two different textures from which we'll sample in drawing\n    // heatmaps: the kernel texture, prepared in the offscreen pass, and a\n    // color ramp texture.\n    const fbo = layer.heatmapFbo;\n    if (!fbo) return;\n    context.activeTexture.set(gl.TEXTURE0);\n    gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get());\n\n    context.activeTexture.set(gl.TEXTURE1);\n    let colorRampTexture = layer.colorRampTexture;\n    if (!colorRampTexture) {\n        colorRampTexture = layer.colorRampTexture = new Texture(context, layer.colorRamp, gl.RGBA);\n    }\n    colorRampTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n\n    painter.getOrCreateProgram('heatmapTexture').draw(painter, gl.TRIANGLES,\n        DepthMode.disabled, StencilMode.disabled, painter.colorModeForRenderPass(), CullFaceMode.disabled,\n        heatmapTextureUniformValues(painter, layer, 0, 1),\n        layer.id, painter.viewportBuffer, painter.quadTriangleIndexBuffer,\n        painter.viewportSegments, layer.paint, painter.transform.zoom);\n}\n","// @flow\n\nimport DepthMode from '../gl/depth_mode.js';\nimport CullFaceMode from '../gl/cull_face_mode.js';\nimport StencilMode from '../gl/stencil_mode.js';\nimport Texture from './texture.js';\nimport {\n    lineUniformValues,\n    linePatternUniformValues,\n    lineDefinesValues\n} from './program/line_program.js';\nimport browser from '../util/browser.js';\n\nimport type Painter from './painter.js';\nimport type SourceCache from '../source/source_cache.js';\nimport type LineStyleLayer from '../style/style_layer/line_style_layer.js';\nimport type LineBucket from '../data/bucket/line_bucket.js';\nimport type {OverscaledTileID} from '../source/tile_id.js';\nimport type {DynamicDefinesType} from './program/program_uniforms.js';\nimport {clamp, nextPowerOfTwo} from '../util/util.js';\nimport {renderColorRamp} from '../util/color_ramp.js';\nimport EXTENT from '../style-spec/data/extent.js';\n\nexport default function drawLine(painter: Painter, sourceCache: SourceCache, layer: LineStyleLayer, coords: Array<OverscaledTileID>) {\n    if (painter.renderPass !== 'translucent') return;\n\n    const opacity = layer.paint.get('line-opacity');\n    const width = layer.paint.get('line-width');\n    if (opacity.constantOr(1) === 0 || width.constantOr(1) === 0) return;\n\n    const emissiveStrength = layer.paint.get('line-emissive-strength');\n\n    const depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly);\n    const colorMode = painter.colorModeForDrapableLayerRenderPass(emissiveStrength);\n    const pixelRatio = (painter.terrain && painter.terrain.renderingToTexture) ? 1.0 : browser.devicePixelRatio;\n\n    const dasharrayProperty = layer.paint.get('line-dasharray');\n    const dasharray = dasharrayProperty.constantOr((1: any));\n    const capProperty = layer.layout.get('line-cap');\n    const patternProperty = layer.paint.get('line-pattern');\n    const image = patternProperty.constantOr((1: any));\n    const hasOpacity = layer.paint.get('line-opacity').constantOr(1.0) !== 1.0;\n    let useStencilMaskRenderPass = (!image && hasOpacity);\n\n    const gradient = layer.paint.get('line-gradient');\n\n    const programId = image ? 'linePattern' : 'line';\n\n    const context = painter.context;\n    const gl = context.gl;\n\n    const definesValues = ((lineDefinesValues(layer): any): DynamicDefinesType[]);\n    if (painter.terrain && painter.terrain.clipOrMaskOverlapStencilType()) {\n        useStencilMaskRenderPass = false;\n    }\n\n    for (const coord of coords) {\n        const tile = sourceCache.getTile(coord);\n        if (image && !tile.patternsLoaded()) continue;\n\n        const bucket: ?LineBucket = (tile.getBucket(layer): any);\n        if (!bucket) continue;\n        painter.prepareDrawTile();\n\n        const programConfiguration = bucket.programConfigurations.get(layer.id);\n        const affectedByFog = painter.isTileAffectedByFog(coord);\n        const program = painter.getOrCreateProgram(programId, {config: programConfiguration, defines: definesValues, overrideFog: affectedByFog});\n\n        const constantPattern = patternProperty.constantOr(null);\n        if (constantPattern && tile.imageAtlas) {\n            const posTo = tile.imageAtlas.patternPositions[constantPattern.toString()];\n            if (posTo) programConfiguration.setConstantPatternPositions(posTo);\n        }\n\n        const constantDash = dasharrayProperty.constantOr(null);\n        const constantCap = capProperty.constantOr((null: any));\n\n        if (!image && constantDash && constantCap && tile.lineAtlas) {\n            const posTo = tile.lineAtlas.getDash(constantDash, constantCap);\n            if (posTo) programConfiguration.setConstantPatternPositions(posTo);\n        }\n\n        let [trimStart, trimEnd] = layer.paint.get('line-trim-offset');\n        // When line cap is 'round' or 'square', the whole line progress will beyond 1.0 or less than 0.0.\n        // If trim_offset begin is line begin (0.0), or trim_offset end is line end (1.0), adjust the trim\n        // offset with fake offset shift so that the line_progress < 0.0 or line_progress > 1.0 part will be\n        // correctly covered.\n        if (constantCap === 'round' || constantCap === 'square') {\n            // Fake the percentage so that it will cover the round/square cap that is beyond whole line\n            const fakeOffsetShift = 1.0;\n            // To make sure that the trim offset range is effecive\n            if (trimStart !== trimEnd) {\n                if (trimStart === 0.0) {\n                    trimStart -= fakeOffsetShift;\n                }\n                if (trimEnd === 1.0) {\n                    trimEnd += fakeOffsetShift;\n                }\n            }\n        }\n\n        const matrix = painter.terrain ? coord.projMatrix : null;\n        const uniformValues = image ?\n            linePatternUniformValues(painter, tile, layer, matrix, pixelRatio, [trimStart, trimEnd]) :\n            lineUniformValues(painter, tile, layer, matrix, bucket.lineClipsArray.length, pixelRatio, [trimStart, trimEnd]);\n\n        if (gradient) {\n            const layerGradient = bucket.gradients[layer.id];\n            let gradientTexture = layerGradient.texture;\n            if (layer.gradientVersion !== layerGradient.version) {\n                let textureResolution = 256;\n                if (layer.stepInterpolant) {\n                    const sourceMaxZoom = sourceCache.getSource().maxzoom;\n                    const potentialOverzoom = coord.canonical.z === sourceMaxZoom ?\n                        Math.ceil(1 << (painter.transform.maxZoom - coord.canonical.z)) : 1;\n                    const lineLength = bucket.maxLineLength / EXTENT;\n                    // Logical pixel tile size is 512px, and 1024px right before current zoom + 1\n                    const maxTilePixelSize = 1024;\n                    // Maximum possible texture coverage heuristic, bound by hardware max texture size\n                    const maxTextureCoverage = lineLength * maxTilePixelSize * potentialOverzoom;\n                    textureResolution = clamp(nextPowerOfTwo(maxTextureCoverage), 256, context.maxTextureSize);\n                }\n                layerGradient.gradient = renderColorRamp({\n                    expression: layer.gradientExpression(),\n                    evaluationKey: 'lineProgress',\n                    resolution: textureResolution,\n                    image: layerGradient.gradient || undefined,\n                    clips: bucket.lineClipsArray\n                });\n                if (layerGradient.texture) {\n                    layerGradient.texture.update(layerGradient.gradient);\n                } else {\n                    layerGradient.texture = new Texture(context, layerGradient.gradient, gl.RGBA);\n                }\n                layerGradient.version = layer.gradientVersion;\n                gradientTexture = layerGradient.texture;\n            }\n            context.activeTexture.set(gl.TEXTURE1);\n            gradientTexture.bind(layer.stepInterpolant ? gl.NEAREST : gl.LINEAR, gl.CLAMP_TO_EDGE);\n        }\n        if (dasharray) {\n            context.activeTexture.set(gl.TEXTURE0);\n            if (tile.lineAtlasTexture) {\n                tile.lineAtlasTexture.bind(gl.LINEAR, gl.REPEAT);\n            }\n            programConfiguration.updatePaintBuffers();\n        }\n        if (image) {\n            context.activeTexture.set(gl.TEXTURE0);\n            if (tile.imageAtlasTexture) {\n                tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);\n            }\n            programConfiguration.updatePaintBuffers();\n        }\n\n        painter.uploadCommonUniforms(context, program, coord.toUnwrapped());\n\n        const renderLine = (stencilMode: StencilMode) => {\n            program.draw(painter, gl.TRIANGLES, depthMode,\n                stencilMode, colorMode, CullFaceMode.disabled, uniformValues,\n                layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments,\n                layer.paint, painter.transform.zoom, programConfiguration, [bucket.layoutVertexBuffer2, bucket.patternVertexBuffer]);\n        };\n\n        if (useStencilMaskRenderPass) {\n            const stencilId = painter.stencilModeForClipping(coord).ref;\n            // When terrain is on, ensure that the stencil buffer has 0 values.\n            // As stencil may be disabled when it is not in overlapping stencil\n            // mode. Refer to stencilModeForRTTOverlap logic.\n            if (stencilId === 0 && painter.terrain) {\n                context.clear({stencil: 0});\n            }\n            const stencilFunc = {func: gl.EQUAL, mask: 0xFF};\n\n            // Allow line geometry fragment to be drawn only once:\n            // - Invert the stencil identifier left by stencil clipping, this\n            // ensures that we are not conflicting with neighborhing tiles.\n            // - Draw Anti-Aliased pixels with a threshold set to 0.8, this\n            // may draw Anti-Aliased pixels more than once, but due to their\n            // low opacity, these pixels are usually invisible and potential\n            // overlapping pixel artifacts locally minimized.\n            uniformValues['u_alpha_discard_threshold'] = 0.8;\n            renderLine(new StencilMode(stencilFunc, stencilId, 0xFF, gl.KEEP, gl.KEEP, gl.INVERT));\n            uniformValues['u_alpha_discard_threshold'] = 0.0;\n            renderLine(new StencilMode(stencilFunc, stencilId, 0xFF, gl.KEEP, gl.KEEP, gl.KEEP));\n        } else {\n            renderLine(painter.stencilModeForClipping(coord));\n        }\n    }\n\n    // When rendering to stencil, reset the mask to make sure that the tile\n    // clipping reverts the stencil mask we may have drawn in the buffer.\n    // The stamp could be reverted by an extra draw call of line geometry,\n    // but tile clipping drawing is usually faster to draw than lines.\n    if (useStencilMaskRenderPass) {\n        painter.resetStencilClippingMasks();\n        if (painter.terrain) { context.clear({stencil: 0}); }\n    }\n}\n","// @flow\n\nimport StencilMode from '../gl/stencil_mode.js';\nimport DepthMode from '../gl/depth_mode.js';\nimport CullFaceMode from '../gl/cull_face_mode.js';\nimport Tile from '../source/tile.js';\nimport {\n    backgroundUniformValues,\n    backgroundPatternUniformValues\n} from './program/background_program.js';\nimport {OverscaledTileID} from '../source/tile_id.js';\n\nimport type Painter from './painter.js';\nimport type SourceCache from '../source/source_cache.js';\nimport type BackgroundStyleLayer from '../style/style_layer/background_style_layer.js';\n\nexport default drawBackground;\n\nfunction drawBackground(painter: Painter, sourceCache: SourceCache, layer: BackgroundStyleLayer, coords: Array<OverscaledTileID>) {\n    const color = layer.paint.get('background-color');\n    const opacity = layer.paint.get('background-opacity');\n    const emissiveStrength = layer.paint.get('background-emissive-strength');\n\n    if (opacity === 0) return;\n\n    const context = painter.context;\n    const gl = context.gl;\n    const transform = painter.transform;\n    const tileSize = transform.tileSize;\n    const image = layer.paint.get('background-pattern');\n    if (painter.isPatternMissing(image, layer.scope)) return;\n\n    const pass = (!image && color.a === 1 && opacity === 1 && painter.opaquePassEnabledForLayer()) ? 'opaque' : 'translucent';\n    if (painter.renderPass !== pass) return;\n\n    const stencilMode = StencilMode.disabled;\n    const depthMode = painter.depthModeForSublayer(0, pass === 'opaque' ? DepthMode.ReadWrite : DepthMode.ReadOnly);\n    const colorMode = painter.colorModeForDrapableLayerRenderPass(emissiveStrength);\n    const programName = image ? 'backgroundPattern' : 'background';\n\n    let tileIDs = coords;\n    let backgroundTiles;\n    if (!tileIDs) {\n        backgroundTiles = painter.getBackgroundTiles();\n        tileIDs = Object.values(backgroundTiles).map(tile => (tile: any).tileID);\n    }\n\n    if (image) {\n        context.activeTexture.set(gl.TEXTURE0);\n        painter.imageManager.bind(painter.context, layer.scope);\n    }\n\n    for (const tileID of tileIDs) {\n        const affectedByFog = painter.isTileAffectedByFog(tileID);\n        const program = painter.getOrCreateProgram(programName, {overrideFog: affectedByFog});\n        const unwrappedTileID = tileID.toUnwrapped();\n        const matrix = coords ? tileID.projMatrix : painter.transform.calculateProjMatrix(unwrappedTileID);\n        painter.prepareDrawTile();\n\n        const tile = sourceCache ? sourceCache.getTile(tileID) :\n            backgroundTiles ? backgroundTiles[tileID.key] : new Tile(tileID, tileSize, transform.zoom, painter);\n\n        const uniformValues = image ?\n            backgroundPatternUniformValues(matrix, emissiveStrength, opacity, painter, image, layer.scope, {tileID, tileSize}) :\n            backgroundUniformValues(matrix, emissiveStrength, opacity, color);\n\n        painter.uploadCommonUniforms(context, program, unwrappedTileID);\n\n        const {tileBoundsBuffer, tileBoundsIndexBuffer, tileBoundsSegments} = painter.getTileBoundsBuffers(tile);\n\n        program.draw(painter, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled,\n            uniformValues, layer.id, tileBoundsBuffer,\n                tileBoundsIndexBuffer, tileBoundsSegments);\n    }\n}\n","// @flow\n\nexport default drawCustom;\n\nimport DepthMode from '../gl/depth_mode.js';\nimport StencilMode from '../gl/stencil_mode.js';\nimport {warnOnce} from '../util/util.js';\nimport {globeToMercatorTransition} from './../geo/projection/globe_util.js';\n\nimport type Painter from './painter.js';\nimport type {OverscaledTileID} from '../source/tile_id.js';\nimport type SourceCache from '../source/source_cache.js';\nimport type CustomStyleLayer from '../style/style_layer/custom_style_layer.js';\nimport MercatorCoordinate from '../geo/mercator_coordinate.js';\nimport assert from 'assert';\n\nfunction drawCustom(painter: Painter, sourceCache: SourceCache, layer: CustomStyleLayer, coords: Array<OverscaledTileID>) {\n\n    const context = painter.context;\n    const implementation = layer.implementation;\n\n    if (painter.transform.projection.unsupportedLayers && painter.transform.projection.unsupportedLayers.includes(\"custom\") &&\n        !(painter.terrain && (painter.terrain.renderingToTexture || painter.renderPass === 'offscreen') && layer.isDraped(sourceCache))) {\n        warnOnce('Custom layers are not yet supported with this projection. Use mercator or globe to enable usage of custom layers.');\n        return;\n    }\n\n    if (painter.renderPass === 'offscreen') {\n\n        const prerender = implementation.prerender;\n        if (prerender) {\n            painter.setCustomLayerDefaults();\n            context.setColorMode(painter.colorModeForRenderPass());\n\n            if (painter.transform.projection.name === \"globe\") {\n                const center = painter.transform.pointMerc;\n                prerender.call(implementation, context.gl, painter.transform.customLayerMatrix(), painter.transform.getProjection(), painter.transform.globeToMercatorMatrix(),  globeToMercatorTransition(painter.transform.zoom), [center.x, center.y], painter.transform.pixelsPerMeterRatio);\n            } else {\n                prerender.call(implementation, context.gl, painter.transform.customLayerMatrix());\n            }\n\n            context.setDirty();\n            painter.setBaseState();\n        }\n\n    } else if (painter.renderPass === 'translucent') {\n\n        if (painter.terrain && painter.terrain.renderingToTexture) {\n            assert(implementation.renderToTile);\n            assert(coords.length === 1);\n            const renderToTile = implementation.renderToTile;\n            if (renderToTile) {\n                const c = coords[0].canonical;\n                const unwrapped = new MercatorCoordinate(c.x + coords[0].wrap * (1 << c.z), c.y, c.z);\n\n                context.setDepthMode(DepthMode.disabled);\n                context.setStencilMode(StencilMode.disabled);\n                context.setColorMode(painter.colorModeForRenderPass());\n                painter.setCustomLayerDefaults();\n\n                renderToTile.call(implementation, context.gl, unwrapped);\n                context.setDirty();\n                painter.setBaseState();\n            }\n            return;\n        }\n\n        painter.setCustomLayerDefaults();\n\n        context.setColorMode(painter.colorModeForRenderPass());\n        context.setStencilMode(StencilMode.disabled);\n\n        const depthMode = implementation.renderingMode === '3d' ?\n            new DepthMode(painter.context.gl.LEQUAL, DepthMode.ReadWrite, painter.depthRangeFor3D) :\n            painter.depthModeForSublayer(0, DepthMode.ReadOnly);\n\n        context.setDepthMode(depthMode);\n\n        if (painter.transform.projection.name === \"globe\") {\n            const center = painter.transform.pointMerc;\n            implementation.render(context.gl, painter.transform.customLayerMatrix(), painter.transform.getProjection(), painter.transform.globeToMercatorMatrix(), globeToMercatorTransition(painter.transform.zoom), [center.x, center.y], painter.transform.pixelsPerMeterRatio);\n        } else {\n            implementation.render(context.gl, painter.transform.customLayerMatrix());\n        }\n\n        context.setDirty();\n        painter.setBaseState();\n        context.bindFramebuffer.set(null);\n    }\n}\n","// @flow strict\n\n/**\n * Throttle the given function to run at most every `period` milliseconds.\n * @private\n */\nexport default function throttle(fn: () => void, time: number): () => ?TimeoutID {\n    let pending = false;\n    let timerId: ?TimeoutID = null;\n\n    const later = () => {\n        timerId = null;\n        if (pending) {\n            fn();\n            timerId = setTimeout(later, time);\n            pending = false;\n        }\n    };\n\n    return () => {\n        pending = true;\n        if (!timerId) {\n            later();\n        }\n        return timerId;\n    };\n}\n","// @flow\n\nimport {bindAll} from '../util/util.js';\nimport throttle from '../util/throttle.js';\n\nimport type {Map} from './map.js';\n\n/*\n * Adds the map's position to its page's location hash.\n * Passed as an option to the map object.\n *\n * @returns {Hash} `this`\n */\nexport default class Hash {\n    _map: ?Map;\n    _updateHash: () => ?TimeoutID;\n    _hashName: ?string;\n\n    constructor(hashName: ?string) {\n        this._hashName = hashName && encodeURIComponent(hashName);\n        bindAll([\n            '_getCurrentHash',\n            '_onHashChange',\n            '_updateHash'\n        ], this);\n\n        // Mobile Safari doesn't allow updating the hash more than 100 times per 30 seconds.\n        // $FlowFixMe[method-unbinding]\n        this._updateHash = throttle(this._updateHashUnthrottled.bind(this), 30 * 1000 / 100);\n    }\n\n    /*\n     * Map element to listen for coordinate changes\n     *\n     * @param {Object} map\n     * @returns {Hash} `this`\n     */\n    addTo(map: Map): this {\n        this._map = map;\n        // $FlowFixMe[method-unbinding]\n        window.addEventListener('hashchange', this._onHashChange, false);\n        map.on('moveend', this._updateHash);\n        return this;\n    }\n\n    /*\n     * Removes hash\n     *\n     * @returns {Popup} `this`\n     */\n    remove(): this {\n        if (!this._map) return this;\n\n        this._map.off('moveend', this._updateHash);\n        // $FlowFixMe[method-unbinding]\n        window.removeEventListener('hashchange', this._onHashChange, false);\n        clearTimeout(this._updateHash());\n\n        this._map = undefined;\n        return this;\n    }\n\n    getHashString(): string {\n        const map = this._map;\n        if (!map) return '';\n\n        const hash = getHashString(map);\n\n        if (this._hashName) {\n            const hashName = this._hashName;\n            let found = false;\n            const parts = location.hash.slice(1).split('&').map(part => {\n                const key = part.split('=')[0];\n                if (key === hashName) {\n                    found = true;\n                    return `${key}=${hash}`;\n                }\n                return part;\n            }).filter(a => a);\n            if (!found) {\n                parts.push(`${hashName}=${hash}`);\n            }\n            return `#${parts.join('&')}`;\n        }\n\n        return `#${hash}`;\n    }\n\n    _getCurrentHash(): Array<string> {\n        // Get the current hash from location, stripped from its number sign\n        const hash = location.hash.replace('#', '');\n        if (this._hashName) {\n            // Split the parameter-styled hash into parts and find the value we need\n            let keyval;\n            hash.split('&').map(\n                part => part.split('=')\n            ).forEach(part => {\n                if (part[0] === this._hashName) {\n                    keyval = part;\n                }\n            });\n            return (keyval ? keyval[1] || '' : '').split('/');\n        }\n        return hash.split('/');\n    }\n\n    _onHashChange(): boolean {\n        const map = this._map;\n        if (!map) return false;\n        const loc = this._getCurrentHash();\n        if (loc.length >= 3 && !loc.some(v => isNaN(v))) {\n            const bearing = map.dragRotate.isEnabled() && map.touchZoomRotate.isEnabled() ? +(loc[3] || 0) : map.getBearing();\n            map.jumpTo({\n                center: [+loc[2], +loc[1]],\n                zoom: +loc[0],\n                bearing,\n                pitch: +(loc[4] || 0)\n            });\n            return true;\n        }\n        return false;\n    }\n\n    _updateHashUnthrottled() {\n        // Replace if already present, else append the updated hash string\n        history.replaceState(history.state, '', location.href.replace(/(#.+)?$/, this.getHashString()));\n    }\n}\n\nexport function getHashString(map: Map, mapFeedback?: boolean): string {\n    const center = map.getCenter(),\n        zoom = Math.round(map.getZoom() * 100) / 100,\n        // derived from equation: 512px * 2^z / 360 / 10^d < 0.5px\n        precision = Math.ceil((zoom * Math.LN2 + Math.log(512 / 360 / 0.5)) / Math.LN10),\n        m = Math.pow(10, precision),\n        lng = Math.round(center.lng * m) / m,\n        lat = Math.round(center.lat * m) / m,\n        bearing = map.getBearing(),\n        pitch = map.getPitch();\n\n    // new map feedback site has some constraints that don't allow\n    // us to use the same hash format as we do for the Map hash option.\n    let hash = mapFeedback ? `/${lng}/${lat}/${zoom}` : `${zoom}/${lat}/${lng}`;\n\n    if (bearing || pitch) hash += (`/${Math.round(bearing * 10) / 10}`);\n    if (pitch) hash += (`/${Math.round(pitch)}`);\n\n    return hash;\n}\n","// @flow\n\nimport browser from '../util/browser.js';\nimport type {Map} from './map.js';\nimport {bezier, clamp, extend} from '../util/util.js';\nimport Point from '@mapbox/point-geometry';\n\nimport type {DragPanOptions} from './handler/shim/drag_pan.js';\nimport type {EasingOptions} from '../ui/camera.js';\n\nconst defaultInertiaOptions = {\n    linearity: 0.3,\n    easing: bezier(0, 0, 0.3, 1),\n};\n\nconst defaultPanInertiaOptions = extend({\n    deceleration: 2500,\n    maxSpeed: 1400\n}, defaultInertiaOptions);\n\nconst defaultZoomInertiaOptions = extend({\n    deceleration: 20,\n    maxSpeed: 1400\n}, defaultInertiaOptions);\n\nconst defaultBearingInertiaOptions = extend({\n    deceleration: 1000,\n    maxSpeed: 360\n}, defaultInertiaOptions);\n\nconst defaultPitchInertiaOptions = extend({\n    deceleration: 1000,\n    maxSpeed: 90\n}, defaultInertiaOptions);\n\nexport type InertiaOptions = {\n    linearity: number;\n    easing: (t: number) => number;\n    deceleration: number;\n    maxSpeed: number;\n};\n\nexport type InputEvent = MouseEvent | TouchEvent | KeyboardEvent | WheelEvent;\n\nexport default class HandlerInertia {\n    _map: Map;\n    _inertiaBuffer: Array<{ time: number, settings: Object }>;\n\n    constructor(map: Map) {\n        this._map = map;\n        this.clear();\n    }\n\n    clear() {\n        this._inertiaBuffer = [];\n    }\n\n    record(settings: any) {\n        this._drainInertiaBuffer();\n        this._inertiaBuffer.push({time: browser.now(), settings});\n    }\n\n    _drainInertiaBuffer() {\n        const inertia = this._inertiaBuffer,\n            now = browser.now(),\n            cutoff = 160;   //msec\n\n        while (inertia.length > 0 && now - inertia[0].time > cutoff)\n            inertia.shift();\n    }\n\n    _onMoveEnd(panInertiaOptions?: DragPanOptions): ?(EasingOptions & {easeId?: string}) {\n        if (this._map._prefersReducedMotion()) {\n            return;\n        }\n\n        this._drainInertiaBuffer();\n        if (this._inertiaBuffer.length < 2) {\n            return;\n        }\n\n        const deltas = {\n            zoom: 0,\n            bearing: 0,\n            pitch: 0,\n            pan: new Point(0, 0),\n            pinchAround: undefined,\n            around: undefined\n        };\n\n        for (const {settings} of this._inertiaBuffer) {\n            deltas.zoom += settings.zoomDelta || 0;\n            deltas.bearing += settings.bearingDelta || 0;\n            deltas.pitch += settings.pitchDelta || 0;\n            if (settings.panDelta) deltas.pan._add(settings.panDelta);\n            if (settings.around) deltas.around = settings.around;\n            if (settings.pinchAround) deltas.pinchAround = settings.pinchAround;\n        }\n\n        const lastEntry = this._inertiaBuffer[this._inertiaBuffer.length - 1];\n        const duration = (lastEntry.time - this._inertiaBuffer[0].time);\n\n        const easeOptions = {};\n\n        if (deltas.pan.mag()) {\n            const result = calculateEasing(deltas.pan.mag(), duration, extend({}, defaultPanInertiaOptions, panInertiaOptions || {}));\n            easeOptions.offset = deltas.pan.mult(result.amount / deltas.pan.mag());\n            easeOptions.center = this._map.transform.center;\n            extendDuration(easeOptions, result);\n        }\n\n        if (deltas.zoom) {\n            const result = calculateEasing(deltas.zoom, duration, defaultZoomInertiaOptions);\n            easeOptions.zoom = this._map.transform.zoom + result.amount;\n            extendDuration(easeOptions, result);\n        }\n\n        if (deltas.bearing) {\n            const result = calculateEasing(deltas.bearing, duration, defaultBearingInertiaOptions);\n            easeOptions.bearing = this._map.transform.bearing + clamp(result.amount, -179, 179);\n            extendDuration(easeOptions, result);\n        }\n\n        if (deltas.pitch) {\n            const result = calculateEasing(deltas.pitch, duration, defaultPitchInertiaOptions);\n            easeOptions.pitch = this._map.transform.pitch + result.amount;\n            extendDuration(easeOptions, result);\n        }\n\n        if (easeOptions.zoom || easeOptions.bearing) {\n            const last = deltas.pinchAround === undefined ? deltas.around : deltas.pinchAround;\n            easeOptions.around = last ? this._map.unproject(last) : this._map.getCenter();\n        }\n\n        this.clear();\n        easeOptions.noMoveStart = true;\n        return easeOptions;\n    }\n}\n\n// Unfortunately zoom, bearing, etc can't have different durations and easings so\n// we need to choose one. We use the longest duration and it's corresponding easing.\nfunction extendDuration(easeOptions: EasingOptions, result: {| amount: number, duration: number, easing: (t: number) => number |}) {\n    if (!easeOptions.duration || easeOptions.duration < result.duration) {\n        easeOptions.duration = result.duration;\n        easeOptions.easing = result.easing;\n    }\n}\n\nfunction calculateEasing(amount: number, inertiaDuration: number, inertiaOptions: InertiaOptions) {\n    const {maxSpeed, linearity, deceleration} = inertiaOptions;\n    const speed = clamp(\n        amount * linearity / (inertiaDuration / 1000),\n        -maxSpeed,\n        maxSpeed);\n    const duration = Math.abs(speed) / (deceleration * linearity);\n    return {\n        easing: inertiaOptions.easing,\n        duration: duration * 1000,\n        amount: speed * (duration / 2)\n    };\n}\n","// @flow\n\nimport {Event} from '../util/evented.js';\n\nimport * as DOM from '../util/dom.js';\nimport Point from '@mapbox/point-geometry';\nimport {extend} from '../util/util.js';\n\nimport type {Map} from './map.js';\nimport type LngLat from '../geo/lng_lat.js';\n\n/**\n * `MapMouseEvent` is a class used by other classes to generate\n * mouse events of specific types such as 'click' or 'hover'.\n * For a full list of available events, see [`Map` events](/mapbox-gl-js/api/map/#map-events).\n *\n * @extends {Object}\n * @example\n * // Example of a MapMouseEvent of type \"click\"\n * map.on('click', (e) => {\n *     console.log(e);\n *     // {\n *     //     lngLat: {\n *     //         lng: 40.203,\n *     //         lat: -74.451\n *     //     },\n *     //     originalEvent: {...},\n *     //     point: {\n *     //         x: 266,\n *     //         y: 464\n *     //     },\n *     //      target: {...},\n *     //      type: \"click\"\n *     // }\n * });\n * @see [Reference: `Map` events API documentation](https://docs.mapbox.com/mapbox-gl-js/api/map/#map-events)\n * @see [Example: Display popup on click](https://docs.mapbox.com/mapbox-gl-js/example/popup-on-click/)\n * @see [Example: Display popup on hover](https://www.mapbox.com/mapbox-gl-js/example/popup-on-hover/)\n */\nexport class MapMouseEvent extends Event {\n    /**\n     * The type of originating event. For a full list of available events, see [`Map` events](/mapbox-gl-js/api/map/#map-events).\n     */\n    type: 'mousedown'\n        | 'mouseup'\n        | 'preclick'\n        | 'click'\n        | 'dblclick'\n        | 'mousemove'\n        | 'mouseover'\n        | 'mouseenter'\n        | 'mouseleave'\n        | 'mouseout'\n        | 'contextmenu';\n\n    /**\n     * The `Map` object that fired the event.\n     */\n    target: Map;\n\n    /**\n     * The DOM event which caused the map event.\n     */\n    originalEvent: MouseEvent;\n\n    /**\n     * The pixel coordinates of the mouse cursor, relative to the map and measured from the top left corner.\n     */\n    point: Point;\n\n    /**\n     * The geographic location on the map of the mouse cursor.\n     */\n    lngLat: LngLat;\n\n    /**\n     * If a single `layerId`(as a single string) or multiple `layerIds` (as an array of strings) were specified when adding the event listener with {@link Map#on},\n     * `features` will be an array of [GeoJSON](http://geojson.org/) [Feature objects](https://tools.ietf.org/html/rfc7946#section-3.2).\n     * The array will contain all features from that layer that are rendered at the event's point,\n     * in the order that they are rendered with the topmost feature being at the start of the array.\n     * The `features` are identical to those returned by {@link Map#queryRenderedFeatures}.\n     *\n     * If no `layerId` was specified when adding the event listener, `features` will be `undefined`.\n     * You can get the features at the point with `map.queryRenderedFeatures(e.point)`.\n     *\n     * @example\n     * // logging features for a specific layer (with `e.features`)\n     * map.on('click', 'myLayerId', (e) => {\n     *     console.log(`There are ${e.features.length} features at point ${e.point}`);\n     * });\n     *\n     * @example\n     * // logging features for two layers (with `e.features`)\n     * map.on('click', ['layer1', 'layer2'], (e) => {\n     *     console.log(`There are ${e.features.length} features at point ${e.point}`);\n     * });\n     *\n     * @example\n     * // logging all features for all layers (without `e.features`)\n     * map.on('click', (e) => {\n     *     const features = map.queryRenderedFeatures(e.point);\n     *     console.log(`There are ${features.length} features at point ${e.point}`);\n     * });\n     */\n    features: Array<Object> | void;\n\n    /**\n     * Prevents subsequent default processing of the event by the map.\n     *\n     * Calling this method will prevent the following default map behaviors:\n     *\n     *   * On `mousedown` events, the behavior of {@link DragPanHandler}.\n     *   * On `mousedown` events, the behavior of {@link DragRotateHandler}.\n     *   * On `mousedown` events, the behavior of {@link BoxZoomHandler}.\n     *   * On `dblclick` events, the behavior of {@link DoubleClickZoomHandler}.\n     *\n     * @example\n     * map.on('click', (e) => {\n     *     e.preventDefault();\n     * });\n     */\n    preventDefault() {\n        this._defaultPrevented = true;\n    }\n\n    /**\n     * `true` if `preventDefault` has been called.\n     * @private\n     */\n    get defaultPrevented(): boolean {\n        return this._defaultPrevented;\n    }\n\n    _defaultPrevented: boolean;\n\n    /**\n     * @private\n     */\n    constructor(type: string, map: Map, originalEvent: MouseEvent, data: Object = {}) {\n        const point = DOM.mousePos(map.getCanvasContainer(), originalEvent);\n        const lngLat = map.unproject(point);\n        super(type, extend({point, lngLat, originalEvent}, data));\n        this._defaultPrevented = false;\n        this.target = map;\n    }\n}\n\n/**\n * `MapTouchEvent` is a class used by other classes to generate\n * mouse events of specific types such as 'touchstart' or 'touchend'.\n * For a full list of available events, see [`Map` events](/mapbox-gl-js/api/map/#map-events).\n *\n * @extends {Object}\n *\n * @example\n * // Example of a MapTouchEvent of type \"touch\"\n * map.on('touchstart', (e) => {\n *     console.log(e);\n *     // {\n *     //   lngLat: {\n *     //      lng: 40.203,\n *     //      lat: -74.451\n *     //   },\n *     //   lngLats: [\n *     //      {\n *     //         lng: 40.203,\n *     //         lat: -74.451\n *     //      }\n *     //   ],\n *     //   originalEvent: {...},\n *     //   point: {\n *     //      x: 266,\n *     //      y: 464\n *     //   },\n *     //   points: [\n *     //      {\n *     //         x: 266,\n *     //         y: 464\n *     //      }\n *     //   ]\n *     //   preventDefault(),\n *     //   target: {...},\n *     //   type: \"touchstart\"\n *     // }\n * });\n * @see [Reference: `Map` events API documentation](https://docs.mapbox.com/mapbox-gl-js/api/map/#map-events)\n * @see [Example: Create a draggable point](https://docs.mapbox.com/mapbox-gl-js/example/drag-a-point/)\n */\nexport class MapTouchEvent extends Event {\n    /**\n     * The type of originating event. For a full list of available events, see [`Map` events](/mapbox-gl-js/api/map/#map-events).\n     */\n    type: 'touchstart'\n        | 'touchend'\n        | 'touchcancel';\n\n    /**\n     * The `Map` object that fired the event.\n     */\n    target: Map;\n\n    /**\n     * The DOM event which caused the map event.\n     */\n    originalEvent: TouchEvent;\n\n    /**\n     * The geographic location on the map of the center of the touch event points.\n     */\n    lngLat: LngLat;\n\n    /**\n     * The pixel coordinates of the center of the touch event points, relative to the map and measured from the top left\n     * corner.\n     */\n    point: Point;\n\n    /**\n     * The array of pixel coordinates corresponding to a\n     * [touch event's `touches`](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/touches) property.\n     */\n    points: Array<Point>;\n\n    /**\n     * The geographical locations on the map corresponding to a\n     * [touch event's `touches`](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/touches) property.\n     */\n    lngLats: Array<LngLat>;\n\n    /**\n     * If a `layerId` was specified when adding the event listener with {@link Map#on}, `features` will be an array of\n     * [GeoJSON](http://geojson.org/) [Feature objects](https://tools.ietf.org/html/rfc7946#section-3.2).\n     * The array will contain all features from that layer that are rendered at the event's point.\n     * The `features` are identical to those returned by {@link Map#queryRenderedFeatures}.\n     *\n     * If no `layerId` was specified when adding the event listener, `features` will be `undefined`.\n     * You can get the features at the point with `map.queryRenderedFeatures(e.point)`.\n     *\n     * @example\n     * // logging features for a specific layer (with `e.features`)\n     * map.on('touchstart', 'myLayerId', (e) => {\n     *     console.log(`There are ${e.features.length} features at point ${e.point}`);\n     * });\n     *\n     * @example\n     * // logging all features for all layers (without `e.features`)\n     * map.on('touchstart', (e) => {\n     *     const features = map.queryRenderedFeatures(e.point);\n     *     console.log(`There are ${features.length} features at point ${e.point}`);\n     * });\n     */\n    features: Array<Object> | void;\n\n    /**\n     * Prevents subsequent default processing of the event by the map.\n     *\n     * Calling this method will prevent the following default map behaviors:\n     *\n     *   * On `touchstart` events, the behavior of {@link DragPanHandler}.\n     *   * On `touchstart` events, the behavior of {@link TouchZoomRotateHandler}.\n     *\n     * @example\n     * map.on('touchstart', (e) => {\n     *     e.preventDefault();\n     * });\n     */\n    preventDefault() {\n        this._defaultPrevented = true;\n    }\n\n    /**\n     * Returns `true` if `preventDefault` has been called.\n     * @private\n     */\n    get defaultPrevented(): boolean {\n        return this._defaultPrevented;\n    }\n\n    _defaultPrevented: boolean;\n\n    /**\n     * @private\n     */\n    constructor(type: string, map: Map, originalEvent: TouchEvent) {\n        const touches = type === \"touchend\" ? originalEvent.changedTouches : originalEvent.touches;\n        const points = DOM.touchPos(map.getCanvasContainer(), touches);\n        const lngLats = points.map((t) => map.unproject(t));\n        const point = points.reduce((prev, curr, i, arr) => {\n            return prev.add(curr.div(arr.length));\n        }, new Point(0, 0));\n        const lngLat = map.unproject(point);\n        super(type, {points, point, lngLats, lngLat, originalEvent});\n        this._defaultPrevented = false;\n    }\n}\n\n/**\n * `MapWheelEvent` is a class used by other classes to generate\n * mouse events of specific types such as 'wheel'.\n * For a full list of available events, see [`Map` events](/mapbox-gl-js/api/map/#map-events).\n *\n * @extends {Object}\n * @example\n * // Example event trigger for a MapWheelEvent of type \"wheel\"\n * map.on('wheel', (e) => {\n *     console.log('event type:', e.type);\n *     // event type: wheel\n * });\n * @example\n * // Example of a MapWheelEvent of type \"wheel\"\n * // {\n * //   originalEvent: WheelEvent {...},\n * // \t target: Map {...},\n * // \t type: \"wheel\"\n * // }\n * @see [Reference: `Map` events API documentation](https://docs.mapbox.com/mapbox-gl-js/api/map/#map-events)\n */\nexport class MapWheelEvent extends Event {\n    /**\n     * The type of originating event. For a full list of available events, see [`Map` events](/mapbox-gl-js/api/map/#map-events).\n     */\n    type: 'wheel';\n\n    /**\n     * The `Map` object that fired the event.\n     */\n    target: Map;\n\n    /**\n     * The DOM event which caused the map event.\n     */\n    originalEvent: WheelEvent;\n\n    /**\n     * Prevents subsequent default processing of the event by the map.\n     * Calling this method will prevent the the behavior of {@link ScrollZoomHandler}.\n     *\n     * @example\n     * map.on('wheel', (e) => {\n     *     // Prevent the default map scroll zoom behavior.\n     *     e.preventDefault();\n     * });\n     */\n    preventDefault() {\n        this._defaultPrevented = true;\n    }\n\n    /**\n     * `true` if `preventDefault` has been called.\n     * @private\n     */\n    get defaultPrevented(): boolean {\n        return this._defaultPrevented;\n    }\n\n    _defaultPrevented: boolean;\n\n    /**\n     * @private\n     */\n    constructor(type: string, map: Map, originalEvent: WheelEvent) {\n        super(type, {originalEvent});\n        this._defaultPrevented = false;\n    }\n}\n\n/**\n * `MapBoxZoomEvent` is a class used to generate\n * the events 'boxzoomstart', 'boxzoomend', and 'boxzoomcancel'.\n * For a full list of available events, see [`Map` events](/mapbox-gl-js/api/map/#map-events).\n *\n * @typedef {Object} MapBoxZoomEvent\n * @property {MouseEvent} originalEvent The DOM event that triggered the boxzoom event. Can be a `MouseEvent` or `KeyboardEvent`.\n * @property {('boxzoomstart' | 'boxzoomend' | 'boxzoomcancel')} type The type of originating event. For a full list of available events, see [`Map` events](/mapbox-gl-js/api/map/#map-events).\n * @property {Map} target The `Map` instance that triggered the event.\n * @example\n * // Example trigger of a BoxZoomEvent of type \"boxzoomstart\"\n * map.on('boxzoomstart', (e) => {\n *     console.log('event type:', e.type);\n *     // event type: boxzoomstart\n * });\n * @example\n * // Example of a BoxZoomEvent of type \"boxzoomstart\"\n * // {\n * //   originalEvent: {...},\n * //   type: \"boxzoomstart\",\n * //   target: {...}\n * // }\n * @see [Reference: `Map` events API documentation](https://docs.mapbox.com/mapbox-gl-js/api/map/#map-events)\n * @see [Example: Highlight features within a bounding box](https://docs.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/)\n */\nexport type MapBoxZoomEvent = {\n    type: 'boxzoomstart'\n        | 'boxzoomend'\n        | 'boxzoomcancel',\n    target: Map,\n    originalEvent: MouseEvent\n};\n\n/**\n * `MapDataEvent` is a class used to generate\n * events related to loading data, styles, and sources.\n * For a full list of available events, see [`Map` events](/mapbox-gl-js/api/map/#map-events).\n *\n * @typedef {Object} MapDataEvent\n * @property {('data' | 'dataloading' | 'styledata' | 'styledataloading' | 'sourcedata'| 'sourcedataloading')} type The type of originating event. For a full list of available events, see [`Map` events](/mapbox-gl-js/api/map/#map-events).\n * @property {('source' | 'style')} dataType The type of data that has changed. One of `'source'` or `'style'`, where `'source'` refers to the data associated with any source, and `'style'` refers to the entire [style](https://docs.mapbox.com/help/glossary/style/) used by the map.\n * @property {boolean} [isSourceLoaded] True if the event has a `dataType` of `source` and the source has no outstanding network requests.\n * @property {Object} [source] The [style spec representation of the source](https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/) if the event has a `dataType` of `source`.\n * @property {string} [sourceId] The `id` of the [`source`](https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/) that triggered the event, if the event has a `dataType` of `source`. Same as the `id` of the object in the `source` property.\n * @property {string} [sourceDataType] Included if the event has a `dataType` of `source` and the event signals\n * that internal data has been received or changed. Possible values are `metadata`, `content` and `visibility`, and `error`.\n * @property {Object} [tile] The tile being loaded or changed, if the event has a `dataType` of `source` and\n * the event is related to loading of a tile.\n * @property {Coordinate} [coord] The coordinate of the tile if the event has a `dataType` of `source` and\n * the event is related to loading of a tile.\n * @example\n * // Example of a MapDataEvent of type \"sourcedata\"\n * map.on('sourcedata', (e) => {\n *     console.log(e);\n *     // {\n *     //   dataType: \"source\",\n *     //   isSourceLoaded: false,\n *     //   source: {\n *     //     type: \"vector\",\n *     //     url: \"mapbox://mapbox.mapbox-streets-v8,mapbox.mapbox-terrain-v2\"\n *     //   },\n *     //   sourceDataType: \"visibility\",\n *     //   sourceId: \"composite\",\n *     //   style: {...},\n *     //   target: {...},\n *     //   type: \"sourcedata\"\n *     // }\n * });\n * @see [Reference: `Map` events API documentation](https://docs.mapbox.com/mapbox-gl-js/api/map/#map-events)\n * @see [Example: Change a map's style](https://docs.mapbox.com/mapbox-gl-js/example/setstyle/)\n * @see [Example: Add a GeoJSON line](https://docs.mapbox.com/mapbox-gl-js/example/geojson-line/)\n */\nexport type MapDataEvent = {\n    type: 'data'\n        | 'dataloading'\n        | 'styledata'\n        | 'styledataloading'\n        | 'sourcedata'\n        | 'sourcedataloading',\n    dataType: 'source'\n        | 'style'\n};\n\nexport type MapContextEvent = {\n    type: 'webglcontextlost' | 'webglcontextrestored',\n    originalEvent: WebGLContextEvent\n}\n\nexport type MapEvent =\n    /** @section {Interaction}\n     * @event\n     * @instance\n     * @memberof Map */\n\n    /**\n     * Fired when a pointing device (usually a mouse) is pressed within the map.\n     *\n     * **Note:** This event is compatible with the optional `layerId` parameter.\n     * If `layerId` is included as the second argument in {@link Map#on}, the event listener will fire only when the\n     * the cursor is pressed while inside a visible portion of the specifed layer.\n     *\n     * @event mousedown\n     * @memberof Map\n     * @instance\n     * @type {MapMouseEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener\n     * map.on('mousedown', () => {\n     *     console.log('A mousedown event has occurred.');\n     * });\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener for a specific layer\n     * map.on('mousedown', 'poi-label', () => {\n     *     console.log('A mousedown event has occurred on a visible portion of the poi-label layer.');\n     * });\n     * @see [Example: Highlight features within a bounding box](https://docs.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/)\n     * @see [Example: Create a draggable point](https://docs.mapbox.com/mapbox-gl-js/example/drag-a-point/)\n     */\n    | 'mousedown'\n\n    /**\n     * Fired when a pointing device (usually a mouse) is released within the map.\n     *\n     * **Note:** This event is compatible with the optional `layerId` parameter.\n     * If `layerId` is included as the second argument in {@link Map#on}, the event listener will fire only when the\n     * the cursor is released while inside a visible portion of the specifed layer.\n     *\n     * @event mouseup\n     * @memberof Map\n     * @instance\n     * @type {MapMouseEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener\n     * map.on('mouseup', () => {\n     *     console.log('A mouseup event has occurred.');\n     * });\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener for a specific layer\n     * map.on('mouseup', 'poi-label', () => {\n     *     console.log('A mouseup event has occurred on a visible portion of the poi-label layer.');\n     * });\n     * @see [Example: Highlight features within a bounding box](https://docs.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/)\n     * @see [Example: Create a draggable point](https://docs.mapbox.com/mapbox-gl-js/example/drag-a-point/)\n     */\n    | 'mouseup'\n\n    /**\n     * Fired when a pointing device (usually a mouse) is moved within the map.\n     * As you move the cursor across a web page containing a map,\n     * the event will fire each time it enters the map or any child elements.\n     *\n     * **Note:** This event is compatible with the optional `layerId` parameter.\n     * If `layerId` is included as the second argument in {@link Map#on}, the event listener will fire only when the\n     * the cursor is moved inside a visible portion of the specifed layer.\n     *\n     * @event mouseover\n     * @memberof Map\n     * @instance\n     * @type {MapMouseEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener\n     * map.on('mouseover', () => {\n     *     console.log('A mouseover event has occurred.');\n     * });\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener for a specific layer\n     * map.on('mouseover', 'poi-label', () => {\n     *     console.log('A mouseover event has occurred on a visible portion of the poi-label layer.');\n     * });\n     * @see [Example: Get coordinates of the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/mouse-position/)\n     * @see [Example: Highlight features under the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/hover-styles/)\n     * @see [Example: Display a popup on hover](https://www.mapbox.com/mapbox-gl-js/example/popup-on-hover/)\n     */\n    | 'mouseover'\n\n    /**\n     * Fired when a pointing device (usually a mouse) is moved while the cursor is inside the map.\n     * As you move the cursor across the map, the event will fire every time the cursor changes position within the map.\n     *\n     * **Note:** This event is compatible with the optional `layerId` parameter.\n     * If `layerId` is included as the second argument in {@link Map#on}, the event listener will fire only when the\n     * the cursor is inside a visible portion of the specified layer.\n     *\n     * @event mousemove\n     * @memberof Map\n     * @instance\n     * @type {MapMouseEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener\n     * map.on('mousemove', () => {\n     *     console.log('A mousemove event has occurred.');\n     * });\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener for a specific layer\n     * map.on('mousemove', 'poi-label', () => {\n     *     console.log('A mousemove event has occurred on a visible portion of the poi-label layer.');\n     * });\n     * @see [Example: Get coordinates of the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/mouse-position/)\n     * @see [Example: Highlight features under the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/hover-styles/)\n     * @see [Example: Display a popup on over](https://www.mapbox.com/mapbox-gl-js/example/popup-on-hover/)\n     */\n    | 'mousemove'\n\n    /**\n     * Triggered when a click event occurs and is fired before the click event.\n     * Primarily implemented to ensure closeOnClick for pop-ups is fired before any other listeners.\n     *\n     * @event preclick\n     * @memberof Map\n     * @instance\n     * @type {MapMouseEvent}\n     */\n     | 'preclick'\n\n    /**\n     * Fired when a pointing device (usually a mouse) is pressed and released at the same point on the map.\n     *\n     * **Note:** This event is compatible with the optional `layerId` parameter.\n     * If `layerId` is included as the second argument in {@link Map#on}, the event listener will fire only when the\n     * point that is pressed and released contains a visible portion of the specifed layer.\n     *\n     * @event click\n     * @memberof Map\n     * @instance\n     * @type {MapMouseEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener\n     * map.on('click', (e) => {\n     *     console.log(`A click event has occurred at ${e.lngLat}`);\n     * });\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener for a specific layer\n     * map.on('click', 'poi-label', (e) => {\n     *     console.log(`A click event has occurred on a visible portion of the poi-label layer at ${e.lngLat}`);\n     * });\n     * @see [Example: Measure distances](https://www.mapbox.com/mapbox-gl-js/example/measure/)\n     * @see [Example: Center the map on a clicked symbol](https://www.mapbox.com/mapbox-gl-js/example/center-on-symbol/)\n     */\n    | 'click'\n\n    /**\n     * Fired when a pointing device (usually a mouse) is pressed and released twice at the same point on\n     * the map in rapid succession.\n     *\n     * **Note:** This event is compatible with the optional `layerId` parameter.\n     * If `layerId` is included as the second argument in {@link Map#on}, the event listener will fire only\n     * when the point that is clicked twice contains a visible portion of the specifed layer.\n     *\n     * @event dblclick\n     * @memberof Map\n     * @instance\n     * @type {MapMouseEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener\n     * map.on('dblclick', (e) => {\n     *     console.log(`A dblclick event has occurred at ${e.lngLat}`);\n     * });\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener for a specific layer\n     * map.on('dblclick', 'poi-label', (e) => {\n     *     console.log(`A dblclick event has occurred on a visible portion of the poi-label layer at ${e.lngLat}`);\n     * });\n     */\n    | 'dblclick'\n\n    /**\n     * Fired when a pointing device (usually a mouse) enters a visible portion of a specified layer from\n     * outside that layer or outside the map canvas.\n     *\n     * **Important:** This event can only be listened for when {@link Map#on} includes three arguments,\n     * where the second argument specifies the desired layer.\n     *\n     * @event mouseenter\n     * @memberof Map\n     * @instance\n     * @type {MapMouseEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener\n     * map.on('mouseenter', 'water', () => {\n     *     console.log('A mouseenter event occurred on a visible portion of the water layer.');\n     * });\n     * @see [Example: Center the map on a clicked symbol](https://docs.mapbox.com/mapbox-gl-js/example/center-on-symbol/)\n     * @see [Example: Display a popup on click](https://docs.mapbox.com/mapbox-gl-js/example/popup-on-click/)\n     */\n    | 'mouseenter'\n\n    /**\n     * Fired when a pointing device (usually a mouse) leaves a visible portion of a specified layer or moves\n     * from the specified layer to outside the map canvas.\n     *\n     * **Note:** To detect when the mouse leaves the canvas, independent of layer, use {@link Map.event:mouseout} instead.\n     *\n     * **Important:** This event can only be listened for when {@link Map#on} includes three arguments,\n     * where the second argument specifies the desired layer.\n     *\n     * @event mouseleave\n     * @memberof Map\n     * @instance\n     * @type {MapMouseEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // when the pointing device leaves\n     * // a visible portion of the specified layer.\n     * map.on('mouseleave', 'water', () => {\n     *     console.log('A mouseleave event occurred.');\n     * });\n     * @see [Example: Highlight features under the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/hover-styles/)\n     * @see [Example: Display a popup on click](https://docs.mapbox.com/mapbox-gl-js/example/popup-on-click/)\n     */\n    | 'mouseleave'\n\n    /**\n     * Fired when a point device (usually a mouse) leaves the map's canvas.\n     *\n     * @event mouseout\n     * @memberof Map\n     * @instance\n     * @type {MapMouseEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // when the pointing device leaves\n     * // the map's canvas.\n     * map.on('mouseout', () => {\n     *     console.log('A mouseout event occurred.');\n     * });\n     */\n    | 'mouseout'\n\n    /**\n     * Fired when the right button of the mouse is clicked or the context menu key is pressed within the map.\n     *\n     * @event contextmenu\n     * @memberof Map\n     * @instance\n     * @type {MapMouseEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // when the right mouse button is\n     * // pressed within the map.\n     * map.on('contextmenu', () => {\n     *     console.log('A contextmenu event occurred.');\n     * });\n     */\n    | 'contextmenu'\n\n    /**\n     * Fired when a [`wheel`](https://developer.mozilla.org/en-US/docs/Web/Events/wheel) event occurs within the map.\n     *\n     * @event wheel\n     * @memberof Map\n     * @instance\n     * @type {MapWheelEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // when a wheel event occurs within the map.\n     * map.on('wheel', () => {\n     *     console.log('A wheel event occurred.');\n     * });\n     */\n    | 'wheel'\n\n    /**\n     * Fired when a [`touchstart`](https://developer.mozilla.org/en-US/docs/Web/Events/touchstart) event occurs within the map.\n     *\n     * @event touchstart\n     * @memberof Map\n     * @instance\n     * @type {MapTouchEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // when a `touchstart` event occurs within the map.\n     * map.on('touchstart', () => {\n     *     console.log('A touchstart event occurred.');\n     * });\n     * @see [Example: Create a draggable point](https://docs.mapbox.com/mapbox-gl-js/example/drag-a-point/)\n     */\n    | 'touchstart'\n\n    /**\n     * Fired when a [`touchend`](https://developer.mozilla.org/en-US/docs/Web/Events/touchend) event occurs within the map.\n     *\n     * @event touchend\n     * @memberof Map\n     * @instance\n     * @type {MapTouchEvent}\n     * @example\n     * // Initialize the map.\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires when a `touchstart` event occurs within the map.\n     * map.on('touchstart', () => {\n     *     console.log('A touchstart event occurred.');\n     * });\n     * @see [Example: Create a draggable point](https://docs.mapbox.com/mapbox-gl-js/example/drag-a-point/)\n     */\n    | 'touchend'\n\n    /**\n     * Fired when a [`touchmove`](https://developer.mozilla.org/en-US/docs/Web/Events/touchmove) event occurs within the map.\n     *\n     * @event touchmove\n     * @memberof Map\n     * @instance\n     * @type {MapTouchEvent}\n     * @example\n     * // Initialize the map.\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires when a touchmove event occurs within the map.\n     * map.on('touchmove', () => {\n     *     console.log('A touchmove event occurred.');\n     * });\n     * @see [Example: Create a draggable point](https://docs.mapbox.com/mapbox-gl-js/example/drag-a-point/)\n     */\n    | 'touchmove'\n\n    /**\n     * Fired when a [`touchcancel`](https://developer.mozilla.org/en-US/docs/Web/Events/touchcancel) event occurs within the map.\n     *\n     * @event touchcancel\n     * @memberof Map\n     * @instance\n     * @type {MapTouchEvent}\n     * @example\n     * // Initialize the map.\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires when a `touchcancel` event occurs within the map.\n     * map.on('touchcancel', () => {\n     *     console.log('A touchcancel event occurred.');\n     * });\n     */\n    | 'touchcancel'\n\n    /** @section {Movement}\n     * @event\n     * @instance\n     * @memberof Map */\n\n    /**\n     * Fired just before the map begins a transition from one view to another, as the result of either user interaction or methods such as {@link Map#jumpTo}.\n     *\n     * @event movestart\n     * @memberof Map\n     * @instance\n     * @type {DragEvent}\n     * @example\n     * // Initialize the map.\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires just before the map begins a transition from one view to another.\n     * map.on('movestart', () => {\n     *     console.log('A movestart` event occurred.');\n     * });\n     */\n    | 'movestart'\n\n    /**\n     * Fired repeatedly during an animated transition from one view to another, as the result of either user interaction or methods such as {@link Map#flyTo}.\n     *\n     * @event move\n     * @memberof Map\n     * @instance\n     * @type {MapMouseEvent | MapTouchEvent}\n     * @example\n     * // Initialize the map.\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires repeatedly during an animated transition.\n     * map.on('move', () => {\n     *     console.log('A move event occurred.');\n     * });\n     * @see [Example: Display HTML clusters with custom properties](https://docs.mapbox.com/mapbox-gl-js/example/cluster-html/)\n     * @see [Example: Filter features within map view](https://docs.mapbox.com/mapbox-gl-js/example/filter-features-within-map-view/)\n     */\n    | 'move'\n\n    /**\n     * Fired just after the map completes a transition from one\n     * view to another, as the result of either user interaction or methods such as {@link Map#jumpTo}.\n     *\n     * @event moveend\n     * @memberof Map\n     * @instance\n     * @type {DragEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // just after the map completes a transition.\n     * map.on('moveend', () => {\n     *     console.log('A moveend event occurred.');\n     * });\n     * @see [Example: Play map locations as a slideshow](https://www.mapbox.com/mapbox-gl-js/example/playback-locations/)\n     * @see [Example: Filter features within map view](https://www.mapbox.com/mapbox-gl-js/example/filter-features-within-map-view/)\n     * @see [Example: Display HTML clusters with custom properties](https://docs.mapbox.com/mapbox-gl-js/example/cluster-html/)\n     */\n    | 'moveend'\n\n    /**\n     * Fired when a \"drag to pan\" interaction starts. See {@link DragPanHandler}.\n     *\n     * @event dragstart\n     * @memberof Map\n     * @instance\n     * @type {DragEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // when a \"drag to pan\" interaction starts.\n     * map.on('dragstart', () => {\n     *     console.log('A dragstart event occurred.');\n     * });\n     */\n    | 'dragstart'\n\n    /**\n     * Fired repeatedly during a \"drag to pan\" interaction. See {@link DragPanHandler}.\n     *\n     * @event drag\n     * @memberof Map\n     * @instance\n     * @type {MapMouseEvent | MapTouchEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // repeatedly during a \"drag to pan\" interaction.\n     * map.on('drag', () => {\n     *     console.log('A drag event occurred.');\n     * });\n     */\n    | 'drag'\n\n    /**\n     * Fired when a \"drag to pan\" interaction ends. See {@link DragPanHandler}.\n     *\n     * @event dragend\n     * @memberof Map\n     * @instance\n     * @type {DragEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // when a \"drag to pan\" interaction ends.\n     * map.on('dragend', () => {\n     *     console.log('A dragend event occurred.');\n     * });\n     * @see [Example: Create a draggable marker](https://docs.mapbox.com/mapbox-gl-js/example/drag-a-marker/)\n     */\n    | 'dragend'\n\n    /**\n     * Fired just before the map begins a transition from one zoom level to another,\n     * as the result of either user interaction or methods such as {@link Map#flyTo}.\n     *\n     * @event zoomstart\n     * @memberof Map\n     * @instance\n     * @type {MapMouseEvent | MapTouchEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // just before a zoom transition starts.\n     * map.on('zoomstart', () => {\n     *     console.log('A zoomstart event occurred.');\n     * });\n     */\n    | 'zoomstart'\n\n    /**\n     * Fired repeatedly during an animated transition from one zoom level to another,\n     * as the result of either user interaction or methods such as {@link Map#flyTo}.\n     *\n     * @event zoom\n     * @memberof Map\n     * @instance\n     * @type {MapMouseEvent | MapTouchEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // repeatedly during a zoom transition.\n     * map.on('zoom', () => {\n     *     console.log('A zoom event occurred.');\n     * });\n     * @see [Example: Update a choropleth layer by zoom level](https://www.mapbox.com/mapbox-gl-js/example/updating-choropleth/)\n     */\n    | 'zoom'\n\n    /**\n     * Fired just after the map completes a transition from one zoom level to another\n     * as the result of either user interaction or methods such as {@link Map#flyTo}.\n     * The zoom transition will usually end before rendering is finished, so if you\n     * need to wait for rendering to finish, use the {@link Map.event:idle} event instead.\n     *\n     * @event zoomend\n     * @memberof Map\n     * @instance\n     * @type {MapMouseEvent | MapTouchEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // just after a zoom transition finishes.\n     * map.on('zoomend', () => {\n     *     console.log('A zoomend event occurred.');\n     * });\n     */\n    | 'zoomend'\n\n    /**\n     * Fired when a \"drag to rotate\" interaction starts. See {@link DragRotateHandler}.\n     *\n     * @event rotatestart\n     * @memberof Map\n     * @instance\n     * @type {MapMouseEvent | MapTouchEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // just before a \"drag to rotate\" interaction starts.\n     * map.on('rotatestart', () => {\n     *     console.log('A rotatestart event occurred.');\n     * });\n     */\n    | 'rotatestart'\n\n    /**\n     * Fired repeatedly during a \"drag to rotate\" interaction. See {@link DragRotateHandler}.\n     *\n     * @event rotate\n     * @memberof Map\n     * @instance\n     * @type {MapMouseEvent | MapTouchEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // repeatedly during \"drag to rotate\" interaction.\n     * map.on('rotate', () => {\n     *     console.log('A rotate event occurred.');\n     * });\n     */\n    | 'rotate'\n\n    /**\n     * Fired when a \"drag to rotate\" interaction ends. See {@link DragRotateHandler}.\n     *\n     * @event rotateend\n     * @memberof Map\n     * @instance\n     * @type {MapMouseEvent | MapTouchEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // just after a \"drag to rotate\" interaction ends.\n     * map.on('rotateend', () => {\n     *     console.log('A rotateend event occurred.');\n     * });\n     */\n    | 'rotateend'\n\n    /**\n     * Fired whenever the map's pitch (tilt) begins a change as\n     * the result of either user interaction or methods such as {@link Map#flyTo} .\n     *\n     * @event pitchstart\n     * @memberof Map\n     * @instance\n     * @type {MapDataEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // just before a pitch (tilt) transition starts.\n     * map.on('pitchstart', () => {\n     *     console.log('A pitchstart event occurred.');\n     * });\n     */\n    | 'pitchstart'\n\n    /**\n     * Fired repeatedly during the map's pitch (tilt) animation between\n     * one state and another as the result of either user interaction\n     * or methods such as {@link Map#flyTo}.\n     *\n     * @event pitch\n     * @memberof Map\n     * @instance\n     * @type {MapDataEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // repeatedly during a pitch (tilt) transition.\n     * map.on('pitch', () => {\n     *     console.log('A pitch event occurred.');\n     * });\n     */\n    | 'pitch'\n\n    /**\n     * Fired immediately after the map's pitch (tilt) finishes changing as\n     * the result of either user interaction or methods such as {@link Map#flyTo}.\n     *\n     * @event pitchend\n     * @memberof Map\n     * @instance\n     * @type {MapDataEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // just after a pitch (tilt) transition ends.\n     * map.on('pitchend', () => {\n     *     console.log('A pitchend event occurred.');\n     * });\n     */\n    | 'pitchend'\n\n    /**\n     * Fired when a \"box zoom\" interaction starts. See {@link BoxZoomHandler}.\n     *\n     * @event boxzoomstart\n     * @memberof Map\n     * @instance\n     * @type {MapBoxZoomEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // just before a \"box zoom\" interaction starts.\n     * map.on('boxzoomstart', () => {\n     *     console.log('A boxzoomstart event occurred.');\n     * });\n     */\n    | 'boxzoomstart'\n\n    /**\n     * Fired when a \"box zoom\" interaction ends.  See {@link BoxZoomHandler}.\n     *\n     * @event boxzoomend\n     * @memberof Map\n     * @instance\n     * @type {Object}\n     * @type {MapBoxZoomEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // just after a \"box zoom\" interaction ends.\n     * map.on('boxzoomend', () => {\n     *     console.log('A boxzoomend event occurred.');\n     * });\n     */\n    | 'boxzoomend'\n\n    /**\n     * Fired when the user cancels a \"box zoom\" interaction, or when the bounding box does not meet the minimum size threshold.\n     * See {@link BoxZoomHandler}.\n     *\n     * @event boxzoomcancel\n     * @memberof Map\n     * @instance\n     * @type {MapBoxZoomEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // the user cancels a \"box zoom\" interaction.\n     * map.on('boxzoomcancel', () => {\n     *     console.log('A boxzoomcancel event occurred.');\n     * });\n     */\n    | 'boxzoomcancel'\n\n    /**\n     * Fired immediately after the map has been resized.\n     *\n     * @event resize\n     * @memberof Map\n     * @instance\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // immediately after the map has been resized.\n     * map.on('resize', () => {\n     *     console.log('A resize event occurred.');\n     * });\n     */\n    | 'resize'\n\n    /** @section {Lifecycle}\n     * @event\n     * @instance\n     * @memberof Map */\n\n    /**\n     * Fired immediately after all necessary resources have been downloaded\n     * and the first visually complete rendering of the map has occurred.\n     *\n     * @event load\n     * @memberof Map\n     * @instance\n     * @type {Object}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // when the map has finished loading.\n     * map.on('load', () => {\n     *     console.log('A load event occurred.');\n     * });\n     * @see [Example: Draw GeoJSON points](https://www.mapbox.com/mapbox-gl-js/example/geojson-markers/)\n     * @see [Example: Add live realtime data](https://www.mapbox.com/mapbox-gl-js/example/live-geojson/)\n     * @see [Example: Animate a point](https://www.mapbox.com/mapbox-gl-js/example/animate-point-along-line/)\n     */\n    | 'load'\n\n    /**\n     * Fired whenever the rendering process of the map is started.\n     * This event can be used in pair with the \"render\" event,\n     * to measure the time spent on the CPU during the rendering\n     * of a single frame.\n     *\n     * @event renderstart\n     * @memberof Map\n     * @instance\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // when the map begins rendering.\n     * map.on('renderstart', () => {\n     *     console.log('A renderstart event occurred.');\n     * });\n     */\n    | 'renderstart'\n\n    /**\n     * Fired whenever the map is drawn to the screen, as the result of:\n     *\n     * - a change to the map's position, zoom, pitch, or bearing\n     * - a change to the map's style\n     * - a change to a GeoJSON source\n     * - the loading of a vector tile, GeoJSON file, glyph, or sprite.\n     *\n     * @event render\n     * @memberof Map\n     * @instance\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // whenever the map is drawn to the screen.\n     * map.on('render', () => {\n     *     console.log('A render event occurred.');\n     * });\n     */\n    | 'render'\n\n    /**\n     * Fired after the last frame rendered before the map enters an\n     * \"idle\" state:\n     *\n     * - No camera transitions are in progress\n     * - All currently requested tiles have loaded\n     * - All fade/transition animations have completed.\n     *\n     * @event idle\n     * @memberof Map\n     * @instance\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // just before the map enters an \"idle\" state.\n     * map.on('idle', () => {\n     *     console.log('A idle event occurred.');\n     * });\n     */\n    | 'idle'\n\n    /**\n     * Fired immediately after the map has been removed with {@link Map.event:remove}.\n     *\n     * @event remove\n     * @memberof Map\n     * @instance\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // just after the map is removed.\n     * map.on('remove', () => {\n     *     console.log('A remove event occurred.');\n     * });\n     */\n    | 'remove'\n\n    /**\n     * Fired when an error occurs. This is Mapbox GL JS's primary error reporting\n     * mechanism. We use an event instead of `throw` to better accommodate\n     * asyncronous operations. If no listeners are bound to the `error` event, the\n     * error will be printed to the console.\n     *\n     * @event error\n     * @memberof Map\n     * @instance\n     * @property {string} message Error message.\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // when an error occurs.\n     * map.on('error', () => {\n     *     console.log('A error event occurred.');\n     * });\n     */\n    | 'error'\n\n    /**\n     * Fired when the WebGL context is lost.\n     *\n     * @event webglcontextlost\n     * @memberof Map\n     * @instance\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // when the WebGL context is lost.\n     * map.on('webglcontextlost', () => {\n     *     console.log('A webglcontextlost event occurred.');\n     * });\n     */\n    | 'webglcontextlost'\n\n    /**\n     * Fired when the WebGL context is restored.\n     *\n     * @event webglcontextrestored\n     * @memberof Map\n     * @instance\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // when the WebGL context is restored.\n     * map.on('webglcontextrestored', () => {\n     *     console.log('A webglcontextrestored event occurred.');\n     * });\n     */\n    | 'webglcontextrestored'\n\n    /** @section {Data loading}\n     * @event\n     * @instance\n     * @memberof Map */\n\n    /**\n     * Fired when any map data loads or changes. See {@link MapDataEvent}\n     * for more information.\n     *\n     * @event data\n     * @memberof Map\n     * @instance\n     * @type {MapDataEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // when map data loads or changes.\n     * map.on('data', () => {\n     *     console.log('A data event occurred.');\n     * });\n     * @see [Example: Display HTML clusters with custom properties](https://docs.mapbox.com/mapbox-gl-js/example/cluster-html/)\n     */\n    | 'data'\n\n    /**\n     * Fired when the map's style loads or changes. See\n     * {@link MapDataEvent} for more information.\n     *\n     * @event styledata\n     * @memberof Map\n     * @instance\n     * @type {MapDataEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // when the map's style loads or changes.\n     * map.on('styledata', () => {\n     *     console.log('A styledata event occurred.');\n     * });\n     */\n    | 'styledata'\n\n    /**\n     * Fired when one of the map's sources loads or changes, including if a tile belonging\n     * to a source loads or changes. See {@link MapDataEvent} for more information.\n     *\n     * @event sourcedata\n     * @memberof Map\n     * @instance\n     * @type {MapDataEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // when one of the map's sources loads or changes.\n     * map.on('sourcedata', () => {\n     *     console.log('A sourcedata event occurred.');\n     * });\n     */\n    | 'sourcedata'\n\n    /**\n     * Fired when any map data (style, source, tile, etc) begins loading or\n     * changing asynchronously. All `dataloading` events are followed by a `data`\n     * or `error` event. See {@link MapDataEvent} for more information.\n     *\n     * @event dataloading\n     * @memberof Map\n     * @instance\n     * @type {MapDataEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // when any map data begins loading\n     * // or changing asynchronously.\n     * map.on('dataloading', () => {\n     *     console.log('A dataloading event occurred.');\n     * });\n     */\n    | 'dataloading'\n\n    /**\n     * Fired when the map's style begins loading or changing asynchronously.\n     * All `styledataloading` events are followed by a `styledata`\n     * or `error` event. See {@link MapDataEvent} for more information.\n     *\n     * @event styledataloading\n     * @memberof Map\n     * @instance\n     * @type {MapDataEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // when the map's style begins loading or\n     * // changing asynchronously.\n     * map.on('styledataloading', () => {\n     *     console.log('A styledataloading event occurred.');\n     * });\n     */\n    | 'styledataloading'\n\n    /**\n     * Fired when one of the map's sources begins loading or changing asynchronously.\n     * All `sourcedataloading` events are followed by a `sourcedata` or `error` event.\n     * See {@link MapDataEvent} for more information.\n     *\n     * @event sourcedataloading\n     * @memberof Map\n     * @instance\n     * @type {MapDataEvent}\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // when the map's sources begin loading or\n     * // changing asynchronously.\n     * map.on('sourcedataloading', () => {\n     *     console.log('A sourcedataloading event occurred.');\n     * });\n     */\n    | 'sourcedataloading'\n\n    /**\n     * Fired when an icon or pattern needed by the style is missing. The missing image can\n     * be added with {@link Map#addImage} within this event listener callback to prevent the image from\n     * being skipped. This event can be used to dynamically generate icons and patterns.\n     *\n     * @event styleimagemissing\n     * @memberof Map\n     * @instance\n     * @property {string} id The id of the missing image.\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // when an icon or pattern is missing.\n     * map.on('styleimagemissing', () => {\n     *     console.log('A styleimagemissing event occurred.');\n     * });\n     * @see [Example: Generate and add a missing icon to the map](https://mapbox.com/mapbox-gl-js/example/add-image-missing-generated/)\n     */\n    | 'styleimagemissing'\n\n    /**\n     * Fired immediately after all style resources have been downloaded\n     * and the first visually complete rendering of the base style has occurred.\n     *\n     * @event style.load\n     * @memberof Map\n     * @instance\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // when the map has finished loading.\n     * map.on('style.load', () => {\n     *     console.log('A style load event occurred.');\n     * });\n     * @see [Example: Persist layers when switching base style](https://www.mapbox.com/mapbox-gl-js/example/style-switch)\n     */\n    | 'style.load'\n\n    /**\n     * Fired immediately after imported style resources have been downloaded\n     * and the first visually complete rendering of the base style extended with the imported style has occurred.\n     *\n     * @event style.import.load\n     * @memberof Map\n     * @instance\n     * @example\n     * // Initialize the map\n     * const map = new mapboxgl.Map({});\n     * // Set an event listener that fires\n     * // when the style import has finished loading.\n     * map.on('style.import.load', () => {\n     *     console.log('A style import load event occurred.');\n     * });\n     */\n    | 'style.import.load'\n\n    /**\n     * Fired after speed index calculation is completed if `speedIndexTiming` option has been set to `true`.\n     *\n     * @private\n     * @event speedindexcompleted\n     * @memberof Map\n     * @instance\n     * @example\n     * // Initialize the map\n     * var map = new mapboxgl.Map({});\n     * map.speedIndexTiming = true;\n     * // Set an event listener that fires\n     * // after speed index calculation is completed.\n     * map.on('speedindexcompleted', function() {\n     *   console.log(`speed index is ${map.speedIndexNumber}`);\n     * });\n     */\n    | 'speedindexcompleted'\n\n    /**\n     * Fired after RTL text plugin state changes.\n     *\n     * @event pluginStateChange\n     * @instance\n     * @private\n     */\n    | 'pluginStateChange'\n\n    /**\n     * Fired in worker.js after sprite loaded.\n     *\n     * @event pluginStateChange\n     * @instance\n     * @private\n     */\n    | 'isSpriteLoaded'\n\n    /**\n     * Fired in style.js after layer order changed.\n     *\n     * @event pluginStateChange\n     * @instance\n     * @private\n     */\n    | 'neworder'\n;\n","// @flow\n\nimport {extend} from '../../util/util.js';\nimport {MapMouseEvent, MapTouchEvent, MapWheelEvent} from '../events.js';\n\nimport type {Map} from '../map.js';\nimport type Point from '@mapbox/point-geometry';\nimport type {Handler, HandlerResult} from '../handler.js';\n\nexport class MapEventHandler implements Handler {\n    _mousedownPos: ?Point;\n    _clickTolerance: number;\n    _map: Map;\n\n    constructor(map: Map, options: { clickTolerance: number }) {\n        this._map = map;\n        this._clickTolerance = options.clickTolerance;\n    }\n\n    reset() {\n        this._mousedownPos = undefined;\n    }\n\n    // $FlowFixMe[method-unbinding]\n    wheel(e: WheelEvent): ?HandlerResult {\n        // If mapEvent.preventDefault() is called by the user, prevent handlers such as:\n        // - ScrollZoom\n        return this._firePreventable(new MapWheelEvent(e.type, this._map, e));\n    }\n\n    // $FlowFixMe[method-unbinding]\n    mousedown(e: MouseEvent, point: Point): ?HandlerResult {\n        this._mousedownPos = point;\n        // If mapEvent.preventDefault() is called by the user, prevent handlers such as:\n        // - MousePan\n        // - MouseRotate\n        // - MousePitch\n        // - DblclickHandler\n        return this._firePreventable(new MapMouseEvent(e.type, this._map, e));\n    }\n\n    // $FlowFixMe[method-unbinding]\n    mouseup(e: MouseEvent) {\n        this._map.fire(new MapMouseEvent(e.type, this._map, e));\n    }\n\n    preclick(e: MouseEvent) {\n        const synth = extend({}, e);\n        synth.type = 'preclick';\n        this._map.fire(new MapMouseEvent(synth.type, this._map, synth));\n    }\n\n    click(e: MouseEvent, point: Point) {\n        if (this._mousedownPos && this._mousedownPos.dist(point) >= this._clickTolerance) return;\n        this.preclick(e);\n        this._map.fire(new MapMouseEvent(e.type, this._map, e));\n    }\n\n    // $FlowFixMe[method-unbinding]\n    dblclick(e: MouseEvent): ?HandlerResult {\n        // If mapEvent.preventDefault() is called by the user, prevent handlers such as:\n        // - DblClickZoom\n        return this._firePreventable(new MapMouseEvent(e.type, this._map, e));\n    }\n\n    mouseover(e: MouseEvent) {\n        this._map.fire(new MapMouseEvent(e.type, this._map, e));\n    }\n\n    mouseout(e: MouseEvent) {\n        this._map.fire(new MapMouseEvent(e.type, this._map, e));\n    }\n\n    // $FlowFixMe[method-unbinding]\n    touchstart(e: TouchEvent): ?HandlerResult {\n        // If mapEvent.preventDefault() is called by the user, prevent handlers such as:\n        // - TouchPan\n        // - TouchZoom\n        // - TouchRotate\n        // - TouchPitch\n        // - TapZoom\n        // - SwipeZoom\n        return this._firePreventable(new MapTouchEvent(e.type, this._map, e));\n    }\n\n    // $FlowFixMe[method-unbinding]\n    touchmove(e: TouchEvent) {\n        this._map.fire(new MapTouchEvent(e.type, this._map, e));\n    }\n\n    // $FlowFixMe[method-unbinding]\n    touchend(e: TouchEvent) {\n        this._map.fire(new MapTouchEvent(e.type, this._map, e));\n    }\n\n    // $FlowFixMe[method-unbinding]\n    touchcancel(e: TouchEvent) {\n        this._map.fire(new MapTouchEvent(e.type, this._map, e));\n    }\n\n    _firePreventable(mapEvent: MapMouseEvent | MapTouchEvent | MapWheelEvent): ?HandlerResult {\n        this._map.fire(mapEvent);\n        if (mapEvent.defaultPrevented) {\n            // returning an object marks the handler as active and resets other handlers\n            return {};\n        }\n    }\n\n    isEnabled(): boolean {\n        return true;\n    }\n\n    isActive(): boolean {\n        return false;\n    }\n    enable() {}\n    disable() {}\n}\n\nexport class BlockableMapEventHandler {\n    _map: Map;\n    _delayContextMenu: boolean;\n    _contextMenuEvent: ?MouseEvent;\n\n    constructor(map: Map) {\n        this._map = map;\n    }\n\n    reset() {\n        this._delayContextMenu = false;\n        this._contextMenuEvent = undefined;\n    }\n\n    mousemove(e: MouseEvent) {\n        // mousemove map events should not be fired when interaction handlers (pan, rotate, etc) are active\n        this._map.fire(new MapMouseEvent(e.type, this._map, e));\n    }\n\n    mousedown() {\n        this._delayContextMenu = true;\n    }\n\n    mouseup() {\n        this._delayContextMenu = false;\n        if (this._contextMenuEvent) {\n            this._map.fire(new MapMouseEvent('contextmenu', this._map, this._contextMenuEvent));\n            delete this._contextMenuEvent;\n        }\n    }\n    contextmenu(e: MouseEvent) {\n        if (this._delayContextMenu) {\n            // Mac: contextmenu fired on mousedown; we save it until mouseup for consistency's sake\n            this._contextMenuEvent = e;\n        } else {\n            // Windows: contextmenu fired on mouseup, so fire event now\n            this._map.fire(new MapMouseEvent(e.type, this._map, e));\n        }\n\n        // prevent browser context menu when necessary\n        if (this._map.listens('contextmenu')) {\n            e.preventDefault();\n        }\n    }\n\n    isEnabled(): boolean {\n        return true;\n    }\n\n    isActive(): boolean {\n        return false;\n    }\n    enable() {}\n    disable() {}\n}\n","// @flow\n\nimport * as DOM from '../../util/dom.js';\n\nimport {Event} from '../../util/evented.js';\n\nimport type {Map} from '../map.js';\nimport type Point from '@mapbox/point-geometry';\nimport type {Handler, HandlerResult} from '../handler.js';\n\n/**\n * The `BoxZoomHandler` allows the user to zoom the map to fit within a bounding box.\n * The bounding box is defined by clicking and holding `shift` while dragging the cursor.\n *\n * @see [Example: Toggle interactions](https://docs.mapbox.com/mapbox-gl-js/example/toggle-interaction-handlers/)\n * @see [Example: Highlight features within a bounding box](https://docs.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/)\n */\nclass BoxZoomHandler implements Handler {\n    _map: Map;\n    _el: HTMLElement;\n    _container: HTMLElement;\n    _enabled: boolean;\n    _active: boolean;\n    _startPos: ?Point;\n    _lastPos: ?Point;\n    _box: HTMLElement;\n    _clickTolerance: number;\n\n    /**\n     * @private\n     */\n    constructor(map: Map, options: {\n        clickTolerance: number\n    }) {\n        this._map = map;\n        this._el = map.getCanvasContainer();\n        this._container = map.getContainer();\n        this._clickTolerance = options.clickTolerance || 1;\n    }\n\n    /**\n     * Returns a Boolean indicating whether the \"box zoom\" interaction is enabled.\n     *\n     * @returns {boolean} Returns `true` if the \"box zoom\" interaction is enabled.\n     * @example\n     * const isBoxZoomEnabled = map.boxZoom.isEnabled();\n     */\n    isEnabled(): boolean {\n        return !!this._enabled;\n    }\n\n    /**\n     * Returns a Boolean indicating whether the \"box zoom\" interaction is active (currently being used).\n     *\n     * @returns {boolean} Returns `true` if the \"box zoom\" interaction is active.\n     * @example\n     * const isBoxZoomActive = map.boxZoom.isActive();\n     */\n    isActive(): boolean {\n        return !!this._active;\n    }\n\n    /**\n     * Enables the \"box zoom\" interaction.\n     *\n     * @example\n     * map.boxZoom.enable();\n     */\n    enable() {\n        if (this.isEnabled()) return;\n        this._enabled = true;\n    }\n\n    /**\n     * Disables the \"box zoom\" interaction.\n     *\n     * @example\n     * map.boxZoom.disable();\n     */\n    disable() {\n        if (!this.isEnabled()) return;\n        this._enabled = false;\n    }\n\n    // $FlowFixMe[method-unbinding]\n    mousedown(e: MouseEvent, point: Point) {\n        if (!this.isEnabled()) return;\n        if (!(e.shiftKey && e.button === 0)) return;\n\n        DOM.disableDrag();\n        this._startPos = this._lastPos = point;\n        this._active = true;\n    }\n\n    mousemoveWindow(e: MouseEvent, point: Point) {\n        if (!this._active) return;\n\n        const pos = point;\n        const p0 = this._startPos;\n        const p1 = this._lastPos;\n\n        if (!p0 || !p1 || p1.equals(pos) || (!this._box && pos.dist(p0) < this._clickTolerance)) {\n            return;\n        }\n\n        this._lastPos = pos;\n\n        if (!this._box) {\n            this._box = DOM.create('div', 'mapboxgl-boxzoom', this._container);\n            this._container.classList.add('mapboxgl-crosshair');\n            this._fireEvent('boxzoomstart', e);\n        }\n\n        const minX = Math.min(p0.x, pos.x),\n            maxX = Math.max(p0.x, pos.x),\n            minY = Math.min(p0.y, pos.y),\n            maxY = Math.max(p0.y, pos.y);\n\n        this._map._requestDomTask(() => {\n            if (this._box) {\n                this._box.style.transform = `translate(${minX}px,${minY}px)`;\n                this._box.style.width = `${maxX - minX}px`;\n                this._box.style.height = `${maxY - minY}px`;\n            }\n        });\n    }\n\n    mouseupWindow(e: MouseEvent, point: Point): ?HandlerResult {\n        if (!this._active) return;\n\n        const p0 = this._startPos,\n            p1 = point;\n\n        if (!p0 || e.button !== 0) return;\n\n        this.reset();\n\n        DOM.suppressClick();\n\n        if (p0.x === p1.x && p0.y === p1.y) {\n            this._fireEvent('boxzoomcancel', e);\n        } else {\n            this._map.fire(new Event('boxzoomend', {originalEvent: e}));\n            return {\n                cameraAnimation: (map: Map) => map.fitScreenCoordinates(p0, p1, this._map.getBearing(), {linear: false})\n            };\n        }\n    }\n\n    // $FlowFixMe[method-unbinding]\n    keydown(e: KeyboardEvent) {\n        if (!this._active) return;\n\n        if (e.keyCode === 27) {\n            this.reset();\n            this._fireEvent('boxzoomcancel', e);\n        }\n    }\n\n    blur() {\n        this.reset();\n    }\n\n    reset() {\n        this._active = false;\n\n        this._container.classList.remove('mapboxgl-crosshair');\n\n        if (this._box) {\n            this._box.remove();\n            this._box = (null: any);\n        }\n\n        DOM.enableDrag();\n\n        delete this._startPos;\n        delete this._lastPos;\n    }\n\n    _fireEvent(type: string, e: any): Map {\n        return this._map.fire(new Event(type, {originalEvent: e}));\n    }\n}\n\nexport default BoxZoomHandler;\n","// @flow\n\nimport assert from 'assert';\n\nimport type Point from '@mapbox/point-geometry';\n\nexport function indexTouches(touches: Array<Touch>, points: Array<Point>): {[number | string]: Point} {\n    assert(touches.length === points.length);\n    const obj = {};\n    for (let i = 0; i < touches.length; i++) {\n        obj[touches[i].identifier] = points[i];\n    }\n    return obj;\n}\n","// @flow\n\nimport Point from '@mapbox/point-geometry';\nimport {indexTouches} from './handler_util.js';\n\nfunction getCentroid(points: Array<Point>) {\n    const sum = new Point(0, 0);\n    for (const point of points) {\n        sum._add(point);\n    }\n    return sum.div(points.length);\n}\n\nexport const MAX_TAP_INTERVAL = 500;\nconst MAX_TOUCH_TIME = 500;\nconst MAX_DIST = 30;\n\nexport class SingleTapRecognizer {\n\n    numTouches: number;\n    centroid: ?Point;\n    startTime: number;\n    aborted: boolean;\n    touches: { [number | string]: Point };\n\n    constructor(options: { numTouches: number }) {\n        this.reset();\n        this.numTouches = options.numTouches;\n    }\n\n    reset() {\n        this.centroid = undefined;\n        this.startTime = 0;\n        this.touches = {};\n        this.aborted = false;\n    }\n\n    touchstart(e: TouchEvent, points: Array<Point>, mapTouches: Array<Touch>) {\n\n        if (this.centroid || mapTouches.length > this.numTouches) {\n            this.aborted = true;\n        }\n        if (this.aborted) {\n            return;\n        }\n\n        if (this.startTime === 0) {\n            this.startTime = e.timeStamp;\n        }\n\n        if (mapTouches.length === this.numTouches) {\n            this.centroid = getCentroid(points);\n            this.touches = indexTouches(mapTouches, points);\n        }\n    }\n\n    touchmove(e: TouchEvent, points: Array<Point>, mapTouches: Array<Touch>) {\n        if (this.aborted || !this.centroid) return;\n\n        const newTouches = indexTouches(mapTouches, points);\n        for (const id in this.touches) {\n            const prevPos = this.touches[id];\n            const pos = newTouches[id];\n            if (!pos || pos.dist(prevPos) > MAX_DIST) {\n                this.aborted = true;\n            }\n        }\n    }\n\n    touchend(e: TouchEvent, points: Array<Point>, mapTouches: Array<Touch>): ?Point {\n        if (!this.centroid || e.timeStamp - this.startTime > MAX_TOUCH_TIME) {\n            this.aborted = true;\n        }\n\n        if (mapTouches.length === 0) {\n            const centroid = !this.aborted && this.centroid;\n            this.reset();\n            if (centroid) return centroid;\n        }\n    }\n\n}\n\nexport class TapRecognizer {\n\n    singleTap: SingleTapRecognizer;\n    numTaps: number;\n    lastTime: number;\n    lastTap: ?Point;\n    count: number;\n\n    constructor(options: { numTaps: number, numTouches: number }) {\n        this.singleTap = new SingleTapRecognizer(options);\n        this.numTaps = options.numTaps;\n        this.reset();\n    }\n\n    reset() {\n        this.lastTime = Infinity;\n        this.lastTap = undefined;\n        this.count = 0;\n        this.singleTap.reset();\n    }\n\n    touchstart(e: TouchEvent, points: Array<Point>, mapTouches: Array<Touch>) {\n        this.singleTap.touchstart(e, points, mapTouches);\n    }\n\n    touchmove(e: TouchEvent, points: Array<Point>, mapTouches: Array<Touch>) {\n        this.singleTap.touchmove(e, points, mapTouches);\n    }\n\n    touchend(e: TouchEvent, points: Array<Point>, mapTouches: Array<Touch>): ?Point {\n        const tap = this.singleTap.touchend(e, points, mapTouches);\n        if (tap) {\n            const soonEnough = e.timeStamp - this.lastTime < MAX_TAP_INTERVAL;\n            const closeEnough = !this.lastTap || this.lastTap.dist(tap) < MAX_DIST;\n\n            if (!soonEnough || !closeEnough) {\n                this.reset();\n            }\n\n            this.count++;\n            this.lastTime = e.timeStamp;\n            this.lastTap = tap;\n\n            if (this.count === this.numTaps) {\n                this.reset();\n                return tap;\n            }\n        }\n    }\n}\n","// @flow\n\nimport {TapRecognizer} from './tap_recognizer.js';\nimport type Point from '@mapbox/point-geometry';\nimport type {Map} from '../map.js';\nimport type {Handler, HandlerResult} from '../handler.js';\n\nexport default class TapZoomHandler implements Handler {\n    _enabled: boolean;\n    _active: boolean;\n    _zoomIn: TapRecognizer;\n    _zoomOut: TapRecognizer;\n\n    constructor() {\n        this._zoomIn = new TapRecognizer({\n            numTouches: 1,\n            numTaps: 2\n        });\n\n        this._zoomOut = new TapRecognizer({\n            numTouches: 2,\n            numTaps: 1\n        });\n\n        this.reset();\n    }\n\n    reset() {\n        this._active = false;\n        this._zoomIn.reset();\n        this._zoomOut.reset();\n    }\n\n    // $FlowFixMe[method-unbinding]\n    touchstart(e: TouchEvent, points: Array<Point>, mapTouches: Array<Touch>) {\n        this._zoomIn.touchstart(e, points, mapTouches);\n        this._zoomOut.touchstart(e, points, mapTouches);\n    }\n\n    // $FlowFixMe[method-unbinding]\n    touchmove(e: TouchEvent, points: Array<Point>, mapTouches: Array<Touch>) {\n        this._zoomIn.touchmove(e, points, mapTouches);\n        this._zoomOut.touchmove(e, points, mapTouches);\n    }\n\n    // $FlowFixMe[method-unbinding]\n    touchend(e: TouchEvent, points: Array<Point>, mapTouches: Array<Touch>): ?HandlerResult {\n        const zoomInPoint = this._zoomIn.touchend(e, points, mapTouches);\n        const zoomOutPoint = this._zoomOut.touchend(e, points, mapTouches);\n\n        if (zoomInPoint) {\n            this._active = true;\n            e.preventDefault();\n            setTimeout(() => this.reset(), 0);\n            return {\n                cameraAnimation: (map: Map) => map.easeTo({\n                    duration: 300,\n                    zoom: map.getZoom() + 1,\n                    around: map.unproject(zoomInPoint)\n                }, {originalEvent: e})\n            };\n        } else if (zoomOutPoint) {\n            this._active = true;\n            e.preventDefault();\n            setTimeout(() => this.reset(), 0);\n            return {\n                cameraAnimation: (map: Map) => map.easeTo({\n                    duration: 300,\n                    zoom: map.getZoom() - 1,\n                    around: map.unproject(zoomOutPoint)\n                }, {originalEvent: e})\n            };\n        }\n    }\n\n    // $FlowFixMe[method-unbinding]\n    touchcancel() {\n        this.reset();\n    }\n\n    enable() {\n        this._enabled = true;\n    }\n\n    disable() {\n        this._enabled = false;\n        this.reset();\n    }\n\n    isEnabled(): boolean {\n        return this._enabled;\n    }\n\n    isActive(): boolean {\n        return this._active;\n    }\n}\n","// @flow\n\nimport * as DOM from '../../util/dom.js';\nimport type Point from '@mapbox/point-geometry';\nimport type {Handler, HandlerResult} from '../handler.js';\n\nconst LEFT_BUTTON = 0;\nconst RIGHT_BUTTON = 2;\n\n// the values for each button in MouseEvent.buttons\nconst BUTTONS_FLAGS = {\n    [LEFT_BUTTON]: 1,\n    [RIGHT_BUTTON]: 2\n};\n\nfunction buttonStillPressed(e: MouseEvent, button: number) {\n    const flag = BUTTONS_FLAGS[button];\n    return e.buttons === undefined || (e.buttons & flag) !== flag;\n}\n\nclass MouseHandler implements Handler {\n    _enabled: boolean;\n    _active: boolean;\n    _lastPoint: ?Point;\n    _eventButton: ?number;\n    _moved: boolean;\n    _clickTolerance: number;\n\n    constructor(options: { clickTolerance: number }) {\n        this.reset();\n        this._clickTolerance = options.clickTolerance || 1;\n    }\n\n    blur() {\n        this.reset();\n    }\n\n    reset() {\n        this._active = false;\n        this._moved = false;\n        this._lastPoint = undefined;\n        this._eventButton = undefined;\n    }\n\n    _correctButton(e: MouseEvent, button: number): boolean {  //eslint-disable-line\n        return false; // implemented by child\n    }\n\n    _move(lastPoint: Point, point: Point): ?HandlerResult {  //eslint-disable-line\n        return {}; // implemented by child\n    }\n\n    // $FlowFixMe[method-unbinding]\n    mousedown(e: MouseEvent, point: Point) {\n        if (this._lastPoint) return;\n\n        const eventButton = DOM.mouseButton(e);\n        if (!this._correctButton(e, eventButton)) return;\n\n        this._lastPoint = point;\n        this._eventButton = eventButton;\n    }\n\n    mousemoveWindow(e: MouseEvent, point: Point): ?HandlerResult {\n        const lastPoint = this._lastPoint;\n        if (!lastPoint) return;\n        e.preventDefault();\n\n        if (this._eventButton != null && buttonStillPressed(e, this._eventButton)) {\n            // Some browsers don't fire a `mouseup` when the mouseup occurs outside\n            // the window or iframe:\n            // https://github.com/mapbox/mapbox-gl-js/issues/4622\n            //\n            // If the button is no longer pressed during this `mousemove` it may have\n            // been released outside of the window or iframe.\n            this.reset();\n            return;\n        }\n\n        if (!this._moved && point.dist(lastPoint) < this._clickTolerance) return;\n        this._moved = true;\n        this._lastPoint = point;\n\n        // implemented by child class\n        return this._move(lastPoint, point);\n    }\n\n    mouseupWindow(e: MouseEvent) {\n        if (!this._lastPoint) return;\n        const eventButton = DOM.mouseButton(e);\n        if (eventButton !== this._eventButton) return;\n        if (this._moved) DOM.suppressClick();\n        this.reset();\n    }\n\n    enable() {\n        this._enabled = true;\n    }\n\n    disable() {\n        this._enabled = false;\n        this.reset();\n    }\n\n    isEnabled(): boolean {\n        return this._enabled;\n    }\n\n    isActive(): boolean {\n        return this._active;\n    }\n}\n\nexport class MousePanHandler extends MouseHandler {\n\n    mousedown(e: MouseEvent, point: Point) {\n        super.mousedown(e, point);\n        if (this._lastPoint) this._active = true;\n    }\n    _correctButton(e: MouseEvent, button: number): boolean {\n        return button === LEFT_BUTTON && !e.ctrlKey;\n    }\n\n    _move(lastPoint: Point, point: Point): ?HandlerResult {\n        return {\n            around: point,\n            panDelta: point.sub(lastPoint)\n        };\n    }\n}\n\nexport class MouseRotateHandler extends MouseHandler {\n    _correctButton(e: MouseEvent, button: number): boolean {\n        return (button === LEFT_BUTTON && e.ctrlKey) || (button === RIGHT_BUTTON);\n    }\n\n    _move(lastPoint: Point, point: Point): ?HandlerResult {\n        const degreesPerPixelMoved = 0.8;\n        const bearingDelta = (point.x - lastPoint.x) * degreesPerPixelMoved;\n        if (bearingDelta) {\n            this._active = true;\n            return {bearingDelta};\n        }\n    }\n\n    contextmenu(e: MouseEvent) {\n        // prevent browser context menu when necessary; we don't allow it with rotation\n        // because we can't discern rotation gesture start from contextmenu on Mac\n        e.preventDefault();\n    }\n}\n\nexport class MousePitchHandler extends MouseHandler {\n    _correctButton(e: MouseEvent, button: number): boolean {\n        return (button === LEFT_BUTTON && e.ctrlKey) || (button === RIGHT_BUTTON);\n    }\n\n    _move(lastPoint: Point, point: Point): ?HandlerResult {\n        const degreesPerPixelMoved = -0.5;\n        const pitchDelta = (point.y - lastPoint.y) * degreesPerPixelMoved;\n        if (pitchDelta) {\n            this._active = true;\n            return {pitchDelta};\n        }\n    }\n\n    contextmenu(e: MouseEvent) {\n        // prevent browser context menu when necessary; we don't allow it with rotation\n        // because we can't discern rotation gesture start from contextmenu on Mac\n        e.preventDefault();\n    }\n}\n","// @flow\n\nimport Point from '@mapbox/point-geometry';\nimport type {Map} from '../map.js';\nimport {indexTouches} from './handler_util.js';\nimport {bindAll, isFullscreen} from '../../util/util.js';\nimport * as DOM from '../../util/dom.js';\nimport type {Handler, HandlerResult} from '../handler.js';\n\nexport default class TouchPanHandler implements Handler {\n    _map: Map;\n    _el: HTMLElement;\n    _enabled: boolean;\n    _active: boolean;\n    _touches: { [string | number]: Point };\n    _minTouches: number;\n    _clickTolerance: number;\n    _sum: Point;\n    _alertContainer: HTMLElement;\n    _alertTimer: TimeoutID;\n\n    constructor(map: Map, options: { clickTolerance: number }) {\n        this._map = map;\n        this._el = map.getCanvasContainer();\n        this._minTouches = 1;\n        this._clickTolerance = options.clickTolerance || 1;\n        this.reset();\n        bindAll(['_addTouchPanBlocker', '_showTouchPanBlockerAlert'], this);\n    }\n\n    reset() {\n        this._active = false;\n        this._touches = {};\n        this._sum = new Point(0, 0);\n    }\n\n    // $FlowFixMe[method-unbinding]\n    touchstart(e: TouchEvent, points: Array<Point>, mapTouches: Array<Touch>): ?HandlerResult {\n        return this._calculateTransform(e, points, mapTouches);\n    }\n\n    // $FlowFixMe[method-unbinding]\n    touchmove(e: TouchEvent, points: Array<Point>, mapTouches: Array<Touch>): ?HandlerResult {\n        if (!this._active || mapTouches.length < this._minTouches) return;\n\n        // if cooperative gesture handling is set to true, require two fingers to touch pan\n        if (this._map._cooperativeGestures && !this._map.isMoving()) {\n            if (mapTouches.length === 1 && !isFullscreen()) {\n                this._showTouchPanBlockerAlert();\n                return;\n            } else if (this._alertContainer.style.visibility !== 'hidden') {\n                // immediately hide alert if it is visible when two fingers are used to pan.\n                this._alertContainer.style.visibility = 'hidden';\n                clearTimeout(this._alertTimer);\n            }\n        }\n\n        if (e.cancelable) {\n            e.preventDefault();\n        }\n\n        return this._calculateTransform(e, points, mapTouches);\n    }\n\n    // $FlowFixMe[method-unbinding]\n    touchend(e: TouchEvent, points: Array<Point>, mapTouches: Array<Touch>) {\n        this._calculateTransform(e, points, mapTouches);\n\n        if (this._active && mapTouches.length < this._minTouches) {\n            this.reset();\n        }\n    }\n\n    // $FlowFixMe[method-unbinding]\n    touchcancel() {\n        this.reset();\n    }\n\n    _calculateTransform(e: TouchEvent, points: Array<Point>, mapTouches: Array<Touch>): ?HandlerResult {\n        if (mapTouches.length > 0) this._active = true;\n\n        const touches = indexTouches(mapTouches, points);\n\n        const touchPointSum = new Point(0, 0);\n        const touchDeltaSum = new Point(0, 0);\n        let touchDeltaCount = 0;\n\n        for (const identifier in touches) {\n            const point = touches[identifier];\n            const prevPoint = this._touches[identifier];\n            if (prevPoint) {\n                touchPointSum._add(point);\n                touchDeltaSum._add(point.sub(prevPoint));\n                touchDeltaCount++;\n                touches[identifier] = point;\n            }\n        }\n\n        this._touches = touches;\n\n        if (touchDeltaCount < this._minTouches || !touchDeltaSum.mag()) return;\n\n        const panDelta = touchDeltaSum.div(touchDeltaCount);\n        this._sum._add(panDelta);\n        if (this._sum.mag() < this._clickTolerance) return;\n\n        const around = touchPointSum.div(touchDeltaCount);\n\n        return {\n            around,\n            panDelta\n        };\n    }\n\n    enable() {\n        this._enabled = true;\n        if (this._map._cooperativeGestures) {\n            this._addTouchPanBlocker();\n            // override touch-action css property to enable scrolling page over map\n            this._el.classList.add('mapboxgl-touch-pan-blocker-override', 'mapboxgl-scrollable-page');\n        }\n    }\n\n    disable() {\n        this._enabled = false;\n        if (this._map._cooperativeGestures) {\n            clearTimeout(this._alertTimer);\n            this._alertContainer.remove();\n            this._el.classList.remove('mapboxgl-touch-pan-blocker-override', 'mapboxgl-scrollable-page');\n        }\n        this.reset();\n    }\n\n    isEnabled(): boolean {\n        return !!this._enabled;\n    }\n\n    isActive(): boolean {\n        return !!this._active;\n    }\n\n    _addTouchPanBlocker() {\n        if (this._map && !this._alertContainer) {\n            this._alertContainer = DOM.create('div', 'mapboxgl-touch-pan-blocker', this._map._container);\n\n            this._alertContainer.textContent = this._map._getUIString('TouchPanBlocker.Message');\n\n            // dynamically set the font size of the touch pan blocker alert message\n            this._alertContainer.style.fontSize = `${Math.max(10, Math.min(24, Math.floor(this._el.clientWidth * 0.05)))}px`;\n        }\n    }\n\n    _showTouchPanBlockerAlert() {\n        this._alertContainer.style.visibility = 'visible';\n        this._alertContainer.classList.add('mapboxgl-touch-pan-blocker-show');\n        this._alertContainer.setAttribute(\"role\", \"alert\");\n\n        clearTimeout(this._alertTimer);\n\n        this._alertTimer = setTimeout(() => {\n            this._alertContainer.classList.remove('mapboxgl-touch-pan-blocker-show');\n            this._alertContainer.removeAttribute(\"role\");\n        }, 500);\n    }\n\n}\n","// @flow\n\nimport Point from '@mapbox/point-geometry';\nimport * as DOM from '../../util/dom.js';\nimport type {Map} from '../map.js';\nimport type {Handler, HandlerResult} from '../handler.js';\nimport {isFullscreen} from '../../util/util.js';\n\nclass TwoTouchHandler implements Handler {\n    _enabled: boolean;\n    _active: boolean;\n    _firstTwoTouches: ?[number, number];\n    _vector: ?Point;\n    _startVector: ?Point;\n    _aroundCenter: boolean;\n\n    constructor() {\n        this.reset();\n    }\n\n    reset() {\n        this._active = false;\n        this._firstTwoTouches = undefined;\n    }\n\n    _start(points: [Point, Point]) {} //eslint-disable-line\n    _move(points: [Point, Point], pinchAround: ?Point, e: TouchEvent): ?HandlerResult { return {}; } //eslint-disable-line\n\n    // $FlowFixMe[method-unbinding]\n    touchstart(e: TouchEvent, points: Array<Point>, mapTouches: Array<Touch>) {\n        //console.log(e.target, e.targetTouches.length ? e.targetTouches[0].target : null);\n        //log('touchstart', points, e.target.innerHTML, e.targetTouches.length ? e.targetTouches[0].target.innerHTML: undefined);\n        if (this._firstTwoTouches || mapTouches.length < 2) return;\n\n        this._firstTwoTouches = [\n            mapTouches[0].identifier,\n            mapTouches[1].identifier\n        ];\n\n        // implemented by child classes\n        this._start([points[0], points[1]]);\n    }\n\n    // $FlowFixMe[method-unbinding]\n    touchmove(e: TouchEvent, points: Array<Point>, mapTouches: Array<Touch>): ?HandlerResult {\n        const firstTouches = this._firstTwoTouches;\n        if (!firstTouches) return;\n\n        e.preventDefault();\n\n        const [idA, idB] = firstTouches;\n        const a = getTouchById(mapTouches, points, idA);\n        const b = getTouchById(mapTouches, points, idB);\n        if (!a || !b) return;\n        const pinchAround = this._aroundCenter ? null : a.add(b).div(2);\n\n        // implemented by child classes\n        return this._move([a, b], pinchAround, e);\n\n    }\n\n    // $FlowFixMe[method-unbinding]\n    touchend(e: TouchEvent, points: Array<Point>, mapTouches: Array<Touch>) {\n        if (!this._firstTwoTouches) return;\n\n        const [idA, idB] = this._firstTwoTouches;\n        const a = getTouchById(mapTouches, points, idA);\n        const b = getTouchById(mapTouches, points, idB);\n        if (a && b) return;\n\n        if (this._active) DOM.suppressClick();\n\n        this.reset();\n    }\n\n    // $FlowFixMe[method-unbinding]\n    touchcancel() {\n        this.reset();\n    }\n\n    enable(options: ?{around?: 'center'}) {\n        this._enabled = true;\n        this._aroundCenter = !!options && options.around === 'center';\n    }\n\n    disable() {\n        this._enabled = false;\n        this.reset();\n    }\n\n    isEnabled(): boolean {\n        return this._enabled;\n    }\n\n    isActive(): boolean {\n        return this._active;\n    }\n}\n\nfunction getTouchById(mapTouches: Array<Touch>, points: Array<Point>, identifier: number) {\n    for (let i = 0; i < mapTouches.length; i++) {\n        if (mapTouches[i].identifier === identifier) return points[i];\n    }\n}\n\n/* ZOOM */\n\nconst ZOOM_THRESHOLD = 0.1;\n\nfunction getZoomDelta(distance: number, lastDistance: number) {\n    return Math.log(distance / lastDistance) / Math.LN2;\n}\n\nexport class TouchZoomHandler extends TwoTouchHandler {\n\n    _distance: number;\n    _startDistance: number;\n\n    reset() {\n        super.reset();\n        this._distance = 0;\n        this._startDistance = 0;\n    }\n\n    _start(points: [Point, Point]) {\n        this._startDistance = this._distance = points[0].dist(points[1]);\n    }\n\n    _move(points: [Point, Point], pinchAround: ?Point): ?HandlerResult {\n        const lastDistance = this._distance;\n        this._distance = points[0].dist(points[1]);\n        if (!this._active && Math.abs(getZoomDelta(this._distance, this._startDistance)) < ZOOM_THRESHOLD) return;\n        this._active = true;\n        return {\n            zoomDelta: getZoomDelta(this._distance, lastDistance),\n            pinchAround\n        };\n    }\n}\n\n/* ROTATE */\n\nconst ROTATION_THRESHOLD = 25; // pixels along circumference of touch circle\n\nfunction getBearingDelta(a: Point, b: Point) {\n    return a.angleWith(b) * 180 / Math.PI;\n}\n\nexport class TouchRotateHandler extends TwoTouchHandler {\n    _minDiameter: number;\n\n    reset() {\n        super.reset();\n        this._minDiameter = 0;\n        this._startVector = undefined;\n        this._vector = undefined;\n    }\n\n    _start(points: [Point, Point]) {\n        this._startVector = this._vector = points[0].sub(points[1]);\n        this._minDiameter = points[0].dist(points[1]);\n    }\n\n    _move(points: [Point, Point], pinchAround: ?Point): ?HandlerResult {\n        const lastVector = this._vector;\n        this._vector = points[0].sub(points[1]);\n\n        if (!lastVector || (!this._active && this._isBelowThreshold(this._vector))) return;\n        this._active = true;\n\n        return {\n            // $FlowFixMe[incompatible-call] - Flow doesn't infer that this._vectoris not null\n            bearingDelta: getBearingDelta(this._vector, lastVector),\n            pinchAround\n        };\n    }\n\n    _isBelowThreshold(vector: Point): boolean {\n        /*\n         * The threshold before a rotation actually happens is configured in\n         * pixels alongth circumference of the circle formed by the two fingers.\n         * This makes the threshold in degrees larger when the fingers are close\n         * together and smaller when the fingers are far apart.\n         *\n         * Use the smallest diameter from the whole gesture to reduce sensitivity\n         * when pinching in and out.\n         */\n\n        this._minDiameter = Math.min(this._minDiameter, vector.mag());\n        const circumference = Math.PI * this._minDiameter;\n        const threshold = ROTATION_THRESHOLD / circumference * 360;\n\n        const startVector = this._startVector;\n        if (!startVector) return false;\n\n        const bearingDeltaSinceStart = getBearingDelta(vector, startVector);\n        return Math.abs(bearingDeltaSinceStart) < threshold;\n    }\n}\n\n/* PITCH */\n\nfunction isVertical(vector: Point) {\n    return Math.abs(vector.y) > Math.abs(vector.x);\n}\n\nconst ALLOWED_SINGLE_TOUCH_TIME = 100;\n\n/**\n * The `TouchPitchHandler` allows the user to pitch the map by dragging up and down with two fingers.\n *\n * @see [Example: Set pitch and bearing](https://docs.mapbox.com/mapbox-gl-js/example/set-perspective/)\n*/\nexport class TouchPitchHandler extends TwoTouchHandler {\n\n    _valid: boolean | void;\n    _firstMove: ?number;\n    _lastPoints: ?[Point, Point];\n    _map: Map;\n\n    constructor(map: Map) {\n        super();\n        this._map = map;\n    }\n\n    reset() {\n        super.reset();\n        this._valid = undefined;\n        this._firstMove = undefined;\n        this._lastPoints = undefined;\n    }\n\n    _start(points: [Point, Point]) {\n        this._lastPoints = points;\n        if (isVertical(points[0].sub(points[1]))) {\n            // fingers are more horizontal than vertical\n            this._valid = false;\n        }\n\n    }\n\n    _move(points: [Point, Point], center: ?Point, e: TouchEvent): ?HandlerResult {\n        const lastPoints = this._lastPoints;\n        if (!lastPoints) return;\n        const vectorA = points[0].sub(lastPoints[0]);\n        const vectorB = points[1].sub(lastPoints[1]);\n\n        if (this._map._cooperativeGestures && !isFullscreen() && e.touches.length < 3) return;\n\n        this._valid = this.gestureBeginsVertically(vectorA, vectorB, e.timeStamp);\n\n        if (!this._valid) return;\n\n        this._lastPoints = points;\n        this._active = true;\n        const yDeltaAverage = (vectorA.y + vectorB.y) / 2;\n        const degreesPerPixelMoved = -0.5;\n        return {\n            pitchDelta: yDeltaAverage * degreesPerPixelMoved\n        };\n    }\n\n    gestureBeginsVertically(vectorA: Point, vectorB: Point, timeStamp: number): void | boolean {\n        if (this._valid !== undefined) return this._valid;\n\n        const threshold = 2;\n        const movedA = vectorA.mag() >= threshold;\n        const movedB = vectorB.mag() >= threshold;\n\n        // neither finger has moved a meaningful amount, wait\n        if (!movedA && !movedB) return;\n\n        // One finger has moved and the other has not.\n        // If enough time has passed, decide it is not a pitch.\n        if (!movedA || !movedB) {\n            if (this._firstMove == null) {\n                this._firstMove = timeStamp;\n            }\n\n            if (timeStamp - this._firstMove < ALLOWED_SINGLE_TOUCH_TIME) {\n                // still waiting for a movement from the second finger\n                return undefined;\n            } else {\n                return false;\n            }\n        }\n\n        const isSameDirection = vectorA.y > 0 === vectorB.y > 0;\n        return isVertical(vectorA) && isVertical(vectorB) && isSameDirection;\n    }\n}\n","// @flow\n\nimport type {Map} from '../map.js';\nimport type {Handler, HandlerResult} from '../handler.js';\n\nconst defaultOptions = {\n    panStep: 100,\n    bearingStep: 15,\n    pitchStep: 10\n};\n\n/**\n * The `KeyboardHandler` allows the user to zoom, rotate, and pan the map using\n * the following keyboard shortcuts:\n *\n * - `=` / `+`: Increase the zoom level by 1.\n * - `Shift-=` / `Shift-+`: Increase the zoom level by 2.\n * - `-`: Decrease the zoom level by 1.\n * - `Shift--`: Decrease the zoom level by 2.\n * - Arrow keys: Pan by 100 pixels.\n * - `Shift+⇢`: Increase the rotation by 15 degrees.\n * - `Shift+⇠`: Decrease the rotation by 15 degrees.\n * - `Shift+⇡`: Increase the pitch by 10 degrees.\n * - `Shift+⇣`: Decrease the pitch by 10 degrees.\n *\n * @see [Example: Toggle interactions](https://docs.mapbox.com/mapbox-gl-js/example/toggle-interaction-handlers/)\n * @see [Example: Navigate the map with game-like controls](https://docs.mapbox.com/mapbox-gl-js/example/game-controls/)\n * @see [Example: Display map navigation controls](https://docs.mapbox.com/mapbox-gl-js/example/navigation/)\n */\nclass KeyboardHandler implements Handler {\n    _enabled: boolean;\n    _active: boolean;\n    _panStep: number;\n    _bearingStep: number;\n    _pitchStep: number;\n    _rotationDisabled: boolean;\n\n    /**\n    * @private\n    */\n    constructor() {\n        const stepOptions = defaultOptions;\n        this._panStep = stepOptions.panStep;\n        this._bearingStep = stepOptions.bearingStep;\n        this._pitchStep = stepOptions.pitchStep;\n        this._rotationDisabled = false;\n    }\n\n    blur() {\n        this.reset();\n    }\n\n    reset() {\n        this._active = false;\n    }\n\n    // $FlowFixMe[method-unbinding]\n    keydown(e: KeyboardEvent): ?HandlerResult {\n        if (e.altKey || e.ctrlKey || e.metaKey) return;\n\n        let zoomDir = 0;\n        let bearingDir = 0;\n        let pitchDir = 0;\n        let xDir = 0;\n        let yDir = 0;\n\n        switch (e.keyCode) {\n        case 61:\n        case 107:\n        case 171:\n        case 187:\n            zoomDir = 1;\n            break;\n\n        case 189:\n        case 109:\n        case 173:\n            zoomDir = -1;\n            break;\n\n        case 37:\n            if (e.shiftKey) {\n                bearingDir = -1;\n            } else {\n                e.preventDefault();\n                xDir = -1;\n            }\n            break;\n\n        case 39:\n            if (e.shiftKey) {\n                bearingDir = 1;\n            } else {\n                e.preventDefault();\n                xDir = 1;\n            }\n            break;\n\n        case 38:\n            if (e.shiftKey) {\n                pitchDir = 1;\n            } else {\n                e.preventDefault();\n                yDir = -1;\n            }\n            break;\n\n        case 40:\n            if (e.shiftKey) {\n                pitchDir = -1;\n            } else {\n                e.preventDefault();\n                yDir = 1;\n            }\n            break;\n\n        default:\n            return;\n        }\n\n        if (this._rotationDisabled) {\n            bearingDir = 0;\n            pitchDir = 0;\n        }\n\n        return {\n            cameraAnimation: (map: Map) => {\n                const zoom = map.getZoom();\n\n                map.easeTo({\n                    duration: 300,\n                    easeId: 'keyboardHandler',\n                    easing: easeOut,\n                    zoom: zoomDir ? Math.round(zoom) + zoomDir * (e.shiftKey ? 2 : 1) : zoom,\n                    bearing: map.getBearing() + bearingDir * this._bearingStep,\n                    pitch: map.getPitch() + pitchDir * this._pitchStep,\n                    offset: [-xDir * this._panStep, -yDir * this._panStep],\n                    center: map.getCenter()\n                }, {originalEvent: e});\n            }\n        };\n    }\n\n    /**\n     * Enables the \"keyboard rotate and zoom\" interaction.\n     *\n     * @example\n     * map.keyboard.enable();\n     */\n    enable() {\n        this._enabled = true;\n    }\n\n    /**\n     * Disables the \"keyboard rotate and zoom\" interaction.\n     *\n     * @example\n     * map.keyboard.disable();\n     */\n    disable() {\n        this._enabled = false;\n        this.reset();\n    }\n\n    /**\n     * Returns a Boolean indicating whether the \"keyboard rotate and zoom\"\n     * interaction is enabled.\n     *\n     * @returns {boolean} `true` if the \"keyboard rotate and zoom\"\n     * interaction is enabled.\n     * @example\n     * const isKeyboardEnabled = map.keyboard.isEnabled();\n     */\n    isEnabled(): boolean {\n        return this._enabled;\n    }\n\n    /**\n     * Returns true if the handler is enabled and has detected the start of a\n     * zoom/rotate gesture.\n     *\n     * @returns {boolean} `true` if the handler is enabled and has detected the\n     * start of a zoom/rotate gesture.\n     * @example\n     * const isKeyboardActive = map.keyboard.isActive();\n     */\n    isActive(): boolean {\n        return this._active;\n    }\n\n    /**\n     * Disables the \"keyboard pan/rotate\" interaction, leaving the\n     * \"keyboard zoom\" interaction enabled.\n     *\n     * @example\n     * map.keyboard.disableRotation();\n     */\n    disableRotation() {\n        this._rotationDisabled = true;\n    }\n\n    /**\n     * Enables the \"keyboard pan/rotate\" interaction.\n     *\n     * @example\n     * map.keyboard.enable();\n     * map.keyboard.enableRotation();\n     */\n    enableRotation() {\n        this._rotationDisabled = false;\n    }\n}\n\nfunction easeOut(t: number) {\n    return t * (2 - t);\n}\n\nexport default KeyboardHandler;\n","// @flow\n\nimport assert from 'assert';\nimport * as DOM from '../../util/dom.js';\n\nimport {ease as _ease, bindAll, bezier, isFullscreen} from '../../util/util.js';\nimport browser from '../../util/browser.js';\nimport {number as interpolate} from '../../style-spec/util/interpolate.js';\nimport Point from '@mapbox/point-geometry';\n\nimport type {Map} from '../map.js';\nimport type HandlerManager from '../handler_manager.js';\nimport type {Handler, HandlerResult} from '../handler.js';\nimport MercatorCoordinate from '../../geo/mercator_coordinate.js';\n\n// deltaY value for mouse scroll wheel identification\nconst wheelZoomDelta = 4.000244140625;\n\n// These magic numbers control the rate of zoom. Trackpad events fire at a greater\n// frequency than mouse scroll wheel, so reduce the zoom rate per wheel tick\nconst defaultZoomRate = 1 / 100;\nconst wheelZoomRate = 1 / 450;\n\n// upper bound on how much we scale the map in any single render frame; this\n// is used to limit zoom rate in the case of very fast scrolling\nconst maxScalePerFrame = 2;\n\n/**\n * The `ScrollZoomHandler` allows the user to zoom the map by scrolling.\n *\n * @see [Example: Toggle interactions](https://docs.mapbox.com/mapbox-gl-js/example/toggle-interaction-handlers/)\n * @see [Example: Disable scroll zoom](https://docs.mapbox.com/mapbox-gl-js/example/disable-scroll-zoom/)\n */\nclass ScrollZoomHandler implements Handler {\n    _map: Map;\n    _el: HTMLElement;\n    _enabled: boolean;\n    _active: boolean;\n    _zooming: boolean;\n    _aroundCenter: boolean;\n    _aroundPoint: Point;\n    _aroundCoord: MercatorCoordinate;\n    _type: 'wheel' | 'trackpad' | null;\n    _lastValue: number;\n    _timeout: ?TimeoutID; // used for delayed-handling of a single wheel movement\n    _finishTimeout: ?TimeoutID; // used to delay final '{move,zoom}end' events\n\n    _lastWheelEvent: any;\n    _lastWheelEventTime: number;\n\n    _startZoom: ?number;\n    _targetZoom: ?number;\n    _delta: number;\n    _lastDelta: number;\n    _easing: ?((number) => number);\n    _prevEase: ?{start: number, duration: number, easing: (_: number) => number};\n\n    _frameId: ?boolean;\n    _handler: HandlerManager;\n\n    _defaultZoomRate: number;\n    _wheelZoomRate: number;\n\n    _alertContainer: HTMLElement; // used to display the scroll zoom blocker alert\n    _alertTimer: TimeoutID;\n\n    /**\n     * @private\n     */\n    constructor(map: Map, handler: HandlerManager) {\n        this._map = map;\n        this._el = map.getCanvasContainer();\n        this._handler = handler;\n\n        this._delta = 0;\n        this._lastDelta = 0;\n\n        this._defaultZoomRate = defaultZoomRate;\n        this._wheelZoomRate = wheelZoomRate;\n\n        bindAll(['_onTimeout', '_addScrollZoomBlocker', '_showBlockerAlert'], this);\n\n    }\n\n    /**\n     * Sets the zoom rate of a trackpad.\n     *\n     * @param {number} [zoomRate=1/100] The rate used to scale trackpad movement to a zoom value.\n     * @example\n     * // Speed up trackpad zoom\n     * map.scrollZoom.setZoomRate(1 / 25);\n     */\n    setZoomRate(zoomRate: number) {\n        this._defaultZoomRate = zoomRate;\n    }\n\n    /**\n    * Sets the zoom rate of a mouse wheel.\n     *\n    * @param {number} [wheelZoomRate=1/450] The rate used to scale mouse wheel movement to a zoom value.\n    * @example\n    * // Slow down zoom of mouse wheel\n    * map.scrollZoom.setWheelZoomRate(1 / 600);\n    */\n    setWheelZoomRate(wheelZoomRate: number) {\n        this._wheelZoomRate = wheelZoomRate;\n    }\n\n    /**\n     * Returns a Boolean indicating whether the \"scroll to zoom\" interaction is enabled.\n     *\n     * @returns {boolean} `true` if the \"scroll to zoom\" interaction is enabled.\n     * @example\n     * const isScrollZoomEnabled = map.scrollZoom.isEnabled();\n     */\n    isEnabled(): boolean {\n        return !!this._enabled;\n    }\n\n    /*\n    * Active state is turned on and off with every scroll wheel event and is set back to false before the map\n    * render is called, so _active is not a good candidate for determining if a scroll zoom animation is in\n    * progress.\n    */\n    isActive(): boolean {\n        return this._active || this._finishTimeout !== undefined;\n    }\n\n    isZooming(): boolean {\n        return !!this._zooming;\n    }\n\n    /**\n     * Enables the \"scroll to zoom\" interaction.\n     *\n     * @param {Object} [options] Options object.\n     * @param {string} [options.around] If \"center\" is passed, map will zoom around center of map.\n     *\n     * @example\n     * map.scrollZoom.enable();\n     * @example\n     * map.scrollZoom.enable({around: 'center'});\n     */\n    enable(options: ?{around?: 'center'}) {\n        if (this.isEnabled()) return;\n        this._enabled = true;\n        this._aroundCenter = !!options && options.around === 'center';\n        if (this._map._cooperativeGestures) this._addScrollZoomBlocker();\n    }\n\n    /**\n     * Disables the \"scroll to zoom\" interaction.\n     *\n     * @example\n     * map.scrollZoom.disable();\n     */\n    disable() {\n        if (!this.isEnabled()) return;\n        this._enabled = false;\n        if (this._map._cooperativeGestures) {\n            clearTimeout(this._alertTimer);\n            this._alertContainer.remove();\n        }\n    }\n\n    // $FlowFixMe[method-unbinding]\n    wheel(e: WheelEvent) {\n        if (!this.isEnabled()) return;\n\n        if (this._map._cooperativeGestures) {\n            if (!e.ctrlKey && !e.metaKey && !this.isZooming() && !isFullscreen()) {\n                this._showBlockerAlert();\n                return;\n            } else if (this._alertContainer.style.visibility !== 'hidden') {\n                // immediately hide alert if it is visible when ctrl or ⌘ is pressed while scroll zooming.\n                this._alertContainer.style.visibility = 'hidden';\n                clearTimeout(this._alertTimer);\n            }\n        }\n\n        // Remove `any` cast when https://github.com/facebook/flow/issues/4879 is fixed.\n        let value = e.deltaMode === (WheelEvent: any).DOM_DELTA_LINE ? e.deltaY * 40 : e.deltaY;\n        const now = browser.now(),\n            timeDelta = now - (this._lastWheelEventTime || 0);\n\n        this._lastWheelEventTime = now;\n\n        if (value !== 0 && (value % wheelZoomDelta) === 0) {\n            // This one is definitely a mouse wheel event.\n            this._type = 'wheel';\n\n        } else if (value !== 0 && Math.abs(value) < 4) {\n            // This one is definitely a trackpad event because it is so small.\n            this._type = 'trackpad';\n\n        } else if (timeDelta > 400) {\n            // This is likely a new scroll action.\n            this._type = null;\n            this._lastValue = value;\n\n            // Start a timeout in case this was a singular event, and delay it by up to 40ms.\n            // $FlowFixMe[method-unbinding]\n            this._timeout = setTimeout(this._onTimeout, 40, e);\n\n        } else if (!this._type) {\n            // This is a repeating event, but we don't know the type of event just yet.\n            // If the delta per time is small, we assume it's a fast trackpad; otherwise we switch into wheel mode.\n            this._type = (Math.abs(timeDelta * value) < 200) ? 'trackpad' : 'wheel';\n\n            // Make sure our delayed event isn't fired again, because we accumulate\n            // the previous event (which was less than 40ms ago) into this event.\n            if (this._timeout) {\n                clearTimeout(this._timeout);\n                this._timeout = null;\n                value += this._lastValue;\n            }\n        }\n\n        // Slow down zoom if shift key is held for more precise zooming\n        if (e.shiftKey && value) value = value / 4;\n\n        // Only fire the callback if we actually know what type of scrolling device the user uses.\n        if (this._type) {\n            this._lastWheelEvent = e;\n            this._delta -= value;\n            if (!this._active) {\n                this._start(e);\n            }\n        }\n\n        e.preventDefault();\n    }\n\n    _onTimeout(initialEvent: WheelEvent) {\n        this._type = 'wheel';\n        this._delta -= this._lastValue;\n        if (!this._active) {\n            this._start(initialEvent);\n        }\n    }\n\n    _start(e: WheelEvent) {\n        if (!this._delta) return;\n\n        if (this._frameId) {\n            this._frameId = null;\n        }\n\n        this._active = true;\n        if (!this.isZooming()) {\n            this._zooming = true;\n        }\n\n        if (this._finishTimeout) {\n            clearTimeout(this._finishTimeout);\n            delete this._finishTimeout;\n        }\n\n        const pos = DOM.mousePos(this._el, e);\n        this._aroundPoint = this._aroundCenter ? this._map.transform.centerPoint : pos;\n        this._aroundCoord = this._map.transform.pointCoordinate3D(this._aroundPoint);\n        this._targetZoom = undefined;\n\n        if (!this._frameId) {\n            this._frameId = true;\n            this._handler._triggerRenderFrame();\n        }\n    }\n\n    // $FlowFixMe[method-unbinding]\n    renderFrame(): ?HandlerResult {\n        if (!this._frameId) return;\n        this._frameId = null;\n\n        if (!this.isActive()) return;\n\n        const tr = this._map.transform;\n\n        // If projection wraps and center crosses the antimeridian, reset previous mouse scroll easing settings to resolve https://github.com/mapbox/mapbox-gl-js/issues/11910\n        if (this._type === 'wheel' && tr.projection.wrap && (tr._center.lng >= 180 || tr._center.lng <= -180)) {\n            this._prevEase = null;\n            this._easing = null;\n            this._lastWheelEvent = null;\n            this._lastWheelEventTime = 0;\n        }\n\n        const startingZoom = () => {\n            return (tr._terrainEnabled() && this._aroundCoord) ? tr.computeZoomRelativeTo(this._aroundCoord) : tr.zoom;\n        };\n\n        // if we've had scroll events since the last render frame, consume the\n        // accumulated delta, and update the target zoom level accordingly\n        if (this._delta !== 0) {\n            // For trackpad events and single mouse wheel ticks, use the default zoom rate\n            const zoomRate = (this._type === 'wheel' && Math.abs(this._delta) > wheelZoomDelta) ? this._wheelZoomRate : this._defaultZoomRate;\n            // Scale by sigmoid of scroll wheel delta.\n            let scale = maxScalePerFrame / (1 + Math.exp(-Math.abs(this._delta * zoomRate)));\n\n            if (this._delta < 0 && scale !== 0) {\n                scale = 1 / scale;\n            }\n\n            const startZoom = startingZoom();\n            const startScale = Math.pow(2.0, startZoom);\n\n            const fromScale = typeof this._targetZoom === 'number' ? tr.zoomScale(this._targetZoom) : startScale;\n            this._targetZoom = Math.min(tr.maxZoom, Math.max(tr.minZoom, tr.scaleZoom(fromScale * scale)));\n\n            // if this is a mouse wheel, refresh the starting zoom and easing\n            // function we're using to smooth out the zooming between wheel\n            // events\n            if (this._type === 'wheel') {\n                this._startZoom = startZoom;\n                this._easing = this._smoothOutEasing(200);\n            }\n            this._lastDelta = this._delta;\n            this._delta = 0;\n        }\n        const targetZoom = typeof this._targetZoom === 'number' ?\n            this._targetZoom : startingZoom();\n        const startZoom = this._startZoom;\n        const easing = this._easing;\n\n        let finished = false;\n        let zoom;\n        if (this._type === 'wheel' && startZoom && easing) {\n            assert(easing && typeof startZoom === 'number');\n\n            const t = Math.min((browser.now() - this._lastWheelEventTime) / 200, 1);\n            const k = easing(t);\n            zoom = interpolate(startZoom, targetZoom, k);\n            if (t < 1) {\n                if (!this._frameId) {\n                    this._frameId = true;\n                }\n            } else {\n                finished = true;\n            }\n        } else {\n            zoom = targetZoom;\n            finished = true;\n        }\n\n        this._active = true;\n\n        if (finished) {\n            this._active = false;\n            this._finishTimeout = setTimeout(() => {\n                this._zooming = false;\n                this._handler._triggerRenderFrame();\n                delete this._targetZoom;\n                delete this._finishTimeout;\n            }, 200);\n        }\n\n        let zoomDelta = zoom - startingZoom();\n        if (zoomDelta * this._lastDelta < 0) {\n            // prevent recenter zoom in opposite direction from zoom\n            zoomDelta = 0;\n        }\n        return {\n            noInertia: true,\n            needsRenderFrame: !finished,\n            zoomDelta,\n            around: this._aroundPoint,\n            aroundCoord: this._aroundCoord,\n            originalEvent: this._lastWheelEvent\n        };\n    }\n\n    _smoothOutEasing(duration: number): (number) => number {\n        let easing = _ease;\n\n        if (this._prevEase) {\n            const ease = this._prevEase,\n                t = (browser.now() - ease.start) / ease.duration,\n                speed = ease.easing(t + 0.01) - ease.easing(t),\n\n                // Quick hack to make new bezier that is continuous with last\n                x = 0.27 / Math.sqrt(speed * speed + 0.0001) * 0.01,\n                y = Math.sqrt(0.27 * 0.27 - x * x);\n\n            easing = bezier(x, y, 0.25, 1);\n        }\n\n        this._prevEase = {\n            start: browser.now(),\n            duration,\n            easing\n        };\n\n        return easing;\n    }\n\n    blur() {\n        this.reset();\n    }\n\n    reset() {\n        this._active = false;\n    }\n\n    _addScrollZoomBlocker() {\n        if (this._map && !this._alertContainer) {\n            this._alertContainer = DOM.create('div', 'mapboxgl-scroll-zoom-blocker', this._map._container);\n\n            if (/(Mac|iPad)/i.test(navigator.userAgent)) {\n                this._alertContainer.textContent = this._map._getUIString('ScrollZoomBlocker.CmdMessage');\n            } else {\n                this._alertContainer.textContent = this._map._getUIString('ScrollZoomBlocker.CtrlMessage');\n            }\n\n            // dynamically set the font size of the scroll zoom blocker alert message\n            this._alertContainer.style.fontSize = `${Math.max(10, Math.min(24, Math.floor(this._el.clientWidth * 0.05)))}px`;\n        }\n    }\n\n    _showBlockerAlert() {\n        this._alertContainer.style.visibility = 'visible';\n        this._alertContainer.classList.add('mapboxgl-scroll-zoom-blocker-show');\n        this._alertContainer.setAttribute(\"role\", \"alert\");\n\n        clearTimeout(this._alertTimer);\n\n        this._alertTimer = setTimeout(() => {\n            this._alertContainer.classList.remove('mapboxgl-scroll-zoom-blocker-show');\n            this._alertContainer.removeAttribute(\"role\");\n        }, 200);\n    }\n\n}\n\nexport default ScrollZoomHandler;\n","// @flow\n\nimport type ClickZoomHandler from '../click_zoom.js';\nimport type TapZoomHandler from './../tap_zoom.js';\n\n/**\n * The `DoubleClickZoomHandler` allows the user to zoom the map at a point by\n * double clicking or double tapping.\n *\n * @see [Example: Toggle interactions](https://docs.mapbox.com/mapbox-gl-js/example/toggle-interaction-handlers/)\n */\nexport default class DoubleClickZoomHandler {\n\n    _clickZoom: ClickZoomHandler;\n    _tapZoom: TapZoomHandler;\n\n    /**\n     * @private\n    */\n    constructor(clickZoom: ClickZoomHandler, TapZoom: TapZoomHandler) {\n        this._clickZoom = clickZoom;\n        this._tapZoom = TapZoom;\n    }\n\n    /**\n     * Enables the \"double click to zoom\" interaction.\n     *\n     * @example\n     * map.doubleClickZoom.enable();\n     */\n    enable() {\n        this._clickZoom.enable();\n        this._tapZoom.enable();\n    }\n\n    /**\n     * Disables the \"double click to zoom\" interaction.\n     *\n     * @example\n     * map.doubleClickZoom.disable();\n     */\n    disable() {\n        this._clickZoom.disable();\n        this._tapZoom.disable();\n    }\n\n    /**\n     * Returns a Boolean indicating whether the \"double click to zoom\" interaction is enabled.\n     *\n     * @returns {boolean} Returns `true` if the \"double click to zoom\" interaction is enabled.\n     * @example\n     * const isDoubleClickZoomEnabled = map.doubleClickZoom.isEnabled();\n     */\n    isEnabled(): boolean {\n        return this._clickZoom.isEnabled() && this._tapZoom.isEnabled();\n    }\n\n    /**\n     * Returns a Boolean indicating whether the \"double click to zoom\" interaction is active (currently being used).\n     *\n     * @returns {boolean} Returns `true` if the \"double click to zoom\" interaction is active.\n     * @example\n     * const isDoubleClickZoomActive = map.doubleClickZoom.isActive();\n     */\n    isActive(): boolean {\n        return this._clickZoom.isActive() || this._tapZoom.isActive();\n    }\n}\n","// @flow\n\nimport type Point from '@mapbox/point-geometry';\nimport type {Map} from '../map.js';\nimport type {Handler, HandlerResult} from '../handler.js';\n\nexport default class ClickZoomHandler implements Handler {\n    _enabled: boolean;\n    _active: boolean;\n\n    constructor() {\n        this.reset();\n    }\n\n    reset() {\n        this._active = false;\n    }\n\n    blur() {\n        this.reset();\n    }\n\n    // $FlowFixMe[method-unbinding]\n    dblclick(e: MouseEvent, point: Point): HandlerResult {\n        e.preventDefault();\n        return {\n            cameraAnimation: (map: Map) => {\n                map.easeTo({\n                    duration: 300,\n                    zoom: map.getZoom() + (e.shiftKey ? -1 : 1),\n                    around: map.unproject(point)\n                }, {originalEvent: e});\n            }\n        };\n    }\n\n    enable() {\n        this._enabled = true;\n    }\n\n    disable() {\n        this._enabled = false;\n        this.reset();\n    }\n\n    isEnabled(): boolean {\n        return this._enabled;\n    }\n\n    isActive(): boolean {\n        return this._active;\n    }\n}\n","// @flow\n\nimport {TapRecognizer, MAX_TAP_INTERVAL} from './tap_recognizer.js';\nimport type Point from '@mapbox/point-geometry';\nimport type {Handler, HandlerResult} from '../handler.js';\n\nexport default class TapDragZoomHandler implements Handler {\n    _enabled: boolean;\n    _active: boolean;\n    _swipePoint: ?Point;\n    _swipeTouch: number;\n    _tapTime: number;\n    _tap: TapRecognizer;\n\n    constructor() {\n\n        this._tap = new TapRecognizer({\n            numTouches: 1,\n            numTaps: 1\n        });\n\n        this.reset();\n    }\n\n    reset() {\n        this._active = false;\n        this._swipePoint = undefined;\n        this._swipeTouch = 0;\n        this._tapTime = 0;\n        this._tap.reset();\n    }\n\n    // $FlowFixMe[method-unbinding]\n    touchstart(e: TouchEvent, points: Array<Point>, mapTouches: Array<Touch>) {\n        if (this._swipePoint) return;\n\n        if (this._tapTime && e.timeStamp - this._tapTime > MAX_TAP_INTERVAL) {\n            this.reset();\n        }\n\n        if (!this._tapTime) {\n            this._tap.touchstart(e, points, mapTouches);\n        } else if (mapTouches.length > 0) {\n            this._swipePoint = points[0];\n            this._swipeTouch = mapTouches[0].identifier;\n        }\n\n    }\n\n    // $FlowFixMe[method-unbinding]\n    touchmove(e: TouchEvent, points: Array<Point>, mapTouches: Array<Touch>): ?HandlerResult {\n        if (!this._tapTime) {\n            this._tap.touchmove(e, points, mapTouches);\n        } else if (this._swipePoint) {\n            if (mapTouches[0].identifier !== this._swipeTouch) {\n                return;\n            }\n\n            const newSwipePoint = points[0];\n            const dist = newSwipePoint.y - this._swipePoint.y;\n            this._swipePoint = newSwipePoint;\n\n            e.preventDefault();\n            this._active = true;\n\n            return {\n                zoomDelta: dist / 128\n            };\n        }\n    }\n\n    // $FlowFixMe[method-unbinding]\n    touchend(e: TouchEvent, points: Array<Point>, mapTouches: Array<Touch>) {\n        if (!this._tapTime) {\n            const point = this._tap.touchend(e, points, mapTouches);\n            if (point) {\n                this._tapTime = e.timeStamp;\n            }\n        } else if (this._swipePoint) {\n            if (mapTouches.length === 0) {\n                this.reset();\n            }\n        }\n    }\n\n    // $FlowFixMe[method-unbinding]\n    touchcancel() {\n        this.reset();\n    }\n\n    enable() {\n        this._enabled = true;\n    }\n\n    disable() {\n        this._enabled = false;\n        this.reset();\n    }\n\n    isEnabled(): boolean {\n        return this._enabled;\n    }\n\n    isActive(): boolean {\n        return this._active;\n    }\n}\n","// @flow\n\nimport type {MousePanHandler} from '../mouse.js';\nimport type TouchPanHandler from './../touch_pan.js';\n\nexport type DragPanOptions = {\n    linearity?: number;\n    easing?: (t: number) => number;\n    deceleration?: number;\n    maxSpeed?: number;\n};\n\n/**\n * The `DragPanHandler` allows the user to pan the map by clicking and dragging\n * the cursor.\n *\n * @see [Example: Toggle interactions](https://docs.mapbox.com/mapbox-gl-js/example/toggle-interaction-handlers/)\n * @see [Example: Highlight features within a bounding box](https://docs.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/)\n */\nexport default class DragPanHandler {\n\n    _el: HTMLElement;\n    _mousePan: MousePanHandler;\n    _touchPan: TouchPanHandler;\n    _inertiaOptions: DragPanOptions\n\n    /**\n     * @private\n    */\n    constructor(el: HTMLElement, mousePan: MousePanHandler, touchPan: TouchPanHandler) {\n        this._el = el;\n        this._mousePan = mousePan;\n        this._touchPan = touchPan;\n    }\n\n    /**\n     * Enables the \"drag to pan\" interaction and accepts options to control the behavior of the panning inertia.\n     *\n     * @param {Object} [options] Options object.\n     * @param {number} [options.linearity=0] Factor used to scale the drag velocity.\n     * @param {Function} [options.easing] Optional easing function applied to {@link Map#panTo} when applying the drag. Defaults to bezier function using [@mapbox/unitbezier](https://github.com/mapbox/unitbezier).\n     * @param {number} [options.maxSpeed=1400] The maximum value of the drag velocity.\n     * @param {number} [options.deceleration=2500] The rate at which the speed reduces after the pan ends.\n     *\n     * @example\n     * map.dragPan.enable();\n     * @example\n     * map.dragPan.enable({\n     *     linearity: 0.3,\n     *     easing: t => t,\n     *     maxSpeed: 1400,\n     *     deceleration: 2500\n     * });\n     * @see [Example: Highlight features within a bounding box](https://docs.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/)\n     */\n    enable(options?: DragPanOptions) {\n        this._inertiaOptions = options || {};\n        this._mousePan.enable();\n        this._touchPan.enable();\n        this._el.classList.add('mapboxgl-touch-drag-pan');\n    }\n\n    /**\n     * Disables the \"drag to pan\" interaction.\n     *\n     * @example\n     * map.dragPan.disable();\n     */\n    disable() {\n        this._mousePan.disable();\n        this._touchPan.disable();\n        this._el.classList.remove('mapboxgl-touch-drag-pan');\n    }\n\n    /**\n     * Returns a Boolean indicating whether the \"drag to pan\" interaction is enabled.\n     *\n     * @returns {boolean} Returns `true` if the \"drag to pan\" interaction is enabled.\n     * @example\n     * const isDragPanEnabled = map.dragPan.isEnabled();\n     */\n    isEnabled(): boolean {\n        return this._mousePan.isEnabled() && this._touchPan.isEnabled();\n    }\n\n    /**\n     * Returns a Boolean indicating whether the \"drag to pan\" interaction is active (currently being used).\n     *\n     * @returns {boolean} Returns `true` if the \"drag to pan\" interaction is active.\n     * @example\n     * const isDragPanActive = map.dragPan.isActive();\n     */\n    isActive(): boolean {\n        return this._mousePan.isActive() || this._touchPan.isActive();\n    }\n}\n","// @flow\n\nimport type {MouseRotateHandler, MousePitchHandler} from '../mouse.js';\n\n/**\n * The `DragRotateHandler` allows the user to rotate the map by clicking and\n * dragging the cursor while holding the right mouse button or `ctrl` key.\n *\n * @see [Example: Toggle interactions](https://docs.mapbox.com/mapbox-gl-js/example/toggle-interaction-handlers/)\n * @see [Example: Disable map rotation](https://docs.mapbox.com/mapbox-gl-js/example/disable-rotation/)\n */\nexport default class DragRotateHandler {\n\n    _mouseRotate: MouseRotateHandler;\n    _mousePitch: MousePitchHandler;\n    _pitchWithRotate: boolean;\n\n    /**\n     * @param {Object} [options]\n     * @param {number} [options.bearingSnap] The threshold, measured in degrees, that determines when the map's\n     *   bearing will snap to north.\n     * @param {bool} [options.pitchWithRotate=true] Control the map pitch in addition to the bearing\n     * @private\n     */\n    constructor(options: {pitchWithRotate: boolean}, mouseRotate: MouseRotateHandler, mousePitch: MousePitchHandler) {\n        this._pitchWithRotate = options.pitchWithRotate;\n        this._mouseRotate = mouseRotate;\n        this._mousePitch = mousePitch;\n    }\n\n    /**\n     * Enables the \"drag to rotate\" interaction.\n     *\n     * @example\n     * map.dragRotate.enable();\n     */\n    enable() {\n        this._mouseRotate.enable();\n        if (this._pitchWithRotate) this._mousePitch.enable();\n    }\n\n    /**\n     * Disables the \"drag to rotate\" interaction.\n     *\n     * @example\n     * map.dragRotate.disable();\n     */\n    disable() {\n        this._mouseRotate.disable();\n        this._mousePitch.disable();\n    }\n\n    /**\n     * Returns a Boolean indicating whether the \"drag to rotate\" interaction is enabled.\n     *\n     * @returns {boolean} `true` if the \"drag to rotate\" interaction is enabled.\n     * @example\n     * const isDragRotateEnabled = map.dragRotate.isEnabled();\n     */\n    isEnabled(): boolean {\n        return this._mouseRotate.isEnabled() && (!this._pitchWithRotate || this._mousePitch.isEnabled());\n    }\n\n    /**\n     * Returns a Boolean indicating whether the \"drag to rotate\" interaction is active (currently being used).\n     *\n     * @returns {boolean} Returns `true` if the \"drag to rotate\" interaction is active.\n     * @example\n     * const isDragRotateActive = map.dragRotate.isActive();\n     */\n    isActive(): boolean {\n        return this._mouseRotate.isActive() || this._mousePitch.isActive();\n    }\n}\n","// @flow\n\nimport type {TouchZoomHandler, TouchRotateHandler} from '../touch_zoom_rotate.js';\nimport type TapDragZoomHandler from '../tap_drag_zoom.js';\n\n/**\n * The `TouchZoomRotateHandler` allows the user to zoom and rotate the map by\n * pinching on a touchscreen.\n *\n * They can zoom with one finger by double tapping and dragging. On the second tap,\n * hold the finger down and drag up or down to zoom in or out.\n *\n * @see [Example: Toggle interactions](https://docs.mapbox.com/mapbox-gl-js/example/toggle-interaction-handlers/)\n */\nexport default class TouchZoomRotateHandler {\n\n    _el: HTMLElement;\n    _touchZoom: TouchZoomHandler;\n    _touchRotate: TouchRotateHandler;\n    _tapDragZoom: TapDragZoomHandler;\n    _rotationDisabled: boolean;\n    _enabled: boolean;\n\n    /**\n     * @private\n    */\n    constructor(el: HTMLElement, touchZoom: TouchZoomHandler, touchRotate: TouchRotateHandler, tapDragZoom: TapDragZoomHandler) {\n        this._el = el;\n        this._touchZoom = touchZoom;\n        this._touchRotate = touchRotate;\n        this._tapDragZoom = tapDragZoom;\n        this._rotationDisabled = false;\n        this._enabled = true;\n    }\n\n    /**\n     * Enables the \"pinch to rotate and zoom\" interaction.\n     *\n     * @param {Object} [options] Options object.\n     * @param {string} [options.around] If \"center\" is passed, map will zoom around the center.\n     *\n     * @example\n     * map.touchZoomRotate.enable();\n     * @example\n     * map.touchZoomRotate.enable({around: 'center'});\n     */\n    enable(options: ?{around?: 'center'}) {\n        this._touchZoom.enable(options);\n        if (!this._rotationDisabled) this._touchRotate.enable(options);\n        this._tapDragZoom.enable();\n        this._el.classList.add('mapboxgl-touch-zoom-rotate');\n    }\n\n    /**\n     * Disables the \"pinch to rotate and zoom\" interaction.\n     *\n     * @example\n     * map.touchZoomRotate.disable();\n     */\n    disable() {\n        this._touchZoom.disable();\n        this._touchRotate.disable();\n        this._tapDragZoom.disable();\n        this._el.classList.remove('mapboxgl-touch-zoom-rotate');\n    }\n\n    /**\n     * Returns a Boolean indicating whether the \"pinch to rotate and zoom\" interaction is enabled.\n     *\n     * @returns {boolean} `true` if the \"pinch to rotate and zoom\" interaction is enabled.\n     * @example\n     * const isTouchZoomRotateEnabled = map.touchZoomRotate.isEnabled();\n     */\n    isEnabled(): boolean {\n        return this._touchZoom.isEnabled() &&\n            (this._rotationDisabled || this._touchRotate.isEnabled()) &&\n            this._tapDragZoom.isEnabled();\n    }\n\n    /**\n     * Returns true if the handler is enabled and has detected the start of a zoom/rotate gesture.\n     *\n     * @returns {boolean} `true` if enabled and a zoom/rotate gesture was detected.\n     * @example\n     * const isTouchZoomRotateActive = map.touchZoomRotate.isActive();\n     */\n    isActive(): boolean {\n        return this._touchZoom.isActive() || this._touchRotate.isActive() || this._tapDragZoom.isActive();\n    }\n\n    /**\n     * Disables the \"pinch to rotate\" interaction, leaving the \"pinch to zoom\"\n     * interaction enabled.\n     *\n     * @example\n     * map.touchZoomRotate.disableRotation();\n     */\n    disableRotation() {\n        this._rotationDisabled = true;\n        this._touchRotate.disable();\n    }\n\n    /**\n     * Enables the \"pinch to rotate\" interaction.\n     *\n     * @example\n     * map.touchZoomRotate.enable();\n     * map.touchZoomRotate.enableRotation();\n     */\n    enableRotation() {\n        this._rotationDisabled = false;\n        if (this._touchZoom.isEnabled()) this._touchRotate.enable();\n    }\n}\n","// @flow\n\nimport {Event} from '../util/evented.js';\nimport * as DOM from '../util/dom.js';\nimport HandlerInertia from './handler_inertia.js';\nimport {MapEventHandler, BlockableMapEventHandler} from './handler/map_event.js';\nimport BoxZoomHandler from './handler/box_zoom.js';\nimport TapZoomHandler from './handler/tap_zoom.js';\nimport {MousePanHandler, MouseRotateHandler, MousePitchHandler} from './handler/mouse.js';\nimport TouchPanHandler from './handler/touch_pan.js';\nimport {TouchZoomHandler, TouchRotateHandler, TouchPitchHandler} from './handler/touch_zoom_rotate.js';\nimport KeyboardHandler from './handler/keyboard.js';\nimport ScrollZoomHandler from './handler/scroll_zoom.js';\nimport DoubleClickZoomHandler from './handler/shim/dblclick_zoom.js';\nimport ClickZoomHandler from './handler/click_zoom.js';\nimport TapDragZoomHandler from './handler/tap_drag_zoom.js';\nimport DragPanHandler from './handler/shim/drag_pan.js';\nimport DragRotateHandler from './handler/shim/drag_rotate.js';\nimport TouchZoomRotateHandler from './handler/shim/touch_zoom_rotate.js';\nimport {bindAll, extend} from '../util/util.js';\nimport Point from '@mapbox/point-geometry';\nimport assert from 'assert';\nimport {vec3} from 'gl-matrix';\nimport MercatorCoordinate, {latFromMercatorY, mercatorScale} from '../geo/mercator_coordinate.js';\n\nimport type {Map} from './map.js';\nimport type {Vec3} from 'gl-matrix';\nimport type {Handler, HandlerResult} from './handler.js';\n\nexport type InputEvent = MouseEvent | TouchEvent | KeyboardEvent | WheelEvent;\n\nconst isMoving = (p: { [string]: any }) => p.zoom || p.drag || p.pitch || p.rotate;\n\nclass RenderFrameEvent extends Event {\n    type: 'renderFrame';\n    timeStamp: number;\n}\n\nclass TrackingEllipsoid {\n    constants: Array<number>;\n    radius: number;\n\n    constructor() {\n        // a, b, c in the equation x²/a² + y²/b² + z²/c² = 1\n        this.constants = [1, 1, 0.01];\n        this.radius = 0;\n    }\n\n    setup(center: Vec3, pointOnSurface: Vec3) {\n        const centerToSurface = vec3.sub([], pointOnSurface, center);\n        if (centerToSurface[2] < 0) {\n            this.radius = vec3.length(vec3.div([], centerToSurface, this.constants));\n        } else {\n            // The point on surface is above the center. This can happen for example when the camera is\n            // below the clicked point (like a mountain) Use slightly shorter radius for less aggressive movement\n            this.radius = vec3.length([centerToSurface[0], centerToSurface[1], 0]);\n        }\n    }\n\n    // Cast a ray from the center of the ellipsoid and the intersection point.\n    projectRay(dir: Vec3): Vec3 {\n        // Perform the intersection test against a unit sphere\n        vec3.div(dir, dir, this.constants);\n        vec3.normalize(dir, dir);\n        vec3.mul(dir, dir, this.constants);\n\n        const intersection = vec3.scale([], dir, this.radius);\n\n        if (intersection[2] > 0) {\n            // The intersection point is above horizon so special handling is required.\n            // Otherwise direction of the movement would be inverted due to the ellipsoid shape\n            const h = vec3.scale([], [0, 0, 1], vec3.dot(intersection, [0, 0, 1]));\n            const r = vec3.scale([], vec3.normalize([], [intersection[0], intersection[1], 0]), this.radius);\n            const p = vec3.add([], intersection, vec3.scale([], vec3.sub([], vec3.add([], r, h), intersection), 2));\n\n            intersection[0] = p[0];\n            intersection[1] = p[1];\n        }\n\n        return intersection;\n    }\n}\n\nfunction hasChange(result: HandlerResult) {\n    return (result.panDelta && result.panDelta.mag()) || result.zoomDelta || result.bearingDelta || result.pitchDelta;\n}\n\nclass HandlerManager {\n    _map: Map;\n    _el: HTMLElement;\n    _handlers: Array<{ handlerName: string, handler: Handler, allowed: any }>;\n    _eventsInProgress: Object;\n    _frameId: ?number;\n    _inertia: HandlerInertia;\n    _bearingSnap: number;\n    _handlersById: { [string]: Handler };\n    _updatingCamera: boolean;\n    _changes: Array<[HandlerResult, Object, any]>;\n    _previousActiveHandlers: { [string]: Handler };\n    _listeners: Array<[HTMLElement | Document, string, void | EventListenerOptionsOrUseCapture]>;\n    _trackingEllipsoid: TrackingEllipsoid;\n    _dragOrigin: ?Vec3;\n    _originalZoom: ?number;\n\n    constructor(map: Map, options: { interactive: boolean, pitchWithRotate: boolean, clickTolerance: number, bearingSnap: number}) {\n        this._map = map;\n        this._el = this._map.getCanvasContainer();\n        this._handlers = [];\n        this._handlersById = {};\n        this._changes = [];\n\n        this._inertia = new HandlerInertia(map);\n        this._bearingSnap = options.bearingSnap;\n        this._previousActiveHandlers = {};\n        this._trackingEllipsoid = new TrackingEllipsoid();\n        this._dragOrigin = null;\n\n        // Track whether map is currently moving, to compute start/move/end events\n        this._eventsInProgress = {};\n\n        this._addDefaultHandlers(options);\n\n        bindAll(['handleEvent', 'handleWindowEvent'], this);\n\n        const el = this._el;\n\n        this._listeners = [\n            // This needs to be `passive: true` so that a double tap fires two\n            // pairs of touchstart/end events in iOS Safari 13. If this is set to\n            // `passive: false` then the second pair of events is only fired if\n            // preventDefault() is called on the first touchstart. Calling preventDefault()\n            // undesirably prevents click events.\n            [el, 'touchstart', {passive: true}],\n            // This needs to be `passive: false` so that scrolls and pinches can be\n            // prevented in browsers that don't support `touch-actions: none`, for example iOS Safari 12.\n            [el, 'touchmove', {passive: false}],\n            [el, 'touchend', undefined],\n            [el, 'touchcancel', undefined],\n\n            [el, 'mousedown', undefined],\n            [el, 'mousemove', undefined],\n            [el, 'mouseup', undefined],\n\n            // Bind window-level event listeners for move and up/end events. In the absence of\n            // the pointer capture API, which is not supported by all necessary platforms,\n            // window-level event listeners give us the best shot at capturing events that\n            // fall outside the map canvas element. Use `{capture: true}` for the move event\n            // to prevent map move events from being fired during a drag.\n            [document, 'mousemove', {capture: true}],\n            [document, 'mouseup', undefined],\n\n            [el, 'mouseover', undefined],\n            [el, 'mouseout', undefined],\n            [el, 'dblclick', undefined],\n            [el, 'click', undefined],\n\n            [el, 'keydown', {capture: false}],\n            [el, 'keyup', undefined],\n\n            [el, 'wheel', {passive: false}],\n            [el, 'contextmenu', undefined],\n\n            [window, 'blur', undefined]\n        ];\n\n        for (const [target, type, listenerOptions] of this._listeners) {\n            // $FlowFixMe[method-unbinding]\n            const listener = target === document ? this.handleWindowEvent : this.handleEvent;\n            target.addEventListener((type: any), (listener: any), listenerOptions);\n        }\n    }\n\n    destroy() {\n        for (const [target, type, listenerOptions] of this._listeners) {\n            // $FlowFixMe[method-unbinding]\n            const listener = target === document ? this.handleWindowEvent : this.handleEvent;\n            target.removeEventListener((type: any), (listener: any), listenerOptions);\n        }\n    }\n\n    _addDefaultHandlers(options: { interactive: boolean, pitchWithRotate: boolean, clickTolerance: number }) {\n        const map = this._map;\n        const el = map.getCanvasContainer();\n        // $FlowFixMe[method-unbinding]\n        this._add('mapEvent', new MapEventHandler(map, options));\n\n        const boxZoom = map.boxZoom = new BoxZoomHandler(map, options);\n        // $FlowFixMe[method-unbinding]\n        this._add('boxZoom', boxZoom);\n\n        const tapZoom = new TapZoomHandler();\n        const clickZoom = new ClickZoomHandler();\n        map.doubleClickZoom = new DoubleClickZoomHandler(clickZoom, tapZoom);\n        // $FlowFixMe[method-unbinding]\n        this._add('tapZoom', tapZoom);\n        // $FlowFixMe[method-unbinding]\n        this._add('clickZoom', clickZoom);\n\n        const tapDragZoom = new TapDragZoomHandler();\n        // $FlowFixMe[method-unbinding]\n        this._add('tapDragZoom', tapDragZoom);\n\n        const touchPitch = map.touchPitch = new TouchPitchHandler(map);\n        // $FlowFixMe[method-unbinding]\n        this._add('touchPitch', touchPitch);\n\n        const mouseRotate = new MouseRotateHandler(options);\n        const mousePitch = new MousePitchHandler(options);\n        map.dragRotate = new DragRotateHandler(options, mouseRotate, mousePitch);\n        // $FlowFixMe[method-unbinding]\n        this._add('mouseRotate', mouseRotate, ['mousePitch']);\n        // $FlowFixMe[method-unbinding]\n        this._add('mousePitch', mousePitch, ['mouseRotate']);\n\n        const mousePan = new MousePanHandler(options);\n        const touchPan = new TouchPanHandler(map, options);\n        map.dragPan = new DragPanHandler(el, mousePan, touchPan);\n        // $FlowFixMe[method-unbinding]\n        this._add('mousePan', mousePan);\n        // $FlowFixMe[method-unbinding]\n        this._add('touchPan', touchPan, ['touchZoom', 'touchRotate']);\n\n        const touchRotate = new TouchRotateHandler();\n        const touchZoom = new TouchZoomHandler();\n        map.touchZoomRotate = new TouchZoomRotateHandler(el, touchZoom, touchRotate, tapDragZoom);\n        // $FlowFixMe[method-unbinding]\n        this._add('touchRotate', touchRotate, ['touchPan', 'touchZoom']);\n        // $FlowFixMe[method-unbinding]\n        this._add('touchZoom', touchZoom, ['touchPan', 'touchRotate']);\n\n        // $FlowFixMe[method-unbinding]\n        this._add('blockableMapEvent', new BlockableMapEventHandler(map));\n\n        const scrollZoom = map.scrollZoom = new ScrollZoomHandler(map, this);\n        // $FlowFixMe[method-unbinding]\n        this._add('scrollZoom', scrollZoom, ['mousePan']);\n\n        const keyboard = map.keyboard = new KeyboardHandler();\n        // $FlowFixMe[method-unbinding]\n        this._add('keyboard', keyboard);\n\n        for (const name of ['boxZoom', 'doubleClickZoom', 'tapDragZoom', 'touchPitch', 'dragRotate', 'dragPan', 'touchZoomRotate', 'scrollZoom', 'keyboard']) {\n            if (options.interactive && (options: any)[name]) {\n                (map: any)[name].enable((options: any)[name]);\n            }\n        }\n    }\n\n    _add(handlerName: string, handler: Handler, allowed?: Array<string>) {\n        this._handlers.push({handlerName, handler, allowed});\n        this._handlersById[handlerName] = handler;\n    }\n\n    stop(allowEndAnimation: boolean) {\n        // do nothing if this method was triggered by a gesture update\n        if (this._updatingCamera) return;\n\n        for (const {handler} of this._handlers) {\n            handler.reset();\n        }\n        this._inertia.clear();\n        this._fireEvents({}, {}, allowEndAnimation);\n        this._changes = [];\n        this._originalZoom = undefined;\n    }\n\n    isActive(): boolean {\n        for (const {handler} of this._handlers) {\n            if (handler.isActive()) return true;\n        }\n        return false;\n    }\n\n    isZooming(): boolean {\n        return !!this._eventsInProgress.zoom || this._map.scrollZoom.isZooming();\n    }\n\n    isRotating(): boolean {\n        return !!this._eventsInProgress.rotate;\n    }\n\n    isMoving(): boolean {\n        return !!isMoving(this._eventsInProgress) || this.isZooming();\n    }\n\n    _isDragging(): boolean {\n        return !!this._eventsInProgress.drag;\n    }\n\n    _blockedByActive(activeHandlers: { [string]: Handler }, allowed: Array<string>, myName: string): boolean {\n        for (const name in activeHandlers) {\n            if (name === myName) continue;\n            if (!allowed || allowed.indexOf(name) < 0) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    handleWindowEvent(e: InputEvent) {\n        this.handleEvent(e, `${e.type}Window`);\n    }\n\n    _getMapTouches(touches: TouchList): TouchList {\n        const mapTouches = [];\n        for (const t of touches) {\n            const target = ((t.target: any): Node);\n            if (this._el.contains(target)) {\n                mapTouches.push(t);\n            }\n        }\n        return ((mapTouches: any): TouchList);\n    }\n\n    handleEvent(e: InputEvent | RenderFrameEvent, eventName?: string) {\n\n        this._updatingCamera = true;\n        assert(e.timeStamp !== undefined);\n\n        const isRenderFrame = e.type === 'renderFrame';\n        const inputEvent = isRenderFrame ? undefined : ((e: any): InputEvent);\n\n        /*\n         * We don't call e.preventDefault() for any events by default.\n         * Handlers are responsible for calling it where necessary.\n         */\n\n        const mergedHandlerResult: HandlerResult = {needsRenderFrame: false};\n        const eventsInProgress = {};\n        const activeHandlers = {};\n\n        const mapTouches = e.touches ? this._getMapTouches(((e: any): TouchEvent).touches) : undefined;\n        const points = mapTouches ? DOM.touchPos(this._el, mapTouches) :\n            isRenderFrame ? undefined : // renderFrame event doesn't have any points\n            DOM.mousePos(this._el, ((e: any): MouseEvent));\n\n        for (const {handlerName, handler, allowed} of this._handlers) {\n            if (!handler.isEnabled()) continue;\n\n            let data: ?HandlerResult;\n            if (this._blockedByActive(activeHandlers, allowed, handlerName)) {\n                handler.reset();\n\n            } else {\n                if ((handler: any)[eventName || e.type]) {\n                    data = (handler: any)[eventName || e.type](e, points, mapTouches);\n                    this.mergeHandlerResult(mergedHandlerResult, eventsInProgress, data, handlerName, inputEvent);\n                    if (data && data.needsRenderFrame) {\n                        this._triggerRenderFrame();\n                    }\n                }\n            }\n\n            if (data || handler.isActive()) {\n                activeHandlers[handlerName] = handler;\n            }\n        }\n\n        const deactivatedHandlers = {};\n        for (const name in this._previousActiveHandlers) {\n            if (!activeHandlers[name]) {\n                deactivatedHandlers[name] = inputEvent;\n            }\n        }\n        this._previousActiveHandlers = activeHandlers;\n\n        if (Object.keys(deactivatedHandlers).length || hasChange(mergedHandlerResult)) {\n            this._changes.push([mergedHandlerResult, eventsInProgress, deactivatedHandlers]);\n            this._triggerRenderFrame();\n        }\n\n        if (Object.keys(activeHandlers).length || hasChange(mergedHandlerResult)) {\n            this._map._stop(true);\n        }\n\n        this._updatingCamera = false;\n\n        const {cameraAnimation} = mergedHandlerResult;\n        if (cameraAnimation) {\n            this._inertia.clear();\n            this._fireEvents({}, {}, true);\n            this._changes = [];\n            cameraAnimation(this._map);\n        }\n    }\n\n    mergeHandlerResult(mergedHandlerResult: HandlerResult, eventsInProgress: Object, handlerResult: HandlerResult, name: string, e?: InputEvent) {\n        if (!handlerResult) return;\n\n        extend(mergedHandlerResult, handlerResult);\n\n        const eventData = {handlerName: name, originalEvent: handlerResult.originalEvent || e};\n\n        // track which handler changed which camera property\n        if (handlerResult.zoomDelta !== undefined) {\n            eventsInProgress.zoom = eventData;\n        }\n        if (handlerResult.panDelta !== undefined) {\n            eventsInProgress.drag = eventData;\n        }\n        if (handlerResult.pitchDelta !== undefined) {\n            eventsInProgress.pitch = eventData;\n        }\n        if (handlerResult.bearingDelta !== undefined) {\n            eventsInProgress.rotate = eventData;\n        }\n    }\n\n    _applyChanges() {\n        const combined = {};\n        const combinedEventsInProgress = {};\n        const combinedDeactivatedHandlers = {};\n\n        for (const [change, eventsInProgress, deactivatedHandlers] of this._changes) {\n\n            if (change.panDelta) combined.panDelta = (combined.panDelta || new Point(0, 0))._add(change.panDelta);\n            if (change.zoomDelta) combined.zoomDelta = (combined.zoomDelta || 0) + change.zoomDelta;\n            if (change.bearingDelta) combined.bearingDelta = (combined.bearingDelta || 0) + change.bearingDelta;\n            if (change.pitchDelta) combined.pitchDelta = (combined.pitchDelta || 0) + change.pitchDelta;\n            if (change.around !== undefined) combined.around = change.around;\n            if (change.aroundCoord !== undefined) combined.aroundCoord = change.aroundCoord;\n            if (change.pinchAround !== undefined) combined.pinchAround = change.pinchAround;\n            if (change.noInertia) combined.noInertia = change.noInertia;\n\n            extend(combinedEventsInProgress, eventsInProgress);\n            extend(combinedDeactivatedHandlers, deactivatedHandlers);\n        }\n\n        this._updateMapTransform(combined, combinedEventsInProgress, combinedDeactivatedHandlers);\n        this._changes = [];\n    }\n\n    _updateMapTransform(combinedResult: any, combinedEventsInProgress: Object, deactivatedHandlers: Object) {\n\n        const map = this._map;\n        const tr = map.transform;\n\n        const eventStarted = (type: string) => {\n            const newEvent = combinedEventsInProgress[type];\n            return newEvent && !this._eventsInProgress[type];\n        };\n\n        const eventEnded = (type: string) => {\n            const event = this._eventsInProgress[type];\n            return event && !this._handlersById[event.handlerName].isActive();\n        };\n\n        const toVec3 = (p: MercatorCoordinate): Vec3 => [p.x, p.y, p.z];\n\n        if (eventEnded(\"drag\") && !hasChange(combinedResult)) {\n            const preZoom = tr.zoom;\n            tr.cameraElevationReference = \"sea\";\n            if (this._originalZoom != null && tr._orthographicProjectionAtLowPitch && tr.projection.name !== 'globe' && tr.pitch  === 0) {\n                // keep constant zoom from drag gesture start.\n                tr.cameraElevationReference = \"ground\";\n                tr.zoom = this._originalZoom;\n            } else {\n                tr.recenterOnTerrain();\n                tr.cameraElevationReference = \"ground\";\n            }\n            // Map zoom might change during the pan operation due to terrain elevation.\n            if (preZoom !== tr.zoom) this._map._update(true);\n        }\n\n        // Catches double click and double tap zooms when camera is constrained over terrain\n        if (tr._isCameraConstrained) map._stop(true);\n\n        if (!hasChange(combinedResult)) {\n            this._fireEvents(combinedEventsInProgress, deactivatedHandlers, true);\n            return;\n        }\n\n        let {panDelta, zoomDelta, bearingDelta, pitchDelta, around, aroundCoord, pinchAround} = combinedResult;\n\n        if (tr._isCameraConstrained) {\n            // Catches wheel zoom events when camera is constrained over terrain\n            if (zoomDelta > 0) zoomDelta = 0;\n            tr._isCameraConstrained = false;\n        }\n\n        if (pinchAround !== undefined) {\n            around = pinchAround;\n        }\n\n        if ((zoomDelta || eventStarted(\"drag\")) && around) {\n            this._dragOrigin = toVec3(tr.pointCoordinate3D(around));\n            this._originalZoom = tr.zoom;\n            // Construct the tracking ellipsoid every time user changes the zoom or drag origin.\n            // Direction of the ray will define size of the shape and hence defining the available range of movement\n            this._trackingEllipsoid.setup(tr._camera.position, this._dragOrigin);\n        }\n\n        // All movement of the camera is done relative to the sea level\n        tr.cameraElevationReference = \"sea\";\n\n        // stop any ongoing camera animations (easeTo, flyTo)\n        map._stop(true);\n\n        around = around || map.transform.centerPoint;\n        if (bearingDelta) tr.bearing += bearingDelta;\n        if (pitchDelta) tr.pitch += pitchDelta;\n        tr._updateCameraState();\n\n        // Compute Mercator 3D camera offset based on screenspace panDelta\n        const panVec = [0, 0, 0];\n        if (panDelta) {\n            if (tr.projection.name === 'mercator') {\n                assert(this._dragOrigin, '_dragOrigin should have been setup with a previous dragstart');\n                const startPoint = this._trackingEllipsoid.projectRay(tr.screenPointToMercatorRay(around).dir);\n                const endPoint = this._trackingEllipsoid.projectRay(tr.screenPointToMercatorRay(around.sub(panDelta)).dir);\n                panVec[0] = endPoint[0] - startPoint[0];\n                panVec[1] = endPoint[1] - startPoint[1];\n\n            } else {\n                const startPoint = tr.pointCoordinate(around);\n                if (tr.projection.name === 'globe') {\n                    // Compute pan vector directly in pixel coordinates for the globe.\n                    // Rotate the globe a bit faster when dragging near poles to compensate\n                    // different pixel-per-meter ratios (ie. pixel-to-physical-rotation is lower)\n                    panDelta = panDelta.rotate(-tr.angle);\n                    const scale = tr._pixelsPerMercatorPixel / tr.worldSize;\n                    panVec[0] = -panDelta.x * mercatorScale(latFromMercatorY(startPoint.y)) * scale;\n                    panVec[1] = -panDelta.y * mercatorScale(tr.center.lat) * scale;\n\n                } else {\n                    const endPoint = tr.pointCoordinate(around.sub(panDelta));\n\n                    if (startPoint && endPoint) {\n                        panVec[0] = endPoint.x - startPoint.x;\n                        panVec[1] = endPoint.y - startPoint.y;\n                    }\n                }\n            }\n        }\n\n        const originalZoom = tr.zoom;\n        // Compute Mercator 3D camera offset based on screenspace requested ZoomDelta\n        const zoomVec = [0, 0, 0];\n        if (zoomDelta) {\n            // Zoom value has to be computed relative to a secondary map plane that is created from the terrain position below the cursor.\n            // This way the zoom interpolation can be kept linear and independent of the (possible) terrain elevation\n            const pickedPosition: Vec3 = aroundCoord ? toVec3(aroundCoord) : toVec3(tr.pointCoordinate3D(around));\n\n            const aroundRay = {dir: vec3.normalize([], vec3.sub([], pickedPosition, tr._camera.position))};\n            if (aroundRay.dir[2] < 0) {\n                // Special handling is required if the ray created from the cursor is heading up.\n                // This scenario is possible if user is trying to zoom towards a feature like a hill or a mountain.\n                // Convert zoomDelta to a movement vector as if the camera would be orbiting around the picked point\n                const movement = tr.zoomDeltaToMovement(pickedPosition, zoomDelta);\n                vec3.scale(zoomVec, aroundRay.dir, movement);\n            }\n        }\n\n        // Mutate camera state via CameraAPI\n        const translation = vec3.add(panVec, panVec, zoomVec);\n        tr._translateCameraConstrained(translation);\n\n        if (zoomDelta && Math.abs(tr.zoom - originalZoom) > 0.0001) {\n            tr.recenterOnTerrain();\n        }\n\n        tr.cameraElevationReference = \"ground\";\n\n        this._map._update();\n        if (!combinedResult.noInertia) this._inertia.record(combinedResult);\n        this._fireEvents(combinedEventsInProgress, deactivatedHandlers, true);\n    }\n\n    _fireEvents(newEventsInProgress: { [string]: Object }, deactivatedHandlers: Object, allowEndAnimation: boolean) {\n\n        const wasMoving = isMoving(this._eventsInProgress);\n        const nowMoving = isMoving(newEventsInProgress);\n\n        const startEvents = {};\n\n        for (const eventName in newEventsInProgress) {\n            const {originalEvent} = newEventsInProgress[eventName];\n            if (!this._eventsInProgress[eventName]) {\n                startEvents[`${eventName}start`] = originalEvent;\n            }\n            this._eventsInProgress[eventName] = newEventsInProgress[eventName];\n        }\n\n        // fire start events only after this._eventsInProgress has been updated\n        if (!wasMoving && nowMoving) {\n            this._fireEvent('movestart', nowMoving.originalEvent);\n        }\n\n        for (const name in startEvents) {\n            this._fireEvent(name, startEvents[name]);\n        }\n\n        if (nowMoving) {\n            this._fireEvent('move', nowMoving.originalEvent);\n        }\n\n        for (const eventName in newEventsInProgress) {\n            const {originalEvent} = newEventsInProgress[eventName];\n            this._fireEvent(eventName, originalEvent);\n        }\n\n        const endEvents = {};\n\n        let originalEndEvent;\n        for (const eventName in this._eventsInProgress) {\n            const {handlerName, originalEvent} = this._eventsInProgress[eventName];\n            if (!this._handlersById[handlerName].isActive()) {\n                delete this._eventsInProgress[eventName];\n                originalEndEvent = deactivatedHandlers[handlerName] || originalEvent;\n                endEvents[`${eventName}end`] = originalEndEvent;\n            }\n        }\n\n        for (const name in endEvents) {\n            this._fireEvent(name, endEvents[name]);\n        }\n\n        const stillMoving = isMoving(this._eventsInProgress);\n        if (allowEndAnimation && (wasMoving || nowMoving) && !stillMoving) {\n            this._updatingCamera = true;\n            const inertialEase = this._inertia._onMoveEnd(this._map.dragPan._inertiaOptions);\n\n            const shouldSnapToNorth = (bearing: number) => bearing !== 0 && -this._bearingSnap < bearing && bearing < this._bearingSnap;\n\n            if (inertialEase) {\n                if (shouldSnapToNorth(inertialEase.bearing || this._map.getBearing())) {\n                    inertialEase.bearing = 0;\n                }\n                this._map.easeTo(inertialEase, {originalEvent: originalEndEvent});\n            } else {\n                this._map.fire(new Event('moveend', {originalEvent: originalEndEvent}));\n                if (shouldSnapToNorth(this._map.getBearing())) {\n                    this._map.resetNorth();\n                }\n            }\n            this._updatingCamera = false;\n        }\n\n    }\n\n    _fireEvent(type: string, e: any) {\n        this._map.fire(new Event(type, e ? {originalEvent: e} : {}));\n    }\n\n    _requestFrame(): number {\n        this._map.triggerRepaint();\n        return this._map._renderTaskQueue.add(timeStamp => {\n            this._frameId = undefined;\n            this.handleEvent(new RenderFrameEvent('renderFrame', {timeStamp}));\n            this._applyChanges();\n        });\n    }\n\n    _triggerRenderFrame() {\n        if (this._frameId === undefined) {\n            this._frameId = this._requestFrame();\n        }\n    }\n}\n\nexport default HandlerManager;\n","// @flow\n\nimport {\n    bindAll,\n    extend,\n    warnOnce,\n    clamp,\n    wrap,\n    ease as defaultEasing,\n    pick,\n    degToRad\n} from '../util/util.js';\nimport {number as interpolate} from '../style-spec/util/interpolate.js';\nimport browser from '../util/browser.js';\nimport LngLat, {earthRadius, latLngToECEF, ecefToLatLng, LngLatBounds} from '../geo/lng_lat.js';\nimport {\n    GLOBE_RADIUS,\n    GLOBE_ZOOM_THRESHOLD_MAX,\n    GLOBE_ZOOM_THRESHOLD_MIN\n} from '../geo/projection/globe_constants.js';\nimport Point from '@mapbox/point-geometry';\nimport {Event, Evented} from '../util/evented.js';\nimport assert from 'assert';\nimport {Debug} from '../util/debug.js';\nimport MercatorCoordinate, {\n    mercatorZfromAltitude,\n    mercatorXfromLng,\n    mercatorYfromLat,\n    latFromMercatorY,\n    lngFromMercatorX\n} from '../geo/mercator_coordinate.js';\nimport {vec3, vec4, mat4} from 'gl-matrix';\nimport type {FreeCameraOptions} from './free_camera.js';\nimport type Transform from '../geo/transform.js';\nimport type {LngLatLike, LngLatBoundsLike} from '../geo/lng_lat.js';\nimport type {ElevationQueryOptions} from '../terrain/elevation.js';\nimport type {TaskID} from '../util/task_queue.js';\nimport type {Callback} from '../types/callback.js';\nimport type {PointLike} from '../types/point-like.js';\nimport {Aabb} from '../util/primitives.js';\nimport type {PaddingOptions} from '../geo/edge_insets.js';\nimport type {MapEvent} from './events.js';\nimport type {ObjMap} from '../types/obj-map.js';\n\n/**\n * A helper type: converts all Object type values to non-maybe types.\n */\ntype Required<T> = ObjMap<T, <V>(v: V) => $NonMaybeType<V>>;\n\n/**\n * Options common to {@link Map#jumpTo}, {@link Map#easeTo}, and {@link Map#flyTo}, controlling the desired location,\n * zoom, bearing, and pitch of the camera. All properties are optional, and when a property is omitted, the current\n * camera value for that property will remain unchanged.\n *\n * @typedef {Object} CameraOptions\n * @property {LngLatLike} center The location to place at the screen center.\n * @property {number} zoom The desired zoom level.\n * @property {number} bearing The desired bearing in degrees. The bearing is the compass direction that\n * is \"up\". For example, `bearing: 90` orients the map so that east is up.\n * @property {number} pitch The desired pitch in degrees. The pitch is the angle towards the horizon\n * measured in degrees with a range between 0 and 85 degrees. For example, pitch: 0 provides the appearance\n * of looking straight down at the map, while pitch: 60 tilts the user's perspective towards the horizon.\n * Increasing the pitch value is often used to display 3D objects.\n * @property {LngLatLike} around The location serving as the origin for a change in `zoom`, `pitch` and/or `bearing`.\n * This location will remain at the same screen position following the transform.\n * This is useful for drawing attention to a location that is not in the screen center.\n * `center` is ignored if `around` is included.\n * @property {PaddingOptions} padding Dimensions in pixels applied on each side of the viewport for shifting the vanishing point.\n * Note that when `padding` is used with `jumpTo`, `easeTo`, and `flyTo`, it also sets the global map padding as a side effect,\n * affecting all subsequent camera movements until the padding is reset.\n * @example\n * // set the map's initial perspective with CameraOptions\n * const map = new mapboxgl.Map({\n *     container: 'map',\n *     style: 'mapbox://styles/mapbox/streets-v11',\n *     center: [-73.5804, 45.53483],\n *     pitch: 60,\n *     bearing: -60,\n *     zoom: 10\n * });\n * @see [Example: Set pitch and bearing](https://docs.mapbox.com/mapbox-gl-js/example/set-perspective/)\n * @see [Example: Jump to a series of locations](https://docs.mapbox.com/mapbox-gl-js/example/jump-to/)\n * @see [Example: Fly to a location](https://docs.mapbox.com/mapbox-gl-js/example/flyto/)\n * @see [Example: Display buildings in 3D](https://docs.mapbox.com/mapbox-gl-js/example/3d-buildings/)\n */\nexport type CameraOptions = {\n    center?: LngLatLike,\n    zoom?: number,\n    bearing?: number,\n    pitch?: number,\n    around?: LngLatLike,\n    padding?: PaddingOptions,\n    maxZoom?: number\n};\n\nexport type FullCameraOptions = {\n    maxZoom: number,\n    offset: PointLike,\n    padding: Required<PaddingOptions>\n} & CameraOptions;\n\n/**\n * Options common to map movement methods that involve animation, such as {@link Map#panBy} and\n * {@link Map#easeTo}, controlling the duration and easing function of the animation. All properties\n * are optional.\n *\n * @typedef {Object} AnimationOptions\n * @property {number} duration The animation's duration, measured in milliseconds.\n * @property {Function} easing A function taking a time in the range 0..1 and returning a number where 0 is\n * the initial state and 1 is the final state.\n * @property {PointLike} offset The target center's offset relative to real map container center at the end of animation.\n * @property {boolean} animate If `false`, no animation will occur.\n * @property {boolean} essential If `true`, then the animation is considered essential and will not be affected by\n * [`prefers-reduced-motion`](https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion).\n * @property {boolean} preloadOnly If `true`, it will trigger tiles loading across the animation path, but no animation will occur.\n * @property {number} curve The zooming \"curve\" that will occur along the\n * flight path. A high value maximizes zooming for an exaggerated animation, while a low\n * value minimizes zooming for an effect closer to {@link Map#easeTo}. 1.42 is the average\n * value selected by participants in the user study discussed in\n * [van Wijk (2003)](https://www.win.tue.nl/~vanwijk/zoompan.pdf). A value of\n * `Math.pow(6, 0.25)` would be equivalent to the root mean squared average velocity. A\n * value of 1 would produce a circular motion. If `minZoom` is specified, this option will be ignored.\n * @property {number} minZoom The zero-based zoom level at the peak of the flight path. If\n * this option is specified, `curve` will be ignored.\n * @property {number} speed The average speed of the animation defined in relation to\n * `curve`. A speed of 1.2 means that the map appears to move along the flight path\n * by 1.2 times `curve` screenfuls every second. A _screenful_ is the map's visible span.\n * It does not correspond to a fixed physical distance, but varies by zoom level.\n * @property {number} screenSpeed The average speed of the animation measured in screenfuls\n * per second, assuming a linear timing curve. If `speed` is specified, this option is ignored.\n * @property {number} maxDuration The animation's maximum duration, measured in milliseconds.\n * If duration exceeds maximum duration, it resets to 0.\n * @see [Example: Slowly fly to a location](https://docs.mapbox.com/mapbox-gl-js/example/flyto-options/)\n * @see [Example: Customize camera animations](https://docs.mapbox.com/mapbox-gl-js/example/camera-animation/)\n * @see [Example: Navigate the map with game-like controls](https://docs.mapbox.com/mapbox-gl-js/example/game-controls/)\n*/\nexport type AnimationOptions = {\n    animate?: boolean,\n    curve?: number,\n    duration?: number,\n    easing?: (_: number) => number,\n    essential?: boolean,\n    linear?: boolean,\n    maxDuration?: number,\n    offset?: PointLike,\n    preloadOnly?: boolean,\n    screenSpeed?: number,\n    speed?: number\n};\n\nexport type EasingOptions = CameraOptions & AnimationOptions;\n\nexport type ElevationBoxRaycast = {\n    minLngLat: LngLat,\n    maxLngLat: LngLat,\n    minAltitude: number,\n    maxAltitude: number\n};\n\nconst freeCameraNotSupportedWarning = 'map.setFreeCameraOptions(...) and map.getFreeCameraOptions() are not yet supported for non-mercator projections.';\n\n/**\n * Options for setting padding on calls to methods such as {@link Map#jumpTo}, {@link Map#easeTo}, {@link Map#flyTo},\n * {@link Map#fitBounds}, {@link Map#fitScreenCoordinates}, and {@link Map#setPadding}. Adjust these options to set\n * the amount of padding in pixels added to the edges of the canvas. Set a uniform padding on all edges or individual\n * values for each edge. All properties of this object must be non-negative integers. Note that when `padding` is used with\n * `fitBounds`, `flyTo`, or similar methods, it also sets the global map padding as a side effect, affecting all\n * subsequent camera movements until the padding is reset.\n *\n * @typedef {Object} PaddingOptions\n * @property {number} top Padding in pixels from the top of the map canvas.\n * @property {number} bottom Padding in pixels from the bottom of the map canvas.\n * @property {number} left Padding in pixels from the left of the map canvas.\n * @property {number} right Padding in pixels from the right of the map canvas.\n *\n * @example\n * const bbox = [[-79, 43], [-73, 45]];\n * map.fitBounds(bbox, {\n *     padding: {top: 10, bottom: 25, left: 15, right: 5}\n * });\n *\n * @example\n * const bbox = [[-79, 43], [-73, 45]];\n * map.fitBounds(bbox, {\n *     padding: 20\n * });\n * @see [Example: Fit to the bounds of a LineString](https://docs.mapbox.com/mapbox-gl-js/example/zoomto-linestring/)\n * @see [Example: Fit a map to a bounding box](https://docs.mapbox.com/mapbox-gl-js/example/fitbounds/)\n */\n\nclass Camera extends Evented {\n    transform: Transform;\n    _moving: boolean;\n    _zooming: boolean;\n    _rotating: boolean;\n    _pitching: boolean;\n    _padding: boolean;\n\n    _bearingSnap: number;\n    _easeStart: number;\n    _easeOptions: {duration: number, easing: (_: number) => number};\n    _easeId: string | void;\n    _respectPrefersReducedMotion: boolean;\n\n    _onEaseFrame: ?(_: number) => Transform | void;\n    _onEaseEnd: ?(easeId?: string) => void;\n    _easeFrameId: ?TaskID;\n\n    constructor(transform: Transform, options: {bearingSnap: number, respectPrefersReducedMotion?: boolean}) {\n        super();\n        this._moving = false;\n        this._zooming = false;\n        this.transform = transform;\n        this._bearingSnap = options.bearingSnap;\n        this._respectPrefersReducedMotion = options.respectPrefersReducedMotion !== false;\n\n        bindAll(['_renderFrameCallback'], this);\n\n        //addAssertions(this);\n    }\n\n    /** @section {Camera}\n     * @method\n     * @instance\n     * @memberof Map */\n\n    /**\n     * Returns the map's geographical centerpoint.\n     *\n     * @memberof Map#\n     * @returns {LngLat} The map's geographical centerpoint.\n     * @example\n     * // Return a LngLat object such as {lng: 0, lat: 0}.\n     * const center = map.getCenter();\n     * // Access longitude and latitude values directly.\n     * const {lng, lat} = map.getCenter();\n     * @see [Tutorial: Use Mapbox GL JS in a React app](https://docs.mapbox.com/help/tutorials/use-mapbox-gl-js-with-react/#store-the-new-coordinates)\n     */\n    getCenter(): LngLat { return new LngLat(this.transform.center.lng, this.transform.center.lat); }\n\n    /**\n     * Sets the map's geographical centerpoint. Equivalent to `jumpTo({center: center})`.\n     *\n     * @memberof Map#\n     * @param {LngLatLike} center The centerpoint to set.\n     * @param {Object | null} eventData Additional properties to be added to event objects of events triggered by this method.\n     * @fires Map.event:movestart\n     * @fires Map.event:moveend\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * map.setCenter([-74, 38]);\n     */\n    setCenter(center: LngLatLike, eventData?: Object): this {\n        return this.jumpTo({center}, eventData);\n    }\n\n    /**\n     * Pans the map by the specified offset.\n     *\n     * @memberof Map#\n     * @param {PointLike} offset The `x` and `y` coordinates by which to pan the map.\n     * @param {AnimationOptions | null} options An options object describing the destination and animation of the transition. We do not recommend using `options.offset` since this value will override the value of the `offset` parameter.\n     * @param {Object | null} eventData Additional properties to be added to event objects of events triggered by this method.\n     * @fires Map.event:movestart\n     * @fires Map.event:moveend\n     * @returns {Map} `this` Returns itself to allow for method chaining.\n     * @example\n     * map.panBy([-74, 38]);\n     * @example\n     * // panBy with an animation of 5 seconds.\n     * map.panBy([-74, 38], {duration: 5000});\n     * @see [Example: Navigate the map with game-like controls](https://www.mapbox.com/mapbox-gl-js/example/game-controls/)\n     */\n    panBy(offset: PointLike, options?: AnimationOptions, eventData?: Object): this {\n        offset = Point.convert(offset).mult(-1);\n        return this.panTo(this.transform.center, extend({offset}, options), eventData);\n    }\n\n    /**\n     * Pans the map to the specified location with an animated transition.\n     *\n     * @memberof Map#\n     * @param {LngLatLike} lnglat The location to pan the map to.\n     * @param {AnimationOptions | null} options Options describing the destination and animation of the transition.\n     * @param {Object | null} eventData Additional properties to be added to event objects of events triggered by this method.\n     * @fires Map.event:movestart\n     * @fires Map.event:moveend\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * map.panTo([-74, 38]);\n     * @example\n     * // Specify that the panTo animation should last 5000 milliseconds.\n     * map.panTo([-74, 38], {duration: 5000});\n     * @see [Example: Update a feature in realtime](https://docs.mapbox.com/mapbox-gl-js/example/live-update-feature/)\n     */\n    panTo(lnglat: LngLatLike, options?: AnimationOptions, eventData?: Object): this {\n        return this.easeTo(extend({\n            center: lnglat\n        }, options), eventData);\n    }\n\n    /**\n     * Returns the map's current zoom level.\n     *\n     * @memberof Map#\n     * @returns {number} The map's current zoom level.\n     * @example\n     * map.getZoom();\n     */\n    getZoom(): number { return this.transform.zoom; }\n\n    /**\n     * Sets the map's zoom level. Equivalent to `jumpTo({zoom: zoom})`.\n     *\n     * @memberof Map#\n     * @param {number} zoom The zoom level to set (0-20).\n     * @param {Object | null} eventData Additional properties to be added to event objects of events triggered by this method.\n     * @fires Map.event:movestart\n     * @fires Map.event:zoomstart\n     * @fires Map.event:move\n     * @fires Map.event:zoom\n     * @fires Map.event:moveend\n     * @fires Map.event:zoomend\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * // Zoom to the zoom level 5 without an animated transition\n     * map.setZoom(5);\n     */\n    setZoom(zoom: number, eventData?: Object): this {\n        this.jumpTo({zoom}, eventData);\n        return this;\n    }\n\n    /**\n     * Zooms the map to the specified zoom level, with an animated transition.\n     *\n     * @memberof Map#\n     * @param {number} zoom The zoom level to transition to.\n     * @param {AnimationOptions | null} options Options object.\n     * @param {Object | null} eventData Additional properties to be added to event objects of events triggered by this method.\n     * @fires Map.event:movestart\n     * @fires Map.event:zoomstart\n     * @fires Map.event:move\n     * @fires Map.event:zoom\n     * @fires Map.event:moveend\n     * @fires Map.event:zoomend\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * // Zoom to the zoom level 5 without an animated transition\n     * map.zoomTo(5);\n     * // Zoom to the zoom level 8 with an animated transition\n     * map.zoomTo(8, {\n     *     duration: 2000,\n     *     offset: [100, 50]\n     * });\n     */\n    zoomTo(zoom: number, options: ? AnimationOptions, eventData?: Object): this {\n        return this.easeTo(extend({\n            zoom\n        }, options), eventData);\n    }\n\n    /**\n     * Increases the map's zoom level by 1.\n     *\n     * @memberof Map#\n     * @param {AnimationOptions | null} options Options object.\n     * @param {Object | null} eventData Additional properties to be added to event objects of events triggered by this method.\n     * @fires Map.event:movestart\n     * @fires Map.event:zoomstart\n     * @fires Map.event:move\n     * @fires Map.event:zoom\n     * @fires Map.event:moveend\n     * @fires Map.event:zoomend\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * // zoom the map in one level with a custom animation duration\n     * map.zoomIn({duration: 1000});\n     */\n    zoomIn(options?: AnimationOptions, eventData?: Object): this {\n        this.zoomTo(this.getZoom() + 1, options, eventData);\n        return this;\n    }\n\n    /**\n     * Decreases the map's zoom level by 1.\n     *\n     * @memberof Map#\n     * @param {AnimationOptions | null} options Options object.\n     * @param {Object | null} eventData Additional properties to be added to event objects of events triggered by this method.\n     * @fires Map.event:movestart\n     * @fires Map.event:zoomstart\n     * @fires Map.event:move\n     * @fires Map.event:zoom\n     * @fires Map.event:moveend\n     * @fires Map.event:zoomend\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * // zoom the map out one level with a custom animation offset\n     * map.zoomOut({offset: [80, 60]});\n     */\n    zoomOut(options?: AnimationOptions, eventData?: Object): this {\n        this.zoomTo(this.getZoom() - 1, options, eventData);\n        return this;\n    }\n\n    /**\n     * Returns the map's current bearing. The bearing is the compass direction that is \"up\"; for example, a bearing\n     * of 90° orients the map so that east is up.\n     *\n     * @memberof Map#\n     * @returns {number} The map's current bearing.\n     * @example\n     * const bearing = map.getBearing();\n     * @see [Example: Navigate the map with game-like controls](https://www.mapbox.com/mapbox-gl-js/example/game-controls/)\n     */\n    getBearing(): number {\n        return this.transform.bearing;\n    }\n\n    /**\n     * Sets the map's bearing (rotation). The bearing is the compass direction that is \"up\"; for example, a bearing\n     * of 90° orients the map so that east is up.\n     *\n     * Equivalent to `jumpTo({bearing: bearing})`.\n     *\n     * @memberof Map#\n     * @param {number} bearing The desired bearing.\n     * @param {Object | null} eventData Additional properties to be added to event objects of events triggered by this method.\n     * @fires Map.event:movestart\n     * @fires Map.event:moveend\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * // Rotate the map to 90 degrees.\n     * map.setBearing(90);\n     */\n    setBearing(bearing: number, eventData?: Object): this {\n        this.jumpTo({bearing}, eventData);\n        return this;\n    }\n\n    /**\n     * Returns the current padding applied around the map viewport.\n     *\n     * @memberof Map#\n     * @returns {PaddingOptions} The current padding around the map viewport.\n     * @example\n     * const padding = map.getPadding();\n     */\n    getPadding(): PaddingOptions { return this.transform.padding; }\n\n    /**\n     * Sets the padding in pixels around the viewport.\n     *\n     * Equivalent to `jumpTo({padding: padding})`.\n     *\n     * @memberof Map#\n     * @param {PaddingOptions} padding The desired padding. Format: {left: number, right: number, top: number, bottom: number}.\n     * @param {Object | null} eventData Additional properties to be added to event objects of events triggered by this method.\n     * @fires Map.event:movestart\n     * @fires Map.event:moveend\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * // Sets a left padding of 300px, and a top padding of 50px\n     * map.setPadding({left: 300, top: 50});\n     */\n    setPadding(padding: PaddingOptions, eventData?: Object): this {\n        this.jumpTo({padding}, eventData);\n        return this;\n    }\n\n    /**\n     * Rotates the map to the specified bearing, with an animated transition. The bearing is the compass direction\n     * that is \\\"up\\\"; for example, a bearing of 90° orients the map so that east is up.\n     *\n     * @memberof Map#\n     * @param {number} bearing The desired bearing.\n     * @param {EasingOptions | null} options Options describing the destination and animation of the transition.\n     * Accepts {@link CameraOptions} and {@link AnimationOptions}.\n     * @param {Object | null} eventData Additional properties to be added to event objects of events triggered by this method.\n     * @fires Map.event:movestart\n     * @fires Map.event:moveend\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * map.rotateTo(30);\n     * @example\n     * // rotateTo with an animation of 2 seconds.\n     * map.rotateTo(30, {duration: 2000});\n     */\n    rotateTo(bearing: number, options?: EasingOptions, eventData?: Object): this {\n        return this.easeTo(extend({\n            bearing\n        }, options), eventData);\n    }\n\n    /**\n     * Rotates the map so that north is up (0° bearing), with an animated transition.\n     *\n     * @memberof Map#\n     * @param {EasingOptions | null} options Options describing the destination and animation of the transition.\n     * Accepts {@link CameraOptions} and {@link AnimationOptions}.\n     * @param {Object | null} eventData Additional properties to be added to event objects of events triggered by this method.\n     * @fires Map.event:movestart\n     * @fires Map.event:moveend\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * // resetNorth with an animation of 2 seconds.\n     * map.resetNorth({duration: 2000});\n     */\n    resetNorth(options?: EasingOptions, eventData?: Object): this {\n        this.rotateTo(0, extend({duration: 1000}, options), eventData);\n        return this;\n    }\n\n    /**\n     * Rotates and pitches the map so that north is up (0° bearing) and pitch is 0°, with an animated transition.\n     *\n     * @memberof Map#\n     * @param {EasingOptions | null} options Options describing the destination and animation of the transition.\n     * Accepts {@link CameraOptions} and {@link AnimationOptions}.\n     * @param {Object | null} eventData Additional properties to be added to event objects of events triggered by this method.\n     * @fires Map.event:movestart\n     * @fires Map.event:moveend\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * // resetNorthPitch with an animation of 2 seconds.\n     * map.resetNorthPitch({duration: 2000});\n     */\n    resetNorthPitch(options?: EasingOptions, eventData?: Object): this {\n        this.easeTo(extend({\n            bearing: 0,\n            pitch: 0,\n            duration: 1000\n        }, options), eventData);\n        return this;\n    }\n\n    /**\n     * Snaps the map so that north is up (0° bearing), if the current bearing is\n     * close enough to it (within the `bearingSnap` threshold).\n     *\n     * @memberof Map#\n     * @param {EasingOptions | null} options Options describing the destination and animation of the transition.\n     * Accepts {@link CameraOptions} and {@link AnimationOptions}.\n     * @param {Object | null} eventData Additional properties to be added to event objects of events triggered by this method.\n     * @fires Map.event:movestart\n     * @fires Map.event:moveend\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * // snapToNorth with an animation of 2 seconds.\n     * map.snapToNorth({duration: 2000});\n     */\n    snapToNorth(options?: EasingOptions, eventData?: Object): this {\n        if (Math.abs(this.getBearing()) < this._bearingSnap) {\n            return this.resetNorth(options, eventData);\n        }\n        return this;\n    }\n\n    /**\n     * Returns the map's current [pitch](https://docs.mapbox.com/help/glossary/camera/) (tilt).\n     *\n     * @memberof Map#\n     * @returns {number} The map's current pitch, measured in degrees away from the plane of the screen.\n     * @example\n     * const pitch = map.getPitch();\n     */\n    getPitch(): number { return this.transform.pitch; }\n\n    /**\n     * Sets the map's [pitch](https://docs.mapbox.com/help/glossary/camera/) (tilt). Equivalent to `jumpTo({pitch: pitch})`.\n     *\n     * @memberof Map#\n     * @param {number} pitch The pitch to set, measured in degrees away from the plane of the screen (0-60).\n     * @param {Object | null} eventData Additional properties to be added to event objects of events triggered by this method.\n     * @fires Map.event:pitchstart\n     * @fires Map.event:movestart\n     * @fires Map.event:moveend\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * // setPitch with an animation of 2 seconds.\n     * map.setPitch(80, {duration: 2000});\n     */\n    setPitch(pitch: number, eventData?: Object): this {\n        this.jumpTo({pitch}, eventData);\n        return this;\n    }\n\n    /**\n     * Returns a {@link CameraOptions} object for the highest zoom level\n     * up to and including `Map#getMaxZoom()` that fits the bounds\n     * in the viewport at the specified bearing.\n     *\n     * @memberof Map#\n     * @param {LngLatBoundsLike} bounds Calculate the center for these bounds in the viewport and use\n     * the highest zoom level up to and including `Map#getMaxZoom()` that fits\n     * in the viewport. LngLatBounds represent a box that is always axis-aligned with bearing 0.\n     * @param {CameraOptions | null} options Options object.\n     * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds.\n     * @param {number} [options.bearing=0] Desired map bearing at end of animation, in degrees.\n     * @param {number} [options.pitch=0] Desired map pitch at end of animation, in degrees.\n     * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels.\n     * @param {number} [options.maxZoom] The maximum zoom level to allow when the camera would transition to the specified bounds.\n     * @returns {CameraOptions | void} If map is able to fit to provided bounds, returns `CameraOptions` with\n     * `center`, `zoom`, and `bearing`. If map is unable to fit, method will warn and return undefined.\n     * @example\n     * const bbox = [[-79, 43], [-73, 45]];\n     * const newCameraTransform = map.cameraForBounds(bbox, {\n     *     padding: {top: 10, bottom:25, left: 15, right: 5}\n     * });\n     */\n    cameraForBounds(bounds: LngLatBoundsLike, options?: CameraOptions): ?EasingOptions {\n        bounds = LngLatBounds.convert(bounds);\n        const bearing = (options && options.bearing) || 0;\n        const pitch = (options && options.pitch) || 0;\n        const lnglat0 = bounds.getNorthWest();\n        const lnglat1 = bounds.getSouthEast();\n        return this._cameraForBounds(this.transform, lnglat0, lnglat1, bearing, pitch, options);\n    }\n\n    _extendPadding(padding: ?PaddingOptions | ?number): Required<PaddingOptions> {\n        const defaultPadding = {top: 0, right: 0, bottom: 0, left: 0};\n        if (padding == null) return extend({}, defaultPadding, this.transform.padding);\n\n        if (typeof padding === 'number') {\n            return {top: padding, bottom: padding, right: padding, left: padding};\n        }\n\n        return extend({}, defaultPadding, padding);\n    }\n\n    _extendCameraOptions(options?: CameraOptions): FullCameraOptions {\n        options = extend({\n            offset: [0, 0],\n            maxZoom: this.transform.maxZoom\n        }, options);\n\n        options.padding = this._extendPadding(options.padding);\n\n        return options;\n    }\n\n    _minimumAABBFrustumDistance(tr: Transform, aabb: Aabb): number {\n        const aabbW = aabb.max[0] - aabb.min[0];\n        const aabbH = aabb.max[1] - aabb.min[1];\n        const aabbAspectRatio = aabbW / aabbH;\n        const selectXAxis = aabbAspectRatio > tr.aspect;\n\n        const minimumDistance = selectXAxis ?\n            aabbW / (2 * Math.tan(tr.fovX * 0.5) * tr.aspect) :\n            aabbH / (2 * Math.tan(tr.fovY * 0.5) * tr.aspect);\n\n        return minimumDistance;\n    }\n\n    _cameraForBoundsOnGlobe(transform: Transform, p0: LngLatLike, p1: LngLatLike, bearing: number, pitch: number, options?: CameraOptions): ?EasingOptions {\n        const tr = transform.clone();\n        const eOptions = this._extendCameraOptions(options);\n\n        tr.bearing = bearing;\n        tr.pitch = pitch;\n\n        const coord0 = LngLat.convert(p0);\n        const coord1 = LngLat.convert(p1);\n\n        const midLat = (coord0.lat + coord1.lat) * 0.5;\n        const midLng = (coord0.lng + coord1.lng) * 0.5;\n\n        const origin = latLngToECEF(midLat, midLng);\n\n        const zAxis = vec3.normalize([], origin);\n        const xAxis = vec3.normalize([], vec3.cross([], zAxis, [0, 1, 0]));\n        const yAxis = vec3.cross([], xAxis, zAxis);\n\n        const aabbOrientation = [\n            xAxis[0], xAxis[1], xAxis[2], 0,\n            yAxis[0], yAxis[1], yAxis[2], 0,\n            zAxis[0], zAxis[1], zAxis[2], 0,\n            0, 0, 0, 1\n        ];\n\n        const ecefCoords = [\n            origin,\n\n            latLngToECEF(coord0.lat, coord0.lng),\n            latLngToECEF(coord1.lat, coord0.lng),\n            latLngToECEF(coord1.lat, coord1.lng),\n            latLngToECEF(coord0.lat, coord1.lng),\n\n            latLngToECEF(midLat, coord0.lng),\n            latLngToECEF(midLat, coord1.lng),\n            latLngToECEF(coord0.lat, midLng),\n            latLngToECEF(coord1.lat, midLng),\n        ];\n\n        let aabb = Aabb.fromPoints(ecefCoords.map(p => [vec3.dot(xAxis, p), vec3.dot(yAxis, p), vec3.dot(zAxis, p)]));\n\n        const center = vec3.transformMat4([], aabb.center, aabbOrientation);\n\n        if (vec3.squaredLength(center) === 0) {\n            vec3.set(center, 0, 0, 1);\n        }\n\n        vec3.normalize(center, center);\n        vec3.scale(center, center, GLOBE_RADIUS);\n        tr.center = ecefToLatLng(center);\n\n        const worldToCamera = tr.getWorldToCameraMatrix();\n        const cameraToWorld = mat4.invert(new Float64Array(16), worldToCamera);\n\n        aabb = Aabb.applyTransform(aabb, mat4.multiply([], worldToCamera, aabbOrientation));\n        const extendedAabb = this._extendAABB(aabb, tr, eOptions, bearing);\n        if (!extendedAabb) {\n            warnOnce('Map cannot fit within canvas with the given bounds, padding, and/or offset.');\n            return;\n        }\n\n        aabb = extendedAabb;\n        vec3.transformMat4(center, center, worldToCamera);\n\n        const aabbHalfExtentZ = (aabb.max[2] - aabb.min[2]) * 0.5;\n        const frustumDistance = this._minimumAABBFrustumDistance(tr, aabb);\n\n        const offsetZ = vec3.scale([], [0, 0, 1], aabbHalfExtentZ);\n        const aabbClosestPoint = vec3.add(offsetZ, center, offsetZ);\n        const offsetDistance = frustumDistance + (tr.pitch === 0 ? 0 : vec3.distance(center, aabbClosestPoint));\n\n        const globeCenter = tr.globeCenterInViewSpace;\n        const normal = vec3.sub([], center, [globeCenter[0], globeCenter[1], globeCenter[2]]);\n        vec3.normalize(normal, normal);\n        vec3.scale(normal, normal, offsetDistance);\n\n        const cameraPosition = vec3.add([], center, normal);\n\n        vec3.transformMat4(cameraPosition, cameraPosition, cameraToWorld);\n\n        const meterPerECEF = earthRadius / GLOBE_RADIUS;\n        const altitudeECEF = vec3.length(cameraPosition);\n        const altitudeMeter = altitudeECEF * meterPerECEF - earthRadius;\n        const mercatorZ = mercatorZfromAltitude(Math.max(altitudeMeter, Number.EPSILON), 0);\n\n        const zoom = Math.min(tr.zoomFromMercatorZAdjusted(mercatorZ), eOptions.maxZoom);\n\n        const halfZoomTransition = (GLOBE_ZOOM_THRESHOLD_MIN + GLOBE_ZOOM_THRESHOLD_MAX) * 0.5;\n        if (zoom > halfZoomTransition) {\n            tr.setProjection({name: 'mercator'});\n            tr.zoom = zoom;\n            return this._cameraForBounds(tr, p0, p1, bearing, pitch, options);\n        }\n\n        return {center: tr.center, zoom, bearing, pitch};\n    }\n\n    /**\n     * Extends the AABB with padding, offset, and bearing.\n     *\n     * @param {Aabb} aabb The AABB.\n     * @param {Transform} tr The transform.\n     * @param {FullCameraOptions} options Camera options.\n     * @param {number} bearing The bearing.\n     * @returns {Aabb | null} The extended AABB or null if couldn't scale.\n     * @private\n     */\n    _extendAABB(aabb: Aabb, tr: Transform, options: FullCameraOptions, bearing: number): Aabb | null {\n        const padL = options.padding.left || 0;\n        const padR = options.padding.right || 0;\n        const padB = options.padding.bottom || 0;\n        const padT = options.padding.top || 0;\n\n        const halfScreenPadX = (padL + padR) * 0.5;\n        const halfScreenPadY = (padT + padB) * 0.5;\n\n        const top = halfScreenPadY;\n        const left = halfScreenPadX;\n        const right = halfScreenPadX;\n        const bottom = halfScreenPadY;\n\n        const width = tr.width - (left + right);\n        const height = tr.height - (top + bottom);\n\n        const aabbSize: [number, number, number] = vec3.sub(([]: any), aabb.max, aabb.min);\n\n        const scaleX = width / aabbSize[0];\n        const scaleY = height / aabbSize[1];\n\n        const scale = Math.min(scaleX, scaleY);\n\n        const zoomRef = Math.min(tr.scaleZoom(tr.scale * scale), options.maxZoom);\n        if (isNaN(zoomRef)) {\n            return null;\n        }\n\n        const scaleRatio = tr.scale / tr.zoomScale(zoomRef);\n\n        const extendedAABB = new Aabb(\n            [aabb.min[0] - left * scaleRatio, aabb.min[1] - bottom * scaleRatio, aabb.min[2]],\n            [aabb.max[0] + right * scaleRatio, aabb.max[1] + top * scaleRatio, aabb.max[2]]\n        );\n\n        const centerOffset = (typeof options.offset.x === 'number' && typeof options.offset.y === 'number') ?\n            new Point(options.offset.x, options.offset.y) :\n            Point.convert(options.offset);\n\n        const rotatedOffset = centerOffset.rotate(-degToRad(bearing));\n\n        extendedAABB.center[0] -= rotatedOffset.x * scaleRatio;\n        extendedAABB.center[1] += rotatedOffset.y * scaleRatio;\n\n        return extendedAABB;\n    }\n\n    /** @section {Querying features} */\n\n    /**\n     * Queries the currently loaded data for elevation at a geographical location. The elevation is returned in `meters` relative to mean sea-level.\n     * Returns `null` if `terrain` is disabled or if terrain data for the location hasn't been loaded yet.\n     *\n     * In order to guarantee that the terrain data is loaded ensure that the geographical location is visible and wait for the `idle` event to occur.\n     *\n     * @memberof Map#\n     * @param {LngLatLike} lnglat The geographical location at which to query.\n     * @param {ElevationQueryOptions} [options] Options object.\n     * @param {boolean} [options.exaggerated=true] When `true` returns the terrain elevation with the value of `exaggeration` from the style already applied.\n     * When `false`, returns the raw value of the underlying data without styling applied.\n     * @returns {number | null} The elevation in meters.\n     * @example\n     * const coordinate = [-122.420679, 37.772537];\n     * const elevation = map.queryTerrainElevation(coordinate);\n     * @see [Example: Query terrain elevation](https://docs.mapbox.com/mapbox-gl-js/example/query-terrain-elevation/)\n     */\n    queryTerrainElevation(lnglat: LngLatLike, options: ?ElevationQueryOptions): ?number {\n        const elevation = this.transform.elevation;\n        if (elevation) {\n            options = extend({}, {exaggerated: true}, options);\n            return elevation.getAtPoint(MercatorCoordinate.fromLngLat(lnglat), null, options.exaggerated);\n        }\n        return null;\n    }\n\n    /**\n     * Calculate the center of these two points in the viewport and use\n     * the highest zoom level up to and including `Map#getMaxZoom()` that fits\n     * the points in the viewport at the specified bearing.\n     * @memberof Map#\n     * @param transform The current transform\n     * @param {LngLatLike} p0 First point\n     * @param {LngLatLike} p1 Second point\n     * @param {number} bearing Desired map bearing at end of animation, in degrees\n     * @param {number} pitch Desired map pitch at end of animation, in degrees\n     * @param {CameraOptions | null} options\n     * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds.\n     * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels.\n     * @param {number} [options.maxZoom] The maximum zoom level to allow when the camera would transition to the specified bounds.\n     * @returns {CameraOptions | void} If map is able to fit to provided bounds, returns `CameraOptions` with\n     * `center`, `zoom`, and `bearing`. If map is unable to fit, method will warn and return undefined.\n     * @private\n     * @example\n     * var p0 = [-79, 43];\n     * var p1 = [-73, 45];\n     * var bearing = 90;\n     * var newCameraTransform = map._cameraForBounds(p0, p1, bearing, pitch, {\n     *   padding: {top: 10, bottom:25, left: 15, right: 5}\n     * });\n     */\n    _cameraForBounds(transform: Transform, p0: LngLatLike, p1: LngLatLike, bearing: number, pitch: number, options?: CameraOptions): ?EasingOptions {\n        if (transform.projection.name === 'globe') {\n            return this._cameraForBoundsOnGlobe(transform, p0, p1, bearing, pitch, options);\n        }\n\n        const tr = transform.clone();\n        const eOptions = this._extendCameraOptions(options);\n\n        tr.bearing = bearing;\n        tr.pitch = pitch;\n\n        const coord0 = LngLat.convert(p0);\n        const coord1 = LngLat.convert(p1);\n        const coord2 = new LngLat(coord0.lng, coord1.lat);\n        const coord3 = new LngLat(coord1.lng, coord0.lat);\n\n        const p0world = tr.project(coord0);\n        const p1world = tr.project(coord1);\n\n        const z0 = this.queryTerrainElevation(coord0);\n        const z1 = this.queryTerrainElevation(coord1);\n        const z2 = this.queryTerrainElevation(coord2);\n        const z3 = this.queryTerrainElevation(coord3);\n\n        const worldCoords = [\n            [p0world.x, p0world.y, Math.min(z0 || 0, z1 || 0, z2 || 0, z3 || 0)],\n            [p1world.x, p1world.y, Math.max(z0 || 0, z1 || 0, z2 || 0, z3 || 0)]\n        ];\n\n        let aabb = Aabb.fromPoints(worldCoords);\n\n        const worldToCamera = tr.getWorldToCameraMatrix();\n        const cameraToWorld = mat4.invert(new Float64Array(16), worldToCamera);\n\n        aabb = Aabb.applyTransform(aabb, worldToCamera);\n        const extendedAabb = this._extendAABB(aabb, tr, eOptions, bearing);\n        if (!extendedAabb) {\n            warnOnce('Map cannot fit within canvas with the given bounds, padding, and/or offset.');\n            return;\n        }\n\n        aabb = extendedAabb;\n        const size = vec3.sub([], aabb.max, aabb.min);\n        const aabbHalfExtentZ = size[2] * 0.5;\n        const frustumDistance = this._minimumAABBFrustumDistance(tr, aabb);\n\n        const normalZ = [0, 0, 1, 0];\n\n        vec4.transformMat4(normalZ, normalZ, worldToCamera);\n        vec4.normalize(normalZ, normalZ);\n\n        const offset = vec3.scale([], normalZ, frustumDistance + aabbHalfExtentZ);\n        const cameraPosition = vec3.add([], aabb.center, offset);\n\n        vec3.transformMat4(aabb.center, aabb.center, cameraToWorld);\n        vec3.transformMat4(cameraPosition, cameraPosition, cameraToWorld);\n\n        const mercator = [aabb.center[0], aabb.center[1], cameraPosition[2] * tr.pixelsPerMeter];\n        vec3.scale(mercator, mercator, 1.0 / tr.worldSize);\n\n        const lng = lngFromMercatorX(mercator[0]);\n        const lat = latFromMercatorY(mercator[1]);\n\n        const zoom = Math.min(tr._zoomFromMercatorZ(mercator[2]), eOptions.maxZoom);\n        const center = new LngLat(lng, lat);\n\n        const halfZoomTransition = (GLOBE_ZOOM_THRESHOLD_MIN + GLOBE_ZOOM_THRESHOLD_MAX) * 0.5;\n\n        if (tr.mercatorFromTransition && zoom < halfZoomTransition) {\n            tr.setProjection({name: 'globe'});\n            tr.zoom = zoom;\n            return this._cameraForBounds(tr, p0, p1, bearing, pitch, options);\n        }\n\n        return {center, zoom, bearing, pitch};\n    }\n\n    /**\n     * Pans and zooms the map to contain its visible area within the specified geographical bounds.\n     * If a padding is set on the map, the bounds are fit to the inset.\n     *\n     * @memberof Map#\n     * @param {LngLatBoundsLike} bounds Center these bounds in the viewport and use the highest\n     * zoom level up to and including `Map#getMaxZoom()` that fits them in the viewport.\n     * @param {Object} [options] Options supports all properties from {@link AnimationOptions} and {@link CameraOptions} in addition to the fields below.\n     * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds.\n     * @param {number} [options.pitch=0] Desired map pitch at end of animation, in degrees.\n     * @param {number} [options.bearing=0] Desired map bearing at end of animation, in degrees.\n     * @param {boolean} [options.linear=false] If `true`, the map transitions using\n     * {@link Map#easeTo}. If `false`, the map transitions using {@link Map#flyTo}. See\n     * those functions and {@link AnimationOptions} for information about options available.\n     * @param {Function} [options.easing] An easing function for the animated transition. See {@link AnimationOptions}.\n     * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels.\n     * @param {number} [options.maxZoom] The maximum zoom level to allow when the map view transitions to the specified bounds.\n     * @param {Object} [eventData] Additional properties to be added to event objects of events triggered by this method.\n     * @fires Map.event:movestart\n     * @fires Map.event:moveend\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * const bbox = [[-79, 43], [-73, 45]];\n     * map.fitBounds(bbox, {\n     *     padding: {top: 10, bottom:25, left: 15, right: 5}\n     * });\n     * @see [Example: Fit a map to a bounding box](https://www.mapbox.com/mapbox-gl-js/example/fitbounds/)\n     */\n    fitBounds(bounds: LngLatBoundsLike, options?: EasingOptions, eventData?: Object): this {\n        const cameraPlacement = this.cameraForBounds(bounds, options);\n        return this._fitInternal(cameraPlacement, options, eventData);\n    }\n\n    /**\n     * Pans, rotates and zooms the map to to fit the box made by points p0 and p1\n     * once the map is rotated to the specified bearing. To zoom without rotating,\n     * pass in the current map bearing.\n     *\n     * @memberof Map#\n     * @param {PointLike} p0 First point on screen, in pixel coordinates.\n     * @param {PointLike} p1 Second point on screen, in pixel coordinates.\n     * @param {number} bearing Desired map bearing at end of animation, in degrees.\n     * @param {EasingOptions | null} options Options object.\n     * Accepts {@link CameraOptions} and {@link AnimationOptions}.\n     * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds.\n     * @param {boolean} [options.linear=false] If `true`, the map transitions using\n     * {@link Map#easeTo}. If `false`, the map transitions using {@link Map#flyTo}. See\n     * those functions and {@link AnimationOptions} for information about options available.\n     * @param {number} [options.pitch=0] Desired map pitch at end of animation, in degrees.\n     * @param {Function} [options.easing] An easing function for the animated transition. See {@link AnimationOptions}.\n     * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels.\n     * @param {number} [options.maxZoom] The maximum zoom level to allow when the map view transitions to the specified bounds.\n     * @param {Object | null} eventData Additional properties to be added to event objects of events triggered by this method.\n     * @fires Map.event:movestart\n     * @fires Map.event:moveend\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * const p0 = [220, 400];\n     * const p1 = [500, 900];\n     * map.fitScreenCoordinates(p0, p1, map.getBearing(), {\n     *     padding: {top: 10, bottom:25, left: 15, right: 5}\n     * });\n     * @see Used by {@link BoxZoomHandler}\n     */\n    fitScreenCoordinates(p0: PointLike, p1: PointLike, bearing: number, options?: EasingOptions, eventData?: Object): this {\n        const screen0 = Point.convert(p0);\n        const screen1 = Point.convert(p1);\n\n        const min = new Point(Math.min(screen0.x, screen1.x), Math.min(screen0.y, screen1.y));\n        const max = new Point(Math.max(screen0.x, screen1.x), Math.max(screen0.y, screen1.y));\n\n        if (this.transform.projection.name === 'mercator' && this.transform.anyCornerOffEdge(screen0, screen1)) {\n            return this;\n        }\n\n        const lnglat0 = this.transform.pointLocation3D(min);\n        const lnglat1 = this.transform.pointLocation3D(max);\n        const lnglat2 = this.transform.pointLocation3D(new Point(min.x, max.y));\n        const lnglat3 = this.transform.pointLocation3D(new Point(max.x, min.y));\n\n        const p0coord = [\n            Math.min(lnglat0.lng, lnglat1.lng, lnglat2.lng, lnglat3.lng),\n            Math.min(lnglat0.lat, lnglat1.lat, lnglat2.lat, lnglat3.lat),\n        ];\n        const p1coord =  [\n            Math.max(lnglat0.lng, lnglat1.lng, lnglat2.lng, lnglat3.lng),\n            Math.max(lnglat0.lat, lnglat1.lat, lnglat2.lat, lnglat3.lat),\n        ];\n\n        const pitch = options && options.pitch ? options.pitch : this.getPitch();\n\n        const cameraPlacement = this._cameraForBounds(this.transform, p0coord, p1coord, bearing, pitch, options);\n        return this._fitInternal(cameraPlacement, options, eventData);\n    }\n\n    _fitInternal(calculatedOptions?: ?EasingOptions, options?: EasingOptions, eventData?: Object): this {\n        // cameraForBounds warns + returns undefined if unable to fit:\n        if (!calculatedOptions) return this;\n\n        options = extend(calculatedOptions, options);\n\n        return options.linear ?\n            this.easeTo(options, eventData) :\n            this.flyTo(options, eventData);\n    }\n\n    /**\n     * Changes any combination of center, zoom, bearing, and pitch, without\n     * an animated transition. The map will retain its current values for any\n     * details not specified in `options`.\n     *\n     * @memberof Map#\n     * @param {CameraOptions} options Options object.\n     * @param {Object | null} eventData Additional properties to be added to event objects of events triggered by this method.\n     * @fires Map.event:movestart\n     * @fires Map.event:zoomstart\n     * @fires Map.event:pitchstart\n     * @fires Map.event:rotate\n     * @fires Map.event:move\n     * @fires Map.event:zoom\n     * @fires Map.event:pitch\n     * @fires Map.event:moveend\n     * @fires Map.event:zoomend\n     * @fires Map.event:pitchend\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * // jump to coordinates at current zoom\n     * map.jumpTo({center: [0, 0]});\n     * // jump with zoom, pitch, and bearing options\n     * map.jumpTo({\n     *     center: [0, 0],\n     *     zoom: 8,\n     *     pitch: 45,\n     *     bearing: 90\n     * });\n     * @see [Example: Jump to a series of locations](https://docs.mapbox.com/mapbox-gl-js/example/jump-to/)\n     * @see [Example: Update a feature in realtime](https://docs.mapbox.com/mapbox-gl-js/example/live-update-feature/)\n     */\n    jumpTo(options: CameraOptions & {preloadOnly?: $PropertyType<AnimationOptions, 'preloadOnly'>}, eventData?: Object): this {\n        this.stop();\n\n        const tr = options.preloadOnly ? this.transform.clone() : this.transform;\n        let zoomChanged = false,\n            bearingChanged = false,\n            pitchChanged = false;\n\n        if ('zoom' in options && tr.zoom !== +options.zoom) {\n            zoomChanged = true;\n            tr.zoom = +options.zoom;\n        }\n\n        if (options.center !== undefined) {\n            tr.center = LngLat.convert(options.center);\n        }\n\n        if ('bearing' in options && tr.bearing !== +options.bearing) {\n            bearingChanged = true;\n            tr.bearing = +options.bearing;\n        }\n\n        if ('pitch' in options && tr.pitch !== +options.pitch) {\n            pitchChanged = true;\n            tr.pitch = +options.pitch;\n        }\n\n        if (options.padding != null && !tr.isPaddingEqual(options.padding)) {\n            // $FlowFixMe[incompatible-type] - Flow can't infer that padding is not null here\n            tr.padding = options.padding;\n        }\n\n        if (options.preloadOnly) {\n            this._preloadTiles(tr);\n            return this;\n        }\n\n        this.fire(new Event('movestart', eventData))\n            .fire(new Event('move', eventData));\n\n        if (zoomChanged) {\n            this.fire(new Event('zoomstart', eventData))\n                .fire(new Event('zoom', eventData))\n                .fire(new Event('zoomend', eventData));\n        }\n\n        if (bearingChanged) {\n            this.fire(new Event('rotatestart', eventData))\n                .fire(new Event('rotate', eventData))\n                .fire(new Event('rotateend', eventData));\n        }\n\n        if (pitchChanged) {\n            this.fire(new Event('pitchstart', eventData))\n                .fire(new Event('pitch', eventData))\n                .fire(new Event('pitchend', eventData));\n        }\n\n        return this.fire(new Event('moveend', eventData));\n    }\n\n    /**\n     * Returns position and orientation of the camera entity.\n     *\n     * This method is not supported for projections other than mercator.\n     *\n     * @memberof Map#\n     * @returns {FreeCameraOptions} The camera state.\n     * @example\n     * const camera = map.getFreeCameraOptions();\n     *\n     * const position = [138.72649, 35.33974];\n     * const altitude = 3000;\n     *\n     * camera.position = mapboxgl.MercatorCoordinate.fromLngLat(position, altitude);\n     * camera.lookAtPoint([138.73036, 35.36197]);\n     *\n     * map.setFreeCameraOptions(camera);\n     */\n    getFreeCameraOptions(): FreeCameraOptions {\n        if (!this.transform.projection.supportsFreeCamera) {\n            warnOnce(freeCameraNotSupportedWarning);\n        }\n        return this.transform.getFreeCameraOptions();\n    }\n\n    /**\n     * `FreeCameraOptions` provides more direct access to the underlying camera entity.\n     * For backwards compatibility the state set using this API must be representable with\n     * `CameraOptions` as well. Parameters are clamped into a valid range or discarded as invalid\n     * if the conversion to the pitch and bearing presentation is ambiguous. For example orientation\n     * can be invalid if it leads to the camera being upside down, the quaternion has zero length,\n     * or the pitch is over the maximum pitch limit.\n     *\n     * This method is not supported for projections other than mercator.\n     *\n     * @memberof Map#\n     * @param {FreeCameraOptions} options `FreeCameraOptions` object.\n     * @param {Object | null} eventData Additional properties to be added to event objects of events triggered by this method.\n     * @fires Map.event:movestart\n     * @fires Map.event:zoomstart\n     * @fires Map.event:pitchstart\n     * @fires Map.event:rotate\n     * @fires Map.event:move\n     * @fires Map.event:zoom\n     * @fires Map.event:pitch\n     * @fires Map.event:moveend\n     * @fires Map.event:zoomend\n     * @fires Map.event:pitchend\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * const camera = map.getFreeCameraOptions();\n     *\n     * const position = [138.72649, 35.33974];\n     * const altitude = 3000;\n     *\n     * camera.position = mapboxgl.MercatorCoordinate.fromLngLat(position, altitude);\n     * camera.lookAtPoint([138.73036, 35.36197]);\n     *\n     * map.setFreeCameraOptions(camera);\n     */\n    setFreeCameraOptions(options: FreeCameraOptions, eventData?: Object): this {\n        const tr = this.transform;\n\n        if (!tr.projection.supportsFreeCamera) {\n            warnOnce(freeCameraNotSupportedWarning);\n            return this;\n        }\n\n        this.stop();\n\n        const prevZoom = tr.zoom;\n        const prevPitch = tr.pitch;\n        const prevBearing = tr.bearing;\n\n        tr.setFreeCameraOptions(options);\n\n        const zoomChanged = prevZoom !== tr.zoom;\n        const pitchChanged = prevPitch !== tr.pitch;\n        const bearingChanged = prevBearing !== tr.bearing;\n\n        this.fire(new Event('movestart', eventData))\n            .fire(new Event('move', eventData));\n\n        if (zoomChanged) {\n            this.fire(new Event('zoomstart', eventData))\n                .fire(new Event('zoom', eventData))\n                .fire(new Event('zoomend', eventData));\n        }\n\n        if (bearingChanged) {\n            this.fire(new Event('rotatestart', eventData))\n                .fire(new Event('rotate', eventData))\n                .fire(new Event('rotateend', eventData));\n        }\n\n        if (pitchChanged) {\n            this.fire(new Event('pitchstart', eventData))\n                .fire(new Event('pitch', eventData))\n                .fire(new Event('pitchend', eventData));\n        }\n\n        this.fire(new Event('moveend', eventData));\n        return this;\n    }\n\n    /**\n     * Changes any combination of `center`, `zoom`, `bearing`, `pitch`, and `padding` with an animated transition\n     * between old and new values. The map will retain its current values for any\n     * details not specified in `options`.\n     *\n     * Note: The transition will happen instantly if the user has enabled\n     * the `reduced motion` accessibility feature enabled in their operating system,\n     * unless `options` includes `essential: true`.\n     *\n     * @memberof Map#\n     * @param {EasingOptions} options Options describing the destination and animation of the transition.\n     * Accepts {@link CameraOptions} and {@link AnimationOptions}.\n     * @param {Object | null} eventData Additional properties to be added to event objects of events triggered by this method.\n     * @fires Map.event:movestart\n     * @fires Map.event:zoomstart\n     * @fires Map.event:pitchstart\n     * @fires Map.event:rotate\n     * @fires Map.event:move\n     * @fires Map.event:zoom\n     * @fires Map.event:pitch\n     * @fires Map.event:moveend\n     * @fires Map.event:zoomend\n     * @fires Map.event:pitchend\n     * @returns {Map} `this` Returns itself to allow for method chaining.\n     * @example\n     * // Ease with default options to null island for 5 seconds.\n     * map.easeTo({center: [0, 0], zoom: 9, duration: 5000});\n     * @example\n     * // Using easeTo options.\n     * map.easeTo({\n     *     center: [0, 0],\n     *     zoom: 9,\n     *     speed: 0.2,\n     *     curve: 1,\n     *     duration: 5000,\n     *     easing(t) {\n     *         return t;\n     *     }\n     * });\n     * @see [Example: Navigate the map with game-like controls](https://www.mapbox.com/mapbox-gl-js/example/game-controls/)\n     */\n    easeTo(options: EasingOptions & {easeId?: string}, eventData?: Object): this {\n        this._stop(false, options.easeId);\n\n        options = extend({\n            offset: [0, 0],\n            duration: 500,\n            easing: defaultEasing\n        }, options);\n\n        if (options.animate === false || this._prefersReducedMotion(options)) options.duration = 0;\n\n        const tr = this.transform,\n            startZoom = this.getZoom(),\n            startBearing = this.getBearing(),\n            startPitch = this.getPitch(),\n            startPadding = this.getPadding(),\n\n            zoom = 'zoom' in options ? +options.zoom : startZoom,\n            bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing,\n            pitch = 'pitch' in options ? +options.pitch : startPitch,\n            padding = this._extendPadding(options.padding);\n\n        const offsetAsPoint = Point.convert(options.offset);\n\n        let pointAtOffset;\n        let from;\n        let delta;\n\n        if (tr.projection.name === 'globe') {\n            // Pixel coordinates will be applied directly to translate the globe\n            const centerCoord = MercatorCoordinate.fromLngLat(tr.center);\n\n            const rotatedOffset = offsetAsPoint.rotate(-tr.angle);\n            centerCoord.x += rotatedOffset.x / tr.worldSize;\n            centerCoord.y += rotatedOffset.y / tr.worldSize;\n\n            const locationAtOffset = centerCoord.toLngLat();\n            const center = LngLat.convert(options.center || locationAtOffset);\n            this._normalizeCenter(center);\n\n            pointAtOffset = tr.centerPoint.add(rotatedOffset);\n            from = new Point(centerCoord.x, centerCoord.y).mult(tr.worldSize);\n            delta = new Point(mercatorXfromLng(center.lng), mercatorYfromLat(center.lat)).mult(tr.worldSize).sub(from);\n        } else {\n            pointAtOffset = tr.centerPoint.add(offsetAsPoint);\n            const locationAtOffset = tr.pointLocation(pointAtOffset);\n            const center = LngLat.convert(options.center || locationAtOffset);\n            this._normalizeCenter(center);\n\n            from = tr.project(locationAtOffset);\n            delta = tr.project(center).sub(from);\n        }\n        const finalScale = tr.zoomScale(zoom - startZoom);\n\n        let around, aroundPoint;\n\n        if (options.around) {\n            around = LngLat.convert(options.around);\n            aroundPoint = tr.locationPoint(around);\n        }\n\n        const zoomChanged = this._zooming || (zoom !== startZoom);\n        const bearingChanged = this._rotating || (startBearing !== bearing);\n        const pitchChanged = this._pitching || (pitch !== startPitch);\n        const paddingChanged = !tr.isPaddingEqual(padding);\n\n        const frame = (tr: Transform) => (k: number) => {\n            if (zoomChanged) {\n                tr.zoom = interpolate(startZoom, zoom, k);\n            }\n            if (bearingChanged) {\n                tr.bearing = interpolate(startBearing, bearing, k);\n            }\n            if (pitchChanged) {\n                tr.pitch = interpolate(startPitch, pitch, k);\n            }\n            if (paddingChanged) {\n                tr.interpolatePadding(startPadding, padding, k);\n                // When padding is being applied, Transform#centerPoint is changing continuously,\n                // thus we need to recalculate offsetPoint every fra,e\n                pointAtOffset = tr.centerPoint.add(offsetAsPoint);\n            }\n\n            if (around) {\n                tr.setLocationAtPoint(around, aroundPoint);\n            } else {\n                const scale = tr.zoomScale(tr.zoom - startZoom);\n                const base = zoom > startZoom ?\n                    Math.min(2, finalScale) :\n                    Math.max(0.5, finalScale);\n                const speedup = Math.pow(base, 1 - k);\n                const newCenter = tr.unproject(from.add(delta.mult(k * speedup)).mult(scale));\n                tr.setLocationAtPoint(tr.renderWorldCopies ? newCenter.wrap() : newCenter, pointAtOffset);\n            }\n\n            if (!options.preloadOnly) {\n                this._fireMoveEvents(eventData);\n            }\n\n            return tr;\n        };\n\n        if (options.preloadOnly) {\n            const predictedTransforms = this._emulate(frame, options.duration, tr);\n            this._preloadTiles(predictedTransforms);\n            return this;\n        }\n\n        const currently = {\n            moving: this._moving,\n            zooming: this._zooming,\n            rotating: this._rotating,\n            pitching: this._pitching\n        };\n\n        this._zooming = zoomChanged;\n        this._rotating = bearingChanged;\n        this._pitching = pitchChanged;\n        this._padding = paddingChanged;\n\n        this._easeId = options.easeId;\n        this._prepareEase(eventData, options.noMoveStart, currently);\n\n        this._ease(frame(tr), (interruptingEaseId?: string) => {\n            if (tr.cameraElevationReference === \"sea\") tr.recenterOnTerrain();\n            this._afterEase(eventData, interruptingEaseId);\n        }, options);\n\n        return this;\n    }\n\n    _prepareEase(eventData?: Object, noMoveStart: boolean, currently: Object = {}) {\n        this._moving = true;\n        this.transform.cameraElevationReference = \"sea\";\n        if (this.transform._orthographicProjectionAtLowPitch && this.transform.pitch  === 0 && this.transform.projection.name !== 'globe') {\n            // Run easeTo on ground elevation reference. EaseTo is otherwise always on sea elevation reference,\n            // triggering changes in center to camera distance and bumpy camera movement for ortho mode.\n            this.transform.cameraElevationReference = \"ground\";\n        }\n\n        if (!noMoveStart && !currently.moving) {\n            this.fire(new Event('movestart', eventData));\n        }\n        if (this._zooming && !currently.zooming) {\n            this.fire(new Event('zoomstart', eventData));\n        }\n        if (this._rotating && !currently.rotating) {\n            this.fire(new Event('rotatestart', eventData));\n        }\n        if (this._pitching && !currently.pitching) {\n            this.fire(new Event('pitchstart', eventData));\n        }\n    }\n\n    _fireMoveEvents(eventData?: Object) {\n        this.fire(new Event('move', eventData));\n        if (this._zooming) {\n            this.fire(new Event('zoom', eventData));\n        }\n        if (this._rotating) {\n            this.fire(new Event('rotate', eventData));\n        }\n        if (this._pitching) {\n            this.fire(new Event('pitch', eventData));\n        }\n    }\n\n    _afterEase(eventData?: Object, easeId?: string) {\n        // if this easing is being stopped to start another easing with\n        // the same id then don't fire any events to avoid extra start/stop events\n        if (this._easeId && easeId && this._easeId === easeId) {\n            return;\n        }\n        this._easeId = undefined;\n        this.transform.cameraElevationReference = \"ground\";\n\n        const wasZooming = this._zooming;\n        const wasRotating = this._rotating;\n        const wasPitching = this._pitching;\n        this._moving = false;\n        this._zooming = false;\n        this._rotating = false;\n        this._pitching = false;\n        this._padding = false;\n\n        if (wasZooming) {\n            this.fire(new Event('zoomend', eventData));\n        }\n        if (wasRotating) {\n            this.fire(new Event('rotateend', eventData));\n        }\n        if (wasPitching) {\n            this.fire(new Event('pitchend', eventData));\n        }\n        this.fire(new Event('moveend', eventData));\n    }\n\n    /**\n     * Changes any combination of center, zoom, bearing, and pitch, animating the transition along a curve that\n     * evokes flight. The animation seamlessly incorporates zooming and panning to help\n     * the user maintain their bearings even after traversing a great distance.\n     *\n     * If a user has the `reduced motion` accessibility feature enabled in their\n     * operating system, the animation will be skipped and this will behave\n     * equivalently to `jumpTo`, unless 'options' includes `essential: true`.\n     *\n     * @memberof Map#\n     * @param {Object} options Options describing the destination and animation of the transition.\n     * Accepts {@link CameraOptions}, {@link AnimationOptions},\n     * and the following additional options.\n     * @param {number} [options.curve=1.42] The zooming \"curve\" that will occur along the\n     * flight path. A high value maximizes zooming for an exaggerated animation, while a low\n     * value minimizes zooming for an effect closer to {@link Map#easeTo}. 1.42 is the average\n     * value selected by participants in the user study discussed in\n     * [van Wijk (2003)](https://www.win.tue.nl/~vanwijk/zoompan.pdf). A value of\n     * `Math.pow(6, 0.25)` would be equivalent to the root mean squared average velocity. A\n     * value of 1 would produce a circular motion. If `options.minZoom` is specified, this option will be ignored.\n     * @param {number} [options.minZoom] The zero-based zoom level at the peak of the flight path. If\n     * this option is specified, `options.curve` will be ignored.\n     * @param {number} [options.speed=1.2] The average speed of the animation defined in relation to\n     * `options.curve`. A speed of 1.2 means that the map appears to move along the flight path\n     * by 1.2 times `options.curve` screenfuls every second. A _screenful_ is the map's visible span.\n     * It does not correspond to a fixed physical distance, but varies by zoom level.\n     * @param {number} [options.screenSpeed] The average speed of the animation measured in screenfuls\n     * per second, assuming a linear timing curve. If `options.speed` is specified, this option is ignored.\n     * @param {number} [options.maxDuration] The animation's maximum duration, measured in milliseconds.\n     * If duration exceeds maximum duration, it resets to 0.\n     * @param {Object | null} eventData Additional properties to be added to event objects of events triggered by this method.\n     * @fires Map.event:movestart\n     * @fires Map.event:zoomstart\n     * @fires Map.event:pitchstart\n     * @fires Map.event:move\n     * @fires Map.event:zoom\n     * @fires Map.event:rotate\n     * @fires Map.event:pitch\n     * @fires Map.event:moveend\n     * @fires Map.event:zoomend\n     * @fires Map.event:pitchend\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * // fly with default options to null island\n     * map.flyTo({center: [0, 0], zoom: 9});\n     * // using flyTo options\n     * map.flyTo({\n     *     center: [0, 0],\n     *     zoom: 9,\n     *     speed: 0.2,\n     *     curve: 1,\n     *     easing(t) {\n     *         return t;\n     *     }\n     * });\n     * @see [Example: Fly to a location](https://www.mapbox.com/mapbox-gl-js/example/flyto/)\n     * @see [Example: Slowly fly to a location](https://www.mapbox.com/mapbox-gl-js/example/flyto-options/)\n     * @see [Example: Fly to a location based on scroll position](https://www.mapbox.com/mapbox-gl-js/example/scroll-fly-to/)\n     */\n    flyTo(options: EasingOptions, eventData?: Object): this {\n        // Fall through to jumpTo if user has set prefers-reduced-motion\n        if (this._prefersReducedMotion(options)) {\n            const coercedOptions = pick(options, ['center', 'zoom', 'bearing', 'pitch', 'around']);\n            return this.jumpTo(coercedOptions, eventData);\n        }\n\n        // This method implements an “optimal path” animation, as detailed in:\n        //\n        // Van Wijk, Jarke J.; Nuij, Wim A. A. “Smooth and efficient zooming and panning.” INFOVIS\n        //   ’03. pp. 15–22. <https://www.win.tue.nl/~vanwijk/zoompan.pdf#page=5>.\n        //\n        // Where applicable, local variable documentation begins with the associated variable or\n        // function in van Wijk (2003).\n\n        this.stop();\n\n        options = extend({\n            offset: [0, 0],\n            speed: 1.2,\n            curve: 1.42,\n            easing: defaultEasing\n        }, options);\n\n        const tr = this.transform,\n            startZoom = this.getZoom(),\n            startBearing = this.getBearing(),\n            startPitch = this.getPitch(),\n            startPadding = this.getPadding();\n\n        const zoom = 'zoom' in options ? clamp(+options.zoom, tr.minZoom, tr.maxZoom) : startZoom;\n        const bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing;\n        const pitch = 'pitch' in options ? +options.pitch : startPitch;\n        const padding = this._extendPadding(options.padding);\n\n        const scale = tr.zoomScale(zoom - startZoom);\n        const offsetAsPoint = Point.convert(options.offset);\n        let pointAtOffset = tr.centerPoint.add(offsetAsPoint);\n        const locationAtOffset = tr.pointLocation(pointAtOffset);\n        const center = LngLat.convert(options.center || locationAtOffset);\n        this._normalizeCenter(center);\n\n        const from = tr.project(locationAtOffset);\n        const delta = tr.project(center).sub(from);\n\n        let rho = options.curve;\n\n        // w₀: Initial visible span, measured in pixels at the initial scale.\n        const w0 = Math.max(tr.width, tr.height),\n            // w₁: Final visible span, measured in pixels with respect to the initial scale.\n            w1 = w0 / scale,\n            // Length of the flight path as projected onto the ground plane, measured in pixels from\n            // the world image origin at the initial scale.\n            u1 = delta.mag();\n\n        if ('minZoom' in options) {\n            const minZoom = clamp(Math.min(options.minZoom, startZoom, zoom), tr.minZoom, tr.maxZoom);\n            // w<sub>m</sub>: Maximum visible span, measured in pixels with respect to the initial\n            // scale.\n            const wMax = w0 / tr.zoomScale(minZoom - startZoom);\n            rho = Math.sqrt(wMax / u1 * 2);\n        }\n\n        // ρ²\n        const rho2 = rho * rho;\n\n        /**\n         * rᵢ: Returns the zoom-out factor at one end of the animation.\n         *\n         * @param i 0 for the ascent or 1 for the descent.\n         * @private\n         */\n        function r(i: number) {\n            const b = (w1 * w1 - w0 * w0 + (i ? -1 : 1) * rho2 * rho2 * u1 * u1) / (2 * (i ? w1 : w0) * rho2 * u1);\n            return Math.log(Math.sqrt(b * b + 1) - b);\n        }\n\n        function sinh(n: number) { return (Math.exp(n) - Math.exp(-n)) / 2; }\n        function cosh(n: number) { return (Math.exp(n) + Math.exp(-n)) / 2; }\n        function tanh(n: number) { return sinh(n) / cosh(n); }\n\n        // r₀: Zoom-out factor during ascent.\n        const r0 = r(0);\n\n        // w(s): Returns the visible span on the ground, measured in pixels with respect to the\n        // initial scale. Assumes an angular field of view of 2 arctan ½ ≈ 53°.\n        let w: (_: number) => number = function (s) {\n            return (cosh(r0) / cosh(r0 + rho * s));\n        };\n\n        // u(s): Returns the distance along the flight path as projected onto the ground plane,\n        // measured in pixels from the world image origin at the initial scale.\n        let u: (_: number) => number = function (s) {\n            return w0 * ((cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2) / u1;\n        };\n\n        // S: Total length of the flight path, measured in ρ-screenfuls.\n        let S = (r(1) - r0) / rho;\n\n        // When u₀ = u₁, the optimal path doesn’t require both ascent and descent.\n        if (Math.abs(u1) < 0.000001 || !isFinite(S)) {\n            // Perform a more or less instantaneous transition if the path is too short.\n            if (Math.abs(w0 - w1) < 0.000001) return this.easeTo(options, eventData);\n\n            const k = w1 < w0 ? -1 : 1;\n            S = Math.abs(Math.log(w1 / w0)) / rho;\n\n            u = function() { return 0; };\n            w = function(s) { return Math.exp(k * rho * s); };\n        }\n\n        if ('duration' in options) {\n            options.duration = +options.duration;\n        } else {\n            const V = 'screenSpeed' in options ? +options.screenSpeed / rho : +options.speed;\n            options.duration = 1000 * S / V;\n        }\n\n        if (options.maxDuration && options.duration > options.maxDuration) {\n            options.duration = 0;\n        }\n\n        const zoomChanged = true;\n        const bearingChanged = (startBearing !== bearing);\n        const pitchChanged = (pitch !== startPitch);\n        const paddingChanged = !tr.isPaddingEqual(padding);\n\n        const frame = (tr: Transform) => (k: number) => {\n            // s: The distance traveled along the flight path, measured in ρ-screenfuls.\n            const s = k * S;\n            const scale = 1 / w(s);\n            tr.zoom = k === 1 ? zoom : startZoom + tr.scaleZoom(scale);\n\n            if (bearingChanged) {\n                tr.bearing = interpolate(startBearing, bearing, k);\n            }\n            if (pitchChanged) {\n                tr.pitch = interpolate(startPitch, pitch, k);\n            }\n            if (paddingChanged) {\n                tr.interpolatePadding(startPadding, padding, k);\n                // When padding is being applied, Transform#centerPoint is changing continuously,\n                // thus we need to recalculate offsetPoint every frame\n                pointAtOffset = tr.centerPoint.add(offsetAsPoint);\n            }\n\n            const newCenter = k === 1 ? center : tr.unproject(from.add(delta.mult(u(s))).mult(scale));\n            tr.setLocationAtPoint(tr.renderWorldCopies ? newCenter.wrap() : newCenter, pointAtOffset);\n            tr._updateCameraOnTerrain();\n\n            if (!options.preloadOnly) {\n                this._fireMoveEvents(eventData);\n            }\n\n            return tr;\n        };\n\n        if (options.preloadOnly) {\n            const predictedTransforms = this._emulate(frame, options.duration, tr);\n            this._preloadTiles(predictedTransforms);\n            return this;\n        }\n\n        this._zooming = zoomChanged;\n        this._rotating = bearingChanged;\n        this._pitching = pitchChanged;\n        this._padding = paddingChanged;\n\n        this._prepareEase(eventData, false);\n        this._ease(frame(tr), () => this._afterEase(eventData), options);\n\n        return this;\n    }\n\n    isEasing(): boolean {\n        return !!this._easeFrameId;\n    }\n\n    /**\n     * Stops any animated transition underway.\n     *\n     * @memberof Map#\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * map.stop();\n     */\n    stop(): this {\n        return this._stop();\n    }\n\n    // $FlowFixMe[incompatible-return] - No-op in the Camera class, implemented by the Map class\n    _requestRenderFrame(_callback: () => void): TaskID {}\n\n    // No-op in the Camera class, implemented by the Map class\n    _cancelRenderFrame(_: TaskID): void {}\n\n    _stop(allowGestures?: boolean, easeId?: string): this {\n        if (this._easeFrameId) {\n            this._cancelRenderFrame(this._easeFrameId);\n            this._easeFrameId = undefined;\n            this._onEaseFrame = undefined;\n        }\n\n        if (this._onEaseEnd) {\n            // The _onEaseEnd function might emit events which trigger new\n            // animation, which sets a new _onEaseEnd. Ensure we don't delete\n            // it unintentionally.\n            const onEaseEnd = this._onEaseEnd;\n            this._onEaseEnd = undefined;\n            onEaseEnd.call(this, easeId);\n        }\n        if (!allowGestures) {\n            const handlers = (this: any).handlers;\n            if (handlers) handlers.stop(false);\n        }\n        return this;\n    }\n\n    _ease(frame: (_: number) => Transform | void,\n          finish: () => void,\n          options: {animate: boolean, duration: number, easing: (_: number) => number}) {\n        if (options.animate === false || options.duration === 0) {\n            frame(1);\n            finish();\n        } else {\n            this._easeStart = browser.now();\n            this._easeOptions = options;\n            this._onEaseFrame = frame;\n            this._onEaseEnd = finish;\n            // $FlowFixMe[method-unbinding]\n            this._easeFrameId = this._requestRenderFrame(this._renderFrameCallback);\n        }\n    }\n\n    // Callback for map._requestRenderFrame\n    _renderFrameCallback() {\n        const t = Math.min((browser.now() - this._easeStart) / this._easeOptions.duration, 1);\n        const frame = this._onEaseFrame;\n        if (frame) frame(this._easeOptions.easing(t));\n        if (t < 1) {\n            // $FlowFixMe[method-unbinding]\n            this._easeFrameId = this._requestRenderFrame(this._renderFrameCallback);\n        } else {\n            this.stop();\n        }\n    }\n\n    // convert bearing so that it's numerically close to the current one so that it interpolates properly\n    _normalizeBearing(bearing: number, currentBearing: number): number {\n        bearing = wrap(bearing, -180, 180);\n        const diff = Math.abs(bearing - currentBearing);\n        if (Math.abs(bearing - 360 - currentBearing) < diff) bearing -= 360;\n        if (Math.abs(bearing + 360 - currentBearing) < diff) bearing += 360;\n        return bearing;\n    }\n\n    // If a path crossing the antimeridian would be shorter, extend the final coordinate so that\n    // interpolating between the two endpoints will cross it.\n    _normalizeCenter(center: LngLat) {\n        const tr = this.transform;\n        if (tr.maxBounds) return;\n        const isGlobe = tr.projection.name === 'globe';\n        if (!isGlobe && !tr.renderWorldCopies) return;\n\n        const delta = center.lng - tr.center.lng;\n        center.lng +=\n            delta > 180 ? -360 :\n            delta < -180 ? 360 : 0;\n    }\n\n    _prefersReducedMotion(options: ?AnimationOptions): boolean {\n        const essential = options && options.essential;\n        const prefersReducedMotion = this._respectPrefersReducedMotion && browser.prefersReducedMotion;\n        return prefersReducedMotion && !essential;\n    }\n\n    // emulates frame function for some transform\n    _emulate(frame: Function, duration: number, initialTransform: Transform): Array<Transform> {\n        const frameRate = 15;\n        const numFrames = Math.ceil(duration * frameRate / 1000);\n\n        const transforms = [];\n        const emulateFrame = frame(initialTransform.clone());\n        for (let i = 0; i <= numFrames; i++) {\n            const transform = emulateFrame(i / numFrames);\n            transforms.push(transform.clone());\n        }\n\n        return transforms;\n    }\n\n    // No-op in the Camera class, implemented by the Map class\n    _preloadTiles(_transform: Transform | Array<Transform>, _callback?: Callback<any>): any {}\n}\n\n// In debug builds, check that camera change events are fired in the correct order.\n// - ___start events needs to be fired before ___ and ___end events\n// - another ___start event can't be fired before a ___end event has been fired for the previous one\nfunction addAssertions(camera: Camera) { //eslint-disable-line\n    Debug.run(() => {\n        const inProgress = {};\n\n        ['drag', 'zoom', 'rotate', 'pitch', 'move'].forEach(name => {\n            inProgress[name] = false;\n\n            camera.on(((`${name}start`: any): MapEvent), () => {\n                assert(!inProgress[name], `\"${name}start\" fired twice without a \"${name}end\"`);\n                inProgress[name] = true;\n                assert(inProgress.move);\n            });\n\n            camera.on(name, () => {\n                assert(inProgress[name]);\n                assert(inProgress.move);\n            });\n\n            camera.on(((`${name}end`: any): MapEvent), () => {\n                assert(inProgress.move);\n                assert(inProgress[name]);\n                inProgress[name] = false;\n            });\n        });\n\n        // Canary used to test whether this function is stripped in prod build\n        canary = 'canary debug run'; //eslint-disable-line\n    });\n}\n\nlet canary; //eslint-disable-line\n\nexport default Camera;\n","// @flow\n\nimport * as DOM from '../../util/dom.js';\nimport {bindAll} from '../../util/util.js';\nimport config from '../../util/config.js';\nimport {getHashString} from '../hash.js';\n\nimport type {Map, ControlPosition} from '../map.js';\n\ntype Options = {\n    compact?: boolean,\n    customAttribution?: ?string | ?Array<string>\n};\n\n/**\n * An `AttributionControl` control presents the map's [attribution information](https://docs.mapbox.com/help/how-mapbox-works/attribution/).\n * Add this control to a map using {@link Map#addControl}.\n *\n * @implements {IControl}\n * @param {Object} [options]\n * @param {boolean} [options.compact] If `true`, force a compact attribution that shows the full attribution on mouse hover. If `false`, force the full attribution control. The default is a responsive attribution that collapses when the map is less than 640 pixels wide. **Attribution should not be collapsed if it can comfortably fit on the map. `compact` should only be used to modify default attribution when map size makes it impossible to fit [default attribution](https://docs.mapbox.com/help/how-mapbox-works/attribution/) and when the automatic compact resizing for default settings are not sufficient**.\n * @param {string | Array<string>} [options.customAttribution] String or strings to show in addition to any other attributions. You can also set a custom attribution when initializing your map with {@link https://docs.mapbox.com/mapbox-gl-js/api/map/#map-parameters the customAttribution option}.\n * @example\n * const map = new mapboxgl.Map({attributionControl: false})\n *     .addControl(new mapboxgl.AttributionControl({\n *         customAttribution: 'Map design by me'\n *     }));\n */\nclass AttributionControl {\n    options: Options;\n    _map: Map;\n    _container: HTMLElement;\n    _innerContainer: HTMLElement;\n    _compactButton: HTMLButtonElement;\n    _editLink: ?HTMLAnchorElement;\n    _attribHTML: string;\n    styleId: string;\n    styleOwner: string;\n\n    constructor(options: Options = {}) {\n        this.options = options;\n\n        bindAll([\n            '_toggleAttribution',\n            '_updateEditLink',\n            '_updateData',\n            '_updateCompact'\n        ], this);\n    }\n\n    getDefaultPosition(): ControlPosition {\n        return 'bottom-right';\n    }\n\n    onAdd(map: Map): HTMLElement {\n        const compact = this.options && this.options.compact;\n\n        this._map = map;\n        this._container = DOM.create('div', 'mapboxgl-ctrl mapboxgl-ctrl-attrib');\n        this._compactButton = DOM.create('button', 'mapboxgl-ctrl-attrib-button', this._container);\n        DOM.create('span', `mapboxgl-ctrl-icon`, this._compactButton).setAttribute('aria-hidden', 'true');\n        this._compactButton.type = 'button';\n        // $FlowFixMe[method-unbinding]\n        this._compactButton.addEventListener('click', this._toggleAttribution);\n        this._setElementTitle(this._compactButton, 'ToggleAttribution');\n        this._innerContainer = DOM.create('div', 'mapboxgl-ctrl-attrib-inner', this._container);\n\n        if (compact) {\n            this._container.classList.add('mapboxgl-compact');\n        }\n\n        this._updateAttributions();\n        this._updateEditLink();\n\n        // $FlowFixMe[method-unbinding]\n        this._map.on('styledata', this._updateData);\n        // $FlowFixMe[method-unbinding]\n        this._map.on('sourcedata', this._updateData);\n        // $FlowFixMe[method-unbinding]\n        this._map.on('moveend', this._updateEditLink);\n\n        if (compact === undefined) {\n            // $FlowFixMe[method-unbinding]\n            this._map.on('resize', this._updateCompact);\n            this._updateCompact();\n        }\n\n        return this._container;\n    }\n\n    onRemove() {\n        this._container.remove();\n\n        // $FlowFixMe[method-unbinding]\n        this._map.off('styledata', this._updateData);\n        // $FlowFixMe[method-unbinding]\n        this._map.off('sourcedata', this._updateData);\n        // $FlowFixMe[method-unbinding]\n        this._map.off('moveend', this._updateEditLink);\n        // $FlowFixMe[method-unbinding]\n        this._map.off('resize', this._updateCompact);\n\n        this._map = (undefined: any);\n        this._attribHTML = (undefined: any);\n    }\n\n    _setElementTitle(element: HTMLElement, title: string) {\n        const str = this._map._getUIString(`AttributionControl.${title}`);\n        element.removeAttribute('title');\n        if (element.firstElementChild) element.firstElementChild.setAttribute('title', str);\n    }\n\n    _toggleAttribution() {\n        if (this._container.classList.contains('mapboxgl-compact-show')) {\n            this._container.classList.remove('mapboxgl-compact-show');\n            this._compactButton.setAttribute('aria-expanded', 'false');\n        } else {\n            this._container.classList.add('mapboxgl-compact-show');\n            this._compactButton.setAttribute('aria-expanded', 'true');\n        }\n    }\n\n    _updateEditLink() {\n        let editLink = this._editLink;\n        if (!editLink) {\n            editLink = this._editLink = (this._container.querySelector('.mapbox-improve-map'): any);\n        }\n\n        const params = [\n            {key: 'owner', value: this.styleOwner},\n            {key: 'id', value: this.styleId},\n            {key: 'access_token', value: this._map._requestManager._customAccessToken || config.ACCESS_TOKEN}\n        ];\n\n        if (editLink) {\n            const paramString = params.reduce((acc, next, i) => {\n                if (next.value) {\n                    acc += `${next.key}=${next.value}${i < params.length - 1 ? '&' : ''}`;\n                }\n                return acc;\n            }, `?`);\n            editLink.href = `${config.FEEDBACK_URL}/${paramString}#${getHashString(this._map, true)}`;\n            editLink.rel = 'noopener nofollow';\n            this._setElementTitle(editLink, 'MapFeedback');\n        }\n    }\n\n    _updateData(e: any) {\n        if (e && (e.sourceDataType === 'metadata' || e.sourceDataType === 'visibility' || e.dataType === 'style')) {\n            this._updateAttributions();\n            this._updateEditLink();\n        }\n    }\n\n    _updateAttributions() {\n        if (!this._map.style) return;\n        let attributions: Array<string> = [];\n\n        if (this._map.style.stylesheet) {\n            const stylesheet: any = this._map.style.stylesheet;\n            this.styleOwner = stylesheet.owner;\n            this.styleId = stylesheet.id;\n        }\n\n        const sourceCaches = this._map.style._mergedSourceCaches;\n        for (const id in sourceCaches) {\n            const sourceCache = sourceCaches[id];\n            if (sourceCache.used) {\n                const source = sourceCache.getSource();\n                if (source.attribution && attributions.indexOf(source.attribution) < 0) {\n                    // $FlowFixMe[incompatible-call] - Flow can't infer that attribution is a string\n                    attributions.push(source.attribution);\n                }\n            }\n        }\n\n        // remove any entries that are substrings of another entry.\n        // first sort by length so that substrings come first\n        attributions.sort((a, b) => a.length - b.length);\n        attributions = attributions.filter((attrib, i) => {\n            for (let j = i + 1; j < attributions.length; j++) {\n                if (attributions[j].indexOf(attrib) >= 0) { return false; }\n            }\n            return true;\n        });\n\n        if (this.options.customAttribution) {\n            if (Array.isArray(this.options.customAttribution)) {\n                attributions = [...this.options.customAttribution, ...attributions];\n            } else {\n                attributions.unshift(this.options.customAttribution);\n            }\n        }\n\n        // check if attribution string is different to minimize DOM changes\n        const attribHTML = attributions.join(' | ');\n        if (attribHTML === this._attribHTML) return;\n\n        this._attribHTML = attribHTML;\n\n        if (attributions.length) {\n            this._innerContainer.innerHTML = attribHTML;\n            this._container.classList.remove('mapboxgl-attrib-empty');\n        } else {\n            this._container.classList.add('mapboxgl-attrib-empty');\n        }\n        // remove old DOM node from _editLink\n        this._editLink = null;\n    }\n\n    _updateCompact() {\n        if (this._map.getCanvasContainer().offsetWidth <= 640) {\n            this._container.classList.add('mapboxgl-compact');\n        } else {\n            this._container.classList.remove('mapboxgl-compact', 'mapboxgl-compact-show');\n        }\n    }\n\n}\n\nexport default AttributionControl;\n","// @flow\n\nimport * as DOM from '../../util/dom.js';\nimport {bindAll} from '../../util/util.js';\n\nimport type {Map, ControlPosition} from '../map.js';\n\n/**\n * A `LogoControl` is a control that adds the Mapbox watermark\n * to the map as required by the [terms of service](https://www.mapbox.com/tos/) for Mapbox\n * vector tiles and core styles.\n * Add this control to a map using {@link Map#addControl}.\n *\n * @implements {IControl}\n * @private\n**/\n\nclass LogoControl {\n    _map: Map;\n    _container: HTMLElement;\n\n    constructor() {\n        bindAll(['_updateLogo', '_updateCompact'], this);\n    }\n\n    onAdd(map: Map): HTMLElement {\n        this._map = map;\n        this._container = DOM.create('div', 'mapboxgl-ctrl');\n        const anchor = DOM.create('a', 'mapboxgl-ctrl-logo');\n        anchor.target = \"_blank\";\n        anchor.rel = \"noopener nofollow\";\n        anchor.href = \"https://www.mapbox.com/\";\n        anchor.setAttribute(\"aria-label\", this._map._getUIString('LogoControl.Title'));\n        anchor.setAttribute(\"rel\", \"noopener nofollow\");\n        this._container.appendChild(anchor);\n        this._container.style.display = 'none';\n\n        // $FlowFixMe[method-unbinding]\n        this._map.on('sourcedata', this._updateLogo);\n        this._updateLogo();\n\n        // $FlowFixMe[method-unbinding]\n        this._map.on('resize', this._updateCompact);\n        this._updateCompact();\n\n        return this._container;\n    }\n\n    onRemove() {\n        this._container.remove();\n        // $FlowFixMe[method-unbinding]\n        this._map.off('sourcedata', this._updateLogo);\n        // $FlowFixMe[method-unbinding]\n        this._map.off('resize', this._updateCompact);\n    }\n\n    getDefaultPosition(): ControlPosition {\n        return 'bottom-left';\n    }\n\n    _updateLogo(e: any) {\n        if (!e || e.sourceDataType === 'metadata') {\n            this._container.style.display = this._logoRequired() ? 'block' : 'none';\n        }\n    }\n\n    _logoRequired(): boolean {\n        if (!this._map.style) return true;\n        const sourceCaches = this._map.style._sourceCaches;\n        if (Object.entries(sourceCaches).length === 0) return true;\n        for (const id in sourceCaches) {\n            const source = sourceCaches[id].getSource();\n            if (source.hasOwnProperty('mapbox_logo') && !source.mapbox_logo) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    _updateCompact() {\n        const containerChildren = this._container.children;\n        if (containerChildren.length) {\n            const anchor = containerChildren[0];\n            if (this._map.getCanvasContainer().offsetWidth < 250) {\n                anchor.classList.add('mapboxgl-compact');\n            } else {\n                anchor.classList.remove('mapboxgl-compact');\n            }\n        }\n    }\n\n}\n\nexport default LogoControl;\n","// @flow strict\nimport assert from 'assert';\n\nexport type TaskID = number; // can't mark opaque due to https://github.com/flowtype/flow-remove-types/pull/61\ntype Task = {\n    callback: (timeStamp: number) => void;\n    id: TaskID;\n    cancelled: boolean;\n};\n\nclass TaskQueue {\n    _queue: Array<Task>;\n    _id: TaskID;\n    _cleared: boolean;\n    _currentlyRunning: Array<Task> | false;\n\n    constructor()  {\n        this._queue = [];\n        this._id = 0;\n        this._cleared = false;\n        this._currentlyRunning = false;\n    }\n\n    add(callback: (timeStamp: number) => void): TaskID {\n        const id = ++this._id;\n        const queue = this._queue;\n        queue.push({callback, id, cancelled: false});\n        return id;\n    }\n\n    remove(id: TaskID) {\n        const running = this._currentlyRunning;\n        const queue = running ? this._queue.concat(running) : this._queue;\n        for (const task of queue) {\n            if (task.id === id) {\n                task.cancelled = true;\n                return;\n            }\n        }\n    }\n\n    run(timeStamp: number = 0) {\n        assert(!this._currentlyRunning);\n        const queue = this._currentlyRunning = this._queue;\n\n        // Tasks queued by callbacks in the current queue should be executed\n        // on the next run, not the current run.\n        this._queue = [];\n\n        for (const task of queue) {\n            if (task.cancelled) continue;\n            task.callback(timeStamp);\n            if (this._cleared) break;\n        }\n\n        this._cleared = false;\n        this._currentlyRunning = false;\n    }\n\n    clear() {\n        if (this._currentlyRunning) {\n            this._cleared = true;\n        }\n        this._queue = [];\n    }\n}\n\nexport default TaskQueue;\n","// @flow\n\nimport LngLat from '../geo/lng_lat.js';\n\nimport type Point from '@mapbox/point-geometry';\nimport type Transform from '../geo/transform.js';\n\n/**\n * Given a LngLat, prior projected position, and a transform, return a new LngLat shifted\n * n × 360° east or west for some n ≥ 0 such that:\n *\n * * the projected location of the result is on screen, if possible, and secondarily:\n * * the difference between the projected location of the result and the prior position\n *   is minimized.\n *\n * The object is to preserve perceived object constancy for Popups and Markers as much as\n * possible; they should avoid shifting large distances across the screen, even when the\n * map center changes by ±360° due to automatic wrapping, and when about to go off screen,\n * should wrap just enough to avoid doing so.\n *\n * @private\n */\nexport default function(lngLat: LngLat, priorPos: ?Point, transform: Transform): LngLat {\n    lngLat = new LngLat(lngLat.lng, lngLat.lat);\n\n    // First, try shifting one world in either direction, and see if either is closer to the\n    // prior position. Don't shift away if it new position is further from center.\n    // This preserves object constancy when the map center is auto-wrapped during animations,\n    // but don't allow it to run away on horizon (points towards horizon get closer and closer).\n    if (priorPos) {\n        const left  = new LngLat(lngLat.lng - 360, lngLat.lat);\n        const right = new LngLat(lngLat.lng + 360, lngLat.lat);\n        // Unless offscreen, keep the marker within same wrap distance to center. This is to prevent\n        // running it to infinity `lng` near horizon when bearing is ~90°.\n        const withinWrap =  Math.ceil(Math.abs(lngLat.lng - transform.center.lng) / 360) * 360;\n        const delta = transform.locationPoint(lngLat).distSqr(priorPos);\n        const offscreen = priorPos.x < 0 || priorPos.y < 0 || priorPos.x > transform.width || priorPos.y > transform.height;\n        if (transform.locationPoint(left).distSqr(priorPos) < delta && (offscreen || Math.abs(left.lng - transform.center.lng) < withinWrap)) {\n            lngLat = left;\n        } else if (transform.locationPoint(right).distSqr(priorPos) < delta && (offscreen || Math.abs(right.lng - transform.center.lng) < withinWrap)) {\n            lngLat = right;\n        }\n    }\n\n    // Second, wrap toward the center until the new position is on screen, or we can't get\n    // any closer.\n    while (Math.abs(lngLat.lng - transform.center.lng) > 180) {\n        const pos = transform.locationPoint(lngLat);\n        if (pos.x >= 0 && pos.y >= 0 && pos.x <= transform.width && pos.y <= transform.height) {\n            break;\n        }\n        if (lngLat.lng > transform.center.lng) {\n            lngLat.lng -= 360;\n        } else {\n            lngLat.lng += 360;\n        }\n    }\n\n    return lngLat;\n}\n","// @flow\n\nexport type Anchor =\n    | 'center'\n    | 'top'\n    | 'bottom'\n    | 'left'\n    | 'right'\n    | 'top-left'\n    | 'top-right'\n    | 'bottom-left'\n    | 'bottom-right';\n\nexport const anchorTranslate: {[_: Anchor]: string} = {\n    'center': 'translate(-50%,-50%)',\n    'top': 'translate(-50%,0)',\n    'top-left': 'translate(0,0)',\n    'top-right': 'translate(-100%,0)',\n    'bottom': 'translate(-50%,-100%)',\n    'bottom-left': 'translate(0,-100%)',\n    'bottom-right': 'translate(-100%,-100%)',\n    'left': 'translate(0,-50%)',\n    'right': 'translate(-100%,-50%)'\n};\n","// @flow\n\nimport * as DOM from '../util/dom.js';\nimport LngLat from '../geo/lng_lat.js';\nimport Point from '@mapbox/point-geometry';\nimport smartWrap from '../util/smart_wrap.js';\nimport {bindAll, extend, radToDeg, smoothstep} from '../util/util.js';\nimport {type Anchor, anchorTranslate} from './anchor.js';\nimport {Event, Evented} from '../util/evented.js';\nimport type {Map} from './map.js';\nimport type Popup from './popup.js';\nimport type {LngLatLike} from \"../geo/lng_lat.js\";\nimport type {MapMouseEvent, MapTouchEvent} from './events.js';\nimport type {PointLike} from '../types/point-like.js';\nimport {GLOBE_ZOOM_THRESHOLD_MAX} from '../geo/projection/globe_constants.js';\nimport {globeTiltAtLngLat, globeCenterToScreenPoint, isLngLatBehindGlobe} from '../geo/projection/globe_util.js';\nimport assert from 'assert';\n\ntype Options = {\n    element?: HTMLElement,\n    offset?: PointLike,\n    anchor?: Anchor,\n    color?: string,\n    scale?: number,\n    draggable?: boolean,\n    clickTolerance?: number,\n    rotation?: number,\n    rotationAlignment?: string,\n    pitchAlignment?: string,\n    occludedOpacity?: number,\n    className?: string\n};\n\n/**\n * Creates a marker component.\n *\n * @param {Object} [options]\n * @param {HTMLElement} [options.element] DOM element to use as a marker. The default is a light blue, droplet-shaped SVG marker.\n * @param {string} [options.anchor='center'] A string indicating the part of the Marker that should be positioned closest to the coordinate set via {@link Marker#setLngLat}.\n * Options are `'center'`, `'top'`, `'bottom'`, `'left'`, `'right'`, `'top-left'`, `'top-right'`, `'bottom-left'`, and `'bottom-right'`.\n * @param {PointLike} [options.offset] The offset in pixels as a {@link PointLike} object to apply relative to the element's center. Negatives indicate left and up.\n * @param {string} [options.color='#3FB1CE'] The color to use for the default marker if `options.element` is not provided. The default is light blue.\n * @param {number} [options.scale=1] The scale to use for the default marker if `options.element` is not provided. The default scale corresponds to a height of `41px` and a width of `27px`.\n * @param {boolean} [options.draggable=false] A boolean indicating whether or not a marker is able to be dragged to a new position on the map.\n * @param {number} [options.clickTolerance=0] The max number of pixels a user can shift the mouse pointer during a click on the marker for it to be considered a valid click (as opposed to a marker drag). The default is to inherit map's `clickTolerance`.\n * @param {number} [options.rotation=0] The rotation angle of the marker in degrees, relative to its respective `rotationAlignment` setting. A positive value will rotate the marker clockwise.\n * @param {string} [options.pitchAlignment='auto'] `'map'` aligns the `Marker` to the plane of the map. `'viewport'` aligns the `Marker` to the plane of the viewport. `'auto'` automatically matches the value of `rotationAlignment`.\n * @param {string} [options.rotationAlignment='auto'] The alignment of the marker's rotation.`'map'` is aligned with the map plane, consistent with the cardinal directions as the map rotates. `'viewport'` is screenspace-aligned. `'horizon'` is aligned according to the nearest horizon, on non-globe projections it is equivalent to `'viewport'`. `'auto'` is equivalent to `'viewport'`.\n * @param {number} [options.occludedOpacity=0.2] The opacity of a marker that's occluded by 3D terrain.\n * @param {string} [options.className] Space-separated CSS class names to add to marker element.\n * @example\n * // Create a new marker.\n * const marker = new mapboxgl.Marker()\n *     .setLngLat([30.5, 50.5])\n *     .addTo(map);\n * @example\n * // Set marker options.\n * const marker = new mapboxgl.Marker({\n *     color: \"#FFFFFF\",\n *     draggable: true\n * }).setLngLat([30.5, 50.5])\n *     .addTo(map);\n * @see [Example: Add custom icons with Markers](https://www.mapbox.com/mapbox-gl-js/example/custom-marker-icons/)\n * @see [Example: Create a draggable Marker](https://www.mapbox.com/mapbox-gl-js/example/drag-a-marker/)\n */\nexport default class Marker extends Evented {\n    _map: ?Map;\n    _anchor: Anchor;\n    _offset: Point;\n    _element: HTMLElement;\n    _popup: ?Popup;\n    _lngLat: LngLat;\n    _pos: ?Point;\n    _color: string;\n    _scale: number;\n    _defaultMarker: boolean;\n    _draggable: boolean;\n    _clickTolerance: number;\n    _isDragging: boolean;\n    _state: 'inactive' | 'pending' | 'active'; // used for handling drag events\n    _positionDelta: ?Point;\n    _pointerdownPos: ?Point;\n    _rotation: number;\n    _pitchAlignment: string;\n    _rotationAlignment: string;\n    _originalTabIndex: ?string; // original tabindex of _element\n    _fadeTimer: ?TimeoutID;\n    _updateFrameId: AnimationFrameID;\n    _updateMoving: () => void;\n    _occludedOpacity: number;\n\n    constructor(options?: Options, legacyOptions?: Options) {\n        super();\n        // For backward compatibility -- the constructor used to accept the element as a\n        // required first argument, before it was made optional.\n        if (options instanceof HTMLElement || legacyOptions) {\n            options = extend({element: options}, legacyOptions);\n        }\n\n        bindAll([\n            '_update',\n            '_onMove',\n            '_onUp',\n            '_addDragHandler',\n            '_onMapClick',\n            '_onKeyPress',\n            '_clearFadeTimer'\n        ], this);\n\n        this._anchor = (options && options.anchor) || 'center';\n        this._color = (options && options.color) || '#3FB1CE';\n        this._scale = (options && options.scale) || 1;\n        this._draggable = (options && options.draggable) || false;\n        this._clickTolerance = (options && options.clickTolerance) || 0;\n        this._isDragging = false;\n        this._state = 'inactive';\n        this._rotation = (options && options.rotation) || 0;\n        this._rotationAlignment = (options && options.rotationAlignment) || 'auto';\n        this._pitchAlignment = (options && options.pitchAlignment && options.pitchAlignment) || 'auto';\n        this._updateMoving = () => this._update(true);\n        this._occludedOpacity = (options && options.occludedOpacity) || 0.2;\n\n        if (!options || !options.element) {\n            this._defaultMarker = true;\n            this._element = DOM.create('div');\n\n            // create default map marker SVG\n\n            const DEFAULT_HEIGHT = 41;\n            const DEFAULT_WIDTH = 27;\n\n            const svg = DOM.createSVG('svg', {\n                display: 'block',\n                height: `${DEFAULT_HEIGHT * this._scale}px`,\n                width: `${DEFAULT_WIDTH * this._scale}px`,\n                viewBox: `0 0 ${DEFAULT_WIDTH} ${DEFAULT_HEIGHT}`\n            }, this._element);\n\n            const gradient = DOM.createSVG('radialGradient', {id: 'shadowGradient'}, DOM.createSVG('defs', {}, svg));\n            DOM.createSVG('stop', {offset: '10%', 'stop-opacity': 0.4}, gradient);\n            DOM.createSVG('stop', {offset: '100%', 'stop-opacity': 0.05}, gradient);\n            DOM.createSVG('ellipse', {cx: 13.5, cy: 34.8, rx: 10.5, ry: 5.25, fill: 'url(#shadowGradient)'}, svg); // shadow\n\n            DOM.createSVG('path', { // marker shape\n                fill: this._color,\n                d: 'M27,13.5C27,19.07 20.25,27 14.75,34.5C14.02,35.5 12.98,35.5 12.25,34.5C6.75,27 0,19.22 0,13.5C0,6.04 6.04,0 13.5,0C20.96,0 27,6.04 27,13.5Z'\n            }, svg);\n            DOM.createSVG('path', { // border\n                opacity: 0.25,\n                d: 'M13.5,0C6.04,0 0,6.04 0,13.5C0,19.22 6.75,27 12.25,34.5C13,35.52 14.02,35.5 14.75,34.5C20.25,27 27,19.07 27,13.5C27,6.04 20.96,0 13.5,0ZM13.5,1C20.42,1 26,6.58 26,13.5C26,15.9 24.5,19.18 22.22,22.74C19.95,26.3 16.71,30.14 13.94,33.91C13.74,34.18 13.61,34.32 13.5,34.44C13.39,34.32 13.26,34.18 13.06,33.91C10.28,30.13 7.41,26.31 5.02,22.77C2.62,19.23 1,15.95 1,13.5C1,6.58 6.58,1 13.5,1Z'\n            }, svg);\n\n            DOM.createSVG('circle', {fill: 'white', cx: 13.5, cy: 13.5, r: 5.5}, svg); // circle\n\n            // if no element and no offset option given apply an offset for the default marker\n            // the -14 as the y value of the default marker offset was determined as follows\n            //\n            // the marker tip is at the center of the shadow ellipse from the default svg\n            // the y value of the center of the shadow ellipse relative to the svg top left is 34.8\n            // offset to the svg center \"height (41 / 2)\" gives 34.8 - (41 / 2) and rounded for an integer pixel offset gives 14\n            // negative is used to move the marker up from the center so the tip is at the Marker lngLat\n            this._offset = Point.convert((options && options.offset) || [0, -14]);\n        } else {\n            this._element = options.element;\n            this._offset = Point.convert((options && options.offset) || [0, 0]);\n        }\n\n        if (!this._element.hasAttribute('aria-label')) {\n            this._element.setAttribute('aria-label', 'Map marker');\n        }\n\n        if (!this._element.hasAttribute('role')) {\n            this._element.setAttribute('role', 'img');\n        }\n\n        this._element.classList.add('mapboxgl-marker');\n        this._element.addEventListener('dragstart', (e: DragEvent) => {\n            e.preventDefault();\n        });\n        this._element.addEventListener('mousedown', (e: MouseEvent) => {\n            // prevent focusing on click\n            e.preventDefault();\n        });\n        const classList = this._element.classList;\n        for (const key in anchorTranslate) {\n            classList.remove(`mapboxgl-marker-anchor-${key}`);\n        }\n        classList.add(`mapboxgl-marker-anchor-${this._anchor}`);\n        const classNames = options && options.className ? options.className.trim().split(/\\s+/) : [];\n        classList.add(...classNames);\n\n        this._popup = null;\n    }\n\n    /**\n     * Attaches the `Marker` to a `Map` object.\n     *\n     * @param {Map} map The Mapbox GL JS map to add the marker to.\n     * @returns {Marker} Returns itself to allow for method chaining.\n     * @example\n     * const marker = new mapboxgl.Marker()\n     *     .setLngLat([30.5, 50.5])\n     *     .addTo(map); // add the marker to the map\n     */\n    addTo(map: Map): this {\n        if (map === this._map) {\n            return this;\n        }\n        this.remove();\n        this._map = map;\n        map.getCanvasContainer().appendChild(this._element);\n        map.on('move', this._updateMoving);\n        // $FlowFixMe[method-unbinding]\n        map.on('moveend', this._update);\n        // $FlowFixMe[method-unbinding]\n        map.on('remove', this._clearFadeTimer);\n        map._addMarker(this);\n        this.setDraggable(this._draggable);\n        this._update();\n\n        // If we attached the `click` listener to the marker element, the popup\n        // would close once the event propogated to `map` due to the\n        // `Popup#_onClickClose` listener.\n        // $FlowFixMe[method-unbinding]\n        map.on('click', this._onMapClick);\n\n        return this;\n    }\n\n    /**\n     * Removes the marker from a map.\n     *\n     * @example\n     * const marker = new mapboxgl.Marker().addTo(map);\n     * marker.remove();\n     * @returns {Marker} Returns itself to allow for method chaining.\n     */\n    remove(): this {\n        const map = this._map;\n        if (map) {\n            // $FlowFixMe[method-unbinding]\n            map.off('click', this._onMapClick);\n            map.off('move', this._updateMoving);\n            // $FlowFixMe[method-unbinding]\n            map.off('moveend', this._update);\n            // $FlowFixMe[method-unbinding]\n            map.off('mousedown', this._addDragHandler);\n            // $FlowFixMe[method-unbinding]\n            map.off('touchstart', this._addDragHandler);\n            // $FlowFixMe[method-unbinding]\n            map.off('mouseup', this._onUp);\n            // $FlowFixMe[method-unbinding]\n            map.off('touchend', this._onUp);\n            // $FlowFixMe[method-unbinding]\n            map.off('mousemove', this._onMove);\n            // $FlowFixMe[method-unbinding]\n            map.off('touchmove', this._onMove);\n            // $FlowFixMe[method-unbinding]\n            map.off('remove', this._clearFadeTimer);\n            map._removeMarker(this);\n            this._map = undefined;\n        }\n        this._clearFadeTimer();\n        this._element.remove();\n        if (this._popup) this._popup.remove();\n        return this;\n    }\n\n    /**\n     * Get the marker's geographical location.\n     *\n     * The longitude of the result may differ by a multiple of 360 degrees from the longitude previously\n     * set by `setLngLat` because `Marker` wraps the anchor longitude across copies of the world to keep\n     * the marker on screen.\n     *\n     * @returns {LngLat} A {@link LngLat} describing the marker's location.\n    * @example\n    * // Store the marker's longitude and latitude coordinates in a variable\n    * const lngLat = marker.getLngLat();\n    * // Print the marker's longitude and latitude values in the console\n    * console.log(`Longitude: ${lngLat.lng}, Latitude: ${lngLat.lat}`);\n    * @see [Example: Create a draggable Marker](https://docs.mapbox.com/mapbox-gl-js/example/drag-a-marker/)\n    */\n    getLngLat(): LngLat {\n        return this._lngLat;\n    }\n\n    /**\n    * Set the marker's geographical position and move it.\n     *\n    * @param {LngLat} lnglat A {@link LngLat} describing where the marker should be located.\n    * @returns {Marker} Returns itself to allow for method chaining.\n    * @example\n    * // Create a new marker, set the longitude and latitude, and add it to the map.\n    * new mapboxgl.Marker()\n    *     .setLngLat([-65.017, -16.457])\n    *     .addTo(map);\n    * @see [Example: Add custom icons with Markers](https://docs.mapbox.com/mapbox-gl-js/example/custom-marker-icons/)\n    * @see [Example: Create a draggable Marker](https://docs.mapbox.com/mapbox-gl-js/example/drag-a-marker/)\n    * @see [Example: Add a marker using a place name](https://docs.mapbox.com/mapbox-gl-js/example/marker-from-geocode/)\n    */\n    setLngLat(lnglat: LngLatLike): this {\n        this._lngLat = LngLat.convert(lnglat);\n        this._pos = null;\n        if (this._popup) this._popup.setLngLat(this._lngLat);\n        this._update(true);\n        return this;\n    }\n\n    /**\n     * Returns the `Marker`'s HTML element.\n     *\n     * @returns {HTMLElement} Returns the marker element.\n     * @example\n     * const element = marker.getElement();\n     */\n    getElement(): HTMLElement {\n        return this._element;\n    }\n\n    /**\n     * Binds a {@link Popup} to the {@link Marker}.\n     *\n     * @param {Popup | null} popup An instance of the {@link Popup} class. If undefined or null, any popup\n     * set on this {@link Marker} instance is unset.\n     * @returns {Marker} Returns itself to allow for method chaining.\n     * @example\n     * const marker = new mapboxgl.Marker()\n     *     .setLngLat([0, 0])\n     *     .setPopup(new mapboxgl.Popup().setHTML(\"<h1>Hello World!</h1>\")) // add popup\n     *     .addTo(map);\n     * @see [Example: Attach a popup to a marker instance](https://docs.mapbox.com/mapbox-gl-js/example/set-popup/)\n     */\n    setPopup(popup: ?Popup): this {\n        if (this._popup) {\n            this._popup.remove();\n            this._popup = null;\n            this._element.removeAttribute('role');\n            // $FlowFixMe[method-unbinding]\n            this._element.removeEventListener('keypress', this._onKeyPress);\n\n            if (!this._originalTabIndex) {\n                this._element.removeAttribute('tabindex');\n            }\n        }\n\n        if (popup) {\n            if (!('offset' in popup.options)) {\n                const markerHeight = 41 - (5.8 / 2);\n                const markerRadius = 13.5;\n                const linearOffset = Math.sqrt(Math.pow(markerRadius, 2) / 2);\n                popup.options.offset = this._defaultMarker ? {\n                    'top': [0, 0],\n                    'top-left': [0, 0],\n                    'top-right': [0, 0],\n                    'bottom': [0, -markerHeight],\n                    'bottom-left': [linearOffset, (markerHeight - markerRadius + linearOffset) * -1],\n                    'bottom-right': [-linearOffset, (markerHeight - markerRadius + linearOffset) * -1],\n                    'left': [markerRadius, (markerHeight - markerRadius) * -1],\n                    'right': [-markerRadius, (markerHeight - markerRadius) * -1]\n                } : this._offset;\n            }\n            this._popup = popup;\n            popup._marker = this;\n            if (this._lngLat) this._popup.setLngLat(this._lngLat);\n\n            this._element.setAttribute('role', 'button');\n            this._originalTabIndex = this._element.getAttribute('tabindex');\n            if (!this._originalTabIndex) {\n                this._element.setAttribute('tabindex', '0');\n            }\n            // $FlowFixMe[method-unbinding]\n            this._element.addEventListener('keypress', this._onKeyPress);\n            this._element.setAttribute('aria-expanded', 'false');\n        }\n\n        return this;\n    }\n\n    _onKeyPress(e: KeyboardEvent) {\n        const code = e.code;\n        const legacyCode = e.charCode || e.keyCode;\n\n        if (\n            (code === 'Space') || (code === 'Enter') ||\n            (legacyCode === 32) || (legacyCode === 13) // space or enter\n        ) {\n            this.togglePopup();\n        }\n    }\n\n    _onMapClick(e: MapMouseEvent) {\n        const targetElement = e.originalEvent.target;\n        const element = this._element;\n\n        if (this._popup && (targetElement === element || element.contains((targetElement: any)))) {\n            this.togglePopup();\n        }\n    }\n\n    /**\n     * Returns the {@link Popup} instance that is bound to the {@link Marker}.\n     *\n     * @returns {Popup} Returns the popup.\n     * @example\n     * const marker = new mapboxgl.Marker()\n     *     .setLngLat([0, 0])\n     *     .setPopup(new mapboxgl.Popup().setHTML(\"<h1>Hello World!</h1>\"))\n     *     .addTo(map);\n     *\n     * console.log(marker.getPopup()); // return the popup instance\n     */\n    getPopup(): ?Popup {\n        return this._popup;\n    }\n\n    /**\n     * Opens or closes the {@link Popup} instance that is bound to the {@link Marker}, depending on the current state of the {@link Popup}.\n     *\n     * @returns {Marker} Returns itself to allow for method chaining.\n     * @example\n     * const marker = new mapboxgl.Marker()\n     *     .setLngLat([0, 0])\n     *     .setPopup(new mapboxgl.Popup().setHTML(\"<h1>Hello World!</h1>\"))\n     *     .addTo(map);\n     *\n     * marker.togglePopup(); // toggle popup open or closed\n     */\n    togglePopup(): this {\n        const popup = this._popup;\n        if (!popup) {\n            return this;\n        } else if (popup.isOpen()) {\n            popup.remove();\n            this._element.setAttribute('aria-expanded', 'false');\n        } else if (this._map) {\n            popup.addTo(this._map);\n            this._element.setAttribute('aria-expanded', 'true');\n        }\n        return this;\n    }\n\n    _behindTerrain(): boolean {\n        const map = this._map;\n        const pos = this._pos;\n        if (!map || !pos) return false;\n        const unprojected = map.unproject(pos);\n        const camera = map.getFreeCameraOptions();\n        if (!camera.position) return false;\n        const cameraLngLat = camera.position.toLngLat();\n        const toClosestSurface = cameraLngLat.distanceTo(unprojected);\n        const toMarker = cameraLngLat.distanceTo(this._lngLat);\n        return toClosestSurface < toMarker * 0.9;\n\n    }\n\n    _evaluateOpacity() {\n        const map = this._map;\n        if (!map) return;\n\n        const pos = this._pos;\n\n        if (!pos || pos.x < 0 || pos.x > map.transform.width || pos.y < 0 || pos.y > map.transform.height) {\n            this._clearFadeTimer();\n            return;\n        }\n        const mapLocation = map.unproject(pos);\n        let opacity;\n        if (map._showingGlobe() && isLngLatBehindGlobe(map.transform, this._lngLat)) {\n            opacity = 0;\n        } else {\n            opacity = 1 - map._queryFogOpacity(mapLocation);\n            if (map.transform._terrainEnabled() && map.getTerrain() && this._behindTerrain()) {\n                opacity *= this._occludedOpacity;\n            }\n        }\n\n        this._element.style.opacity = `${opacity}`;\n        this._element.style.pointerEvents = opacity > 0 ? 'auto' : 'none';\n        if (this._popup) {\n            this._popup._setOpacity(opacity);\n        }\n\n        this._fadeTimer = null;\n    }\n\n    _clearFadeTimer() {\n        if (this._fadeTimer) {\n            clearTimeout(this._fadeTimer);\n            this._fadeTimer = null;\n        }\n    }\n\n    _updateDOM() {\n        const pos = this._pos;\n        const map = this._map;\n        if (!pos || !map) { return; }\n\n        const offset = this._offset.mult(this._scale);\n\n        this._element.style.transform = `\n            translate(${pos.x}px,${pos.y}px)\n            ${anchorTranslate[this._anchor]}\n            ${this._calculateXYTransform()} ${this._calculateZTransform()}\n            translate(${offset.x}px,${offset.y}px)\n        `;\n    }\n\n    _calculateXYTransform(): string {\n        const pos = this._pos;\n        const map = this._map;\n        const alignment = this.getPitchAlignment();\n\n        // `viewport', 'auto' and invalid arugments do no pitch transformation.\n        if (!map || !pos || alignment !== 'map') {\n            return ``;\n        }\n        // 'map' alignment on a flat map\n        if (!map._showingGlobe()) {\n            const pitch = map.getPitch();\n            return pitch ? `rotateX(${pitch}deg)` : '';\n        }\n        // 'map' alignment on globe\n        const tilt = radToDeg(globeTiltAtLngLat(map.transform, this._lngLat));\n        const posFromCenter = pos.sub(globeCenterToScreenPoint(map.transform));\n        const manhattanDistance = (Math.abs(posFromCenter.x) + Math.abs(posFromCenter.y));\n        if (manhattanDistance === 0) { return ''; }\n\n        const tiltOverDist =  tilt / manhattanDistance;\n        const yTilt = posFromCenter.x * tiltOverDist;\n        const xTilt = -posFromCenter.y * tiltOverDist;\n        return `rotateX(${xTilt}deg) rotateY(${yTilt}deg)`;\n\n    }\n\n    _calculateZTransform(): string {\n\n        const pos = this._pos;\n        const map = this._map;\n        if (!map || !pos) { return ''; }\n\n        let rotation = 0;\n        const alignment = this.getRotationAlignment();\n        if (alignment === 'map') {\n            if (map._showingGlobe()) {\n                const north = map.project(new LngLat(this._lngLat.lng, this._lngLat.lat + .001));\n                const south = map.project(new LngLat(this._lngLat.lng, this._lngLat.lat - .001));\n                const diff = south.sub(north);\n                rotation = radToDeg(Math.atan2(diff.y, diff.x)) - 90;\n            } else {\n                rotation = -map.getBearing();\n            }\n        } else if (alignment === 'horizon') {\n            const ALIGN_TO_HORIZON_BELOW_ZOOM = 4;\n            const ALIGN_TO_SCREEN_ABOVE_ZOOM = 6;\n            assert(ALIGN_TO_SCREEN_ABOVE_ZOOM <= GLOBE_ZOOM_THRESHOLD_MAX, 'Horizon-oriented marker transition should be complete when globe switches to Mercator');\n            assert(ALIGN_TO_HORIZON_BELOW_ZOOM <= ALIGN_TO_SCREEN_ABOVE_ZOOM);\n\n            const smooth = smoothstep(ALIGN_TO_HORIZON_BELOW_ZOOM, ALIGN_TO_SCREEN_ABOVE_ZOOM, map.getZoom());\n\n            const centerPoint = globeCenterToScreenPoint(map.transform);\n            centerPoint.y += smooth * map.transform.height;\n            const rel = pos.sub(centerPoint);\n            const angle = radToDeg(Math.atan2(rel.y, rel.x));\n            const up = angle > 90 ? angle - 270 : angle + 90;\n            rotation = up * (1 - smooth);\n        }\n\n        rotation += this._rotation;\n        return rotation ? `rotateZ(${rotation}deg)` : '';\n    }\n\n    _update(delaySnap?: boolean) {\n        cancelAnimationFrame(this._updateFrameId);\n        const map = this._map;\n        if (!map) return;\n\n        if (map.transform.renderWorldCopies) {\n            this._lngLat = smartWrap(this._lngLat, this._pos, map.transform);\n        }\n\n        this._pos = map.project(this._lngLat);\n\n        // because rounding the coordinates at every `move` event causes stuttered zooming\n        // we only round them when _update is called with `moveend` or when its called with\n        // no arguments (when the Marker is initialized or Marker#setLngLat is invoked).\n        if (delaySnap === true) {\n            this._updateFrameId = requestAnimationFrame(() => {\n                if (this._element && this._pos && this._anchor) {\n                    this._pos = this._pos.round();\n                    this._updateDOM();\n                }\n            });\n        } else {\n            this._pos = this._pos.round();\n        }\n\n        map._requestDomTask(() => {\n            if (!this._map) return;\n\n            if (this._element && this._pos && this._anchor) {\n                this._updateDOM();\n            }\n\n            if ((map._showingGlobe() || map.getTerrain() || map.getFog()) && !this._fadeTimer) {\n                // $FlowFixMe[method-unbinding]\n                this._fadeTimer = setTimeout(this._evaluateOpacity.bind(this), 60);\n            }\n        });\n    }\n\n    /**\n     * Get the marker's offset.\n     *\n     * @returns {Point} The marker's screen coordinates in pixels.\n     * @example\n     * const offset = marker.getOffset();\n     */\n    getOffset(): Point {\n        return this._offset;\n    }\n\n    /**\n     * Sets the offset of the marker.\n     *\n     * @param {PointLike} offset The offset in pixels as a {@link PointLike} object to apply relative to the element's center. Negatives indicate left and up.\n     * @returns {Marker} Returns itself to allow for method chaining.\n     * @example\n     * marker.setOffset([0, 1]);\n     */\n    setOffset(offset: PointLike): this {\n        this._offset = Point.convert(offset);\n        this._update();\n        return this;\n    }\n\n    /**\n     * Adds a CSS class to the marker element.\n     *\n     * @param {string} className Non-empty string with CSS class name to add to marker element.\n     * @returns {Marker} Returns itself to allow for method chaining.\n     *\n     * @example\n     * const marker = new mapboxgl.Marker();\n     * marker.addClassName('some-class');\n     */\n    addClassName(className: string): this {\n        this._element.classList.add(className);\n        return this;\n    }\n\n    /**\n     * Removes a CSS class from the marker element.\n     *\n     * @param {string} className Non-empty string with CSS class name to remove from marker element.\n     *\n     * @returns {Marker} Returns itself to allow for method chaining.\n     *\n     * @example\n     * const marker = new mapboxgl.Marker({className: 'some classes'});\n     * marker.removeClassName('some');\n     */\n    removeClassName(className: string): this {\n        this._element.classList.remove(className);\n        return this;\n    }\n\n    /**\n     * Add or remove the given CSS class on the marker element, depending on whether the element currently has that class.\n     *\n     * @param {string} className Non-empty string with CSS class name to add/remove.\n     *\n     * @returns {boolean} If the class was removed return `false`. If the class was added, then return `true`.\n     *\n     * @example\n     * const marker = new mapboxgl.Marker();\n     * marker.toggleClassName('highlighted');\n     */\n    toggleClassName(className: string): boolean {\n        return this._element.classList.toggle(className);\n    }\n\n    _onMove(e: MapMouseEvent | MapTouchEvent) {\n        const map = this._map;\n        if (!map) return;\n\n        const startPos = this._pointerdownPos;\n        const posDelta = this._positionDelta;\n        if (!startPos || !posDelta) return;\n\n        if (!this._isDragging) {\n            const clickTolerance = this._clickTolerance || map._clickTolerance;\n            if (e.point.dist(startPos) < clickTolerance) return;\n            this._isDragging = true;\n        }\n\n        this._pos = e.point.sub(posDelta);\n        this._lngLat = map.unproject(this._pos);\n        this.setLngLat(this._lngLat);\n        // suppress click event so that popups don't toggle on drag\n        this._element.style.pointerEvents = 'none';\n\n        // make sure dragstart only fires on the first move event after mousedown.\n        // this can't be on mousedown because that event doesn't necessarily\n        // imply that a drag is about to happen.\n        if (this._state === 'pending') {\n            this._state = 'active';\n\n            /**\n             * Fired when dragging starts.\n             *\n             * @event dragstart\n             * @memberof Marker\n             * @instance\n             * @type {Object}\n             * @property {Marker} marker The object that is being dragged.\n             */\n            this.fire(new Event('dragstart'));\n        }\n\n        /**\n         * Fired while dragging.\n         *\n         * @event drag\n         * @memberof Marker\n         * @instance\n         * @type {Object}\n         * @property {Marker} marker The object that is being dragged.\n         */\n        this.fire(new Event('drag'));\n    }\n\n    _onUp() {\n        // revert to normal pointer event handling\n        this._element.style.pointerEvents = 'auto';\n        this._positionDelta = null;\n        this._pointerdownPos = null;\n        this._isDragging = false;\n\n        const map = this._map;\n        if (map) {\n            // $FlowFixMe[method-unbinding]\n            map.off('mousemove', this._onMove);\n            // $FlowFixMe[method-unbinding]\n            map.off('touchmove', this._onMove);\n        }\n\n        // only fire dragend if it was preceded by at least one drag event\n        if (this._state === 'active') {\n            /**\n            * Fired when the marker is finished being dragged.\n            *\n            * @event dragend\n            * @memberof Marker\n            * @instance\n            * @type {Object}\n            * @property {Marker} marker The object that was dragged.\n            */\n            this.fire(new Event('dragend'));\n        }\n\n        this._state = 'inactive';\n    }\n\n    _addDragHandler(e: MapMouseEvent | MapTouchEvent) {\n        const map = this._map;\n        const pos = this._pos;\n        if (!map || !pos) return;\n\n        if (this._element.contains((e.originalEvent.target: any))) {\n            e.preventDefault();\n\n            // We need to calculate the pixel distance between the click point\n            // and the marker position, with the offset accounted for. Then we\n            // can subtract this distance from the mousemove event's position\n            // to calculate the new marker position.\n            // If we don't do this, the marker 'jumps' to the click position\n            // creating a jarring UX effect.\n            this._positionDelta = e.point.sub(pos);\n            this._pointerdownPos = e.point;\n\n            this._state = 'pending';\n            // $FlowFixMe[method-unbinding]\n            map.on('mousemove', this._onMove);\n            // $FlowFixMe[method-unbinding]\n            map.on('touchmove', this._onMove);\n            // $FlowFixMe[method-unbinding]\n            map.once('mouseup', this._onUp);\n            // $FlowFixMe[method-unbinding]\n            map.once('touchend', this._onUp);\n        }\n    }\n\n    /**\n     * Sets the `draggable` property and functionality of the marker.\n     *\n     * @param {boolean} [shouldBeDraggable=false] Turns drag functionality on/off.\n     * @returns {Marker} Returns itself to allow for method chaining.\n     * @example\n     * marker.setDraggable(true);\n     */\n    setDraggable(shouldBeDraggable: boolean): this {\n        this._draggable = !!shouldBeDraggable; // convert possible undefined value to false\n\n        // handle case where map may not exist yet\n        // for example, when setDraggable is called before addTo\n        const map = this._map;\n        if (map) {\n            if (shouldBeDraggable) {\n                // $FlowFixMe[method-unbinding]\n                map.on('mousedown', this._addDragHandler);\n                // $FlowFixMe[method-unbinding]\n                map.on('touchstart', this._addDragHandler);\n            } else {\n                // $FlowFixMe[method-unbinding]\n                map.off('mousedown', this._addDragHandler);\n                // $FlowFixMe[method-unbinding]\n                map.off('touchstart', this._addDragHandler);\n            }\n        }\n\n        return this;\n    }\n\n    /**\n     * Returns true if the marker can be dragged.\n     *\n     * @returns {boolean} True if the marker is draggable.\n     * @example\n     * const isMarkerDraggable = marker.isDraggable();\n     */\n    isDraggable(): boolean {\n        return this._draggable;\n    }\n\n    /**\n     * Sets the `rotation` property of the marker.\n     *\n     * @param {number} [rotation=0] The rotation angle of the marker (clockwise, in degrees), relative to its respective {@link Marker#setRotationAlignment} setting.\n     * @returns {Marker} Returns itself to allow for method chaining.\n     * @example\n     * marker.setRotation(45);\n     */\n    setRotation(rotation: number): this {\n        this._rotation = rotation || 0;\n        this._update();\n        return this;\n    }\n\n    /**\n     * Returns the current rotation angle of the marker (in degrees).\n     *\n     * @returns {number} The current rotation angle of the marker.\n     * @example\n     * const rotation = marker.getRotation();\n     */\n    getRotation(): number {\n        return this._rotation;\n    }\n\n    /**\n     * Sets the `rotationAlignment` property of the marker.\n     *\n     * @param {string} [alignment='auto'] Sets the `rotationAlignment` property of the marker.\n     * @returns {Marker} Returns itself to allow for method chaining.\n     * @example\n     * marker.setRotationAlignment('viewport');\n     */\n    setRotationAlignment(alignment: string): this {\n        this._rotationAlignment = alignment || 'auto';\n        this._update();\n        return this;\n    }\n\n    /**\n     * Returns the current `rotationAlignment` property of the marker.\n     *\n     * @returns {string} The current rotational alignment of the marker.\n     * @example\n     * const alignment = marker.getRotationAlignment();\n     */\n    getRotationAlignment(): string {\n        if (this._rotationAlignment === 'auto')\n            return 'viewport';\n        if (this._rotationAlignment === 'horizon' && this._map && !this._map._showingGlobe())\n            return 'viewport';\n        return this._rotationAlignment;\n    }\n\n    /**\n     * Sets the `pitchAlignment` property of the marker.\n     *\n     * @param {string} [alignment] Sets the `pitchAlignment` property of the marker. If alignment is 'auto', it will automatically match `rotationAlignment`.\n     * @returns {Marker} Returns itself to allow for method chaining.\n     * @example\n     * marker.setPitchAlignment('map');\n     */\n    setPitchAlignment(alignment: string): this {\n        this._pitchAlignment = alignment || 'auto';\n        this._update();\n        return this;\n    }\n\n    /**\n     * Returns the current `pitchAlignment` behavior of the marker.\n     *\n     * @returns {string} The current pitch alignment of the marker.\n     * @example\n     * const alignment = marker.getPitchAlignment();\n     */\n    getPitchAlignment(): string {\n        if (this._pitchAlignment === 'auto') {\n            return this.getRotationAlignment();\n        }\n        return this._pitchAlignment;\n    }\n\n    /**\n     * Sets the `occludedOpacity` property of the marker.\n     * This opacity is used on the marker when the marker is occluded by terrain.\n     *\n     * @param {number} [opacity=0.2] Sets the `occludedOpacity` property of the marker.\n     * @returns {Marker} Returns itself to allow for method chaining.\n     * @example\n     * marker.setOccludedOpacity(0.3);\n     */\n    setOccludedOpacity(opacity: number): this {\n        this._occludedOpacity = opacity || 0.2;\n        this._update();\n        return this;\n    }\n\n    /**\n     * Returns the current `occludedOpacity` of the marker.\n     *\n     * @returns {number} The opacity of a terrain occluded marker.\n     * @example\n     * const opacity = marker.getOccludedOpacity();\n     */\n    getOccludedOpacity(): number {\n        return this._occludedOpacity;\n    }\n}\n","// @flow\n\nimport {extend, bindAll} from '../util/util.js';\nimport {Event, Evented} from '../util/evented.js';\nimport {MapMouseEvent} from '../ui/events.js';\nimport * as DOM from '../util/dom.js';\nimport LngLat from '../geo/lng_lat.js';\nimport Point from '@mapbox/point-geometry';\nimport smartWrap from '../util/smart_wrap.js';\nimport {type Anchor, anchorTranslate} from './anchor.js';\nimport {isLngLatBehindGlobe} from '../geo/projection/globe_util.js';\n\nimport type {Map} from './map.js';\nimport type {LngLatLike} from '../geo/lng_lat.js';\nimport type {PointLike} from '../types/point-like.js';\nimport type Marker from './marker.js';\n\nconst defaultOptions = {\n    closeButton: true,\n    closeOnClick: true,\n    focusAfterOpen: true,\n    className: '',\n    maxWidth: \"240px\"\n};\n\nexport type Offset = number | PointLike | {[_: Anchor]: PointLike};\n\nexport type PopupOptions = {\n    closeButton?: boolean,\n    closeOnClick?: boolean,\n    closeOnMove?: boolean,\n    focusAfterOpen?: boolean,\n    anchor?: Anchor,\n    offset?: Offset,\n    className?: string,\n    maxWidth?: string\n};\n\nconst focusQuerySelector = [\n    \"a[href]\",\n    \"[tabindex]:not([tabindex='-1'])\",\n    \"[contenteditable]:not([contenteditable='false'])\",\n    \"button:not([disabled])\",\n    \"input:not([disabled])\",\n    \"select:not([disabled])\",\n    \"textarea:not([disabled])\",\n].join(\", \");\n\n/**\n * A popup component.\n *\n * @param {Object} [options]\n * @param {boolean} [options.closeButton=true] If `true`, a close button will appear in the\n * top right corner of the popup.\n * @param {boolean} [options.closeOnClick=true] If `true`, the popup will close when the\n * map is clicked.\n * @param {boolean} [options.closeOnMove=false] If `true`, the popup will close when the\n * map moves.\n * @param {boolean} [options.focusAfterOpen=true] If `true`, the popup will try to focus the\n * first focusable element inside the popup.\n * @param {string} [options.anchor] - A string indicating the part of the popup that should\n * be positioned closest to the coordinate, set via {@link Popup#setLngLat}.\n * Options are `'center'`, `'top'`, `'bottom'`, `'left'`, `'right'`, `'top-left'`,\n * `'top-right'`, `'bottom-left'`, and `'bottom-right'`. If unset, the anchor will be\n * dynamically set to ensure the popup falls within the map container with a preference\n * for `'bottom'`.\n * @param {number | PointLike | Object} [options.offset] -\n * A pixel offset applied to the popup's location specified as:\n * - a single number specifying a distance from the popup's location\n * - a {@link PointLike} specifying a constant offset\n * - an object of {@link Point}s specifing an offset for each anchor position.\n *\n * Negative offsets indicate left and up.\n * @param {string} [options.className] Space-separated CSS class names to add to popup container.\n * @param {string} [options.maxWidth='240px'] -\n * A string that sets the CSS property of the popup's maximum width (for example, `'300px'`).\n * To ensure the popup resizes to fit its content, set this property to `'none'`.\n * See the MDN documentation for the list of [available values](https://developer.mozilla.org/en-US/docs/Web/CSS/max-width).\n * @example\n * const markerHeight = 50;\n * const markerRadius = 10;\n * const linearOffset = 25;\n * const popupOffsets = {\n *     'top': [0, 0],\n *     'top-left': [0, 0],\n *     'top-right': [0, 0],\n *     'bottom': [0, -markerHeight],\n *     'bottom-left': [linearOffset, (markerHeight - markerRadius + linearOffset) * -1],\n *     'bottom-right': [-linearOffset, (markerHeight - markerRadius + linearOffset) * -1],\n *     'left': [markerRadius, (markerHeight - markerRadius) * -1],\n *     'right': [-markerRadius, (markerHeight - markerRadius) * -1]\n * };\n * const popup = new mapboxgl.Popup({offset: popupOffsets, className: 'my-class'})\n *     .setLngLat(e.lngLat)\n *     .setHTML(\"<h1>Hello World!</h1>\")\n *     .setMaxWidth(\"300px\")\n *     .addTo(map);\n * @see [Example: Display a popup](https://www.mapbox.com/mapbox-gl-js/example/popup/)\n * @see [Example: Display a popup on hover](https://www.mapbox.com/mapbox-gl-js/example/popup-on-hover/)\n * @see [Example: Display a popup on click](https://www.mapbox.com/mapbox-gl-js/example/popup-on-click/)\n * @see [Example: Attach a popup to a marker instance](https://www.mapbox.com/mapbox-gl-js/example/set-popup/)\n */\nexport default class Popup extends Evented {\n    _map: ?Map;\n    options: PopupOptions;\n    _content: ?HTMLElement;\n    _container: ?HTMLElement;\n    _closeButton: ?HTMLElement;\n    _tip: ?HTMLElement;\n    _lngLat: LngLat;\n    _trackPointer: boolean;\n    _pos: ?Point;\n    _anchor: Anchor;\n    _classList: Set<string>;\n    _marker: ?Marker;\n\n    constructor(options?: PopupOptions) {\n        super();\n        this.options = extend(Object.create(defaultOptions), options);\n        bindAll(['_update', '_onClose', 'remove', '_onMouseEvent'], this);\n        this._classList = new Set(options && options.className ?\n            options.className.trim().split(/\\s+/) : []);\n    }\n\n    /**\n     * Adds the popup to a map.\n     *\n     * @param {Map} map The Mapbox GL JS map to add the popup to.\n     * @returns {Popup} Returns itself to allow for method chaining.\n     * @example\n     * new mapboxgl.Popup()\n     *     .setLngLat([0, 0])\n     *     .setHTML(\"<h1>Null Island</h1>\")\n     *     .addTo(map);\n     * @see [Example: Display a popup](https://docs.mapbox.com/mapbox-gl-js/example/popup/)\n     * @see [Example: Display a popup on hover](https://docs.mapbox.com/mapbox-gl-js/example/popup-on-hover/)\n     * @see [Example: Display a popup on click](https://docs.mapbox.com/mapbox-gl-js/example/popup-on-click/)\n     * @see [Example: Show polygon information on click](https://docs.mapbox.com/mapbox-gl-js/example/polygon-popup-on-click/)\n     */\n    addTo(map: Map): this {\n        if (this._map) this.remove();\n\n        this._map = map;\n        if (this.options.closeOnClick) {\n            // $FlowFixMe[method-unbinding]\n            map.on('preclick', this._onClose);\n        }\n\n        if (this.options.closeOnMove) {\n            // $FlowFixMe[method-unbinding]\n            map.on('move', this._onClose);\n        }\n\n        // $FlowFixMe[method-unbinding]\n        map.on('remove', this.remove);\n        this._update();\n        map._addPopup(this);\n        this._focusFirstElement();\n\n        if (this._trackPointer) {\n            // $FlowFixMe[method-unbinding]\n            map.on('mousemove', this._onMouseEvent);\n            // $FlowFixMe[method-unbinding]\n            map.on('mouseup', this._onMouseEvent);\n            map._canvasContainer.classList.add('mapboxgl-track-pointer');\n        } else {\n            // $FlowFixMe[method-unbinding]\n            map.on('move', this._update);\n        }\n\n        /**\n         * Fired when the popup is opened manually or programatically.\n         *\n         * @event open\n         * @memberof Popup\n         * @instance\n         * @type {Object}\n         * @property {Popup} popup Object that was opened.\n         *\n         * @example\n         * // Create a popup\n         * const popup = new mapboxgl.Popup();\n         * // Set an event listener that will fire\n         * // any time the popup is opened\n         * popup.on('open', () => {\n         *     console.log('popup was opened');\n         * });\n         */\n        this.fire(new Event('open'));\n\n        return this;\n    }\n\n    /**\n     * Checks if a popup is open.\n     *\n     * @returns {boolean} `true` if the popup is open, `false` if it is closed.\n     * @example\n     * const isPopupOpen = popup.isOpen();\n     */\n    isOpen(): boolean {\n        return !!this._map;\n    }\n\n    /**\n     * Removes the popup from the map it has been added to.\n     *\n     * @example\n     * const popup = new mapboxgl.Popup().addTo(map);\n     * popup.remove();\n     * @returns {Popup} Returns itself to allow for method chaining.\n     */\n    remove(): this {\n        if (this._content) {\n            this._content.remove();\n        }\n\n        if (this._container) {\n            this._container.remove();\n            this._container = undefined;\n        }\n\n        const map = this._map;\n        if (map) {\n            // $FlowFixMe[method-unbinding]\n            map.off('move', this._update);\n            // $FlowFixMe[method-unbinding]\n            map.off('move', this._onClose);\n            // $FlowFixMe[method-unbinding]\n            map.off('preclick', this._onClose);\n            // $FlowFixMe[method-unbinding]\n            map.off('click', this._onClose);\n            // $FlowFixMe[method-unbinding]\n            map.off('remove', this.remove);\n            // $FlowFixMe[method-unbinding]\n            map.off('mousemove', this._onMouseEvent);\n            // $FlowFixMe[method-unbinding]\n            map.off('mouseup', this._onMouseEvent);\n            // $FlowFixMe[method-unbinding]\n            map.off('drag', this._onMouseEvent);\n            if (map._canvasContainer) {\n                map._canvasContainer.classList.remove('mapboxgl-track-pointer');\n            }\n            map._removePopup(this);\n            this._map = undefined;\n        }\n\n        /**\n         * Fired when the popup is closed manually or programatically.\n         *\n         * @event close\n         * @memberof Popup\n         * @instance\n         * @type {Object}\n         * @property {Popup} popup Object that was closed.\n         *\n         * @example\n         * // Create a popup\n         * const popup = new mapboxgl.Popup();\n         * // Set an event listener that will fire\n         * // any time the popup is closed\n         * popup.on('close', () => {\n         *     console.log('popup was closed');\n         * });\n         */\n        this.fire(new Event('close'));\n\n        return this;\n    }\n\n    /**\n     * Returns the geographical location of the popup's anchor.\n     *\n     * The longitude of the result may differ by a multiple of 360 degrees from the longitude previously\n     * set by `setLngLat` because `Popup` wraps the anchor longitude across copies of the world to keep\n     * the popup on screen.\n     *\n     * @returns {LngLat} The geographical location of the popup's anchor.\n     * @example\n     * const lngLat = popup.getLngLat();\n     */\n    getLngLat(): LngLat {\n        return this._lngLat;\n    }\n\n    /**\n     * Sets the geographical location of the popup's anchor, and moves the popup to it. Replaces trackPointer() behavior.\n     *\n     * @param {LngLatLike} lnglat The geographical location to set as the popup's anchor.\n     * @returns {Popup} Returns itself to allow for method chaining.\n     * @example\n     * popup.setLngLat([-122.4194, 37.7749]);\n     */\n    setLngLat(lnglat: LngLatLike): this {\n        this._lngLat = LngLat.convert(lnglat);\n        this._pos = null;\n\n        this._trackPointer = false;\n\n        this._update();\n\n        const map = this._map;\n        if (map) {\n            // $FlowFixMe[method-unbinding]\n            map.on('move', this._update);\n            // $FlowFixMe[method-unbinding]\n            map.off('mousemove', this._onMouseEvent);\n            map._canvasContainer.classList.remove('mapboxgl-track-pointer');\n        }\n\n        return this;\n    }\n\n    /**\n     * Tracks the popup anchor to the cursor position on screens with a pointer device (it will be hidden on touchscreens). Replaces the `setLngLat` behavior.\n     * For most use cases, set `closeOnClick` and `closeButton` to `false`.\n     *\n     * @example\n     * const popup = new mapboxgl.Popup({closeOnClick: false, closeButton: false})\n     *     .setHTML(\"<h1>Hello World!</h1>\")\n     *     .trackPointer()\n     *     .addTo(map);\n     * @returns {Popup} Returns itself to allow for method chaining.\n     */\n    trackPointer(): this {\n        this._trackPointer = true;\n        this._pos = null;\n        this._update();\n        const map = this._map;\n        if (map) {\n            // $FlowFixMe[method-unbinding]\n            map.off('move', this._update);\n            // $FlowFixMe[method-unbinding]\n            map.on('mousemove', this._onMouseEvent);\n            // $FlowFixMe[method-unbinding]\n            map.on('drag', this._onMouseEvent);\n            map._canvasContainer.classList.add('mapboxgl-track-pointer');\n        }\n\n        return this;\n\n    }\n\n    /**\n     * Returns the `Popup`'s HTML element.\n     *\n     * @example\n     * // Change the `Popup` element's font size\n     * const popup = new mapboxgl.Popup()\n     *     .setLngLat([-96, 37.8])\n     *     .setHTML(\"<p>Hello World!</p>\")\n     *     .addTo(map);\n     * const popupElem = popup.getElement();\n     * popupElem.style.fontSize = \"25px\";\n     * @returns {HTMLElement} Returns container element.\n     */\n    getElement(): ?HTMLElement {\n        return this._container;\n    }\n\n    /**\n     * Sets the popup's content to a string of text.\n     *\n     * This function creates a [Text](https://developer.mozilla.org/en-US/docs/Web/API/Text) node in the DOM,\n     * so it cannot insert raw HTML. Use this method for security against XSS\n     * if the popup content is user-provided.\n     *\n     * @param {string} text Textual content for the popup.\n     * @returns {Popup} Returns itself to allow for method chaining.\n     * @example\n     * const popup = new mapboxgl.Popup()\n     *     .setLngLat(e.lngLat)\n     *     .setText('Hello, world!')\n     *     .addTo(map);\n     */\n    setText(text: string): this {\n        return this.setDOMContent(document.createTextNode(text));\n    }\n\n    /**\n     * Sets the popup's content to the HTML provided as a string.\n     *\n     * This method does not perform HTML filtering or sanitization, and must be\n     * used only with trusted content. Consider {@link Popup#setText} if\n     * the content is an untrusted text string.\n     *\n     * @param {string} html A string representing HTML content for the popup.\n     * @returns {Popup} Returns itself to allow for method chaining.\n     * @example\n     * const popup = new mapboxgl.Popup()\n     *     .setLngLat(e.lngLat)\n     *     .setHTML(\"<h1>Hello World!</h1>\")\n     *     .addTo(map);\n     * @see [Example: Display a popup](https://docs.mapbox.com/mapbox-gl-js/example/popup/)\n     * @see [Example: Display a popup on hover](https://docs.mapbox.com/mapbox-gl-js/example/popup-on-hover/)\n     * @see [Example: Display a popup on click](https://docs.mapbox.com/mapbox-gl-js/example/popup-on-click/)\n     * @see [Example: Attach a popup to a marker instance](https://docs.mapbox.com/mapbox-gl-js/example/set-popup/)\n     */\n    setHTML(html: string): this {\n        const frag = document.createDocumentFragment();\n        const temp = document.createElement('body');\n        let child;\n        temp.innerHTML = html;\n        while (true) {\n            child = temp.firstChild;\n            if (!child) break;\n            frag.appendChild(child);\n        }\n\n        return this.setDOMContent(frag);\n    }\n\n    /**\n     * Returns the popup's maximum width.\n     *\n     * @returns {string} The maximum width of the popup.\n     * @example\n     * const maxWidth = popup.getMaxWidth();\n     */\n    getMaxWidth(): ?string {\n        return this._container && this._container.style.maxWidth;\n    }\n\n    /**\n     * Sets the popup's maximum width. This is setting the CSS property `max-width`.\n     * Available values can be found here: https://developer.mozilla.org/en-US/docs/Web/CSS/max-width.\n     *\n     * @param {string} maxWidth A string representing the value for the maximum width.\n     * @returns {Popup} Returns itself to allow for method chaining.\n     * @example\n     * popup.setMaxWidth('50');\n     */\n    setMaxWidth(maxWidth: string): this {\n        this.options.maxWidth = maxWidth;\n        this._update();\n        return this;\n    }\n\n    /**\n     * Sets the popup's content to the element provided as a DOM node.\n     *\n     * @param {Element} htmlNode A DOM node to be used as content for the popup.\n     * @returns {Popup} Returns itself to allow for method chaining.\n     * @example\n     * // create an element with the popup content\n     * const div = window.document.createElement('div');\n     * div.innerHTML = 'Hello, world!';\n     * const popup = new mapboxgl.Popup()\n     *     .setLngLat(e.lngLat)\n     *     .setDOMContent(div)\n     *     .addTo(map);\n     */\n    setDOMContent(htmlNode: Node): this {\n        let content = this._content;\n        if (content) {\n            // Clear out children first.\n            while (content.hasChildNodes()) {\n                if (content.firstChild) {\n                    content.removeChild(content.firstChild);\n                }\n            }\n        } else {\n            content = this._content = DOM.create('div', 'mapboxgl-popup-content', this._container || undefined);\n        }\n\n        // The close button should be the last tabbable element inside the popup for a good keyboard UX.\n        content.appendChild(htmlNode);\n\n        if (this.options.closeButton) {\n            const button = this._closeButton = DOM.create('button', 'mapboxgl-popup-close-button', content);\n            button.type = 'button';\n            button.setAttribute('aria-label', 'Close popup');\n            button.setAttribute('aria-hidden', 'true');\n            button.innerHTML = '&#215;';\n            // $FlowFixMe[method-unbinding]\n            button.addEventListener('click', this._onClose);\n        }\n        this._update();\n        this._focusFirstElement();\n        return this;\n    }\n\n    /**\n     * Adds a CSS class to the popup container element.\n     *\n     * @param {string} className Non-empty string with CSS class name to add to popup container.\n     * @returns {Popup} Returns itself to allow for method chaining.\n     *\n     * @example\n     * const popup = new mapboxgl.Popup();\n     * popup.addClassName('some-class');\n     */\n    addClassName(className: string): this {\n        this._classList.add(className);\n        this._updateClassList();\n        return this;\n    }\n\n    /**\n     * Removes a CSS class from the popup container element.\n     *\n     * @param {string} className Non-empty string with CSS class name to remove from popup container.\n     *\n     * @returns {Popup} Returns itself to allow for method chaining.\n     * @example\n     * const popup = new mapboxgl.Popup({className: 'some classes'});\n     * popup.removeClassName('some');\n     */\n    removeClassName(className: string): this {\n        this._classList.delete(className);\n        this._updateClassList();\n        return this;\n    }\n\n    /* eslint-disable jsdoc/check-line-alignment */\n    /**\n     * Sets the popup's offset.\n     *\n     * @param {number | PointLike | Object} offset Sets the popup's offset. The `Object` is of the following structure\n     *     {\n     *         'center': ?PointLike,\n     *         'top': ?PointLike,\n     *         'bottom': ?PointLike,\n     *         'left': ?PointLike,\n     *         'right': ?PointLike,\n     *         'top-left': ?PointLike,\n     *         'top-right': ?PointLike,\n     *         'bottom-left': ?PointLike,\n     *         'bottom-right': ?PointLike\n     *     }.\n     *\n     * @returns {Popup} `this`.\n     * @example\n     * popup.setOffset(10);\n     */\n    /* eslint-enable jsdoc/check-line-alignment */\n    setOffset (offset?: Offset): this {\n        this.options.offset = offset;\n        this._update();\n        return this;\n    }\n\n    /**\n     * Add or remove the given CSS class on the popup container, depending on whether the container currently has that class.\n     *\n     * @param {string} className Non-empty string with CSS class name to add/remove.\n     *\n     * @returns {boolean} If the class was removed return `false`. If the class was added, then return `true`.\n     *\n     * @example\n     * const popup = new mapboxgl.Popup();\n     * popup.toggleClassName('highlighted');\n     */\n    toggleClassName(className: string): boolean {\n        let finalState: boolean;\n        if (this._classList.delete(className)) {\n            finalState = false;\n        } else {\n            this._classList.add(className);\n            finalState = true;\n        }\n        this._updateClassList();\n        return finalState;\n    }\n\n    _onMouseEvent(event: MapMouseEvent) {\n        this._update(event.point);\n    }\n\n    _getAnchor(bottomY: number): Anchor {\n        if (this.options.anchor) { return this.options.anchor; }\n\n        const map = this._map;\n        const container = this._container;\n        const pos = this._pos;\n\n        if (!map || !container || !pos) return 'bottom';\n\n        const width = container.offsetWidth;\n        const height = container.offsetHeight;\n\n        const isTop = pos.y + bottomY < height;\n        const isBottom = pos.y > map.transform.height - height;\n        const isLeft = pos.x < width / 2;\n        const isRight = pos.x > map.transform.width - width / 2;\n\n        if (isTop) {\n            if (isLeft) return 'top-left';\n            if (isRight) return 'top-right';\n            return 'top';\n        }\n        if (isBottom) {\n            if (isLeft) return 'bottom-left';\n            if (isRight) return 'bottom-right';\n        }\n        if (isLeft) return 'left';\n        if (isRight) return 'right';\n\n        return 'bottom';\n    }\n\n    _updateClassList() {\n        const container = this._container;\n        if (!container) return;\n\n        const classes = [...this._classList];\n        classes.push('mapboxgl-popup');\n        if (this._anchor) {\n            classes.push(`mapboxgl-popup-anchor-${this._anchor}`);\n        }\n        if (this._trackPointer) {\n            classes.push('mapboxgl-popup-track-pointer');\n        }\n        container.className = classes.join(' ');\n    }\n\n    _update(cursor?: Point) {\n        const hasPosition = this._lngLat || this._trackPointer;\n        const map = this._map;\n        const content = this._content;\n\n        if (!map || !hasPosition || !content) { return; }\n\n        let container = this._container;\n\n        if (!container) {\n            container = this._container = DOM.create('div', 'mapboxgl-popup', map.getContainer());\n            this._tip = DOM.create('div', 'mapboxgl-popup-tip', container);\n            container.appendChild(content);\n        }\n\n        if (this.options.maxWidth && container.style.maxWidth !== this.options.maxWidth) {\n            container.style.maxWidth = this.options.maxWidth;\n        }\n\n        if (map.transform.renderWorldCopies && !this._trackPointer) {\n            this._lngLat = smartWrap(this._lngLat, this._pos, map.transform);\n        }\n\n        if (!this._trackPointer || cursor) {\n            const pos = this._pos = this._trackPointer && cursor ? cursor : map.project(this._lngLat);\n\n            const offsetBottom = normalizeOffset(this.options.offset);\n            const anchor = this._anchor = this._getAnchor(offsetBottom.y);\n            const offset = normalizeOffset(this.options.offset, anchor);\n\n            const offsetedPos = pos.add(offset).round();\n            map._requestDomTask(() => {\n                if (this._container && anchor) {\n                    this._container.style.transform = `${anchorTranslate[anchor]} translate(${offsetedPos.x}px,${offsetedPos.y}px)`;\n                }\n            });\n        }\n\n        if (!this._marker && map._showingGlobe()) {\n            const opacity = isLngLatBehindGlobe(map.transform, this._lngLat) ? 0 : 1;\n            this._setOpacity(opacity);\n        }\n\n        this._updateClassList();\n    }\n\n    _focusFirstElement() {\n        if (!this.options.focusAfterOpen || !this._container) return;\n\n        const firstFocusable = this._container.querySelector(focusQuerySelector);\n\n        if (firstFocusable) firstFocusable.focus();\n    }\n\n    _onClose() {\n        this.remove();\n    }\n\n    _setOpacity(opacity: number) {\n        if (this._container) {\n            this._container.style.opacity = `${opacity}`;\n        }\n        if (this._content) {\n            this._content.style.pointerEvents = opacity ? 'auto' : 'none';\n        }\n    }\n}\n\n// returns a normalized offset for a given anchor\nfunction normalizeOffset(offset: Offset = new Point(0, 0), anchor: Anchor = 'bottom'): Point {\n    if (typeof offset === 'number') {\n        // input specifies a radius from which to calculate offsets at all positions\n        const cornerOffset = Math.round(Math.sqrt(0.5 * Math.pow(offset, 2)));\n        switch (anchor) {\n        case 'top': return new Point(0, offset);\n        case 'top-left': return new Point(cornerOffset, cornerOffset);\n        case 'top-right': return new Point(-cornerOffset, cornerOffset);\n        case 'bottom': return new Point(0, -offset);\n        case 'bottom-left': return new Point(cornerOffset, -cornerOffset);\n        case 'bottom-right': return new Point(-cornerOffset, -cornerOffset);\n        case 'left': return new Point(offset, 0);\n        case 'right': return new Point(-offset, 0);\n        }\n        return new Point(0, 0);\n    }\n\n    if (offset instanceof Point || Array.isArray(offset)) {\n        // input specifies a single offset to be applied to all positions\n        return Point.convert(offset);\n    }\n\n    // input specifies an offset per position\n    // $FlowFixMe we know offset is an object at this point but Flow can't refine it for some reason\n    return Point.convert(offset[anchor] || [0, 0]);\n}\n","// @flow\n\nimport {easeCubicInOut} from './util.js';\n\n/**\n * An object for maintaining just enough state to ease a variable.\n *\n * @private\n */\nclass EasedVariable {\n    _start: number;\n    _end: number;\n    _startTime: number;\n    _endTime: number;\n\n    constructor(initialValue: number) {\n        this.jumpTo(initialValue);\n    }\n\n    /**\n     * Evaluate the current value, given a timestamp.\n     *\n     * @param timeStamp {number} Time at which to evaluate.\n     *\n     * @returns {number} Evaluated value.\n     */\n    getValue(timeStamp: number): number {\n        if (timeStamp <= this._startTime) return this._start;\n        if (timeStamp >= this._endTime) return this._end;\n\n        const t = easeCubicInOut((timeStamp - this._startTime) / (this._endTime - this._startTime));\n        return this._start * (1 - t) + this._end * t;\n    }\n\n    /**\n     * Check if an ease is in progress.\n     *\n     * @param timeStamp {number} Current time stamp.\n     *\n     * @returns {boolean} Returns `true` if ease is in progress.\n     */\n    isEasing(timeStamp: number): boolean {\n        return timeStamp >= this._startTime && timeStamp <= this._endTime;\n    }\n\n    /**\n     * Set the value without easing and cancel any in progress ease.\n     *\n     * @param value {number} New value.\n     */\n    jumpTo(value: number) {\n        this._startTime = -Infinity;\n        this._endTime = -Infinity;\n\n        this._start = value;\n        this._end = value;\n    }\n\n    /**\n     * Cancel any in-progress ease and begin a new ease.\n     *\n     * @param value {number} New value to which to ease.\n     * @param timeStamp {number} Current time stamp.\n     * @param duration {number} Ease duration, in same units as timeStamp.\n     */\n    easeTo(value: number, timeStamp: number, duration: number) {\n        this._start = this.getValue(timeStamp);\n        this._end = value;\n\n        this._startTime = timeStamp;\n        this._endTime = timeStamp + duration;\n    }\n}\n\nexport default EasedVariable;\n","// @flow\n\nimport type {ITrackedParameters} from 'tracked_parameters_proxy';\n\n// Parameter description\n// * Description from TweakPane\n// * extended options:\n//   * noSave - do not save/load the parameter value between page reloads\nexport type Description = Object | { noSave: boolean };\n\nexport function registerParameter(_containerObject: Object, _scope: Array<string>, _name: string, _description: ?Description, _changeValueCallback: ?Function) {\n}\n\nexport function registerButton(_scope: Array<string>, _buttonTitle: string, _onClick: Function) {\n}\n\nexport function registerBinding(_containerObject: Object, _scope: Array<string>, _name: string, _description: ?Object) {\n}\n\nexport function refreshUI() {}\n\nexport class TrackedParameters implements ITrackedParameters {\n    registerParameter(_containerObject: Object, _scope: Array<string>, _name: string, _description: ?Description, _changeValueCallback: ?Function) { }\n    registerButton(_scope: Array<string>, _buttonTitle: string, _onClick: Function) { }\n    registerBinding(_containerObject: Object, _scope: Array<string>, _name: string, _description: ?Object) { }\n    refreshUI() { }\n}\n","// @flow\n\nconst defaultLocale = {\n    'AttributionControl.ToggleAttribution': 'Toggle attribution',\n    'AttributionControl.MapFeedback': 'Map feedback',\n    'FullscreenControl.Enter': 'Enter fullscreen',\n    'FullscreenControl.Exit': 'Exit fullscreen',\n    'GeolocateControl.FindMyLocation': 'Find my location',\n    'GeolocateControl.LocationNotAvailable': 'Location not available',\n    'LogoControl.Title': 'Mapbox logo',\n    'Map.Title': 'Map',\n    'NavigationControl.ResetBearing': 'Reset bearing to north',\n    'NavigationControl.ZoomIn': 'Zoom in',\n    'NavigationControl.ZoomOut': 'Zoom out',\n    'ScrollZoomBlocker.CtrlMessage': 'Use ctrl + scroll to zoom the map',\n    'ScrollZoomBlocker.CmdMessage': 'Use ⌘ + scroll to zoom the map',\n    'TouchPanBlocker.Message': 'Use two fingers to move the map'\n};\n\nexport default defaultLocale;\n","// @flow\n\nimport {version} from '../../package.json';\nimport {asyncAll, extend, bindAll, warnOnce, uniqueId, isSafariWithAntialiasingBug} from '../util/util.js';\nimport browser from '../util/browser.js';\nimport * as DOM from '../util/dom.js';\nimport {getImage, ResourceType} from '../util/ajax.js';\nimport {\n    RequestManager,\n    mapSessionAPI,\n    mapLoadEvent,\n    getMapSessionAPI,\n    postPerformanceEvent,\n    postMapLoadEvent,\n    postStyleLoadEvent,\n    AUTH_ERR_MSG,\n    storeAuthState,\n    removeAuthState\n} from '../util/mapbox.js';\nimport Style from '../style/style.js';\nimport EvaluationParameters from '../style/evaluation_parameters.js';\nimport Painter from '../render/painter.js';\nimport Transform from '../geo/transform.js';\nimport Hash from './hash.js';\nimport HandlerManager from './handler_manager.js';\nimport Camera from './camera.js';\nimport LngLat, {LngLatBounds} from '../geo/lng_lat.js';\nimport Point from '@mapbox/point-geometry';\nimport AttributionControl from './control/attribution_control.js';\nimport LogoControl from './control/logo_control.js';\nimport {supported} from '@mapbox/mapbox-gl-supported';\nimport {RGBAImage} from '../util/image.js';\nimport {Event, ErrorEvent} from '../util/evented.js';\nimport {MapMouseEvent} from './events.js';\nimport TaskQueue from '../util/task_queue.js';\nimport webpSupported from '../util/webp_supported.js';\nimport {PerformanceUtils} from '../util/performance.js';\nimport {PerformanceMarkers, LivePerformanceUtils} from '../util/live_performance.js';\nimport Marker from '../ui/marker.js';\nimport Popup from '../ui/popup.js';\nimport EasedVariable from '../util/eased_variable.js';\nimport SourceCache from '../source/source_cache.js';\nimport {GLOBE_ZOOM_THRESHOLD_MAX} from '../geo/projection/globe_constants.js';\nimport {setCacheLimits} from '../util/tile_request_cache.js';\nimport {Debug} from '../util/debug.js';\nimport config from '../util/config.js';\nimport {isFQID} from '../util/fqid.js';\nimport * as TP from '../tracked-parameters/tracked_parameters.js';\n\nimport type {Listener} from '../util/evented.js';\nimport type {PointLike} from '../types/point-like.js';\nimport type {RequestTransformFunction} from '../util/mapbox.js';\nimport type {LngLatLike, LngLatBoundsLike} from '../geo/lng_lat.js';\nimport type {StyleOptions, StyleSetterOptions} from '../style/style.js';\nimport type {MapEvent, MapDataEvent} from './events.js';\nimport type {CustomLayerInterface} from '../style/style_layer/custom_style_layer.js';\nimport type {StyleImageInterface, StyleImageMetadata} from '../style/style_image.js';\n\nimport type ScrollZoomHandler from './handler/scroll_zoom.js';\nimport type BoxZoomHandler from './handler/box_zoom.js';\nimport type {TouchPitchHandler} from './handler/touch_zoom_rotate.js';\nimport type DragRotateHandler from './handler/shim/drag_rotate.js';\nimport type DragPanHandler from './handler/shim/drag_pan.js';\nimport type {DragPanOptions} from './handler/shim/drag_pan.js';\nimport type KeyboardHandler from './handler/keyboard.js';\nimport type DoubleClickZoomHandler from './handler/shim/dblclick_zoom.js';\nimport type TouchZoomRotateHandler from './handler/shim/touch_zoom_rotate.js';\nimport defaultLocale from './default_locale.js';\nimport type {TaskID} from '../util/task_queue.js';\nimport type {Cancelable} from '../types/cancelable.js';\nimport type {\n    LayerSpecification,\n    FilterSpecification,\n    StyleSpecification,\n    LightSpecification,\n    FlatLightSpecification,\n    LightsSpecification,\n    TerrainSpecification,\n    FogSpecification,\n    SourceSpecification,\n    ProjectionSpecification,\n    PropertyValueSpecification,\n    TransitionSpecification,\n    CameraSpecification,\n    ImportSpecification,\n    ConfigSpecification,\n    SchemaSpecification\n} from '../style-spec/types.js';\nimport type StyleLayer from '../style/style_layer.js';\nimport type {Source} from '../source/source.js';\nimport type {QueryFeature} from '../util/vectortile_to_geojson.js';\nimport type {QueryResult} from '../data/feature_index.js';\nimport type {EasingOptions} from './camera.js';\nimport type {ContextOptions} from '../gl/context.js';\n\nimport type {ITrackedParameters} from 'tracked_parameters_proxy';\n\nexport type ControlPosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n/* eslint-disable no-use-before-define */\nexport interface IControl {\n    +onAdd: (map: Map) => HTMLElement;\n    +onRemove: (map: Map) => void;\n\n    +getDefaultPosition?: () => ControlPosition;\n    +_setLanguage?: (language: ?string | ?string[]) => void;\n}\n/* eslint-enable no-use-before-define */\n\n// Public API type for the Map#setStyle options\n// as opposite to the internal StyleOptions type\ntype SetStyleOptions = {\n    diff?: boolean,\n    config?: {[string]: ConfigSpecification},\n    localFontFamily: StyleOptions['localFontFamily'],\n    localIdeographFontFamily: StyleOptions['localIdeographFontFamily'],\n}\n\nexport const AVERAGE_ELEVATION_SAMPLING_INTERVAL = 500; // ms\nexport const AVERAGE_ELEVATION_EASE_TIME = 300; // ms\nexport const AVERAGE_ELEVATION_EASE_THRESHOLD = 1; // meters\nexport const AVERAGE_ELEVATION_CHANGE_THRESHOLD = 1e-4; // meters\n\nexport type MapOptions = {\n    style?: StyleSpecification | string | void,\n    config?: {[string]: ConfigSpecification},\n    hash?: boolean | string,\n    interactive?: boolean,\n    container: HTMLElement | string,\n    bearingSnap?: number,\n    clickTolerance?: number,\n    pitchWithRotate?: boolean,\n    attributionControl?: boolean,\n    customAttribution?: string | Array<string>,\n    logoPosition?: ControlPosition,\n    failIfMajorPerformanceCaveat?: boolean,\n    preserveDrawingBuffer?: boolean,\n    antialias?: boolean,\n    refreshExpiredTiles?: boolean,\n    bounds?: LngLatBoundsLike,\n    maxBounds?: LngLatBoundsLike,\n    fitBoundsOptions?: EasingOptions,\n    scrollZoom?: boolean,\n    minZoom?: ?number,\n    maxZoom?: ?number,\n    minPitch?: ?number,\n    maxPitch?: ?number,\n    boxZoom?: boolean,\n    dragRotate?: boolean,\n    dragPan?: boolean | DragPanOptions,\n    keyboard?: boolean,\n    doubleClickZoom?: boolean,\n    touchZoomRotate?: boolean,\n    touchPitch?: boolean,\n    cooperativeGestures?: boolean,\n    trackResize?: boolean,\n    center?: LngLatLike,\n    zoom?: number,\n    bearing?: number,\n    pitch?: number,\n    projection?: ProjectionSpecification | string,\n    renderWorldCopies?: boolean,\n    minTileCacheSize?: number,\n    maxTileCacheSize?: number,\n    transformRequest?: RequestTransformFunction,\n    accessToken?: string,\n    testMode?: ?boolean,\n    locale?: Object,\n    language?: string,\n    worldview?: string,\n    crossSourceCollisions?: boolean,\n    collectResourceTiming?: boolean,\n    respectPrefersReducedMotion?: boolean,\n    contextCreateOptions?: ContextOptions,\n    devtools?: boolean,\n    repaint?: boolean,\n    fadeDuration?: number,\n    localFontFamily?: string,\n    localIdeographFontFamily?: string,\n    performanceMetricsCollection?: boolean,\n};\n\nconst defaultMinZoom = -2;\nconst defaultMaxZoom = 22;\n\n// the default values, but also the valid range\nconst defaultMinPitch = 0;\nconst defaultMaxPitch = 85;\n\nconst defaultOptions = {\n    center: [0, 0],\n    zoom: 0,\n    bearing: 0,\n    pitch: 0,\n\n    minZoom: defaultMinZoom,\n    maxZoom: defaultMaxZoom,\n\n    minPitch: defaultMinPitch,\n    maxPitch: defaultMaxPitch,\n\n    interactive: true,\n    scrollZoom: true,\n    boxZoom: true,\n    dragRotate: true,\n    dragPan: true,\n    keyboard: true,\n    doubleClickZoom: true,\n    touchZoomRotate: true,\n    touchPitch: true,\n    cooperativeGestures: false,\n    performanceMetricsCollection: true,\n\n    bearingSnap: 7,\n    clickTolerance: 3,\n    pitchWithRotate: true,\n\n    hash: false,\n    attributionControl: true,\n\n    antialias: false,\n    failIfMajorPerformanceCaveat: false,\n    preserveDrawingBuffer: false,\n    trackResize: true,\n    renderWorldCopies: true,\n    refreshExpiredTiles: true,\n    minTileCacheSize: null,\n    maxTileCacheSize: null,\n    localIdeographFontFamily: 'sans-serif',\n    localFontFamily: null,\n    transformRequest: null,\n    accessToken: null,\n    fadeDuration: 300,\n    respectPrefersReducedMotion: true,\n    crossSourceCollisions: true,\n    collectResourceTiming: false,\n    testMode: false,\n};\n\n/**\n * The `Map` object represents the map on your page. It exposes methods\n * and properties that enable you to programmatically change the map,\n * and fires events as users interact with it.\n *\n * You create a `Map` by specifying a `container` and other options.\n * Then Mapbox GL JS initializes the map on the page and returns your `Map`\n * object.\n *\n * @extends Evented\n * @param {Object} options\n * @param {HTMLElement|string} options.container The HTML element in which Mapbox GL JS will render the map, or the element's string `id`. The specified element must have no children.\n * @param {number} [options.minZoom=0] The minimum zoom level of the map (0-24).\n * @param {number} [options.maxZoom=22] The maximum zoom level of the map (0-24).\n * @param {number} [options.minPitch=0] The minimum pitch of the map (0-85).\n * @param {number} [options.maxPitch=85] The maximum pitch of the map (0-85).\n * @param {Object | string} [options.style='mapbox://styles/mapbox/standard'] The map's Mapbox style. This must be an a JSON object conforming to\n * the schema described in the [Mapbox Style Specification](https://mapbox.com/mapbox-gl-style-spec/), or a URL\n * to such JSON. Can accept a null value to allow adding a style manually.\n *\n * To load a style from the Mapbox API, you can use a URL of the form `mapbox://styles/:owner/:style`,\n * where `:owner` is your Mapbox account name and `:style` is the style ID. You can also use a\n * [Mapbox-owned style](https://docs.mapbox.com/api/maps/styles/#mapbox-styles):\n *\n * * `mapbox://styles/mapbox/standard`\n * * `mapbox://styles/mapbox/streets-v12`\n * * `mapbox://styles/mapbox/outdoors-v12`\n * * `mapbox://styles/mapbox/light-v11`\n * * `mapbox://styles/mapbox/dark-v11`\n * * `mapbox://styles/mapbox/satellite-v9`\n * * `mapbox://styles/mapbox/satellite-streets-v12`\n * * `mapbox://styles/mapbox/navigation-day-v1`\n * * `mapbox://styles/mapbox/navigation-night-v1`.\n *\n * Tilesets hosted with Mapbox can be style-optimized if you append `?optimize=true` to the end of your style URL, like `mapbox://styles/mapbox/streets-v11?optimize=true`.\n * Learn more about style-optimized vector tiles in our [API documentation](https://www.mapbox.com/api-documentation/maps/#retrieve-tiles).\n *\n * @param {Object} [options.config=null] The initial configuration options for the style fragments. Each key in the object is a fragment ID (e.g., `basemap`) and each value is a configuration object.\n * @example\n * const map = new mapboxgl.Map({\n *     container: 'map',\n *     center: [-122.420679, 37.772537],\n *     zoom: 13,\n *     style: 'mapbox://styles/mapbox/standard',\n *     config: {\n *         // Initial configuration for the Mapbox Standard style set above. By default, its ID is `basemap`.\n *         basemap: {\n *             // Here, we're setting the light preset to `night`.\n *             lightPreset: 'night'\n *         }\n *     }\n * });\n * @param {(boolean|string)} [options.hash=false] If `true`, the map's [position](https://docs.mapbox.com/help/glossary/camera) (zoom, center latitude, center longitude, bearing, and pitch) will be synced with the hash fragment of the page's URL.\n * For example, `http://path/to/my/page.html#2.59/39.26/53.07/-24.1/60`.\n * An additional string may optionally be provided to indicate a parameter-styled hash,\n * for example http://path/to/my/page.html#map=2.59/39.26/53.07/-24.1/60&foo=bar, where `foo`\n * is a custom parameter and `bar` is an arbitrary hash distinct from the map hash.\n * @param {boolean} [options.interactive=true] If `false`, no mouse, touch, or keyboard listeners will be attached to the map, so it will not respond to interaction.\n * @param {number} [options.bearingSnap=7] The threshold, measured in degrees, that determines when the map's\n * bearing will snap to north. For example, with a `bearingSnap` of 7, if the user rotates\n * the map within 7 degrees of north, the map will automatically snap to exact north.\n * @param {boolean} [options.pitchWithRotate=true] If `false`, the map's pitch (tilt) control with \"drag to rotate\" interaction will be disabled.\n * @param {number} [options.clickTolerance=3] The max number of pixels a user can shift the mouse pointer during a click for it to be considered a valid click (as opposed to a mouse drag).\n * @param {boolean} [options.attributionControl=true] If `true`, an {@link AttributionControl} will be added to the map.\n * @param {string | Array<string>} [options.customAttribution=null] String or strings to show in an {@link AttributionControl}. Only applicable if `options.attributionControl` is `true`.\n * @param {string} [options.logoPosition='bottom-left'] A string representing the position of the Mapbox wordmark on the map. Valid options are `top-left`,`top-right`, `bottom-left`, `bottom-right`.\n * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`, map creation will fail if the performance of Mapbox GL JS would be dramatically worse than expected (a software renderer would be used).\n * @param {boolean} [options.preserveDrawingBuffer=false] If `true`, the map's canvas can be exported to a PNG using `map.getCanvas().toDataURL()`. This is `false` by default as a performance optimization.\n * @param {boolean} [options.antialias=false] If `true`, the gl context will be created with [MSAA antialiasing](https://en.wikipedia.org/wiki/Multisample_anti-aliasing), which can be useful for antialiasing custom layers. This is `false` by default as a performance optimization.\n * @param {boolean} [options.refreshExpiredTiles=true] If `false`, the map won't attempt to re-request tiles once they expire per their HTTP `cacheControl`/`expires` headers.\n * @param {LngLatBoundsLike} [options.maxBounds=null] If set, the map will be constrained to the given bounds.\n * @param {boolean|Object} [options.scrollZoom=true] If `true`, the \"scroll to zoom\" interaction is enabled. An `Object` value is passed as options to {@link ScrollZoomHandler#enable}.\n * @param {boolean} [options.boxZoom=true] If `true`, the \"box zoom\" interaction is enabled (see {@link BoxZoomHandler}).\n * @param {boolean} [options.dragRotate=true] If `true`, the \"drag to rotate\" interaction is enabled (see {@link DragRotateHandler}).\n * @param {boolean | Object} [options.dragPan=true] If `true`, the \"drag to pan\" interaction is enabled. An `Object` value is passed as options to {@link DragPanHandler#enable}.\n * @param {boolean} [options.keyboard=true] If `true`, keyboard shortcuts are enabled (see {@link KeyboardHandler}).\n * @param {boolean} [options.doubleClickZoom=true] If `true`, the \"double click to zoom\" interaction is enabled (see {@link DoubleClickZoomHandler}).\n * @param {boolean | Object} [options.touchZoomRotate=true] If `true`, the \"pinch to rotate and zoom\" interaction is enabled. An `Object` value is passed as options to {@link TouchZoomRotateHandler#enable}.\n * @param {boolean | Object} [options.touchPitch=true] If `true`, the \"drag to pitch\" interaction is enabled. An `Object` value is passed as options to {@link TouchPitchHandler}.\n * @param {boolean} [options.cooperativeGestures] If `true`, scroll zoom will require pressing the ctrl or ⌘ key while scrolling to zoom map, and touch pan will require using two fingers while panning to move the map. Touch pitch will require three fingers to activate if enabled.\n * @param {boolean} [options.trackResize=true] If `true`, the map will automatically resize when the browser window resizes.\n * @param {boolean} [options.performanceMetricsCollection=true] If `true`, mapbox-gl will collect and send performance metrics.\n * @param {LngLatLike} [options.center=[0, 0]] The initial geographical [centerpoint](https://docs.mapbox.com/help/glossary/camera#center) of the map. If `center` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `[0, 0]` Note: Mapbox GL uses longitude, latitude coordinate order (as opposed to latitude, longitude) to match GeoJSON.\n * @param {number} [options.zoom=0] The initial [zoom](https://docs.mapbox.com/help/glossary/camera#zoom) level of the map. If `zoom` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`.\n * @param {number} [options.bearing=0] The initial [bearing](https://docs.mapbox.com/help/glossary/camera#bearing) (rotation) of the map, measured in degrees counter-clockwise from north. If `bearing` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`.\n * @param {number} [options.pitch=0] The initial [pitch](https://docs.mapbox.com/help/glossary/camera#pitch) (tilt) of the map, measured in degrees away from the plane of the screen (0-85). If `pitch` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`.\n * @param {LngLatBoundsLike} [options.bounds=null] The initial bounds of the map. If `bounds` is specified, it overrides `center` and `zoom` constructor options.\n * @param {Object} [options.fitBoundsOptions=null] A {@link Map#fitBounds} options object to use _only_ when fitting the initial `bounds` provided above.\n * @param {'auto' | string | string[]} [options.language=null] A string with a BCP 47 language tag, or an array of such strings representing the desired languages used for the map's labels and UI components. Languages can only be set on Mapbox vector tile sources.\n * By default, GL JS will not set a language so that the language of Mapbox tiles will be determined by the vector tile source's TileJSON.\n * Valid language strings must be a [BCP-47 language code](https://en.wikipedia.org/wiki/IETF_language_tag#List_of_subtags). Unsupported BCP-47 codes will not include any translations. Invalid codes will result in an recoverable error.\n * If a label has no translation for the selected language, it will display in the label's local language.\n * If option is set to `auto`, GL JS will select a user's preferred language as determined by the browser's [`window.navigator.language`](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/language) property.\n * If the `locale` property is not set separately, this language will also be used to localize the UI for supported languages.\n * @param {string} [options.worldview=null] Sets the map's worldview. A worldview determines the way that certain disputed boundaries\n * are rendered. By default, GL JS will not set a worldview so that the worldview of Mapbox tiles will be determined by the vector tile source's TileJSON.\n * Valid worldview strings must be an [ISO alpha-2 country code](https://en.wikipedia.org/wiki/ISO_3166-1#Current_codes). Unsupported\n * ISO alpha-2 codes will fall back to the TileJSON's default worldview. Invalid codes will result in a recoverable error.\n * @param {boolean} [options.renderWorldCopies=true] If `true`, multiple copies of the world will be rendered side by side beyond -180 and 180 degrees longitude. If set to `false`:\n * - When the map is zoomed out far enough that a single representation of the world does not fill the map's entire\n * container, there will be blank space beyond 180 and -180 degrees longitude.\n * - Features that cross 180 and -180 degrees longitude will be cut in two (with one portion on the right edge of the\n * map and the other on the left edge of the map) at every zoom level.\n * @param {number} [options.minTileCacheSize=null] The minimum number of tiles stored in the tile cache for a given source. Larger viewports use more tiles and need larger caches. Larger viewports are more likely to be found on devices with more memory and on pages where the map is more important. If omitted, the cache will be dynamically sized based on the current viewport.\n * @param {number} [options.maxTileCacheSize=null] The maximum number of tiles stored in the tile cache for a given source. If omitted, the cache will be dynamically sized based on the current viewport.\n * @param {string} [options.localIdeographFontFamily='sans-serif'] Defines a CSS font-family for locally overriding generation of glyphs in the 'CJK Unified Ideographs', 'Hiragana', 'Katakana', 'Hangul Syllables' and 'CJK Symbols and Punctuation' ranges.\n * In these ranges, font settings from the map's style will be ignored, except for font-weight keywords (light/regular/medium/bold).\n * Set to `false`, to enable font settings from the map's style for these glyph ranges. Note that [Mapbox Studio](https://studio.mapbox.com/) sets this value to `false` by default.\n * The purpose of this option is to avoid bandwidth-intensive glyph server requests. For an example of this option in use, see [Use locally generated ideographs](https://www.mapbox.com/mapbox-gl-js/example/local-ideographs).\n * @param {string} [options.localFontFamily=null] Defines a CSS\n * font-family for locally overriding generation of all glyphs. Font settings from the map's style will be ignored, except for font-weight keywords (light/regular/medium/bold).\n * If set, this option overrides the setting in localIdeographFontFamily.\n * @param {RequestTransformFunction} [options.transformRequest=null] A callback run before the Map makes a request for an external URL. The callback can be used to modify the url, set headers, or set the credentials property for cross-origin requests.\n * Expected to return a {@link RequestParameters} object with a `url` property and optionally `headers` and `credentials` properties.\n * @param {boolean} [options.collectResourceTiming=false] If `true`, Resource Timing API information will be collected for requests made by GeoJSON and Vector Tile web workers (this information is normally inaccessible from the main Javascript thread). Information will be returned in a `resourceTiming` property of relevant `data` events.\n * @param {number} [options.fadeDuration=300] Controls the duration of the fade-in/fade-out animation for label collisions, in milliseconds. This setting affects all symbol layers. This setting does not affect the duration of runtime styling transitions or raster tile cross-fading.\n * @param {boolean} [options.respectPrefersReducedMotion=true] If set to `true`, the map will respect the user's `prefers-reduced-motion` browser setting and apply a reduced motion mode, minimizing animations and transitions. When set to `false`, the map will always ignore the `prefers-reduced-motion` settings, regardless of the user's preference, making all animations essential.\n * @param {boolean} [options.crossSourceCollisions=true] If `true`, symbols from multiple sources can collide with each other during collision detection. If `false`, collision detection is run separately for the symbols in each source.\n * @param {string} [options.accessToken=null] If specified, map will use this [token](https://docs.mapbox.com/help/glossary/access-token/) instead of the one defined in `mapboxgl.accessToken`.\n * @param {Object} [options.locale=null] A patch to apply to the default localization table for UI strings such as control tooltips. The `locale` object maps namespaced UI string IDs to translated strings in the target language;\n * see [`src/ui/default_locale.js`](https://github.com/mapbox/mapbox-gl-js/blob/main/src/ui/default_locale.js) for an example with all supported string IDs. The object may specify all UI strings (thereby adding support for a new translation) or only a subset of strings (thereby patching the default translation table).\n * @param {boolean} [options.testMode=false] Silences errors and warnings generated due to an invalid accessToken, useful when using the library to write unit tests.\n * @param {ProjectionSpecification} [options.projection='mercator'] The [projection](https://docs.mapbox.com/mapbox-gl-js/style-spec/projection/) the map should be rendered in.\n * Supported projections are:\n * * [Albers](https://en.wikipedia.org/wiki/Albers_projection) equal-area conic projection as `albers`\n * * [Equal Earth](https://en.wikipedia.org/wiki/Equal_Earth_projection) equal-area pseudocylindrical projection as `equalEarth`\n * * [Equirectangular](https://en.wikipedia.org/wiki/Equirectangular_projection) (Plate Carrée/WGS84) as `equirectangular`\n * * 3d Globe as `globe`\n * * [Lambert Conformal Conic](https://en.wikipedia.org/wiki/Lambert_conformal_conic_projection) as `lambertConformalConic`\n * * [Mercator](https://en.wikipedia.org/wiki/Mercator_projection) cylindrical map projection as `mercator`\n * * [Natural Earth](https://en.wikipedia.org/wiki/Natural_Earth_projection) pseudocylindrical map projection as `naturalEarth`\n * * [Winkel Tripel](https://en.wikipedia.org/wiki/Winkel_tripel_projection) azimuthal map projection as `winkelTripel`\n * Conic projections such as Albers and Lambert have configurable `center` and `parallels` properties that allow developers to define the region in which the projection has minimal distortion; see the example for how to configure these properties.\n * @example\n * const map = new mapboxgl.Map({\n *     container: 'map', // container ID\n *     center: [-122.420679, 37.772537], // starting position [lng, lat]\n *     zoom: 13, // starting zoom\n *     style: 'mapbox://styles/mapbox/streets-v11', // style URL or style object\n *     hash: true, // sync `center`, `zoom`, `pitch`, and `bearing` with URL\n *     // Use `transformRequest` to modify requests that begin with `http://myHost`.\n *     transformRequest: (url, resourceType) => {\n *         if (resourceType === 'Source' && url.startsWith('http://myHost')) {\n *             return {\n *                 url: url.replace('http', 'https'),\n *                 headers: {'my-custom-header': true},\n *                 credentials: 'include'  // Include cookies for cross-origin requests\n *             };\n *         }\n *     }\n * });\n * @see [Example: Display a map on a webpage](https://docs.mapbox.com/mapbox-gl-js/example/simple-map/)\n * @see [Example: Display a map with a custom style](https://docs.mapbox.com/mapbox-gl-js/example/custom-style-id/)\n * @see [Example: Check if Mapbox GL JS is supported](https://docs.mapbox.com/mapbox-gl-js/example/check-for-support/)\n */\nexport class Map extends Camera {\n    style: Style;\n    painter: Painter;\n    handlers: ?HandlerManager;\n\n    _container: HTMLElement;\n    _missingCSSCanary: HTMLElement;\n    _canvasContainer: HTMLElement;\n    _controlContainer: HTMLElement;\n    _controlPositions: {[_: string]: HTMLElement};\n    _interactive: ?boolean;\n    _showTileBoundaries: ?boolean;\n    _showParseStatus: ?boolean;\n\n    _showTerrainWireframe: ?boolean;\n    _showLayers2DWireframe: ?boolean;\n    _showLayers3DWireframe: ?boolean;\n\n    _showQueryGeometry: ?boolean;\n    _showCollisionBoxes: ?boolean;\n    _showPadding: ?boolean;\n    _showTileAABBs: ?boolean;\n    _showOverdrawInspector: boolean;\n    _repaint: ?boolean;\n    _vertices: ?boolean;\n    _canvas: HTMLCanvasElement;\n    _minTileCacheSize: ?number;\n    _maxTileCacheSize: ?number;\n    _frame: ?Cancelable;\n    _renderNextFrame: ?boolean;\n    _styleDirty: ?boolean;\n    _sourcesDirty: ?boolean;\n    _placementDirty: ?boolean;\n    _loaded: boolean;\n    _fullyLoaded: boolean; // accounts for placement finishing as well\n    _trackResize: boolean;\n    _preserveDrawingBuffer: boolean;\n    _failIfMajorPerformanceCaveat: boolean;\n    _antialias: boolean;\n    _refreshExpiredTiles: boolean;\n    _hash: Hash;\n    _delegatedListeners: any;\n    _fullscreenchangeEvent: \"fullscreenchange\" | \"webkitfullscreenchange\";\n    _isInitialLoad: boolean;\n    _shouldCheckAccess: boolean;\n    _fadeDuration: number;\n    _crossSourceCollisions: boolean;\n    _collectResourceTiming: boolean;\n    _renderTaskQueue: TaskQueue;\n    _domRenderTaskQueue: TaskQueue;\n    _controls: Array<IControl>;\n    _markers: Array<Marker>;\n    _popups: Array<Popup>;\n    _logoControl: IControl;\n    _mapId: number;\n    _localIdeographFontFamily: string;\n    _localFontFamily: ?string;\n    _requestManager: RequestManager;\n    _locale: Object;\n    _removed: boolean;\n    _speedIndexTiming: boolean;\n    _clickTolerance: number;\n    _cooperativeGestures: boolean;\n    _silenceAuthErrors: boolean;\n    _averageElevationLastSampledAt: number;\n    _averageElevationExaggeration: number;\n    _averageElevation: EasedVariable;\n    _containerWidth: number;\n    _containerHeight: number;\n    _language: ?string | ?string[];\n    _worldview: ?string;\n    _interactionRange: [number, number];\n    _visibilityHidden: number;\n    _performanceMetricsCollection: boolean;\n\n    // `_useExplicitProjection` indicates that a projection is set by a call to map.setProjection()\n    _useExplicitProjection: boolean;\n\n    /** @section {Interaction handlers} */\n\n    /**\n     * The map's {@link ScrollZoomHandler}, which implements zooming in and out with a scroll wheel or trackpad.\n     * Find more details and examples using `scrollZoom` in the {@link ScrollZoomHandler} section.\n     */\n    scrollZoom: ScrollZoomHandler;\n\n    /**\n     * The map's {@link BoxZoomHandler}, which implements zooming using a drag gesture with the Shift key pressed.\n     * Find more details and examples using `boxZoom` in the {@link BoxZoomHandler} section.\n     */\n    boxZoom: BoxZoomHandler;\n\n    /**\n     * The map's {@link DragRotateHandler}, which implements rotating the map while dragging with the right\n     * mouse button or with the Control key pressed. Find more details and examples using `dragRotate`\n     * in the {@link DragRotateHandler} section.\n     */\n    dragRotate: DragRotateHandler;\n\n    /**\n     * The map's {@link DragPanHandler}, which implements dragging the map with a mouse or touch gesture.\n     * Find more details and examples using `dragPan` in the {@link DragPanHandler} section.\n     */\n    dragPan: DragPanHandler;\n\n    /**\n     * The map's {@link KeyboardHandler}, which allows the user to zoom, rotate, and pan the map using keyboard\n     * shortcuts. Find more details and examples using `keyboard` in the {@link KeyboardHandler} section.\n     */\n    keyboard: KeyboardHandler;\n\n    /**\n     * The map's {@link DoubleClickZoomHandler}, which allows the user to zoom by double clicking.\n     * Find more details and examples using `doubleClickZoom` in the {@link DoubleClickZoomHandler} section.\n     */\n    doubleClickZoom: DoubleClickZoomHandler;\n\n    /**\n     * The map's {@link TouchZoomRotateHandler}, which allows the user to zoom or rotate the map with touch gestures.\n     * Find more details and examples using `touchZoomRotate` in the {@link TouchZoomRotateHandler} section.\n     */\n    touchZoomRotate: TouchZoomRotateHandler;\n\n    /**\n     * The map's {@link TouchPitchHandler}, which allows the user to pitch the map with touch gestures.\n     * Find more details and examples using `touchPitch` in the {@link TouchPitchHandler} section.\n     */\n    touchPitch: TouchPitchHandler;\n\n    _contextCreateOptions: ContextOptions;\n    _tp: ITrackedParameters;\n\n    constructor(options: MapOptions) {\n        LivePerformanceUtils.mark(PerformanceMarkers.create);\n\n        const initialOptions = options;\n\n        options = (extend({}, defaultOptions, options): typeof defaultOptions & MapOptions);\n\n        if (options.minZoom != null && options.maxZoom != null && options.minZoom > options.maxZoom) {\n            throw new Error(`maxZoom must be greater than or equal to minZoom`);\n        }\n\n        if (options.minPitch != null && options.maxPitch != null && options.minPitch > options.maxPitch) {\n            throw new Error(`maxPitch must be greater than or equal to minPitch`);\n        }\n\n        if (options.minPitch != null && options.minPitch < defaultMinPitch) {\n            throw new Error(`minPitch must be greater than or equal to ${defaultMinPitch}`);\n        }\n\n        if (options.maxPitch != null && options.maxPitch > defaultMaxPitch) {\n            throw new Error(`maxPitch must be less than or equal to ${defaultMaxPitch}`);\n        }\n\n        // disable antialias with OS/iOS 15.4 and 15.5 due to rendering bug\n        if (options.antialias && isSafariWithAntialiasingBug(window)) {\n            options.antialias = false;\n            warnOnce('Antialiasing is disabled for this WebGL context to avoid browser bug: https://github.com/mapbox/mapbox-gl-js/issues/11609');\n        }\n\n        const transform = new Transform(options.minZoom, options.maxZoom, options.minPitch, options.maxPitch, options.renderWorldCopies);\n        super(transform, options);\n\n        this._repaint = !!options.repaint;\n        this._interactive = options.interactive;\n        this._minTileCacheSize = options.minTileCacheSize;\n        this._maxTileCacheSize = options.maxTileCacheSize;\n        this._failIfMajorPerformanceCaveat = options.failIfMajorPerformanceCaveat;\n        this._preserveDrawingBuffer = options.preserveDrawingBuffer;\n        this._antialias = options.antialias;\n        this._trackResize = options.trackResize;\n        this._bearingSnap = options.bearingSnap;\n        this._refreshExpiredTiles = options.refreshExpiredTiles;\n        this._fadeDuration = options.fadeDuration;\n        this._isInitialLoad = true;\n        this._crossSourceCollisions = options.crossSourceCollisions;\n        this._collectResourceTiming = options.collectResourceTiming;\n        this._language = this._parseLanguage(options.language);\n        this._worldview = options.worldview;\n        this._renderTaskQueue = new TaskQueue();\n        this._domRenderTaskQueue = new TaskQueue();\n        this._controls = [];\n        this._markers = [];\n        this._popups = [];\n        this._mapId = uniqueId();\n        this._locale = extend({}, defaultLocale, options.locale);\n        this._clickTolerance = options.clickTolerance;\n        this._cooperativeGestures = options.cooperativeGestures;\n        this._performanceMetricsCollection = options.performanceMetricsCollection;\n        this._containerWidth = 0;\n        this._containerHeight = 0;\n        this._showParseStatus = true;\n\n        this._averageElevationLastSampledAt = -Infinity;\n        this._averageElevationExaggeration = 0;\n        this._averageElevation = new EasedVariable(0);\n\n        this._interactionRange = [+Infinity, -Infinity];\n        this._visibilityHidden = 0;\n\n        this._useExplicitProjection = false; // Fallback to stylesheet by default\n\n        this._requestManager = new RequestManager(options.transformRequest, options.accessToken, options.testMode);\n        this._silenceAuthErrors = !!options.testMode;\n        if (options.contextCreateOptions) {\n            this._contextCreateOptions = {...options.contextCreateOptions};\n        } else {\n            this._contextCreateOptions = {};\n        }\n\n        if (typeof options.container === 'string') {\n            const container = document.getElementById(options.container);\n            if (container) {\n                this._container = container;\n            } else {\n                throw new Error(`Container '${options.container.toString()}' not found.`);\n            }\n\n        } else if (options.container instanceof HTMLElement) {\n            this._container = options.container;\n        } else {\n            throw new Error(`Invalid type: 'container' must be a String or HTMLElement.`);\n        }\n\n        if (this._container.childNodes.length > 0) {\n            warnOnce(`The map container element should be empty, otherwise the map's interactivity will be negatively impacted. If you want to display a message when WebGL is not supported, use the Mapbox GL Supported plugin instead.`);\n        }\n\n        if (options.maxBounds) {\n            this.setMaxBounds(options.maxBounds);\n        }\n\n        bindAll([\n            '_onWindowOnline',\n            '_onWindowResize',\n            '_onVisibilityChange',\n            '_onMapScroll',\n            '_contextLost',\n            '_contextRestored'\n        ], this);\n\n        this._setupContainer();\n        if (options.devtools) {\n            this._tp = new TP.TrackedParameters(this);\n        } else {\n            this._tp = new TP.TrackedParametersMock();\n        }\n        this._tp.registerParameter(this, [\"Debug\"], \"showOverdrawInspector\");\n        this._tp.registerParameter(this, [\"Debug\"], \"showTileBoundaries\");\n        this._tp.registerParameter(this, [\"Debug\"], \"showParseStatus\");\n        this._tp.registerParameter(this, [\"Debug\"], \"repaint\");\n        this._tp.registerParameter(this, [\"Debug\"], \"showTileAABBs\");\n        this._tp.registerParameter(this, [\"Debug\"], \"showPadding\");\n        this._tp.registerParameter(this, [\"Debug\"], \"showCollisionBoxes\", {noSave: true});\n        this._tp.registerParameter(this.transform, [\"Debug\"], \"freezeTileCoverage\", {noSave: true}, () => {\n            this._update();\n        });\n        this._tp.registerParameter(this, [\"Debug\", \"Wireframe\"], \"showTerrainWireframe\");\n        this._tp.registerParameter(this, [\"Debug\", \"Wireframe\"], \"showLayers2DWireframe\");\n        this._tp.registerParameter(this, [\"Debug\", \"Wireframe\"], \"showLayers3DWireframe\");\n\n        this._setupPainter();\n        if (this.painter === undefined) {\n            throw new Error(`Failed to initialize WebGL.`);\n        }\n\n        this.on('move', () => this._update(false));\n        this.on('moveend', () => this._update(false));\n        this.on('zoom', () => this._update(true));\n\n        this._fullscreenchangeEvent = 'onfullscreenchange' in document ?\n            'fullscreenchange' :\n            'webkitfullscreenchange';\n\n        // $FlowFixMe[method-unbinding]\n        window.addEventListener('online', this._onWindowOnline, false);\n        // $FlowFixMe[method-unbinding]\n        window.addEventListener('resize', this._onWindowResize, false);\n        // $FlowFixMe[method-unbinding]\n        window.addEventListener('orientationchange', this._onWindowResize, false);\n        // $FlowFixMe[method-unbinding]\n        window.addEventListener(this._fullscreenchangeEvent, this._onWindowResize, false);\n        // $FlowFixMe[method-unbinding]\n        window.addEventListener('visibilitychange', this._onVisibilityChange, false);\n\n        this.handlers = new HandlerManager(this, options);\n\n        this._localFontFamily = options.localFontFamily;\n        this._localIdeographFontFamily = options.localIdeographFontFamily;\n\n        if (options.style || !options.testMode) {\n            const style = options.style || config.DEFAULT_STYLE;\n            this.setStyle(style, {\n                config: options.config,\n                localFontFamily: this._localFontFamily,\n                localIdeographFontFamily: this._localIdeographFontFamily\n            });\n        }\n\n        if (options.projection) {\n            this.setProjection(options.projection);\n        }\n\n        const hashName = (typeof options.hash === 'string' && options.hash) || undefined;\n        if (options.hash) this._hash = (new Hash(hashName)).addTo(this);\n        // don't set position from options if set through hash\n        if (!this._hash || !this._hash._onHashChange()) {\n            // if we set `center`/`zoom` explicitly, mark as modified even if the values match defaults\n            if (initialOptions.center != null || initialOptions.zoom != null) {\n                this.transform._unmodified = false;\n            }\n\n            this.jumpTo({\n                center: options.center,\n                zoom: options.zoom,\n                bearing: options.bearing,\n                pitch: options.pitch\n            });\n\n            const bounds = options.bounds;\n            if (bounds) {\n                this.resize();\n                this.fitBounds(bounds, extend({}, options.fitBoundsOptions, {duration: 0}));\n            }\n        }\n\n        this.resize();\n\n        if (options.attributionControl)\n            // $FlowFixMe[method-unbinding]\n            this.addControl(new AttributionControl({customAttribution: options.customAttribution}));\n\n        // $FlowFixMe[method-unbinding]\n        this._logoControl = new LogoControl();\n        // $FlowFixMe[method-unbinding]\n        this.addControl(this._logoControl, options.logoPosition);\n\n        this.on('style.load', () => {\n            if (this.transform.unmodified) {\n                this.jumpTo((this.style.stylesheet: any));\n            }\n            this._postStyleLoadEvent();\n        });\n        this.on('data', (event: MapDataEvent) => {\n            this._update(event.dataType === 'style');\n            this.fire(new Event(`${event.dataType}data`, event));\n        });\n        this.on('dataloading', (event: MapDataEvent) => {\n            this.fire(new Event(`${event.dataType}dataloading`, event));\n        });\n    }\n\n    /*\n    * Returns a unique number for this map instance which is used for the MapLoadEvent\n    * to make sure we only fire one event per instantiated map object.\n    * @private\n    * @returns {number}\n    */\n    _getMapId(): number {\n        return this._mapId;\n    }\n\n    /** @section {Controls} */\n\n    /**\n     * Adds an {@link IControl} to the map, calling `control.onAdd(this)`.\n     *\n     * @param {IControl} control The {@link IControl} to add.\n     * @param {string} [position] Position on the map to which the control will be added.\n     * Valid values are `'top-left'`, `'top-right'`, `'bottom-left'`, and `'bottom-right'`. Defaults to `'top-right'`.\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * // Add zoom and rotation controls to the map.\n     * map.addControl(new mapboxgl.NavigationControl());\n     * @see [Example: Display map navigation controls](https://www.mapbox.com/mapbox-gl-js/example/navigation/)\n     */\n    addControl(control: IControl, position?: ControlPosition): this {\n        if (position === undefined) {\n            if (control.getDefaultPosition) {\n                position = control.getDefaultPosition();\n            } else {\n                position = 'top-right';\n            }\n        }\n        if (!control || !control.onAdd) {\n            return this.fire(new ErrorEvent(new Error(\n                'Invalid argument to map.addControl(). Argument must be a control with onAdd and onRemove methods.')));\n        }\n        const controlElement = control.onAdd(this);\n        this._controls.push(control);\n\n        const positionContainer = this._controlPositions[position];\n        if (position.indexOf('bottom') !== -1) {\n            positionContainer.insertBefore(controlElement, positionContainer.firstChild);\n        } else {\n            positionContainer.appendChild(controlElement);\n        }\n        return this;\n    }\n\n    /**\n     * Removes the control from the map.\n     *\n     * @param {IControl} control The {@link IControl} to remove.\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * // Define a new navigation control.\n     * const navigation = new mapboxgl.NavigationControl();\n     * // Add zoom and rotation controls to the map.\n     * map.addControl(navigation);\n     * // Remove zoom and rotation controls from the map.\n     * map.removeControl(navigation);\n     */\n    removeControl(control: IControl): this {\n        if (!control || !control.onRemove) {\n            return this.fire(new ErrorEvent(new Error(\n                'Invalid argument to map.removeControl(). Argument must be a control with onAdd and onRemove methods.')));\n        }\n        const ci = this._controls.indexOf(control);\n        if (ci > -1) this._controls.splice(ci, 1);\n        control.onRemove(this);\n        return this;\n    }\n\n    /**\n     * Checks if a control is on the map.\n     *\n     * @param {IControl} control The {@link IControl} to check.\n     * @returns {boolean} True if map contains control.\n     * @example\n     * // Define a new navigation control.\n     * const navigation = new mapboxgl.NavigationControl();\n     * // Add zoom and rotation controls to the map.\n     * map.addControl(navigation);\n     * // Check that the navigation control exists on the map.\n     * const added = map.hasControl(navigation);\n     * // added === true\n     */\n    hasControl(control: IControl): boolean {\n        return this._controls.indexOf(control) > -1;\n    }\n\n    /**\n     * Returns the map's containing HTML element.\n     *\n     * @returns {HTMLElement} The map's container.\n     * @example\n     * const container = map.getContainer();\n     */\n    getContainer(): HTMLElement {\n        return this._container;\n    }\n\n    /**\n     * Returns the HTML element containing the map's `<canvas>` element.\n     *\n     * If you want to add non-GL overlays to the map, you should append them to this element.\n     *\n     * This is the element to which event bindings for map interactivity (such as panning and zooming) are\n     * attached. It will receive bubbled events from child elements such as the `<canvas>`, but not from\n     * map controls.\n     *\n     * @returns {HTMLElement} The container of the map's `<canvas>`.\n     * @example\n     * const canvasContainer = map.getCanvasContainer();\n     * @see [Example: Create a draggable point](https://www.mapbox.com/mapbox-gl-js/example/drag-a-point/)\n     * @see [Example: Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/)\n     */\n    getCanvasContainer(): HTMLElement {\n        return this._canvasContainer;\n    }\n\n    /**\n     * Returns the map's `<canvas>` element.\n     *\n     * @returns {HTMLCanvasElement} The map's `<canvas>` element.\n     * @example\n     * const canvas = map.getCanvas();\n     * @see [Example: Measure distances](https://www.mapbox.com/mapbox-gl-js/example/measure/)\n     * @see [Example: Display a popup on hover](https://www.mapbox.com/mapbox-gl-js/example/popup-on-hover/)\n     * @see [Example: Center the map on a clicked symbol](https://www.mapbox.com/mapbox-gl-js/example/center-on-symbol/)\n     */\n    getCanvas(): HTMLCanvasElement {\n        return this._canvas;\n    }\n\n    /** @section {Map constraints} */\n\n    /**\n     * Resizes the map according to the dimensions of its\n     * `container` element.\n     *\n     * Checks if the map container size changed and updates the map if it has changed.\n     * This method must be called after the map's `container` is resized programmatically\n     * or when the map is shown after being initially hidden with CSS.\n     *\n     * @param {Object | null} eventData Additional properties to be passed to `movestart`, `move`, `resize`, and `moveend`\n     * events that get triggered as a result of resize. This can be useful for differentiating the\n     * source of an event (for example, user-initiated or programmatically-triggered events).\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * // Resize the map when the map container is shown\n     * // after being initially hidden with CSS.\n     * const mapDiv = document.getElementById('map');\n     * if (mapDiv.style.visibility === true) map.resize();\n     */\n    resize(eventData?: Object): this {\n        this._updateContainerDimensions();\n\n        // do nothing if container remained the same size\n        if (this._containerWidth === this.transform.width && this._containerHeight === this.transform.height) return this;\n\n        this._resizeCanvas(this._containerWidth, this._containerHeight);\n\n        this.transform.resize(this._containerWidth, this._containerHeight);\n        this.painter.resize(Math.ceil(this._containerWidth), Math.ceil(this._containerHeight));\n\n        const fireMoving = !this._moving;\n        if (fireMoving) {\n            this.fire(new Event('movestart', eventData))\n                .fire(new Event('move', eventData));\n        }\n\n        this.fire(new Event('resize', eventData));\n\n        if (fireMoving) this.fire(new Event('moveend', eventData));\n\n        return this;\n    }\n\n    /**\n     * Returns the map's geographical bounds. When the bearing or pitch is non-zero, the visible region is not\n     * an axis-aligned rectangle, and the result is the smallest bounds that encompasses the visible region.\n     * If a padding is set on the map, the bounds returned are for the inset.\n     * With globe projection, the smallest bounds encompassing the visible region\n     * may not precisely represent the visible region due to the earth's curvature.\n     *\n     * @returns {LngLatBounds} The geographical bounds of the map as {@link LngLatBounds}.\n     * @example\n     * const bounds = map.getBounds();\n     */\n    getBounds(): LngLatBounds | null {\n        return this.transform.getBounds();\n    }\n\n    /**\n     * Returns the maximum geographical bounds the map is constrained to, or `null` if none set.\n     *\n     * @returns {Map} The map object.\n     *\n     * @example\n     * const maxBounds = map.getMaxBounds();\n     */\n    getMaxBounds(): LngLatBounds | null {\n        return this.transform.getMaxBounds() || null;\n    }\n\n    /**\n     * Sets or clears the map's geographical bounds.\n     *\n     * Pan and zoom operations are constrained within these bounds.\n     * If a pan or zoom is performed that would\n     * display regions outside these bounds, the map will\n     * instead display a position and zoom level\n     * as close as possible to the operation's request while still\n     * remaining within the bounds.\n     *\n     * For `mercator` projection, the viewport will be constrained to the bounds.\n     * For other projections such as `globe`, only the map center will be constrained.\n     *\n     * @param {LngLatBoundsLike | null | undefined} bounds The maximum bounds to set. If `null` or `undefined` is provided, the function removes the map's maximum bounds.\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * // Define bounds that conform to the `LngLatBoundsLike` object.\n     * const bounds = [\n     *     [-74.04728, 40.68392], // [west, south]\n     *     [-73.91058, 40.87764]  // [east, north]\n     * ];\n     * // Set the map's max bounds.\n     * map.setMaxBounds(bounds);\n     */\n    setMaxBounds(bounds: LngLatBoundsLike): this {\n        this.transform.setMaxBounds(LngLatBounds.convert(bounds));\n        return this._update();\n    }\n\n    /**\n     * Sets or clears the map's minimum zoom level.\n     * If the map's current zoom level is lower than the new minimum,\n     * the map will zoom to the new minimum.\n     *\n     * It is not always possible to zoom out and reach the set `minZoom`.\n     * Other factors such as map height may restrict zooming. For example,\n     * if the map is 512px tall it will not be possible to zoom below zoom 0\n     * no matter what the `minZoom` is set to.\n     *\n     * @param {number | null | undefined} minZoom The minimum zoom level to set (-2 - 24).\n     * If `null` or `undefined` is provided, the function removes the current minimum zoom and it will be reset to -2.\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * map.setMinZoom(12.25);\n     */\n    setMinZoom(minZoom?: ?number): this {\n\n        minZoom = minZoom === null || minZoom === undefined ? defaultMinZoom : minZoom;\n\n        if (minZoom >= defaultMinZoom && minZoom <= this.transform.maxZoom) {\n            this.transform.minZoom = minZoom;\n            this._update();\n\n            if (this.getZoom() < minZoom) {\n                this.setZoom(minZoom);\n            } else {\n                this.fire(new Event('zoomstart'))\n                    .fire(new Event('zoom'))\n                    .fire(new Event('zoomend'));\n            }\n\n            return this;\n\n        } else throw new Error(`minZoom must be between ${defaultMinZoom} and the current maxZoom, inclusive`);\n    }\n\n    /**\n     * Returns the map's minimum allowable zoom level.\n     *\n     * @returns {number} Returns `minZoom`.\n     * @example\n     * const minZoom = map.getMinZoom();\n     */\n    getMinZoom(): number { return this.transform.minZoom; }\n\n    /**\n     * Sets or clears the map's maximum zoom level.\n     * If the map's current zoom level is higher than the new maximum,\n     * the map will zoom to the new maximum.\n     *\n     * @param {number | null | undefined} maxZoom The maximum zoom level to set.\n     * If `null` or `undefined` is provided, the function removes the current maximum zoom (sets it to 22).\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * map.setMaxZoom(18.75);\n     */\n    setMaxZoom(maxZoom?: ?number): this {\n\n        maxZoom = maxZoom === null || maxZoom === undefined ? defaultMaxZoom : maxZoom;\n\n        if (maxZoom >= this.transform.minZoom) {\n            this.transform.maxZoom = maxZoom;\n            this._update();\n\n            if (this.getZoom() > maxZoom) {\n                this.setZoom(maxZoom);\n            } else {\n                this.fire(new Event('zoomstart'))\n                    .fire(new Event('zoom'))\n                    .fire(new Event('zoomend'));\n            }\n\n            return this;\n\n        } else throw new Error(`maxZoom must be greater than the current minZoom`);\n    }\n\n    /**\n     * Returns the map's maximum allowable zoom level.\n     *\n     * @returns {number} Returns `maxZoom`.\n     * @example\n     * const maxZoom = map.getMaxZoom();\n     */\n    getMaxZoom(): number { return this.transform.maxZoom; }\n\n    /**\n     * Sets or clears the map's minimum pitch.\n     * If the map's current pitch is lower than the new minimum,\n     * the map will pitch to the new minimum.\n     *\n     * @param {number | null | undefined} minPitch The minimum pitch to set (0-85). If `null` or `undefined` is provided, the function removes the current minimum pitch and resets it to 0.\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * map.setMinPitch(5);\n     */\n    setMinPitch(minPitch?: ?number): this {\n\n        minPitch = minPitch === null || minPitch === undefined ? defaultMinPitch : minPitch;\n\n        if (minPitch < defaultMinPitch) {\n            throw new Error(`minPitch must be greater than or equal to ${defaultMinPitch}`);\n        }\n\n        if (minPitch >= defaultMinPitch && minPitch <= this.transform.maxPitch) {\n            this.transform.minPitch = minPitch;\n            this._update();\n\n            if (this.getPitch() < minPitch) {\n                this.setPitch(minPitch);\n            } else {\n                this.fire(new Event('pitchstart'))\n                    .fire(new Event('pitch'))\n                    .fire(new Event('pitchend'));\n            }\n\n            return this;\n\n        } else throw new Error(`minPitch must be between ${defaultMinPitch} and the current maxPitch, inclusive`);\n    }\n\n    /**\n     * Returns the map's minimum allowable pitch.\n     *\n     * @returns {number} Returns `minPitch`.\n     * @example\n     * const minPitch = map.getMinPitch();\n     */\n    getMinPitch(): number { return this.transform.minPitch; }\n\n    /**\n     * Sets or clears the map's maximum pitch.\n     * If the map's current pitch is higher than the new maximum,\n     * the map will pitch to the new maximum.\n     *\n     * @param {number | null | undefined} maxPitch The maximum pitch to set.\n     * If `null` or `undefined` is provided, the function removes the current maximum pitch (sets it to 85).\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * map.setMaxPitch(70);\n     */\n    setMaxPitch(maxPitch?: ?number): this {\n\n        maxPitch = maxPitch === null || maxPitch === undefined ? defaultMaxPitch : maxPitch;\n\n        if (maxPitch > defaultMaxPitch) {\n            throw new Error(`maxPitch must be less than or equal to ${defaultMaxPitch}`);\n        }\n\n        if (maxPitch >= this.transform.minPitch) {\n            this.transform.maxPitch = maxPitch;\n            this._update();\n\n            if (this.getPitch() > maxPitch) {\n                this.setPitch(maxPitch);\n            } else {\n                this.fire(new Event('pitchstart'))\n                    .fire(new Event('pitch'))\n                    .fire(new Event('pitchend'));\n            }\n\n            return this;\n\n        } else throw new Error(`maxPitch must be greater than or equal to minPitch`);\n    }\n\n    /**\n     * Returns the map's maximum allowable pitch.\n     *\n     * @returns {number} Returns `maxPitch`.\n     * @example\n     * const maxPitch = map.getMaxPitch();\n     */\n    getMaxPitch(): number { return this.transform.maxPitch; }\n\n    /**\n     * Returns the state of `renderWorldCopies`. If `true`, multiple copies of the world will be rendered side by side beyond -180 and 180 degrees longitude. If set to `false`:\n     * - When the map is zoomed out far enough that a single representation of the world does not fill the map's entire\n     * container, there will be blank space beyond 180 and -180 degrees longitude.\n     * - Features that cross 180 and -180 degrees longitude will be cut in two (with one portion on the right edge of the\n     * map and the other on the left edge of the map) at every zoom level.\n     *\n     * @returns {boolean} Returns `renderWorldCopies` boolean.\n     * @example\n     * const worldCopiesRendered = map.getRenderWorldCopies();\n     * @see [Example: Render world copies](https://docs.mapbox.com/mapbox-gl-js/example/render-world-copies/)\n     */\n    getRenderWorldCopies(): boolean { return this.transform.renderWorldCopies; }\n\n    /**\n     * Sets the state of `renderWorldCopies`.\n     *\n     * @param {boolean} renderWorldCopies If `true`, multiple copies of the world will be rendered side by side beyond -180 and 180 degrees longitude. If set to `false`:\n     * - When the map is zoomed out far enough that a single representation of the world does not fill the map's entire\n     * container, there will be blank space beyond 180 and -180 degrees longitude.\n     * - Features that cross 180 and -180 degrees longitude will be cut in two (with one portion on the right edge of the\n     * map and the other on the left edge of the map) at every zoom level.\n     *\n     * `undefined` is treated as `true`, `null` is treated as `false`.\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * map.setRenderWorldCopies(true);\n     * @see [Example: Render world copies](https://docs.mapbox.com/mapbox-gl-js/example/render-world-copies/)\n     */\n    setRenderWorldCopies(renderWorldCopies?: ?boolean): this {\n        this.transform.renderWorldCopies = renderWorldCopies;\n        if (!this.transform.renderWorldCopies) {\n            this._forceMarkerAndPopupUpdate(true);\n        }\n        return this._update();\n    }\n\n    /**\n     * Returns the map's language, which is used for translating map labels and UI components.\n     *\n     * @private\n     * @returns {undefined | string | string[]} Returns the map's language code.\n     * @example\n     * const language = map.getLanguage();\n     */\n    getLanguage(): ?string | ?string[] {\n        return this._language;\n    }\n\n    _parseLanguage(language?: 'auto' | ?string | ?string[]): ?string | ?string[] {\n        if (language === 'auto') return navigator.language;\n        if (Array.isArray(language)) return language.length === 0 ?\n            undefined :\n            language.map(l => l === 'auto' ? navigator.language : l);\n\n        return language;\n    }\n\n    /**\n     * Sets the map's language, which is used for translating map labels and UI components.\n     *\n     * @private\n     * @param {'auto' | string | string[]} [language] A string representing the desired language used for the map's labels and UI components. Languages can only be set on Mapbox vector tile sources.\n     *  Valid language strings must be a [BCP-47 language code](https://en.wikipedia.org/wiki/IETF_language_tag#List_of_subtags). Unsupported BCP-47 codes will not include any translations. Invalid codes will result in an recoverable error.\n     *  If a label has no translation for the selected language, it will display in the label's local language.\n     *  If param is set to `auto`, GL JS will select a user's preferred language as determined by the browser's [`window.navigator.language`](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/language) property.\n     *  If the `locale` property is not set separately, this language will also be used to localize the UI for supported languages.\n     *  If param is set to `undefined` or `null`, it will remove the current map language and reset the language used for translating map labels and UI components.\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * map.setLanguage('es');\n     *\n     * @example\n     * map.setLanguage(['en-GB', 'en-US']);\n     *\n     * @example\n     * map.setLanguage('auto');\n     *\n     * @example\n     * map.setLanguage();\n     */\n    setLanguage(language?: 'auto' | ?string | ?string[]): this {\n        const newLanguage = this._parseLanguage(language);\n        if (!this.style || newLanguage === this._language) return this;\n        this._language = newLanguage;\n\n        this.style.reloadSources();\n\n        for (const control of this._controls) {\n            if (control._setLanguage) {\n                control._setLanguage(this._language);\n            }\n        }\n\n        return this;\n    }\n\n    /**\n     * Returns the code for the map's worldview.\n     *\n     * @private\n     * @returns {string} Returns the map's worldview code.\n     * @example\n     * const worldview = map.getWorldview();\n     */\n    getWorldview(): ?string {\n        return this._worldview;\n    }\n\n    /**\n     * Sets the map's worldview.\n     *\n     * @private\n     * @param {string} [worldview] A string representing the desired worldview.\n     *  A worldview determines the way that certain disputed boundaries are rendered.\n     *  Valid worldview strings must be an [ISO alpha-2 country code](https://en.wikipedia.org/wiki/ISO_3166-1#Current_codes).\n     *  Unsupported ISO alpha-2 codes will fall back to the TileJSON's default worldview. Invalid codes will result in a recoverable error.\n     *  If param is set to `undefined` or `null`, it will cause the map to fall back to the TileJSON's default worldview.\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * map.setWorldView('JP');\n     *\n     * @example\n     * map.setWorldView();\n     */\n    setWorldview(worldview?: ?string): this {\n        if (!this.style || worldview === this._worldview) return this;\n\n        this._worldview = worldview;\n        this.style.reloadSources();\n\n        return this;\n    }\n\n    /** @section {Point conversion} */\n\n    /**\n     * Returns a [projection](https://docs.mapbox.com/mapbox-gl-js/style-spec/projection/) object that defines the current map projection.\n     *\n     * @returns {ProjectionSpecification} The [projection](https://docs.mapbox.com/mapbox-gl-js/style-spec/projection/) defining the current map projection.\n     * @example\n     * const projection = map.getProjection();\n     */\n    getProjection(): ProjectionSpecification {\n        if (this.transform.mercatorFromTransition) {\n            return {name: \"globe\", center: [0, 0]};\n        }\n        return this.transform.getProjection();\n    }\n\n    /**\n     * Returns true if map [projection](https://docs.mapbox.com/mapbox-gl-js/style-spec/projection/) has been set to globe AND the map is at a low enough zoom level that globe view is enabled.\n     * @private\n     * @returns {boolean} Returns `globe-is-active` boolean.\n     * @example\n     * if (map._showingGlobe()) {\n     *     // do globe things here\n     * }\n     */\n    _showingGlobe(): boolean { return this.transform.projection.name === 'globe'; }\n\n    /**\n     * Sets the map's projection. If called with `null` or `undefined`, the map will reset to Mercator.\n     *\n     * @param {ProjectionSpecification | string | null | undefined} projection The projection that the map should be rendered in.\n     * This can be a [projection](https://docs.mapbox.com/mapbox-gl-js/style-spec/projection/) object or a string of the projection's name.\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * map.setProjection('albers');\n     * map.setProjection({\n     *     name: 'albers',\n     *     center: [35, 55],\n     *     parallels: [20, 60]\n     * });\n     * @see [Example: Display a web map using an alternate projection](https://docs.mapbox.com/mapbox-gl-js/example/map-projection/)\n     * @see [Example: Use different map projections for web maps](https://docs.mapbox.com/mapbox-gl-js/example/projections/)\n     */\n    setProjection(projection?: ?ProjectionSpecification | string): this {\n        this._lazyInitEmptyStyle();\n\n        if (!projection) {\n            projection = null;\n        } else if (typeof projection === 'string') {\n            projection = (({name: projection}: any): ProjectionSpecification);\n        }\n\n        this._useExplicitProjection = !!projection;\n        return this._prioritizeAndUpdateProjection(projection, this.style.projection);\n    }\n\n    _updateProjectionTransition() {\n        // The projection isn't globe, we can skip updating the transition\n        if (this.getProjection().name !== 'globe') {\n            return;\n        }\n\n        const tr = this.transform;\n        const projection = tr.projection.name;\n        let projectionHasChanged;\n\n        if (projection === 'globe' && tr.zoom >= GLOBE_ZOOM_THRESHOLD_MAX) {\n            tr.setMercatorFromTransition();\n            projectionHasChanged = true;\n        } else if (projection === 'mercator' && tr.zoom < GLOBE_ZOOM_THRESHOLD_MAX) {\n            tr.setProjection({name: 'globe'});\n            projectionHasChanged = true;\n        }\n\n        if (projectionHasChanged) {\n            this.style.applyProjectionUpdate();\n            this.style._forceSymbolLayerUpdate();\n        }\n    }\n\n    _prioritizeAndUpdateProjection(explicitProjection: ?ProjectionSpecification, styleProjection: ?ProjectionSpecification): this {\n        // Given a stylesheet and eventual runtime projection, in order of priority, we select:\n        //  1. the explicit projection\n        //  2. the stylesheet projection\n        //  3. mercator (fallback)\n        const prioritizedProjection = explicitProjection || styleProjection || {name: \"mercator\"};\n\n        return this._updateProjection(prioritizedProjection);\n    }\n\n    _updateProjection(projection: ProjectionSpecification): this {\n        let projectionHasChanged;\n\n        if (projection.name === 'globe' && this.transform.zoom >= GLOBE_ZOOM_THRESHOLD_MAX) {\n            projectionHasChanged = this.transform.setMercatorFromTransition();\n        } else {\n            projectionHasChanged = this.transform.setProjection(projection);\n        }\n\n        this.style.applyProjectionUpdate();\n\n        if (projectionHasChanged) {\n            this.painter.clearBackgroundTiles();\n            this.style.clearSources();\n\n            this._update(true);\n            this._forceMarkerAndPopupUpdate(true);\n        }\n\n        return this;\n    }\n\n    /**\n     * Returns a {@link Point} representing pixel coordinates, relative to the map's `container`,\n     * that correspond to the specified geographical location.\n     *\n     * When the map is pitched and `lnglat` is completely behind the camera, there are no pixel\n     * coordinates corresponding to that location. In that case,\n     * the `x` and `y` components of the returned {@link Point} are set to Number.MAX_VALUE.\n     *\n     * @param {LngLatLike} lnglat The geographical location to project.\n     * @returns {Point} The {@link Point} corresponding to `lnglat`, relative to the map's `container`.\n     * @example\n     * const coordinate = [-122.420679, 37.772537];\n     * const point = map.project(coordinate);\n     */\n    project(lnglat: LngLatLike): Point {\n        return this.transform.locationPoint3D(LngLat.convert(lnglat));\n    }\n\n    /**\n     * Returns a {@link LngLat} representing geographical coordinates that correspond\n     * to the specified pixel coordinates. If horizon is visible, and specified pixel is\n     * above horizon, returns a {@link LngLat} corresponding to point on horizon, nearest\n     * to the point.\n     *\n     * @param {PointLike} point The pixel coordinates to unproject.\n     * @returns {LngLat} The {@link LngLat} corresponding to `point`.\n     * @example\n     * map.on('click', (e) => {\n     *     // When the map is clicked, get the geographic coordinate.\n     *     const coordinate = map.unproject(e.point);\n     * });\n     */\n    unproject(point: PointLike): LngLat {\n        return this.transform.pointLocation3D(Point.convert(point));\n    }\n\n    /** @section {Movement state} */\n\n    /**\n     * Returns true if the map is panning, zooming, rotating, or pitching due to a camera animation or user gesture.\n     *\n     * @returns {boolean} True if the map is moving.\n     * @example\n     * const isMoving = map.isMoving();\n     */\n    isMoving(): boolean {\n        return this._moving || (this.handlers && this.handlers.isMoving()) || false;\n    }\n\n    /**\n     * Returns true if the map is zooming due to a camera animation or user gesture.\n     *\n     * @returns {boolean} True if the map is zooming.\n     * @example\n     * const isZooming = map.isZooming();\n     */\n    isZooming(): boolean {\n        return this._zooming || (this.handlers && this.handlers.isZooming()) || false;\n    }\n\n    /**\n     * Returns true if the map is rotating due to a camera animation or user gesture.\n     *\n     * @returns {boolean} True if the map is rotating.\n     * @example\n     * map.isRotating();\n     */\n    isRotating(): boolean {\n        return this._rotating || (this.handlers && this.handlers.isRotating()) || false;\n    }\n\n    _isDragging(): boolean {\n        return (this.handlers && this.handlers._isDragging()) || false;\n    }\n\n    _createDelegatedListener(type: MapEvent, layers: Array<any>, listener: any): any {\n        if (type === 'mouseenter' || type === 'mouseover') {\n            let mousein = false;\n            const mousemove = (e: MapMouseEvent) => {\n                const filteredLayers = layers.filter(layerId => this.getLayer(layerId));\n                const features = filteredLayers.length ? this.queryRenderedFeatures(e.point, {layers: filteredLayers}) : [];\n                if (!features.length) {\n                    mousein = false;\n                } else if (!mousein) {\n                    mousein = true;\n                    listener.call(this, new MapMouseEvent(type, this, e.originalEvent, {features}));\n                }\n            };\n            const mouseout = () => {\n                mousein = false;\n            };\n\n            return {layers: new Set(layers), listener, delegates: {mousemove, mouseout}};\n        } else if (type === 'mouseleave' || type === 'mouseout') {\n            let mousein = false;\n            const mousemove = (e: MapMouseEvent) => {\n                const filteredLayers = layers.filter(layerId => this.getLayer(layerId));\n                const features = filteredLayers.length ? this.queryRenderedFeatures(e.point, {layers: filteredLayers}) : [];\n                if (features.length) {\n                    mousein = true;\n                } else if (mousein) {\n                    mousein = false;\n                    listener.call(this, new MapMouseEvent(type, this, e.originalEvent));\n                }\n            };\n            const mouseout = (e: MapMouseEvent) => {\n                if (mousein) {\n                    mousein = false;\n                    listener.call(this, new MapMouseEvent(type, this, e.originalEvent));\n                }\n            };\n\n            return {layers: new Set(layers), listener, delegates: {mousemove, mouseout}};\n        } else {\n            const delegate = (e: MapMouseEvent) => {\n                const filteredLayers = layers.filter(layerId => this.getLayer(layerId));\n                const features = filteredLayers.length ? this.queryRenderedFeatures(e.point, {layers: filteredLayers}) : [];\n                if (features.length) {\n                    // Here we need to mutate the original event, so that preventDefault works as expected.\n                    e.features = features;\n                    listener.call(this, e);\n                    delete e.features;\n                }\n            };\n\n            return {layers: new Set(layers), listener, delegates: {[(type: string)]: delegate}};\n        }\n    }\n\n    /** @section {Working with events} */\n\n    /**\n     * Adds a listener for events of a specified type,\n     * optionally limited to features in a specified style layer.\n     *\n     * @param {string} type The event type to listen for. Events compatible with the optional `layerId` parameter are triggered\n     * when the cursor enters a visible portion of the specified layer from outside that layer or outside the map canvas.\n     *\n     * | Event                                                     | Compatible with `layerId` |\n     * |-----------------------------------------------------------|---------------------------|\n     * | [`mousedown`](#map.event:mousedown)                       | yes                       |\n     * | [`mouseup`](#map.event:mouseup)                           | yes                       |\n     * | [`mouseover`](#map.event:mouseover)                       | yes                       |\n     * | [`mouseout`](#map.event:mouseout)                         | yes                       |\n     * | [`mousemove`](#map.event:mousemove)                       | yes                       |\n     * | [`mouseenter`](#map.event:mouseenter)                     | yes (required)            |\n     * | [`mouseleave`](#map.event:mouseleave)                     | yes (required)            |\n     * | [`preclick`](#map.event:preclick)                         |                           |\n     * | [`click`](#map.event:click)                               | yes                       |\n     * | [`dblclick`](#map.event:dblclick)                         | yes                       |\n     * | [`contextmenu`](#map.event:contextmenu)                   | yes                       |\n     * | [`touchstart`](#map.event:touchstart)                     | yes                       |\n     * | [`touchend`](#map.event:touchend)                         | yes                       |\n     * | [`touchcancel`](#map.event:touchcancel)                   | yes                       |\n     * | [`wheel`](#map.event:wheel)                               |                           |\n     * | [`resize`](#map.event:resize)                             |                           |\n     * | [`remove`](#map.event:remove)                             |                           |\n     * | [`touchmove`](#map.event:touchmove)                       |                           |\n     * | [`movestart`](#map.event:movestart)                       |                           |\n     * | [`move`](#map.event:move)                                 |                           |\n     * | [`moveend`](#map.event:moveend)                           |                           |\n     * | [`dragstart`](#map.event:dragstart)                       |                           |\n     * | [`drag`](#map.event:drag)                                 |                           |\n     * | [`dragend`](#map.event:dragend)                           |                           |\n     * | [`zoomstart`](#map.event:zoomstart)                       |                           |\n     * | [`zoom`](#map.event:zoom)                                 |                           |\n     * | [`zoomend`](#map.event:zoomend)                           |                           |\n     * | [`rotatestart`](#map.event:rotatestart)                   |                           |\n     * | [`rotate`](#map.event:rotate)                             |                           |\n     * | [`rotateend`](#map.event:rotateend)                       |                           |\n     * | [`pitchstart`](#map.event:pitchstart)                     |                           |\n     * | [`pitch`](#map.event:pitch)                               |                           |\n     * | [`pitchend`](#map.event:pitchend)                         |                           |\n     * | [`boxzoomstart`](#map.event:boxzoomstart)                 |                           |\n     * | [`boxzoomend`](#map.event:boxzoomend)                     |                           |\n     * | [`boxzoomcancel`](#map.event:boxzoomcancel)               |                           |\n     * | [`webglcontextlost`](#map.event:webglcontextlost)         |                           |\n     * | [`webglcontextrestored`](#map.event:webglcontextrestored) |                           |\n     * | [`load`](#map.event:load)                                 |                           |\n     * | [`render`](#map.event:render)                             |                           |\n     * | [`idle`](#map.event:idle)                                 |                           |\n     * | [`error`](#map.event:error)                               |                           |\n     * | [`data`](#map.event:data)                                 |                           |\n     * | [`styledata`](#map.event:styledata)                       |                           |\n     * | [`sourcedata`](#map.event:sourcedata)                     |                           |\n     * | [`dataloading`](#map.event:dataloading)                   |                           |\n     * | [`styledataloading`](#map.event:styledataloading)         |                           |\n     * | [`sourcedataloading`](#map.event:sourcedataloading)       |                           |\n     * | [`styleimagemissing`](#map.event:styleimagemissing)       |                           |\n     * | [`style.load`](#map.event:style.load)                     |                           |\n     *\n     * @param {string | Array<string>} layerIds (optional) The ID(s) of a style layer(s). If you provide a `layerId`,\n     * the listener will be triggered only if its location is within a visible feature in these layers,\n     * and the event will have a `features` property containing an array of the matching features.\n     * If you do not provide `layerIds`, the listener will be triggered by a corresponding event\n     * happening anywhere on the map, and the event will not have a `features` property.\n     * Note that many event types are not compatible with the optional `layerIds` parameter.\n     * @param {Function} listener The function to be called when the event is fired.\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * // Set an event listener that will fire\n     * // when the map has finished loading.\n     * map.on('load', () => {\n     *     // Add a new layer.\n     *     map.addLayer({\n     *         id: 'points-of-interest',\n     *         source: {\n     *             type: 'vector',\n     *             url: 'mapbox://mapbox.mapbox-streets-v8'\n     *         },\n     *         'source-layer': 'poi_label',\n     *         type: 'circle',\n     *         paint: {\n     *             // Mapbox Style Specification paint properties\n     *         },\n     *         layout: {\n     *             // Mapbox Style Specification layout properties\n     *         }\n     *     });\n     * });\n     * @example\n     * // Set an event listener that will fire\n     * // when a feature on the countries layer of the map is clicked.\n     * map.on('click', 'countries', (e) => {\n     *     new mapboxgl.Popup()\n     *         .setLngLat(e.lngLat)\n     *         .setHTML(`Country name: ${e.features[0].properties.name}`)\n     *         .addTo(map);\n     * });\n     * @example\n     * // Set an event listener that will fire\n     * // when a feature on the countries or background layers of the map is clicked.\n     * map.on('click', ['countries', 'background'], (e) => {\n     *     new mapboxgl.Popup()\n     *         .setLngLat(e.lngLat)\n     *         .setHTML(`Country name: ${e.features[0].properties.name}`)\n     *         .addTo(map);\n     * });\n     * @see [Example: Add 3D terrain to a map](https://docs.mapbox.com/mapbox-gl-js/example/add-terrain/)\n     * @see [Example: Center the map on a clicked symbol](https://docs.mapbox.com/mapbox-gl-js/example/center-on-symbol/)\n     * @see [Example: Create a draggable marker](https://docs.mapbox.com/mapbox-gl-js/example/drag-a-point/)\n     * @see [Example: Create a hover effect](https://docs.mapbox.com/mapbox-gl-js/example/hover-styles/)\n     * @see [Example: Display popup on click](https://docs.mapbox.com/mapbox-gl-js/example/popup-on-click/)\n     */\n    on(type: MapEvent, layerIds: any, listener?: Listener): this {\n        if (listener === undefined) {\n            return super.on(type, layerIds);\n        }\n\n        if (!Array.isArray(layerIds)) {\n            layerIds = [layerIds];\n        }\n\n        if (layerIds) {\n            for (const layerId of layerIds) {\n                if (!this._isValidId(layerId)) {\n                    return this;\n                }\n            }\n        }\n\n        const delegatedListener = this._createDelegatedListener(type, layerIds, listener);\n\n        this._delegatedListeners = this._delegatedListeners || {};\n        this._delegatedListeners[type] = this._delegatedListeners[type] || [];\n        this._delegatedListeners[type].push(delegatedListener);\n\n        for (const event in delegatedListener.delegates) {\n            this.on((event: any), delegatedListener.delegates[event]);\n        }\n\n        return this;\n    }\n\n    /**\n     * Adds a listener that will be called only once to a specified event type,\n     * optionally limited to events occurring on features in a specified style layer.\n     *\n     * @param {string} type The event type to listen for; one of `'mousedown'`, `'mouseup'`, `'preclick'`, `'click'`, `'dblclick'`,\n     * `'mousemove'`, `'mouseenter'`, `'mouseleave'`, `'mouseover'`, `'mouseout'`, `'contextmenu'`, `'touchstart'`,\n     * `'touchend'`, or `'touchcancel'`. `mouseenter` and `mouseover` events are triggered when the cursor enters\n     * a visible portion of the specified layer from outside that layer or outside the map canvas. `mouseleave`\n     * and `mouseout` events are triggered when the cursor leaves a visible portion of the specified layer, or leaves\n     * the map canvas.\n     * @param {string | Array<string>} layerIds (optional) The ID(s) of a style layer(s). If you provide `layerIds`,\n     * the listener will be triggered only if its location is within a visible feature in these layers,\n     * and the event will have a `features` property containing an array of the matching features.\n     * If you do not provide `layerIds`, the listener will be triggered by a corresponding event\n     * happening anywhere on the map, and the event will not have a `features` property.\n     * Note that many event types are not compatible with the optional `layerIds` parameter.\n     * @param {Function} listener The function to be called when the event is fired.\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * // Log the coordinates of a user's first map touch.\n     * map.once('touchstart', (e) => {\n     *     console.log(`The first map touch was at: ${e.lnglat}`);\n     * });\n     * @example\n     * // Log the coordinates of a user's first map touch\n     * // on a specific layer.\n     * map.once('touchstart', 'my-point-layer', (e) => {\n     *     console.log(`The first map touch on the point layer was at: ${e.lnglat}`);\n     * });\n     * @example\n     * // Log the coordinates of a user's first map touch\n     * // on specific layers.\n     * map.once('touchstart', ['my-point-layer', 'my-point-layer-2'], (e) => {\n     *     console.log(`The first map touch on the point layer was at: ${e.lnglat}`);\n     * });\n     * @see [Example: Create a draggable point](https://docs.mapbox.com/mapbox-gl-js/example/drag-a-point/)\n     * @see [Example: Animate the camera around a point with 3D terrain](https://docs.mapbox.com/mapbox-gl-js/example/free-camera-point/)\n     * @see [Example: Play map locations as a slideshow](https://docs.mapbox.com/mapbox-gl-js/example/playback-locations/)\n     */\n    once(type: MapEvent, layerIds?: any, listener?: Listener): this | Promise<Event> {\n\n        if (listener === undefined) {\n            return super.once(type, layerIds);\n        }\n\n        if (!Array.isArray(layerIds)) {\n            layerIds = [layerIds];\n        }\n\n        if (layerIds) {\n            for (const layerId of layerIds) {\n                if (!this._isValidId(layerId)) {\n                    return this;\n                }\n            }\n        }\n\n        const delegatedListener = this._createDelegatedListener(type, layerIds, listener);\n\n        for (const event in delegatedListener.delegates) {\n            this.once((event: any), delegatedListener.delegates[event]);\n        }\n\n        return this;\n    }\n\n    /**\n     * Removes an event listener previously added with {@link Map#on},\n     * optionally limited to layer-specific events.\n     *\n     * @param {string} type The event type previously used to install the listener.\n     * @param {string | Array<string>} layerIds (optional) The layer ID(s) previously used to install the listener.\n     * @param {Function} listener The function previously installed as a listener.\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * // Create a function to print coordinates while a mouse is moving.\n     * function onMove(e) {\n     *     console.log(`The mouse is moving: ${e.lngLat}`);\n     * }\n     * // Create a function to unbind the `mousemove` event.\n     * function onUp(e) {\n     *     console.log(`The final coordinates are: ${e.lngLat}`);\n     *     map.off('mousemove', onMove);\n     * }\n     * // When a click occurs, bind both functions to mouse events.\n     * map.on('mousedown', (e) => {\n     *     map.on('mousemove', onMove);\n     *     map.once('mouseup', onUp);\n     * });\n     * @see [Example: Create a draggable point](https://docs.mapbox.com/mapbox-gl-js/example/drag-a-point/)\n     */\n    off(type: MapEvent, layerIds: any, listener?: Listener): this {\n        if (listener === undefined) {\n            return super.off(type, layerIds);\n        }\n\n        layerIds = new Set(Array.isArray(layerIds) ? layerIds : [layerIds]);\n        for (const layerId of layerIds) {\n            if (!this._isValidId(layerId)) {\n                return this;\n            }\n        }\n\n        const areLayerArraysEqual = (hash1: Set<string>, hash2: Set<string>) => {\n            if (hash1.size !== hash2.size) {\n                return false; // at-least 1 arr has duplicate value(s)\n            }\n\n            // comparing values\n            for (const value of hash1) {\n                if (!hash2.has(value)) return false;\n            }\n            return true;\n        };\n\n        const removeDelegatedListeners = (listeners: Array<any>) => {\n            for (let i = 0; i < listeners.length; i++) {\n                const delegatedListener = listeners[i];\n                if (delegatedListener.listener === listener && areLayerArraysEqual(delegatedListener.layers, layerIds)) {\n                    for (const event in delegatedListener.delegates) {\n                        this.off((event: any), delegatedListener.delegates[event]);\n                    }\n                    listeners.splice(i, 1);\n                    return this;\n                }\n            }\n        };\n\n        const delegatedListeners = this._delegatedListeners ? this._delegatedListeners[type] : undefined;\n        if (delegatedListeners) {\n            removeDelegatedListeners(delegatedListeners);\n        }\n\n        return this;\n    }\n\n    /** @section {Querying features} */\n\n    /**\n     * Returns an array of [GeoJSON](http://geojson.org/)\n     * [Feature objects](https://tools.ietf.org/html/rfc7946#section-3.2)\n     * representing visible features that satisfy the query parameters.\n     *\n     * @param {PointLike|Array<PointLike>} [geometry] - The geometry of the query region in pixels:\n     * either a single point or bottom left and top right points describing a bounding box, where the origin is at the top left.\n     * Omitting this parameter (by calling {@link Map#queryRenderedFeatures} with zero arguments,\n     * or with only an `options` argument) is equivalent to passing a bounding box encompassing the entire\n     * map viewport.\n     * Only values within the existing viewport are supported.\n     * @param {Object} [options] Options object.\n     * @param {Array<string>} [options.layers] An array of [style layer IDs](https://docs.mapbox.com/mapbox-gl-js/style-spec/#layer-id) for the query to inspect.\n     * Only features within these layers will be returned. If this parameter is undefined, all layers will be checked.\n     * @param {Array} [options.filter] A [filter](https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/#filter)\n     * to limit query results.\n     * @param {boolean} [options.validate=true] Whether to check if the [options.filter] conforms to the Mapbox GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function.\n     *\n     * @returns {Array<Object>} An array of [GeoJSON](http://geojson.org/)\n     * [feature objects](https://tools.ietf.org/html/rfc7946#section-3.2).\n     *\n     * The `properties` value of each returned feature object contains the properties of its source feature. For GeoJSON sources, only\n     * string and numeric property values are supported. `null`, `Array`, and `Object` values are not supported.\n     *\n     * Each feature includes top-level `layer`, `source`, and `sourceLayer` properties. The `layer` property is an object\n     * representing the style layer to  which the feature belongs. Layout and paint properties in this object contain values\n     * which are fully evaluated for the given zoom level and feature.\n     *\n     * Only features that are currently rendered are included. Some features will **not** be included, like:\n     *\n     * - Features from layers whose `visibility` property is `\"none\"`.\n     * - Features from layers whose zoom range excludes the current zoom level.\n     * - Symbol features that have been hidden due to text or icon collision.\n     *\n     * Features from all other layers are included, including features that may have no visible\n     * contribution to the rendered result; for example, because the layer's opacity or color alpha component is set to 0.\n     *\n     * The topmost rendered feature appears first in the returned array, and subsequent features are sorted by\n     * descending z-order. Features that are rendered multiple times (due to wrapping across the antimeridian at low\n     * zoom levels) are returned only once (though subject to the following caveat).\n     *\n     * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature\n     * geometries may be split or duplicated across tile boundaries and, as a result, features may appear multiple\n     * times in query results. For example, suppose there is a highway running through the bounding rectangle of a query.\n     * The results of the query will be those parts of the highway that lie within the map tiles covering the bounding\n     * rectangle, even if the highway extends into other tiles, and the portion of the highway within each map tile\n     * will be returned as a separate feature. Similarly, a point feature near a tile boundary may appear in multiple\n     * tiles due to tile buffering.\n     *\n     * @example\n     * // Find all features at a point\n     * const features = map.queryRenderedFeatures(\n     *   [20, 35],\n     *   {layers: ['my-layer-name']}\n     * );\n     *\n     * @example\n     * // Find all features within a static bounding box\n     * const features = map.queryRenderedFeatures(\n     *   [[10, 20], [30, 50]],\n     *   {layers: ['my-layer-name']}\n     * );\n     *\n     * @example\n     * // Find all features within a bounding box around a point\n     * const width = 10;\n     * const height = 20;\n     * const features = map.queryRenderedFeatures([\n     *     [point.x - width / 2, point.y - height / 2],\n     *     [point.x + width / 2, point.y + height / 2]\n     * ], {layers: ['my-layer-name']});\n     *\n     * @example\n     * // Query all rendered features from a single layer\n     * const features = map.queryRenderedFeatures({layers: ['my-layer-name']});\n     * @see [Example: Get features under the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/queryrenderedfeatures/)\n     * @see [Example: Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/)\n     * @see [Example: Filter features within map view](https://www.mapbox.com/mapbox-gl-js/example/filter-features-within-map-view/)\n     */\n    queryRenderedFeatures(geometry?: PointLike | [PointLike, PointLike], options?: Object): Array<QueryResult> {\n        // The first parameter can be omitted entirely, making this effectively an overloaded method\n        // with two signatures:\n        //\n        //     queryRenderedFeatures(geometry: PointLike | [PointLike, PointLike], options?: Object)\n        //     queryRenderedFeatures(options?: Object)\n        //\n        // There no way to express that in a way that's compatible with both flow and documentation.js.\n        // Related: https://github.com/facebook/flow/issues/1556\n\n        if (!this.style) {\n            return [];\n        }\n\n        if (options === undefined && geometry !== undefined && !(geometry instanceof Point) && !Array.isArray(geometry)) {\n            options = (geometry: Object);\n            geometry = undefined;\n        }\n\n        options = options || {};\n        geometry = geometry || [([0, 0]: PointLike), ([this.transform.width, this.transform.height]: PointLike)];\n\n        if (options.layers && Array.isArray(options.layers)) {\n            for (const layerId of options.layers) {\n                if (!this._isValidId(layerId)) {\n                    return [];\n                }\n            }\n        }\n\n        return this.style.queryRenderedFeatures(geometry, options, this.transform);\n    }\n\n    /**\n     * Returns an array of [GeoJSON](http://geojson.org/)\n     * [Feature objects](https://tools.ietf.org/html/rfc7946#section-3.2)\n     * representing features within the specified vector tile or GeoJSON source that satisfy the query parameters.\n     *\n     * @param {string} sourceId The ID of the vector tile or GeoJSON source to query.\n     * @param {Object} [parameters] Options object.\n     * @param {string} [parameters.sourceLayer] The name of the [source layer](https://docs.mapbox.com/help/glossary/source-layer/)\n     * to query. *For vector tile sources, this parameter is required.* For GeoJSON sources, it is ignored.\n     * @param {Array} [parameters.filter] A [filter](https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/#filter)\n     * to limit query results.\n     * @param {boolean} [parameters.validate=true] Whether to check if the [parameters.filter] conforms to the Mapbox GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function.\n     *\n     * @returns {Array<Object>} An array of [GeoJSON](http://geojson.org/)\n     * [Feature objects](https://tools.ietf.org/html/rfc7946#section-3.2).\n     *\n     * In contrast to {@link Map#queryRenderedFeatures}, this function returns all features matching the query parameters,\n     * whether or not they are rendered by the current style (in other words, are visible). The domain of the query includes all currently-loaded\n     * vector tiles and GeoJSON source tiles: this function does not check tiles outside the currently\n     * visible viewport.\n     *\n     * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature\n     * geometries may be split or duplicated across tile boundaries and, as a result, features may appear multiple\n     * times in query results. For example, suppose there is a highway running through the bounding rectangle of a query.\n     * The results of the query will be those parts of the highway that lie within the map tiles covering the bounding\n     * rectangle, even if the highway extends into other tiles, and the portion of the highway within each map tile\n     * will be returned as a separate feature. Similarly, a point feature near a tile boundary may appear in multiple\n     * tiles due to tile buffering.\n     *\n     * @example\n     * // Find all features in one source layer in a vector source\n     * const features = map.querySourceFeatures('your-source-id', {\n     *     sourceLayer: 'your-source-layer'\n     * });\n     *\n     * @see [Example: Highlight features containing similar data](https://www.mapbox.com/mapbox-gl-js/example/query-similar-features/)\n     */\n    querySourceFeatures(sourceId: string, parameters: ?{sourceLayer: ?string, filter?: ?Array<any>, validate?: boolean}): Array<QueryFeature> {\n        if (!this._isValidId(sourceId)) {\n            return [];\n        }\n\n        return this.style.querySourceFeatures(sourceId, parameters);\n    }\n\n    /**\n     * Determines if the given point is located on a visible map surface.\n     *\n     * @param {PointLike} point - The point to be checked, specified as an array of two numbers representing the x and y coordinates, or as a {@link https://docs.mapbox.com/mapbox-gl-js/api/geography/#point|Point} object.\n     * @returns {boolean} Returns `true` if the point is on the visible map surface, otherwise returns `false`.\n     * @example\n     * const pointOnSurface = map.isPointOnSurface([100, 200]);\n     */\n    isPointOnSurface(point: PointLike): boolean {\n        const {name} = this.transform.projection;\n        if (name !== 'globe' && name !== 'mercator') {\n            warnOnce(`${name} projection does not support isPointOnSurface, this API may behave unexpectedly.`);\n        }\n\n        return this.transform.isPointOnSurface(Point.convert(point));\n    }\n\n    /** @section {Working with styles} */\n\n    /**\n     * Updates the map's Mapbox style object with a new value.\n     *\n     * If a style is already set when this is used and the `diff` option is set to `true`, the map renderer will attempt to compare the given style\n     * against the map's current state and perform only the changes necessary to make the map style match the desired state. Changes in sprites\n     * (images used for icons and patterns) and glyphs (fonts for label text) **cannot** be diffed. If the sprites or fonts used in the current\n     * style and the given style are different in any way, the map renderer will force a full update, removing the current style and building\n     * the given one from scratch.\n     *\n     * @param {Object | string| null} style A JSON object conforming to the schema described in the\n     * [Mapbox Style Specification](https://mapbox.com/mapbox-gl-style-spec/), or a URL to such JSON.\n     * @param {Object} [options] Options object.\n     * @param {boolean} [options.diff=true] If false, force a 'full' update, removing the current style\n     * and building the given one instead of attempting a diff-based update.\n     * @param {string} [options.localIdeographFontFamily='sans-serif'] Defines a CSS\n     * font-family for locally overriding generation of glyphs in the 'CJK Unified Ideographs', 'Hiragana', 'Katakana' and 'Hangul Syllables' ranges.\n     * In these ranges, font settings from the map's style will be ignored, except for font-weight keywords (light/regular/medium/bold).\n     * Set to `false`, to enable font settings from the map's style for these glyph ranges.\n     * Forces a full update.\n     * @param {Object} [options.config=null] The initial configuration options for the style fragments.\n     * Each key in the object is a fragment ID (e.g., `basemap`) and each value is a configuration object.\n     * @returns {Map} Returns itself to allow for method chaining.\n     *\n     * @example\n     * map.setStyle(\"mapbox://styles/mapbox/streets-v11\");\n     *\n     * @see [Example: Change a map's style](https://www.mapbox.com/mapbox-gl-js/example/setstyle/)\n     *\n     * @example\n     * map.setStyle(\"mapbox://styles/mapbox/standard\", {\n     *     \"config\": {\n     *         \"basemap\": {\n     *             \"lightPreset\": \"night\"\n     *         }\n     *     }\n     * });\n     */\n    setStyle(style: StyleSpecification | string | null, options?: SetStyleOptions): this {\n        options = extend({}, {localIdeographFontFamily: this._localIdeographFontFamily, localFontFamily: this._localFontFamily}, options);\n\n        const diffNeeded =\n            options.diff !== false &&\n            options.localFontFamily === this._localFontFamily &&\n            options.localIdeographFontFamily === this._localIdeographFontFamily &&\n            !options.config; // Rebuild the style from scratch if config is set\n\n        if (this.style && style && diffNeeded) {\n            this.style._diffStyle(\n                style,\n                (e: Error | {error: string} | null, isUpdateNeeded) => {\n                    if (e) {\n                        warnOnce(`Unable to perform style diff: ${String(e.message || e.error || e)}. Rebuilding the style from scratch.`);\n                        this._updateStyle(style, options);\n                    } else if (isUpdateNeeded) {\n                        this._update(true);\n                    }\n                },\n                () => {\n                    this._postStyleLoadEvent();\n                });\n            return this;\n        } else {\n            this._localIdeographFontFamily = options.localIdeographFontFamily;\n            this._localFontFamily = options.localFontFamily;\n            return this._updateStyle(style, options);\n        }\n    }\n\n    _getUIString(key: string): string {\n        const str = this._locale[key];\n        if (str == null) {\n            throw new Error(`Missing UI string '${key}'`);\n        }\n\n        return str;\n    }\n\n    _updateStyle(style: StyleSpecification | string | null, options?: SetStyleOptions): this {\n        if (this.style) {\n            this.style.setEventedParent(null);\n            this.style._remove();\n            this.style = (undefined: any); // we lazy-init it so it's never undefined when accessed\n        }\n\n        if (style) {\n            // Move SetStyleOptions's `config` property to\n            // StyleOptions's `initialConfig` for internal use\n            const styleOptions: StyleOptions = extend({}, options);\n            if (options && options.config) {\n                styleOptions.initialConfig = options.config;\n                delete styleOptions.config;\n            }\n\n            this.style = new Style(this, styleOptions)\n                .setEventedParent(this, {style: this.style})\n                .load(style);\n        }\n\n        this._updateTerrain();\n        return this;\n    }\n\n    _lazyInitEmptyStyle() {\n        if (!this.style) {\n            this.style = new Style(this, {});\n            this.style.setEventedParent(this, {style: this.style});\n            this.style.loadEmpty();\n        }\n    }\n\n    /**\n     * Returns the map's Mapbox [style](https://docs.mapbox.com/help/glossary/style/) object, a JSON object which can be used to recreate the map's style.\n     *\n     * For the Mapbox Standard style or any \"fragment\" style (which is a style with `fragment: true`\n     * or a `schema` property defined), this method returns an empty style with no layers or sources.\n     * The original style is wrapped into an import with the ID `basemap` as a fragment style and is not intended\n     * to be used directly. This design ensures that user logic is not tied to style internals, allowing Mapbox\n     * to roll out style updates seamlessly and consistently.\n     *\n     * @returns {Object} The map's style JSON object.\n     *\n     * @example\n     * map.on('load', () => {\n     *     const styleJson = map.getStyle();\n     * });\n     */\n    getStyle(): ?StyleSpecification {\n        if (this.style) {\n            return this.style.serialize();\n        }\n    }\n\n    /**\n     * Returns a Boolean indicating whether the map's style is fully loaded.\n     *\n     * @returns {boolean} A Boolean indicating whether the style is fully loaded.\n     *\n     * @example\n     * const styleLoadStatus = map.isStyleLoaded();\n     */\n    isStyleLoaded(): boolean {\n        if (!this.style) {\n            warnOnce('There is no style added to the map.');\n            return false;\n        }\n        return this.style.loaded();\n    }\n\n    _isValidId(id: ?string): boolean {\n        if (id == null) {\n            this.fire(new ErrorEvent(new Error(`IDs can't be empty.`)));\n            return false;\n        }\n\n        // Disallow using fully qualified IDs in the public APIs\n        if (isFQID(id)) {\n            this.fire(new ErrorEvent(new Error(`IDs can't contain special symbols: \"${id}\".`)));\n            return false;\n        }\n\n        return true;\n    }\n\n    /** @section {Sources} */\n\n    /**\n     * Adds a source to the map's style.\n     *\n     * @param {string} id The ID of the source to add. Must not conflict with existing sources.\n     * @param {Object} source The source object, conforming to the\n     * Mapbox Style Specification's [source definition](https://www.mapbox.com/mapbox-gl-style-spec/#sources) or\n     * {@link CanvasSourceOptions}.\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * map.addSource('my-data', {\n     *     type: 'vector',\n     *     url: 'mapbox://myusername.tilesetid'\n     * });\n     * @example\n     * map.addSource('my-data', {\n     *     \"type\": \"geojson\",\n     *     \"data\": {\n     *         \"type\": \"Feature\",\n     *         \"geometry\": {\n     *             \"type\": \"Point\",\n     *             \"coordinates\": [-77.0323, 38.9131]\n     *         },\n     *         \"properties\": {\n     *             \"title\": \"Mapbox DC\",\n     *             \"marker-symbol\": \"monument\"\n     *         }\n     *     }\n     * });\n     * @see Example: Vector source: [Show and hide layers](https://docs.mapbox.com/mapbox-gl-js/example/toggle-layers/)\n     * @see Example: GeoJSON source: [Add live realtime data](https://docs.mapbox.com/mapbox-gl-js/example/live-geojson/)\n     * @see Example: Raster DEM source: [Add hillshading](https://docs.mapbox.com/mapbox-gl-js/example/hillshade/)\n     */\n    addSource(id: string, source: SourceSpecification): this {\n        if (!this._isValidId(id)) {\n            return this;\n        }\n\n        this._lazyInitEmptyStyle();\n        this.style.addSource(id, source);\n        return this._update(true);\n    }\n\n    /**\n     * Returns a Boolean indicating whether the source is loaded. Returns `true` if the source with\n     * the given ID in the map's style has no outstanding network requests, otherwise `false`.\n     *\n     * @param {string} id The ID of the source to be checked.\n     * @returns {boolean} A Boolean indicating whether the source is loaded.\n     * @example\n     * const sourceLoaded = map.isSourceLoaded('bathymetry-data');\n     */\n    isSourceLoaded(id: string): boolean {\n        if (!this._isValidId(id)) {\n            return false;\n        }\n\n        return !!this.style && this.style._isSourceCacheLoaded(id);\n    }\n\n    /**\n     * Returns a Boolean indicating whether all tiles in the viewport from all sources on\n     * the style are loaded.\n     *\n     * @returns {boolean} A Boolean indicating whether all tiles are loaded.\n     * @example\n     * const tilesLoaded = map.areTilesLoaded();\n     */\n    areTilesLoaded(): boolean {\n        return this.style.areTilesLoaded();\n    }\n\n    /**\n     * Adds a [custom source type](#Custom Sources), making it available for use with\n     * {@link Map#addSource}.\n     * @private\n     * @param {string} name The name of the source type; source definition objects use this name in the `{type: ...}` field.\n     * @param {Function} SourceType A {@link Source} constructor.\n     * @param {Function} callback Called when the source type is ready or with an error argument if there is an error.\n     */\n    addSourceType(name: string, SourceType: any, callback: Function) {\n        this._lazyInitEmptyStyle();\n        this.style.addSourceType(name, SourceType, callback);\n    }\n\n    /**\n     * Removes a source from the map's style.\n     *\n     * @param {string} id The ID of the source to remove.\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * map.removeSource('bathymetry-data');\n     */\n    removeSource(id: string): this {\n        if (!this._isValidId(id)) {\n            return this;\n        }\n\n        this.style.removeSource(id);\n        this._updateTerrain();\n        return this._update(true);\n    }\n\n    /**\n     * Returns the source with the specified ID in the map's style.\n     *\n     * This method is often used to update a source using the instance members for the relevant\n     * source type as defined in [Sources](#sources).\n     * For example, setting the `data` for a GeoJSON source or updating the `url` and `coordinates`\n     * of an image source.\n     *\n     * @param {string} id The ID of the source to get.\n     * @returns {?Object} The style source with the specified ID or `undefined` if the ID\n     * corresponds to no existing sources.\n     * The shape of the object varies by source type.\n     * A list of options for each source type is available on the Mapbox Style Specification's\n     * [Sources](https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/) page.\n     * @example\n     * const sourceObject = map.getSource('points');\n     * @see [Example: Create a draggable point](https://docs.mapbox.com/mapbox-gl-js/example/drag-a-point/)\n     * @see [Example: Animate a point](https://docs.mapbox.com/mapbox-gl-js/example/animate-point-along-line/)\n     * @see [Example: Add live realtime data](https://docs.mapbox.com/mapbox-gl-js/example/live-geojson/)\n     */\n    getSource(id: string): ?Source {\n        if (!this._isValidId(id)) {\n            return null;\n        }\n\n        return this.style.getOwnSource(id);\n    }\n\n    /** @section {Images} */\n\n    // eslint-disable-next-line jsdoc/require-returns\n    /**\n     * Add an image to the style. This image can be displayed on the map like any other icon in the style's\n     * [sprite](https://docs.mapbox.com/mapbox-gl-js/style-spec/sprite/) using the image's ID with\n     * [`icon-image`](https://docs.mapbox.com/mapbox-gl-js/style-spec/#layout-symbol-icon-image),\n     * [`background-pattern`](https://docs.mapbox.com/mapbox-gl-js/style-spec/#paint-background-background-pattern),\n     * [`fill-pattern`](https://docs.mapbox.com/mapbox-gl-js/style-spec/#paint-fill-fill-pattern),\n     * or [`line-pattern`](https://docs.mapbox.com/mapbox-gl-js/style-spec/#paint-line-line-pattern).\n     * A {@link Map.event:error} event will be fired if there is not enough space in the sprite to add this image.\n     *\n     * @param {string} id The ID of the image.\n     * @param {HTMLImageElement | ImageBitmap | ImageData | {width: number, height: number, data: (Uint8Array | Uint8ClampedArray)} | StyleImageInterface} image The image as an `HTMLImageElement`, `ImageData`, `ImageBitmap` or object with `width`, `height`, and `data`\n     * properties with the same format as `ImageData`.\n     * @param {Object | null} options Options object.\n     * @param {number} options.pixelRatio The ratio of pixels in the image to physical pixels on the screen.\n     * @param {boolean} options.sdf Whether the image should be interpreted as an SDF image.\n     * @param {[number, number, number, number]} options.content `[x1, y1, x2, y2]`  If `icon-text-fit` is used in a layer with this image, this option defines the part of the image that can be covered by the content in `text-field`.\n     * @param {Array<[number, number]>} options.stretchX `[[x1, x2], ...]` If `icon-text-fit` is used in a layer with this image, this option defines the part(s) of the image that can be stretched horizontally.\n     * @param {Array<[number, number]>} options.stretchY `[[y1, y2], ...]` If `icon-text-fit` is used in a layer with this image, this option defines the part(s) of the image that can be stretched vertically.\n     *\n     * @example\n     * // If the style's sprite does not already contain an image with ID 'cat',\n     * // add the image 'cat-icon.png' to the style's sprite with the ID 'cat'.\n     * map.loadImage('https://upload.wikimedia.org/wikipedia/commons/thumb/6/60/Cat_silhouette.svg/400px-Cat_silhouette.svg.png', (error, image) => {\n     *     if (error) throw error;\n     *     if (!map.hasImage('cat')) map.addImage('cat', image);\n     * });\n     *\n     * // Add a stretchable image that can be used with `icon-text-fit`\n     * // In this example, the image is 600px wide by 400px high.\n     * map.loadImage('https://upload.wikimedia.org/wikipedia/commons/8/89/Black_and_White_Boxed_%28bordered%29.png', (error, image) => {\n     *     if (error) throw error;\n     *     if (!map.hasImage('border-image')) {\n     *         map.addImage('border-image', image, {\n     *             content: [16, 16, 300, 384], // place text over left half of image, avoiding the 16px border\n     *             stretchX: [[16, 584]], // stretch everything horizontally except the 16px border\n     *             stretchY: [[16, 384]], // stretch everything vertically except the 16px border\n     *         });\n     *     }\n     * });\n     *\n     *\n     * @see Example: Use `HTMLImageElement`: [Add an icon to the map](https://www.mapbox.com/mapbox-gl-js/example/add-image/)\n     * @see Example: Use `ImageData`: [Add a generated icon to the map](https://www.mapbox.com/mapbox-gl-js/example/add-image-generated/)\n     */\n    addImage(id: string,\n             image: HTMLImageElement | ImageBitmap | ImageData | {width: number, height: number, data: Uint8Array | Uint8ClampedArray} | StyleImageInterface,\n             {pixelRatio = 1, sdf = false, stretchX, stretchY, content}: $Shape<StyleImageMetadata> = {}) {\n        this._lazyInitEmptyStyle();\n        const version = 0;\n\n        if (image instanceof HTMLImageElement || (ImageBitmap && image instanceof ImageBitmap)) {\n            const {width, height, data} = browser.getImageData(image);\n            this.style.addImage(id, {data: new RGBAImage({width, height}, data), pixelRatio, stretchX, stretchY, content, sdf, version});\n        } else if (image.width === undefined || image.height === undefined) {\n            this.fire(new ErrorEvent(new Error(\n                'Invalid arguments to map.addImage(). The second argument must be an `HTMLImageElement`, `ImageData`, `ImageBitmap`, ' +\n                'or object with `width`, `height`, and `data` properties with the same format as `ImageData`')));\n        } else {\n            const {width, height} = image;\n            const userImage = ((image: any): StyleImageInterface);\n            const data = userImage.data;\n\n            this.style.addImage(id, {\n                data: new RGBAImage({width, height}, new Uint8Array(data)),\n                pixelRatio,\n                stretchX,\n                stretchY,\n                content,\n                sdf,\n                version,\n                userImage\n            });\n\n            if (userImage.onAdd) {\n                userImage.onAdd(this, id);\n            }\n        }\n    }\n\n    // eslint-disable-next-line jsdoc/require-returns\n    /**\n     * Update an existing image in a style. This image can be displayed on the map like any other icon in the style's\n     * [sprite](https://docs.mapbox.com/help/glossary/sprite/) using the image's ID with\n     * [`icon-image`](https://docs.mapbox.com/mapbox-gl-js/style-spec/#layout-symbol-icon-image),\n     * [`background-pattern`](https://docs.mapbox.com/mapbox-gl-js/style-spec/#paint-background-background-pattern),\n     * [`fill-pattern`](https://docs.mapbox.com/mapbox-gl-js/style-spec/#paint-fill-fill-pattern),\n     * or [`line-pattern`](https://docs.mapbox.com/mapbox-gl-js/style-spec/#paint-line-line-pattern).\n     *\n     * @param {string} id The ID of the image.\n     * @param {HTMLImageElement | ImageBitmap | ImageData | StyleImageInterface} image The image as an `HTMLImageElement`, [`ImageData`](https://developer.mozilla.org/en-US/docs/Web/API/ImageData), [`ImageBitmap`](https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap) or object with `width`, `height`, and `data`\n     * properties with the same format as `ImageData`.\n     *\n     * @example\n    * // Load an image from an external URL.\n     * map.loadImage('http://placekitten.com/50/50', (error, image) => {\n     *     if (error) throw error;\n     *     // If an image with the ID 'cat' already exists in the style's sprite,\n     *     // replace that image with a new image, 'other-cat-icon.png'.\n     *     if (map.hasImage('cat')) map.updateImage('cat', image);\n     * });\n     */\n    updateImage(id: string,\n        image: HTMLImageElement | ImageBitmap | ImageData | {width: number, height: number, data: Uint8Array | Uint8ClampedArray} | StyleImageInterface) {\n        this._lazyInitEmptyStyle();\n\n        const existingImage = this.style.getImage(id);\n        if (!existingImage) {\n            this.fire(new ErrorEvent(new Error(\n                'The map has no image with that id. If you are adding a new image use `map.addImage(...)` instead.')));\n            return;\n        }\n        const imageData = (image instanceof HTMLImageElement || (ImageBitmap && image instanceof ImageBitmap)) ? browser.getImageData(image) : image;\n        const {width, height} = imageData;\n        // Flow can't refine the type enough to exclude ImageBitmap\n        const data = ((imageData: any).data: Uint8Array | Uint8ClampedArray);\n\n        if (width === undefined || height === undefined) {\n            this.fire(new ErrorEvent(new Error(\n                'Invalid arguments to map.updateImage(). The second argument must be an `HTMLImageElement`, `ImageData`, `ImageBitmap`, ' +\n                'or object with `width`, `height`, and `data` properties with the same format as `ImageData`')));\n            return;\n        }\n\n        if (width !== existingImage.data.width || height !== existingImage.data.height) {\n            this.fire(new ErrorEvent(new Error(\n                `The width and height of the updated image (${width}, ${height})\n                must be that same as the previous version of the image\n                (${existingImage.data.width}, ${existingImage.data.height})`)));\n            return;\n        }\n\n        const copy = !(image instanceof HTMLImageElement || (ImageBitmap && image instanceof ImageBitmap));\n        existingImage.data.replace(data, copy);\n\n        this.style.updateImage(id, existingImage);\n    }\n\n    /**\n     * Check whether or not an image with a specific ID exists in the style. This checks both images\n     * in the style's original [sprite](https://docs.mapbox.com/help/glossary/sprite/) and any images\n     * that have been added at runtime using {@link Map#addImage}.\n     *\n     * @param {string} id The ID of the image.\n     *\n     * @returns {boolean} A Boolean indicating whether the image exists.\n     * @example\n     * // Check if an image with the ID 'cat' exists in\n     * // the style's sprite.\n     * const catIconExists = map.hasImage('cat');\n     */\n    hasImage(id: string): boolean {\n        if (!id) {\n            this.fire(new ErrorEvent(new Error('Missing required image id')));\n            return false;\n        }\n\n        if (!this.style) return false;\n\n        return !!this.style.getImage(id);\n    }\n\n    /**\n     * Remove an image from a style. This can be an image from the style's original\n     * [sprite](https://docs.mapbox.com/help/glossary/sprite/) or any images\n     * that have been added at runtime using {@link Map#addImage}.\n     *\n     * @param {string} id The ID of the image.\n     *\n     * @example\n     * // If an image with the ID 'cat' exists in\n     * // the style's sprite, remove it.\n     * if (map.hasImage('cat')) map.removeImage('cat');\n     */\n    removeImage(id: string) {\n        this.style.removeImage(id);\n    }\n\n    /**\n     * Load an image from an external URL to be used with {@link Map#addImage}. External\n     * domains must support [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS).\n     *\n     * @param {string} url The URL of the image file. Image file must be in png, webp, or jpg format.\n     * @param {Function} callback Expecting `callback(error, data)`. Called when the image has loaded or with an error argument if there is an error.\n     *\n     * @example\n     * // Load an image from an external URL.\n     * map.loadImage('http://placekitten.com/50/50', (error, image) => {\n     *     if (error) throw error;\n     *     // Add the loaded image to the style's sprite with the ID 'kitten'.\n     *     map.addImage('kitten', image);\n     * });\n     *\n     * @see [Example: Add an icon to the map](https://www.mapbox.com/mapbox-gl-js/example/add-image/)\n     */\n    loadImage(url: string, callback: Function) {\n        getImage(this._requestManager.transformRequest(url, ResourceType.Image), (err, img) => {\n            callback(err, img instanceof HTMLImageElement ? browser.getImageData(img) : img);\n        });\n    }\n\n    /**\n    * Returns an Array of strings containing the IDs of all images currently available in the map.\n    * This includes both images from the style's original [sprite](https://docs.mapbox.com/help/glossary/sprite/)\n    * and any images that have been added at runtime using {@link Map#addImage}.\n    *\n    * @returns {Array<string>} An Array of strings containing the names of all sprites/images currently available in the map.\n    *\n    * @example\n    * const allImages = map.listImages();\n    */\n    listImages(): Array<string> {\n        return this.style.listImages();\n    }\n\n    /**\n     * @section {Models}\n     * @private\n     */\n\n    // eslint-disable-next-line jsdoc/require-returns\n    /**\n     * Add a model to the style. This model can be displayed on the map like any other model in the style\n     * using the model ID in conjunction with a 2D vector layer. This API can also be used for updating\n     * a model. If the model for a given `modelId` was already added, it gets replaced by the new model.\n     *\n     * @param {string} id The ID of the model.\n     * @param {string} url Pointing to the model to load.\n     *\n     * @example\n     * // If the style does not already contain a model with ID 'tree',\n     * // load a tree model and then use a geojson to show it.\n     * map.addModel('tree', 'http://path/to/my/tree.glb');\n     * map.addLayer({\n     *     \"id\": \"tree-layer\",\n     *     \"type\": \"model\",\n     *     \"source\": \"trees\",\n     *     \"source-layer\": \"trees\",\n     *     \"layout\": {\n     *         \"model-id\": \"tree\"\n     *     }\n     *});\n     *\n     * @private\n     */\n    addModel(id: string, url: string) {\n        this._lazyInitEmptyStyle();\n        this.style.addModel(id, url);\n    }\n\n    /**\n     * Check whether or not a model with a specific ID exists in the style. This checks both models\n     * in the style and any models that have been added at runtime using {@link Map#addModel}.\n     *\n     * @param {string} id The ID of the model.\n     *\n     * @returns {boolean} A Boolean indicating whether the model exists.\n     * @example\n     * // Check if a model with the ID 'tree' exists in\n     * // the style.\n     * const treeModelExists = map.hasModel('tree');\n     *\n     * @private\n     */\n    hasModel(id: string): boolean {\n        if (!id) {\n            this.fire(new ErrorEvent(new Error('Missing required model id')));\n            return false;\n        }\n        return this.style.hasModel(id);\n    }\n\n    /**\n     * Remove an model from a style. This can be a model from the style original\n     *  or any models that have been added at runtime using {@link Map#addModel}.\n     *\n     * @param {string} id The ID of the model.\n     *\n     * @example\n     * // If an model with the ID 'tree' exists in\n     * // the style, remove it.\n     * if (map.hasModel('tree')) map.removeModel('tree');\n     *\n     * @private\n     */\n    removeModel(id: string) {\n        this.style.removeModel(id);\n    }\n\n    /**\n    * Returns an Array of strings containing the IDs of all models currently available in the map.\n    * This includes both models from the style and any models that have been added at runtime using {@link Map#addModel}.\n    *\n    * @returns {Array<string>} An Array of strings containing the names of all model IDs currently available in the map.\n    *\n    * @example\n    * const allModels = map.listModels();\n    *\n    * @private\n    */\n    listModels(): Array<string> {\n        return this.style.listModels();\n    }\n\n    /** @section {Layers} */\n\n    /**\n     * Adds a [Mapbox style layer](https://docs.mapbox.com/mapbox-gl-js/style-spec/#layers)\n     * to the map's style.\n     *\n     * A layer defines how data from a specified source will be styled. Read more about layer types\n     * and available paint and layout properties in the [Mapbox Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/#layers).\n     *\n     * @param {Object | CustomLayerInterface} layer The layer to add, conforming to either the Mapbox Style Specification's [layer definition](https://docs.mapbox.com/mapbox-gl-js/style-spec/#layers) or, less commonly, the {@link CustomLayerInterface} specification.\n     * The Mapbox Style Specification's layer definition is appropriate for most layers.\n     *\n     * @param {string} layer.id A unique identifier that you define.\n     * @param {string} layer.type The type of layer (for example `fill` or `symbol`).\n     * A list of layer types is available in the [Mapbox Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/#type).\n     *\n     * This can also be `custom`. For more information, see {@link CustomLayerInterface}.\n     * @param {string | Object} [layer.source] The data source for the layer.\n     * Reference a source that has _already been defined_ using the source's unique id.\n     * Reference a _new source_ using a source object (as defined in the [Mapbox Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/)) directly.\n     * This is **required** for all `layer.type` options _except_ for `custom` and `background`.\n     * @param {string} [layer.sourceLayer] (optional) The name of the [source layer](https://docs.mapbox.com/help/glossary/source-layer/) within the specified `layer.source` to use for this style layer.\n     * This is only applicable for vector tile sources and is **required** when `layer.source` is of the type `vector`.\n     * @param {string} [layer.slot] (optional) The identifier of a [`slot`](https://docs.mapbox.com/style-spec/reference/slots/) layer that will be used to position this style layer.\n     * A `slot` layer serves as a predefined position in the layer order for inserting associated layers.\n     * *Note*: During 3D globe and terrain rendering, GL JS aims to batch multiple layers together for optimal performance.\n     * This process might lead to a rearrangement of layers. Layers draped over globe and terrain,\n     * such as `fill`, `line`, `background`, `hillshade`, and `raster`, are rendered first.\n     * These layers are rendered underneath symbols, regardless of whether they are placed\n     * in the middle or top slots or without a designated slot.\n     * @param {Array} [layer.filter] (optional) An expression specifying conditions on source features.\n     * Only features that match the filter are displayed.\n     * The Mapbox Style Specification includes more information on the limitations of the [`filter`](https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/#filter) parameter\n     * and a complete list of available [expressions](https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/).\n     * If no filter is provided, all features in the source (or source layer for vector tilesets) will be displayed.\n     * @param {Object} [layer.paint] (optional) Paint properties for the layer.\n     * Available paint properties vary by `layer.type`.\n     * A full list of paint properties for each layer type is available in the [Mapbox Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/).\n     * If no paint properties are specified, default values will be used.\n     * @param {Object} [layer.layout] (optional) Layout properties for the layer.\n     * Available layout properties vary by `layer.type`.\n     * A full list of layout properties for each layer type is available in the [Mapbox Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/).\n     * If no layout properties are specified, default values will be used.\n     * @param {number} [layer.maxzoom] (optional) The maximum zoom level for the layer.\n     * At zoom levels equal to or greater than the maxzoom, the layer will be hidden.\n     * The value can be any number between `0` and `24` (inclusive).\n     * If no maxzoom is provided, the layer will be visible at all zoom levels for which there are tiles available.\n     * @param {number} [layer.minzoom] (optional) The minimum zoom level for the layer.\n     * At zoom levels less than the minzoom, the layer will be hidden.\n     * The value can be any number between `0` and `24` (inclusive).\n     * If no minzoom is provided, the layer will be visible at all zoom levels for which there are tiles available.\n     * @param {Object} [layer.metadata] (optional) Arbitrary properties useful to track with the layer, but do not influence rendering.\n     * @param {string} [layer.renderingMode] This is only applicable for layers with the type `custom`.\n     * See {@link CustomLayerInterface} for more information.\n     * @param {string} [beforeId] The ID of an existing layer to insert the new layer before,\n     * resulting in the new layer appearing visually beneath the existing layer.\n     * If this argument is not specified, the layer will be appended to the end of the layers array\n     * and appear visually above all other layers.\n     * *Note*: Layers can only be rearranged within the same `slot`. The new layer must share the\n     * same `slot` as the existing layer to be positioned underneath it. If the\n     * layers are in different slots, the `beforeId` parameter will be ignored and\n     * the new layer will be appended to the end of the layers array.\n     * During 3D globe and terrain rendering, GL JS aims to batch multiple layers together for optimal performance.\n     * This process might lead to a rearrangement of layers. Layers draped over globe and terrain,\n     * such as `fill`, `line`, `background`, `hillshade`, and `raster`, are rendered first.\n     * These layers are rendered underneath symbols, regardless of whether they are placed\n     * in the middle or top slots or without a designated slot.\n     *\n     * @returns {Map} Returns itself to allow for method chaining.\n     *\n     * @example\n     * // Add a circle layer with a vector source\n     * map.addLayer({\n     *     id: 'points-of-interest',\n     *     source: {\n     *         type: 'vector',\n     *         url: 'mapbox://mapbox.mapbox-streets-v8'\n     *     },\n     *     'source-layer': 'poi_label',\n     *     type: 'circle',\n     *     paint: {\n     *     // Mapbox Style Specification paint properties\n     *     },\n     *     layout: {\n     *     // Mapbox Style Specification layout properties\n     *     }\n     * });\n     *\n     * @example\n     * // Define a source before using it to create a new layer\n     * map.addSource('state-data', {\n     *     type: 'geojson',\n     *     data: 'path/to/data.geojson'\n     * });\n     *\n     * map.addLayer({\n     *     id: 'states',\n     *     // References the GeoJSON source defined above\n     *     // and does not require a `source-layer`\n     *     source: 'state-data',\n     *     type: 'symbol',\n     *     layout: {\n     *         // Set the label content to the\n     *         // feature's `name` property\n     *         'text-field': ['get', 'name']\n     *     }\n     * });\n     *\n     * @example\n     * // Add a new symbol layer to a slot\n     * map.addLayer({\n     *     id: 'states',\n     *     // References a source that's already been defined\n     *     source: 'state-data',\n     *     type: 'symbol',\n     *     // Add the layer to the existing `top` slot\n     *     slot: 'top',\n     *     layout: {\n     *         // Set the label content to the\n     *         // feature's `name` property\n     *         'text-field': ['get', 'name']\n     *     }\n     * });\n     *\n     * @example\n     * // Add a new symbol layer before an existing layer\n     * map.addLayer({\n     *     id: 'states',\n     *     // References a source that's already been defined\n     *     source: 'state-data',\n     *     type: 'symbol',\n     *     layout: {\n     *         // Set the label content to the\n     *         // feature's `name` property\n     *         'text-field': ['get', 'name']\n     *     }\n     * // Add the layer before the existing `cities` layer\n     * }, 'cities');\n     *\n     * @see [Example: Select features around a clicked point](https://docs.mapbox.com/mapbox-gl-js/example/queryrenderedfeatures-around-point/) (fill layer)\n     * @see [Example: Add a new layer below labels](https://docs.mapbox.com/mapbox-gl-js/example/geojson-layer-in-stack/)\n     * @see [Example: Create and style clusters](https://docs.mapbox.com/mapbox-gl-js/example/cluster/) (circle layer)\n     * @see [Example: Add a vector tile source](https://docs.mapbox.com/mapbox-gl-js/example/vector-source/) (line layer)\n     * @see [Example: Add a WMS layer](https://docs.mapbox.com/mapbox-gl-js/example/wms/) (raster layer)\n     */\n    addLayer(layer: LayerSpecification | CustomLayerInterface, beforeId?: string): this {\n        if (!this._isValidId(layer.id)) {\n            return this;\n        }\n\n        this._lazyInitEmptyStyle();\n        this.style.addLayer(layer, beforeId);\n        return this._update(true);\n    }\n\n    /**\n     * Returns current slot of the layer.\n     *\n     * @param {string} layerId Identifier of the layer to retrieve its current slot.\n     * @returns {string | null} The slot identifier or `null` if layer doesn't have it.\n     *\n     * @example\n     * map.getSlot('roads');\n     */\n    getSlot(layerId: string): ?string {\n        const layer = this.getLayer(layerId);\n\n        if (!layer) {\n            return null;\n        }\n\n        return layer.slot || null;\n    }\n\n    /**\n     * Sets or removes [a slot](https://docs.mapbox.com/style-spec/reference/slots/) of style layer.\n     *\n     * @param {string} layerId Identifier of style layer.\n     * @param {string} slot Identifier of slot. If `null` or `undefined` is provided, the method removes slot.\n     * @returns {Map} Returns itself to allow for method chaining.\n     *\n     * @example\n     * // Sets new slot for style layer\n     * map.setSlot(\"heatmap\", \"top\");\n     */\n    setSlot(layerId: string, slot: ?string): this {\n        this.style.setSlot(layerId, slot);\n        this.style.mergeLayers();\n        return this._update(true);\n    }\n\n    /**\n     * Adds new [import](https://docs.mapbox.com/style-spec/reference/imports/) to current style.\n     *\n     * @param {ImportSpecification} importSpecification Specification of import.\n     * @param {string} beforeId (optional) Identifier of an existing import to insert the new import before.\n     * @returns {Map} Returns itself to allow for method chaining.\n     *\n     * @example\n     * // Add streets style to empty map\n     * new Map({style: {version: 8, sources: {}, layers: []}})\n     *     .addImport({id: 'basemap', url: 'mapbox://styles/mapbox/streets-v12'});\n     *\n     * @example\n     * // Add new style before already added\n     * const map = new Map({\n     *     imports: [\n     *         {\n     *             id: 'basemap',\n     *             url: 'mapbox://styles/mapbox/standard'\n     *         }\n     *     ],\n     *     style: {\n     *         version: 8,\n     *         sources: {},\n     *         layers: []\n     *     }\n     * });\n     *\n     * map.addImport({\n     *     id: 'lakes',\n     *     url: 'https://styles/mapbox/streets-v12'\n     * }, 'basemap');\n     */\n    addImport(importSpecification: ImportSpecification, beforeId: ?string): this {\n        this.style.addImport(importSpecification, beforeId);\n        return this;\n    }\n\n    /**\n     * Updates already added to style import.\n     *\n     * @param {string} importId Identifier of import to update.\n     * @param {ImportSpecification | string} importSpecification Import specification or URL of style.\n     * @returns {Map} Returns itself to allow for method chaining.\n     *\n     * @example\n     * // Update import with new data\n     * map.updateImport('basemap', {\n     *     data: {\n     *         version: 8,\n     *         sources: {},\n     *         layers: [\n     *             {\n     *                 id: 'background',\n     *                 type: 'background',\n     *                 paint: {\n     *                     'background-color': '#eee'\n     *                 }\n     *             }\n     *         ]\n     *     }\n     * });\n     *\n     * @example\n     * // Change URL of imported style\n     * map.updateImport('basemap', 'mapbox://styles/mapbox/other-standard');\n     */\n    updateImport(importId: string, importSpecification: ImportSpecification | string): this {\n        if (typeof importSpecification !== 'string' && importSpecification.id !== importId) {\n            this.removeImport(importId);\n            return this.addImport(importSpecification);\n        }\n\n        this.style.updateImport(importId, importSpecification);\n        return this._update(true);\n    }\n\n    /**\n     * Removes added to style import.\n     *\n     * @param {string} importId Identifier of import to remove.\n     * @returns {Map} Returns itself to allow for method chaining.\n     *\n     * @example\n     * // Removes imported style\n     * map.removeImport('basemap');\n     */\n    removeImport(importId: string): this {\n        this.style.removeImport(importId);\n        return this;\n    }\n\n    /**\n     * Moves import to position before another import, specified with `beforeId`. Order of imported styles corresponds to order of their layers.\n     *\n     * @param {string} importId Identifier of import to move.\n     * @param {string} beforeId The identifier of an existing import to move the new import before.\n     * @returns {Map} Returns itself to allow for method chaining.\n     *\n     * @example\n     * const map = new Map({\n     *     style: {\n     *         imports: [\n     *             {\n     *                 id: 'basemap',\n     *                 url: 'mapbox://styles/mapbox/standard'\n     *             },\n     *             {\n     *                 id: 'streets-v12',\n     *                 url: 'mapbox://styles/mapbox/streets-v12'\n     *             }\n     *         ]\n     *     }\n     * });\n     * // Place `streets-v12` import before `basemap`\n     * map.moveImport('streets-v12', 'basemap');\n     */\n    moveImport(importId: string, beforeId: string): this {\n        this.style.moveImport(importId, beforeId);\n        return this._update(true);\n    }\n\n    /**\n     * Moves a layer to a different z-position.\n     *\n     * @param {string} id The ID of the layer to move.\n     * @param {string} [beforeId] The ID of an existing layer to insert the new layer before.\n     * When viewing the map, the `id` layer will appear beneath the `beforeId` layer.\n     * If `beforeId` is omitted, the layer will be appended to the end of the layers array\n     * and appear above all other layers on the map.\n     * *Note*: Layers can only be rearranged within the same `slot`. The new layer must share the\n     * same `slot` as the existing layer to be positioned underneath it. If the\n     * layers are in different slots, the `beforeId` parameter will be ignored and\n     * the new layer will be appended to the end of the layers array.\n     * During 3D globe and terrain rendering, GL JS aims to batch multiple layers together for optimal performance.\n     * This process might lead to a rearrangement of layers. Layers draped over globe and terrain,\n     * such as `fill`, `line`, `background`, `hillshade`, and `raster`, are rendered first.\n     * These layers are rendered underneath symbols, regardless of whether they are placed\n     * in the middle or top slots or without a designated slot.\n     * @returns {Map} Returns itself to allow for method chaining.\n     *\n     * @example\n     * // Move a layer with ID 'polygon' before the layer with ID 'country-label'. The `polygon` layer will appear beneath the `country-label` layer on the map.\n     * map.moveLayer('polygon', 'country-label');\n     */\n    moveLayer(id: string, beforeId?: string): this {\n        if (!this._isValidId(id)) {\n            return this;\n        }\n\n        this.style.moveLayer(id, beforeId);\n        return this._update(true);\n    }\n\n    /**\n     * Removes the layer with the given ID from the map's style.\n     *\n     * If no such layer exists, an `error` event is fired.\n     *\n     * @param {string} id ID of the layer to remove.\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @fires Map.event:error\n     *\n     * @example\n     * // If a layer with ID 'state-data' exists, remove it.\n     * if (map.getLayer('state-data')) map.removeLayer('state-data');\n     */\n    removeLayer(id: string): this {\n        if (!this._isValidId(id)) {\n            return this;\n        }\n\n        this.style.removeLayer(id);\n        return this._update(true);\n    }\n\n    /**\n     * Returns the layer with the specified ID in the map's style.\n     *\n     * @param {string} id The ID of the layer to get.\n     * @returns {?Object} The layer with the specified ID, or `undefined`\n     * if the ID corresponds to no existing layers.\n     *\n     * @example\n     * const stateDataLayer = map.getLayer('state-data');\n     *\n     * @see [Example: Filter symbols by toggling a list](https://www.mapbox.com/mapbox-gl-js/example/filter-markers/)\n     * @see [Example: Filter symbols by text input](https://www.mapbox.com/mapbox-gl-js/example/filter-markers-by-input/)\n     */\n    getLayer(id: string): ?StyleLayer {\n        if (!this._isValidId(id)) {\n            return null;\n        }\n\n        return this.style.getOwnLayer(id);\n    }\n\n    /**\n     * Sets the zoom extent for the specified style layer. The zoom extent includes the\n     * [minimum zoom level](https://docs.mapbox.com/mapbox-gl-js/style-spec/#layer-minzoom)\n     * and [maximum zoom level](https://docs.mapbox.com/mapbox-gl-js/style-spec/#layer-maxzoom))\n     * at which the layer will be rendered.\n     *\n     * Note: For style layers using vector sources, style layers cannot be rendered at zoom levels lower than the\n     * minimum zoom level of the _source layer_ because the data does not exist at those zoom levels. If the minimum\n     * zoom level of the source layer is higher than the minimum zoom level defined in the style layer, the style\n     * layer will not be rendered at all zoom levels in the zoom range.\n     *\n     * @param {string} layerId The ID of the layer to which the zoom extent will be applied.\n     * @param {number} minzoom The minimum zoom to set (0-24).\n     * @param {number} maxzoom The maximum zoom to set (0-24).\n     * @returns {Map} Returns itself to allow for method chaining.\n     *\n     * @example\n     * map.setLayerZoomRange('my-layer', 2, 5);\n     */\n    setLayerZoomRange(layerId: string, minzoom: number, maxzoom: number): this {\n        if (!this._isValidId(layerId)) {\n            return this;\n        }\n\n        this.style.setLayerZoomRange(layerId, minzoom, maxzoom);\n        return this._update(true);\n    }\n\n    /**\n     * Sets the filter for the specified style layer.\n     *\n     * Filters control which features a style layer renders from its source.\n     * Any feature for which the filter expression evaluates to `true` will be\n     * rendered on the map. Those that are false will be hidden.\n     *\n     * Use `setFilter` to show a subset of your source data.\n     *\n     * To clear the filter, pass `null` or `undefined` as the second parameter.\n     *\n     * @param {string} layerId The ID of the layer to which the filter will be applied.\n     * @param {Array | null | undefined} filter The filter, conforming to the Mapbox Style Specification's\n     * [filter definition](https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/#filter).  If `null` or `undefined` is provided, the function removes any existing filter from the layer.\n     * @param {Object} [options] Options object.\n     * @param {boolean} [options.validate=true] Whether to check if the filter conforms to the Mapbox GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function.\n     * @returns {Map} Returns itself to allow for method chaining.\n     *\n     * @example\n     * // display only features with the 'name' property 'USA'\n     * map.setFilter('my-layer', ['==', ['get', 'name'], 'USA']);\n     * @example\n     * // display only features with five or more 'available-spots'\n     * map.setFilter('bike-docks', ['>=', ['get', 'available-spots'], 5]);\n     * @example\n     * // remove the filter for the 'bike-docks' style layer\n     * map.setFilter('bike-docks', null);\n     *\n     * @see [Example: Filter features within map view](https://www.mapbox.com/mapbox-gl-js/example/filter-features-within-map-view/)\n     * @see [Example: Highlight features containing similar data](https://www.mapbox.com/mapbox-gl-js/example/query-similar-features/)\n     * @see [Example: Create a timeline animation](https://www.mapbox.com/mapbox-gl-js/example/timeline-animation/)\n     * @see [Tutorial: Show changes over time](https://docs.mapbox.com/help/tutorials/show-changes-over-time/)\n     */\n    setFilter(layerId: string, filter: ?FilterSpecification,  options: StyleSetterOptions = {}): this {\n        if (!this._isValidId(layerId)) {\n            return this;\n        }\n\n        this.style.setFilter(layerId, filter, options);\n        return this._update(true);\n    }\n\n    /**\n     * Returns the filter applied to the specified style layer.\n     *\n     * @param {string} layerId The ID of the style layer whose filter to get.\n     * @returns {Array} The layer's filter.\n     * @example\n     * const filter = map.getFilter('myLayer');\n     */\n    getFilter(layerId: string): ?FilterSpecification {\n        if (!this._isValidId(layerId)) {\n            return null;\n        }\n\n        return this.style.getFilter(layerId);\n    }\n\n    /**\n     * Sets the value of a paint property in the specified style layer.\n     *\n     * @param {string} layerId The ID of the layer to set the paint property in.\n     * @param {string} name The name of the paint property to set.\n     * @param {*} value The value of the paint property to set.\n     * Must be of a type appropriate for the property, as defined in the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/).\n     * @param {Object} [options] Options object.\n     * @param {boolean} [options.validate=true] Whether to check if `value` conforms to the Mapbox GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function.\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * map.setPaintProperty('my-layer', 'fill-color', '#faafee');\n     * @see [Example: Change a layer's color with buttons](https://www.mapbox.com/mapbox-gl-js/example/color-switcher/)\n     * @see [Example: Adjust a layer's opacity](https://www.mapbox.com/mapbox-gl-js/example/adjust-layer-opacity/)\n     * @see [Example: Create a draggable point](https://www.mapbox.com/mapbox-gl-js/example/drag-a-point/)\n     */\n    setPaintProperty(layerId: string, name: string, value: any, options: StyleSetterOptions = {}): this {\n        if (!this._isValidId(layerId)) {\n            return this;\n        }\n\n        this.style.setPaintProperty(layerId, name, value, options);\n        return this._update(true);\n    }\n\n    /**\n     * Returns the value of a paint property in the specified style layer.\n     *\n     * @param {string} layerId The ID of the layer to get the paint property from.\n     * @param {string} name The name of a paint property to get.\n     * @returns {*} The value of the specified paint property.\n     * @example\n     * const paintProperty = map.getPaintProperty('mySymbolLayer', 'icon-color');\n     */\n    getPaintProperty(layerId: string, name: string): void | TransitionSpecification | PropertyValueSpecification<mixed> {\n        if (!this._isValidId(layerId)) {\n            return null;\n        }\n\n        return this.style.getPaintProperty(layerId, name);\n    }\n\n    /**\n     * Sets the value of a layout property in the specified style layer.\n     *\n     * @param {string} layerId The ID of the layer to set the layout property in.\n     * @param {string} name The name of the layout property to set.\n     * @param {*} value The value of the layout property. Must be of a type appropriate for the property, as defined in the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/).\n     * @param {Object} [options] Options object.\n     * @param {boolean} [options.validate=true] Whether to check if `value` conforms to the Mapbox GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function.\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * map.setLayoutProperty('my-layer', 'visibility', 'none');\n     * @see [Example: Show and hide layers](https://docs.mapbox.com/mapbox-gl-js/example/toggle-layers/)\n     */\n    setLayoutProperty(layerId: string, name: string, value: any, options: StyleSetterOptions = {}): this {\n        if (!this._isValidId(layerId)) {\n            return this;\n        }\n\n        this.style.setLayoutProperty(layerId, name, value, options);\n        return this._update(true);\n    }\n\n    /**\n     * Returns the value of a layout property in the specified style layer.\n     *\n     * @param {string} layerId The ID of the layer to get the layout property from.\n     * @param {string} name The name of the layout property to get.\n     * @returns {*} The value of the specified layout property.\n     * @example\n     * const layoutProperty = map.getLayoutProperty('mySymbolLayer', 'icon-anchor');\n     */\n    getLayoutProperty(layerId: string, name: string): ?PropertyValueSpecification<mixed> {\n        if (!this._isValidId(layerId)) {\n            return null;\n        }\n\n        return this.style.getLayoutProperty(layerId, name);\n    }\n\n    /** @section {Style properties} */\n\n    /**\n     * Returns the imported style schema.\n     *\n     * @param {string} importId The name of the imported style (e.g. `basemap`).\n     * @returns {*} Returns the imported style schema.\n     * @private\n     *\n     * @example\n     * map.getSchema('basemap');\n     */\n    getSchema(importId: string): ?SchemaSpecification {\n        return this.style.getSchema(importId);\n    }\n\n    /**\n     * Sets the imported style schema value.\n     *\n     * @param {string} importId The name of the imported style (e.g. `basemap`).\n     * @param {SchemaSpecification} schema The imported style schema.\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @private\n     *\n     * @example\n     * map.setSchema('basemap', {lightPreset: {type: 'string', default: 'night', values: ['day', 'night']}});\n     */\n    setSchema(importId: string, schema: SchemaSpecification): this {\n        this.style.setSchema(importId, schema);\n        return this._update(true);\n    }\n\n    /**\n     * Returns the imported style configuration.\n     *\n     * @param {string} importId The name of the imported style (e.g. `basemap`).\n     * @returns {*} Returns the imported style configuration.\n     * @example\n     * map.getConfig('basemap');\n     */\n    getConfig(importId: string): ?ConfigSpecification {\n        return this.style.getConfig(importId);\n    }\n\n    /**\n     * Sets the imported style configuration value.\n     *\n     * @param {string} importId The name of the imported style (e.g. `basemap`).\n     * @param {ConfigSpecification} config The imported style configuration value.\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * map.setConfig('basemap', {lightPreset: 'night', showPointOfInterestLabels: false});\n     */\n    setConfig(importId: string, config: ConfigSpecification): this {\n        this.style.setConfig(importId, config);\n        return this._update(true);\n    }\n\n    /**\n     * Returns the value of a configuration property in the imported style.\n     *\n     * @param {string} importId The name of the imported style (e.g. `basemap`).\n     * @param {string} configName The name of the configuration property from the style.\n     * @returns {*} Returns the value of the configuration property.\n     * @example\n     * map.getConfigProperty('basemap', 'showLabels');\n     */\n    getConfigProperty(importId: string, configName: string): ?any {\n        return this.style.getConfigProperty(importId, configName);\n    }\n\n    /**\n     * Sets the value of a configuration property in the currently set style.\n     *\n     * @param {string} importId The name of the imported style to set the config for (e.g. `basemap`).\n     * @param {string} configName The name of the configuration property from the style.\n     * @param {*} value The value of the configuration property. Must be of a type appropriate for the property, as defined by the style configuration schema.\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * map.setConfigProperty('basemap', 'showLabels', false);\n     */\n    setConfigProperty(importId: string, configName: string, value: any): this {\n        this.style.setConfigProperty(importId, configName, value);\n        return this._update(true);\n    }\n\n    /**\n     * Adds a set of Mapbox style light to the map's style.\n     *\n     * _Note: This light is not to confuse with our legacy light API used through {@link Map#setLight} and {@link Map#getLight}_.\n     *\n     * @param {Array<LightsSpecification>} lights An array of lights to add, conforming to the Mapbox Style Specification's light definition.\n     * @returns {Map} Returns itself to allow for method chaining.\n     *\n     * @example\n     * // Add a directional light\n     * map.setLights([{\n     *     \"id\": \"sun_light\",\n     *     \"type\": \"directional\",\n     *     \"properties\": {\n     *         \"color\": \"rgba(255.0, 0.0, 0.0, 1.0)\",\n     *         \"intensity\": 0.4,\n     *         \"direction\": [200.0, 40.0],\n     *         \"cast-shadows\": true,\n     *         \"shadow-intensity\": 0.2\n     *     }\n     * }]);\n     */\n    setLights(lights: ?Array<LightsSpecification>): this {\n        this._lazyInitEmptyStyle();\n        if (lights && lights.length === 1 && lights[0].type === \"flat\") {\n            const flatLight: FlatLightSpecification = lights[0];\n            if (!flatLight.properties) {\n                this.style.setFlatLight({}, \"flat\");\n            } else {\n                this.style.setFlatLight(flatLight.properties, flatLight.id, {});\n            }\n        } else {\n            this.style.setLights(lights);\n            if (this.painter.terrain) {\n                this.painter.terrain.invalidateRenderCache = true;\n            }\n        }\n        return this._update(true);\n    }\n\n    /**\n     * Returns the lights added to the map.\n     *\n     * @returns {Array<LightSpecification>} Lights added to the map.\n     * @example\n     * const lights = map.getLights();\n     */\n    getLights(): ?Array<LightsSpecification> {\n        const lights = this.style.getLights() || [];\n        if (lights.length === 0) {\n            lights.push({\n                \"id\": this.style.light.id,\n                \"type\": \"flat\",\n                \"properties\": this.style.getFlatLight()\n            });\n        }\n        return lights;\n    }\n\n    /**\n     * Sets the any combination of light values.\n     *\n     * _Note: that this API is part of the legacy light API, prefer using {@link Map#setLights}.\n     *\n     * @param {LightSpecification} light Light properties to set. Must conform to the [Light Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#light).\n     * @param {Object} [options] Options object.\n     * @param {boolean} [options.validate=true] Whether to check if the filter conforms to the Mapbox GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function.\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * map.setLight({\n     *     \"anchor\": \"viewport\",\n     *     \"color\": \"blue\",\n     *     \"intensity\": 0.5\n     * });\n     */\n    // eslint-disable-next-line no-unused-vars\n    setLight(light: LightSpecification, options: StyleSetterOptions = {}): this {\n        console.log(\"The `map.setLight` function is deprecated, prefer using `map.setLights` with `flat` light type instead.\");\n        return this.setLights([{\n            \"id\": \"flat\",\n            \"type\": \"flat\",\n            \"properties\": light\n        }]);\n    }\n\n    /**\n     * Returns the value of the light object.\n     *\n     * @returns {LightSpecification} Light properties of the style.\n     * @example\n     * const light = map.getLight();\n     */\n    getLight(): LightSpecification {\n        console.log(\"The `map.getLight` function is deprecated, prefer using `map.getLights` instead.\");\n        return this.style.getFlatLight();\n    }\n\n    // eslint-disable-next-line jsdoc/require-returns\n    /**\n     * Sets the terrain property of the style.\n     *\n     * @param {TerrainSpecification} terrain Terrain properties to set. Must conform to the [Terrain Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/terrain/).\n     * If `null` or `undefined` is provided, function removes terrain.\n     * Exaggeration could be updated for the existing terrain without explicitly specifying the `source`.\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * map.addSource('mapbox-dem', {\n     *     'type': 'raster-dem',\n     *     'url': 'mapbox://mapbox.mapbox-terrain-dem-v1',\n     *     'tileSize': 512,\n     *     'maxzoom': 14\n     * });\n     * // add the DEM source as a terrain layer with exaggerated height\n     * map.setTerrain({'source': 'mapbox-dem', 'exaggeration': 1.5});\n     * // update the exaggeration for the existing terrain\n     * map.setTerrain({'exaggeration': 2});\n     */\n    setTerrain(terrain?: TerrainSpecification): this {\n        this._lazyInitEmptyStyle();\n        if (!terrain && this.transform.projection.requiresDraping) {\n            this.style.setTerrainForDraping();\n        } else {\n            this.style.setTerrain(terrain);\n        }\n        this._averageElevationLastSampledAt = -Infinity;\n        return this._update(true);\n    }\n\n    /**\n     * Returns the terrain specification or `null` if terrain isn't set on the map.\n     *\n     * @returns {TerrainSpecification | null} Terrain specification properties of the style.\n     * @example\n     * const terrain = map.getTerrain();\n     */\n    getTerrain(): ?TerrainSpecification {\n        return this.style ? this.style.getTerrain() : null;\n    }\n\n    /**\n     * Sets the fog property of the style.\n     *\n     * @param {FogSpecification} fog The fog properties to set. Must conform to the [Fog Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/fog/).\n     * If `null` or `undefined` is provided, this function call removes the fog from the map.\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * map.setFog({\n     *     \"range\": [0.8, 8],\n     *     \"color\": \"#dc9f9f\",\n     *     \"horizon-blend\": 0.5,\n     *     \"high-color\": \"#245bde\",\n     *     \"space-color\": \"#000000\",\n     *     \"star-intensity\": 0.15\n     * });\n     * @see [Example: Add fog to a map](https://docs.mapbox.com/mapbox-gl-js/example/add-fog/)\n     */\n    setFog(fog?: FogSpecification): this {\n        this._lazyInitEmptyStyle();\n        this.style.setFog(fog);\n        return this._update(true);\n    }\n\n    /**\n     * Returns the fog specification or `null` if fog is not set on the map.\n     *\n     * @returns {FogSpecification} Fog specification properties of the style.\n     * @example\n     * const fog = map.getFog();\n     */\n    getFog(): ?FogSpecification {\n        return this.style ? this.style.getFog() : null;\n    }\n\n    /**\n     * Sets the camera property of the style.\n     *\n     * @param {CameraSpecification} camera The camera properties to set. Must conform to the Camera Style Specification.\n     * @returns {Map} Returns itself to allow for method chaining.\n     * @example\n     * map.setCamera({\n     *     \"camera-projection\": \"perspective\",\n     * });\n     */\n    setCamera(camera: CameraSpecification): this {\n        this.style.setCamera(camera);\n        return this._triggerCameraUpdate(camera);\n    }\n\n    _triggerCameraUpdate(camera: CameraSpecification): this {\n        return this._update(this.transform.setOrthographicProjectionAtLowPitch(camera['camera-projection'] === 'orthographic'));\n    }\n\n    /**\n     * Returns the camera options specification.\n     *\n     * @returns {CameraSpecification} Camera specification properties of the style.\n     * @example\n     * const camera = map.getCamera();\n     */\n    getCamera(): CameraSpecification {\n        return this.style.camera;\n    }\n\n    /**\n     * Returns the fog opacity for a given location.\n     *\n     * An opacity of 0 means that there is no fog contribution for the given location\n     * while a fog opacity of 1.0 means the location is fully obscured by the fog effect.\n     *\n     * If there is no fog set on the map, this function will return 0.\n     *\n     * @param {LngLatLike} lnglat The geographical location to evaluate the fog on.\n     * @returns {number} A value between 0 and 1 representing the fog opacity, where 1 means fully within, and 0 means not affected by the fog effect.\n     * @private\n     */\n    _queryFogOpacity(lnglat: LngLatLike): number {\n        if (!this.style || !this.style.fog) return 0.0;\n        return this.style.fog.getOpacityAtLatLng(LngLat.convert(lnglat), this.transform);\n    }\n\n    /** @section {Feature state} */\n\n    /**\n     * Sets the `state` of a feature.\n     * A feature's `state` is a set of user-defined key-value pairs that are assigned to a feature at runtime.\n     * When using this method, the `state` object is merged with any existing key-value pairs in the feature's state.\n     * Features are identified by their `id` attribute, which can be any number or string.\n     *\n     * This method can only be used with sources that have a `id` attribute. The `id` attribute can be defined in three ways:\n     * - For vector or GeoJSON sources, including an `id` attribute in the original data file.\n     * - For vector or GeoJSON sources, using the [`promoteId`](https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/#vector-promoteId) option at the time the source is defined.\n     * - For GeoJSON sources, using the [`generateId`](https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/#geojson-generateId) option to auto-assign an `id` based on the feature's index in the source data. If you change feature data using `map.getSource('some id').setData(...)`, you may need to re-apply state taking into account updated `id` values.\n     *\n     * _Note: You can use the [`feature-state` expression](https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/#feature-state) to access the values in a feature's state object for the purposes of styling_.\n     *\n     * @param {Object} feature Feature identifier. Feature objects returned from\n     * {@link Map#queryRenderedFeatures} or event handlers can be used as feature identifiers.\n     * @param {number | string} feature.id Unique id of the feature. Can be an integer or a string, but supports string values only when the [`promoteId`](https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/#vector-promoteId) option has been applied to the source or the string can be cast to an integer.\n     * @param {string} feature.source The id of the vector or GeoJSON source for the feature.\n     * @param {string} [feature.sourceLayer] (optional) *For vector tile sources, `sourceLayer` is required*.\n     * @param {Object} state A set of key-value pairs. The values should be valid JSON types.\n     * @returns {Map} The map object.\n     * @example\n     * // When the mouse moves over the `my-layer` layer, update\n     * // the feature state for the feature under the mouse\n     * map.on('mousemove', 'my-layer', (e) => {\n     *     if (e.features.length > 0) {\n     *         map.setFeatureState({\n     *             source: 'my-source',\n     *             sourceLayer: 'my-source-layer',\n     *             id: e.features[0].id,\n     *         }, {\n     *             hover: true\n     *         });\n     *     }\n     * });\n     *\n     * @see [Example: Create a hover effect](https://docs.mapbox.com/mapbox-gl-js/example/hover-styles/)\n     * @see [Tutorial: Create interactive hover effects with Mapbox GL JS](https://docs.mapbox.com/help/tutorials/create-interactive-hover-effects-with-mapbox-gl-js/)\n     */\n    setFeatureState(feature: { source: string; sourceLayer?: string; id: string | number; }, state: Object): this {\n        if (!this._isValidId(feature.source)) {\n            return this;\n        }\n\n        this.style.setFeatureState(feature, state);\n        return this._update();\n    }\n\n    // eslint-disable-next-line jsdoc/require-returns\n    /**\n     * Removes the `state` of a feature, setting it back to the default behavior.\n     * If only a `feature.source` is specified, it will remove the state for all features from that source.\n     * If `feature.id` is also specified, it will remove all keys for that feature's state.\n     * If `key` is also specified, it removes only that key from that feature's state.\n     * Features are identified by their `feature.id` attribute, which can be any number or string.\n     *\n     * @param {Object} feature Identifier of where to remove state. It can be a source, a feature, or a specific key of feature.\n     * Feature objects returned from {@link Map#queryRenderedFeatures} or event handlers can be used as feature identifiers.\n     * @param {number | string} [feature.id] (optional) Unique id of the feature. Can be an integer or a string, but supports string values only when the [`promoteId`](https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/#vector-promoteId) option has been applied to the source or the string can be cast to an integer.\n     * @param {string} feature.source The id of the vector or GeoJSON source for the feature.\n     * @param {string} [feature.sourceLayer] (optional) For vector tile sources, `sourceLayer` is required.\n     * @param {string} [key] (optional) The key in the feature state to reset.\n     *\n     * @example\n     * // Reset the entire state object for all features\n     * // in the `my-source` source\n     * map.removeFeatureState({\n     *     source: 'my-source'\n     * });\n     *\n     * @example\n     * // When the mouse leaves the `my-layer` layer,\n     * // reset the entire state object for the\n     * // feature under the mouse\n     * map.on('mouseleave', 'my-layer', (e) => {\n     *     map.removeFeatureState({\n     *         source: 'my-source',\n     *         sourceLayer: 'my-source-layer',\n     *         id: e.features[0].id\n     *     });\n     * });\n     *\n     * @example\n     * // When the mouse leaves the `my-layer` layer,\n     * // reset only the `hover` key-value pair in the\n     * // state for the feature under the mouse\n     * map.on('mouseleave', 'my-layer', (e) => {\n     *     map.removeFeatureState({\n     *         source: 'my-source',\n     *         sourceLayer: 'my-source-layer',\n     *         id: e.features[0].id\n     *     }, 'hover');\n     * });\n     */\n    removeFeatureState(feature: { source: string; sourceLayer?: string; id?: string | number; }, key?: string): this {\n        if (!this._isValidId(feature.source)) {\n            return this;\n        }\n\n        this.style.removeFeatureState(feature, key);\n        return this._update();\n    }\n\n    /**\n     * Gets the `state` of a feature.\n     * A feature's `state` is a set of user-defined key-value pairs that are assigned to a feature at runtime.\n     * Features are identified by their `id` attribute, which can be any number or string.\n     *\n     * _Note: To access the values in a feature's state object for the purposes of styling the feature, use the [`feature-state` expression](https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/#feature-state)_.\n     *\n     * @param {Object} feature Feature identifier. Feature objects returned from\n     * {@link Map#queryRenderedFeatures} or event handlers can be used as feature identifiers.\n     * @param {number | string} feature.id Unique id of the feature. Can be an integer or a string, but supports string values only when the [`promoteId`](https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/#vector-promoteId) option has been applied to the source or the string can be cast to an integer.\n     * @param {string} feature.source The id of the vector or GeoJSON source for the feature.\n     * @param {string} [feature.sourceLayer] (optional) *For vector tile sources, `sourceLayer` is required*.\n     *\n     * @returns {Object} The state of the feature: a set of key-value pairs that was assigned to the feature at runtime.\n     *\n     * @example\n     * // When the mouse moves over the `my-layer` layer,\n     * // get the feature state for the feature under the mouse\n     * map.on('mousemove', 'my-layer', (e) => {\n     *     if (e.features.length > 0) {\n     *         map.getFeatureState({\n     *             source: 'my-source',\n     *             sourceLayer: 'my-source-layer',\n     *             id: e.features[0].id\n     *         });\n     *     }\n     * });\n     */\n    getFeatureState(feature: { source: string; sourceLayer?: string; id: string | number; }): any {\n        if (!this._isValidId(feature.source)) {\n            return null;\n        }\n\n        return this.style.getFeatureState(feature);\n    }\n\n    _updateContainerDimensions() {\n        if (!this._container) return;\n\n        const width = this._container.getBoundingClientRect().width || 400;\n        const height = this._container.getBoundingClientRect().height || 300;\n\n        let transformValues;\n        let transformScaleWidth;\n        let transformScaleHeight;\n        let el: ?Element = this._container;\n        while (el && (!transformScaleWidth || !transformScaleHeight)) {\n            const transformMatrix = window.getComputedStyle(el).transform;\n            if (transformMatrix && transformMatrix !== 'none') {\n                transformValues = transformMatrix.match(/matrix.*\\((.+)\\)/)[1].split(', ');\n                if (transformValues[0] && transformValues[0] !== '0' && transformValues[0] !== '1') transformScaleWidth = transformValues[0];\n                if (transformValues[3] && transformValues[3] !== '0' && transformValues[3] !== '1') transformScaleHeight = transformValues[3];\n            }\n            el = el.parentElement;\n        }\n\n        this._containerWidth = transformScaleWidth ? Math.abs(width / transformScaleWidth) : width;\n        this._containerHeight = transformScaleHeight ? Math.abs(height / transformScaleHeight) : height;\n    }\n\n    _detectMissingCSS(): void {\n        const computedColor = window.getComputedStyle(this._missingCSSCanary).getPropertyValue('background-color');\n        if (computedColor !== 'rgb(250, 128, 114)') {\n            warnOnce('This page appears to be missing CSS declarations for ' +\n                'Mapbox GL JS, which may cause the map to display incorrectly. ' +\n                'Please ensure your page includes mapbox-gl.css, as described ' +\n                'in https://www.mapbox.com/mapbox-gl-js/api/.');\n        }\n    }\n\n    _setupContainer() {\n        const container = this._container;\n        container.classList.add('mapboxgl-map');\n\n        const missingCSSCanary = this._missingCSSCanary = DOM.create('div', 'mapboxgl-canary', container);\n        missingCSSCanary.style.visibility = 'hidden';\n        this._detectMissingCSS();\n\n        const canvasContainer = this._canvasContainer = DOM.create('div', 'mapboxgl-canvas-container', container);\n        this._canvas = DOM.create('canvas', 'mapboxgl-canvas', canvasContainer);\n\n        if (this._interactive) {\n            canvasContainer.classList.add('mapboxgl-interactive');\n            this._canvas.setAttribute('tabindex', '0');\n        }\n\n        // $FlowFixMe[method-unbinding]\n        this._canvas.addEventListener('webglcontextlost', this._contextLost, false);\n        // $FlowFixMe[method-unbinding]\n        this._canvas.addEventListener('webglcontextrestored', this._contextRestored, false);\n        this._canvas.setAttribute('aria-label', this._getUIString('Map.Title'));\n        this._canvas.setAttribute('role', 'region');\n\n        this._updateContainerDimensions();\n        this._resizeCanvas(this._containerWidth, this._containerHeight);\n\n        const controlContainer = this._controlContainer = DOM.create('div', 'mapboxgl-control-container', container);\n        const positions = this._controlPositions = {};\n        ['top-left', 'top-right', 'bottom-left', 'bottom-right'].forEach((positionName) => {\n            positions[positionName] = DOM.create('div', `mapboxgl-ctrl-${positionName}`, controlContainer);\n        });\n\n        // $FlowFixMe[method-unbinding]\n        this._container.addEventListener('scroll', this._onMapScroll, false);\n    }\n\n    _resizeCanvas(width: number, height: number) {\n        const pixelRatio = browser.devicePixelRatio || 1;\n\n        // Request the required canvas size (rounded up) taking the pixelratio into account.\n        this._canvas.width = pixelRatio * Math.ceil(width);\n        this._canvas.height = pixelRatio * Math.ceil(height);\n\n        // Maintain the same canvas size, potentially downscaling it for HiDPI displays\n        this._canvas.style.width = `${width}px`;\n        this._canvas.style.height = `${height}px`;\n    }\n\n    _addMarker(marker: Marker) {\n        this._markers.push(marker);\n    }\n\n    _removeMarker(marker: Marker) {\n        const index = this._markers.indexOf(marker);\n        if (index !== -1) {\n            this._markers.splice(index, 1);\n        }\n    }\n\n    _addPopup(popup: Popup) {\n        this._popups.push(popup);\n    }\n\n    _removePopup(popup: Popup) {\n        const index = this._popups.indexOf(popup);\n        if (index !== -1) {\n            this._popups.splice(index, 1);\n        }\n    }\n\n    _setupPainter() {\n        const attributes = extend({}, supported.webGLContextAttributes, {\n            failIfMajorPerformanceCaveat: this._failIfMajorPerformanceCaveat,\n            preserveDrawingBuffer: this._preserveDrawingBuffer,\n            antialias: this._antialias || false\n        });\n\n        const gl = ((this._canvas.getContext('webgl2', attributes): any): WebGL2RenderingContext);\n\n        if (!gl) {\n            this.fire(new ErrorEvent(new Error('Failed to initialize WebGL')));\n            return;\n        }\n\n        storeAuthState(gl, true);\n\n        this.painter = new Painter(gl, this._contextCreateOptions, this.transform, this._tp);\n        this.on('data', (event: MapDataEvent) => {\n            if (event.dataType === 'source') {\n                this.painter.setTileLoadedFlag(true);\n            }\n        });\n\n        webpSupported.testSupport(gl);\n    }\n\n    _contextLost(event: any) {\n        event.preventDefault();\n        if (this._frame) {\n            this._frame.cancel();\n            this._frame = null;\n        }\n        this.fire(new Event('webglcontextlost', {originalEvent: event}));\n    }\n\n    _contextRestored(event: any) {\n        this._setupPainter();\n        this.resize();\n        this._update();\n        this.fire(new Event('webglcontextrestored', {originalEvent: event}));\n    }\n\n    _onMapScroll(event: any): ?boolean {\n        if (event.target !== this._container) return;\n\n        // Revert any scroll which would move the canvas outside of the view\n        this._container.scrollTop = 0;\n        this._container.scrollLeft = 0;\n        return false;\n    }\n\n    /** @section {Lifecycle} */\n\n    /**\n     * Returns a Boolean indicating whether the map is fully loaded.\n     *\n     * Returns `false` if the style is not yet fully loaded,\n     * or if there has been a change to the sources or style that\n     * has not yet fully loaded.\n     *\n     * @returns {boolean} A Boolean indicating whether the map is fully loaded.\n     * @example\n     * const isLoaded = map.loaded();\n     */\n    loaded(): boolean {\n        return !this._styleDirty && !this._sourcesDirty && !!this.style && this.style.loaded();\n    }\n\n    /**\n     * Update this map's style and sources, and re-render the map.\n     *\n     * @param {boolean} updateStyle mark the map's style for reprocessing as\n     * well as its sources\n     * @returns {Map} this\n     * @private\n     */\n    _update(updateStyle?: boolean): this {\n        if (!this.style) return this;\n\n        this._styleDirty = this._styleDirty || updateStyle;\n        this._sourcesDirty = true;\n        this.triggerRepaint();\n\n        return this;\n    }\n\n    /**\n     * Request that the given callback be executed during the next render\n     * frame.  Schedule a render frame if one is not already scheduled.\n     * @returns An id that can be used to cancel the callback\n     * @private\n     */\n    // $FlowFixMe[method-unbinding]\n    _requestRenderFrame(callback: () => void): TaskID {\n        this._update();\n        return this._renderTaskQueue.add(callback);\n    }\n\n    // $FlowFixMe[method-unbinding]\n    _cancelRenderFrame(id: TaskID) {\n        this._renderTaskQueue.remove(id);\n    }\n\n    /**\n     * Request that the given callback be executed during the next render frame if the map is not\n     * idle. Otherwise it is executed immediately, to avoid triggering a new render.\n     * @private\n     */\n    _requestDomTask(callback: () => void) {\n        // This condition means that the map is idle: the callback needs to be called right now as\n        // there won't be a triggered render to run the queue.\n        if (!this.loaded() || (this.loaded() && !this.isMoving())) {\n            callback();\n        } else {\n            this._domRenderTaskQueue.add(callback);\n        }\n    }\n\n    /**\n     * Call when a (re-)render of the map is required:\n     * - The style has changed (`setPaintProperty()`, etc.)\n     * - Source data has changed (for example, tiles have finished loading)\n     * - The map has is moving (or just finished moving)\n     * - A transition is in progress\n     *\n     * @param {number} paintStartTimeStamp  The time when the animation frame began executing.\n     *\n     * @returns {Map} this\n     * @private\n     */\n    _render(paintStartTimeStamp: number) {\n        const m = PerformanceUtils.beginMeasure('render');\n        this.fire(new Event('renderstart'));\n\n        let gpuTimer;\n        const extTimerQuery = this.painter.context.extTimerQuery;\n        const frameStartTime = browser.now();\n        const gl = this.painter.context.gl;\n        if (this.listens('gpu-timing-frame')) {\n            gpuTimer = gl.createQuery();\n            gl.beginQuery(extTimerQuery.TIME_ELAPSED_EXT, gpuTimer);\n        }\n\n        // A custom layer may have used the context asynchronously. Mark the state as dirty.\n        this.painter.context.setDirty();\n        this.painter.setBaseState();\n\n        if (this.isMoving() || this.isRotating() || this.isZooming()) {\n            this._interactionRange[0] = Math.min(this._interactionRange[0], performance.now());\n            this._interactionRange[1] = Math.max(this._interactionRange[1], performance.now());\n        }\n\n        this._renderTaskQueue.run(paintStartTimeStamp);\n        this._domRenderTaskQueue.run(paintStartTimeStamp);\n        // A task queue callback may have fired a user event which may have removed the map\n        if (this._removed) return;\n\n        this._updateProjectionTransition();\n\n        const fadeDuration = this._isInitialLoad ? 0 : this._fadeDuration;\n\n        // If the style has changed, the map is being zoomed, or a transition or fade is in progress:\n        //  - Apply style changes (in a batch)\n        //  - Recalculate paint properties.\n        if (this.style && this._styleDirty) {\n            this._styleDirty = false;\n\n            const zoom = this.transform.zoom;\n            const pitch = this.transform.pitch;\n            const now = browser.now();\n\n            const parameters = new EvaluationParameters(zoom, {\n                now,\n                fadeDuration,\n                pitch,\n                transition: this.style.transition\n            });\n\n            this.style.update(parameters);\n        }\n\n        if (this.style && this.style.hasFogTransition()) {\n            this.style._markersNeedUpdate = true;\n            this._sourcesDirty = true;\n        }\n\n        // If we are in _render for any reason other than an in-progress paint\n        // transition, update source caches to check for and load any tiles we\n        // need for the current transform\n        let averageElevationChanged = false;\n        if (this.style && this._sourcesDirty) {\n            this._sourcesDirty = false;\n            this.painter._updateFog(this.style);\n            this._updateTerrain(); // Terrain DEM source updates here and skips update in Style#updateSources.\n            averageElevationChanged = this._updateAverageElevation(frameStartTime);\n            this.style.updateSources(this.transform);\n            // Update positions of markers and popups on enabling/disabling terrain\n            this._forceMarkerAndPopupUpdate();\n        } else {\n            averageElevationChanged = this._updateAverageElevation(frameStartTime);\n        }\n\n        this._placementDirty = this.style && this.style._updatePlacement(this.painter.transform, this.showCollisionBoxes, fadeDuration, this._crossSourceCollisions);\n\n        // Actually draw\n        if (this.style) {\n            this.painter.render(this.style, {\n                showTileBoundaries: this.showTileBoundaries,\n                showParseStatus: this.showParseStatus,\n                wireframe: {\n                    terrain: this.showTerrainWireframe,\n                    layers2D: this.showLayers2DWireframe,\n                    layers3D: this.showLayers3DWireframe\n                },\n                showOverdrawInspector: this._showOverdrawInspector,\n                showQueryGeometry: !!this._showQueryGeometry,\n                showTileAABBs: this.showTileAABBs,\n                rotating: this.isRotating(),\n                zooming: this.isZooming(),\n                moving: this.isMoving(),\n                fadeDuration,\n                isInitialLoad: this._isInitialLoad,\n                showPadding: this.showPadding,\n                gpuTiming: !!this.listens('gpu-timing-layer'),\n                gpuTimingDeferredRender: !!this.listens('gpu-timing-deferred-render'),\n                speedIndexTiming: this.speedIndexTiming,\n            });\n        }\n\n        this.fire(new Event('render'));\n\n        if (this.loaded() && !this._loaded) {\n            this._loaded = true;\n            PerformanceUtils.mark(PerformanceMarkers.load);\n            this.fire(new Event('load'));\n        }\n\n        if (this.style && (this.style.hasTransitions())) {\n            this._styleDirty = true;\n        }\n\n        if (this.style && !this._placementDirty) {\n            // Since no fade operations are in progress, we can release\n            // all tiles held for fading. If we didn't do this, the tiles\n            // would just sit in the SourceCaches until the next render\n            this.style._releaseSymbolFadeTiles();\n        }\n\n        if (gpuTimer) {\n            const renderCPUTime = browser.now() - frameStartTime;\n            gl.endQuery(extTimerQuery.TIME_ELAPSED_EXT);\n            setTimeout(() => {\n                const renderGPUTime = gl.getQueryParameter(gpuTimer, gl.QUERY_RESULT) / (1000 * 1000);\n                gl.deleteQuery(gpuTimer);\n                this.fire(new Event('gpu-timing-frame', {\n                    cpuTime: renderCPUTime,\n                    gpuTime: renderGPUTime\n                }));\n                // $FlowFixMe extra-arg: fixed in later Flow versions\n                performance.mark('frame-gpu', {\n                    startTime: frameStartTime,\n                    detail: {\n                        gpuTime: renderGPUTime\n                    }\n                });\n            }, 50); // Wait 50ms to give time for all GPU calls to finish before querying\n        }\n\n        PerformanceUtils.endMeasure(m);\n\n        if (this.listens('gpu-timing-layer')) {\n            // Resetting the Painter's per-layer timing queries here allows us to isolate\n            // the queries to individual frames.\n            const frameLayerQueries = this.painter.collectGpuTimers();\n\n            setTimeout(() => {\n                const renderedLayerTimes = this.painter.queryGpuTimers(frameLayerQueries);\n\n                this.fire(new Event('gpu-timing-layer', {\n                    layerTimes: renderedLayerTimes\n                }));\n            }, 50); // Wait 50ms to give time for all GPU calls to finish before querying\n        }\n\n        if (this.listens('gpu-timing-deferred-render')) {\n            const deferredRenderQueries = this.painter.collectDeferredRenderGpuQueries();\n\n            setTimeout(() => {\n                const gpuTime = this.painter.queryGpuTimeDeferredRender(deferredRenderQueries);\n                this.fire(new Event('gpu-timing-deferred-render', {gpuTime}));\n            }, 50); // Wait 50ms to give time for all GPU calls to finish before querying\n        }\n\n        // Schedule another render frame if it's needed.\n        //\n        // Even though `_styleDirty` and `_sourcesDirty` are reset in this\n        // method, synchronous events fired during Style#update or\n        // Style#updateSources could have caused them to be set again.\n        const somethingDirty = this._sourcesDirty || this._styleDirty || this._placementDirty || averageElevationChanged;\n        if (somethingDirty || this._repaint) {\n            this.triggerRepaint();\n        } else {\n            const willIdle = !this.isMoving() && this.loaded();\n            if (willIdle) {\n                // Before idling, we perform one last sample so that if the average elevation\n                // does not exactly match the terrain, we skip idle and ease it to its final state.\n                averageElevationChanged = this._updateAverageElevation(frameStartTime, true);\n            }\n\n            if (averageElevationChanged) {\n                this.triggerRepaint();\n            } else {\n                this._triggerFrame(false);\n                if (willIdle) {\n                    this.fire(new Event('idle'));\n                    this._isInitialLoad = false;\n                    // check the options to see if need to calculate the speed index\n                    if (this.speedIndexTiming) {\n                        const speedIndexNumber = this._calculateSpeedIndex();\n                        this.fire(new Event('speedindexcompleted', {speedIndex: speedIndexNumber}));\n                        this.speedIndexTiming = false;\n                    }\n                }\n            }\n        }\n\n        if (this._loaded && !this._fullyLoaded && !somethingDirty) {\n            this._fullyLoaded = true;\n            LivePerformanceUtils.mark(PerformanceMarkers.fullLoad);\n            // Following lines are billing and metrics related code. Do not change. See LICENSE.txt\n            if (this._performanceMetricsCollection) {\n                postPerformanceEvent(this._requestManager._customAccessToken, {\n                    width: this.painter.width,\n                    height: this.painter.height,\n                    interactionRange: this._interactionRange,\n                    visibilityHidden: this._visibilityHidden,\n                    terrainEnabled: !!this.painter.style.getTerrain(),\n                    fogEnabled: !!this.painter.style.getFog(),\n                    projection: this.getProjection().name,\n                    zoom: this.transform.zoom,\n                    renderer: this.painter.context.renderer,\n                    vendor: this.painter.context.vendor\n                });\n            }\n            this._authenticate();\n        }\n    }\n\n    _forceMarkerAndPopupUpdate(shouldWrap?: boolean) {\n        for (const marker of this._markers) {\n            // Wrap marker location when toggling to a projection without world copies\n            if (shouldWrap && !this.getRenderWorldCopies()) {\n                marker._lngLat = marker._lngLat.wrap();\n            }\n            marker._update();\n        }\n        for (const popup of this._popups) {\n            // Wrap popup location when toggling to a projection without world copies and track pointer set to false\n            if (shouldWrap && !this.getRenderWorldCopies() && !popup._trackPointer) {\n                popup._lngLat = popup._lngLat.wrap();\n            }\n            popup._update();\n        }\n    }\n\n    /**\n     * Update the average visible elevation by sampling terrain\n     *\n     * @returns {boolean} true if elevation has changed from the last sampling\n     * @private\n     */\n    _updateAverageElevation(timeStamp: number, ignoreTimeout: boolean = false): boolean {\n        const applyUpdate = (value: number) => {\n            this.transform.averageElevation = value;\n            this._update(false);\n            return true;\n        };\n\n        if (!this.painter.averageElevationNeedsEasing()) {\n            if (this.transform.averageElevation !== 0) return applyUpdate(0);\n            return false;\n        }\n\n        const exaggerationChanged = this.transform.elevation && this.transform.elevation.exaggeration() !== this._averageElevationExaggeration;\n        const timeoutElapsed = ignoreTimeout || timeStamp - this._averageElevationLastSampledAt > AVERAGE_ELEVATION_SAMPLING_INTERVAL;\n\n        if (exaggerationChanged || (timeoutElapsed && !this._averageElevation.isEasing(timeStamp))) {\n            const currentElevation = this.transform.averageElevation;\n            let newElevation = this.transform.sampleAverageElevation();\n\n            if (this.transform.elevation) {\n                // $FlowIgnore[incompatible-use]\n                this._averageElevationExaggeration = this.transform.elevation.exaggeration();\n            }\n\n            // New elevation is NaN if no terrain tiles were available\n            if (isNaN(newElevation)) {\n                newElevation = 0;\n            } else {\n                // Don't activate the timeout if no data was available\n                this._averageElevationLastSampledAt = timeStamp;\n            }\n            const elevationChange = Math.abs(currentElevation - newElevation);\n\n            if (elevationChange > AVERAGE_ELEVATION_EASE_THRESHOLD) {\n                if (this._isInitialLoad || exaggerationChanged) {\n                    this._averageElevation.jumpTo(newElevation);\n                    return applyUpdate(newElevation);\n                } else {\n                    this._averageElevation.easeTo(newElevation, timeStamp, AVERAGE_ELEVATION_EASE_TIME);\n                }\n            } else if (elevationChange > AVERAGE_ELEVATION_CHANGE_THRESHOLD) {\n                this._averageElevation.jumpTo(newElevation);\n                return applyUpdate(newElevation);\n            }\n        }\n\n        if (this._averageElevation.isEasing(timeStamp)) {\n            return applyUpdate(this._averageElevation.getValue(timeStamp));\n        }\n\n        return false;\n    }\n\n    /***** START WARNING - REMOVAL OR MODIFICATION OF THE\n    * FOLLOWING CODE VIOLATES THE MAPBOX TERMS OF SERVICE  ******\n    * The following code is used to access Mapbox's APIs. Removal or modification\n    * of this code can result in higher fees and/or\n    * termination of your account with Mapbox.\n    *\n    * Under the Mapbox Terms of Service, you may not use this code to access Mapbox\n    * Mapping APIs other than through Mapbox SDKs.\n    *\n    * The Mapping APIs documentation is available at https://docs.mapbox.com/api/maps/#maps\n    * and the Mapbox Terms of Service are available at https://www.mapbox.com/tos/\n    ******************************************************************************/\n\n    _authenticate() {\n        getMapSessionAPI(this._getMapId(), this._requestManager._skuToken, this._requestManager._customAccessToken, (err) => {\n            if (err) {\n                // throwing an error here will cause the callback to be called again unnecessarily\n                if (err.message === AUTH_ERR_MSG || (err: any).status === 401) {\n                    const gl = this.painter.context.gl;\n                    storeAuthState(gl, false);\n                    if (this._logoControl instanceof LogoControl) {\n                        this._logoControl._updateLogo();\n                    }\n                    if (gl) gl.clear(gl.DEPTH_BUFFER_BIT | gl.COLOR_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);\n\n                    if (!this._silenceAuthErrors) {\n                        this.fire(new ErrorEvent(new Error('A valid Mapbox access token is required to use Mapbox GL JS. To create an account or a new access token, visit https://account.mapbox.com/')));\n                    }\n                }\n            }\n        });\n\n        postMapLoadEvent(this._getMapId(), this._requestManager._skuToken, this._requestManager._customAccessToken, () => {});\n    }\n\n    /***** END WARNING - REMOVAL OR MODIFICATION OF THE\n    PRECEDING CODE VIOLATES THE MAPBOX TERMS OF SERVICE  ******/\n\n    _postStyleLoadEvent() {\n        if (!this.style.globalId) {\n            return;\n        }\n\n        postStyleLoadEvent(this._requestManager._customAccessToken, {\n            map: this,\n            skuToken: this._requestManager._skuToken,\n            style: this.style.globalId,\n            importedStyles: this.style.getImportGlobalIds()\n        });\n    }\n\n    _updateTerrain() {\n        // Recalculate if enabled/disabled and calculate elevation cover. As camera is using elevation tiles before\n        // render (and deferred update after zoom recalculation), this needs to be called when removing terrain source.\n        const adaptCameraAltitude = this._isDragging();\n        this.painter.updateTerrain(this.style, adaptCameraAltitude);\n    }\n\n    _calculateSpeedIndex(): number {\n        const finalFrame = this.painter.canvasCopy();\n        const canvasCopyInstances = this.painter.getCanvasCopiesAndTimestamps();\n        canvasCopyInstances.timeStamps.push(performance.now());\n\n        const gl = this.painter.context.gl;\n        const framebuffer = gl.createFramebuffer();\n        gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n\n        function read(texture: ?WebGLTexture) {\n            gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n            const pixels = new Uint8Array(gl.drawingBufferWidth * gl.drawingBufferHeight * 4);\n            gl.readPixels(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight, gl.RGBA, gl.UNSIGNED_BYTE, pixels);\n            return pixels;\n        }\n\n        return this._canvasPixelComparison(read(finalFrame), canvasCopyInstances.canvasCopies.map(read), canvasCopyInstances.timeStamps);\n    }\n\n    _canvasPixelComparison(finalFrame: Uint8Array, allFrames: Uint8Array[], timeStamps: number[]): number {\n        let finalScore = timeStamps[1] - timeStamps[0];\n        const numPixels = finalFrame.length / 4;\n\n        for (let i = 0; i < allFrames.length; i++) {\n            const frame = allFrames[i];\n            let cnt = 0;\n            for (let j = 0; j < frame.length; j += 4) {\n                if (frame[j] === finalFrame[j] &&\n                    frame[j + 1] === finalFrame[j + 1] &&\n                    frame[j + 2] === finalFrame[j + 2] &&\n                    frame[j + 3] === finalFrame[j + 3]) {\n                    cnt = cnt + 1;\n                }\n            }\n            //calculate the % visual completeness\n            const interval = timeStamps[i + 2] - timeStamps[i + 1];\n            const visualCompletness = cnt / numPixels;\n            finalScore +=  interval * (1 - visualCompletness);\n        }\n        return finalScore;\n    }\n\n    /**\n     * Clean up and release all internal resources associated with this map.\n     *\n     * This includes DOM elements, event bindings, web workers, and WebGL resources.\n     *\n     * Use this method when you are done using the map and wish to ensure that it no\n     * longer consumes browser resources. Afterwards, you must not call any other\n     * methods on the map.\n     *\n     * @example\n     * map.remove();\n     */\n    remove() {\n        if (this._hash) this._hash.remove();\n\n        for (const control of this._controls) control.onRemove(this);\n        this._controls = [];\n\n        if (this._frame) {\n            this._frame.cancel();\n            this._frame = null;\n        }\n        this._renderTaskQueue.clear();\n        this._domRenderTaskQueue.clear();\n        if (this.style) {\n            this.style.destroy();\n        }\n        this.painter.destroy();\n        if (this.handlers) this.handlers.destroy();\n        this.handlers = undefined;\n        this.setStyle(null);\n\n        // $FlowFixMe[method-unbinding]\n        window.removeEventListener('resize', this._onWindowResize, false);\n        // $FlowFixMe[method-unbinding]\n        window.removeEventListener('orientationchange', this._onWindowResize, false);\n        // $FlowFixMe[method-unbinding]\n        window.removeEventListener(this._fullscreenchangeEvent, this._onWindowResize, false);\n        // $FlowFixMe[method-unbinding]\n        window.removeEventListener('online', this._onWindowOnline, false);\n        // $FlowFixMe[method-unbinding]\n        window.removeEventListener('visibilitychange', this._onVisibilityChange, false);\n\n        const extension = this.painter.context.gl.getExtension('WEBGL_lose_context');\n        if (extension) extension.loseContext();\n\n        // $FlowFixMe[method-unbinding]\n        this._canvas.removeEventListener('webglcontextlost', this._contextLost, false);\n        // $FlowFixMe[method-unbinding]\n        this._canvas.removeEventListener('webglcontextrestored', this._contextRestored, false);\n\n        this._canvasContainer.remove();\n        this._controlContainer.remove();\n        this._missingCSSCanary.remove();\n\n        this._canvas = (undefined: any);\n        this._canvasContainer = (undefined: any);\n        this._controlContainer = (undefined: any);\n        this._missingCSSCanary = (undefined: any);\n\n        this._container.classList.remove('mapboxgl-map');\n        // $FlowFixMe[method-unbinding]\n        this._container.removeEventListener('scroll', this._onMapScroll, false);\n\n        PerformanceUtils.clearMetrics();\n        removeAuthState(this.painter.context.gl);\n\n        mapSessionAPI.remove();\n        mapLoadEvent.remove();\n\n        this._removed = true;\n        this.fire(new Event('remove'));\n    }\n\n    /**\n     * Trigger the rendering of a single frame. Use this method with custom layers to\n     * repaint the map when the layer's properties or properties associated with the\n     * layer's source change. Calling this multiple times before the\n     * next frame is rendered will still result in only a single frame being rendered.\n     *\n     * @example\n     * map.triggerRepaint();\n     * @see [Example: Add a 3D model](https://docs.mapbox.com/mapbox-gl-js/example/add-3d-model/)\n     * @see [Example: Add an animated icon to the map](https://docs.mapbox.com/mapbox-gl-js/example/add-image-animated/)\n     */\n    triggerRepaint() {\n        this._triggerFrame(true);\n    }\n\n    _triggerFrame(render: boolean) {\n        this._renderNextFrame = this._renderNextFrame || render;\n        if (this.style && !this._frame) {\n            this._frame = browser.frame((paintStartTimeStamp: number) => {\n                const isRenderFrame = !!this._renderNextFrame;\n                PerformanceUtils.frame(paintStartTimeStamp, isRenderFrame);\n                this._frame = null;\n                this._renderNextFrame = null;\n                if (isRenderFrame) {\n                    this._render(paintStartTimeStamp);\n                }\n            });\n        }\n    }\n\n    /**\n     * Preloads all tiles that will be requested for one or a series of transformations\n     *\n     * @private\n     * @returns {Object} Returns `this` | Promise.\n     */\n    // $FlowFixMe[method-unbinding]\n    _preloadTiles(transform: Transform | Array<Transform>): this {\n        const sourceCaches: Array<SourceCache> = this.style ? this.style.getSourceCaches() : [];\n        asyncAll(sourceCaches, (sourceCache, done) => sourceCache._preloadTiles(transform, done), () => {\n            this.triggerRepaint();\n        });\n\n        return this;\n    }\n\n    _onWindowOnline() {\n        this._update();\n    }\n\n    _onWindowResize(event: Event) {\n        if (this._trackResize) {\n            this.resize({originalEvent: event})._update();\n        }\n    }\n\n    _onVisibilityChange() {\n        if (document.visibilityState === 'hidden') {\n            this._visibilityHidden++;\n        }\n    }\n\n    /** @section {Debug features} */\n\n    /**\n     * Gets and sets a Boolean indicating whether the map will render an outline\n     * around each tile. These tile boundaries are useful for debugging.\n     *\n     * @name showTileBoundaries\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     * @example\n     * map.showTileBoundaries = true;\n     */\n    get showTileBoundaries(): boolean { return !!this._showTileBoundaries; }\n    set showTileBoundaries(value: boolean) {\n        if (this._showTileBoundaries === value) return;\n        this._showTileBoundaries = value;\n        this._tp.refreshUI();\n        this._update();\n    }\n\n    /**\n     * Gets and sets a Boolean indicating whether the map will render the tile ID\n     * and the status of the tile in their corner when `showTileBoundaries` is on.\n     *\n     * The uncompressed file size of the first vector source is drawn in the top left\n     * corner of each tile, next to the tile ID.\n     *\n     * @name showParseStatus\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     * @example\n     * map.showParseStatus = true;\n     */\n    get showParseStatus(): boolean { return !!this._showParseStatus; }\n    set showParseStatus(value: boolean) {\n        if (this._showParseStatus === value) return;\n        this._showParseStatus = value;\n        this._tp.refreshUI();\n        this._update();\n    }\n\n    /**\n     * Gets and sets a Boolean indicating whether the map will render a wireframe\n     * on top of the displayed terrain. Useful for debugging.\n     *\n     * The wireframe is always red and is drawn only when terrain is active.\n     *\n     * @name showTerrainWireframe\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     * @example\n     * map.showTerrainWireframe = true;\n     */\n    get showTerrainWireframe(): boolean { return !!this._showTerrainWireframe; }\n    set showTerrainWireframe(value: boolean) {\n        if (this._showTerrainWireframe === value) return;\n        this._showTerrainWireframe = value;\n        this._tp.refreshUI();\n        this._update();\n    }\n\n    /**\n     * Gets and sets a Boolean indicating whether the map will render a wireframe\n     * on top of 2D layers. Useful for debugging.\n     *\n     * The wireframe is always red and is drawn only for 2D layers.\n     *\n     * @name showLayers2DWireframe\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     * @example\n     * map.showLayers2DWireframe = true;\n     */\n    get showLayers2DWireframe(): boolean { return !!this._showLayers2DWireframe; }\n    set showLayers2DWireframe(value: boolean) {\n        if (this._showLayers2DWireframe === value) return;\n        this._showLayers2DWireframe = value;\n        this._tp.refreshUI();\n        this._update();\n    }\n\n    /**\n     * Gets and sets a Boolean indicating whether the map will render a wireframe\n     * on top of 3D layers. Useful for debugging.\n     *\n     * The wireframe is always red and is drawn only for 3D layers.\n     *\n     * @name showLayers3DWireframe\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     * @example\n     * map.showLayers3DWireframe = true;\n     */\n    get showLayers3DWireframe(): boolean { return !!this._showLayers3DWireframe; }\n    set showLayers3DWireframe(value: boolean) {\n        if (this._showLayers3DWireframe === value) return;\n        this._showLayers3DWireframe = value;\n        this._tp.refreshUI();\n        this._update();\n    }\n\n    /**\n     * Gets and sets a Boolean indicating whether the speedindex metric calculation is on or off\n     *\n     * @private\n     * @name speedIndexTiming\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     * @example\n     * map.speedIndexTiming = true;\n     */\n    get speedIndexTiming(): boolean { return !!this._speedIndexTiming; }\n    set speedIndexTiming(value: boolean) {\n        if (this._speedIndexTiming === value) return;\n        this._speedIndexTiming = value;\n        this._update();\n    }\n\n    /**\n     * Gets and sets a Boolean indicating whether the map will visualize\n     * the padding offsets.\n     *\n     * @name showPadding\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     */\n    get showPadding(): boolean { return !!this._showPadding; }\n    set showPadding(value: boolean) {\n        if (this._showPadding === value) return;\n        this._showPadding = value;\n        this._tp.refreshUI();\n        this._update();\n    }\n\n    /**\n     * Gets and sets a Boolean indicating whether the map will render boxes\n     * around all symbols in the data source, revealing which symbols\n     * were rendered or which were hidden due to collisions.\n     * This information is useful for debugging.\n     *\n     * @name showCollisionBoxes\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     */\n    get showCollisionBoxes(): boolean { return !!this._showCollisionBoxes; }\n    set showCollisionBoxes(value: boolean) {\n        if (this._showCollisionBoxes === value) return;\n        this._showCollisionBoxes = value;\n        this._tp.refreshUI();\n        if (value) {\n            // When we turn collision boxes on we have to generate them for existing tiles\n            // When we turn them off, there's no cost to leaving existing boxes in place\n            this.style._generateCollisionBoxes();\n        } else {\n            // Otherwise, call an update to remove collision boxes\n            this._update();\n        }\n    }\n\n    /**\n     * Gets and sets a Boolean indicating whether the map should color-code\n     * each fragment to show how many times it has been shaded.\n     * White fragments have been shaded 8 or more times.\n     * Black fragments have been shaded 0 times.\n     * This information is useful for debugging.\n     *\n     * @name showOverdraw\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     */\n    get showOverdrawInspector(): boolean { return !!this._showOverdrawInspector; }\n    set showOverdrawInspector(value: boolean) {\n        if (this._showOverdrawInspector === value) return;\n        this._showOverdrawInspector = value;\n        this._tp.refreshUI();\n        this._update();\n    }\n\n    /**\n     * Gets and sets a Boolean indicating whether the map will\n     * continuously repaint. This information is useful for analyzing performance.\n     *\n     * @name repaint\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     */\n    get repaint(): boolean { return !!this._repaint; }\n    set repaint(value: boolean) {\n        if (this._repaint !== value) {\n            this._repaint = value;\n            this._tp.refreshUI();\n            this.triggerRepaint();\n        }\n    }\n    // show vertices\n    get vertices(): boolean { return !!this._vertices; }\n    set vertices(value: boolean) { this._vertices = value; this._update(); }\n\n    /**\n    * Display tile AABBs for debugging\n    *\n    * @private\n    * @type {boolean}\n    */\n    get showTileAABBs(): boolean { return !!this._showTileAABBs; }\n    set showTileAABBs(value: boolean) {\n        if (this._showTileAABBs === value) return;\n        this._showTileAABBs = value;\n        this._tp.refreshUI();\n        if (!value) { Debug.clearAabbs(); return; }\n        this._update();\n    }\n\n    // for cache browser tests\n    _setCacheLimits(limit: number, checkThreshold: number) {\n        setCacheLimits(limit, checkThreshold);\n    }\n\n    /**\n     * The version of Mapbox GL JS in use as specified in package.json, CHANGELOG.md, and the GitHub release.\n     *\n     * @name version\n     * @instance\n     * @memberof Map\n     * @var {string} version\n     */\n\n    get version(): string { return version; }\n}\n\n/**\n * Interface for interactive controls added to the map. This is a\n * specification for implementers to model: it is not\n * an exported method or class.\n *\n * Controls must implement `onAdd` and `onRemove`, and must own an\n * element, which is often a `div` element. To use Mapbox GL JS's\n * default control styling, add the `mapboxgl-ctrl` class to your control's\n * node.\n *\n * @interface IControl\n * @example\n * // Control implemented as ES6 class\n * class HelloWorldControl {\n *     onAdd(map) {\n *         this._map = map;\n *         this._container = document.createElement('div');\n *         this._container.className = 'mapboxgl-ctrl';\n *         this._container.textContent = 'Hello, world';\n *         return this._container;\n *     }\n *\n *     onRemove() {\n *         this._container.parentNode.removeChild(this._container);\n *         this._map = undefined;\n *     }\n * }\n *\n * @example\n * // Control implemented as ES5 prototypical class\n * function HelloWorldControl() { }\n *\n * HelloWorldControl.prototype.onAdd = function(map) {\n *     this._map = map;\n *     this._container = document.createElement('div');\n *     this._container.className = 'mapboxgl-ctrl';\n *     this._container.textContent = 'Hello, world';\n *     return this._container;\n * };\n *\n * HelloWorldControl.prototype.onRemove = function () {\n *     this._container.parentNode.removeChild(this._container);\n *     this._map = undefined;\n * };\n */\n\n/**\n * Register a control on the map and give it a chance to register event listeners\n * and resources. This method is called by {@link Map#addControl}\n * internally.\n *\n * @function\n * @memberof IControl\n * @instance\n * @name onAdd\n * @param {Map} map The Map this control will be added to.\n * @returns {HTMLElement} The control's container element. This should\n * be created by the control and returned by onAdd without being attached\n * to the DOM: the map will insert the control's element into the DOM\n * as necessary.\n */\n\n/**\n * Unregister a control on the map and give it a chance to detach event listeners\n * and resources. This method is called by {@link Map#removeControl}\n * internally.\n *\n * @function\n * @memberof IControl\n * @instance\n * @name onRemove\n * @param {Map} map The Map this control will be removed from.\n * @returns {undefined} There is no required return value for this method.\n */\n\n/**\n * Optionally provide a default position for this control. If this method\n * is implemented and {@link Map#addControl} is called without the `position`\n * parameter, the value returned by getDefaultPosition will be used as the\n * control's position.\n *\n * @function\n * @memberof IControl\n * @instance\n * @name getDefaultPosition\n * @returns {string} A control position, one of the values valid in addControl.\n */\n\n/**\n * A [`Point` geometry](https://github.com/mapbox/point-geometry) object, which has\n * `x` and `y` properties representing screen coordinates in pixels.\n *\n * @typedef {Point} Point\n * @example\n * const point = new mapboxgl.Point(-77, 38);\n */\n\n/**\n * A {@link Point} or an array of two numbers representing `x` and `y` screen coordinates in pixels.\n *\n * @typedef {(Point | Array<number>)} PointLike\n * @example\n * const p1 = new mapboxgl.Point(-77, 38); // a PointLike which is a Point\n * const p2 = [-77, 38]; // a PointLike which is an array of two numbers\n */\n","// @flow\n\nimport * as DOM from '../../util/dom.js';\nimport {extend, bindAll} from '../../util/util.js';\nimport {MouseRotateHandler, MousePitchHandler} from '../handler/mouse.js';\n\nimport type {Map} from '../map.js';\nimport type Point from '@mapbox/point-geometry';\n\ntype Options = {\n    showCompass?: boolean,\n    showZoom?: boolean,\n    visualizePitch?: boolean\n};\n\nconst defaultOptions: Options = {\n    showCompass: true,\n    showZoom: true,\n    visualizePitch: false\n};\n\n/**\n * A `NavigationControl` control contains zoom buttons and a compass.\n * Add this control to a map using {@link Map#addControl}.\n *\n * @implements {IControl}\n * @param {Object} [options]\n * @param {boolean} [options.showCompass=true] If `true` the compass button is included.\n * @param {boolean} [options.showZoom=true] If `true` the zoom-in and zoom-out buttons are included.\n * @param {boolean} [options.visualizePitch=false] If `true` the pitch is visualized by rotating X-axis of compass.\n * @example\n * const nav = new mapboxgl.NavigationControl();\n * map.addControl(nav, 'top-left');\n * @example\n * const nav = new mapboxgl.NavigationControl({\n *     visualizePitch: true\n * });\n * map.addControl(nav, 'bottom-right');\n * @see [Example: Display map navigation controls](https://www.mapbox.com/mapbox-gl-js/example/navigation/)\n * @see [Example: Add a third party vector tile source](https://www.mapbox.com/mapbox-gl-js/example/third-party/)\n */\nclass NavigationControl {\n    _map: ?Map;\n    options: Options;\n    _container: HTMLElement;\n    _zoomInButton: HTMLButtonElement;\n    _zoomOutButton: HTMLButtonElement;\n    _compass: HTMLButtonElement;\n    _compassIcon: HTMLElement;\n    _handler: ?MouseRotateWrapper;\n\n    constructor(options?: Options) {\n        this.options = extend({}, defaultOptions, options);\n\n        this._container = DOM.create('div', 'mapboxgl-ctrl mapboxgl-ctrl-group');\n        this._container.addEventListener('contextmenu', (e: MouseEvent) => e.preventDefault());\n\n        if (this.options.showZoom) {\n            bindAll([\n                '_setButtonTitle',\n                '_updateZoomButtons'\n            ], this);\n            this._zoomInButton = this._createButton('mapboxgl-ctrl-zoom-in', (e) => { if (this._map) this._map.zoomIn({}, {originalEvent: e}); });\n            DOM.create('span', `mapboxgl-ctrl-icon`, this._zoomInButton).setAttribute('aria-hidden', 'true');\n            this._zoomOutButton = this._createButton('mapboxgl-ctrl-zoom-out', (e) => { if (this._map) this._map.zoomOut({}, {originalEvent: e}); });\n            DOM.create('span', `mapboxgl-ctrl-icon`, this._zoomOutButton).setAttribute('aria-hidden', 'true');\n        }\n        if (this.options.showCompass) {\n            bindAll([\n                '_rotateCompassArrow'\n            ], this);\n            this._compass = this._createButton('mapboxgl-ctrl-compass', (e) => {\n                const map = this._map;\n                if (!map) return;\n                if (this.options.visualizePitch) {\n                    map.resetNorthPitch({}, {originalEvent: e});\n                } else {\n                    map.resetNorth({}, {originalEvent: e});\n                }\n            });\n            this._compassIcon = DOM.create('span', 'mapboxgl-ctrl-icon', this._compass);\n            this._compassIcon.setAttribute('aria-hidden', 'true');\n        }\n    }\n\n    _updateZoomButtons() {\n        const map = this._map;\n        if (!map) return;\n\n        const zoom = map.getZoom();\n        const isMax = zoom === map.getMaxZoom();\n        const isMin = zoom === map.getMinZoom();\n        this._zoomInButton.disabled = isMax;\n        this._zoomOutButton.disabled = isMin;\n        this._zoomInButton.setAttribute('aria-disabled', isMax.toString());\n        this._zoomOutButton.setAttribute('aria-disabled', isMin.toString());\n    }\n\n    _rotateCompassArrow() {\n        const map = this._map;\n        if (!map) return;\n\n        const rotate = this.options.visualizePitch ?\n            `scale(${1 / Math.pow(Math.cos(map.transform.pitch * (Math.PI / 180)), 0.5)}) rotateX(${map.transform.pitch}deg) rotateZ(${map.transform.angle * (180 / Math.PI)}deg)` :\n            `rotate(${map.transform.angle * (180 / Math.PI)}deg)`;\n\n        map._requestDomTask(() => {\n            if (this._compassIcon) {\n                this._compassIcon.style.transform = rotate;\n            }\n        });\n    }\n\n    onAdd(map: Map): HTMLElement {\n        this._map = map;\n        if (this.options.showZoom) {\n            this._setButtonTitle(this._zoomInButton, 'ZoomIn');\n            this._setButtonTitle(this._zoomOutButton, 'ZoomOut');\n            // $FlowFixMe[method-unbinding]\n            map.on('zoom', this._updateZoomButtons);\n            this._updateZoomButtons();\n        }\n        if (this.options.showCompass) {\n            this._setButtonTitle(this._compass, 'ResetBearing');\n            if (this.options.visualizePitch) {\n                // $FlowFixMe[method-unbinding]\n                map.on('pitch', this._rotateCompassArrow);\n            }\n            // $FlowFixMe[method-unbinding]\n            map.on('rotate', this._rotateCompassArrow);\n            this._rotateCompassArrow();\n            this._handler = new MouseRotateWrapper(map, this._compass, this.options.visualizePitch);\n        }\n        return this._container;\n    }\n\n    onRemove() {\n        const map = this._map;\n        if (!map) return;\n        this._container.remove();\n        if (this.options.showZoom) {\n            // $FlowFixMe[method-unbinding]\n            map.off('zoom', this._updateZoomButtons);\n        }\n        if (this.options.showCompass) {\n            if (this.options.visualizePitch) {\n                // $FlowFixMe[method-unbinding]\n                map.off('pitch', this._rotateCompassArrow);\n            }\n            // $FlowFixMe[method-unbinding]\n            map.off('rotate', this._rotateCompassArrow);\n            if (this._handler) this._handler.off();\n            this._handler = undefined;\n        }\n        this._map = undefined;\n    }\n\n    _createButton(className: string, fn: () => mixed): HTMLButtonElement {\n        const a = DOM.create('button', className, this._container);\n        a.type = 'button';\n        a.addEventListener('click', fn);\n        return a;\n    }\n\n    _setButtonTitle(button: HTMLButtonElement, title: string) {\n        if (!this._map) return;\n        const str = this._map._getUIString(`NavigationControl.${title}`);\n        button.setAttribute('aria-label', str);\n        if (button.firstElementChild) button.firstElementChild.setAttribute('title', str);\n    }\n}\n\nclass MouseRotateWrapper {\n\n    map: Map;\n    _clickTolerance: number;\n    element: HTMLElement;\n    mouseRotate: MouseRotateHandler;\n    mousePitch: MousePitchHandler;\n    _startPos: ?Point;\n    _lastPos: ?Point;\n\n    constructor(map: Map, element: HTMLElement, pitch?: boolean = false) {\n        this._clickTolerance = 10;\n        this.element = element;\n        this.mouseRotate = new MouseRotateHandler({clickTolerance: map.dragRotate._mouseRotate._clickTolerance});\n        this.map = map;\n        if (pitch) this.mousePitch = new MousePitchHandler({clickTolerance: map.dragRotate._mousePitch._clickTolerance});\n\n        bindAll(['mousedown', 'mousemove', 'mouseup', 'touchstart', 'touchmove', 'touchend', 'reset'], this);\n        // $FlowFixMe[method-unbinding]\n        element.addEventListener('mousedown', this.mousedown);\n        // $FlowFixMe[method-unbinding]\n        element.addEventListener('touchstart', this.touchstart, {passive: false});\n        // $FlowFixMe[method-unbinding]\n        element.addEventListener('touchmove', this.touchmove);\n        // $FlowFixMe[method-unbinding]\n        element.addEventListener('touchend', this.touchend);\n        // $FlowFixMe[method-unbinding]\n        element.addEventListener('touchcancel', this.reset);\n    }\n\n    down(e: MouseEvent, point: Point) {\n        this.mouseRotate.mousedown(e, point);\n        if (this.mousePitch) this.mousePitch.mousedown(e, point);\n        DOM.disableDrag();\n    }\n\n    move(e: MouseEvent, point: Point) {\n        const map = this.map;\n        const r = this.mouseRotate.mousemoveWindow(e, point);\n        const delta = r && r.bearingDelta;\n        if (delta) map.setBearing(map.getBearing() + delta);\n        if (this.mousePitch) {\n            const p = this.mousePitch.mousemoveWindow(e, point);\n            const delta = p && p.pitchDelta;\n            if (delta) map.setPitch(map.getPitch() + delta);\n        }\n    }\n\n    off() {\n        const element = this.element;\n        // $FlowFixMe[method-unbinding]\n        element.removeEventListener('mousedown', this.mousedown);\n        // $FlowFixMe[method-unbinding]\n        element.removeEventListener('touchstart', this.touchstart, {passive: false});\n        // $FlowFixMe[method-unbinding]\n        element.removeEventListener('touchmove', this.touchmove);\n        // $FlowFixMe[method-unbinding]\n        element.removeEventListener('touchend', this.touchend);\n        // $FlowFixMe[method-unbinding]\n        element.removeEventListener('touchcancel', this.reset);\n        this.offTemp();\n    }\n\n    offTemp() {\n        DOM.enableDrag();\n        // $FlowFixMe[method-unbinding]\n        window.removeEventListener('mousemove', this.mousemove);\n        // $FlowFixMe[method-unbinding]\n        window.removeEventListener('mouseup', this.mouseup);\n    }\n\n    mousedown(e: MouseEvent) {\n        this.down(extend({}, e, {ctrlKey: true, preventDefault: () => e.preventDefault()}), DOM.mousePos(this.element, e));\n        // $FlowFixMe[method-unbinding]\n        window.addEventListener('mousemove', this.mousemove);\n        // $FlowFixMe[method-unbinding]\n        window.addEventListener('mouseup', this.mouseup);\n    }\n\n    mousemove(e: MouseEvent) {\n        this.move(e, DOM.mousePos(this.element, e));\n    }\n\n    mouseup(e: MouseEvent) {\n        this.mouseRotate.mouseupWindow(e);\n        if (this.mousePitch) this.mousePitch.mouseupWindow(e);\n        this.offTemp();\n    }\n\n    touchstart(e: TouchEvent) {\n        if (e.targetTouches.length !== 1) {\n            this.reset();\n        } else {\n            this._startPos = this._lastPos = DOM.touchPos(this.element, e.targetTouches)[0];\n            this.down((({type: 'mousedown', button: 0, ctrlKey: true, preventDefault: () => e.preventDefault()}: any): MouseEvent), this._startPos);\n        }\n    }\n\n    touchmove(e: TouchEvent) {\n        if (e.targetTouches.length !== 1) {\n            this.reset();\n        } else {\n            this._lastPos = DOM.touchPos(this.element, e.targetTouches)[0];\n            this.move((({preventDefault: () => e.preventDefault()}: any): MouseEvent), this._lastPos);\n        }\n    }\n\n    touchend(e: TouchEvent) {\n        if (e.targetTouches.length === 0 &&\n            this._startPos &&\n            this._lastPos &&\n            this._startPos.dist(this._lastPos) < this._clickTolerance) {\n            this.element.click();\n        }\n        this.reset();\n    }\n\n    reset() {\n        this.mouseRotate.reset();\n        if (this.mousePitch) this.mousePitch.reset();\n        delete this._startPos;\n        delete this._lastPos;\n        this.offTemp();\n    }\n}\n\nexport default NavigationControl;\n","// @flow\n\nimport {Event, Evented} from '../../util/evented.js';\nimport * as DOM from '../../util/dom.js';\nimport {extend, bindAll, warnOnce} from '../../util/util.js';\nimport assert from 'assert';\nimport Marker from '../marker.js';\nimport LngLat from '../../geo/lng_lat.js';\nimport throttle from '../../util/throttle.js';\nimport {mercatorZfromAltitude} from '../../geo/mercator_coordinate.js';\n\nimport type {Map} from '../map.js';\nimport type {AnimationOptions, CameraOptions} from '../camera.js';\n\ntype Options = {\n    positionOptions: PositionOptions,\n    fitBoundsOptions: AnimationOptions & CameraOptions,\n    trackUserLocation: boolean,\n    showAccuracyCircle: boolean,\n    showUserLocation: boolean,\n    showUserHeading: boolean,\n    geolocation: Geolocation,\n};\n\ntype DeviceOrientationEvent = {\n    absolute: boolean,\n    alpha: number,\n    beta: number,\n    gamma: number,\n    requestPermission: Promise<String>,\n    webkitCompassHeading?: number,\n}\n\nconst defaultOptions = {\n    positionOptions: {\n        enableHighAccuracy: false,\n        maximumAge: 0,\n        timeout: 6000 /* 6 sec */\n    },\n    fitBoundsOptions: {\n        maxZoom: 15\n    },\n    trackUserLocation: false,\n    showAccuracyCircle: true,\n    showUserLocation: true,\n    showUserHeading: false\n};\n\n/**\n * A `GeolocateControl` control provides a button that uses the browser's geolocation\n * API to locate the user on the map.\n * Add this control to a map using {@link Map#addControl}.\n *\n * Not all browsers support geolocation,\n * and some users may disable the feature. Geolocation support for modern\n * browsers including Chrome requires sites to be served over HTTPS. If\n * geolocation support is not available, the `GeolocateControl` will show\n * as disabled.\n *\n * The [zoom level](https://docs.mapbox.com/help/glossary/zoom-level/) applied depends on the accuracy of the geolocation provided by the device.\n *\n * The GeolocateControl has two modes. If `trackUserLocation` is `false` (default) the control acts as a button, which when pressed will set the map's camera to target the user location. If the user moves, the map won't update. This is most suited for the desktop. If `trackUserLocation` is `true` the control acts as a toggle button that when active the user's location is actively monitored for changes. In this mode the `GeolocateControl` has three interaction states:\n * * active - The map's camera automatically updates as the user's location changes, keeping the location dot in the center. This is the initial state, and the state upon clicking the `GeolocateControl` button.\n * * passive - The user's location dot automatically updates, but the map's camera does not. Occurs upon the user initiating a map movement.\n * * disabled - Occurs if geolocation is not available, disabled, or denied.\n *\n * These interaction states can't be controlled programmatically. Instead, they are set based on user interactions.\n *\n * @implements {IControl}\n * @param {Object} [options]\n * @param {Object} [options.positionOptions={enableHighAccuracy: false, timeout: 6000}] A Geolocation API [PositionOptions](https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions) object.\n * @param {Object} [options.fitBoundsOptions={maxZoom: 15}] A {@link Map#fitBounds} options object to use when the map is panned and zoomed to the user's location. The default is to use a `maxZoom` of 15 to limit how far the map will zoom in for very accurate locations.\n * @param {Object} [options.trackUserLocation=false] If `true` the `GeolocateControl` becomes a toggle button and when active the map will receive updates to the user's location as it changes.\n * @param {Object} [options.showAccuracyCircle=true] By default, if `showUserLocation` is `true`, a transparent circle will be drawn around the user location indicating the accuracy (95% confidence level) of the user's location. Set to `false` to disable. Always disabled when `showUserLocation` is `false`.\n * @param {Object} [options.showUserLocation=true] By default a dot will be shown on the map at the user's location. Set to `false` to disable.\n * @param {Object} [options.showUserHeading=false] If `true` an arrow will be drawn next to the user location dot indicating the device's heading. This only has affect when `trackUserLocation` is `true`.\n * @param {Object} [options.geolocation=window.navigator.geolocation] `window.navigator.geolocation` by default; you can provide an object with the same shape to customize geolocation handling.\n *\n * @example\n * map.addControl(new mapboxgl.GeolocateControl({\n *     positionOptions: {\n *         enableHighAccuracy: true\n *     },\n *     trackUserLocation: true,\n *     showUserHeading: true\n * }));\n * @see [Example: Locate the user](https://www.mapbox.com/mapbox-gl-js/example/locate-user/)\n */\nclass GeolocateControl extends Evented {\n    _map: Map;\n    options: Options;\n    _container: HTMLElement;\n    _dotElement: HTMLElement;\n    _circleElement: HTMLElement;\n    _geolocateButton: HTMLButtonElement;\n    _geolocationWatchID: number;\n    _timeoutId: ?TimeoutID;\n    _watchState: 'OFF' | 'ACTIVE_LOCK' | 'WAITING_ACTIVE' | 'ACTIVE_ERROR' | 'BACKGROUND' | 'BACKGROUND_ERROR';\n    _lastKnownPosition: any;\n    _userLocationDotMarker: Marker;\n    _accuracyCircleMarker: Marker;\n    _accuracy: number;\n    _setup: boolean; // set to true once the control has been setup\n    _heading: ?number;\n    _updateMarkerRotationThrottled: Function;\n\n    _numberOfWatches: number;\n    _noTimeout: boolean;\n    _supportsGeolocation: boolean;\n\n    constructor(options?: $Shape<Options>) {\n        super();\n        const geolocation = navigator.geolocation;\n        this.options = extend({geolocation}, defaultOptions, options);\n\n        bindAll([\n            '_onSuccess',\n            '_onError',\n            '_onZoom',\n            '_finish',\n            '_setupUI',\n            '_updateCamera',\n            '_updateMarker',\n            '_updateMarkerRotation',\n            '_onDeviceOrientation'\n        ], this);\n\n        // $FlowFixMe[method-unbinding]\n        this._updateMarkerRotationThrottled = throttle(this._updateMarkerRotation, 20);\n        this._numberOfWatches = 0;\n    }\n\n    onAdd(map: Map): HTMLElement {\n        this._map = map;\n        this._container = DOM.create('div', `mapboxgl-ctrl mapboxgl-ctrl-group`);\n        // $FlowFixMe[method-unbinding]\n        this._checkGeolocationSupport(this._setupUI);\n        return this._container;\n    }\n\n    onRemove() {\n        // clear the geolocation watch if exists\n        if (this._geolocationWatchID !== undefined) {\n            this.options.geolocation.clearWatch(this._geolocationWatchID);\n            this._geolocationWatchID = (undefined: any);\n        }\n\n        // clear the markers from the map\n        if (this.options.showUserLocation && this._userLocationDotMarker) {\n            this._userLocationDotMarker.remove();\n        }\n        if (this.options.showAccuracyCircle && this._accuracyCircleMarker) {\n            this._accuracyCircleMarker.remove();\n        }\n\n        this._container.remove();\n        // $FlowFixMe[method-unbinding]\n        this._map.off('zoom', this._onZoom);\n        this._map = (undefined: any);\n        this._numberOfWatches = 0;\n        this._noTimeout = false;\n    }\n\n    _checkGeolocationSupport(callback: boolean => void) {\n        const updateSupport = (supported: boolean = !!this.options.geolocation) => {\n            this._supportsGeolocation = supported;\n            callback(supported);\n        };\n\n        if (this._supportsGeolocation !== undefined) {\n            callback(this._supportsGeolocation);\n\n        } else if (navigator.permissions !== undefined) {\n            // navigator.permissions has incomplete browser support http://caniuse.com/#feat=permissions-api\n            // Test for the case where a browser disables Geolocation because of an insecure origin;\n            // in some environments like iOS16 WebView, permissions reject queries but still support geolocation\n            navigator.permissions.query({name: 'geolocation'})\n                .then(p => updateSupport(p.state !== 'denied'))\n                .catch(() => updateSupport());\n\n        } else {\n            updateSupport();\n        }\n    }\n\n    /**\n     * Check if the Geolocation API Position is outside the map's `maxBounds`.\n     *\n     * @param {Position} position the Geolocation API Position\n     * @returns {boolean} Returns `true` if position is outside the map's `maxBounds`, otherwise returns `false`.\n     * @private\n     */\n    _isOutOfMapMaxBounds(position: Position): boolean {\n        const bounds = this._map.getMaxBounds();\n        const coordinates = position.coords;\n\n        return !!bounds && (\n            coordinates.longitude < bounds.getWest() ||\n            coordinates.longitude > bounds.getEast() ||\n            coordinates.latitude < bounds.getSouth() ||\n            coordinates.latitude > bounds.getNorth()\n        );\n    }\n\n    _setErrorState() {\n        switch (this._watchState) {\n        case 'WAITING_ACTIVE':\n            this._watchState = 'ACTIVE_ERROR';\n            this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active');\n            this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active-error');\n            break;\n        case 'ACTIVE_LOCK':\n            this._watchState = 'ACTIVE_ERROR';\n            this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active');\n            this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active-error');\n            this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting');\n            // turn marker grey\n            break;\n        case 'BACKGROUND':\n            this._watchState = 'BACKGROUND_ERROR';\n            this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background');\n            this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background-error');\n            this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting');\n            // turn marker grey\n            break;\n        case 'ACTIVE_ERROR':\n            break;\n        default:\n            assert(false, `Unexpected watchState ${this._watchState}`);\n        }\n    }\n\n    /**\n     * When the Geolocation API returns a new location, update the `GeolocateControl`.\n     *\n     * @param {Position} position the Geolocation API Position\n     * @private\n     */\n    _onSuccess(position: Position) {\n        if (!this._map) {\n            // control has since been removed\n            return;\n        }\n\n        if (this._isOutOfMapMaxBounds(position)) {\n            this._setErrorState();\n\n            this.fire(new Event('outofmaxbounds', position));\n            this._updateMarker();\n            this._finish();\n\n            return;\n        }\n\n        if (this.options.trackUserLocation) {\n            // keep a record of the position so that if the state is BACKGROUND and the user\n            // clicks the button, we can move to ACTIVE_LOCK immediately without waiting for\n            // watchPosition to trigger _onSuccess\n            this._lastKnownPosition = position;\n\n            switch (this._watchState) {\n            case 'WAITING_ACTIVE':\n            case 'ACTIVE_LOCK':\n            case 'ACTIVE_ERROR':\n                this._watchState = 'ACTIVE_LOCK';\n                this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting');\n                this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active-error');\n                this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active');\n                break;\n            case 'BACKGROUND':\n            case 'BACKGROUND_ERROR':\n                this._watchState = 'BACKGROUND';\n                this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting');\n                this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background-error');\n                this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background');\n                break;\n            default:\n                assert(false, `Unexpected watchState ${this._watchState}`);\n            }\n        }\n\n        // if showUserLocation and the watch state isn't off then update the marker location\n        if (this.options.showUserLocation && this._watchState !== 'OFF') {\n            this._updateMarker(position);\n        }\n\n        // if in normal mode (not watch mode), or if in watch mode and the state is active watch\n        // then update the camera\n        if (!this.options.trackUserLocation || this._watchState === 'ACTIVE_LOCK') {\n            this._updateCamera(position);\n        }\n\n        if (this.options.showUserLocation) {\n            this._userLocationDotMarker.removeClassName('mapboxgl-user-location-dot-stale');\n        }\n\n        this.fire(new Event('geolocate', position));\n        this._finish();\n    }\n\n    /**\n     * Update the camera location to center on the current position\n     *\n     * @param {Position} position the Geolocation API Position\n     * @private\n     */\n    _updateCamera(position: Position) {\n        const center = new LngLat(position.coords.longitude, position.coords.latitude);\n        const radius = position.coords.accuracy;\n        const bearing = this._map.getBearing();\n        const options = extend({bearing}, this.options.fitBoundsOptions);\n\n        this._map.fitBounds(center.toBounds(radius), options, {\n            geolocateSource: true // tag this camera change so it won't cause the control to change to background state\n        });\n    }\n\n    /**\n     * Update the user location dot Marker to the current position\n     *\n     * @param {Position} [position] the Geolocation API Position\n     * @private\n     */\n    _updateMarker(position: ?Position) {\n        if (position) {\n            const center = new LngLat(position.coords.longitude, position.coords.latitude);\n            this._accuracyCircleMarker.setLngLat(center).addTo(this._map);\n            this._userLocationDotMarker.setLngLat(center).addTo(this._map);\n            this._accuracy = position.coords.accuracy;\n            if (this.options.showUserLocation && this.options.showAccuracyCircle) {\n                this._updateCircleRadius();\n            }\n        } else {\n            this._userLocationDotMarker.remove();\n            this._accuracyCircleMarker.remove();\n        }\n    }\n\n    _updateCircleRadius() {\n        assert(this._circleElement);\n        const map = this._map;\n        const tr = map.transform;\n\n        const pixelsPerMeter = mercatorZfromAltitude(1.0, tr._center.lat) * tr.worldSize;\n        assert(pixelsPerMeter !== 0.0);\n        const circleDiameter = Math.ceil(2.0 * this._accuracy * pixelsPerMeter);\n\n        this._circleElement.style.width = `${circleDiameter}px`;\n        this._circleElement.style.height = `${circleDiameter}px`;\n    }\n\n    _onZoom() {\n        if (this.options.showUserLocation && this.options.showAccuracyCircle) {\n            this._updateCircleRadius();\n        }\n    }\n\n    /**\n     * Update the user location dot Marker rotation to the current heading\n     *\n     * @private\n     */\n    _updateMarkerRotation() {\n        if (this._userLocationDotMarker && typeof this._heading === 'number') {\n            this._userLocationDotMarker.setRotation(this._heading);\n            this._userLocationDotMarker.addClassName('mapboxgl-user-location-show-heading');\n        } else {\n            this._userLocationDotMarker.removeClassName('mapboxgl-user-location-show-heading');\n            this._userLocationDotMarker.setRotation(0);\n        }\n    }\n\n    _onError(error: PositionError) {\n        if (!this._map) {\n            // control has since been removed\n            return;\n        }\n\n        if (this.options.trackUserLocation) {\n            if (error.code === 1) {\n                // PERMISSION_DENIED\n                this._watchState = 'OFF';\n                this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting');\n                this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active');\n                this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active-error');\n                this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background');\n                this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background-error');\n                this._geolocateButton.disabled = true;\n                const title = this._map._getUIString('GeolocateControl.LocationNotAvailable');\n                this._geolocateButton.setAttribute('aria-label', title);\n                if (this._geolocateButton.firstElementChild) this._geolocateButton.firstElementChild.setAttribute('title', title);\n\n                if (this._geolocationWatchID !== undefined) {\n                    this._clearWatch();\n                }\n            } else if (error.code === 3 && this._noTimeout) {\n                // this represents a forced error state\n                // this was triggered to force immediate geolocation when a watch is already present\n                // see https://github.com/mapbox/mapbox-gl-js/issues/8214\n                // and https://w3c.github.io/geolocation-api/#example-5-forcing-the-user-agent-to-return-a-fresh-cached-position\n                return;\n            } else {\n                this._setErrorState();\n            }\n        }\n\n        if (this._watchState !== 'OFF' && this.options.showUserLocation) {\n            this._userLocationDotMarker.addClassName('mapboxgl-user-location-dot-stale');\n        }\n\n        this.fire(new Event('error', error));\n\n        this._finish();\n    }\n\n    _finish() {\n        if (this._timeoutId) { clearTimeout(this._timeoutId); }\n        this._timeoutId = undefined;\n    }\n\n    _setupUI(supported: boolean) {\n        if (this._map === undefined) {\n            // This control was removed from the map before geolocation\n            // support was determined.\n            return;\n        }\n        this._container.addEventListener('contextmenu', (e: MouseEvent) => e.preventDefault());\n        this._geolocateButton = DOM.create('button', `mapboxgl-ctrl-geolocate`, this._container);\n        DOM.create('span', `mapboxgl-ctrl-icon`, this._geolocateButton).setAttribute('aria-hidden', 'true');\n\n        this._geolocateButton.type = 'button';\n\n        if (supported === false) {\n            warnOnce('Geolocation support is not available so the GeolocateControl will be disabled.');\n            const title = this._map._getUIString('GeolocateControl.LocationNotAvailable');\n            this._geolocateButton.disabled = true;\n            this._geolocateButton.setAttribute('aria-label', title);\n            if (this._geolocateButton.firstElementChild) this._geolocateButton.firstElementChild.setAttribute('title', title);\n        } else {\n            const title = this._map._getUIString('GeolocateControl.FindMyLocation');\n            this._geolocateButton.setAttribute('aria-label', title);\n            if (this._geolocateButton.firstElementChild) this._geolocateButton.firstElementChild.setAttribute('title', title);\n        }\n\n        if (this.options.trackUserLocation) {\n            this._geolocateButton.setAttribute('aria-pressed', 'false');\n            this._watchState = 'OFF';\n        }\n\n        // when showUserLocation is enabled, keep the Geolocate button disabled until the device location marker is setup on the map\n        if (this.options.showUserLocation) {\n            this._dotElement = DOM.create('div', 'mapboxgl-user-location');\n            this._dotElement.appendChild(DOM.create('div', 'mapboxgl-user-location-dot'));\n            this._dotElement.appendChild(DOM.create('div', 'mapboxgl-user-location-heading'));\n\n            this._userLocationDotMarker = new Marker({\n                element: this._dotElement,\n                rotationAlignment: 'map',\n                pitchAlignment: 'map'\n            });\n\n            this._circleElement = DOM.create('div', 'mapboxgl-user-location-accuracy-circle');\n            this._accuracyCircleMarker = new Marker({element: this._circleElement, pitchAlignment: 'map'});\n\n            if (this.options.trackUserLocation) this._watchState = 'OFF';\n\n            // $FlowFixMe[method-unbinding]\n            this._map.on('zoom', this._onZoom);\n        }\n\n        // $FlowFixMe[method-unbinding]\n        this._geolocateButton.addEventListener('click', this.trigger.bind(this));\n\n        this._setup = true;\n\n        // when the camera is changed (and it's not as a result of the Geolocation Control) change\n        // the watch mode to background watch, so that the marker is updated but not the camera.\n        if (this.options.trackUserLocation) {\n            this._map.on('movestart', (event) => {\n                const fromResize = event.originalEvent && event.originalEvent.type === 'resize';\n                if (!event.geolocateSource && this._watchState === 'ACTIVE_LOCK' && !fromResize) {\n                    this._watchState = 'BACKGROUND';\n                    this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background');\n                    this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active');\n\n                    this.fire(new Event('trackuserlocationend'));\n                }\n            });\n        }\n    }\n\n    /**\n    * Programmatically request and move the map to the user's location.\n    *\n    * @returns {boolean} Returns `false` if called before control was added to a map, otherwise returns `true`.\n    * Called on a `deviceorientation` event.\n    *\n    * @param deviceOrientationEvent {DeviceOrientationEvent}\n    * @private\n    * @example\n    * // Initialize the GeolocateControl.\n    * var geolocate = new mapboxgl.GeolocateControl({\n    *  positionOptions: {\n    *    enableHighAccuracy: true\n    *  },\n    *  trackUserLocation: true\n    * });\n    * // Add the control to the map.\n    * map.addControl(geolocate);\n    * map.on('load', function() {\n    *   geolocate.trigger();\n    * });\n    */\n    _onDeviceOrientation(deviceOrientationEvent: DeviceOrientationEvent) {\n        // absolute is true if the orientation data is provided as the difference between the Earth's coordinate frame and the device's coordinate frame, or false if the orientation data is being provided in reference to some arbitrary, device-determined coordinate frame.\n        if (this._userLocationDotMarker) {\n            if (deviceOrientationEvent.webkitCompassHeading) {\n                // Safari\n                this._heading = deviceOrientationEvent.webkitCompassHeading;\n            } else if (deviceOrientationEvent.absolute === true) {\n                // non-Safari alpha increases counter clockwise around the z axis\n                this._heading = deviceOrientationEvent.alpha * -1;\n            }\n            this._updateMarkerRotationThrottled();\n        }\n    }\n\n    /**\n     * Trigger a geolocation event.\n     *\n     * @example\n     * // Initialize the geolocate control.\n     * const geolocate = new mapboxgl.GeolocateControl({\n     *     positionOptions: {\n     *         enableHighAccuracy: true\n     *     },\n     *     trackUserLocation: true\n     * });\n     * // Add the control to the map.\n     * map.addControl(geolocate);\n     * map.on('load', () => {\n     *     geolocate.trigger();\n     * });\n     * @returns {boolean} Returns `false` if called before control was added to a map, otherwise returns `true`.\n     */\n    trigger(): boolean {\n        if (!this._setup) {\n            warnOnce('Geolocate control triggered before added to a map');\n            return false;\n        }\n        if (this.options.trackUserLocation) {\n            // update watchState and do any outgoing state cleanup\n            switch (this._watchState) {\n            case 'OFF':\n                // turn on the GeolocateControl\n                this._watchState = 'WAITING_ACTIVE';\n\n                this.fire(new Event('trackuserlocationstart'));\n                break;\n            case 'WAITING_ACTIVE':\n            case 'ACTIVE_LOCK':\n            case 'ACTIVE_ERROR':\n            case 'BACKGROUND_ERROR':\n                // turn off the Geolocate Control\n                this._numberOfWatches--;\n                this._noTimeout = false;\n                this._watchState = 'OFF';\n                this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting');\n                this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active');\n                this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active-error');\n                this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background');\n                this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background-error');\n\n                this.fire(new Event('trackuserlocationend'));\n                break;\n            case 'BACKGROUND':\n                this._watchState = 'ACTIVE_LOCK';\n                this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background');\n                // set camera to last known location\n                if (this._lastKnownPosition) this._updateCamera(this._lastKnownPosition);\n\n                this.fire(new Event('trackuserlocationstart'));\n                break;\n            default:\n                assert(false, `Unexpected watchState ${this._watchState}`);\n            }\n\n            // incoming state setup\n            switch (this._watchState) {\n            case 'WAITING_ACTIVE':\n                this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting');\n                this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active');\n                break;\n            case 'ACTIVE_LOCK':\n                this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active');\n                break;\n            case 'ACTIVE_ERROR':\n                this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting');\n                this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active-error');\n                break;\n            case 'BACKGROUND':\n                this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background');\n                break;\n            case 'BACKGROUND_ERROR':\n                this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting');\n                this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background-error');\n                break;\n            case 'OFF':\n                break;\n            default:\n                assert(false, `Unexpected watchState ${this._watchState}`);\n            }\n\n            // manage geolocation.watchPosition / geolocation.clearWatch\n            if (this._watchState === 'OFF' && this._geolocationWatchID !== undefined) {\n                // clear watchPosition as we've changed to an OFF state\n                this._clearWatch();\n            } else if (this._geolocationWatchID === undefined) {\n                // enable watchPosition since watchState is not OFF and there is no watchPosition already running\n\n                this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting');\n                this._geolocateButton.setAttribute('aria-pressed', 'true');\n\n                this._numberOfWatches++;\n                let positionOptions;\n                if (this._numberOfWatches > 1) {\n                    positionOptions = {maximumAge:600000, timeout:0};\n                    this._noTimeout = true;\n                } else {\n                    positionOptions = this.options.positionOptions;\n                    this._noTimeout = false;\n                }\n\n                this._geolocationWatchID = this.options.geolocation.watchPosition(\n                    this._onSuccess, this._onError, positionOptions);\n\n                if (this.options.showUserHeading) {\n                    this._addDeviceOrientationListener();\n                }\n            }\n        } else {\n            // $FlowFixMe[method-unbinding]\n            this.options.geolocation.getCurrentPosition(this._onSuccess, this._onError, this.options.positionOptions);\n\n            // This timeout ensures that we still call finish() even if\n            // the user declines to share their location in Firefox\n            // $FlowFixMe[method-unbinding]\n            this._timeoutId = setTimeout(this._finish, 10000 /* 10sec */);\n        }\n\n        return true;\n    }\n\n    _addDeviceOrientationListener() {\n        const addListener = () => {\n            if ('ondeviceorientationabsolute' in window) {\n                // $FlowFixMe[method-unbinding]\n                window.addEventListener('deviceorientationabsolute', this._onDeviceOrientation);\n            } else {\n                // $FlowFixMe[method-unbinding]\n                window.addEventListener('deviceorientation', this._onDeviceOrientation);\n            }\n        };\n\n        // $FlowFixMe[cannot-resolve-name]\n        if (typeof DeviceMotionEvent !== \"undefined\" && typeof DeviceMotionEvent.requestPermission === 'function') {\n            // $FlowFixMe\n            DeviceOrientationEvent.requestPermission()\n                .then(response => {\n                    if (response === 'granted') {\n                        addListener();\n                    }\n                })\n                .catch(console.error);\n        } else {\n            addListener();\n        }\n    }\n\n    _clearWatch() {\n        this.options.geolocation.clearWatch(this._geolocationWatchID);\n\n        // $FlowFixMe[method-unbinding]\n        window.removeEventListener('deviceorientation', this._onDeviceOrientation);\n        // $FlowFixMe[method-unbinding]\n        window.removeEventListener('deviceorientationabsolute', this._onDeviceOrientation);\n\n        this._geolocationWatchID = (undefined: any);\n        this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting');\n        this._geolocateButton.setAttribute('aria-pressed', 'false');\n\n        if (this.options.showUserLocation) {\n            this._updateMarker(null);\n        }\n    }\n}\n\nexport default GeolocateControl;\n\n/* GeolocateControl Watch States\n * This is the private state of the control.\n *\n * OFF\n *    off/inactive\n * WAITING_ACTIVE\n *    GeolocateControl was clicked but still waiting for Geolocation API response with user location\n * ACTIVE_LOCK\n *    Showing the user location as a dot AND tracking the camera to be fixed to their location. If their location changes the map moves to follow.\n * ACTIVE_ERROR\n *    There was en error from the Geolocation API while trying to show and track the user location.\n * BACKGROUND\n *    Showing the user location as a dot but the camera doesn't follow their location as it changes.\n * BACKGROUND_ERROR\n *    There was an error from the Geolocation API while trying to show (but not track) the user location.\n */\n\n/**\n * Fired on each Geolocation API position update that returned as success.\n *\n * @event geolocate\n * @memberof GeolocateControl\n * @instance\n * @property {Position} data The returned [Position](https://developer.mozilla.org/en-US/docs/Web/API/Position) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition) or [Geolocation.watchPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition).\n * @example\n * // Initialize the GeolocateControl.\n * const geolocate = new mapboxgl.GeolocateControl({\n *     positionOptions: {\n *         enableHighAccuracy: true\n *     },\n *     trackUserLocation: true\n * });\n * // Add the control to the map.\n * map.addControl(geolocate);\n * // Set an event listener that fires\n * // when a geolocate event occurs.\n * geolocate.on('geolocate', () => {\n *     console.log('A geolocate event has occurred.');\n * });\n */\n\n/**\n * Fired on each Geolocation API position update that returned as an error.\n *\n * @event error\n * @memberof GeolocateControl\n * @instance\n * @property {PositionError} data The returned [PositionError](https://developer.mozilla.org/en-US/docs/Web/API/PositionError) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition) or [Geolocation.watchPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition).\n * @example\n * // Initialize the GeolocateControl.\n * const geolocate = new mapboxgl.GeolocateControl({\n *     positionOptions: {\n *         enableHighAccuracy: true\n *     },\n *     trackUserLocation: true\n * });\n * // Add the control to the map.\n * map.addControl(geolocate);\n * // Set an event listener that fires\n * // when an error event occurs.\n * geolocate.on('error', () => {\n *     console.log('An error event has occurred.');\n * });\n */\n\n/**\n * Fired on each Geolocation API position update that returned as success but user position is out of map `maxBounds`.\n *\n * @event outofmaxbounds\n * @memberof GeolocateControl\n * @instance\n * @property {Position} data The returned [Position](https://developer.mozilla.org/en-US/docs/Web/API/Position) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition) or [Geolocation.watchPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition).\n * @example\n * // Initialize the GeolocateControl.\n * const geolocate = new mapboxgl.GeolocateControl({\n *     positionOptions: {\n *         enableHighAccuracy: true\n *     },\n *     trackUserLocation: true\n * });\n * // Add the control to the map.\n * map.addControl(geolocate);\n * // Set an event listener that fires\n * // when an outofmaxbounds event occurs.\n * geolocate.on('outofmaxbounds', () => {\n *     console.log('An outofmaxbounds event has occurred.');\n * });\n */\n\n/**\n * Fired when the `GeolocateControl` changes to the active lock state, which happens either upon first obtaining a successful Geolocation API position for the user (a `geolocate` event will follow), or when the user clicks the geolocate button when in the background state, which uses the last known position to recenter the map and enter active lock state (no `geolocate` event will follow unless the users's location changes).\n *\n * @event trackuserlocationstart\n * @memberof GeolocateControl\n * @instance\n * @example\n * // Initialize the GeolocateControl.\n * const geolocate = new mapboxgl.GeolocateControl({\n *     positionOptions: {\n *         enableHighAccuracy: true\n *     },\n *     trackUserLocation: true\n * });\n * // Add the control to the map.\n * map.addControl(geolocate);\n * // Set an event listener that fires\n * // when a trackuserlocationstart event occurs.\n * geolocate.on('trackuserlocationstart', () => {\n *     console.log('A trackuserlocationstart event has occurred.');\n * });\n */\n\n/**\n * Fired when the `GeolocateControl` changes to the background state, which happens when a user changes the camera during an active position lock. This only applies when `trackUserLocation` is `true`. In the background state, the dot on the map will update with location updates but the camera will not.\n *\n * @event trackuserlocationend\n * @memberof GeolocateControl\n * @instance\n * @example\n * // Initialize the GeolocateControl.\n * const geolocate = new mapboxgl.GeolocateControl({\n *     positionOptions: {\n *         enableHighAccuracy: true\n *     },\n *     trackUserLocation: true\n * });\n * // Add the control to the map.\n * map.addControl(geolocate);\n * // Set an event listener that fires\n * // when a trackuserlocationend event occurs.\n * geolocate.on('trackuserlocationend', () => {\n *     console.log('A trackuserlocationend event has occurred.');\n * });\n */\n","// @flow\n\nimport * as DOM from '../../util/dom.js';\nimport {extend, bindAll} from '../../util/util.js';\n\nimport type {Map, ControlPosition} from '../map.js';\n\ntype Unit = 'imperial' | 'metric' | 'nautical';\n\ntype Options = {\n    maxWidth?: number,\n    unit?: Unit;\n};\n\nconst defaultOptions: Options = {\n    maxWidth: 100,\n    unit: 'metric'\n};\n\nconst unitAbbr = {\n    kilometer: 'km',\n    meter: 'm',\n    mile: 'mi',\n    foot: 'ft',\n    'nautical-mile': 'nm',\n};\n\n/**\n * A `ScaleControl` control displays the ratio of a distance on the map to the corresponding distance on the ground.\n * Add this control to a map using {@link Map#addControl}.\n *\n * @implements {IControl}\n * @param {Object} [options]\n * @param {number} [options.maxWidth='100'] The maximum length of the scale control in pixels.\n * @param {string} [options.unit='metric'] Unit of the distance (`'imperial'`, `'metric'` or `'nautical'`).\n * @example\n * const scale = new mapboxgl.ScaleControl({\n *     maxWidth: 80,\n *     unit: 'imperial'\n * });\n * map.addControl(scale);\n *\n * scale.setUnit('metric');\n */\nclass ScaleControl {\n    _map: Map;\n    _container: HTMLElement;\n    _language: ?string | ?string[];\n    _isNumberFormatSupported: boolean;\n    options: Options;\n\n    constructor(options?: Options) {\n        this.options = extend({}, defaultOptions, options);\n\n        // Some old browsers (e.g., Safari < 14.1) don't support the \"unit\" style in NumberFormat.\n        // This is a workaround to display the scale without proper internationalization support.\n        this._isNumberFormatSupported = isNumberFormatSupported();\n\n        bindAll([\n            '_update',\n            '_setScale',\n            'setUnit'\n        ], this);\n    }\n\n    getDefaultPosition(): ControlPosition {\n        return 'bottom-left';\n    }\n\n    _update() {\n        // A horizontal scale is imagined to be present at center of the map\n        // container with maximum length (Default) as 100px.\n        // Using spherical law of cosines approximation, the real distance is\n        // found between the two coordinates.\n        const maxWidth = this.options.maxWidth || 100;\n\n        const map = this._map;\n        const y = map._containerHeight / 2;\n        const x = (map._containerWidth / 2) - maxWidth / 2;\n        const left = map.unproject([x, y]);\n        const right = map.unproject([x + maxWidth, y]);\n        const maxMeters = left.distanceTo(right);\n        // The real distance corresponding to 100px scale length is rounded off to\n        // near pretty number and the scale length for the same is found out.\n        // Default unit of the scale is based on User's locale.\n        if (this.options.unit === 'imperial') {\n            const maxFeet = 3.2808 * maxMeters;\n            if (maxFeet > 5280) {\n                const maxMiles = maxFeet / 5280;\n                this._setScale(maxWidth, maxMiles, 'mile');\n            } else {\n                this._setScale(maxWidth, maxFeet, 'foot');\n            }\n        } else if (this.options.unit === 'nautical') {\n            const maxNauticals = maxMeters / 1852;\n            this._setScale(maxWidth, maxNauticals, 'nautical-mile');\n        } else if (maxMeters >= 1000) {\n            this._setScale(maxWidth, maxMeters / 1000, 'kilometer');\n        } else {\n            this._setScale(maxWidth, maxMeters, 'meter');\n        }\n    }\n\n    _setScale(maxWidth: number, maxDistance: number, unit: string) {\n        this._map._requestDomTask(() => {\n            const distance = getRoundNum(maxDistance);\n            const ratio = distance / maxDistance;\n\n            if (this._isNumberFormatSupported && unit !== 'nautical-mile') {\n                // $FlowFixMe[incompatible-call] — flow v0.190.1 doesn't support optional `locales` argument and `unit` style option\n                this._container.innerHTML = new Intl.NumberFormat(this._language, {style: 'unit', unitDisplay: 'short', unit}).format(distance);\n            } else {\n                this._container.innerHTML = `${distance}&nbsp;${unitAbbr[unit]}`;\n            }\n\n            this._container.style.width = `${maxWidth * ratio}px`;\n        });\n    }\n\n    onAdd(map: Map): HTMLElement {\n        this._map = map;\n        this._language = map.getLanguage();\n        this._container = DOM.create('div', 'mapboxgl-ctrl mapboxgl-ctrl-scale', map.getContainer());\n        this._container.dir = 'auto';\n\n        // $FlowFixMe[method-unbinding]\n        this._map.on('move', this._update);\n        this._update();\n\n        return this._container;\n    }\n\n    onRemove() {\n        this._container.remove();\n        // $FlowFixMe[method-unbinding]\n        this._map.off('move', this._update);\n        this._map = (undefined: any);\n    }\n\n    _setLanguage(language: string) {\n        this._language = language;\n        this._update();\n    }\n\n    /**\n     * Set the scale's unit of the distance.\n     *\n     * @param {'imperial' | 'metric' | 'nautical'} unit Unit of the distance (`'imperial'`, `'metric'` or `'nautical'`).\n     */\n    setUnit(unit: Unit) {\n        this.options.unit = unit;\n        this._update();\n    }\n}\n\nexport default ScaleControl;\n\nfunction isNumberFormatSupported() {\n    try {\n        // $FlowIgnore\n        new Intl.NumberFormat('en', {style: 'unit', unitDisplay: 'short', unit: 'meter'});\n        return true;\n    } catch (_) {\n        return false;\n    }\n}\n\nfunction getDecimalRoundNum(d: number) {\n    const multiplier = Math.pow(10, Math.ceil(-Math.log(d) / Math.LN10));\n    return Math.round(d * multiplier) / multiplier;\n}\n\nfunction getRoundNum(num: number) {\n    const pow10 = Math.pow(10, (`${Math.floor(num)}`).length - 1);\n    let d = num / pow10;\n\n    d = d >= 10 ? 10 :\n        d >= 5 ? 5 :\n        d >= 3 ? 3 :\n        d >= 2 ? 2 :\n        d >= 1 ? 1 : getDecimalRoundNum(d);\n\n    return pow10 * d;\n}\n","// @flow\n\nimport {PerformanceUtils} from './util/performance.js';\n\nimport assert from 'assert';\nimport {supported} from '@mapbox/mapbox-gl-supported';\n\nimport {version} from '../package.json';\nimport {Map} from './ui/map.js';\nimport NavigationControl from './ui/control/navigation_control.js';\nimport GeolocateControl from './ui/control/geolocate_control.js';\nimport AttributionControl from './ui/control/attribution_control.js';\nimport ScaleControl from './ui/control/scale_control.js';\nimport FullscreenControl from './ui/control/fullscreen_control.js';\nimport Popup from './ui/popup.js';\nimport Marker from './ui/marker.js';\nimport Style from './style/style.js';\nimport LngLat, {LngLatBounds} from './geo/lng_lat.js';\nimport Point from '@mapbox/point-geometry';\nimport MercatorCoordinate from './geo/mercator_coordinate.js';\nimport {Evented} from './util/evented.js';\nimport config from './util/config.js';\nimport {Debug} from './util/debug.js';\nimport {isSafari} from './util/util.js';\nimport {setRTLTextPlugin, getRTLTextPluginStatus} from './source/rtl_text_plugin.js';\nimport WorkerPool from './util/worker_pool.js';\nimport WorkerClass from './util/worker_class.js';\nimport {prewarm, clearPrewarmedResources} from './util/global_worker_pool.js';\nimport {clearTileCache} from './util/tile_request_cache.js';\nimport {WorkerPerformanceUtils} from './util/worker_performance_utils.js';\nimport {FreeCameraOptions} from './ui/free_camera.js';\nimport {getDracoUrl, setDracoUrl, setMeshoptUrl, getMeshoptUrl} from '../3d-style/util/loaders.js';\nimport browser from './util/browser.js';\n\nconst exported = {\n    version,\n    supported,\n    setRTLTextPlugin,\n    getRTLTextPluginStatus,\n    Map,\n    NavigationControl,\n    GeolocateControl,\n    AttributionControl,\n    ScaleControl,\n    FullscreenControl,\n    Popup,\n    Marker,\n    Style,\n    LngLat,\n    LngLatBounds,\n    Point,\n    MercatorCoordinate,\n    FreeCameraOptions,\n    Evented,\n    config,\n    /**\n     * Initializes resources like WebWorkers that can be shared across maps to lower load\n     * times in some situations. [`mapboxgl.workerUrl`](https://docs.mapbox.com/mapbox-gl-js/api/properties/#workerurl)\n     * and [`mapboxgl.workerCount`](https://docs.mapbox.com/mapbox-gl-js/api/properties/#workercount), if being\n     * used, must be set before `prewarm()` is called to have an effect.\n     *\n     * By default, the lifecycle of these resources is managed automatically, and they are\n     * lazily initialized when a `Map` is first created. Invoking `prewarm()` creates these\n     * resources ahead of time and ensures they are not cleared when the last `Map`\n     * is removed from the page. This allows them to be re-used by new `Map` instances that\n     * are created later. They can be manually cleared by calling\n     * [`mapboxgl.clearPrewarmedResources()`](https://docs.mapbox.com/mapbox-gl-js/api/properties/#clearprewarmedresources).\n     * This is only necessary if your web page remains active but stops using maps altogether.\n     * `prewarm()` is idempotent and has guards against being executed multiple times,\n     * and any resources allocated by `prewarm()` are created synchronously.\n     *\n     * This is primarily useful when using Mapbox GL JS maps in a single page app,\n     * in which a user navigates between various views, resulting in\n     * constant creation and destruction of `Map` instances.\n     *\n     * @function prewarm\n     * @example\n     * mapboxgl.prewarm();\n     */\n    prewarm,\n    /**\n     * Clears up resources that have previously been created by [`mapboxgl.prewarm()](https://docs.mapbox.com/mapbox-gl-js/api/properties/#prewarm)`.\n     * Note that this is typically not necessary. You should only call this function\n     * if you expect the user of your app to not return to a Map view at any point\n     * in your application.\n     *\n     * @function clearPrewarmedResources\n     * @example\n     * mapboxgl.clearPrewarmedResources();\n     */\n    clearPrewarmedResources,\n\n    /**\n     * Gets and sets the map's [access token](https://www.mapbox.com/help/define-access-token/).\n     *\n     * @var {string} accessToken\n     * @returns {string} The currently set access token.\n     * @example\n     * mapboxgl.accessToken = myAccessToken;\n     * @see [Example: Display a map](https://www.mapbox.com/mapbox-gl-js/example/simple-map/)\n     */\n    get accessToken(): ?string {\n        return config.ACCESS_TOKEN;\n    },\n\n    set accessToken(token: string) {\n        config.ACCESS_TOKEN = token;\n    },\n\n    /**\n     * Gets and sets the map's default API URL for requesting tiles, styles, sprites, and glyphs.\n     *\n     * @var {string} baseApiUrl\n     * @returns {string} The current base API URL.\n     * @example\n     * mapboxgl.baseApiUrl = 'https://api.mapbox.com';\n     */\n    get baseApiUrl(): ?string {\n        return config.API_URL;\n    },\n\n    set baseApiUrl(url: string) {\n        config.API_URL = url;\n    },\n\n    /**\n     * Gets and sets the number of web workers instantiated on a page with Mapbox GL JS maps.\n     * By default, it is set to 2.\n     * Make sure to set this property before creating any map instances for it to have effect.\n     *\n     * @var {string} workerCount\n     * @returns {number} Number of workers currently configured.\n     * @example\n     * mapboxgl.workerCount = 4;\n     */\n    get workerCount(): number {\n        return WorkerPool.workerCount;\n    },\n\n    set workerCount(count: number) {\n        WorkerPool.workerCount = count;\n    },\n\n    /**\n     * Gets and sets the maximum number of images (raster tiles, sprites, icons) to load in parallel.\n     * 16 by default. There is no maximum value, but the number of images affects performance in raster-heavy maps.\n     *\n     * @var {string} maxParallelImageRequests\n     * @returns {number} Number of parallel requests currently configured.\n     * @example\n     * mapboxgl.maxParallelImageRequests = 10;\n     */\n    get maxParallelImageRequests(): number {\n        return config.MAX_PARALLEL_IMAGE_REQUESTS;\n    },\n\n    set maxParallelImageRequests(numRequests: number) {\n        config.MAX_PARALLEL_IMAGE_REQUESTS = numRequests;\n    },\n\n    /**\n     * Clears browser storage used by this library. Using this method flushes the Mapbox tile\n     * cache that is managed by this library. Tiles may still be cached by the browser\n     * in some cases.\n     *\n     * This API is supported on browsers where the [`Cache` API](https://developer.mozilla.org/en-US/docs/Web/API/Cache)\n     * is supported and enabled. This includes all major browsers when pages are served over\n     * `https://`, except Internet Explorer and Edge Mobile.\n     *\n     * When called in unsupported browsers or environments (private or incognito mode), the\n     * callback will be called with an error argument.\n     *\n     * @function clearStorage\n     * @param {Function} callback Called with an error argument if there is an error.\n     * @example\n     * mapboxgl.clearStorage();\n     */\n    clearStorage(callback?: (err: ?Error) => void) {\n        clearTileCache(callback);\n    },\n    /**\n     * Provides an interface for loading mapbox-gl's WebWorker bundle from a self-hosted URL.\n     * This needs to be set only once, and before any call to `new mapboxgl.Map(..)` takes place.\n     * This is useful if your site needs to operate in a strict CSP (Content Security Policy) environment\n     * wherein you are not allowed to load JavaScript code from a [`Blob` URL](https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL), which is default behavior.\n     *\n     * See our documentation on [CSP Directives](https://docs.mapbox.com/mapbox-gl-js/api/#csp-directives) for more details.\n     *\n     * @var {string} workerUrl\n     * @returns {string} A URL hosting a JavaScript bundle for mapbox-gl's WebWorker.\n     * @example\n     * <script src='https://api.mapbox.com/mapbox-gl-js/v2.3.1/mapbox-gl-csp.js'></script>\n     * <script>\n     * mapboxgl.workerUrl = \"https://api.mapbox.com/mapbox-gl-js/v2.3.1/mapbox-gl-csp-worker.js\";\n     * ...\n     * </script>\n     */\n    get workerUrl(): string {\n        return WorkerClass.workerUrl;\n    },\n\n    set workerUrl(url: string) {\n        WorkerClass.workerUrl = url;\n    },\n\n    /**\n     * Provides an interface for external module bundlers such as Webpack or Rollup to package\n     * mapbox-gl's WebWorker into a separate class and integrate it with the library.\n     *\n     * Takes precedence over `mapboxgl.workerUrl`.\n     *\n     * @var {Object} workerClass\n     * @returns {Object | null} A class that implements the `Worker` interface.\n     * @example\n     * import mapboxgl from 'mapbox-gl/dist/mapbox-gl-csp.js';\n     * import MapboxGLWorker from 'mapbox-gl/dist/mapbox-gl-csp-worker.js';\n     *\n     * mapboxgl.workerClass = MapboxGLWorker;\n     */\n    get workerClass(): Object {\n        return WorkerClass.workerClass;\n    },\n\n    set workerClass(klass: Object) {\n        WorkerClass.workerClass = klass;\n    },\n\n    get workerParams(): Object {\n        return WorkerClass.workerParams;\n    },\n\n    set workerParams(params: Object) {\n        WorkerClass.workerParams = params;\n    },\n\n    /**\n     * Provides an interface for loading Draco decoding library (draco_decoder_gltf.wasm v1.5.6) from a self-hosted URL.\n     * This needs to be set only once, and before any call to `new mapboxgl.Map(..)` takes place.\n     * This is useful if your site needs to operate in a strict CSP (Content Security Policy) environment\n     * wherein you are not allowed to load JavaScript code from a [`Blob` URL](https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL), which is default behavior.\n     *\n     * See our documentation on [CSP Directives](https://docs.mapbox.com/mapbox-gl-js/api/#csp-directives) for more details.\n     *\n     * @var {string} dracoUrl\n     * @returns {string} A URL hosting Google Draco decoding library (`draco_wasm_wrapper_gltf.js` and `draco_decoder_gltf.wasm`).\n     * @example\n     * <script src='https://api.mapbox.com/mapbox-gl-js/v3.0.0/mapbox-gl.js'></script>\n     * <script>\n     * mapboxgl.dracoUrl = \"https://www.gstatic.com/draco/versioned/decoders/1.5.6/draco_decoder_gltf.wasm\";\n     * ...\n     * </script>\n     */\n    get dracoUrl(): string {\n        return getDracoUrl();\n    },\n\n    set dracoUrl(url: string) {\n        setDracoUrl(url);\n    },\n\n    get meshoptUrl(): string {\n        return getMeshoptUrl();\n    },\n\n    set meshoptUrl(url: string) {\n        setMeshoptUrl(url);\n    },\n\n    /**\n     * Sets the time used by Mapbox GL JS internally for all animations. Useful for generating videos from Mapbox GL JS.\n     *\n     * @var {number} time\n     */\n    setNow: browser.setNow,\n\n    /**\n     * Restores the internal animation timing to follow regular computer time (`performance.now()`).\n     */\n    restoreNow: browser.restoreNow\n};\n\n//This gets automatically stripped out in production builds.\nDebug.extend(exported, {isSafari, getPerformanceMetrics: PerformanceUtils.getPerformanceMetrics, getPerformanceMetricsAsync: WorkerPerformanceUtils.getPerformanceMetricsAsync});\n\n/**\n * Gets the version of Mapbox GL JS in use as specified in `package.json`,\n * `CHANGELOG.md`, and the GitHub release.\n *\n * @var {string} version\n * @example\n * console.log(`Mapbox GL JS v${mapboxgl.version}`);\n */\n\n/**\n * Test whether the browser [supports Mapbox GL JS](https://www.mapbox.com/help/mapbox-browser-support/#mapbox-gl-js).\n *\n * @function supported\n * @param {Object} [options]\n * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`,\n * the function will return `false` if the performance of Mapbox GL JS would\n * be dramatically worse than expected (for example, a software WebGL renderer\n * would be used).\n * @return {boolean}\n * @example\n * // Show an alert if the browser does not support Mapbox GL\n * if (!mapboxgl.supported()) {\n *     alert('Your browser does not support Mapbox GL');\n * }\n * @see [Example: Check for browser support](https://www.mapbox.com/mapbox-gl-js/example/check-for-support/)\n */\n\n/**\n * Sets the map's [RTL text plugin](https://www.mapbox.com/mapbox-gl-js/plugins/#mapbox-gl-rtl-text).\n * Necessary for supporting the Arabic and Hebrew languages, which are written right-to-left. Mapbox Studio loads this plugin by default.\n *\n * @function setRTLTextPlugin\n * @param {string} pluginURL URL pointing to the Mapbox RTL text plugin source.\n * @param {Function} callback Called with an error argument if there is an error, or no arguments if the plugin loads successfully.\n * @param {boolean} lazy If set to `true`, MapboxGL will defer loading the plugin until right-to-left text is encountered, and\n * right-to-left text will be rendered only after the plugin finishes loading.\n * @example\n * mapboxgl.setRTLTextPlugin('https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-rtl-text/v0.2.0/mapbox-gl-rtl-text.js');\n * @see [Example: Add support for right-to-left scripts](https://www.mapbox.com/mapbox-gl-js/example/mapbox-gl-rtl-text/)\n */\n\n/**\n  * Gets the map's [RTL text plugin](https://www.mapbox.com/mapbox-gl-js/plugins/#mapbox-gl-rtl-text) status.\n  * The status can be `unavailable` (not requested or removed), `loading`, `loaded`, or `error`.\n  * If the status is `loaded` and the plugin is requested again, an error will be thrown.\n  *\n  * @function getRTLTextPluginStatus\n  * @example\n  * const pluginStatus = mapboxgl.getRTLTextPluginStatus();\n  */\n\nexport default exported;\n\n// canary assert: used to confirm that asserts have been removed from production build\nassert(true, 'canary assert');\n","// @flow\n\nimport * as DOM from '../../util/dom.js';\n\nimport {bindAll, warnOnce} from '../../util/util.js';\n\nimport type {Map} from '../map.js';\n\ntype Options = {\n    container?: HTMLElement\n};\n\n/**\n * A `FullscreenControl` control contains a button for toggling the map in and out of fullscreen mode. See the `requestFullScreen` [compatibility table](https://developer.mozilla.org/en-US/docs/Web/API/Element/requestFullScreen#browser_compatibility) for supported browsers.\n * Add this control to a map using {@link Map#addControl}.\n *\n * @implements {IControl}\n * @param {Object} [options]\n * @param {HTMLElement} [options.container] `container` is the [compatible DOM element](https://developer.mozilla.org/en-US/docs/Web/API/Element/requestFullScreen#Compatible_elements) which should be made full screen. By default, the map container element will be made full screen.\n *\n * @example\n * map.addControl(new mapboxgl.FullscreenControl({container: document.querySelector('body')}));\n * @see [Example: View a fullscreen map](https://www.mapbox.com/mapbox-gl-js/example/fullscreen/)\n */\n\nclass FullscreenControl {\n    _map: Map;\n    _controlContainer: HTMLElement;\n    _fullscreen: boolean;\n    _fullscreenchange: string;\n    _fullscreenButton: HTMLElement;\n    _container: HTMLElement;\n\n    constructor(options?: Options) {\n        this._fullscreen = false;\n        if (options && options.container) {\n            if (options.container instanceof HTMLElement) {\n                this._container = options.container;\n            } else {\n                warnOnce('Full screen control \\'container\\' must be a DOM element.');\n            }\n        }\n        bindAll([\n            '_onClickFullscreen',\n            '_changeIcon'\n        ], this);\n        if ('onfullscreenchange' in document) {\n            this._fullscreenchange = 'fullscreenchange';\n        } else if ('onwebkitfullscreenchange' in document) {\n            this._fullscreenchange = 'webkitfullscreenchange';\n        }\n    }\n\n    onAdd(map: Map): HTMLElement {\n        this._map = map;\n        if (!this._container) this._container = this._map.getContainer();\n        this._controlContainer = DOM.create('div', `mapboxgl-ctrl mapboxgl-ctrl-group`);\n        if (this._checkFullscreenSupport()) {\n            this._setupUI();\n        } else {\n            this._controlContainer.style.display = 'none';\n            warnOnce('This device does not support fullscreen mode.');\n        }\n        return this._controlContainer;\n    }\n\n    onRemove() {\n        this._controlContainer.remove();\n        this._map = (null: any);\n        // $FlowFixMe[method-unbinding]\n        document.removeEventListener(this._fullscreenchange, this._changeIcon);\n    }\n\n    _checkFullscreenSupport(): boolean {\n        return !!(\n            document.fullscreenEnabled ||\n            (document: any).webkitFullscreenEnabled\n        );\n    }\n\n    _setupUI() {\n        const button = this._fullscreenButton = DOM.create('button', (`mapboxgl-ctrl-fullscreen`), this._controlContainer);\n        DOM.create('span', `mapboxgl-ctrl-icon`, button).setAttribute('aria-hidden', 'true');\n        button.type = 'button';\n        this._updateTitle();\n        // $FlowFixMe[method-unbinding]\n        this._fullscreenButton.addEventListener('click', this._onClickFullscreen);\n        // $FlowFixMe[method-unbinding]\n        document.addEventListener(this._fullscreenchange, this._changeIcon);\n    }\n\n    _updateTitle() {\n        const title = this._getTitle();\n        this._fullscreenButton.setAttribute(\"aria-label\", title);\n        if (this._fullscreenButton.firstElementChild) this._fullscreenButton.firstElementChild.setAttribute('title', title);\n    }\n\n    _getTitle(): string {\n        return this._map._getUIString(this._isFullscreen() ? 'FullscreenControl.Exit' : 'FullscreenControl.Enter');\n    }\n\n    _isFullscreen(): boolean {\n        return this._fullscreen;\n    }\n\n    _changeIcon() {\n        const fullscreenElement =\n            document.fullscreenElement ||\n            (document: any).webkitFullscreenElement;\n\n        if ((fullscreenElement === this._container) !== this._fullscreen) {\n            this._fullscreen = !this._fullscreen;\n            this._fullscreenButton.classList.toggle(`mapboxgl-ctrl-shrink`);\n            this._fullscreenButton.classList.toggle(`mapboxgl-ctrl-fullscreen`);\n            this._updateTitle();\n        }\n    }\n\n    _onClickFullscreen() {\n        if (this._isFullscreen()) {\n            // $FlowFixMe[method-unbinding]\n            if (document.exitFullscreen) {\n                (document: any).exitFullscreen();\n            // $FlowFixMe[method-unbinding]\n            } else if ((document: any).webkitCancelFullScreen) {\n                (document: any).webkitCancelFullScreen();\n            }\n        // $FlowFixMe[method-unbinding]\n        } else if (this._container.requestFullscreen) {\n            this._container.requestFullscreen();\n        } else if ((this._container: any).webkitRequestFullscreen) {\n            (this._container: any).webkitRequestFullscreen();\n        }\n    }\n}\n\nexport default FullscreenControl;\n","//\n// Our custom intro provides a specialized \"define()\" function, called by the\n// AMD modules below, that sets up the worker blob URL and then executes the\n// main module, storing its exported value as 'mapboxgl'\n\n// The three \"chunks\" imported here are produced by a first Rollup pass,\n// which outputs them as AMD modules.\n\n// Shared dependencies, i.e.:\n/*\ndefine(['exports'], function (exports) {\n    // Code for all common dependencies\n    // Each module's exports are attached attached to 'exports' (with\n    // names rewritten to avoid collisions, etc.)\n})\n*/\nimport './build/mapboxgl/shared';\n\n// Worker and its unique dependencies, i.e.:\n/*\ndefine(['./shared.js'], function (__shared__js) {\n    //  Code for worker script and its unique dependencies.\n    //  Expects the output of 'shared' module to be passed in as an argument,\n    //  since all references to common deps look like, e.g.,\n    //  __shared__js.shapeText().\n});\n*/\n// When this wrapper function is passed to our custom define() above,\n// it gets stringified, together with the shared wrapper (using\n// Function.toString()), and the resulting string of code is made into a\n// Blob URL that gets used by the main module to create the web workers.\nimport './build/mapboxgl/worker';\n\n// Main module and its unique dependencies\n/*\ndefine(['./shared.js'], function (__shared__js) {\n    //  Code for main GL JS module and its unique dependencies.\n    //  Expects the output of 'shared' module to be passed in as an argument,\n    //  since all references to common deps look like, e.g.,\n    //  __shared__js.shapeText().\n    //\n    //  Returns the actual mapboxgl (i.e. src/index.js)\n});\n*/\nimport './build/mapboxgl/index';\n\nexport default mapboxgl;\n","/**\n * @license React\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var aa=require(\"react\"),ca=require(\"scheduler\");function p(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;c<arguments.length;c++)b+=\"&args[]=\"+encodeURIComponent(arguments[c]);return\"Minified React error #\"+a+\"; visit \"+b+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}var da=new Set,ea={};function fa(a,b){ha(a,b);ha(a+\"Capture\",b)}\nfunction ha(a,b){ea[a]=b;for(a=0;a<b.length;a++)da.add(b[a])}\nvar ia=!(\"undefined\"===typeof window||\"undefined\"===typeof window.document||\"undefined\"===typeof window.document.createElement),ja=Object.prototype.hasOwnProperty,ka=/^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/,la=\n{},ma={};function oa(a){if(ja.call(ma,a))return!0;if(ja.call(la,a))return!1;if(ka.test(a))return ma[a]=!0;la[a]=!0;return!1}function pa(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case \"function\":case \"symbol\":return!0;case \"boolean\":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return\"data-\"!==a&&\"aria-\"!==a;default:return!1}}\nfunction qa(a,b,c,d){if(null===b||\"undefined\"===typeof b||pa(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function v(a,b,c,d,e,f,g){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f;this.removeEmptyString=g}var z={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){z[a]=new v(a,0,!1,a,null,!1,!1)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];z[b]=new v(b,1,!1,a[1],null,!1,!1)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){z[a]=new v(a,2,!1,a.toLowerCase(),null,!1,!1)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){z[a]=new v(a,2,!1,a,null,!1,!1)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){z[a]=new v(a,3,!1,a.toLowerCase(),null,!1,!1)});\n[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){z[a]=new v(a,3,!0,a,null,!1,!1)});[\"capture\",\"download\"].forEach(function(a){z[a]=new v(a,4,!1,a,null,!1,!1)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){z[a]=new v(a,6,!1,a,null,!1,!1)});[\"rowSpan\",\"start\"].forEach(function(a){z[a]=new v(a,5,!1,a.toLowerCase(),null,!1,!1)});var ra=/[\\-:]([a-z])/g;function sa(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(ra,\nsa);z[b]=new v(b,1,!1,a,null,!1,!1)});\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/1999/xlink\",!1,!1)});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\",!1,!1)});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!1,!1)});\nz.xlinkHref=new v(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0,!1);[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!0,!0)});\nfunction ta(a,b,c,d){var e=z.hasOwnProperty(b)?z[b]:null;if(null!==e?0!==e.type:d||!(2<b.length)||\"o\"!==b[0]&&\"O\"!==b[0]||\"n\"!==b[1]&&\"N\"!==b[1])qa(b,c,e,d)&&(c=null),d||null===e?oa(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,\"\"+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:\"\":c:(b=e.attributeName,d=e.attributeNamespace,null===c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?\"\":\"\"+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c)))}\nvar ua=aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,va=Symbol.for(\"react.element\"),wa=Symbol.for(\"react.portal\"),ya=Symbol.for(\"react.fragment\"),za=Symbol.for(\"react.strict_mode\"),Aa=Symbol.for(\"react.profiler\"),Ba=Symbol.for(\"react.provider\"),Ca=Symbol.for(\"react.context\"),Da=Symbol.for(\"react.forward_ref\"),Ea=Symbol.for(\"react.suspense\"),Fa=Symbol.for(\"react.suspense_list\"),Ga=Symbol.for(\"react.memo\"),Ha=Symbol.for(\"react.lazy\");Symbol.for(\"react.scope\");Symbol.for(\"react.debug_trace_mode\");\nvar Ia=Symbol.for(\"react.offscreen\");Symbol.for(\"react.legacy_hidden\");Symbol.for(\"react.cache\");Symbol.for(\"react.tracing_marker\");var Ja=Symbol.iterator;function Ka(a){if(null===a||\"object\"!==typeof a)return null;a=Ja&&a[Ja]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}var A=Object.assign,La;function Ma(a){if(void 0===La)try{throw Error();}catch(c){var b=c.stack.trim().match(/\\n( *(at )?)/);La=b&&b[1]||\"\"}return\"\\n\"+La+a}var Na=!1;\nfunction Oa(a,b){if(!a||Na)return\"\";Na=!0;var c=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(b)if(b=function(){throw Error();},Object.defineProperty(b.prototype,\"props\",{set:function(){throw Error();}}),\"object\"===typeof Reflect&&Reflect.construct){try{Reflect.construct(b,[])}catch(l){var d=l}Reflect.construct(a,[],b)}else{try{b.call()}catch(l){d=l}a.call(b.prototype)}else{try{throw Error();}catch(l){d=l}a()}}catch(l){if(l&&d&&\"string\"===typeof l.stack){for(var e=l.stack.split(\"\\n\"),\nf=d.stack.split(\"\\n\"),g=e.length-1,h=f.length-1;1<=g&&0<=h&&e[g]!==f[h];)h--;for(;1<=g&&0<=h;g--,h--)if(e[g]!==f[h]){if(1!==g||1!==h){do if(g--,h--,0>h||e[g]!==f[h]){var k=\"\\n\"+e[g].replace(\" at new \",\" at \");a.displayName&&k.includes(\"<anonymous>\")&&(k=k.replace(\"<anonymous>\",a.displayName));return k}while(1<=g&&0<=h)}break}}}finally{Na=!1,Error.prepareStackTrace=c}return(a=a?a.displayName||a.name:\"\")?Ma(a):\"\"}\nfunction Pa(a){switch(a.tag){case 5:return Ma(a.type);case 16:return Ma(\"Lazy\");case 13:return Ma(\"Suspense\");case 19:return Ma(\"SuspenseList\");case 0:case 2:case 15:return a=Oa(a.type,!1),a;case 11:return a=Oa(a.type.render,!1),a;case 1:return a=Oa(a.type,!0),a;default:return\"\"}}\nfunction Qa(a){if(null==a)return null;if(\"function\"===typeof a)return a.displayName||a.name||null;if(\"string\"===typeof a)return a;switch(a){case ya:return\"Fragment\";case wa:return\"Portal\";case Aa:return\"Profiler\";case za:return\"StrictMode\";case Ea:return\"Suspense\";case Fa:return\"SuspenseList\"}if(\"object\"===typeof a)switch(a.$$typeof){case Ca:return(a.displayName||\"Context\")+\".Consumer\";case Ba:return(a._context.displayName||\"Context\")+\".Provider\";case Da:var b=a.render;a=a.displayName;a||(a=b.displayName||\nb.name||\"\",a=\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");return a;case Ga:return b=a.displayName||null,null!==b?b:Qa(a.type)||\"Memo\";case Ha:b=a._payload;a=a._init;try{return Qa(a(b))}catch(c){}}return null}\nfunction Ra(a){var b=a.type;switch(a.tag){case 24:return\"Cache\";case 9:return(b.displayName||\"Context\")+\".Consumer\";case 10:return(b._context.displayName||\"Context\")+\".Provider\";case 18:return\"DehydratedFragment\";case 11:return a=b.render,a=a.displayName||a.name||\"\",b.displayName||(\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");case 7:return\"Fragment\";case 5:return b;case 4:return\"Portal\";case 3:return\"Root\";case 6:return\"Text\";case 16:return Qa(b);case 8:return b===za?\"StrictMode\":\"Mode\";case 22:return\"Offscreen\";\ncase 12:return\"Profiler\";case 21:return\"Scope\";case 13:return\"Suspense\";case 19:return\"SuspenseList\";case 25:return\"TracingMarker\";case 1:case 0:case 17:case 2:case 14:case 15:if(\"function\"===typeof b)return b.displayName||b.name||null;if(\"string\"===typeof b)return b}return null}function Sa(a){switch(typeof a){case \"boolean\":case \"number\":case \"string\":case \"undefined\":return a;case \"object\":return a;default:return\"\"}}\nfunction Ta(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction Ua(a){var b=Ta(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"undefined\"!==typeof c&&\"function\"===typeof c.get&&\"function\"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=\"\"+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function Va(a){a._valueTracker||(a._valueTracker=Ua(a))}function Wa(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=Ta(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Xa(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}\nfunction Ya(a,b){var c=b.checked;return A({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}function Za(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=Sa(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function ab(a,b){b=b.checked;null!=b&&ta(a,\"checked\",b,!1)}\nfunction bb(a,b){ab(a,b);var c=Sa(b.value),d=b.type;if(null!=c)if(\"number\"===d){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);else if(\"submit\"===d||\"reset\"===d){a.removeAttribute(\"value\");return}b.hasOwnProperty(\"value\")?cb(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&cb(a,b.type,Sa(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction db(a,b,c){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\")){var d=b.type;if(!(\"submit\"!==d&&\"reset\"!==d||void 0!==b.value&&null!==b.value))return;b=\"\"+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;\"\"!==c&&(a.name=\"\");a.defaultChecked=!!a._wrapperState.initialChecked;\"\"!==c&&(a.name=c)}\nfunction cb(a,b,c){if(\"number\"!==b||Xa(a.ownerDocument)!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}var eb=Array.isArray;\nfunction fb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e<c.length;e++)b[\"$\"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty(\"$\"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=\"\"+Sa(c);b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}\nfunction gb(a,b){if(null!=b.dangerouslySetInnerHTML)throw Error(p(91));return A({},b,{value:void 0,defaultValue:void 0,children:\"\"+a._wrapperState.initialValue})}function hb(a,b){var c=b.value;if(null==c){c=b.children;b=b.defaultValue;if(null!=c){if(null!=b)throw Error(p(92));if(eb(c)){if(1<c.length)throw Error(p(93));c=c[0]}b=c}null==b&&(b=\"\");c=b}a._wrapperState={initialValue:Sa(c)}}\nfunction ib(a,b){var c=Sa(b.value),d=Sa(b.defaultValue);null!=c&&(c=\"\"+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=\"\"+d)}function jb(a){var b=a.textContent;b===a._wrapperState.initialValue&&\"\"!==b&&null!==b&&(a.value=b)}function kb(a){switch(a){case \"svg\":return\"http://www.w3.org/2000/svg\";case \"math\":return\"http://www.w3.org/1998/Math/MathML\";default:return\"http://www.w3.org/1999/xhtml\"}}\nfunction lb(a,b){return null==a||\"http://www.w3.org/1999/xhtml\"===a?kb(b):\"http://www.w3.org/2000/svg\"===a&&\"foreignObject\"===b?\"http://www.w3.org/1999/xhtml\":a}\nvar mb,nb=function(a){return\"undefined\"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if(\"http://www.w3.org/2000/svg\"!==a.namespaceURI||\"innerHTML\"in a)a.innerHTML=b;else{mb=mb||document.createElement(\"div\");mb.innerHTML=\"<svg>\"+b.valueOf().toString()+\"</svg>\";for(b=mb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction ob(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}\nvar pb={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,\nzoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},qb=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(pb).forEach(function(a){qb.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);pb[b]=pb[a]})});function rb(a,b,c){return null==b||\"boolean\"===typeof b||\"\"===b?\"\":c||\"number\"!==typeof b||0===b||pb.hasOwnProperty(a)&&pb[a]?(\"\"+b).trim():b+\"px\"}\nfunction sb(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\"),e=rb(c,b[c],d);\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var tb=A({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction ub(a,b){if(b){if(tb[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(p(137,a));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(p(60));if(\"object\"!==typeof b.dangerouslySetInnerHTML||!(\"__html\"in b.dangerouslySetInnerHTML))throw Error(p(61));}if(null!=b.style&&\"object\"!==typeof b.style)throw Error(p(62));}}\nfunction vb(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}var wb=null;function xb(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}var yb=null,zb=null,Ab=null;\nfunction Bb(a){if(a=Cb(a)){if(\"function\"!==typeof yb)throw Error(p(280));var b=a.stateNode;b&&(b=Db(b),yb(a.stateNode,a.type,b))}}function Eb(a){zb?Ab?Ab.push(a):Ab=[a]:zb=a}function Fb(){if(zb){var a=zb,b=Ab;Ab=zb=null;Bb(a);if(b)for(a=0;a<b.length;a++)Bb(b[a])}}function Gb(a,b){return a(b)}function Hb(){}var Ib=!1;function Jb(a,b,c){if(Ib)return a(b,c);Ib=!0;try{return Gb(a,b,c)}finally{if(Ib=!1,null!==zb||null!==Ab)Hb(),Fb()}}\nfunction Kb(a,b){var c=a.stateNode;if(null===c)return null;var d=Db(c);if(null===d)return null;c=d[b];a:switch(b){case \"onClick\":case \"onClickCapture\":case \"onDoubleClick\":case \"onDoubleClickCapture\":case \"onMouseDown\":case \"onMouseDownCapture\":case \"onMouseMove\":case \"onMouseMoveCapture\":case \"onMouseUp\":case \"onMouseUpCapture\":case \"onMouseEnter\":(d=!d.disabled)||(a=a.type,d=!(\"button\"===a||\"input\"===a||\"select\"===a||\"textarea\"===a));a=!d;break a;default:a=!1}if(a)return null;if(c&&\"function\"!==\ntypeof c)throw Error(p(231,b,typeof c));return c}var Lb=!1;if(ia)try{var Mb={};Object.defineProperty(Mb,\"passive\",{get:function(){Lb=!0}});window.addEventListener(\"test\",Mb,Mb);window.removeEventListener(\"test\",Mb,Mb)}catch(a){Lb=!1}function Nb(a,b,c,d,e,f,g,h,k){var l=Array.prototype.slice.call(arguments,3);try{b.apply(c,l)}catch(m){this.onError(m)}}var Ob=!1,Pb=null,Qb=!1,Rb=null,Sb={onError:function(a){Ob=!0;Pb=a}};function Tb(a,b,c,d,e,f,g,h,k){Ob=!1;Pb=null;Nb.apply(Sb,arguments)}\nfunction Ub(a,b,c,d,e,f,g,h,k){Tb.apply(this,arguments);if(Ob){if(Ob){var l=Pb;Ob=!1;Pb=null}else throw Error(p(198));Qb||(Qb=!0,Rb=l)}}function Vb(a){var b=a,c=a;if(a.alternate)for(;b.return;)b=b.return;else{a=b;do b=a,0!==(b.flags&4098)&&(c=b.return),a=b.return;while(a)}return 3===b.tag?c:null}function Wb(a){if(13===a.tag){var b=a.memoizedState;null===b&&(a=a.alternate,null!==a&&(b=a.memoizedState));if(null!==b)return b.dehydrated}return null}function Xb(a){if(Vb(a)!==a)throw Error(p(188));}\nfunction Yb(a){var b=a.alternate;if(!b){b=Vb(a);if(null===b)throw Error(p(188));return b!==a?null:a}for(var c=a,d=b;;){var e=c.return;if(null===e)break;var f=e.alternate;if(null===f){d=e.return;if(null!==d){c=d;continue}break}if(e.child===f.child){for(f=e.child;f;){if(f===c)return Xb(e),a;if(f===d)return Xb(e),b;f=f.sibling}throw Error(p(188));}if(c.return!==d.return)c=e,d=f;else{for(var g=!1,h=e.child;h;){if(h===c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=f.child;h;){if(h===\nc){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}if(!g)throw Error(p(189));}}if(c.alternate!==d)throw Error(p(190));}if(3!==c.tag)throw Error(p(188));return c.stateNode.current===c?a:b}function Zb(a){a=Yb(a);return null!==a?$b(a):null}function $b(a){if(5===a.tag||6===a.tag)return a;for(a=a.child;null!==a;){var b=$b(a);if(null!==b)return b;a=a.sibling}return null}\nvar ac=ca.unstable_scheduleCallback,bc=ca.unstable_cancelCallback,cc=ca.unstable_shouldYield,dc=ca.unstable_requestPaint,B=ca.unstable_now,ec=ca.unstable_getCurrentPriorityLevel,fc=ca.unstable_ImmediatePriority,gc=ca.unstable_UserBlockingPriority,hc=ca.unstable_NormalPriority,ic=ca.unstable_LowPriority,jc=ca.unstable_IdlePriority,kc=null,lc=null;function mc(a){if(lc&&\"function\"===typeof lc.onCommitFiberRoot)try{lc.onCommitFiberRoot(kc,a,void 0,128===(a.current.flags&128))}catch(b){}}\nvar oc=Math.clz32?Math.clz32:nc,pc=Math.log,qc=Math.LN2;function nc(a){a>>>=0;return 0===a?32:31-(pc(a)/qc|0)|0}var rc=64,sc=4194304;\nfunction tc(a){switch(a&-a){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return a&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return a&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;\ndefault:return a}}function uc(a,b){var c=a.pendingLanes;if(0===c)return 0;var d=0,e=a.suspendedLanes,f=a.pingedLanes,g=c&268435455;if(0!==g){var h=g&~e;0!==h?d=tc(h):(f&=g,0!==f&&(d=tc(f)))}else g=c&~e,0!==g?d=tc(g):0!==f&&(d=tc(f));if(0===d)return 0;if(0!==b&&b!==d&&0===(b&e)&&(e=d&-d,f=b&-b,e>=f||16===e&&0!==(f&4194240)))return b;0!==(d&4)&&(d|=c&16);b=a.entangledLanes;if(0!==b)for(a=a.entanglements,b&=d;0<b;)c=31-oc(b),e=1<<c,d|=a[c],b&=~e;return d}\nfunction vc(a,b){switch(a){case 1:case 2:case 4:return b+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return b+5E3;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return-1;case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}\nfunction wc(a,b){for(var c=a.suspendedLanes,d=a.pingedLanes,e=a.expirationTimes,f=a.pendingLanes;0<f;){var g=31-oc(f),h=1<<g,k=e[g];if(-1===k){if(0===(h&c)||0!==(h&d))e[g]=vc(h,b)}else k<=b&&(a.expiredLanes|=h);f&=~h}}function xc(a){a=a.pendingLanes&-1073741825;return 0!==a?a:a&1073741824?1073741824:0}function yc(){var a=rc;rc<<=1;0===(rc&4194240)&&(rc=64);return a}function zc(a){for(var b=[],c=0;31>c;c++)b.push(a);return b}\nfunction Ac(a,b,c){a.pendingLanes|=b;536870912!==b&&(a.suspendedLanes=0,a.pingedLanes=0);a=a.eventTimes;b=31-oc(b);a[b]=c}function Bc(a,b){var c=a.pendingLanes&~b;a.pendingLanes=b;a.suspendedLanes=0;a.pingedLanes=0;a.expiredLanes&=b;a.mutableReadLanes&=b;a.entangledLanes&=b;b=a.entanglements;var d=a.eventTimes;for(a=a.expirationTimes;0<c;){var e=31-oc(c),f=1<<e;b[e]=0;d[e]=-1;a[e]=-1;c&=~f}}\nfunction Cc(a,b){var c=a.entangledLanes|=b;for(a=a.entanglements;c;){var d=31-oc(c),e=1<<d;e&b|a[d]&b&&(a[d]|=b);c&=~e}}var C=0;function Dc(a){a&=-a;return 1<a?4<a?0!==(a&268435455)?16:536870912:4:1}var Ec,Fc,Gc,Hc,Ic,Jc=!1,Kc=[],Lc=null,Mc=null,Nc=null,Oc=new Map,Pc=new Map,Qc=[],Rc=\"mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit\".split(\" \");\nfunction Sc(a,b){switch(a){case \"focusin\":case \"focusout\":Lc=null;break;case \"dragenter\":case \"dragleave\":Mc=null;break;case \"mouseover\":case \"mouseout\":Nc=null;break;case \"pointerover\":case \"pointerout\":Oc.delete(b.pointerId);break;case \"gotpointercapture\":case \"lostpointercapture\":Pc.delete(b.pointerId)}}\nfunction Tc(a,b,c,d,e,f){if(null===a||a.nativeEvent!==f)return a={blockedOn:b,domEventName:c,eventSystemFlags:d,nativeEvent:f,targetContainers:[e]},null!==b&&(b=Cb(b),null!==b&&Fc(b)),a;a.eventSystemFlags|=d;b=a.targetContainers;null!==e&&-1===b.indexOf(e)&&b.push(e);return a}\nfunction Uc(a,b,c,d,e){switch(b){case \"focusin\":return Lc=Tc(Lc,a,b,c,d,e),!0;case \"dragenter\":return Mc=Tc(Mc,a,b,c,d,e),!0;case \"mouseover\":return Nc=Tc(Nc,a,b,c,d,e),!0;case \"pointerover\":var f=e.pointerId;Oc.set(f,Tc(Oc.get(f)||null,a,b,c,d,e));return!0;case \"gotpointercapture\":return f=e.pointerId,Pc.set(f,Tc(Pc.get(f)||null,a,b,c,d,e)),!0}return!1}\nfunction Vc(a){var b=Wc(a.target);if(null!==b){var c=Vb(b);if(null!==c)if(b=c.tag,13===b){if(b=Wb(c),null!==b){a.blockedOn=b;Ic(a.priority,function(){Gc(c)});return}}else if(3===b&&c.stateNode.current.memoizedState.isDehydrated){a.blockedOn=3===c.tag?c.stateNode.containerInfo:null;return}}a.blockedOn=null}\nfunction Xc(a){if(null!==a.blockedOn)return!1;for(var b=a.targetContainers;0<b.length;){var c=Yc(a.domEventName,a.eventSystemFlags,b[0],a.nativeEvent);if(null===c){c=a.nativeEvent;var d=new c.constructor(c.type,c);wb=d;c.target.dispatchEvent(d);wb=null}else return b=Cb(c),null!==b&&Fc(b),a.blockedOn=c,!1;b.shift()}return!0}function Zc(a,b,c){Xc(a)&&c.delete(b)}function $c(){Jc=!1;null!==Lc&&Xc(Lc)&&(Lc=null);null!==Mc&&Xc(Mc)&&(Mc=null);null!==Nc&&Xc(Nc)&&(Nc=null);Oc.forEach(Zc);Pc.forEach(Zc)}\nfunction ad(a,b){a.blockedOn===b&&(a.blockedOn=null,Jc||(Jc=!0,ca.unstable_scheduleCallback(ca.unstable_NormalPriority,$c)))}\nfunction bd(a){function b(b){return ad(b,a)}if(0<Kc.length){ad(Kc[0],a);for(var c=1;c<Kc.length;c++){var d=Kc[c];d.blockedOn===a&&(d.blockedOn=null)}}null!==Lc&&ad(Lc,a);null!==Mc&&ad(Mc,a);null!==Nc&&ad(Nc,a);Oc.forEach(b);Pc.forEach(b);for(c=0;c<Qc.length;c++)d=Qc[c],d.blockedOn===a&&(d.blockedOn=null);for(;0<Qc.length&&(c=Qc[0],null===c.blockedOn);)Vc(c),null===c.blockedOn&&Qc.shift()}var cd=ua.ReactCurrentBatchConfig,dd=!0;\nfunction ed(a,b,c,d){var e=C,f=cd.transition;cd.transition=null;try{C=1,fd(a,b,c,d)}finally{C=e,cd.transition=f}}function gd(a,b,c,d){var e=C,f=cd.transition;cd.transition=null;try{C=4,fd(a,b,c,d)}finally{C=e,cd.transition=f}}\nfunction fd(a,b,c,d){if(dd){var e=Yc(a,b,c,d);if(null===e)hd(a,b,d,id,c),Sc(a,d);else if(Uc(e,a,b,c,d))d.stopPropagation();else if(Sc(a,d),b&4&&-1<Rc.indexOf(a)){for(;null!==e;){var f=Cb(e);null!==f&&Ec(f);f=Yc(a,b,c,d);null===f&&hd(a,b,d,id,c);if(f===e)break;e=f}null!==e&&d.stopPropagation()}else hd(a,b,d,null,c)}}var id=null;\nfunction Yc(a,b,c,d){id=null;a=xb(d);a=Wc(a);if(null!==a)if(b=Vb(a),null===b)a=null;else if(c=b.tag,13===c){a=Wb(b);if(null!==a)return a;a=null}else if(3===c){if(b.stateNode.current.memoizedState.isDehydrated)return 3===b.tag?b.stateNode.containerInfo:null;a=null}else b!==a&&(a=null);id=a;return null}\nfunction jd(a){switch(a){case \"cancel\":case \"click\":case \"close\":case \"contextmenu\":case \"copy\":case \"cut\":case \"auxclick\":case \"dblclick\":case \"dragend\":case \"dragstart\":case \"drop\":case \"focusin\":case \"focusout\":case \"input\":case \"invalid\":case \"keydown\":case \"keypress\":case \"keyup\":case \"mousedown\":case \"mouseup\":case \"paste\":case \"pause\":case \"play\":case \"pointercancel\":case \"pointerdown\":case \"pointerup\":case \"ratechange\":case \"reset\":case \"resize\":case \"seeked\":case \"submit\":case \"touchcancel\":case \"touchend\":case \"touchstart\":case \"volumechange\":case \"change\":case \"selectionchange\":case \"textInput\":case \"compositionstart\":case \"compositionend\":case \"compositionupdate\":case \"beforeblur\":case \"afterblur\":case \"beforeinput\":case \"blur\":case \"fullscreenchange\":case \"focus\":case \"hashchange\":case \"popstate\":case \"select\":case \"selectstart\":return 1;case \"drag\":case \"dragenter\":case \"dragexit\":case \"dragleave\":case \"dragover\":case \"mousemove\":case \"mouseout\":case \"mouseover\":case \"pointermove\":case \"pointerout\":case \"pointerover\":case \"scroll\":case \"toggle\":case \"touchmove\":case \"wheel\":case \"mouseenter\":case \"mouseleave\":case \"pointerenter\":case \"pointerleave\":return 4;\ncase \"message\":switch(ec()){case fc:return 1;case gc:return 4;case hc:case ic:return 16;case jc:return 536870912;default:return 16}default:return 16}}var kd=null,ld=null,md=null;function nd(){if(md)return md;var a,b=ld,c=b.length,d,e=\"value\"in kd?kd.value:kd.textContent,f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var g=c-a;for(d=1;d<=g&&b[c-d]===e[f-d];d++);return md=e.slice(a,1<d?1-d:void 0)}\nfunction od(a){var b=a.keyCode;\"charCode\"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}function pd(){return!0}function qd(){return!1}\nfunction rd(a){function b(b,d,e,f,g){this._reactName=b;this._targetInst=e;this.type=d;this.nativeEvent=f;this.target=g;this.currentTarget=null;for(var c in a)a.hasOwnProperty(c)&&(b=a[c],this[c]=b?b(f):f[c]);this.isDefaultPrevented=(null!=f.defaultPrevented?f.defaultPrevented:!1===f.returnValue)?pd:qd;this.isPropagationStopped=qd;return this}A(b.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():\"unknown\"!==typeof a.returnValue&&\n(a.returnValue=!1),this.isDefaultPrevented=pd)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():\"unknown\"!==typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=pd)},persist:function(){},isPersistent:pd});return b}\nvar sd={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(a){return a.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},td=rd(sd),ud=A({},sd,{view:0,detail:0}),vd=rd(ud),wd,xd,yd,Ad=A({},ud,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:zd,button:0,buttons:0,relatedTarget:function(a){return void 0===a.relatedTarget?a.fromElement===a.srcElement?a.toElement:a.fromElement:a.relatedTarget},movementX:function(a){if(\"movementX\"in\na)return a.movementX;a!==yd&&(yd&&\"mousemove\"===a.type?(wd=a.screenX-yd.screenX,xd=a.screenY-yd.screenY):xd=wd=0,yd=a);return wd},movementY:function(a){return\"movementY\"in a?a.movementY:xd}}),Bd=rd(Ad),Cd=A({},Ad,{dataTransfer:0}),Dd=rd(Cd),Ed=A({},ud,{relatedTarget:0}),Fd=rd(Ed),Gd=A({},sd,{animationName:0,elapsedTime:0,pseudoElement:0}),Hd=rd(Gd),Id=A({},sd,{clipboardData:function(a){return\"clipboardData\"in a?a.clipboardData:window.clipboardData}}),Jd=rd(Id),Kd=A({},sd,{data:0}),Ld=rd(Kd),Md={Esc:\"Escape\",\nSpacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},Nd={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",116:\"F5\",117:\"F6\",118:\"F7\",\n119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"},Od={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};function Pd(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=Od[a])?!!b[a]:!1}function zd(){return Pd}\nvar Qd=A({},ud,{key:function(a){if(a.key){var b=Md[a.key]||a.key;if(\"Unidentified\"!==b)return b}return\"keypress\"===a.type?(a=od(a),13===a?\"Enter\":String.fromCharCode(a)):\"keydown\"===a.type||\"keyup\"===a.type?Nd[a.keyCode]||\"Unidentified\":\"\"},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:zd,charCode:function(a){return\"keypress\"===a.type?od(a):0},keyCode:function(a){return\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0},which:function(a){return\"keypress\"===\na.type?od(a):\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0}}),Rd=rd(Qd),Sd=A({},Ad,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),Td=rd(Sd),Ud=A({},ud,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:zd}),Vd=rd(Ud),Wd=A({},sd,{propertyName:0,elapsedTime:0,pseudoElement:0}),Xd=rd(Wd),Yd=A({},Ad,{deltaX:function(a){return\"deltaX\"in a?a.deltaX:\"wheelDeltaX\"in a?-a.wheelDeltaX:0},\ndeltaY:function(a){return\"deltaY\"in a?a.deltaY:\"wheelDeltaY\"in a?-a.wheelDeltaY:\"wheelDelta\"in a?-a.wheelDelta:0},deltaZ:0,deltaMode:0}),Zd=rd(Yd),$d=[9,13,27,32],ae=ia&&\"CompositionEvent\"in window,be=null;ia&&\"documentMode\"in document&&(be=document.documentMode);var ce=ia&&\"TextEvent\"in window&&!be,de=ia&&(!ae||be&&8<be&&11>=be),ee=String.fromCharCode(32),fe=!1;\nfunction ge(a,b){switch(a){case \"keyup\":return-1!==$d.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"focusout\":return!0;default:return!1}}function he(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var ie=!1;function je(a,b){switch(a){case \"compositionend\":return he(b);case \"keypress\":if(32!==b.which)return null;fe=!0;return ee;case \"textInput\":return a=b.data,a===ee&&fe?null:a;default:return null}}\nfunction ke(a,b){if(ie)return\"compositionend\"===a||!ae&&ge(a,b)?(a=nd(),md=ld=kd=null,ie=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;case \"compositionend\":return de&&\"ko\"!==b.locale?null:b.data;default:return null}}\nvar le={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function me(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return\"input\"===b?!!le[a.type]:\"textarea\"===b?!0:!1}function ne(a,b,c,d){Eb(d);b=oe(b,\"onChange\");0<b.length&&(c=new td(\"onChange\",\"change\",null,c,d),a.push({event:c,listeners:b}))}var pe=null,qe=null;function re(a){se(a,0)}function te(a){var b=ue(a);if(Wa(b))return a}\nfunction ve(a,b){if(\"change\"===a)return b}var we=!1;if(ia){var xe;if(ia){var ye=\"oninput\"in document;if(!ye){var ze=document.createElement(\"div\");ze.setAttribute(\"oninput\",\"return;\");ye=\"function\"===typeof ze.oninput}xe=ye}else xe=!1;we=xe&&(!document.documentMode||9<document.documentMode)}function Ae(){pe&&(pe.detachEvent(\"onpropertychange\",Be),qe=pe=null)}function Be(a){if(\"value\"===a.propertyName&&te(qe)){var b=[];ne(b,qe,a,xb(a));Jb(re,b)}}\nfunction Ce(a,b,c){\"focusin\"===a?(Ae(),pe=b,qe=c,pe.attachEvent(\"onpropertychange\",Be)):\"focusout\"===a&&Ae()}function De(a){if(\"selectionchange\"===a||\"keyup\"===a||\"keydown\"===a)return te(qe)}function Ee(a,b){if(\"click\"===a)return te(b)}function Fe(a,b){if(\"input\"===a||\"change\"===a)return te(b)}function Ge(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var He=\"function\"===typeof Object.is?Object.is:Ge;\nfunction Ie(a,b){if(He(a,b))return!0;if(\"object\"!==typeof a||null===a||\"object\"!==typeof b||null===b)return!1;var c=Object.keys(a),d=Object.keys(b);if(c.length!==d.length)return!1;for(d=0;d<c.length;d++){var e=c[d];if(!ja.call(b,e)||!He(a[e],b[e]))return!1}return!0}function Je(a){for(;a&&a.firstChild;)a=a.firstChild;return a}\nfunction Ke(a,b){var c=Je(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=Je(c)}}function Le(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Le(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}\nfunction Me(){for(var a=window,b=Xa();b instanceof a.HTMLIFrameElement;){try{var c=\"string\"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=Xa(a.document)}return b}function Ne(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}\nfunction Oe(a){var b=Me(),c=a.focusedElem,d=a.selectionRange;if(b!==c&&c&&c.ownerDocument&&Le(c.ownerDocument.documentElement,c)){if(null!==d&&Ne(c))if(b=d.start,a=d.end,void 0===a&&(a=b),\"selectionStart\"in c)c.selectionStart=b,c.selectionEnd=Math.min(a,c.value.length);else if(a=(b=c.ownerDocument||document)&&b.defaultView||window,a.getSelection){a=a.getSelection();var e=c.textContent.length,f=Math.min(d.start,e);d=void 0===d.end?f:Math.min(d.end,e);!a.extend&&f>d&&(e=d,d=f,f=e);e=Ke(c,f);var g=Ke(c,\nd);e&&g&&(1!==a.rangeCount||a.anchorNode!==e.node||a.anchorOffset!==e.offset||a.focusNode!==g.node||a.focusOffset!==g.offset)&&(b=b.createRange(),b.setStart(e.node,e.offset),a.removeAllRanges(),f>d?(a.addRange(b),a.extend(g.node,g.offset)):(b.setEnd(g.node,g.offset),a.addRange(b)))}b=[];for(a=c;a=a.parentNode;)1===a.nodeType&&b.push({element:a,left:a.scrollLeft,top:a.scrollTop});\"function\"===typeof c.focus&&c.focus();for(c=0;c<b.length;c++)a=b[c],a.element.scrollLeft=a.left,a.element.scrollTop=a.top}}\nvar Pe=ia&&\"documentMode\"in document&&11>=document.documentMode,Qe=null,Re=null,Se=null,Te=!1;\nfunction Ue(a,b,c){var d=c.window===c?c.document:9===c.nodeType?c:c.ownerDocument;Te||null==Qe||Qe!==Xa(d)||(d=Qe,\"selectionStart\"in d&&Ne(d)?d={start:d.selectionStart,end:d.selectionEnd}:(d=(d.ownerDocument&&d.ownerDocument.defaultView||window).getSelection(),d={anchorNode:d.anchorNode,anchorOffset:d.anchorOffset,focusNode:d.focusNode,focusOffset:d.focusOffset}),Se&&Ie(Se,d)||(Se=d,d=oe(Re,\"onSelect\"),0<d.length&&(b=new td(\"onSelect\",\"select\",null,b,c),a.push({event:b,listeners:d}),b.target=Qe)))}\nfunction Ve(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c[\"Webkit\"+a]=\"webkit\"+b;c[\"Moz\"+a]=\"moz\"+b;return c}var We={animationend:Ve(\"Animation\",\"AnimationEnd\"),animationiteration:Ve(\"Animation\",\"AnimationIteration\"),animationstart:Ve(\"Animation\",\"AnimationStart\"),transitionend:Ve(\"Transition\",\"TransitionEnd\")},Xe={},Ye={};\nia&&(Ye=document.createElement(\"div\").style,\"AnimationEvent\"in window||(delete We.animationend.animation,delete We.animationiteration.animation,delete We.animationstart.animation),\"TransitionEvent\"in window||delete We.transitionend.transition);function Ze(a){if(Xe[a])return Xe[a];if(!We[a])return a;var b=We[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in Ye)return Xe[a]=b[c];return a}var $e=Ze(\"animationend\"),af=Ze(\"animationiteration\"),bf=Ze(\"animationstart\"),cf=Ze(\"transitionend\"),df=new Map,ef=\"abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel\".split(\" \");\nfunction ff(a,b){df.set(a,b);fa(b,[a])}for(var gf=0;gf<ef.length;gf++){var hf=ef[gf],jf=hf.toLowerCase(),kf=hf[0].toUpperCase()+hf.slice(1);ff(jf,\"on\"+kf)}ff($e,\"onAnimationEnd\");ff(af,\"onAnimationIteration\");ff(bf,\"onAnimationStart\");ff(\"dblclick\",\"onDoubleClick\");ff(\"focusin\",\"onFocus\");ff(\"focusout\",\"onBlur\");ff(cf,\"onTransitionEnd\");ha(\"onMouseEnter\",[\"mouseout\",\"mouseover\"]);ha(\"onMouseLeave\",[\"mouseout\",\"mouseover\"]);ha(\"onPointerEnter\",[\"pointerout\",\"pointerover\"]);\nha(\"onPointerLeave\",[\"pointerout\",\"pointerover\"]);fa(\"onChange\",\"change click focusin focusout input keydown keyup selectionchange\".split(\" \"));fa(\"onSelect\",\"focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange\".split(\" \"));fa(\"onBeforeInput\",[\"compositionend\",\"keypress\",\"textInput\",\"paste\"]);fa(\"onCompositionEnd\",\"compositionend focusout keydown keypress keyup mousedown\".split(\" \"));fa(\"onCompositionStart\",\"compositionstart focusout keydown keypress keyup mousedown\".split(\" \"));\nfa(\"onCompositionUpdate\",\"compositionupdate focusout keydown keypress keyup mousedown\".split(\" \"));var lf=\"abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting\".split(\" \"),mf=new Set(\"cancel close invalid load scroll toggle\".split(\" \").concat(lf));\nfunction nf(a,b,c){var d=a.type||\"unknown-event\";a.currentTarget=c;Ub(d,b,void 0,a);a.currentTarget=null}\nfunction se(a,b){b=0!==(b&4);for(var c=0;c<a.length;c++){var d=a[c],e=d.event;d=d.listeners;a:{var f=void 0;if(b)for(var g=d.length-1;0<=g;g--){var h=d[g],k=h.instance,l=h.currentTarget;h=h.listener;if(k!==f&&e.isPropagationStopped())break a;nf(e,h,l);f=k}else for(g=0;g<d.length;g++){h=d[g];k=h.instance;l=h.currentTarget;h=h.listener;if(k!==f&&e.isPropagationStopped())break a;nf(e,h,l);f=k}}}if(Qb)throw a=Rb,Qb=!1,Rb=null,a;}\nfunction D(a,b){var c=b[of];void 0===c&&(c=b[of]=new Set);var d=a+\"__bubble\";c.has(d)||(pf(b,a,2,!1),c.add(d))}function qf(a,b,c){var d=0;b&&(d|=4);pf(c,a,d,b)}var rf=\"_reactListening\"+Math.random().toString(36).slice(2);function sf(a){if(!a[rf]){a[rf]=!0;da.forEach(function(b){\"selectionchange\"!==b&&(mf.has(b)||qf(b,!1,a),qf(b,!0,a))});var b=9===a.nodeType?a:a.ownerDocument;null===b||b[rf]||(b[rf]=!0,qf(\"selectionchange\",!1,b))}}\nfunction pf(a,b,c,d){switch(jd(b)){case 1:var e=ed;break;case 4:e=gd;break;default:e=fd}c=e.bind(null,b,c,a);e=void 0;!Lb||\"touchstart\"!==b&&\"touchmove\"!==b&&\"wheel\"!==b||(e=!0);d?void 0!==e?a.addEventListener(b,c,{capture:!0,passive:e}):a.addEventListener(b,c,!0):void 0!==e?a.addEventListener(b,c,{passive:e}):a.addEventListener(b,c,!1)}\nfunction hd(a,b,c,d,e){var f=d;if(0===(b&1)&&0===(b&2)&&null!==d)a:for(;;){if(null===d)return;var g=d.tag;if(3===g||4===g){var h=d.stateNode.containerInfo;if(h===e||8===h.nodeType&&h.parentNode===e)break;if(4===g)for(g=d.return;null!==g;){var k=g.tag;if(3===k||4===k)if(k=g.stateNode.containerInfo,k===e||8===k.nodeType&&k.parentNode===e)return;g=g.return}for(;null!==h;){g=Wc(h);if(null===g)return;k=g.tag;if(5===k||6===k){d=f=g;continue a}h=h.parentNode}}d=d.return}Jb(function(){var d=f,e=xb(c),g=[];\na:{var h=df.get(a);if(void 0!==h){var k=td,n=a;switch(a){case \"keypress\":if(0===od(c))break a;case \"keydown\":case \"keyup\":k=Rd;break;case \"focusin\":n=\"focus\";k=Fd;break;case \"focusout\":n=\"blur\";k=Fd;break;case \"beforeblur\":case \"afterblur\":k=Fd;break;case \"click\":if(2===c.button)break a;case \"auxclick\":case \"dblclick\":case \"mousedown\":case \"mousemove\":case \"mouseup\":case \"mouseout\":case \"mouseover\":case \"contextmenu\":k=Bd;break;case \"drag\":case \"dragend\":case \"dragenter\":case \"dragexit\":case \"dragleave\":case \"dragover\":case \"dragstart\":case \"drop\":k=\nDd;break;case \"touchcancel\":case \"touchend\":case \"touchmove\":case \"touchstart\":k=Vd;break;case $e:case af:case bf:k=Hd;break;case cf:k=Xd;break;case \"scroll\":k=vd;break;case \"wheel\":k=Zd;break;case \"copy\":case \"cut\":case \"paste\":k=Jd;break;case \"gotpointercapture\":case \"lostpointercapture\":case \"pointercancel\":case \"pointerdown\":case \"pointermove\":case \"pointerout\":case \"pointerover\":case \"pointerup\":k=Td}var t=0!==(b&4),J=!t&&\"scroll\"===a,x=t?null!==h?h+\"Capture\":null:h;t=[];for(var w=d,u;null!==\nw;){u=w;var F=u.stateNode;5===u.tag&&null!==F&&(u=F,null!==x&&(F=Kb(w,x),null!=F&&t.push(tf(w,F,u))));if(J)break;w=w.return}0<t.length&&(h=new k(h,n,null,c,e),g.push({event:h,listeners:t}))}}if(0===(b&7)){a:{h=\"mouseover\"===a||\"pointerover\"===a;k=\"mouseout\"===a||\"pointerout\"===a;if(h&&c!==wb&&(n=c.relatedTarget||c.fromElement)&&(Wc(n)||n[uf]))break a;if(k||h){h=e.window===e?e:(h=e.ownerDocument)?h.defaultView||h.parentWindow:window;if(k){if(n=c.relatedTarget||c.toElement,k=d,n=n?Wc(n):null,null!==\nn&&(J=Vb(n),n!==J||5!==n.tag&&6!==n.tag))n=null}else k=null,n=d;if(k!==n){t=Bd;F=\"onMouseLeave\";x=\"onMouseEnter\";w=\"mouse\";if(\"pointerout\"===a||\"pointerover\"===a)t=Td,F=\"onPointerLeave\",x=\"onPointerEnter\",w=\"pointer\";J=null==k?h:ue(k);u=null==n?h:ue(n);h=new t(F,w+\"leave\",k,c,e);h.target=J;h.relatedTarget=u;F=null;Wc(e)===d&&(t=new t(x,w+\"enter\",n,c,e),t.target=u,t.relatedTarget=J,F=t);J=F;if(k&&n)b:{t=k;x=n;w=0;for(u=t;u;u=vf(u))w++;u=0;for(F=x;F;F=vf(F))u++;for(;0<w-u;)t=vf(t),w--;for(;0<u-w;)x=\nvf(x),u--;for(;w--;){if(t===x||null!==x&&t===x.alternate)break b;t=vf(t);x=vf(x)}t=null}else t=null;null!==k&&wf(g,h,k,t,!1);null!==n&&null!==J&&wf(g,J,n,t,!0)}}}a:{h=d?ue(d):window;k=h.nodeName&&h.nodeName.toLowerCase();if(\"select\"===k||\"input\"===k&&\"file\"===h.type)var na=ve;else if(me(h))if(we)na=Fe;else{na=De;var xa=Ce}else(k=h.nodeName)&&\"input\"===k.toLowerCase()&&(\"checkbox\"===h.type||\"radio\"===h.type)&&(na=Ee);if(na&&(na=na(a,d))){ne(g,na,c,e);break a}xa&&xa(a,h,d);\"focusout\"===a&&(xa=h._wrapperState)&&\nxa.controlled&&\"number\"===h.type&&cb(h,\"number\",h.value)}xa=d?ue(d):window;switch(a){case \"focusin\":if(me(xa)||\"true\"===xa.contentEditable)Qe=xa,Re=d,Se=null;break;case \"focusout\":Se=Re=Qe=null;break;case \"mousedown\":Te=!0;break;case \"contextmenu\":case \"mouseup\":case \"dragend\":Te=!1;Ue(g,c,e);break;case \"selectionchange\":if(Pe)break;case \"keydown\":case \"keyup\":Ue(g,c,e)}var $a;if(ae)b:{switch(a){case \"compositionstart\":var ba=\"onCompositionStart\";break b;case \"compositionend\":ba=\"onCompositionEnd\";\nbreak b;case \"compositionupdate\":ba=\"onCompositionUpdate\";break b}ba=void 0}else ie?ge(a,c)&&(ba=\"onCompositionEnd\"):\"keydown\"===a&&229===c.keyCode&&(ba=\"onCompositionStart\");ba&&(de&&\"ko\"!==c.locale&&(ie||\"onCompositionStart\"!==ba?\"onCompositionEnd\"===ba&&ie&&($a=nd()):(kd=e,ld=\"value\"in kd?kd.value:kd.textContent,ie=!0)),xa=oe(d,ba),0<xa.length&&(ba=new Ld(ba,a,null,c,e),g.push({event:ba,listeners:xa}),$a?ba.data=$a:($a=he(c),null!==$a&&(ba.data=$a))));if($a=ce?je(a,c):ke(a,c))d=oe(d,\"onBeforeInput\"),\n0<d.length&&(e=new Ld(\"onBeforeInput\",\"beforeinput\",null,c,e),g.push({event:e,listeners:d}),e.data=$a)}se(g,b)})}function tf(a,b,c){return{instance:a,listener:b,currentTarget:c}}function oe(a,b){for(var c=b+\"Capture\",d=[];null!==a;){var e=a,f=e.stateNode;5===e.tag&&null!==f&&(e=f,f=Kb(a,c),null!=f&&d.unshift(tf(a,f,e)),f=Kb(a,b),null!=f&&d.push(tf(a,f,e)));a=a.return}return d}function vf(a){if(null===a)return null;do a=a.return;while(a&&5!==a.tag);return a?a:null}\nfunction wf(a,b,c,d,e){for(var f=b._reactName,g=[];null!==c&&c!==d;){var h=c,k=h.alternate,l=h.stateNode;if(null!==k&&k===d)break;5===h.tag&&null!==l&&(h=l,e?(k=Kb(c,f),null!=k&&g.unshift(tf(c,k,h))):e||(k=Kb(c,f),null!=k&&g.push(tf(c,k,h))));c=c.return}0!==g.length&&a.push({event:b,listeners:g})}var xf=/\\r\\n?/g,yf=/\\u0000|\\uFFFD/g;function zf(a){return(\"string\"===typeof a?a:\"\"+a).replace(xf,\"\\n\").replace(yf,\"\")}function Af(a,b,c){b=zf(b);if(zf(a)!==b&&c)throw Error(p(425));}function Bf(){}\nvar Cf=null,Df=null;function Ef(a,b){return\"textarea\"===a||\"noscript\"===a||\"string\"===typeof b.children||\"number\"===typeof b.children||\"object\"===typeof b.dangerouslySetInnerHTML&&null!==b.dangerouslySetInnerHTML&&null!=b.dangerouslySetInnerHTML.__html}\nvar Ff=\"function\"===typeof setTimeout?setTimeout:void 0,Gf=\"function\"===typeof clearTimeout?clearTimeout:void 0,Hf=\"function\"===typeof Promise?Promise:void 0,Jf=\"function\"===typeof queueMicrotask?queueMicrotask:\"undefined\"!==typeof Hf?function(a){return Hf.resolve(null).then(a).catch(If)}:Ff;function If(a){setTimeout(function(){throw a;})}\nfunction Kf(a,b){var c=b,d=0;do{var e=c.nextSibling;a.removeChild(c);if(e&&8===e.nodeType)if(c=e.data,\"/$\"===c){if(0===d){a.removeChild(e);bd(b);return}d--}else\"$\"!==c&&\"$?\"!==c&&\"$!\"!==c||d++;c=e}while(c);bd(b)}function Lf(a){for(;null!=a;a=a.nextSibling){var b=a.nodeType;if(1===b||3===b)break;if(8===b){b=a.data;if(\"$\"===b||\"$!\"===b||\"$?\"===b)break;if(\"/$\"===b)return null}}return a}\nfunction Mf(a){a=a.previousSibling;for(var b=0;a;){if(8===a.nodeType){var c=a.data;if(\"$\"===c||\"$!\"===c||\"$?\"===c){if(0===b)return a;b--}else\"/$\"===c&&b++}a=a.previousSibling}return null}var Nf=Math.random().toString(36).slice(2),Of=\"__reactFiber$\"+Nf,Pf=\"__reactProps$\"+Nf,uf=\"__reactContainer$\"+Nf,of=\"__reactEvents$\"+Nf,Qf=\"__reactListeners$\"+Nf,Rf=\"__reactHandles$\"+Nf;\nfunction Wc(a){var b=a[Of];if(b)return b;for(var c=a.parentNode;c;){if(b=c[uf]||c[Of]){c=b.alternate;if(null!==b.child||null!==c&&null!==c.child)for(a=Mf(a);null!==a;){if(c=a[Of])return c;a=Mf(a)}return b}a=c;c=a.parentNode}return null}function Cb(a){a=a[Of]||a[uf];return!a||5!==a.tag&&6!==a.tag&&13!==a.tag&&3!==a.tag?null:a}function ue(a){if(5===a.tag||6===a.tag)return a.stateNode;throw Error(p(33));}function Db(a){return a[Pf]||null}var Sf=[],Tf=-1;function Uf(a){return{current:a}}\nfunction E(a){0>Tf||(a.current=Sf[Tf],Sf[Tf]=null,Tf--)}function G(a,b){Tf++;Sf[Tf]=a.current;a.current=b}var Vf={},H=Uf(Vf),Wf=Uf(!1),Xf=Vf;function Yf(a,b){var c=a.type.contextTypes;if(!c)return Vf;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}\nfunction Zf(a){a=a.childContextTypes;return null!==a&&void 0!==a}function $f(){E(Wf);E(H)}function ag(a,b,c){if(H.current!==Vf)throw Error(p(168));G(H,b);G(Wf,c)}function bg(a,b,c){var d=a.stateNode;b=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in b))throw Error(p(108,Ra(a)||\"Unknown\",e));return A({},c,d)}\nfunction cg(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Vf;Xf=H.current;G(H,a);G(Wf,Wf.current);return!0}function dg(a,b,c){var d=a.stateNode;if(!d)throw Error(p(169));c?(a=bg(a,b,Xf),d.__reactInternalMemoizedMergedChildContext=a,E(Wf),E(H),G(H,a)):E(Wf);G(Wf,c)}var eg=null,fg=!1,gg=!1;function hg(a){null===eg?eg=[a]:eg.push(a)}function ig(a){fg=!0;hg(a)}\nfunction jg(){if(!gg&&null!==eg){gg=!0;var a=0,b=C;try{var c=eg;for(C=1;a<c.length;a++){var d=c[a];do d=d(!0);while(null!==d)}eg=null;fg=!1}catch(e){throw null!==eg&&(eg=eg.slice(a+1)),ac(fc,jg),e;}finally{C=b,gg=!1}}return null}var kg=[],lg=0,mg=null,ng=0,og=[],pg=0,qg=null,rg=1,sg=\"\";function tg(a,b){kg[lg++]=ng;kg[lg++]=mg;mg=a;ng=b}\nfunction ug(a,b,c){og[pg++]=rg;og[pg++]=sg;og[pg++]=qg;qg=a;var d=rg;a=sg;var e=32-oc(d)-1;d&=~(1<<e);c+=1;var f=32-oc(b)+e;if(30<f){var g=e-e%5;f=(d&(1<<g)-1).toString(32);d>>=g;e-=g;rg=1<<32-oc(b)+e|c<<e|d;sg=f+a}else rg=1<<f|c<<e|d,sg=a}function vg(a){null!==a.return&&(tg(a,1),ug(a,1,0))}function wg(a){for(;a===mg;)mg=kg[--lg],kg[lg]=null,ng=kg[--lg],kg[lg]=null;for(;a===qg;)qg=og[--pg],og[pg]=null,sg=og[--pg],og[pg]=null,rg=og[--pg],og[pg]=null}var xg=null,yg=null,I=!1,zg=null;\nfunction Ag(a,b){var c=Bg(5,null,null,0);c.elementType=\"DELETED\";c.stateNode=b;c.return=a;b=a.deletions;null===b?(a.deletions=[c],a.flags|=16):b.push(c)}\nfunction Cg(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,xg=a,yg=Lf(b.firstChild),!0):!1;case 6:return b=\"\"===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,xg=a,yg=null,!0):!1;case 13:return b=8!==b.nodeType?null:b,null!==b?(c=null!==qg?{id:rg,overflow:sg}:null,a.memoizedState={dehydrated:b,treeContext:c,retryLane:1073741824},c=Bg(18,null,null,0),c.stateNode=b,c.return=a,a.child=c,xg=a,yg=\nnull,!0):!1;default:return!1}}function Dg(a){return 0!==(a.mode&1)&&0===(a.flags&128)}function Eg(a){if(I){var b=yg;if(b){var c=b;if(!Cg(a,b)){if(Dg(a))throw Error(p(418));b=Lf(c.nextSibling);var d=xg;b&&Cg(a,b)?Ag(d,c):(a.flags=a.flags&-4097|2,I=!1,xg=a)}}else{if(Dg(a))throw Error(p(418));a.flags=a.flags&-4097|2;I=!1;xg=a}}}function Fg(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&13!==a.tag;)a=a.return;xg=a}\nfunction Gg(a){if(a!==xg)return!1;if(!I)return Fg(a),I=!0,!1;var b;(b=3!==a.tag)&&!(b=5!==a.tag)&&(b=a.type,b=\"head\"!==b&&\"body\"!==b&&!Ef(a.type,a.memoizedProps));if(b&&(b=yg)){if(Dg(a))throw Hg(),Error(p(418));for(;b;)Ag(a,b),b=Lf(b.nextSibling)}Fg(a);if(13===a.tag){a=a.memoizedState;a=null!==a?a.dehydrated:null;if(!a)throw Error(p(317));a:{a=a.nextSibling;for(b=0;a;){if(8===a.nodeType){var c=a.data;if(\"/$\"===c){if(0===b){yg=Lf(a.nextSibling);break a}b--}else\"$\"!==c&&\"$!\"!==c&&\"$?\"!==c||b++}a=a.nextSibling}yg=\nnull}}else yg=xg?Lf(a.stateNode.nextSibling):null;return!0}function Hg(){for(var a=yg;a;)a=Lf(a.nextSibling)}function Ig(){yg=xg=null;I=!1}function Jg(a){null===zg?zg=[a]:zg.push(a)}var Kg=ua.ReactCurrentBatchConfig;\nfunction Lg(a,b,c){a=c.ref;if(null!==a&&\"function\"!==typeof a&&\"object\"!==typeof a){if(c._owner){c=c._owner;if(c){if(1!==c.tag)throw Error(p(309));var d=c.stateNode}if(!d)throw Error(p(147,a));var e=d,f=\"\"+a;if(null!==b&&null!==b.ref&&\"function\"===typeof b.ref&&b.ref._stringRef===f)return b.ref;b=function(a){var b=e.refs;null===a?delete b[f]:b[f]=a};b._stringRef=f;return b}if(\"string\"!==typeof a)throw Error(p(284));if(!c._owner)throw Error(p(290,a));}return a}\nfunction Mg(a,b){a=Object.prototype.toString.call(b);throw Error(p(31,\"[object Object]\"===a?\"object with keys {\"+Object.keys(b).join(\", \")+\"}\":a));}function Ng(a){var b=a._init;return b(a._payload)}\nfunction Og(a){function b(b,c){if(a){var d=b.deletions;null===d?(b.deletions=[c],b.flags|=16):d.push(c)}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b){a=Pg(a,b);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return b.flags|=1048576,c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.flags|=2,c):d;b.flags|=2;return c}function g(b){a&&\nnull===b.alternate&&(b.flags|=2);return b}function h(a,b,c,d){if(null===b||6!==b.tag)return b=Qg(c,a.mode,d),b.return=a,b;b=e(b,c);b.return=a;return b}function k(a,b,c,d){var f=c.type;if(f===ya)return m(a,b,c.props.children,d,c.key);if(null!==b&&(b.elementType===f||\"object\"===typeof f&&null!==f&&f.$$typeof===Ha&&Ng(f)===b.type))return d=e(b,c.props),d.ref=Lg(a,b,c),d.return=a,d;d=Rg(c.type,c.key,c.props,null,a.mode,d);d.ref=Lg(a,b,c);d.return=a;return d}function l(a,b,c,d){if(null===b||4!==b.tag||\nb.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==c.implementation)return b=Sg(c,a.mode,d),b.return=a,b;b=e(b,c.children||[]);b.return=a;return b}function m(a,b,c,d,f){if(null===b||7!==b.tag)return b=Tg(c,a.mode,d,f),b.return=a,b;b=e(b,c);b.return=a;return b}function q(a,b,c){if(\"string\"===typeof b&&\"\"!==b||\"number\"===typeof b)return b=Qg(\"\"+b,a.mode,c),b.return=a,b;if(\"object\"===typeof b&&null!==b){switch(b.$$typeof){case va:return c=Rg(b.type,b.key,b.props,null,a.mode,c),\nc.ref=Lg(a,null,b),c.return=a,c;case wa:return b=Sg(b,a.mode,c),b.return=a,b;case Ha:var d=b._init;return q(a,d(b._payload),c)}if(eb(b)||Ka(b))return b=Tg(b,a.mode,c,null),b.return=a,b;Mg(a,b)}return null}function r(a,b,c,d){var e=null!==b?b.key:null;if(\"string\"===typeof c&&\"\"!==c||\"number\"===typeof c)return null!==e?null:h(a,b,\"\"+c,d);if(\"object\"===typeof c&&null!==c){switch(c.$$typeof){case va:return c.key===e?k(a,b,c,d):null;case wa:return c.key===e?l(a,b,c,d):null;case Ha:return e=c._init,r(a,\nb,e(c._payload),d)}if(eb(c)||Ka(c))return null!==e?null:m(a,b,c,d,null);Mg(a,c)}return null}function y(a,b,c,d,e){if(\"string\"===typeof d&&\"\"!==d||\"number\"===typeof d)return a=a.get(c)||null,h(b,a,\"\"+d,e);if(\"object\"===typeof d&&null!==d){switch(d.$$typeof){case va:return a=a.get(null===d.key?c:d.key)||null,k(b,a,d,e);case wa:return a=a.get(null===d.key?c:d.key)||null,l(b,a,d,e);case Ha:var f=d._init;return y(a,b,c,f(d._payload),e)}if(eb(d)||Ka(d))return a=a.get(c)||null,m(b,a,d,e,null);Mg(b,d)}return null}\nfunction n(e,g,h,k){for(var l=null,m=null,u=g,w=g=0,x=null;null!==u&&w<h.length;w++){u.index>w?(x=u,u=null):x=u.sibling;var n=r(e,u,h[w],k);if(null===n){null===u&&(u=x);break}a&&u&&null===n.alternate&&b(e,u);g=f(n,g,w);null===m?l=n:m.sibling=n;m=n;u=x}if(w===h.length)return c(e,u),I&&tg(e,w),l;if(null===u){for(;w<h.length;w++)u=q(e,h[w],k),null!==u&&(g=f(u,g,w),null===m?l=u:m.sibling=u,m=u);I&&tg(e,w);return l}for(u=d(e,u);w<h.length;w++)x=y(u,e,w,h[w],k),null!==x&&(a&&null!==x.alternate&&u.delete(null===\nx.key?w:x.key),g=f(x,g,w),null===m?l=x:m.sibling=x,m=x);a&&u.forEach(function(a){return b(e,a)});I&&tg(e,w);return l}function t(e,g,h,k){var l=Ka(h);if(\"function\"!==typeof l)throw Error(p(150));h=l.call(h);if(null==h)throw Error(p(151));for(var u=l=null,m=g,w=g=0,x=null,n=h.next();null!==m&&!n.done;w++,n=h.next()){m.index>w?(x=m,m=null):x=m.sibling;var t=r(e,m,n.value,k);if(null===t){null===m&&(m=x);break}a&&m&&null===t.alternate&&b(e,m);g=f(t,g,w);null===u?l=t:u.sibling=t;u=t;m=x}if(n.done)return c(e,\nm),I&&tg(e,w),l;if(null===m){for(;!n.done;w++,n=h.next())n=q(e,n.value,k),null!==n&&(g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);I&&tg(e,w);return l}for(m=d(e,m);!n.done;w++,n=h.next())n=y(m,e,w,n.value,k),null!==n&&(a&&null!==n.alternate&&m.delete(null===n.key?w:n.key),g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);a&&m.forEach(function(a){return b(e,a)});I&&tg(e,w);return l}function J(a,d,f,h){\"object\"===typeof f&&null!==f&&f.type===ya&&null===f.key&&(f=f.props.children);if(\"object\"===typeof f&&null!==f){switch(f.$$typeof){case va:a:{for(var k=\nf.key,l=d;null!==l;){if(l.key===k){k=f.type;if(k===ya){if(7===l.tag){c(a,l.sibling);d=e(l,f.props.children);d.return=a;a=d;break a}}else if(l.elementType===k||\"object\"===typeof k&&null!==k&&k.$$typeof===Ha&&Ng(k)===l.type){c(a,l.sibling);d=e(l,f.props);d.ref=Lg(a,l,f);d.return=a;a=d;break a}c(a,l);break}else b(a,l);l=l.sibling}f.type===ya?(d=Tg(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Rg(f.type,f.key,f.props,null,a.mode,h),h.ref=Lg(a,d,f),h.return=a,a=h)}return g(a);case wa:a:{for(l=f.key;null!==\nd;){if(d.key===l)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=Sg(f,a.mode,h);d.return=a;a=d}return g(a);case Ha:return l=f._init,J(a,d,l(f._payload),h)}if(eb(f))return n(a,d,f,h);if(Ka(f))return t(a,d,f,h);Mg(a,f)}return\"string\"===typeof f&&\"\"!==f||\"number\"===typeof f?(f=\"\"+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):\n(c(a,d),d=Qg(f,a.mode,h),d.return=a,a=d),g(a)):c(a,d)}return J}var Ug=Og(!0),Vg=Og(!1),Wg=Uf(null),Xg=null,Yg=null,Zg=null;function $g(){Zg=Yg=Xg=null}function ah(a){var b=Wg.current;E(Wg);a._currentValue=b}function bh(a,b,c){for(;null!==a;){var d=a.alternate;(a.childLanes&b)!==b?(a.childLanes|=b,null!==d&&(d.childLanes|=b)):null!==d&&(d.childLanes&b)!==b&&(d.childLanes|=b);if(a===c)break;a=a.return}}\nfunction ch(a,b){Xg=a;Zg=Yg=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(0!==(a.lanes&b)&&(dh=!0),a.firstContext=null)}function eh(a){var b=a._currentValue;if(Zg!==a)if(a={context:a,memoizedValue:b,next:null},null===Yg){if(null===Xg)throw Error(p(308));Yg=a;Xg.dependencies={lanes:0,firstContext:a}}else Yg=Yg.next=a;return b}var fh=null;function gh(a){null===fh?fh=[a]:fh.push(a)}\nfunction hh(a,b,c,d){var e=b.interleaved;null===e?(c.next=c,gh(b)):(c.next=e.next,e.next=c);b.interleaved=c;return ih(a,d)}function ih(a,b){a.lanes|=b;var c=a.alternate;null!==c&&(c.lanes|=b);c=a;for(a=a.return;null!==a;)a.childLanes|=b,c=a.alternate,null!==c&&(c.childLanes|=b),c=a,a=a.return;return 3===c.tag?c.stateNode:null}var jh=!1;function kh(a){a.updateQueue={baseState:a.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}\nfunction lh(a,b){a=a.updateQueue;b.updateQueue===a&&(b.updateQueue={baseState:a.baseState,firstBaseUpdate:a.firstBaseUpdate,lastBaseUpdate:a.lastBaseUpdate,shared:a.shared,effects:a.effects})}function mh(a,b){return{eventTime:a,lane:b,tag:0,payload:null,callback:null,next:null}}\nfunction nh(a,b,c){var d=a.updateQueue;if(null===d)return null;d=d.shared;if(0!==(K&2)){var e=d.pending;null===e?b.next=b:(b.next=e.next,e.next=b);d.pending=b;return ih(a,c)}e=d.interleaved;null===e?(b.next=b,gh(d)):(b.next=e.next,e.next=b);d.interleaved=b;return ih(a,c)}function oh(a,b,c){b=b.updateQueue;if(null!==b&&(b=b.shared,0!==(c&4194240))){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nfunction ph(a,b){var c=a.updateQueue,d=a.alternate;if(null!==d&&(d=d.updateQueue,c===d)){var e=null,f=null;c=c.firstBaseUpdate;if(null!==c){do{var g={eventTime:c.eventTime,lane:c.lane,tag:c.tag,payload:c.payload,callback:c.callback,next:null};null===f?e=f=g:f=f.next=g;c=c.next}while(null!==c);null===f?e=f=b:f=f.next=b}else e=f=b;c={baseState:d.baseState,firstBaseUpdate:e,lastBaseUpdate:f,shared:d.shared,effects:d.effects};a.updateQueue=c;return}a=c.lastBaseUpdate;null===a?c.firstBaseUpdate=b:a.next=\nb;c.lastBaseUpdate=b}\nfunction qh(a,b,c,d){var e=a.updateQueue;jh=!1;var f=e.firstBaseUpdate,g=e.lastBaseUpdate,h=e.shared.pending;if(null!==h){e.shared.pending=null;var k=h,l=k.next;k.next=null;null===g?f=l:g.next=l;g=k;var m=a.alternate;null!==m&&(m=m.updateQueue,h=m.lastBaseUpdate,h!==g&&(null===h?m.firstBaseUpdate=l:h.next=l,m.lastBaseUpdate=k))}if(null!==f){var q=e.baseState;g=0;m=l=k=null;h=f;do{var r=h.lane,y=h.eventTime;if((d&r)===r){null!==m&&(m=m.next={eventTime:y,lane:0,tag:h.tag,payload:h.payload,callback:h.callback,\nnext:null});a:{var n=a,t=h;r=b;y=c;switch(t.tag){case 1:n=t.payload;if(\"function\"===typeof n){q=n.call(y,q,r);break a}q=n;break a;case 3:n.flags=n.flags&-65537|128;case 0:n=t.payload;r=\"function\"===typeof n?n.call(y,q,r):n;if(null===r||void 0===r)break a;q=A({},q,r);break a;case 2:jh=!0}}null!==h.callback&&0!==h.lane&&(a.flags|=64,r=e.effects,null===r?e.effects=[h]:r.push(h))}else y={eventTime:y,lane:r,tag:h.tag,payload:h.payload,callback:h.callback,next:null},null===m?(l=m=y,k=q):m=m.next=y,g|=r;\nh=h.next;if(null===h)if(h=e.shared.pending,null===h)break;else r=h,h=r.next,r.next=null,e.lastBaseUpdate=r,e.shared.pending=null}while(1);null===m&&(k=q);e.baseState=k;e.firstBaseUpdate=l;e.lastBaseUpdate=m;b=e.shared.interleaved;if(null!==b){e=b;do g|=e.lane,e=e.next;while(e!==b)}else null===f&&(e.shared.lanes=0);rh|=g;a.lanes=g;a.memoizedState=q}}\nfunction sh(a,b,c){a=b.effects;b.effects=null;if(null!==a)for(b=0;b<a.length;b++){var d=a[b],e=d.callback;if(null!==e){d.callback=null;d=c;if(\"function\"!==typeof e)throw Error(p(191,e));e.call(d)}}}var th={},uh=Uf(th),vh=Uf(th),wh=Uf(th);function xh(a){if(a===th)throw Error(p(174));return a}\nfunction yh(a,b){G(wh,b);G(vh,a);G(uh,th);a=b.nodeType;switch(a){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:lb(null,\"\");break;default:a=8===a?b.parentNode:b,b=a.namespaceURI||null,a=a.tagName,b=lb(b,a)}E(uh);G(uh,b)}function zh(){E(uh);E(vh);E(wh)}function Ah(a){xh(wh.current);var b=xh(uh.current);var c=lb(b,a.type);b!==c&&(G(vh,a),G(uh,c))}function Bh(a){vh.current===a&&(E(uh),E(vh))}var L=Uf(0);\nfunction Ch(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||\"$?\"===c.data||\"$!\"===c.data))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.flags&128))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}return null}var Dh=[];\nfunction Eh(){for(var a=0;a<Dh.length;a++)Dh[a]._workInProgressVersionPrimary=null;Dh.length=0}var Fh=ua.ReactCurrentDispatcher,Gh=ua.ReactCurrentBatchConfig,Hh=0,M=null,N=null,O=null,Ih=!1,Jh=!1,Kh=0,Lh=0;function P(){throw Error(p(321));}function Mh(a,b){if(null===b)return!1;for(var c=0;c<b.length&&c<a.length;c++)if(!He(a[c],b[c]))return!1;return!0}\nfunction Nh(a,b,c,d,e,f){Hh=f;M=b;b.memoizedState=null;b.updateQueue=null;b.lanes=0;Fh.current=null===a||null===a.memoizedState?Oh:Ph;a=c(d,e);if(Jh){f=0;do{Jh=!1;Kh=0;if(25<=f)throw Error(p(301));f+=1;O=N=null;b.updateQueue=null;Fh.current=Qh;a=c(d,e)}while(Jh)}Fh.current=Rh;b=null!==N&&null!==N.next;Hh=0;O=N=M=null;Ih=!1;if(b)throw Error(p(300));return a}function Sh(){var a=0!==Kh;Kh=0;return a}\nfunction Th(){var a={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};null===O?M.memoizedState=O=a:O=O.next=a;return O}function Uh(){if(null===N){var a=M.alternate;a=null!==a?a.memoizedState:null}else a=N.next;var b=null===O?M.memoizedState:O.next;if(null!==b)O=b,N=a;else{if(null===a)throw Error(p(310));N=a;a={memoizedState:N.memoizedState,baseState:N.baseState,baseQueue:N.baseQueue,queue:N.queue,next:null};null===O?M.memoizedState=O=a:O=O.next=a}return O}\nfunction Vh(a,b){return\"function\"===typeof b?b(a):b}\nfunction Wh(a){var b=Uh(),c=b.queue;if(null===c)throw Error(p(311));c.lastRenderedReducer=a;var d=N,e=d.baseQueue,f=c.pending;if(null!==f){if(null!==e){var g=e.next;e.next=f.next;f.next=g}d.baseQueue=e=f;c.pending=null}if(null!==e){f=e.next;d=d.baseState;var h=g=null,k=null,l=f;do{var m=l.lane;if((Hh&m)===m)null!==k&&(k=k.next={lane:0,action:l.action,hasEagerState:l.hasEagerState,eagerState:l.eagerState,next:null}),d=l.hasEagerState?l.eagerState:a(d,l.action);else{var q={lane:m,action:l.action,hasEagerState:l.hasEagerState,\neagerState:l.eagerState,next:null};null===k?(h=k=q,g=d):k=k.next=q;M.lanes|=m;rh|=m}l=l.next}while(null!==l&&l!==f);null===k?g=d:k.next=h;He(d,b.memoizedState)||(dh=!0);b.memoizedState=d;b.baseState=g;b.baseQueue=k;c.lastRenderedState=d}a=c.interleaved;if(null!==a){e=a;do f=e.lane,M.lanes|=f,rh|=f,e=e.next;while(e!==a)}else null===e&&(c.lanes=0);return[b.memoizedState,c.dispatch]}\nfunction Xh(a){var b=Uh(),c=b.queue;if(null===c)throw Error(p(311));c.lastRenderedReducer=a;var d=c.dispatch,e=c.pending,f=b.memoizedState;if(null!==e){c.pending=null;var g=e=e.next;do f=a(f,g.action),g=g.next;while(g!==e);He(f,b.memoizedState)||(dh=!0);b.memoizedState=f;null===b.baseQueue&&(b.baseState=f);c.lastRenderedState=f}return[f,d]}function Yh(){}\nfunction Zh(a,b){var c=M,d=Uh(),e=b(),f=!He(d.memoizedState,e);f&&(d.memoizedState=e,dh=!0);d=d.queue;$h(ai.bind(null,c,d,a),[a]);if(d.getSnapshot!==b||f||null!==O&&O.memoizedState.tag&1){c.flags|=2048;bi(9,ci.bind(null,c,d,e,b),void 0,null);if(null===Q)throw Error(p(349));0!==(Hh&30)||di(c,b,e)}return e}function di(a,b,c){a.flags|=16384;a={getSnapshot:b,value:c};b=M.updateQueue;null===b?(b={lastEffect:null,stores:null},M.updateQueue=b,b.stores=[a]):(c=b.stores,null===c?b.stores=[a]:c.push(a))}\nfunction ci(a,b,c,d){b.value=c;b.getSnapshot=d;ei(b)&&fi(a)}function ai(a,b,c){return c(function(){ei(b)&&fi(a)})}function ei(a){var b=a.getSnapshot;a=a.value;try{var c=b();return!He(a,c)}catch(d){return!0}}function fi(a){var b=ih(a,1);null!==b&&gi(b,a,1,-1)}\nfunction hi(a){var b=Th();\"function\"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:Vh,lastRenderedState:a};b.queue=a;a=a.dispatch=ii.bind(null,M,a);return[b.memoizedState,a]}\nfunction bi(a,b,c,d){a={tag:a,create:b,destroy:c,deps:d,next:null};b=M.updateQueue;null===b?(b={lastEffect:null,stores:null},M.updateQueue=b,b.lastEffect=a.next=a):(c=b.lastEffect,null===c?b.lastEffect=a.next=a:(d=c.next,c.next=a,a.next=d,b.lastEffect=a));return a}function ji(){return Uh().memoizedState}function ki(a,b,c,d){var e=Th();M.flags|=a;e.memoizedState=bi(1|b,c,void 0,void 0===d?null:d)}\nfunction li(a,b,c,d){var e=Uh();d=void 0===d?null:d;var f=void 0;if(null!==N){var g=N.memoizedState;f=g.destroy;if(null!==d&&Mh(d,g.deps)){e.memoizedState=bi(b,c,f,d);return}}M.flags|=a;e.memoizedState=bi(1|b,c,f,d)}function mi(a,b){return ki(8390656,8,a,b)}function $h(a,b){return li(2048,8,a,b)}function ni(a,b){return li(4,2,a,b)}function oi(a,b){return li(4,4,a,b)}\nfunction pi(a,b){if(\"function\"===typeof b)return a=a(),b(a),function(){b(null)};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null}}function qi(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return li(4,4,pi.bind(null,b,a),c)}function ri(){}function si(a,b){var c=Uh();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&Mh(b,d[1]))return d[0];c.memoizedState=[a,b];return a}\nfunction ti(a,b){var c=Uh();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&Mh(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a}function ui(a,b,c){if(0===(Hh&21))return a.baseState&&(a.baseState=!1,dh=!0),a.memoizedState=c;He(c,b)||(c=yc(),M.lanes|=c,rh|=c,a.baseState=!0);return b}function vi(a,b){var c=C;C=0!==c&&4>c?c:4;a(!0);var d=Gh.transition;Gh.transition={};try{a(!1),b()}finally{C=c,Gh.transition=d}}function wi(){return Uh().memoizedState}\nfunction xi(a,b,c){var d=yi(a);c={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(zi(a))Ai(b,c);else if(c=hh(a,b,c,d),null!==c){var e=R();gi(c,a,d,e);Bi(c,b,d)}}\nfunction ii(a,b,c){var d=yi(a),e={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(zi(a))Ai(b,e);else{var f=a.alternate;if(0===a.lanes&&(null===f||0===f.lanes)&&(f=b.lastRenderedReducer,null!==f))try{var g=b.lastRenderedState,h=f(g,c);e.hasEagerState=!0;e.eagerState=h;if(He(h,g)){var k=b.interleaved;null===k?(e.next=e,gh(b)):(e.next=k.next,k.next=e);b.interleaved=e;return}}catch(l){}finally{}c=hh(a,b,e,d);null!==c&&(e=R(),gi(c,a,d,e),Bi(c,b,d))}}\nfunction zi(a){var b=a.alternate;return a===M||null!==b&&b===M}function Ai(a,b){Jh=Ih=!0;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}function Bi(a,b,c){if(0!==(c&4194240)){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nvar Rh={readContext:eh,useCallback:P,useContext:P,useEffect:P,useImperativeHandle:P,useInsertionEffect:P,useLayoutEffect:P,useMemo:P,useReducer:P,useRef:P,useState:P,useDebugValue:P,useDeferredValue:P,useTransition:P,useMutableSource:P,useSyncExternalStore:P,useId:P,unstable_isNewReconciler:!1},Oh={readContext:eh,useCallback:function(a,b){Th().memoizedState=[a,void 0===b?null:b];return a},useContext:eh,useEffect:mi,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return ki(4194308,\n4,pi.bind(null,b,a),c)},useLayoutEffect:function(a,b){return ki(4194308,4,a,b)},useInsertionEffect:function(a,b){return ki(4,2,a,b)},useMemo:function(a,b){var c=Th();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=Th();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};d.queue=a;a=a.dispatch=xi.bind(null,M,a);return[d.memoizedState,a]},useRef:function(a){var b=\nTh();a={current:a};return b.memoizedState=a},useState:hi,useDebugValue:ri,useDeferredValue:function(a){return Th().memoizedState=a},useTransition:function(){var a=hi(!1),b=a[0];a=vi.bind(null,a[1]);Th().memoizedState=a;return[b,a]},useMutableSource:function(){},useSyncExternalStore:function(a,b,c){var d=M,e=Th();if(I){if(void 0===c)throw Error(p(407));c=c()}else{c=b();if(null===Q)throw Error(p(349));0!==(Hh&30)||di(d,b,c)}e.memoizedState=c;var f={value:c,getSnapshot:b};e.queue=f;mi(ai.bind(null,d,\nf,a),[a]);d.flags|=2048;bi(9,ci.bind(null,d,f,c,b),void 0,null);return c},useId:function(){var a=Th(),b=Q.identifierPrefix;if(I){var c=sg;var d=rg;c=(d&~(1<<32-oc(d)-1)).toString(32)+c;b=\":\"+b+\"R\"+c;c=Kh++;0<c&&(b+=\"H\"+c.toString(32));b+=\":\"}else c=Lh++,b=\":\"+b+\"r\"+c.toString(32)+\":\";return a.memoizedState=b},unstable_isNewReconciler:!1},Ph={readContext:eh,useCallback:si,useContext:eh,useEffect:$h,useImperativeHandle:qi,useInsertionEffect:ni,useLayoutEffect:oi,useMemo:ti,useReducer:Wh,useRef:ji,useState:function(){return Wh(Vh)},\nuseDebugValue:ri,useDeferredValue:function(a){var b=Uh();return ui(b,N.memoizedState,a)},useTransition:function(){var a=Wh(Vh)[0],b=Uh().memoizedState;return[a,b]},useMutableSource:Yh,useSyncExternalStore:Zh,useId:wi,unstable_isNewReconciler:!1},Qh={readContext:eh,useCallback:si,useContext:eh,useEffect:$h,useImperativeHandle:qi,useInsertionEffect:ni,useLayoutEffect:oi,useMemo:ti,useReducer:Xh,useRef:ji,useState:function(){return Xh(Vh)},useDebugValue:ri,useDeferredValue:function(a){var b=Uh();return null===\nN?b.memoizedState=a:ui(b,N.memoizedState,a)},useTransition:function(){var a=Xh(Vh)[0],b=Uh().memoizedState;return[a,b]},useMutableSource:Yh,useSyncExternalStore:Zh,useId:wi,unstable_isNewReconciler:!1};function Ci(a,b){if(a&&a.defaultProps){b=A({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c]);return b}return b}function Di(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:A({},b,c);a.memoizedState=c;0===a.lanes&&(a.updateQueue.baseState=c)}\nvar Ei={isMounted:function(a){return(a=a._reactInternals)?Vb(a)===a:!1},enqueueSetState:function(a,b,c){a=a._reactInternals;var d=R(),e=yi(a),f=mh(d,e);f.payload=b;void 0!==c&&null!==c&&(f.callback=c);b=nh(a,f,e);null!==b&&(gi(b,a,e,d),oh(b,a,e))},enqueueReplaceState:function(a,b,c){a=a._reactInternals;var d=R(),e=yi(a),f=mh(d,e);f.tag=1;f.payload=b;void 0!==c&&null!==c&&(f.callback=c);b=nh(a,f,e);null!==b&&(gi(b,a,e,d),oh(b,a,e))},enqueueForceUpdate:function(a,b){a=a._reactInternals;var c=R(),d=\nyi(a),e=mh(c,d);e.tag=2;void 0!==b&&null!==b&&(e.callback=b);b=nh(a,e,d);null!==b&&(gi(b,a,d,c),oh(b,a,d))}};function Fi(a,b,c,d,e,f,g){a=a.stateNode;return\"function\"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d,f,g):b.prototype&&b.prototype.isPureReactComponent?!Ie(c,d)||!Ie(e,f):!0}\nfunction Gi(a,b,c){var d=!1,e=Vf;var f=b.contextType;\"object\"===typeof f&&null!==f?f=eh(f):(e=Zf(b)?Xf:H.current,d=b.contextTypes,f=(d=null!==d&&void 0!==d)?Yf(a,e):Vf);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=Ei;a.stateNode=b;b._reactInternals=a;d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=e,a.__reactInternalMemoizedMaskedChildContext=f);return b}\nfunction Hi(a,b,c,d){a=b.state;\"function\"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);\"function\"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&Ei.enqueueReplaceState(b,b.state,null)}\nfunction Ii(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs={};kh(a);var f=b.contextType;\"object\"===typeof f&&null!==f?e.context=eh(f):(f=Zf(b)?Xf:H.current,e.context=Yf(a,f));e.state=a.memoizedState;f=b.getDerivedStateFromProps;\"function\"===typeof f&&(Di(a,b,f,c),e.state=a.memoizedState);\"function\"===typeof b.getDerivedStateFromProps||\"function\"===typeof e.getSnapshotBeforeUpdate||\"function\"!==typeof e.UNSAFE_componentWillMount&&\"function\"!==typeof e.componentWillMount||(b=e.state,\n\"function\"===typeof e.componentWillMount&&e.componentWillMount(),\"function\"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&Ei.enqueueReplaceState(e,e.state,null),qh(a,c,e,d),e.state=a.memoizedState);\"function\"===typeof e.componentDidMount&&(a.flags|=4194308)}function Ji(a,b){try{var c=\"\",d=b;do c+=Pa(d),d=d.return;while(d);var e=c}catch(f){e=\"\\nError generating stack: \"+f.message+\"\\n\"+f.stack}return{value:a,source:b,stack:e,digest:null}}\nfunction Ki(a,b,c){return{value:a,source:null,stack:null!=c?c:null,digest:null!=b?b:null}}function Li(a,b){try{console.error(b.value)}catch(c){setTimeout(function(){throw c;})}}var Mi=\"function\"===typeof WeakMap?WeakMap:Map;function Ni(a,b,c){c=mh(-1,c);c.tag=3;c.payload={element:null};var d=b.value;c.callback=function(){Oi||(Oi=!0,Pi=d);Li(a,b)};return c}\nfunction Qi(a,b,c){c=mh(-1,c);c.tag=3;var d=a.type.getDerivedStateFromError;if(\"function\"===typeof d){var e=b.value;c.payload=function(){return d(e)};c.callback=function(){Li(a,b)}}var f=a.stateNode;null!==f&&\"function\"===typeof f.componentDidCatch&&(c.callback=function(){Li(a,b);\"function\"!==typeof d&&(null===Ri?Ri=new Set([this]):Ri.add(this));var c=b.stack;this.componentDidCatch(b.value,{componentStack:null!==c?c:\"\"})});return c}\nfunction Si(a,b,c){var d=a.pingCache;if(null===d){d=a.pingCache=new Mi;var e=new Set;d.set(b,e)}else e=d.get(b),void 0===e&&(e=new Set,d.set(b,e));e.has(c)||(e.add(c),a=Ti.bind(null,a,b,c),b.then(a,a))}function Ui(a){do{var b;if(b=13===a.tag)b=a.memoizedState,b=null!==b?null!==b.dehydrated?!0:!1:!0;if(b)return a;a=a.return}while(null!==a);return null}\nfunction Vi(a,b,c,d,e){if(0===(a.mode&1))return a===b?a.flags|=65536:(a.flags|=128,c.flags|=131072,c.flags&=-52805,1===c.tag&&(null===c.alternate?c.tag=17:(b=mh(-1,1),b.tag=2,nh(c,b,1))),c.lanes|=1),a;a.flags|=65536;a.lanes=e;return a}var Wi=ua.ReactCurrentOwner,dh=!1;function Xi(a,b,c,d){b.child=null===a?Vg(b,null,c,d):Ug(b,a.child,c,d)}\nfunction Yi(a,b,c,d,e){c=c.render;var f=b.ref;ch(b,e);d=Nh(a,b,c,d,f,e);c=Sh();if(null!==a&&!dh)return b.updateQueue=a.updateQueue,b.flags&=-2053,a.lanes&=~e,Zi(a,b,e);I&&c&&vg(b);b.flags|=1;Xi(a,b,d,e);return b.child}\nfunction $i(a,b,c,d,e){if(null===a){var f=c.type;if(\"function\"===typeof f&&!aj(f)&&void 0===f.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=f,bj(a,b,f,d,e);a=Rg(c.type,null,d,b,b.mode,e);a.ref=b.ref;a.return=b;return b.child=a}f=a.child;if(0===(a.lanes&e)){var g=f.memoizedProps;c=c.compare;c=null!==c?c:Ie;if(c(g,d)&&a.ref===b.ref)return Zi(a,b,e)}b.flags|=1;a=Pg(f,d);a.ref=b.ref;a.return=b;return b.child=a}\nfunction bj(a,b,c,d,e){if(null!==a){var f=a.memoizedProps;if(Ie(f,d)&&a.ref===b.ref)if(dh=!1,b.pendingProps=d=f,0!==(a.lanes&e))0!==(a.flags&131072)&&(dh=!0);else return b.lanes=a.lanes,Zi(a,b,e)}return cj(a,b,c,d,e)}\nfunction dj(a,b,c){var d=b.pendingProps,e=d.children,f=null!==a?a.memoizedState:null;if(\"hidden\"===d.mode)if(0===(b.mode&1))b.memoizedState={baseLanes:0,cachePool:null,transitions:null},G(ej,fj),fj|=c;else{if(0===(c&1073741824))return a=null!==f?f.baseLanes|c:c,b.lanes=b.childLanes=1073741824,b.memoizedState={baseLanes:a,cachePool:null,transitions:null},b.updateQueue=null,G(ej,fj),fj|=a,null;b.memoizedState={baseLanes:0,cachePool:null,transitions:null};d=null!==f?f.baseLanes:c;G(ej,fj);fj|=d}else null!==\nf?(d=f.baseLanes|c,b.memoizedState=null):d=c,G(ej,fj),fj|=d;Xi(a,b,e,c);return b.child}function gj(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.flags|=512,b.flags|=2097152}function cj(a,b,c,d,e){var f=Zf(c)?Xf:H.current;f=Yf(b,f);ch(b,e);c=Nh(a,b,c,d,f,e);d=Sh();if(null!==a&&!dh)return b.updateQueue=a.updateQueue,b.flags&=-2053,a.lanes&=~e,Zi(a,b,e);I&&d&&vg(b);b.flags|=1;Xi(a,b,c,e);return b.child}\nfunction hj(a,b,c,d,e){if(Zf(c)){var f=!0;cg(b)}else f=!1;ch(b,e);if(null===b.stateNode)ij(a,b),Gi(b,c,d),Ii(b,c,d,e),d=!0;else if(null===a){var g=b.stateNode,h=b.memoizedProps;g.props=h;var k=g.context,l=c.contextType;\"object\"===typeof l&&null!==l?l=eh(l):(l=Zf(c)?Xf:H.current,l=Yf(b,l));var m=c.getDerivedStateFromProps,q=\"function\"===typeof m||\"function\"===typeof g.getSnapshotBeforeUpdate;q||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof g.componentWillReceiveProps||\n(h!==d||k!==l)&&Hi(b,g,d,l);jh=!1;var r=b.memoizedState;g.state=r;qh(b,d,g,e);k=b.memoizedState;h!==d||r!==k||Wf.current||jh?(\"function\"===typeof m&&(Di(b,c,m,d),k=b.memoizedState),(h=jh||Fi(b,c,h,d,r,k,l))?(q||\"function\"!==typeof g.UNSAFE_componentWillMount&&\"function\"!==typeof g.componentWillMount||(\"function\"===typeof g.componentWillMount&&g.componentWillMount(),\"function\"===typeof g.UNSAFE_componentWillMount&&g.UNSAFE_componentWillMount()),\"function\"===typeof g.componentDidMount&&(b.flags|=4194308)):\n(\"function\"===typeof g.componentDidMount&&(b.flags|=4194308),b.memoizedProps=d,b.memoizedState=k),g.props=d,g.state=k,g.context=l,d=h):(\"function\"===typeof g.componentDidMount&&(b.flags|=4194308),d=!1)}else{g=b.stateNode;lh(a,b);h=b.memoizedProps;l=b.type===b.elementType?h:Ci(b.type,h);g.props=l;q=b.pendingProps;r=g.context;k=c.contextType;\"object\"===typeof k&&null!==k?k=eh(k):(k=Zf(c)?Xf:H.current,k=Yf(b,k));var y=c.getDerivedStateFromProps;(m=\"function\"===typeof y||\"function\"===typeof g.getSnapshotBeforeUpdate)||\n\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof g.componentWillReceiveProps||(h!==q||r!==k)&&Hi(b,g,d,k);jh=!1;r=b.memoizedState;g.state=r;qh(b,d,g,e);var n=b.memoizedState;h!==q||r!==n||Wf.current||jh?(\"function\"===typeof y&&(Di(b,c,y,d),n=b.memoizedState),(l=jh||Fi(b,c,l,d,r,n,k)||!1)?(m||\"function\"!==typeof g.UNSAFE_componentWillUpdate&&\"function\"!==typeof g.componentWillUpdate||(\"function\"===typeof g.componentWillUpdate&&g.componentWillUpdate(d,n,k),\"function\"===typeof g.UNSAFE_componentWillUpdate&&\ng.UNSAFE_componentWillUpdate(d,n,k)),\"function\"===typeof g.componentDidUpdate&&(b.flags|=4),\"function\"===typeof g.getSnapshotBeforeUpdate&&(b.flags|=1024)):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&r===a.memoizedState||(b.flags|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&r===a.memoizedState||(b.flags|=1024),b.memoizedProps=d,b.memoizedState=n),g.props=d,g.state=n,g.context=k,d=l):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&r===\na.memoizedState||(b.flags|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&r===a.memoizedState||(b.flags|=1024),d=!1)}return jj(a,b,c,d,f,e)}\nfunction jj(a,b,c,d,e,f){gj(a,b);var g=0!==(b.flags&128);if(!d&&!g)return e&&dg(b,c,!1),Zi(a,b,f);d=b.stateNode;Wi.current=b;var h=g&&\"function\"!==typeof c.getDerivedStateFromError?null:d.render();b.flags|=1;null!==a&&g?(b.child=Ug(b,a.child,null,f),b.child=Ug(b,null,h,f)):Xi(a,b,h,f);b.memoizedState=d.state;e&&dg(b,c,!0);return b.child}function kj(a){var b=a.stateNode;b.pendingContext?ag(a,b.pendingContext,b.pendingContext!==b.context):b.context&&ag(a,b.context,!1);yh(a,b.containerInfo)}\nfunction lj(a,b,c,d,e){Ig();Jg(e);b.flags|=256;Xi(a,b,c,d);return b.child}var mj={dehydrated:null,treeContext:null,retryLane:0};function nj(a){return{baseLanes:a,cachePool:null,transitions:null}}\nfunction oj(a,b,c){var d=b.pendingProps,e=L.current,f=!1,g=0!==(b.flags&128),h;(h=g)||(h=null!==a&&null===a.memoizedState?!1:0!==(e&2));if(h)f=!0,b.flags&=-129;else if(null===a||null!==a.memoizedState)e|=1;G(L,e&1);if(null===a){Eg(b);a=b.memoizedState;if(null!==a&&(a=a.dehydrated,null!==a))return 0===(b.mode&1)?b.lanes=1:\"$!\"===a.data?b.lanes=8:b.lanes=1073741824,null;g=d.children;a=d.fallback;return f?(d=b.mode,f=b.child,g={mode:\"hidden\",children:g},0===(d&1)&&null!==f?(f.childLanes=0,f.pendingProps=\ng):f=pj(g,d,0,null),a=Tg(a,d,c,null),f.return=b,a.return=b,f.sibling=a,b.child=f,b.child.memoizedState=nj(c),b.memoizedState=mj,a):qj(b,g)}e=a.memoizedState;if(null!==e&&(h=e.dehydrated,null!==h))return rj(a,b,g,d,h,e,c);if(f){f=d.fallback;g=b.mode;e=a.child;h=e.sibling;var k={mode:\"hidden\",children:d.children};0===(g&1)&&b.child!==e?(d=b.child,d.childLanes=0,d.pendingProps=k,b.deletions=null):(d=Pg(e,k),d.subtreeFlags=e.subtreeFlags&14680064);null!==h?f=Pg(h,f):(f=Tg(f,g,c,null),f.flags|=2);f.return=\nb;d.return=b;d.sibling=f;b.child=d;d=f;f=b.child;g=a.child.memoizedState;g=null===g?nj(c):{baseLanes:g.baseLanes|c,cachePool:null,transitions:g.transitions};f.memoizedState=g;f.childLanes=a.childLanes&~c;b.memoizedState=mj;return d}f=a.child;a=f.sibling;d=Pg(f,{mode:\"visible\",children:d.children});0===(b.mode&1)&&(d.lanes=c);d.return=b;d.sibling=null;null!==a&&(c=b.deletions,null===c?(b.deletions=[a],b.flags|=16):c.push(a));b.child=d;b.memoizedState=null;return d}\nfunction qj(a,b){b=pj({mode:\"visible\",children:b},a.mode,0,null);b.return=a;return a.child=b}function sj(a,b,c,d){null!==d&&Jg(d);Ug(b,a.child,null,c);a=qj(b,b.pendingProps.children);a.flags|=2;b.memoizedState=null;return a}\nfunction rj(a,b,c,d,e,f,g){if(c){if(b.flags&256)return b.flags&=-257,d=Ki(Error(p(422))),sj(a,b,g,d);if(null!==b.memoizedState)return b.child=a.child,b.flags|=128,null;f=d.fallback;e=b.mode;d=pj({mode:\"visible\",children:d.children},e,0,null);f=Tg(f,e,g,null);f.flags|=2;d.return=b;f.return=b;d.sibling=f;b.child=d;0!==(b.mode&1)&&Ug(b,a.child,null,g);b.child.memoizedState=nj(g);b.memoizedState=mj;return f}if(0===(b.mode&1))return sj(a,b,g,null);if(\"$!\"===e.data){d=e.nextSibling&&e.nextSibling.dataset;\nif(d)var h=d.dgst;d=h;f=Error(p(419));d=Ki(f,d,void 0);return sj(a,b,g,d)}h=0!==(g&a.childLanes);if(dh||h){d=Q;if(null!==d){switch(g&-g){case 4:e=2;break;case 16:e=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:e=32;break;case 536870912:e=268435456;break;default:e=0}e=0!==(e&(d.suspendedLanes|g))?0:e;\n0!==e&&e!==f.retryLane&&(f.retryLane=e,ih(a,e),gi(d,a,e,-1))}tj();d=Ki(Error(p(421)));return sj(a,b,g,d)}if(\"$?\"===e.data)return b.flags|=128,b.child=a.child,b=uj.bind(null,a),e._reactRetry=b,null;a=f.treeContext;yg=Lf(e.nextSibling);xg=b;I=!0;zg=null;null!==a&&(og[pg++]=rg,og[pg++]=sg,og[pg++]=qg,rg=a.id,sg=a.overflow,qg=b);b=qj(b,d.children);b.flags|=4096;return b}function vj(a,b,c){a.lanes|=b;var d=a.alternate;null!==d&&(d.lanes|=b);bh(a.return,b,c)}\nfunction wj(a,b,c,d,e){var f=a.memoizedState;null===f?a.memoizedState={isBackwards:b,rendering:null,renderingStartTime:0,last:d,tail:c,tailMode:e}:(f.isBackwards=b,f.rendering=null,f.renderingStartTime=0,f.last=d,f.tail=c,f.tailMode=e)}\nfunction xj(a,b,c){var d=b.pendingProps,e=d.revealOrder,f=d.tail;Xi(a,b,d.children,c);d=L.current;if(0!==(d&2))d=d&1|2,b.flags|=128;else{if(null!==a&&0!==(a.flags&128))a:for(a=b.child;null!==a;){if(13===a.tag)null!==a.memoizedState&&vj(a,c,b);else if(19===a.tag)vj(a,c,b);else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===b)break a;for(;null===a.sibling;){if(null===a.return||a.return===b)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}d&=1}G(L,d);if(0===(b.mode&1))b.memoizedState=\nnull;else switch(e){case \"forwards\":c=b.child;for(e=null;null!==c;)a=c.alternate,null!==a&&null===Ch(a)&&(e=c),c=c.sibling;c=e;null===c?(e=b.child,b.child=null):(e=c.sibling,c.sibling=null);wj(b,!1,e,c,f);break;case \"backwards\":c=null;e=b.child;for(b.child=null;null!==e;){a=e.alternate;if(null!==a&&null===Ch(a)){b.child=e;break}a=e.sibling;e.sibling=c;c=e;e=a}wj(b,!0,c,null,f);break;case \"together\":wj(b,!1,null,null,void 0);break;default:b.memoizedState=null}return b.child}\nfunction ij(a,b){0===(b.mode&1)&&null!==a&&(a.alternate=null,b.alternate=null,b.flags|=2)}function Zi(a,b,c){null!==a&&(b.dependencies=a.dependencies);rh|=b.lanes;if(0===(c&b.childLanes))return null;if(null!==a&&b.child!==a.child)throw Error(p(153));if(null!==b.child){a=b.child;c=Pg(a,a.pendingProps);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=Pg(a,a.pendingProps),c.return=b;c.sibling=null}return b.child}\nfunction yj(a,b,c){switch(b.tag){case 3:kj(b);Ig();break;case 5:Ah(b);break;case 1:Zf(b.type)&&cg(b);break;case 4:yh(b,b.stateNode.containerInfo);break;case 10:var d=b.type._context,e=b.memoizedProps.value;G(Wg,d._currentValue);d._currentValue=e;break;case 13:d=b.memoizedState;if(null!==d){if(null!==d.dehydrated)return G(L,L.current&1),b.flags|=128,null;if(0!==(c&b.child.childLanes))return oj(a,b,c);G(L,L.current&1);a=Zi(a,b,c);return null!==a?a.sibling:null}G(L,L.current&1);break;case 19:d=0!==(c&\nb.childLanes);if(0!==(a.flags&128)){if(d)return xj(a,b,c);b.flags|=128}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null,e.lastEffect=null);G(L,L.current);if(d)break;else return null;case 22:case 23:return b.lanes=0,dj(a,b,c)}return Zi(a,b,c)}var zj,Aj,Bj,Cj;\nzj=function(a,b){for(var c=b.child;null!==c;){if(5===c.tag||6===c.tag)a.appendChild(c.stateNode);else if(4!==c.tag&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return}c.sibling.return=c.return;c=c.sibling}};Aj=function(){};\nBj=function(a,b,c,d){var e=a.memoizedProps;if(e!==d){a=b.stateNode;xh(uh.current);var f=null;switch(c){case \"input\":e=Ya(a,e);d=Ya(a,d);f=[];break;case \"select\":e=A({},e,{value:void 0});d=A({},d,{value:void 0});f=[];break;case \"textarea\":e=gb(a,e);d=gb(a,d);f=[];break;default:\"function\"!==typeof e.onClick&&\"function\"===typeof d.onClick&&(a.onclick=Bf)}ub(c,d);var g;c=null;for(l in e)if(!d.hasOwnProperty(l)&&e.hasOwnProperty(l)&&null!=e[l])if(\"style\"===l){var h=e[l];for(g in h)h.hasOwnProperty(g)&&\n(c||(c={}),c[g]=\"\")}else\"dangerouslySetInnerHTML\"!==l&&\"children\"!==l&&\"suppressContentEditableWarning\"!==l&&\"suppressHydrationWarning\"!==l&&\"autoFocus\"!==l&&(ea.hasOwnProperty(l)?f||(f=[]):(f=f||[]).push(l,null));for(l in d){var k=d[l];h=null!=e?e[l]:void 0;if(d.hasOwnProperty(l)&&k!==h&&(null!=k||null!=h))if(\"style\"===l)if(h){for(g in h)!h.hasOwnProperty(g)||k&&k.hasOwnProperty(g)||(c||(c={}),c[g]=\"\");for(g in k)k.hasOwnProperty(g)&&h[g]!==k[g]&&(c||(c={}),c[g]=k[g])}else c||(f||(f=[]),f.push(l,\nc)),c=k;else\"dangerouslySetInnerHTML\"===l?(k=k?k.__html:void 0,h=h?h.__html:void 0,null!=k&&h!==k&&(f=f||[]).push(l,k)):\"children\"===l?\"string\"!==typeof k&&\"number\"!==typeof k||(f=f||[]).push(l,\"\"+k):\"suppressContentEditableWarning\"!==l&&\"suppressHydrationWarning\"!==l&&(ea.hasOwnProperty(l)?(null!=k&&\"onScroll\"===l&&D(\"scroll\",a),f||h===k||(f=[])):(f=f||[]).push(l,k))}c&&(f=f||[]).push(\"style\",c);var l=f;if(b.updateQueue=l)b.flags|=4}};Cj=function(a,b,c,d){c!==d&&(b.flags|=4)};\nfunction Dj(a,b){if(!I)switch(a.tailMode){case \"hidden\":b=a.tail;for(var c=null;null!==b;)null!==b.alternate&&(c=b),b=b.sibling;null===c?a.tail=null:c.sibling=null;break;case \"collapsed\":c=a.tail;for(var d=null;null!==c;)null!==c.alternate&&(d=c),c=c.sibling;null===d?b||null===a.tail?a.tail=null:a.tail.sibling=null:d.sibling=null}}\nfunction S(a){var b=null!==a.alternate&&a.alternate.child===a.child,c=0,d=0;if(b)for(var e=a.child;null!==e;)c|=e.lanes|e.childLanes,d|=e.subtreeFlags&14680064,d|=e.flags&14680064,e.return=a,e=e.sibling;else for(e=a.child;null!==e;)c|=e.lanes|e.childLanes,d|=e.subtreeFlags,d|=e.flags,e.return=a,e=e.sibling;a.subtreeFlags|=d;a.childLanes=c;return b}\nfunction Ej(a,b,c){var d=b.pendingProps;wg(b);switch(b.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return S(b),null;case 1:return Zf(b.type)&&$f(),S(b),null;case 3:d=b.stateNode;zh();E(Wf);E(H);Eh();d.pendingContext&&(d.context=d.pendingContext,d.pendingContext=null);if(null===a||null===a.child)Gg(b)?b.flags|=4:null===a||a.memoizedState.isDehydrated&&0===(b.flags&256)||(b.flags|=1024,null!==zg&&(Fj(zg),zg=null));Aj(a,b);S(b);return null;case 5:Bh(b);var e=xh(wh.current);\nc=b.type;if(null!==a&&null!=b.stateNode)Bj(a,b,c,d,e),a.ref!==b.ref&&(b.flags|=512,b.flags|=2097152);else{if(!d){if(null===b.stateNode)throw Error(p(166));S(b);return null}a=xh(uh.current);if(Gg(b)){d=b.stateNode;c=b.type;var f=b.memoizedProps;d[Of]=b;d[Pf]=f;a=0!==(b.mode&1);switch(c){case \"dialog\":D(\"cancel\",d);D(\"close\",d);break;case \"iframe\":case \"object\":case \"embed\":D(\"load\",d);break;case \"video\":case \"audio\":for(e=0;e<lf.length;e++)D(lf[e],d);break;case \"source\":D(\"error\",d);break;case \"img\":case \"image\":case \"link\":D(\"error\",\nd);D(\"load\",d);break;case \"details\":D(\"toggle\",d);break;case \"input\":Za(d,f);D(\"invalid\",d);break;case \"select\":d._wrapperState={wasMultiple:!!f.multiple};D(\"invalid\",d);break;case \"textarea\":hb(d,f),D(\"invalid\",d)}ub(c,f);e=null;for(var g in f)if(f.hasOwnProperty(g)){var h=f[g];\"children\"===g?\"string\"===typeof h?d.textContent!==h&&(!0!==f.suppressHydrationWarning&&Af(d.textContent,h,a),e=[\"children\",h]):\"number\"===typeof h&&d.textContent!==\"\"+h&&(!0!==f.suppressHydrationWarning&&Af(d.textContent,\nh,a),e=[\"children\",\"\"+h]):ea.hasOwnProperty(g)&&null!=h&&\"onScroll\"===g&&D(\"scroll\",d)}switch(c){case \"input\":Va(d);db(d,f,!0);break;case \"textarea\":Va(d);jb(d);break;case \"select\":case \"option\":break;default:\"function\"===typeof f.onClick&&(d.onclick=Bf)}d=e;b.updateQueue=d;null!==d&&(b.flags|=4)}else{g=9===e.nodeType?e:e.ownerDocument;\"http://www.w3.org/1999/xhtml\"===a&&(a=kb(c));\"http://www.w3.org/1999/xhtml\"===a?\"script\"===c?(a=g.createElement(\"div\"),a.innerHTML=\"<script>\\x3c/script>\",a=a.removeChild(a.firstChild)):\n\"string\"===typeof d.is?a=g.createElement(c,{is:d.is}):(a=g.createElement(c),\"select\"===c&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,c);a[Of]=b;a[Pf]=d;zj(a,b,!1,!1);b.stateNode=a;a:{g=vb(c,d);switch(c){case \"dialog\":D(\"cancel\",a);D(\"close\",a);e=d;break;case \"iframe\":case \"object\":case \"embed\":D(\"load\",a);e=d;break;case \"video\":case \"audio\":for(e=0;e<lf.length;e++)D(lf[e],a);e=d;break;case \"source\":D(\"error\",a);e=d;break;case \"img\":case \"image\":case \"link\":D(\"error\",\na);D(\"load\",a);e=d;break;case \"details\":D(\"toggle\",a);e=d;break;case \"input\":Za(a,d);e=Ya(a,d);D(\"invalid\",a);break;case \"option\":e=d;break;case \"select\":a._wrapperState={wasMultiple:!!d.multiple};e=A({},d,{value:void 0});D(\"invalid\",a);break;case \"textarea\":hb(a,d);e=gb(a,d);D(\"invalid\",a);break;default:e=d}ub(c,e);h=e;for(f in h)if(h.hasOwnProperty(f)){var k=h[f];\"style\"===f?sb(a,k):\"dangerouslySetInnerHTML\"===f?(k=k?k.__html:void 0,null!=k&&nb(a,k)):\"children\"===f?\"string\"===typeof k?(\"textarea\"!==\nc||\"\"!==k)&&ob(a,k):\"number\"===typeof k&&ob(a,\"\"+k):\"suppressContentEditableWarning\"!==f&&\"suppressHydrationWarning\"!==f&&\"autoFocus\"!==f&&(ea.hasOwnProperty(f)?null!=k&&\"onScroll\"===f&&D(\"scroll\",a):null!=k&&ta(a,f,k,g))}switch(c){case \"input\":Va(a);db(a,d,!1);break;case \"textarea\":Va(a);jb(a);break;case \"option\":null!=d.value&&a.setAttribute(\"value\",\"\"+Sa(d.value));break;case \"select\":a.multiple=!!d.multiple;f=d.value;null!=f?fb(a,!!d.multiple,f,!1):null!=d.defaultValue&&fb(a,!!d.multiple,d.defaultValue,\n!0);break;default:\"function\"===typeof e.onClick&&(a.onclick=Bf)}switch(c){case \"button\":case \"input\":case \"select\":case \"textarea\":d=!!d.autoFocus;break a;case \"img\":d=!0;break a;default:d=!1}}d&&(b.flags|=4)}null!==b.ref&&(b.flags|=512,b.flags|=2097152)}S(b);return null;case 6:if(a&&null!=b.stateNode)Cj(a,b,a.memoizedProps,d);else{if(\"string\"!==typeof d&&null===b.stateNode)throw Error(p(166));c=xh(wh.current);xh(uh.current);if(Gg(b)){d=b.stateNode;c=b.memoizedProps;d[Of]=b;if(f=d.nodeValue!==c)if(a=\nxg,null!==a)switch(a.tag){case 3:Af(d.nodeValue,c,0!==(a.mode&1));break;case 5:!0!==a.memoizedProps.suppressHydrationWarning&&Af(d.nodeValue,c,0!==(a.mode&1))}f&&(b.flags|=4)}else d=(9===c.nodeType?c:c.ownerDocument).createTextNode(d),d[Of]=b,b.stateNode=d}S(b);return null;case 13:E(L);d=b.memoizedState;if(null===a||null!==a.memoizedState&&null!==a.memoizedState.dehydrated){if(I&&null!==yg&&0!==(b.mode&1)&&0===(b.flags&128))Hg(),Ig(),b.flags|=98560,f=!1;else if(f=Gg(b),null!==d&&null!==d.dehydrated){if(null===\na){if(!f)throw Error(p(318));f=b.memoizedState;f=null!==f?f.dehydrated:null;if(!f)throw Error(p(317));f[Of]=b}else Ig(),0===(b.flags&128)&&(b.memoizedState=null),b.flags|=4;S(b);f=!1}else null!==zg&&(Fj(zg),zg=null),f=!0;if(!f)return b.flags&65536?b:null}if(0!==(b.flags&128))return b.lanes=c,b;d=null!==d;d!==(null!==a&&null!==a.memoizedState)&&d&&(b.child.flags|=8192,0!==(b.mode&1)&&(null===a||0!==(L.current&1)?0===T&&(T=3):tj()));null!==b.updateQueue&&(b.flags|=4);S(b);return null;case 4:return zh(),\nAj(a,b),null===a&&sf(b.stateNode.containerInfo),S(b),null;case 10:return ah(b.type._context),S(b),null;case 17:return Zf(b.type)&&$f(),S(b),null;case 19:E(L);f=b.memoizedState;if(null===f)return S(b),null;d=0!==(b.flags&128);g=f.rendering;if(null===g)if(d)Dj(f,!1);else{if(0!==T||null!==a&&0!==(a.flags&128))for(a=b.child;null!==a;){g=Ch(a);if(null!==g){b.flags|=128;Dj(f,!1);d=g.updateQueue;null!==d&&(b.updateQueue=d,b.flags|=4);b.subtreeFlags=0;d=c;for(c=b.child;null!==c;)f=c,a=d,f.flags&=14680066,\ng=f.alternate,null===g?(f.childLanes=0,f.lanes=a,f.child=null,f.subtreeFlags=0,f.memoizedProps=null,f.memoizedState=null,f.updateQueue=null,f.dependencies=null,f.stateNode=null):(f.childLanes=g.childLanes,f.lanes=g.lanes,f.child=g.child,f.subtreeFlags=0,f.deletions=null,f.memoizedProps=g.memoizedProps,f.memoizedState=g.memoizedState,f.updateQueue=g.updateQueue,f.type=g.type,a=g.dependencies,f.dependencies=null===a?null:{lanes:a.lanes,firstContext:a.firstContext}),c=c.sibling;G(L,L.current&1|2);return b.child}a=\na.sibling}null!==f.tail&&B()>Gj&&(b.flags|=128,d=!0,Dj(f,!1),b.lanes=4194304)}else{if(!d)if(a=Ch(g),null!==a){if(b.flags|=128,d=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.flags|=4),Dj(f,!0),null===f.tail&&\"hidden\"===f.tailMode&&!g.alternate&&!I)return S(b),null}else 2*B()-f.renderingStartTime>Gj&&1073741824!==c&&(b.flags|=128,d=!0,Dj(f,!1),b.lanes=4194304);f.isBackwards?(g.sibling=b.child,b.child=g):(c=f.last,null!==c?c.sibling=g:b.child=g,f.last=g)}if(null!==f.tail)return b=f.tail,f.rendering=\nb,f.tail=b.sibling,f.renderingStartTime=B(),b.sibling=null,c=L.current,G(L,d?c&1|2:c&1),b;S(b);return null;case 22:case 23:return Hj(),d=null!==b.memoizedState,null!==a&&null!==a.memoizedState!==d&&(b.flags|=8192),d&&0!==(b.mode&1)?0!==(fj&1073741824)&&(S(b),b.subtreeFlags&6&&(b.flags|=8192)):S(b),null;case 24:return null;case 25:return null}throw Error(p(156,b.tag));}\nfunction Ij(a,b){wg(b);switch(b.tag){case 1:return Zf(b.type)&&$f(),a=b.flags,a&65536?(b.flags=a&-65537|128,b):null;case 3:return zh(),E(Wf),E(H),Eh(),a=b.flags,0!==(a&65536)&&0===(a&128)?(b.flags=a&-65537|128,b):null;case 5:return Bh(b),null;case 13:E(L);a=b.memoizedState;if(null!==a&&null!==a.dehydrated){if(null===b.alternate)throw Error(p(340));Ig()}a=b.flags;return a&65536?(b.flags=a&-65537|128,b):null;case 19:return E(L),null;case 4:return zh(),null;case 10:return ah(b.type._context),null;case 22:case 23:return Hj(),\nnull;case 24:return null;default:return null}}var Jj=!1,U=!1,Kj=\"function\"===typeof WeakSet?WeakSet:Set,V=null;function Lj(a,b){var c=a.ref;if(null!==c)if(\"function\"===typeof c)try{c(null)}catch(d){W(a,b,d)}else c.current=null}function Mj(a,b,c){try{c()}catch(d){W(a,b,d)}}var Nj=!1;\nfunction Oj(a,b){Cf=dd;a=Me();if(Ne(a)){if(\"selectionStart\"in a)var c={start:a.selectionStart,end:a.selectionEnd};else a:{c=(c=a.ownerDocument)&&c.defaultView||window;var d=c.getSelection&&c.getSelection();if(d&&0!==d.rangeCount){c=d.anchorNode;var e=d.anchorOffset,f=d.focusNode;d=d.focusOffset;try{c.nodeType,f.nodeType}catch(F){c=null;break a}var g=0,h=-1,k=-1,l=0,m=0,q=a,r=null;b:for(;;){for(var y;;){q!==c||0!==e&&3!==q.nodeType||(h=g+e);q!==f||0!==d&&3!==q.nodeType||(k=g+d);3===q.nodeType&&(g+=\nq.nodeValue.length);if(null===(y=q.firstChild))break;r=q;q=y}for(;;){if(q===a)break b;r===c&&++l===e&&(h=g);r===f&&++m===d&&(k=g);if(null!==(y=q.nextSibling))break;q=r;r=q.parentNode}q=y}c=-1===h||-1===k?null:{start:h,end:k}}else c=null}c=c||{start:0,end:0}}else c=null;Df={focusedElem:a,selectionRange:c};dd=!1;for(V=b;null!==V;)if(b=V,a=b.child,0!==(b.subtreeFlags&1028)&&null!==a)a.return=b,V=a;else for(;null!==V;){b=V;try{var n=b.alternate;if(0!==(b.flags&1024))switch(b.tag){case 0:case 11:case 15:break;\ncase 1:if(null!==n){var t=n.memoizedProps,J=n.memoizedState,x=b.stateNode,w=x.getSnapshotBeforeUpdate(b.elementType===b.type?t:Ci(b.type,t),J);x.__reactInternalSnapshotBeforeUpdate=w}break;case 3:var u=b.stateNode.containerInfo;1===u.nodeType?u.textContent=\"\":9===u.nodeType&&u.documentElement&&u.removeChild(u.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(p(163));}}catch(F){W(b,b.return,F)}a=b.sibling;if(null!==a){a.return=b.return;V=a;break}V=b.return}n=Nj;Nj=!1;return n}\nfunction Pj(a,b,c){var d=b.updateQueue;d=null!==d?d.lastEffect:null;if(null!==d){var e=d=d.next;do{if((e.tag&a)===a){var f=e.destroy;e.destroy=void 0;void 0!==f&&Mj(b,c,f)}e=e.next}while(e!==d)}}function Qj(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.create;c.destroy=d()}c=c.next}while(c!==b)}}function Rj(a){var b=a.ref;if(null!==b){var c=a.stateNode;switch(a.tag){case 5:a=c;break;default:a=c}\"function\"===typeof b?b(a):b.current=a}}\nfunction Sj(a){var b=a.alternate;null!==b&&(a.alternate=null,Sj(b));a.child=null;a.deletions=null;a.sibling=null;5===a.tag&&(b=a.stateNode,null!==b&&(delete b[Of],delete b[Pf],delete b[of],delete b[Qf],delete b[Rf]));a.stateNode=null;a.return=null;a.dependencies=null;a.memoizedProps=null;a.memoizedState=null;a.pendingProps=null;a.stateNode=null;a.updateQueue=null}function Tj(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction Uj(a){a:for(;;){for(;null===a.sibling;){if(null===a.return||Tj(a.return))return null;a=a.return}a.sibling.return=a.return;for(a=a.sibling;5!==a.tag&&6!==a.tag&&18!==a.tag;){if(a.flags&2)continue a;if(null===a.child||4===a.tag)continue a;else a.child.return=a,a=a.child}if(!(a.flags&2))return a.stateNode}}\nfunction Vj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=Bf));else if(4!==d&&(a=a.child,null!==a))for(Vj(a,b,c),a=a.sibling;null!==a;)Vj(a,b,c),a=a.sibling}\nfunction Wj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(Wj(a,b,c),a=a.sibling;null!==a;)Wj(a,b,c),a=a.sibling}var X=null,Xj=!1;function Yj(a,b,c){for(c=c.child;null!==c;)Zj(a,b,c),c=c.sibling}\nfunction Zj(a,b,c){if(lc&&\"function\"===typeof lc.onCommitFiberUnmount)try{lc.onCommitFiberUnmount(kc,c)}catch(h){}switch(c.tag){case 5:U||Lj(c,b);case 6:var d=X,e=Xj;X=null;Yj(a,b,c);X=d;Xj=e;null!==X&&(Xj?(a=X,c=c.stateNode,8===a.nodeType?a.parentNode.removeChild(c):a.removeChild(c)):X.removeChild(c.stateNode));break;case 18:null!==X&&(Xj?(a=X,c=c.stateNode,8===a.nodeType?Kf(a.parentNode,c):1===a.nodeType&&Kf(a,c),bd(a)):Kf(X,c.stateNode));break;case 4:d=X;e=Xj;X=c.stateNode.containerInfo;Xj=!0;\nYj(a,b,c);X=d;Xj=e;break;case 0:case 11:case 14:case 15:if(!U&&(d=c.updateQueue,null!==d&&(d=d.lastEffect,null!==d))){e=d=d.next;do{var f=e,g=f.destroy;f=f.tag;void 0!==g&&(0!==(f&2)?Mj(c,b,g):0!==(f&4)&&Mj(c,b,g));e=e.next}while(e!==d)}Yj(a,b,c);break;case 1:if(!U&&(Lj(c,b),d=c.stateNode,\"function\"===typeof d.componentWillUnmount))try{d.props=c.memoizedProps,d.state=c.memoizedState,d.componentWillUnmount()}catch(h){W(c,b,h)}Yj(a,b,c);break;case 21:Yj(a,b,c);break;case 22:c.mode&1?(U=(d=U)||null!==\nc.memoizedState,Yj(a,b,c),U=d):Yj(a,b,c);break;default:Yj(a,b,c)}}function ak(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new Kj);b.forEach(function(b){var d=bk.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}\nfunction ck(a,b){var c=b.deletions;if(null!==c)for(var d=0;d<c.length;d++){var e=c[d];try{var f=a,g=b,h=g;a:for(;null!==h;){switch(h.tag){case 5:X=h.stateNode;Xj=!1;break a;case 3:X=h.stateNode.containerInfo;Xj=!0;break a;case 4:X=h.stateNode.containerInfo;Xj=!0;break a}h=h.return}if(null===X)throw Error(p(160));Zj(f,g,e);X=null;Xj=!1;var k=e.alternate;null!==k&&(k.return=null);e.return=null}catch(l){W(e,b,l)}}if(b.subtreeFlags&12854)for(b=b.child;null!==b;)dk(b,a),b=b.sibling}\nfunction dk(a,b){var c=a.alternate,d=a.flags;switch(a.tag){case 0:case 11:case 14:case 15:ck(b,a);ek(a);if(d&4){try{Pj(3,a,a.return),Qj(3,a)}catch(t){W(a,a.return,t)}try{Pj(5,a,a.return)}catch(t){W(a,a.return,t)}}break;case 1:ck(b,a);ek(a);d&512&&null!==c&&Lj(c,c.return);break;case 5:ck(b,a);ek(a);d&512&&null!==c&&Lj(c,c.return);if(a.flags&32){var e=a.stateNode;try{ob(e,\"\")}catch(t){W(a,a.return,t)}}if(d&4&&(e=a.stateNode,null!=e)){var f=a.memoizedProps,g=null!==c?c.memoizedProps:f,h=a.type,k=a.updateQueue;\na.updateQueue=null;if(null!==k)try{\"input\"===h&&\"radio\"===f.type&&null!=f.name&&ab(e,f);vb(h,g);var l=vb(h,f);for(g=0;g<k.length;g+=2){var m=k[g],q=k[g+1];\"style\"===m?sb(e,q):\"dangerouslySetInnerHTML\"===m?nb(e,q):\"children\"===m?ob(e,q):ta(e,m,q,l)}switch(h){case \"input\":bb(e,f);break;case \"textarea\":ib(e,f);break;case \"select\":var r=e._wrapperState.wasMultiple;e._wrapperState.wasMultiple=!!f.multiple;var y=f.value;null!=y?fb(e,!!f.multiple,y,!1):r!==!!f.multiple&&(null!=f.defaultValue?fb(e,!!f.multiple,\nf.defaultValue,!0):fb(e,!!f.multiple,f.multiple?[]:\"\",!1))}e[Pf]=f}catch(t){W(a,a.return,t)}}break;case 6:ck(b,a);ek(a);if(d&4){if(null===a.stateNode)throw Error(p(162));e=a.stateNode;f=a.memoizedProps;try{e.nodeValue=f}catch(t){W(a,a.return,t)}}break;case 3:ck(b,a);ek(a);if(d&4&&null!==c&&c.memoizedState.isDehydrated)try{bd(b.containerInfo)}catch(t){W(a,a.return,t)}break;case 4:ck(b,a);ek(a);break;case 13:ck(b,a);ek(a);e=a.child;e.flags&8192&&(f=null!==e.memoizedState,e.stateNode.isHidden=f,!f||\nnull!==e.alternate&&null!==e.alternate.memoizedState||(fk=B()));d&4&&ak(a);break;case 22:m=null!==c&&null!==c.memoizedState;a.mode&1?(U=(l=U)||m,ck(b,a),U=l):ck(b,a);ek(a);if(d&8192){l=null!==a.memoizedState;if((a.stateNode.isHidden=l)&&!m&&0!==(a.mode&1))for(V=a,m=a.child;null!==m;){for(q=V=m;null!==V;){r=V;y=r.child;switch(r.tag){case 0:case 11:case 14:case 15:Pj(4,r,r.return);break;case 1:Lj(r,r.return);var n=r.stateNode;if(\"function\"===typeof n.componentWillUnmount){d=r;c=r.return;try{b=d,n.props=\nb.memoizedProps,n.state=b.memoizedState,n.componentWillUnmount()}catch(t){W(d,c,t)}}break;case 5:Lj(r,r.return);break;case 22:if(null!==r.memoizedState){gk(q);continue}}null!==y?(y.return=r,V=y):gk(q)}m=m.sibling}a:for(m=null,q=a;;){if(5===q.tag){if(null===m){m=q;try{e=q.stateNode,l?(f=e.style,\"function\"===typeof f.setProperty?f.setProperty(\"display\",\"none\",\"important\"):f.display=\"none\"):(h=q.stateNode,k=q.memoizedProps.style,g=void 0!==k&&null!==k&&k.hasOwnProperty(\"display\")?k.display:null,h.style.display=\nrb(\"display\",g))}catch(t){W(a,a.return,t)}}}else if(6===q.tag){if(null===m)try{q.stateNode.nodeValue=l?\"\":q.memoizedProps}catch(t){W(a,a.return,t)}}else if((22!==q.tag&&23!==q.tag||null===q.memoizedState||q===a)&&null!==q.child){q.child.return=q;q=q.child;continue}if(q===a)break a;for(;null===q.sibling;){if(null===q.return||q.return===a)break a;m===q&&(m=null);q=q.return}m===q&&(m=null);q.sibling.return=q.return;q=q.sibling}}break;case 19:ck(b,a);ek(a);d&4&&ak(a);break;case 21:break;default:ck(b,\na),ek(a)}}function ek(a){var b=a.flags;if(b&2){try{a:{for(var c=a.return;null!==c;){if(Tj(c)){var d=c;break a}c=c.return}throw Error(p(160));}switch(d.tag){case 5:var e=d.stateNode;d.flags&32&&(ob(e,\"\"),d.flags&=-33);var f=Uj(a);Wj(a,f,e);break;case 3:case 4:var g=d.stateNode.containerInfo,h=Uj(a);Vj(a,h,g);break;default:throw Error(p(161));}}catch(k){W(a,a.return,k)}a.flags&=-3}b&4096&&(a.flags&=-4097)}function hk(a,b,c){V=a;ik(a,b,c)}\nfunction ik(a,b,c){for(var d=0!==(a.mode&1);null!==V;){var e=V,f=e.child;if(22===e.tag&&d){var g=null!==e.memoizedState||Jj;if(!g){var h=e.alternate,k=null!==h&&null!==h.memoizedState||U;h=Jj;var l=U;Jj=g;if((U=k)&&!l)for(V=e;null!==V;)g=V,k=g.child,22===g.tag&&null!==g.memoizedState?jk(e):null!==k?(k.return=g,V=k):jk(e);for(;null!==f;)V=f,ik(f,b,c),f=f.sibling;V=e;Jj=h;U=l}kk(a,b,c)}else 0!==(e.subtreeFlags&8772)&&null!==f?(f.return=e,V=f):kk(a,b,c)}}\nfunction kk(a){for(;null!==V;){var b=V;if(0!==(b.flags&8772)){var c=b.alternate;try{if(0!==(b.flags&8772))switch(b.tag){case 0:case 11:case 15:U||Qj(5,b);break;case 1:var d=b.stateNode;if(b.flags&4&&!U)if(null===c)d.componentDidMount();else{var e=b.elementType===b.type?c.memoizedProps:Ci(b.type,c.memoizedProps);d.componentDidUpdate(e,c.memoizedState,d.__reactInternalSnapshotBeforeUpdate)}var f=b.updateQueue;null!==f&&sh(b,f,d);break;case 3:var g=b.updateQueue;if(null!==g){c=null;if(null!==b.child)switch(b.child.tag){case 5:c=\nb.child.stateNode;break;case 1:c=b.child.stateNode}sh(b,g,c)}break;case 5:var h=b.stateNode;if(null===c&&b.flags&4){c=h;var k=b.memoizedProps;switch(b.type){case \"button\":case \"input\":case \"select\":case \"textarea\":k.autoFocus&&c.focus();break;case \"img\":k.src&&(c.src=k.src)}}break;case 6:break;case 4:break;case 12:break;case 13:if(null===b.memoizedState){var l=b.alternate;if(null!==l){var m=l.memoizedState;if(null!==m){var q=m.dehydrated;null!==q&&bd(q)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;\ndefault:throw Error(p(163));}U||b.flags&512&&Rj(b)}catch(r){W(b,b.return,r)}}if(b===a){V=null;break}c=b.sibling;if(null!==c){c.return=b.return;V=c;break}V=b.return}}function gk(a){for(;null!==V;){var b=V;if(b===a){V=null;break}var c=b.sibling;if(null!==c){c.return=b.return;V=c;break}V=b.return}}\nfunction jk(a){for(;null!==V;){var b=V;try{switch(b.tag){case 0:case 11:case 15:var c=b.return;try{Qj(4,b)}catch(k){W(b,c,k)}break;case 1:var d=b.stateNode;if(\"function\"===typeof d.componentDidMount){var e=b.return;try{d.componentDidMount()}catch(k){W(b,e,k)}}var f=b.return;try{Rj(b)}catch(k){W(b,f,k)}break;case 5:var g=b.return;try{Rj(b)}catch(k){W(b,g,k)}}}catch(k){W(b,b.return,k)}if(b===a){V=null;break}var h=b.sibling;if(null!==h){h.return=b.return;V=h;break}V=b.return}}\nvar lk=Math.ceil,mk=ua.ReactCurrentDispatcher,nk=ua.ReactCurrentOwner,ok=ua.ReactCurrentBatchConfig,K=0,Q=null,Y=null,Z=0,fj=0,ej=Uf(0),T=0,pk=null,rh=0,qk=0,rk=0,sk=null,tk=null,fk=0,Gj=Infinity,uk=null,Oi=!1,Pi=null,Ri=null,vk=!1,wk=null,xk=0,yk=0,zk=null,Ak=-1,Bk=0;function R(){return 0!==(K&6)?B():-1!==Ak?Ak:Ak=B()}\nfunction yi(a){if(0===(a.mode&1))return 1;if(0!==(K&2)&&0!==Z)return Z&-Z;if(null!==Kg.transition)return 0===Bk&&(Bk=yc()),Bk;a=C;if(0!==a)return a;a=window.event;a=void 0===a?16:jd(a.type);return a}function gi(a,b,c,d){if(50<yk)throw yk=0,zk=null,Error(p(185));Ac(a,c,d);if(0===(K&2)||a!==Q)a===Q&&(0===(K&2)&&(qk|=c),4===T&&Ck(a,Z)),Dk(a,d),1===c&&0===K&&0===(b.mode&1)&&(Gj=B()+500,fg&&jg())}\nfunction Dk(a,b){var c=a.callbackNode;wc(a,b);var d=uc(a,a===Q?Z:0);if(0===d)null!==c&&bc(c),a.callbackNode=null,a.callbackPriority=0;else if(b=d&-d,a.callbackPriority!==b){null!=c&&bc(c);if(1===b)0===a.tag?ig(Ek.bind(null,a)):hg(Ek.bind(null,a)),Jf(function(){0===(K&6)&&jg()}),c=null;else{switch(Dc(d)){case 1:c=fc;break;case 4:c=gc;break;case 16:c=hc;break;case 536870912:c=jc;break;default:c=hc}c=Fk(c,Gk.bind(null,a))}a.callbackPriority=b;a.callbackNode=c}}\nfunction Gk(a,b){Ak=-1;Bk=0;if(0!==(K&6))throw Error(p(327));var c=a.callbackNode;if(Hk()&&a.callbackNode!==c)return null;var d=uc(a,a===Q?Z:0);if(0===d)return null;if(0!==(d&30)||0!==(d&a.expiredLanes)||b)b=Ik(a,d);else{b=d;var e=K;K|=2;var f=Jk();if(Q!==a||Z!==b)uk=null,Gj=B()+500,Kk(a,b);do try{Lk();break}catch(h){Mk(a,h)}while(1);$g();mk.current=f;K=e;null!==Y?b=0:(Q=null,Z=0,b=T)}if(0!==b){2===b&&(e=xc(a),0!==e&&(d=e,b=Nk(a,e)));if(1===b)throw c=pk,Kk(a,0),Ck(a,d),Dk(a,B()),c;if(6===b)Ck(a,d);\nelse{e=a.current.alternate;if(0===(d&30)&&!Ok(e)&&(b=Ik(a,d),2===b&&(f=xc(a),0!==f&&(d=f,b=Nk(a,f))),1===b))throw c=pk,Kk(a,0),Ck(a,d),Dk(a,B()),c;a.finishedWork=e;a.finishedLanes=d;switch(b){case 0:case 1:throw Error(p(345));case 2:Pk(a,tk,uk);break;case 3:Ck(a,d);if((d&130023424)===d&&(b=fk+500-B(),10<b)){if(0!==uc(a,0))break;e=a.suspendedLanes;if((e&d)!==d){R();a.pingedLanes|=a.suspendedLanes&e;break}a.timeoutHandle=Ff(Pk.bind(null,a,tk,uk),b);break}Pk(a,tk,uk);break;case 4:Ck(a,d);if((d&4194240)===\nd)break;b=a.eventTimes;for(e=-1;0<d;){var g=31-oc(d);f=1<<g;g=b[g];g>e&&(e=g);d&=~f}d=e;d=B()-d;d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*lk(d/1960))-d;if(10<d){a.timeoutHandle=Ff(Pk.bind(null,a,tk,uk),d);break}Pk(a,tk,uk);break;case 5:Pk(a,tk,uk);break;default:throw Error(p(329));}}}Dk(a,B());return a.callbackNode===c?Gk.bind(null,a):null}\nfunction Nk(a,b){var c=sk;a.current.memoizedState.isDehydrated&&(Kk(a,b).flags|=256);a=Ik(a,b);2!==a&&(b=tk,tk=c,null!==b&&Fj(b));return a}function Fj(a){null===tk?tk=a:tk.push.apply(tk,a)}\nfunction Ok(a){for(var b=a;;){if(b.flags&16384){var c=b.updateQueue;if(null!==c&&(c=c.stores,null!==c))for(var d=0;d<c.length;d++){var e=c[d],f=e.getSnapshot;e=e.value;try{if(!He(f(),e))return!1}catch(g){return!1}}}c=b.child;if(b.subtreeFlags&16384&&null!==c)c.return=b,b=c;else{if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return!0;b=b.return}b.sibling.return=b.return;b=b.sibling}}return!0}\nfunction Ck(a,b){b&=~rk;b&=~qk;a.suspendedLanes|=b;a.pingedLanes&=~b;for(a=a.expirationTimes;0<b;){var c=31-oc(b),d=1<<c;a[c]=-1;b&=~d}}function Ek(a){if(0!==(K&6))throw Error(p(327));Hk();var b=uc(a,0);if(0===(b&1))return Dk(a,B()),null;var c=Ik(a,b);if(0!==a.tag&&2===c){var d=xc(a);0!==d&&(b=d,c=Nk(a,d))}if(1===c)throw c=pk,Kk(a,0),Ck(a,b),Dk(a,B()),c;if(6===c)throw Error(p(345));a.finishedWork=a.current.alternate;a.finishedLanes=b;Pk(a,tk,uk);Dk(a,B());return null}\nfunction Qk(a,b){var c=K;K|=1;try{return a(b)}finally{K=c,0===K&&(Gj=B()+500,fg&&jg())}}function Rk(a){null!==wk&&0===wk.tag&&0===(K&6)&&Hk();var b=K;K|=1;var c=ok.transition,d=C;try{if(ok.transition=null,C=1,a)return a()}finally{C=d,ok.transition=c,K=b,0===(K&6)&&jg()}}function Hj(){fj=ej.current;E(ej)}\nfunction Kk(a,b){a.finishedWork=null;a.finishedLanes=0;var c=a.timeoutHandle;-1!==c&&(a.timeoutHandle=-1,Gf(c));if(null!==Y)for(c=Y.return;null!==c;){var d=c;wg(d);switch(d.tag){case 1:d=d.type.childContextTypes;null!==d&&void 0!==d&&$f();break;case 3:zh();E(Wf);E(H);Eh();break;case 5:Bh(d);break;case 4:zh();break;case 13:E(L);break;case 19:E(L);break;case 10:ah(d.type._context);break;case 22:case 23:Hj()}c=c.return}Q=a;Y=a=Pg(a.current,null);Z=fj=b;T=0;pk=null;rk=qk=rh=0;tk=sk=null;if(null!==fh){for(b=\n0;b<fh.length;b++)if(c=fh[b],d=c.interleaved,null!==d){c.interleaved=null;var e=d.next,f=c.pending;if(null!==f){var g=f.next;f.next=e;d.next=g}c.pending=d}fh=null}return a}\nfunction Mk(a,b){do{var c=Y;try{$g();Fh.current=Rh;if(Ih){for(var d=M.memoizedState;null!==d;){var e=d.queue;null!==e&&(e.pending=null);d=d.next}Ih=!1}Hh=0;O=N=M=null;Jh=!1;Kh=0;nk.current=null;if(null===c||null===c.return){T=1;pk=b;Y=null;break}a:{var f=a,g=c.return,h=c,k=b;b=Z;h.flags|=32768;if(null!==k&&\"object\"===typeof k&&\"function\"===typeof k.then){var l=k,m=h,q=m.tag;if(0===(m.mode&1)&&(0===q||11===q||15===q)){var r=m.alternate;r?(m.updateQueue=r.updateQueue,m.memoizedState=r.memoizedState,\nm.lanes=r.lanes):(m.updateQueue=null,m.memoizedState=null)}var y=Ui(g);if(null!==y){y.flags&=-257;Vi(y,g,h,f,b);y.mode&1&&Si(f,l,b);b=y;k=l;var n=b.updateQueue;if(null===n){var t=new Set;t.add(k);b.updateQueue=t}else n.add(k);break a}else{if(0===(b&1)){Si(f,l,b);tj();break a}k=Error(p(426))}}else if(I&&h.mode&1){var J=Ui(g);if(null!==J){0===(J.flags&65536)&&(J.flags|=256);Vi(J,g,h,f,b);Jg(Ji(k,h));break a}}f=k=Ji(k,h);4!==T&&(T=2);null===sk?sk=[f]:sk.push(f);f=g;do{switch(f.tag){case 3:f.flags|=65536;\nb&=-b;f.lanes|=b;var x=Ni(f,k,b);ph(f,x);break a;case 1:h=k;var w=f.type,u=f.stateNode;if(0===(f.flags&128)&&(\"function\"===typeof w.getDerivedStateFromError||null!==u&&\"function\"===typeof u.componentDidCatch&&(null===Ri||!Ri.has(u)))){f.flags|=65536;b&=-b;f.lanes|=b;var F=Qi(f,h,b);ph(f,F);break a}}f=f.return}while(null!==f)}Sk(c)}catch(na){b=na;Y===c&&null!==c&&(Y=c=c.return);continue}break}while(1)}function Jk(){var a=mk.current;mk.current=Rh;return null===a?Rh:a}\nfunction tj(){if(0===T||3===T||2===T)T=4;null===Q||0===(rh&268435455)&&0===(qk&268435455)||Ck(Q,Z)}function Ik(a,b){var c=K;K|=2;var d=Jk();if(Q!==a||Z!==b)uk=null,Kk(a,b);do try{Tk();break}catch(e){Mk(a,e)}while(1);$g();K=c;mk.current=d;if(null!==Y)throw Error(p(261));Q=null;Z=0;return T}function Tk(){for(;null!==Y;)Uk(Y)}function Lk(){for(;null!==Y&&!cc();)Uk(Y)}function Uk(a){var b=Vk(a.alternate,a,fj);a.memoizedProps=a.pendingProps;null===b?Sk(a):Y=b;nk.current=null}\nfunction Sk(a){var b=a;do{var c=b.alternate;a=b.return;if(0===(b.flags&32768)){if(c=Ej(c,b,fj),null!==c){Y=c;return}}else{c=Ij(c,b);if(null!==c){c.flags&=32767;Y=c;return}if(null!==a)a.flags|=32768,a.subtreeFlags=0,a.deletions=null;else{T=6;Y=null;return}}b=b.sibling;if(null!==b){Y=b;return}Y=b=a}while(null!==b);0===T&&(T=5)}function Pk(a,b,c){var d=C,e=ok.transition;try{ok.transition=null,C=1,Wk(a,b,c,d)}finally{ok.transition=e,C=d}return null}\nfunction Wk(a,b,c,d){do Hk();while(null!==wk);if(0!==(K&6))throw Error(p(327));c=a.finishedWork;var e=a.finishedLanes;if(null===c)return null;a.finishedWork=null;a.finishedLanes=0;if(c===a.current)throw Error(p(177));a.callbackNode=null;a.callbackPriority=0;var f=c.lanes|c.childLanes;Bc(a,f);a===Q&&(Y=Q=null,Z=0);0===(c.subtreeFlags&2064)&&0===(c.flags&2064)||vk||(vk=!0,Fk(hc,function(){Hk();return null}));f=0!==(c.flags&15990);if(0!==(c.subtreeFlags&15990)||f){f=ok.transition;ok.transition=null;\nvar g=C;C=1;var h=K;K|=4;nk.current=null;Oj(a,c);dk(c,a);Oe(Df);dd=!!Cf;Df=Cf=null;a.current=c;hk(c,a,e);dc();K=h;C=g;ok.transition=f}else a.current=c;vk&&(vk=!1,wk=a,xk=e);f=a.pendingLanes;0===f&&(Ri=null);mc(c.stateNode,d);Dk(a,B());if(null!==b)for(d=a.onRecoverableError,c=0;c<b.length;c++)e=b[c],d(e.value,{componentStack:e.stack,digest:e.digest});if(Oi)throw Oi=!1,a=Pi,Pi=null,a;0!==(xk&1)&&0!==a.tag&&Hk();f=a.pendingLanes;0!==(f&1)?a===zk?yk++:(yk=0,zk=a):yk=0;jg();return null}\nfunction Hk(){if(null!==wk){var a=Dc(xk),b=ok.transition,c=C;try{ok.transition=null;C=16>a?16:a;if(null===wk)var d=!1;else{a=wk;wk=null;xk=0;if(0!==(K&6))throw Error(p(331));var e=K;K|=4;for(V=a.current;null!==V;){var f=V,g=f.child;if(0!==(V.flags&16)){var h=f.deletions;if(null!==h){for(var k=0;k<h.length;k++){var l=h[k];for(V=l;null!==V;){var m=V;switch(m.tag){case 0:case 11:case 15:Pj(8,m,f)}var q=m.child;if(null!==q)q.return=m,V=q;else for(;null!==V;){m=V;var r=m.sibling,y=m.return;Sj(m);if(m===\nl){V=null;break}if(null!==r){r.return=y;V=r;break}V=y}}}var n=f.alternate;if(null!==n){var t=n.child;if(null!==t){n.child=null;do{var J=t.sibling;t.sibling=null;t=J}while(null!==t)}}V=f}}if(0!==(f.subtreeFlags&2064)&&null!==g)g.return=f,V=g;else b:for(;null!==V;){f=V;if(0!==(f.flags&2048))switch(f.tag){case 0:case 11:case 15:Pj(9,f,f.return)}var x=f.sibling;if(null!==x){x.return=f.return;V=x;break b}V=f.return}}var w=a.current;for(V=w;null!==V;){g=V;var u=g.child;if(0!==(g.subtreeFlags&2064)&&null!==\nu)u.return=g,V=u;else b:for(g=w;null!==V;){h=V;if(0!==(h.flags&2048))try{switch(h.tag){case 0:case 11:case 15:Qj(9,h)}}catch(na){W(h,h.return,na)}if(h===g){V=null;break b}var F=h.sibling;if(null!==F){F.return=h.return;V=F;break b}V=h.return}}K=e;jg();if(lc&&\"function\"===typeof lc.onPostCommitFiberRoot)try{lc.onPostCommitFiberRoot(kc,a)}catch(na){}d=!0}return d}finally{C=c,ok.transition=b}}return!1}function Xk(a,b,c){b=Ji(c,b);b=Ni(a,b,1);a=nh(a,b,1);b=R();null!==a&&(Ac(a,1,b),Dk(a,b))}\nfunction W(a,b,c){if(3===a.tag)Xk(a,a,c);else for(;null!==b;){if(3===b.tag){Xk(b,a,c);break}else if(1===b.tag){var d=b.stateNode;if(\"function\"===typeof b.type.getDerivedStateFromError||\"function\"===typeof d.componentDidCatch&&(null===Ri||!Ri.has(d))){a=Ji(c,a);a=Qi(b,a,1);b=nh(b,a,1);a=R();null!==b&&(Ac(b,1,a),Dk(b,a));break}}b=b.return}}\nfunction Ti(a,b,c){var d=a.pingCache;null!==d&&d.delete(b);b=R();a.pingedLanes|=a.suspendedLanes&c;Q===a&&(Z&c)===c&&(4===T||3===T&&(Z&130023424)===Z&&500>B()-fk?Kk(a,0):rk|=c);Dk(a,b)}function Yk(a,b){0===b&&(0===(a.mode&1)?b=1:(b=sc,sc<<=1,0===(sc&130023424)&&(sc=4194304)));var c=R();a=ih(a,b);null!==a&&(Ac(a,b,c),Dk(a,c))}function uj(a){var b=a.memoizedState,c=0;null!==b&&(c=b.retryLane);Yk(a,c)}\nfunction bk(a,b){var c=0;switch(a.tag){case 13:var d=a.stateNode;var e=a.memoizedState;null!==e&&(c=e.retryLane);break;case 19:d=a.stateNode;break;default:throw Error(p(314));}null!==d&&d.delete(b);Yk(a,c)}var Vk;\nVk=function(a,b,c){if(null!==a)if(a.memoizedProps!==b.pendingProps||Wf.current)dh=!0;else{if(0===(a.lanes&c)&&0===(b.flags&128))return dh=!1,yj(a,b,c);dh=0!==(a.flags&131072)?!0:!1}else dh=!1,I&&0!==(b.flags&1048576)&&ug(b,ng,b.index);b.lanes=0;switch(b.tag){case 2:var d=b.type;ij(a,b);a=b.pendingProps;var e=Yf(b,H.current);ch(b,c);e=Nh(null,b,d,a,e,c);var f=Sh();b.flags|=1;\"object\"===typeof e&&null!==e&&\"function\"===typeof e.render&&void 0===e.$$typeof?(b.tag=1,b.memoizedState=null,b.updateQueue=\nnull,Zf(d)?(f=!0,cg(b)):f=!1,b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null,kh(b),e.updater=Ei,b.stateNode=e,e._reactInternals=b,Ii(b,d,a,c),b=jj(null,b,d,!0,f,c)):(b.tag=0,I&&f&&vg(b),Xi(null,b,e,c),b=b.child);return b;case 16:d=b.elementType;a:{ij(a,b);a=b.pendingProps;e=d._init;d=e(d._payload);b.type=d;e=b.tag=Zk(d);a=Ci(d,a);switch(e){case 0:b=cj(null,b,d,a,c);break a;case 1:b=hj(null,b,d,a,c);break a;case 11:b=Yi(null,b,d,a,c);break a;case 14:b=$i(null,b,d,Ci(d.type,a),c);break a}throw Error(p(306,\nd,\"\"));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),cj(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),hj(a,b,d,e,c);case 3:a:{kj(b);if(null===a)throw Error(p(387));d=b.pendingProps;f=b.memoizedState;e=f.element;lh(a,b);qh(b,d,null,c);var g=b.memoizedState;d=g.element;if(f.isDehydrated)if(f={element:d,isDehydrated:!1,cache:g.cache,pendingSuspenseBoundaries:g.pendingSuspenseBoundaries,transitions:g.transitions},b.updateQueue.baseState=\nf,b.memoizedState=f,b.flags&256){e=Ji(Error(p(423)),b);b=lj(a,b,d,c,e);break a}else if(d!==e){e=Ji(Error(p(424)),b);b=lj(a,b,d,c,e);break a}else for(yg=Lf(b.stateNode.containerInfo.firstChild),xg=b,I=!0,zg=null,c=Vg(b,null,d,c),b.child=c;c;)c.flags=c.flags&-3|4096,c=c.sibling;else{Ig();if(d===e){b=Zi(a,b,c);break a}Xi(a,b,d,c)}b=b.child}return b;case 5:return Ah(b),null===a&&Eg(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,g=e.children,Ef(d,e)?g=null:null!==f&&Ef(d,f)&&(b.flags|=32),\ngj(a,b),Xi(a,b,g,c),b.child;case 6:return null===a&&Eg(b),null;case 13:return oj(a,b,c);case 4:return yh(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Ug(b,null,d,c):Xi(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),Yi(a,b,d,e,c);case 7:return Xi(a,b,b.pendingProps,c),b.child;case 8:return Xi(a,b,b.pendingProps.children,c),b.child;case 12:return Xi(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;f=b.memoizedProps;\ng=e.value;G(Wg,d._currentValue);d._currentValue=g;if(null!==f)if(He(f.value,g)){if(f.children===e.children&&!Wf.current){b=Zi(a,b,c);break a}}else for(f=b.child,null!==f&&(f.return=b);null!==f;){var h=f.dependencies;if(null!==h){g=f.child;for(var k=h.firstContext;null!==k;){if(k.context===d){if(1===f.tag){k=mh(-1,c&-c);k.tag=2;var l=f.updateQueue;if(null!==l){l=l.shared;var m=l.pending;null===m?k.next=k:(k.next=m.next,m.next=k);l.pending=k}}f.lanes|=c;k=f.alternate;null!==k&&(k.lanes|=c);bh(f.return,\nc,b);h.lanes|=c;break}k=k.next}}else if(10===f.tag)g=f.type===b.type?null:f.child;else if(18===f.tag){g=f.return;if(null===g)throw Error(p(341));g.lanes|=c;h=g.alternate;null!==h&&(h.lanes|=c);bh(g,c,b);g=f.sibling}else g=f.child;if(null!==g)g.return=f;else for(g=f;null!==g;){if(g===b){g=null;break}f=g.sibling;if(null!==f){f.return=g.return;g=f;break}g=g.return}f=g}Xi(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,d=b.pendingProps.children,ch(b,c),e=eh(e),d=d(e),b.flags|=1,Xi(a,b,d,c),\nb.child;case 14:return d=b.type,e=Ci(d,b.pendingProps),e=Ci(d.type,e),$i(a,b,d,e,c);case 15:return bj(a,b,b.type,b.pendingProps,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),ij(a,b),b.tag=1,Zf(d)?(a=!0,cg(b)):a=!1,ch(b,c),Gi(b,d,e),Ii(b,d,e,c),jj(null,b,d,!0,a,c);case 19:return xj(a,b,c);case 22:return dj(a,b,c)}throw Error(p(156,b.tag));};function Fk(a,b){return ac(a,b)}\nfunction $k(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.subtreeFlags=this.flags=0;this.deletions=null;this.childLanes=this.lanes=0;this.alternate=null}function Bg(a,b,c,d){return new $k(a,b,c,d)}function aj(a){a=a.prototype;return!(!a||!a.isReactComponent)}\nfunction Zk(a){if(\"function\"===typeof a)return aj(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===Da)return 11;if(a===Ga)return 14}return 2}\nfunction Pg(a,b){var c=a.alternate;null===c?(c=Bg(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.type=a.type,c.flags=0,c.subtreeFlags=0,c.deletions=null);c.flags=a.flags&14680064;c.childLanes=a.childLanes;c.lanes=a.lanes;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{lanes:b.lanes,firstContext:b.firstContext};\nc.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}\nfunction Rg(a,b,c,d,e,f){var g=2;d=a;if(\"function\"===typeof a)aj(a)&&(g=1);else if(\"string\"===typeof a)g=5;else a:switch(a){case ya:return Tg(c.children,e,f,b);case za:g=8;e|=8;break;case Aa:return a=Bg(12,c,b,e|2),a.elementType=Aa,a.lanes=f,a;case Ea:return a=Bg(13,c,b,e),a.elementType=Ea,a.lanes=f,a;case Fa:return a=Bg(19,c,b,e),a.elementType=Fa,a.lanes=f,a;case Ia:return pj(c,e,f,b);default:if(\"object\"===typeof a&&null!==a)switch(a.$$typeof){case Ba:g=10;break a;case Ca:g=9;break a;case Da:g=11;\nbreak a;case Ga:g=14;break a;case Ha:g=16;d=null;break a}throw Error(p(130,null==a?a:typeof a,\"\"));}b=Bg(g,c,b,e);b.elementType=a;b.type=d;b.lanes=f;return b}function Tg(a,b,c,d){a=Bg(7,a,d,b);a.lanes=c;return a}function pj(a,b,c,d){a=Bg(22,a,d,b);a.elementType=Ia;a.lanes=c;a.stateNode={isHidden:!1};return a}function Qg(a,b,c){a=Bg(6,a,null,b);a.lanes=c;return a}\nfunction Sg(a,b,c){b=Bg(4,null!==a.children?a.children:[],a.key,b);b.lanes=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\nfunction al(a,b,c,d,e){this.tag=b;this.containerInfo=a;this.finishedWork=this.pingCache=this.current=this.pendingChildren=null;this.timeoutHandle=-1;this.callbackNode=this.pendingContext=this.context=null;this.callbackPriority=0;this.eventTimes=zc(0);this.expirationTimes=zc(-1);this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0;this.entanglements=zc(0);this.identifierPrefix=d;this.onRecoverableError=e;this.mutableSourceEagerHydrationData=\nnull}function bl(a,b,c,d,e,f,g,h,k){a=new al(a,b,c,h,k);1===b?(b=1,!0===f&&(b|=8)):b=0;f=Bg(3,null,null,b);a.current=f;f.stateNode=a;f.memoizedState={element:d,isDehydrated:c,cache:null,transitions:null,pendingSuspenseBoundaries:null};kh(f);return a}function cl(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:wa,key:null==d?null:\"\"+d,children:a,containerInfo:b,implementation:c}}\nfunction dl(a){if(!a)return Vf;a=a._reactInternals;a:{if(Vb(a)!==a||1!==a.tag)throw Error(p(170));var b=a;do{switch(b.tag){case 3:b=b.stateNode.context;break a;case 1:if(Zf(b.type)){b=b.stateNode.__reactInternalMemoizedMergedChildContext;break a}}b=b.return}while(null!==b);throw Error(p(171));}if(1===a.tag){var c=a.type;if(Zf(c))return bg(a,c,b)}return b}\nfunction el(a,b,c,d,e,f,g,h,k){a=bl(c,d,!0,a,e,f,g,h,k);a.context=dl(null);c=a.current;d=R();e=yi(c);f=mh(d,e);f.callback=void 0!==b&&null!==b?b:null;nh(c,f,e);a.current.lanes=e;Ac(a,e,d);Dk(a,d);return a}function fl(a,b,c,d){var e=b.current,f=R(),g=yi(e);c=dl(c);null===b.context?b.context=c:b.pendingContext=c;b=mh(f,g);b.payload={element:a};d=void 0===d?null:d;null!==d&&(b.callback=d);a=nh(e,b,g);null!==a&&(gi(a,e,g,f),oh(a,e,g));return g}\nfunction gl(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function hl(a,b){a=a.memoizedState;if(null!==a&&null!==a.dehydrated){var c=a.retryLane;a.retryLane=0!==c&&c<b?c:b}}function il(a,b){hl(a,b);(a=a.alternate)&&hl(a,b)}function jl(){return null}var kl=\"function\"===typeof reportError?reportError:function(a){console.error(a)};function ll(a){this._internalRoot=a}\nml.prototype.render=ll.prototype.render=function(a){var b=this._internalRoot;if(null===b)throw Error(p(409));fl(a,b,null,null)};ml.prototype.unmount=ll.prototype.unmount=function(){var a=this._internalRoot;if(null!==a){this._internalRoot=null;var b=a.containerInfo;Rk(function(){fl(null,a,null,null)});b[uf]=null}};function ml(a){this._internalRoot=a}\nml.prototype.unstable_scheduleHydration=function(a){if(a){var b=Hc();a={blockedOn:null,target:a,priority:b};for(var c=0;c<Qc.length&&0!==b&&b<Qc[c].priority;c++);Qc.splice(c,0,a);0===c&&Vc(a)}};function nl(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType)}function ol(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||\" react-mount-point-unstable \"!==a.nodeValue))}function pl(){}\nfunction ql(a,b,c,d,e){if(e){if(\"function\"===typeof d){var f=d;d=function(){var a=gl(g);f.call(a)}}var g=el(b,d,a,0,null,!1,!1,\"\",pl);a._reactRootContainer=g;a[uf]=g.current;sf(8===a.nodeType?a.parentNode:a);Rk();return g}for(;e=a.lastChild;)a.removeChild(e);if(\"function\"===typeof d){var h=d;d=function(){var a=gl(k);h.call(a)}}var k=bl(a,0,!1,null,null,!1,!1,\"\",pl);a._reactRootContainer=k;a[uf]=k.current;sf(8===a.nodeType?a.parentNode:a);Rk(function(){fl(b,k,c,d)});return k}\nfunction rl(a,b,c,d,e){var f=c._reactRootContainer;if(f){var g=f;if(\"function\"===typeof e){var h=e;e=function(){var a=gl(g);h.call(a)}}fl(b,g,a,e)}else g=ql(c,b,a,e,d);return gl(g)}Ec=function(a){switch(a.tag){case 3:var b=a.stateNode;if(b.current.memoizedState.isDehydrated){var c=tc(b.pendingLanes);0!==c&&(Cc(b,c|1),Dk(b,B()),0===(K&6)&&(Gj=B()+500,jg()))}break;case 13:Rk(function(){var b=ih(a,1);if(null!==b){var c=R();gi(b,a,1,c)}}),il(a,1)}};\nFc=function(a){if(13===a.tag){var b=ih(a,134217728);if(null!==b){var c=R();gi(b,a,134217728,c)}il(a,134217728)}};Gc=function(a){if(13===a.tag){var b=yi(a),c=ih(a,b);if(null!==c){var d=R();gi(c,a,b,d)}il(a,b)}};Hc=function(){return C};Ic=function(a,b){var c=C;try{return C=a,b()}finally{C=c}};\nyb=function(a,b,c){switch(b){case \"input\":bb(a,c);b=c.name;if(\"radio\"===c.type&&null!=b){for(c=a;c.parentNode;)c=c.parentNode;c=c.querySelectorAll(\"input[name=\"+JSON.stringify(\"\"+b)+'][type=\"radio\"]');for(b=0;b<c.length;b++){var d=c[b];if(d!==a&&d.form===a.form){var e=Db(d);if(!e)throw Error(p(90));Wa(d);bb(d,e)}}}break;case \"textarea\":ib(a,c);break;case \"select\":b=c.value,null!=b&&fb(a,!!c.multiple,b,!1)}};Gb=Qk;Hb=Rk;\nvar sl={usingClientEntryPoint:!1,Events:[Cb,ue,Db,Eb,Fb,Qk]},tl={findFiberByHostInstance:Wc,bundleType:0,version:\"18.3.1\",rendererPackageName:\"react-dom\"};\nvar ul={bundleType:tl.bundleType,version:tl.version,rendererPackageName:tl.rendererPackageName,rendererConfig:tl.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:ua.ReactCurrentDispatcher,findHostInstanceByFiber:function(a){a=Zb(a);return null===a?null:a.stateNode},findFiberByHostInstance:tl.findFiberByHostInstance||\njl,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:\"18.3.1-next-f1338f8080-20240426\"};if(\"undefined\"!==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var vl=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!vl.isDisabled&&vl.supportsFiber)try{kc=vl.inject(ul),lc=vl}catch(a){}}exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=sl;\nexports.createPortal=function(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!nl(b))throw Error(p(200));return cl(a,b,null,c)};exports.createRoot=function(a,b){if(!nl(a))throw Error(p(299));var c=!1,d=\"\",e=kl;null!==b&&void 0!==b&&(!0===b.unstable_strictMode&&(c=!0),void 0!==b.identifierPrefix&&(d=b.identifierPrefix),void 0!==b.onRecoverableError&&(e=b.onRecoverableError));b=bl(a,1,!1,null,null,c,!1,d,e);a[uf]=b.current;sf(8===a.nodeType?a.parentNode:a);return new ll(b)};\nexports.findDOMNode=function(a){if(null==a)return null;if(1===a.nodeType)return a;var b=a._reactInternals;if(void 0===b){if(\"function\"===typeof a.render)throw Error(p(188));a=Object.keys(a).join(\",\");throw Error(p(268,a));}a=Zb(b);a=null===a?null:a.stateNode;return a};exports.flushSync=function(a){return Rk(a)};exports.hydrate=function(a,b,c){if(!ol(b))throw Error(p(200));return rl(null,a,b,!0,c)};\nexports.hydrateRoot=function(a,b,c){if(!nl(a))throw Error(p(405));var d=null!=c&&c.hydratedSources||null,e=!1,f=\"\",g=kl;null!==c&&void 0!==c&&(!0===c.unstable_strictMode&&(e=!0),void 0!==c.identifierPrefix&&(f=c.identifierPrefix),void 0!==c.onRecoverableError&&(g=c.onRecoverableError));b=el(b,null,a,1,null!=c?c:null,e,!1,f,g);a[uf]=b.current;sf(a);if(d)for(a=0;a<d.length;a++)c=d[a],e=c._getVersion,e=e(c._source),null==b.mutableSourceEagerHydrationData?b.mutableSourceEagerHydrationData=[c,e]:b.mutableSourceEagerHydrationData.push(c,\ne);return new ml(b)};exports.render=function(a,b,c){if(!ol(b))throw Error(p(200));return rl(null,a,b,!1,c)};exports.unmountComponentAtNode=function(a){if(!ol(a))throw Error(p(40));return a._reactRootContainer?(Rk(function(){rl(null,null,a,!1,function(){a._reactRootContainer=null;a[uf]=null})}),!0):!1};exports.unstable_batchedUpdates=Qk;\nexports.unstable_renderSubtreeIntoContainer=function(a,b,c,d){if(!ol(c))throw Error(p(200));if(null==a||void 0===a._reactInternals)throw Error(p(38));return rl(a,b,c,!1,d)};exports.version=\"18.3.1-next-f1338f8080-20240426\";\n","'use strict';\n\nvar m = require('react-dom');\nif (process.env.NODE_ENV === 'production') {\n  exports.createRoot = m.createRoot;\n  exports.hydrateRoot = m.hydrateRoot;\n} else {\n  var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n  exports.createRoot = function(c, o) {\n    i.usingClientEntryPoint = true;\n    try {\n      return m.createRoot(c, o);\n    } finally {\n      i.usingClientEntryPoint = false;\n    }\n  };\n  exports.hydrateRoot = function(c, h, o) {\n    i.usingClientEntryPoint = true;\n    try {\n      return m.hydrateRoot(c, h, o);\n    } finally {\n      i.usingClientEntryPoint = false;\n    }\n  };\n}\n","'use strict';\n\nfunction checkDCE() {\n  /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n  if (\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n  ) {\n    return;\n  }\n  if (process.env.NODE_ENV !== 'production') {\n    // This branch is unreachable because this function is only called\n    // in production, but the condition is true only in development.\n    // Therefore if the branch is still here, dead code elimination wasn't\n    // properly applied.\n    // Don't change the message. React DevTools relies on it. Also make sure\n    // this message doesn't occur elsewhere in this function, or it will cause\n    // a false positive.\n    throw new Error('^_^');\n  }\n  try {\n    // Verify that the code above has been dead code eliminated (DCE'd).\n    __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n  } catch (err) {\n    // DevTools shouldn't crash React, no matter what.\n    // We should still report in case we break this code.\n    console.error(err);\n  }\n}\n\nif (process.env.NODE_ENV === 'production') {\n  // DCE check should happen before ReactDOM bundle executes so that\n  // DevTools can report bad minification during injection.\n  checkDCE();\n  module.exports = require('./cjs/react-dom.production.min.js');\n} else {\n  module.exports = require('./cjs/react-dom.development.js');\n}\n","/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","/**\n * @license React\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var l=Symbol.for(\"react.element\"),n=Symbol.for(\"react.portal\"),p=Symbol.for(\"react.fragment\"),q=Symbol.for(\"react.strict_mode\"),r=Symbol.for(\"react.profiler\"),t=Symbol.for(\"react.provider\"),u=Symbol.for(\"react.context\"),v=Symbol.for(\"react.forward_ref\"),w=Symbol.for(\"react.suspense\"),x=Symbol.for(\"react.memo\"),y=Symbol.for(\"react.lazy\"),z=Symbol.iterator;function A(a){if(null===a||\"object\"!==typeof a)return null;a=z&&a[z]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}\nvar B={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},C=Object.assign,D={};function E(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}E.prototype.isReactComponent={};\nE.prototype.setState=function(a,b){if(\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a)throw Error(\"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\");this.updater.enqueueSetState(this,a,b,\"setState\")};E.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};function F(){}F.prototype=E.prototype;function G(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}var H=G.prototype=new F;\nH.constructor=G;C(H,E.prototype);H.isPureReactComponent=!0;var I=Array.isArray,J=Object.prototype.hasOwnProperty,K={current:null},L={key:!0,ref:!0,__self:!0,__source:!0};\nfunction M(a,b,e){var d,c={},k=null,h=null;if(null!=b)for(d in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(k=\"\"+b.key),b)J.call(b,d)&&!L.hasOwnProperty(d)&&(c[d]=b[d]);var g=arguments.length-2;if(1===g)c.children=e;else if(1<g){for(var f=Array(g),m=0;m<g;m++)f[m]=arguments[m+2];c.children=f}if(a&&a.defaultProps)for(d in g=a.defaultProps,g)void 0===c[d]&&(c[d]=g[d]);return{$$typeof:l,type:a,key:k,ref:h,props:c,_owner:K.current}}\nfunction N(a,b){return{$$typeof:l,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function O(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===l}function escape(a){var b={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+a.replace(/[=:]/g,function(a){return b[a]})}var P=/\\/+/g;function Q(a,b){return\"object\"===typeof a&&null!==a&&null!=a.key?escape(\"\"+a.key):b.toString(36)}\nfunction R(a,b,e,d,c){var k=typeof a;if(\"undefined\"===k||\"boolean\"===k)a=null;var h=!1;if(null===a)h=!0;else switch(k){case \"string\":case \"number\":h=!0;break;case \"object\":switch(a.$$typeof){case l:case n:h=!0}}if(h)return h=a,c=c(h),a=\"\"===d?\".\"+Q(h,0):d,I(c)?(e=\"\",null!=a&&(e=a.replace(P,\"$&/\")+\"/\"),R(c,b,e,\"\",function(a){return a})):null!=c&&(O(c)&&(c=N(c,e+(!c.key||h&&h.key===c.key?\"\":(\"\"+c.key).replace(P,\"$&/\")+\"/\")+a)),b.push(c)),1;h=0;d=\"\"===d?\".\":d+\":\";if(I(a))for(var g=0;g<a.length;g++){k=\na[g];var f=d+Q(k,g);h+=R(k,b,e,f,c)}else if(f=A(a),\"function\"===typeof f)for(a=f.call(a),g=0;!(k=a.next()).done;)k=k.value,f=d+Q(k,g++),h+=R(k,b,e,f,c);else if(\"object\"===k)throw b=String(a),Error(\"Objects are not valid as a React child (found: \"+(\"[object Object]\"===b?\"object with keys {\"+Object.keys(a).join(\", \")+\"}\":b)+\"). If you meant to render a collection of children, use an array instead.\");return h}\nfunction S(a,b,e){if(null==a)return a;var d=[],c=0;R(a,d,\"\",\"\",function(a){return b.call(e,a,c++)});return d}function T(a){if(-1===a._status){var b=a._result;b=b();b.then(function(b){if(0===a._status||-1===a._status)a._status=1,a._result=b},function(b){if(0===a._status||-1===a._status)a._status=2,a._result=b});-1===a._status&&(a._status=0,a._result=b)}if(1===a._status)return a._result.default;throw a._result;}\nvar U={current:null},V={transition:null},W={ReactCurrentDispatcher:U,ReactCurrentBatchConfig:V,ReactCurrentOwner:K};function X(){throw Error(\"act(...) is not supported in production builds of React.\");}\nexports.Children={map:S,forEach:function(a,b,e){S(a,function(){b.apply(this,arguments)},e)},count:function(a){var b=0;S(a,function(){b++});return b},toArray:function(a){return S(a,function(a){return a})||[]},only:function(a){if(!O(a))throw Error(\"React.Children.only expected to receive a single React element child.\");return a}};exports.Component=E;exports.Fragment=p;exports.Profiler=r;exports.PureComponent=G;exports.StrictMode=q;exports.Suspense=w;\nexports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=W;exports.act=X;\nexports.cloneElement=function(a,b,e){if(null===a||void 0===a)throw Error(\"React.cloneElement(...): The argument must be a React element, but you passed \"+a+\".\");var d=C({},a.props),c=a.key,k=a.ref,h=a._owner;if(null!=b){void 0!==b.ref&&(k=b.ref,h=K.current);void 0!==b.key&&(c=\"\"+b.key);if(a.type&&a.type.defaultProps)var g=a.type.defaultProps;for(f in b)J.call(b,f)&&!L.hasOwnProperty(f)&&(d[f]=void 0===b[f]&&void 0!==g?g[f]:b[f])}var f=arguments.length-2;if(1===f)d.children=e;else if(1<f){g=Array(f);\nfor(var m=0;m<f;m++)g[m]=arguments[m+2];d.children=g}return{$$typeof:l,type:a.type,key:c,ref:k,props:d,_owner:h}};exports.createContext=function(a){a={$$typeof:u,_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null};a.Provider={$$typeof:t,_context:a};return a.Consumer=a};exports.createElement=M;exports.createFactory=function(a){var b=M.bind(null,a);b.type=a;return b};exports.createRef=function(){return{current:null}};\nexports.forwardRef=function(a){return{$$typeof:v,render:a}};exports.isValidElement=O;exports.lazy=function(a){return{$$typeof:y,_payload:{_status:-1,_result:a},_init:T}};exports.memo=function(a,b){return{$$typeof:x,type:a,compare:void 0===b?null:b}};exports.startTransition=function(a){var b=V.transition;V.transition={};try{a()}finally{V.transition=b}};exports.unstable_act=X;exports.useCallback=function(a,b){return U.current.useCallback(a,b)};exports.useContext=function(a){return U.current.useContext(a)};\nexports.useDebugValue=function(){};exports.useDeferredValue=function(a){return U.current.useDeferredValue(a)};exports.useEffect=function(a,b){return U.current.useEffect(a,b)};exports.useId=function(){return U.current.useId()};exports.useImperativeHandle=function(a,b,e){return U.current.useImperativeHandle(a,b,e)};exports.useInsertionEffect=function(a,b){return U.current.useInsertionEffect(a,b)};exports.useLayoutEffect=function(a,b){return U.current.useLayoutEffect(a,b)};\nexports.useMemo=function(a,b){return U.current.useMemo(a,b)};exports.useReducer=function(a,b,e){return U.current.useReducer(a,b,e)};exports.useRef=function(a){return U.current.useRef(a)};exports.useState=function(a){return U.current.useState(a)};exports.useSyncExternalStore=function(a,b,e){return U.current.useSyncExternalStore(a,b,e)};exports.useTransition=function(){return U.current.useTransition()};exports.version=\"18.3.1\";\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/react.production.min.js');\n} else {\n  module.exports = require('./cjs/react.development.js');\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n  module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","/**\n * @license React\n * scheduler.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';function f(a,b){var c=a.length;a.push(b);a:for(;0<c;){var d=c-1>>>1,e=a[d];if(0<g(e,b))a[d]=b,a[c]=e,c=d;else break a}}function h(a){return 0===a.length?null:a[0]}function k(a){if(0===a.length)return null;var b=a[0],c=a.pop();if(c!==b){a[0]=c;a:for(var d=0,e=a.length,w=e>>>1;d<w;){var m=2*(d+1)-1,C=a[m],n=m+1,x=a[n];if(0>g(C,c))n<e&&0>g(x,C)?(a[d]=x,a[n]=c,d=n):(a[d]=C,a[m]=c,d=m);else if(n<e&&0>g(x,c))a[d]=x,a[n]=c,d=n;else break a}}return b}\nfunction g(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}if(\"object\"===typeof performance&&\"function\"===typeof performance.now){var l=performance;exports.unstable_now=function(){return l.now()}}else{var p=Date,q=p.now();exports.unstable_now=function(){return p.now()-q}}var r=[],t=[],u=1,v=null,y=3,z=!1,A=!1,B=!1,D=\"function\"===typeof setTimeout?setTimeout:null,E=\"function\"===typeof clearTimeout?clearTimeout:null,F=\"undefined\"!==typeof setImmediate?setImmediate:null;\n\"undefined\"!==typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function G(a){for(var b=h(t);null!==b;){if(null===b.callback)k(t);else if(b.startTime<=a)k(t),b.sortIndex=b.expirationTime,f(r,b);else break;b=h(t)}}function H(a){B=!1;G(a);if(!A)if(null!==h(r))A=!0,I(J);else{var b=h(t);null!==b&&K(H,b.startTime-a)}}\nfunction J(a,b){A=!1;B&&(B=!1,E(L),L=-1);z=!0;var c=y;try{G(b);for(v=h(r);null!==v&&(!(v.expirationTime>b)||a&&!M());){var d=v.callback;if(\"function\"===typeof d){v.callback=null;y=v.priorityLevel;var e=d(v.expirationTime<=b);b=exports.unstable_now();\"function\"===typeof e?v.callback=e:v===h(r)&&k(r);G(b)}else k(r);v=h(r)}if(null!==v)var w=!0;else{var m=h(t);null!==m&&K(H,m.startTime-b);w=!1}return w}finally{v=null,y=c,z=!1}}var N=!1,O=null,L=-1,P=5,Q=-1;\nfunction M(){return exports.unstable_now()-Q<P?!1:!0}function R(){if(null!==O){var a=exports.unstable_now();Q=a;var b=!0;try{b=O(!0,a)}finally{b?S():(N=!1,O=null)}}else N=!1}var S;if(\"function\"===typeof F)S=function(){F(R)};else if(\"undefined\"!==typeof MessageChannel){var T=new MessageChannel,U=T.port2;T.port1.onmessage=R;S=function(){U.postMessage(null)}}else S=function(){D(R,0)};function I(a){O=a;N||(N=!0,S())}function K(a,b){L=D(function(){a(exports.unstable_now())},b)}\nexports.unstable_IdlePriority=5;exports.unstable_ImmediatePriority=1;exports.unstable_LowPriority=4;exports.unstable_NormalPriority=3;exports.unstable_Profiling=null;exports.unstable_UserBlockingPriority=2;exports.unstable_cancelCallback=function(a){a.callback=null};exports.unstable_continueExecution=function(){A||z||(A=!0,I(J))};\nexports.unstable_forceFrameRate=function(a){0>a||125<a?console.error(\"forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported\"):P=0<a?Math.floor(1E3/a):5};exports.unstable_getCurrentPriorityLevel=function(){return y};exports.unstable_getFirstCallbackNode=function(){return h(r)};exports.unstable_next=function(a){switch(y){case 1:case 2:case 3:var b=3;break;default:b=y}var c=y;y=b;try{return a()}finally{y=c}};exports.unstable_pauseExecution=function(){};\nexports.unstable_requestPaint=function(){};exports.unstable_runWithPriority=function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=y;y=a;try{return b()}finally{y=c}};\nexports.unstable_scheduleCallback=function(a,b,c){var d=exports.unstable_now();\"object\"===typeof c&&null!==c?(c=c.delay,c=\"number\"===typeof c&&0<c?d+c:d):c=d;switch(a){case 1:var e=-1;break;case 2:e=250;break;case 5:e=1073741823;break;case 4:e=1E4;break;default:e=5E3}e=c+e;a={id:u++,callback:b,priorityLevel:a,startTime:c,expirationTime:e,sortIndex:-1};c>d?(a.sortIndex=c,f(t,a),null===h(r)&&a===h(t)&&(B?(E(L),L=-1):B=!0,K(H,c-d))):(a.sortIndex=e,f(r,a),A||z||(A=!0,I(J)));return a};\nexports.unstable_shouldYield=M;exports.unstable_wrapCallback=function(a){var b=y;return function(){var c=y;y=b;try{return a.apply(this,arguments)}finally{y=c}}};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/scheduler.production.min.js');\n} else {\n  module.exports = require('./cjs/scheduler.development.js');\n}\n","!function(root, name, make) {\r\n  if (typeof module != 'undefined' && module.exports) module.exports = make()\r\n  else root[name] = make()\r\n}(this, 'subtag', function() {\r\n\r\n  var empty = ''\r\n  var pattern = /^([a-zA-Z]{2,3})(?:[_-]+([a-zA-Z]{3})(?=$|[_-]+))?(?:[_-]+([a-zA-Z]{4})(?=$|[_-]+))?(?:[_-]+([a-zA-Z]{2}|[0-9]{3})(?=$|[_-]+))?/\r\n\r\n  function match(tag) {\r\n    return tag.match(pattern) || []\r\n  }\r\n\r\n  function split(tag) {\r\n    return match(tag).filter(function(v, i) { return v && i })\r\n  }\r\n\r\n  function api(tag) {\r\n    tag = match(tag)\r\n    return {\r\n      language: tag[1] || empty,\r\n      extlang: tag[2] || empty,\r\n      script: tag[3] || empty,\r\n      region: tag[4] || empty\r\n    }\r\n  }\r\n\r\n  function expose(target, key, value) {\r\n    Object.defineProperty(target, key, {\r\n      value: value,\r\n      enumerable: true\r\n    })\r\n  }\r\n\r\n  function part(position, pattern, type) {\r\n    function method(tag) {\r\n      return match(tag)[position] || empty\r\n    }\r\n    expose(method, 'pattern', pattern)\r\n    expose(api, type, method)\r\n  }\r\n\r\n  part(1, /^[a-zA-Z]{2,3}$/, 'language')\r\n  part(2, /^[a-zA-Z]{3}$/, 'extlang')\r\n  part(3, /^[a-zA-Z]{4}$/, 'script')\r\n  part(4, /^[a-zA-Z]{2}$|^[0-9]{3}$/, 'region')\r\n\r\n  expose(api, 'split', split)\r\n\r\n  return api\r\n});\r\n","'use strict';\n\n/**\n * A typeahead component for inputs\n * @class Suggestions\n *\n * @param {HTMLInputElement} el A valid HTML input element\n * @param {Array} data An array of data used for results\n * @param {Object} options\n * @param {Number} [options.limit=5] Max number of results to display in the auto suggest list.\n * @param {Number} [options.minLength=2] Number of characters typed into an input to trigger suggestions.\n * @param {Boolean} [options.hideOnBlur=true] If `true`, hides the suggestions when focus is lost.\n * @return {Suggestions} `this`\n * @example\n * // in the browser\n * var input = document.querySelector('input');\n * var data = [\n *   'Roy Eldridge',\n *   'Roy Hargrove',\n *   'Rex Stewart'\n * ];\n *\n * new Suggestions(input, data);\n *\n * // with options\n * var input = document.querySelector('input');\n * var data = [{\n *   name: 'Roy Eldridge',\n *   year: 1911\n * }, {\n *   name: 'Roy Hargrove',\n *   year: 1969\n * }, {\n *   name: 'Rex Stewart',\n *   year: 1907\n * }];\n *\n * var typeahead = new Suggestions(input, data, {\n *   filter: false, // Disable filtering\n *   minLength: 3, // Number of characters typed into an input to trigger suggestions.\n *   limit: 3, //  Max number of results to display.\n *   hideOnBlur: false // Don't hide results when input loses focus\n * });\n *\n * // As we're passing an object of an arrays as data, override\n * // `getItemValue` by specifying the specific property to search on.\n * typeahead.getItemValue = function(item) { return item.name };\n *\n * input.addEventListener('change', function() {\n *   console.log(typeahead.selected); // Current selected item.\n * });\n *\n * // With browserify\n * var Suggestions = require('suggestions');\n *\n * new Suggestions(input, data);\n */\nvar Suggestions = require('./src/suggestions');\nmodule.exports = Suggestions;\n\nif (typeof window !== 'undefined') {\n  window.Suggestions = Suggestions;\n}\n","'use strict';\n\nvar List = function(component) {\n  this.component = component;\n  this.items = [];\n  this.active = 0;\n  this.wrapper = document.createElement('div');\n  this.wrapper.className = 'suggestions-wrapper';\n  this.element = document.createElement('ul');\n  this.element.className = 'suggestions';\n  this.wrapper.appendChild(this.element);\n\n  // selectingListItem is set to true in the time between the mousedown and mouseup when clicking an item in the list\n  // mousedown on a list item will cause the input to blur which normally hides the list, so this flag is used to keep\n  // the list open until the mouseup\n  this.selectingListItem = false;\n\n  component.el.parentNode.insertBefore(this.wrapper, component.el.nextSibling);\n  return this;\n};\n\nList.prototype.show = function() {\n  this.element.style.display = 'block';\n};\n\nList.prototype.hide = function() {\n  this.element.style.display = 'none';\n};\n\nList.prototype.add = function(item) {\n  this.items.push(item);\n};\n\nList.prototype.clear = function() {\n  this.items = [];\n  this.active = 0;\n};\n\nList.prototype.isEmpty = function() {\n  return !this.items.length;\n};\n\nList.prototype.isVisible = function() {\n  return this.element.style.display === 'block';\n};\n\nList.prototype.draw = function() {\n  this.element.innerHTML = '';\n\n  if (this.items.length === 0) {\n    this.hide();\n    return;\n  }\n\n  for (var i = 0; i < this.items.length; i++) {\n    this.drawItem(this.items[i], this.active === i);\n  }\n\n  this.show();\n};\n\nList.prototype.drawItem = function(item, active) {\n  var li = document.createElement('li'),\n    a = document.createElement('a');\n\n  if (active) li.className += ' active';\n\n  a.innerHTML = item.string;\n\n  li.appendChild(a);\n  this.element.appendChild(li);\n\n  li.addEventListener('mousedown', function() {\n    this.selectingListItem = true;\n  }.bind(this));\n\n  li.addEventListener('mouseup', function() {\n    this.handleMouseUp.call(this, item);\n  }.bind(this));\n};\n\nList.prototype.handleMouseUp = function(item) {\n  this.selectingListItem = false;\n  this.component.value(item.original);\n  this.clear();\n  this.draw();\n};\n\nList.prototype.move = function(index) {\n  this.active = index;\n  this.draw();\n};\n\nList.prototype.previous = function() {\n  this.move(this.active === 0 ? this.items.length - 1 : this.active - 1);\n};\n\nList.prototype.next = function() {\n  this.move(this.active === this.items.length - 1 ? 0 : this.active + 1);\n};\n\nList.prototype.drawError = function(msg){\n  var li = document.createElement('li');\n\n  li.innerHTML = msg;\n\n  this.element.appendChild(li);\n  this.show();\n}\n\nmodule.exports = List;\n","'use strict';\n\nvar extend = require('xtend');\nvar fuzzy = require('fuzzy');\nvar List = require('./list');\n\nvar Suggestions = function(el, data, options) {\n  options = options || {};\n\n  this.options = extend({\n    minLength: 2,\n    limit: 5,\n    filter: true,\n    hideOnBlur: true\n  }, options);\n\n  this.el = el;\n  this.data = data || [];\n  this.list = new List(this);\n\n  this.query = '';\n  this.selected = null;\n\n  this.list.draw();\n\n  this.el.addEventListener('keyup', function(e) {\n    this.handleKeyUp(e.keyCode);\n  }.bind(this), false);\n\n  this.el.addEventListener('keydown', function(e) {\n    this.handleKeyDown(e);\n  }.bind(this));\n\n  this.el.addEventListener('focus', function() {\n    this.handleFocus();\n  }.bind(this));\n\n  this.el.addEventListener('blur', function() {\n    this.handleBlur();\n  }.bind(this));\n\n  this.el.addEventListener('paste', function(e) {\n    this.handlePaste(e);\n  }.bind(this));\n\n  // use user-provided render function if given, otherwise just use the default\n  this.render = (this.options.render) ? this.options.render.bind(this) : this.render.bind(this)\n\n  this.getItemValue = (this.options.getItemValue) ? this.options.getItemValue.bind(this) : this.getItemValue.bind(this);\n\n  return this;\n};\n\nSuggestions.prototype.handleKeyUp = function(keyCode) {\n  // 40 - DOWN\n  // 38 - UP\n  // 27 - ESC\n  // 13 - ENTER\n  // 9 - TAB\n\n  if (keyCode === 40 ||\n      keyCode === 38 ||\n      keyCode === 27 ||\n      keyCode === 13 ||\n      keyCode === 9) return;\n\n  this.handleInputChange(this.el.value);\n};\n\nSuggestions.prototype.handleKeyDown = function(e) {\n  switch (e.keyCode) {\n    case 13: // ENTER\n    case 9: // TAB\n      if (!this.list.isEmpty()) {\n        if (this.list.isVisible()) {\n          e.preventDefault();\n        }\n        this.value(this.list.items[this.list.active].original);\n        this.list.hide();\n      }\n    break;\n    case 27: // ESC\n      if (!this.list.isEmpty()) this.list.hide();\n    break;\n    case 38: // UP\n      this.list.previous();\n    break;\n    case 40: // DOWN\n      this.list.next();\n    break;\n  }\n};\n\nSuggestions.prototype.handleBlur = function() {\n  if (!this.list.selectingListItem && this.options.hideOnBlur) {\n    this.list.hide();\n  }\n};\n\nSuggestions.prototype.handlePaste = function(e) {\n  if (e.clipboardData) {\n    this.handleInputChange(e.clipboardData.getData('Text'));\n  } else {\n    var self = this;\n    setTimeout(function () {\n      self.handleInputChange(e.target.value);\n    }, 100);\n  }\n};\n\nSuggestions.prototype.handleInputChange = function(query) {\n  this.query = this.normalize(query);\n\n  this.list.clear();\n\n  if (this.query.length < this.options.minLength) {\n    this.list.draw();\n    return;\n  }\n\n  this.getCandidates(function(data) {\n    for (var i = 0; i < data.length; i++) {\n      this.list.add(data[i]);\n      if (i === (this.options.limit - 1)) break;\n    }\n    this.list.draw();\n  }.bind(this));\n};\n\nSuggestions.prototype.handleFocus = function() {\n  if (!this.list.isEmpty()) this.list.show();\n  this.list.selectingListItem = false;\n};\n\n/**\n * Update data previously passed\n *\n * @param {Array} revisedData\n */\nSuggestions.prototype.update = function(revisedData) {\n  this.data = revisedData;\n  this.handleKeyUp();\n};\n\n/**\n * Clears data\n */\nSuggestions.prototype.clear = function() {\n  this.data = [];\n  this.list.clear();\n};\n\n/**\n * Normalize the results list and input value for matching\n *\n * @param {String} value\n * @return {String}\n */\nSuggestions.prototype.normalize = function(value) {\n  value = value.toLowerCase();\n  return value;\n};\n\n/**\n * Evaluates whether an array item qualifies as a match with the current query\n *\n * @param {String} candidate a possible item from the array passed\n * @param {String} query the current query\n * @return {Boolean}\n */\nSuggestions.prototype.match = function(candidate, query) {\n  return candidate.indexOf(query) > -1;\n};\n\nSuggestions.prototype.value = function(value) {\n  this.selected = value;\n  this.el.value = this.getItemValue(value);\n\n  if (document.createEvent) {\n    var e = document.createEvent('HTMLEvents');\n    e.initEvent('change', true, false);\n    this.el.dispatchEvent(e);\n  } else {\n    this.el.fireEvent('onchange');\n  }\n};\n\nSuggestions.prototype.getCandidates = function(callback) {\n  var options = {\n    pre: '<strong>',\n    post: '</strong>',\n    extract: function(d) { return this.getItemValue(d); }.bind(this)\n  };\n  var results;\n  if(this.options.filter){\n    results = fuzzy.filter(this.query, this.data, options);\n\n    results = results.map(function(item){\n      return {\n        original: item.original,\n        string: this.render(item.original, item.string)\n      };\n    }.bind(this))\n  }else{\n    results = this.data.map(function(d) {\n      var renderedString = this.render(d);\n      return {\n        original: d,\n        string: renderedString\n      };\n    }.bind(this));\n  }\n  callback(results);\n};\n\n/**\n * For a given item in the data array, return what should be used as the candidate string\n *\n * @param {Object|String} item an item from the data array\n * @return {String} item\n */\nSuggestions.prototype.getItemValue = function(item) {\n  return item;\n};\n\n/**\n * For a given item in the data array, return a string of html that should be rendered in the dropdown\n * @param {Object|String} item an item from the data array\n * @param {String} sourceFormatting a string that has pre-formatted html that should be passed directly through the render function \n * @return {String} html\n */\nSuggestions.prototype.render = function(item, sourceFormatting) {\n  if (sourceFormatting){\n    // use existing formatting on the source string\n    return sourceFormatting;\n  }\n  var boldString = (item.original) ? this.getItemValue(item.original) : this.getItemValue(item);\n  var indexString = this.normalize(boldString);\n  var indexOfQuery = indexString.lastIndexOf(this.query);\n  while (indexOfQuery > -1) {\n    var endIndexOfQuery = indexOfQuery + this.query.length;\n    boldString = boldString.slice(0, indexOfQuery) + '<strong>' + boldString.slice(indexOfQuery, endIndexOfQuery) + '</strong>' + boldString.slice(endIndexOfQuery);\n    indexOfQuery = indexString.slice(0, indexOfQuery).lastIndexOf(this.query);\n  }\n  return boldString\n}\n\n/**\n * Render an custom error message in the suggestions list\n * @param {String} msg An html string to render as an error message\n */\nSuggestions.prototype.renderError = function(msg){\n  this.list.drawError(msg);\n}\n\nmodule.exports = Suggestions;\n","module.exports = extend\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction extend() {\n    var target = {}\n\n    for (var i = 0; i < arguments.length; i++) {\n        var source = arguments[i]\n\n        for (var key in source) {\n            if (hasOwnProperty.call(source, key)) {\n                target[key] = source[key]\n            }\n        }\n    }\n\n    return target\n}\n","import { urlAlphabet } from './url-alphabet/index.js'\nlet random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nlet customRandom = (alphabet, defaultSize, getRandom) => {\n  let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1\n  let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n  return (size = defaultSize) => {\n    let id = ''\n    while (true) {\n      let bytes = getRandom(step)\n      let j = step\n      while (j--) {\n        id += alphabet[bytes[j] & mask] || ''\n        if (id.length === size) return id\n      }\n    }\n  }\n}\nlet customAlphabet = (alphabet, size = 21) =>\n  customRandom(alphabet, size, random)\nlet nanoid = (size = 21) =>\n  crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {\n    byte &= 63\n    if (byte < 36) {\n      id += byte.toString(36)\n    } else if (byte < 62) {\n      id += (byte - 26).toString(36).toUpperCase()\n    } else if (byte > 62) {\n      id += '-'\n    } else {\n      id += '_'\n    }\n    return id\n  }, '')\nexport { nanoid, customAlphabet, customRandom, urlAlphabet, random }\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"static/js/\" + chunkId + \".\" + \"5ca2e56e\" + \".chunk.js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var inProgress = {};\nvar dataWebpackPrefix = \"copp-dam-ui:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.p = \"/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkcopp_dam_ui\"] = self[\"webpackChunkcopp_dam_ui\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","import type { MantineColorScheme } from '../theme.types';\n\nexport function isMantineColorScheme(value: unknown): value is MantineColorScheme {\n  return value === 'auto' || value === 'dark' || value === 'light';\n}\n","import { isMantineColorScheme } from './is-mantine-color-scheme';\nimport type { MantineColorSchemeManager } from './types';\n\nexport interface LocalStorageColorSchemeManagerOptions {\n  /** Local storage key used to retrieve value with `localStorage.getItem(key)`, `mantine-color-scheme-value` by default */\n  key?: string;\n}\n\nexport function localStorageColorSchemeManager({\n  key = 'mantine-color-scheme-value',\n}: LocalStorageColorSchemeManagerOptions = {}): MantineColorSchemeManager {\n  let handleStorageEvent: (event: StorageEvent) => void;\n\n  return {\n    get: (defaultValue) => {\n      if (typeof window === 'undefined') {\n        return defaultValue;\n      }\n\n      try {\n        const storedColorScheme = window.localStorage.getItem(key);\n        return isMantineColorScheme(storedColorScheme) ? storedColorScheme : defaultValue;\n      } catch {\n        return defaultValue;\n      }\n    },\n\n    set: (value) => {\n      try {\n        window.localStorage.setItem(key, value);\n      } catch (error) {\n        // eslint-disable-next-line no-console\n        console.warn(\n          '[@mantine/core] Local storage color scheme manager was unable to save color scheme.',\n          error\n        );\n      }\n    },\n\n    subscribe: (onUpdate) => {\n      handleStorageEvent = (event) => {\n        if (event.storageArea === window.localStorage && event.key === key) {\n          isMantineColorScheme(event.newValue) && onUpdate(event.newValue);\n        }\n      };\n\n      window.addEventListener('storage', handleStorageEvent);\n    },\n\n    unsubscribe: () => {\n      window.removeEventListener('storage', handleStorageEvent);\n    },\n\n    clear: () => {\n      window.localStorage.removeItem(key);\n    },\n  };\n}\n","import { createContext, useContext } from 'react';\nimport { ConvertCSSVariablesInput } from './convert-css-variables';\nimport type { MantineColorScheme, MantineTheme } from './theme.types';\n\nexport interface MantineStylesTransform {\n  sx?: () => (sx: any) => string;\n  styles?: () => (styles: any, payload: any) => Record<string, string>;\n}\n\ninterface MantineContextValue {\n  colorScheme: MantineColorScheme;\n  setColorScheme: (colorScheme: MantineColorScheme) => void;\n  clearColorScheme: () => void;\n  getRootElement: () => HTMLElement | undefined;\n  classNamesPrefix: string;\n  getStyleNonce?: () => string | undefined;\n  cssVariablesResolver?: (theme: MantineTheme) => ConvertCSSVariablesInput;\n  cssVariablesSelector: string;\n  withStaticClasses: boolean;\n  headless?: boolean;\n  stylesTransform?: MantineStylesTransform;\n  env?: 'default' | 'test';\n}\n\nexport const MantineContext = createContext<MantineContextValue | null>(null);\n\nexport function useMantineContext() {\n  const ctx = useContext(MantineContext);\n\n  if (!ctx) {\n    throw new Error('[@mantine/core] MantineProvider was not found in tree');\n  }\n\n  return ctx;\n}\n\nexport function useMantineCssVariablesResolver() {\n  return useMantineContext().cssVariablesResolver;\n}\n\nexport function useMantineClassNamesPrefix() {\n  return useMantineContext().classNamesPrefix;\n}\n\nexport function useMantineStyleNonce() {\n  return useMantineContext().getStyleNonce;\n}\n\nexport function useMantineWithStaticClasses() {\n  return useMantineContext().withStaticClasses;\n}\n\nexport function useMantineIsHeadless() {\n  return useMantineContext().headless;\n}\n\nexport function useMantineSxTransform() {\n  return useMantineContext().stylesTransform?.sx;\n}\n\nexport function useMantineStylesTransform() {\n  return useMantineContext().stylesTransform?.styles;\n}\n\nexport function useMantineEnv() {\n  return useMantineContext().env || 'default';\n}\n","export function keys<T extends object, K extends keyof T>(object: T): K[] {\n  return Object.keys(object) as K[];\n}\n","function getTransformedScaledValue(value: unknown) {\n  if (typeof value !== 'string' || !value.includes('var(--mantine-scale)')) {\n    return value;\n  }\n\n  return value\n    .match(/^calc\\((.*?)\\)$/)?.[1]\n    .split('*')[0]\n    .trim();\n}\n\nexport function px(value: unknown) {\n  const transformedValue = getTransformedScaledValue(value);\n\n  if (typeof transformedValue === 'number') {\n    return transformedValue;\n  }\n\n  if (typeof transformedValue === 'string') {\n    if (transformedValue.includes('calc') || transformedValue.includes('var')) {\n      return transformedValue;\n    }\n\n    if (transformedValue.includes('px')) {\n      return Number(transformedValue.replace('px', ''));\n    }\n\n    if (transformedValue.includes('rem')) {\n      return Number(transformedValue.replace('rem', '')) * 16;\n    }\n\n    if (transformedValue.includes('em')) {\n      return Number(transformedValue.replace('em', '')) * 16;\n    }\n\n    return Number(transformedValue);\n  }\n\n  return NaN;\n}\n","function scaleRem(remValue: string) {\n  if (remValue === '0rem') {\n    return '0rem';\n  }\n\n  return `calc(${remValue} * var(--mantine-scale))`;\n}\n\nfunction createConverter(units: string, { shouldScale = false } = {}) {\n  function converter(value: unknown): string {\n    if (value === 0 || value === '0') {\n      return `0${units}`;\n    }\n\n    if (typeof value === 'number') {\n      const val = `${value / 16}${units}`;\n      return shouldScale ? scaleRem(val) : val;\n    }\n\n    if (typeof value === 'string') {\n      // Number(\"\") === 0 so exit early\n      if (value === '') {\n        return value;\n      }\n\n      if (value.startsWith('calc(') || value.startsWith('clamp(') || value.includes('rgba(')) {\n        return value;\n      }\n\n      if (value.includes(',')) {\n        return value\n          .split(',')\n          .map((val) => converter(val))\n          .join(',');\n      }\n\n      if (value.includes(' ')) {\n        return value\n          .split(' ')\n          .map((val) => converter(val))\n          .join(' ');\n      }\n\n      if (value.includes(units)) {\n        return shouldScale ? scaleRem(value) : value;\n      }\n\n      const replaced = value.replace('px', '');\n      if (!Number.isNaN(Number(replaced))) {\n        const val = `${Number(replaced) / 16}${units}`;\n        return shouldScale ? scaleRem(val) : val;\n      }\n    }\n\n    return value as string;\n  }\n\n  return converter;\n}\n\nexport const rem = createConverter('rem', { shouldScale: true });\nexport const em = createConverter('em');\n","export interface RGBA {\n  r: number;\n  g: number;\n  b: number;\n  a: number;\n}\n\nfunction isHexColor(hex: string): boolean {\n  const HEX_REGEXP = /^#?([0-9A-F]{3}){1,2}([0-9A-F]{2})?$/i;\n\n  return HEX_REGEXP.test(hex);\n}\n\nfunction hexToRgba(color: string): RGBA {\n  let hexString = color.replace('#', '');\n\n  if (hexString.length === 3) {\n    const shorthandHex = hexString.split('');\n    hexString = [\n      shorthandHex[0],\n      shorthandHex[0],\n      shorthandHex[1],\n      shorthandHex[1],\n      shorthandHex[2],\n      shorthandHex[2],\n    ].join('');\n  }\n\n  if (hexString.length === 8) {\n    const alpha = parseInt(hexString.slice(6, 8), 16) / 255;\n\n    return {\n      r: parseInt(hexString.slice(0, 2), 16),\n      g: parseInt(hexString.slice(2, 4), 16),\n      b: parseInt(hexString.slice(4, 6), 16),\n      a: alpha,\n    };\n  }\n\n  const parsed = parseInt(hexString, 16);\n  const r = (parsed >> 16) & 255;\n  const g = (parsed >> 8) & 255;\n  const b = parsed & 255;\n\n  return {\n    r,\n    g,\n    b,\n    a: 1,\n  };\n}\n\nfunction rgbStringToRgba(color: string): RGBA {\n  const [r, g, b, a] = color\n    .replace(/[^0-9,./]/g, '')\n    .split(/[/,]/)\n    .map(Number);\n\n  return { r, g, b, a: a || 1 };\n}\n\nfunction hslStringToRgba(hslaString: string): RGBA {\n  const hslaRegex =\n    /^hsla?\\(\\s*(\\d+)\\s*,\\s*(\\d+%)\\s*,\\s*(\\d+%)\\s*(,\\s*(0?\\.\\d+|\\d+(\\.\\d+)?))?\\s*\\)$/i;\n\n  const matches = hslaString.match(hslaRegex);\n  if (!matches) {\n    return {\n      r: 0,\n      g: 0,\n      b: 0,\n      a: 1,\n    };\n  }\n\n  const h = parseInt(matches[1], 10);\n  const s = parseInt(matches[2], 10) / 100;\n  const l = parseInt(matches[3], 10) / 100;\n  const a = matches[5] ? parseFloat(matches[5]) : undefined;\n\n  const chroma = (1 - Math.abs(2 * l - 1)) * s;\n  const huePrime = h / 60;\n  const x = chroma * (1 - Math.abs((huePrime % 2) - 1));\n  const m = l - chroma / 2;\n\n  let r: number;\n  let g: number;\n  let b: number;\n\n  if (huePrime >= 0 && huePrime < 1) {\n    r = chroma;\n    g = x;\n    b = 0;\n  } else if (huePrime >= 1 && huePrime < 2) {\n    r = x;\n    g = chroma;\n    b = 0;\n  } else if (huePrime >= 2 && huePrime < 3) {\n    r = 0;\n    g = chroma;\n    b = x;\n  } else if (huePrime >= 3 && huePrime < 4) {\n    r = 0;\n    g = x;\n    b = chroma;\n  } else if (huePrime >= 4 && huePrime < 5) {\n    r = x;\n    g = 0;\n    b = chroma;\n  } else {\n    r = chroma;\n    g = 0;\n    b = x;\n  }\n\n  return {\n    r: Math.round((r + m) * 255),\n    g: Math.round((g + m) * 255),\n    b: Math.round((b + m) * 255),\n    a: a || 1,\n  };\n}\n\nexport function toRgba(color: string): RGBA {\n  if (isHexColor(color)) {\n    return hexToRgba(color);\n  }\n\n  if (color.startsWith('rgb')) {\n    return rgbStringToRgba(color);\n  }\n\n  if (color.startsWith('hsl')) {\n    return hslStringToRgba(color);\n  }\n\n  return {\n    r: 0,\n    g: 0,\n    b: 0,\n    a: 1,\n  };\n}\n","import { toRgba } from '../to-rgba/to-rgba';\n\nexport function darken(color: string, alpha: number) {\n  if (color.startsWith('var(')) {\n    return `color-mix(in srgb, ${color}, black ${alpha * 100}%)`;\n  }\n\n  const { r, g, b, a } = toRgba(color);\n  const f = 1 - alpha;\n\n  const dark = (input: number) => Math.round(input * f);\n\n  return `rgba(${dark(r)}, ${dark(g)}, ${dark(b)}, ${a})`;\n}\n","import type { MantineColorScheme, MantineTheme } from '../../theme.types';\n\nexport function getPrimaryShade(theme: MantineTheme, colorScheme: MantineColorScheme) {\n  if (typeof theme.primaryShade === 'number') {\n    return theme.primaryShade;\n  }\n\n  if (colorScheme === 'dark') {\n    return theme.primaryShade.dark;\n  }\n\n  return theme.primaryShade.light;\n}\n","import { toRgba } from '../to-rgba/to-rgba';\n\nfunction gammaCorrect(c: number) {\n  return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n}\n\nfunction getLightnessFromOklch(oklchColor: string) {\n  const match = oklchColor.match(/oklch\\((.*?)%\\s/);\n  return match ? parseFloat(match[1]) : null;\n}\n\nexport function luminance(color: string): number {\n  if (color.startsWith('oklch(')) {\n    return (getLightnessFromOklch(color) || 0) / 100;\n  }\n\n  const { r, g, b } = toRgba(color);\n\n  const sR = r / 255;\n  const sG = g / 255;\n  const sB = b / 255;\n\n  const rLinear = gammaCorrect(sR);\n  const gLinear = gammaCorrect(sG);\n  const bLinear = gammaCorrect(sB);\n\n  return 0.2126 * rLinear + 0.7152 * gLinear + 0.0722 * bLinear;\n}\n\nexport function isLightColor(color: string, luminanceThreshold = 0.179) {\n  if (color.startsWith('var(')) {\n    return false;\n  }\n\n  return luminance(color) > luminanceThreshold;\n}\n","import type { CssVariable } from '../../../Box';\nimport type { MantineColorScheme, MantineColorShade, MantineTheme } from '../../theme.types';\nimport { getPrimaryShade } from '../get-primary-shade/get-primary-shade';\nimport { isLightColor } from '../luminance/luminance';\n\ninterface ParseThemeColorOptions {\n  color: unknown;\n  theme: MantineTheme;\n  colorScheme?: MantineColorScheme;\n}\n\ninterface ParseThemeColorResult {\n  color: string;\n  value: string;\n  shade: MantineColorShade | undefined;\n  variable: CssVariable | undefined;\n  isThemeColor: boolean;\n  isLight: boolean;\n}\n\nexport function parseThemeColor({\n  color,\n  theme,\n  colorScheme,\n}: ParseThemeColorOptions): ParseThemeColorResult {\n  if (typeof color !== 'string') {\n    throw new Error(\n      `[@mantine/core] Failed to parse color. Expected color to be a string, instead got ${typeof color}`\n    );\n  }\n\n  if (color === 'bright') {\n    return {\n      color,\n      value: colorScheme === 'dark' ? theme.white : theme.black,\n      shade: undefined,\n      isThemeColor: false,\n      isLight: isLightColor(\n        colorScheme === 'dark' ? theme.white : theme.black,\n        theme.luminanceThreshold\n      ),\n      variable: '--mantine-color-bright',\n    };\n  }\n\n  if (color === 'dimmed') {\n    return {\n      color,\n      value: colorScheme === 'dark' ? theme.colors.dark[2] : theme.colors.gray[7],\n      shade: undefined,\n      isThemeColor: false,\n      isLight: isLightColor(\n        colorScheme === 'dark' ? theme.colors.dark[2] : theme.colors.gray[6],\n        theme.luminanceThreshold\n      ),\n      variable: '--mantine-color-dimmed',\n    };\n  }\n\n  if (color === 'white' || color === 'black') {\n    return {\n      color,\n      value: color === 'white' ? theme.white : theme.black,\n      shade: undefined,\n      isThemeColor: false,\n      isLight: isLightColor(\n        color === 'white' ? theme.white : theme.black,\n        theme.luminanceThreshold\n      ),\n      variable: `--mantine-color-${color}`,\n    };\n  }\n\n  const [_color, shade] = color.split('.');\n  const colorShade = shade ? (Number(shade) as MantineColorShade) : undefined;\n  const isThemeColor = _color in theme.colors;\n\n  if (isThemeColor) {\n    const colorValue =\n      colorShade !== undefined\n        ? theme.colors[_color][colorShade]\n        : theme.colors[_color][getPrimaryShade(theme, colorScheme || 'light')];\n\n    return {\n      color: _color,\n      value: colorValue,\n      shade: colorShade,\n      isThemeColor,\n      isLight: isLightColor(colorValue, theme.luminanceThreshold),\n      variable: shade\n        ? `--mantine-color-${_color}-${colorShade}`\n        : `--mantine-color-${_color}-filled`,\n    };\n  }\n\n  return {\n    color,\n    value: color,\n    isThemeColor,\n    isLight: isLightColor(color, theme.luminanceThreshold),\n    shade: colorShade,\n    variable: undefined,\n  };\n}\n","import type { MantineTheme } from '../../theme.types';\nimport { parseThemeColor } from '../parse-theme-color/parse-theme-color';\n\nexport function getThemeColor(color: string | undefined | null, theme: MantineTheme) {\n  const parsed = parseThemeColor({ color: color || theme.primaryColor, theme });\n  return parsed.variable ? `var(${parsed.variable})` : color!;\n}\n","import { MantineGradient, MantineTheme } from '../../theme.types';\nimport { getThemeColor } from '../get-theme-color/get-theme-color';\n\nexport function getGradient(gradient: MantineGradient | undefined, theme: MantineTheme) {\n  const merged = {\n    from: gradient?.from || theme.defaultGradient.from,\n    to: gradient?.to || theme.defaultGradient.to,\n    deg: gradient?.deg ?? theme.defaultGradient.deg ?? 0,\n  };\n\n  const fromColor = getThemeColor(merged.from, theme);\n  const toColor = getThemeColor(merged.to, theme);\n\n  return `linear-gradient(${merged.deg}deg, ${fromColor} 0%, ${toColor} 100%)`;\n}\n","import { toRgba } from '../to-rgba/to-rgba';\n\nexport function rgba(color: string, alpha: number) {\n  if (typeof color !== 'string' || alpha > 1 || alpha < 0) {\n    return 'rgba(0, 0, 0, 1)';\n  }\n\n  if (color.startsWith('var(')) {\n    const mixPercentage = (1 - alpha) * 100;\n    return `color-mix(in srgb, ${color}, transparent ${mixPercentage}%)`;\n  }\n\n  if (color.startsWith('oklch')) {\n    if (color.includes('/')) {\n      return color.replace(/\\/\\s*[\\d.]+\\s*\\)/, `/ ${alpha})`);\n    }\n\n    return color.replace(')', ` / ${alpha})`);\n  }\n\n  const { r, g, b } = toRgba(color);\n  return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\nexport const alpha = rgba;\n","import { rem } from '../utils';\nimport { defaultVariantColorsResolver } from './color-functions';\nimport { DEFAULT_COLORS } from './default-colors';\nimport type { MantineTheme } from './theme.types';\n\nconst DEFAULT_FONT_FAMILY =\n  '-apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji';\n\nexport const DEFAULT_THEME: MantineTheme = {\n  scale: 1,\n  fontSmoothing: true,\n  focusRing: 'auto',\n  white: '#fff',\n  black: '#000',\n  colors: DEFAULT_COLORS,\n  primaryShade: { light: 6, dark: 8 },\n  primaryColor: 'blue',\n  variantColorResolver: defaultVariantColorsResolver,\n  autoContrast: false,\n  luminanceThreshold: 0.3,\n  fontFamily: DEFAULT_FONT_FAMILY,\n  fontFamilyMonospace:\n    'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace',\n  respectReducedMotion: false,\n  cursorType: 'default',\n  defaultGradient: { from: 'blue', to: 'cyan', deg: 45 },\n  defaultRadius: 'sm',\n  activeClassName: 'mantine-active',\n  focusClassName: '',\n\n  headings: {\n    fontFamily: DEFAULT_FONT_FAMILY,\n    fontWeight: '700',\n    textWrap: 'wrap',\n    sizes: {\n      h1: { fontSize: rem(34), lineHeight: '1.3' },\n      h2: { fontSize: rem(26), lineHeight: '1.35' },\n      h3: { fontSize: rem(22), lineHeight: '1.4' },\n      h4: { fontSize: rem(18), lineHeight: '1.45' },\n      h5: { fontSize: rem(16), lineHeight: '1.5' },\n      h6: { fontSize: rem(14), lineHeight: '1.5' },\n    },\n  },\n\n  fontSizes: {\n    xs: rem(12),\n    sm: rem(14),\n    md: rem(16),\n    lg: rem(18),\n    xl: rem(20),\n  },\n\n  lineHeights: {\n    xs: '1.4',\n    sm: '1.45',\n    md: '1.55',\n    lg: '1.6',\n    xl: '1.65',\n  },\n\n  radius: {\n    xs: rem(2),\n    sm: rem(4),\n    md: rem(8),\n    lg: rem(16),\n    xl: rem(32),\n  },\n\n  spacing: {\n    xs: rem(10),\n    sm: rem(12),\n    md: rem(16),\n    lg: rem(20),\n    xl: rem(32),\n  },\n\n  breakpoints: {\n    xs: '36em',\n    sm: '48em',\n    md: '62em',\n    lg: '75em',\n    xl: '88em',\n  },\n\n  shadows: {\n    xs: `0 ${rem(1)} ${rem(3)} rgba(0, 0, 0, 0.05), 0 ${rem(1)} ${rem(2)} rgba(0, 0, 0, 0.1)`,\n    sm: `0 ${rem(1)} ${rem(3)} rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.05) 0 ${rem(10)} ${rem(\n      15\n    )} ${rem(-5)}, rgba(0, 0, 0, 0.04) 0 ${rem(7)} ${rem(7)} ${rem(-5)}`,\n    md: `0 ${rem(1)} ${rem(3)} rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.05) 0 ${rem(20)} ${rem(\n      25\n    )} ${rem(-5)}, rgba(0, 0, 0, 0.04) 0 ${rem(10)} ${rem(10)} ${rem(-5)}`,\n    lg: `0 ${rem(1)} ${rem(3)} rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.05) 0 ${rem(28)} ${rem(\n      23\n    )} ${rem(-7)}, rgba(0, 0, 0, 0.04) 0 ${rem(12)} ${rem(12)} ${rem(-7)}`,\n    xl: `0 ${rem(1)} ${rem(3)} rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.05) 0 ${rem(36)} ${rem(\n      28\n    )} ${rem(-7)}, rgba(0, 0, 0, 0.04) 0 ${rem(17)} ${rem(17)} ${rem(-7)}`,\n  },\n\n  other: {},\n  components: {},\n};\n","import type { MantineThemeColors } from './theme.types';\n\nexport const DEFAULT_COLORS: MantineThemeColors = {\n  dark: [\n    '#C9C9C9',\n    '#b8b8b8',\n    '#828282',\n    '#696969',\n    '#424242',\n    '#3b3b3b',\n    '#2e2e2e',\n    '#242424',\n    '#1f1f1f',\n    '#141414',\n  ],\n\n  gray: [\n    '#f8f9fa',\n    '#f1f3f5',\n    '#e9ecef',\n    '#dee2e6',\n    '#ced4da',\n    '#adb5bd',\n    '#868e96',\n    '#495057',\n    '#343a40',\n    '#212529',\n  ],\n\n  red: [\n    '#fff5f5',\n    '#ffe3e3',\n    '#ffc9c9',\n    '#ffa8a8',\n    '#ff8787',\n    '#ff6b6b',\n    '#fa5252',\n    '#f03e3e',\n    '#e03131',\n    '#c92a2a',\n  ],\n\n  pink: [\n    '#fff0f6',\n    '#ffdeeb',\n    '#fcc2d7',\n    '#faa2c1',\n    '#f783ac',\n    '#f06595',\n    '#e64980',\n    '#d6336c',\n    '#c2255c',\n    '#a61e4d',\n  ],\n\n  grape: [\n    '#f8f0fc',\n    '#f3d9fa',\n    '#eebefa',\n    '#e599f7',\n    '#da77f2',\n    '#cc5de8',\n    '#be4bdb',\n    '#ae3ec9',\n    '#9c36b5',\n    '#862e9c',\n  ],\n\n  violet: [\n    '#f3f0ff',\n    '#e5dbff',\n    '#d0bfff',\n    '#b197fc',\n    '#9775fa',\n    '#845ef7',\n    '#7950f2',\n    '#7048e8',\n    '#6741d9',\n    '#5f3dc4',\n  ],\n\n  indigo: [\n    '#edf2ff',\n    '#dbe4ff',\n    '#bac8ff',\n    '#91a7ff',\n    '#748ffc',\n    '#5c7cfa',\n    '#4c6ef5',\n    '#4263eb',\n    '#3b5bdb',\n    '#364fc7',\n  ],\n\n  blue: [\n    '#e7f5ff',\n    '#d0ebff',\n    '#a5d8ff',\n    '#74c0fc',\n    '#4dabf7',\n    '#339af0',\n    '#228be6',\n    '#1c7ed6',\n    '#1971c2',\n    '#1864ab',\n  ],\n\n  cyan: [\n    '#e3fafc',\n    '#c5f6fa',\n    '#99e9f2',\n    '#66d9e8',\n    '#3bc9db',\n    '#22b8cf',\n    '#15aabf',\n    '#1098ad',\n    '#0c8599',\n    '#0b7285',\n  ],\n\n  teal: [\n    '#e6fcf5',\n    '#c3fae8',\n    '#96f2d7',\n    '#63e6be',\n    '#38d9a9',\n    '#20c997',\n    '#12b886',\n    '#0ca678',\n    '#099268',\n    '#087f5b',\n  ],\n\n  green: [\n    '#ebfbee',\n    '#d3f9d8',\n    '#b2f2bb',\n    '#8ce99a',\n    '#69db7c',\n    '#51cf66',\n    '#40c057',\n    '#37b24d',\n    '#2f9e44',\n    '#2b8a3e',\n  ],\n\n  lime: [\n    '#f4fce3',\n    '#e9fac8',\n    '#d8f5a2',\n    '#c0eb75',\n    '#a9e34b',\n    '#94d82d',\n    '#82c91e',\n    '#74b816',\n    '#66a80f',\n    '#5c940d',\n  ],\n\n  yellow: [\n    '#fff9db',\n    '#fff3bf',\n    '#ffec99',\n    '#ffe066',\n    '#ffd43b',\n    '#fcc419',\n    '#fab005',\n    '#f59f00',\n    '#f08c00',\n    '#e67700',\n  ],\n\n  orange: [\n    '#fff4e6',\n    '#ffe8cc',\n    '#ffd8a8',\n    '#ffc078',\n    '#ffa94d',\n    '#ff922b',\n    '#fd7e14',\n    '#f76707',\n    '#e8590c',\n    '#d9480f',\n  ],\n};\n","import { rem } from '../../../utils';\nimport { MantineColor, MantineGradient, MantineTheme } from '../../theme.types';\nimport { darken } from '../darken/darken';\nimport { getGradient } from '../get-gradient/get-gradient';\nimport { parseThemeColor } from '../parse-theme-color/parse-theme-color';\nimport { rgba } from '../rgba/rgba';\n\nexport interface VariantColorsResolverInput {\n  color: MantineColor | undefined;\n  theme: MantineTheme;\n  variant: string;\n  gradient?: MantineGradient;\n  autoContrast?: boolean;\n}\n\nexport interface VariantColorResolverResult {\n  background: string;\n  hover: string;\n  color: string;\n  border: string;\n  hoverColor?: string;\n}\n\nexport type VariantColorsResolver = (\n  input: VariantColorsResolverInput\n) => VariantColorResolverResult;\n\nexport const defaultVariantColorsResolver: VariantColorsResolver = ({\n  color,\n  theme,\n  variant,\n  gradient,\n  autoContrast,\n}) => {\n  const parsed = parseThemeColor({ color, theme });\n\n  const _autoContrast = typeof autoContrast === 'boolean' ? autoContrast : theme.autoContrast;\n\n  if (variant === 'filled') {\n    const textColor = _autoContrast\n      ? parsed.isLight\n        ? 'var(--mantine-color-black)'\n        : 'var(--mantine-color-white)'\n      : 'var(--mantine-color-white)';\n    if (parsed.isThemeColor) {\n      if (parsed.shade === undefined) {\n        return {\n          background: `var(--mantine-color-${color}-filled)`,\n          hover: `var(--mantine-color-${color}-filled-hover)`,\n          color: textColor,\n          border: `${rem(1)} solid transparent`,\n        };\n      }\n\n      return {\n        background: `var(--mantine-color-${parsed.color}-${parsed.shade})`,\n        hover: `var(--mantine-color-${parsed.color}-${parsed.shade === 9 ? 8 : parsed.shade + 1})`,\n        color: textColor,\n        border: `${rem(1)} solid transparent`,\n      };\n    }\n\n    return {\n      background: color!,\n      hover: darken(color!, 0.1),\n      color: textColor,\n      border: `${rem(1)} solid transparent`,\n    };\n  }\n\n  if (variant === 'light') {\n    if (parsed.isThemeColor) {\n      if (parsed.shade === undefined) {\n        return {\n          background: `var(--mantine-color-${color}-light)`,\n          hover: `var(--mantine-color-${color}-light-hover)`,\n          color: `var(--mantine-color-${color}-light-color)`,\n          border: `${rem(1)} solid transparent`,\n        };\n      }\n\n      const parsedColor = theme.colors[parsed.color][parsed.shade];\n\n      return {\n        background: rgba(parsedColor, 0.1),\n        hover: rgba(parsedColor, 0.12),\n        color: `var(--mantine-color-${parsed.color}-${Math.min(parsed.shade, 6)})`,\n        border: `${rem(1)} solid transparent`,\n      };\n    }\n\n    return {\n      background: rgba(color!, 0.1),\n      hover: rgba(color!, 0.12),\n      color: color!,\n      border: `${rem(1)} solid transparent`,\n    };\n  }\n\n  if (variant === 'outline') {\n    if (parsed.isThemeColor) {\n      if (parsed.shade === undefined) {\n        return {\n          background: 'transparent',\n          hover: `var(--mantine-color-${color}-outline-hover)`,\n          color: `var(--mantine-color-${color}-outline)`,\n          border: `${rem(1)} solid var(--mantine-color-${color}-outline)`,\n        };\n      }\n\n      return {\n        background: 'transparent',\n        hover: rgba(theme.colors[parsed.color][parsed.shade], 0.05),\n        color: `var(--mantine-color-${parsed.color}-${parsed.shade})`,\n        border: `${rem(1)} solid var(--mantine-color-${parsed.color}-${parsed.shade})`,\n      };\n    }\n\n    return {\n      background: 'transparent',\n      hover: rgba(color!, 0.05),\n      color: color!,\n      border: `${rem(1)} solid ${color}`,\n    };\n  }\n\n  if (variant === 'subtle') {\n    if (parsed.isThemeColor) {\n      if (parsed.shade === undefined) {\n        return {\n          background: 'transparent',\n          hover: `var(--mantine-color-${color}-light-hover)`,\n          color: `var(--mantine-color-${color}-light-color)`,\n          border: `${rem(1)} solid transparent`,\n        };\n      }\n\n      const parsedColor = theme.colors[parsed.color][parsed.shade];\n\n      return {\n        background: 'transparent',\n        hover: rgba(parsedColor, 0.12),\n        color: `var(--mantine-color-${parsed.color}-${Math.min(parsed.shade, 6)})`,\n        border: `${rem(1)} solid transparent`,\n      };\n    }\n\n    return {\n      background: 'transparent',\n      hover: rgba(color!, 0.12),\n      color: color!,\n      border: `${rem(1)} solid transparent`,\n    };\n  }\n\n  if (variant === 'transparent') {\n    if (parsed.isThemeColor) {\n      if (parsed.shade === undefined) {\n        return {\n          background: 'transparent',\n          hover: 'transparent',\n          color: `var(--mantine-color-${color}-light-color)`,\n          border: `${rem(1)} solid transparent`,\n        };\n      }\n\n      return {\n        background: 'transparent',\n        hover: 'transparent',\n        color: `var(--mantine-color-${parsed.color}-${Math.min(parsed.shade, 6)})`,\n        border: `${rem(1)} solid transparent`,\n      };\n    }\n\n    return {\n      background: 'transparent',\n      hover: 'transparent',\n      color: color!,\n      border: `${rem(1)} solid transparent`,\n    };\n  }\n\n  if (variant === 'white') {\n    if (parsed.isThemeColor) {\n      if (parsed.shade === undefined) {\n        return {\n          background: 'var(--mantine-color-white)',\n          hover: darken(theme.white, 0.01),\n          color: `var(--mantine-color-${color}-filled)`,\n          border: `${rem(1)} solid transparent`,\n        };\n      }\n\n      return {\n        background: 'var(--mantine-color-white)',\n        hover: darken(theme.white, 0.01),\n        color: `var(--mantine-color-${parsed.color}-${parsed.shade})`,\n        border: `${rem(1)} solid transparent`,\n      };\n    }\n\n    return {\n      background: 'var(--mantine-color-white)',\n      hover: darken(theme.white, 0.01),\n      color: color!,\n      border: `${rem(1)} solid transparent`,\n    };\n  }\n\n  if (variant === 'gradient') {\n    return {\n      background: getGradient(gradient, theme),\n      hover: getGradient(gradient, theme),\n      color: 'var(--mantine-color-white)',\n      border: 'none',\n    };\n  }\n\n  if (variant === 'default') {\n    return {\n      background: 'var(--mantine-color-default)',\n      hover: 'var(--mantine-color-default-hover)',\n      color: 'var(--mantine-color-default-color)',\n      border: `${rem(1)} solid var(--mantine-color-default-border)`,\n    };\n  }\n\n  return {} as VariantColorResolverResult;\n};\n","function isObject(item: unknown) {\n  return item && typeof item === 'object' && !Array.isArray(item);\n}\n\nexport function deepMerge<T extends object>(target: T, source: any): T {\n  const result: Record<string, any> = { ...target };\n  const _source: Record<string, any> = source;\n\n  if (isObject(target) && isObject(source)) {\n    Object.keys(source).forEach((key) => {\n      if (isObject(_source[key])) {\n        if (!(key in target)) {\n          result[key] = _source[key];\n        } else {\n          result[key] = deepMerge(result[key], _source[key]);\n        }\n      } else {\n        result[key] = _source[key];\n      }\n    });\n  }\n\n  return result as T;\n}\n","import { deepMerge } from '../../utils';\nimport type { MantineTheme, MantineThemeOverride } from '../theme.types';\n\nexport const INVALID_PRIMARY_COLOR_ERROR =\n  '[@mantine/core] MantineProvider: Invalid theme.primaryColor, it accepts only key of theme.colors, learn more – https://mantine.dev/theming/colors/#primary-color';\n\nexport const INVALID_PRIMARY_SHADE_ERROR =\n  '[@mantine/core] MantineProvider: Invalid theme.primaryShade, it accepts only 0-9 integers or an object { light: 0-9, dark: 0-9 }';\n\nfunction isValidPrimaryShade(shade: number) {\n  if (shade < 0 || shade > 9) {\n    return false;\n  }\n\n  return parseInt(shade.toString(), 10) === shade;\n}\n\nexport function validateMantineTheme(theme: MantineTheme): asserts theme is MantineTheme {\n  if (!(theme.primaryColor in theme.colors)) {\n    throw new Error(INVALID_PRIMARY_COLOR_ERROR);\n  }\n\n  if (typeof theme.primaryShade === 'object') {\n    if (\n      !isValidPrimaryShade(theme.primaryShade.dark) ||\n      !isValidPrimaryShade(theme.primaryShade.light)\n    ) {\n      throw new Error(INVALID_PRIMARY_SHADE_ERROR);\n    }\n  }\n\n  if (typeof theme.primaryShade === 'number' && !isValidPrimaryShade(theme.primaryShade)) {\n    throw new Error(INVALID_PRIMARY_SHADE_ERROR);\n  }\n}\n\nexport function mergeMantineTheme(\n  currentTheme: MantineTheme,\n  themeOverride?: MantineThemeOverride\n) {\n  if (!themeOverride) {\n    validateMantineTheme(currentTheme);\n    return currentTheme;\n  }\n\n  const result = deepMerge(currentTheme, themeOverride);\n\n  if (themeOverride.fontFamily && !themeOverride.headings?.fontFamily) {\n    result.headings.fontFamily = themeOverride.fontFamily;\n  }\n\n  validateMantineTheme(result);\n  return result;\n}\n","import { createContext, useContext, useMemo } from 'react';\nimport { DEFAULT_THEME } from '../default-theme';\nimport { mergeMantineTheme } from '../merge-mantine-theme';\nimport { MantineTheme, MantineThemeOverride } from '../theme.types';\n\nexport const MantineThemeContext = createContext<MantineTheme | null>(null);\n\nexport const useSafeMantineTheme = () => useContext(MantineThemeContext) || DEFAULT_THEME;\n\nexport function useMantineTheme() {\n  const ctx = useContext(MantineThemeContext);\n  if (!ctx) {\n    throw new Error(\n      '@mantine/core: MantineProvider was not found in component tree, make sure you have it in your app'\n    );\n  }\n\n  return ctx;\n}\n\nexport interface MantineThemeProviderProps {\n  /** Determines whether theme should be inherited from parent MantineProvider, `true` by default */\n  inherit?: boolean;\n\n  /** Theme override object */\n  theme?: MantineThemeOverride;\n\n  /** Your application or part of the application that requires different theme */\n  children?: React.ReactNode;\n}\n\nexport function MantineThemeProvider({\n  theme,\n  children,\n  inherit = true,\n}: MantineThemeProviderProps) {\n  const parentTheme = useSafeMantineTheme();\n  const mergedTheme = useMemo(\n    () => mergeMantineTheme(inherit ? parentTheme : DEFAULT_THEME, theme),\n    [theme, parentTheme, inherit]\n  );\n\n  return (\n    <MantineThemeContext.Provider value={mergedTheme}>{children}</MantineThemeContext.Provider>\n  );\n}\n\nMantineThemeProvider.displayName = '@mantine/core/MantineThemeProvider';\n","import { em, keys, px } from '../../utils';\nimport { useMantineStyleNonce } from '../Mantine.context';\nimport { useMantineTheme } from '../MantineThemeProvider';\n\nexport function MantineClasses() {\n  const theme = useMantineTheme();\n  const nonce = useMantineStyleNonce();\n\n  const classes = keys(theme.breakpoints).reduce<string>((acc, breakpoint) => {\n    const isPxBreakpoint = theme.breakpoints[breakpoint].includes('px');\n    const pxValue = px(theme.breakpoints[breakpoint]) as number;\n    const maxWidthBreakpoint = isPxBreakpoint ? `${pxValue - 0.1}px` : em(pxValue - 0.1);\n    const minWidthBreakpoint = isPxBreakpoint ? `${pxValue}px` : em(pxValue);\n\n    return `${acc}@media (max-width: ${maxWidthBreakpoint}) {.mantine-visible-from-${breakpoint} {display: none !important;}}@media (min-width: ${minWidthBreakpoint}) {.mantine-hidden-from-${breakpoint} {display: none !important;}}`;\n  }, '');\n\n  return (\n    <style\n      data-mantine-styles=\"classes\"\n      nonce={nonce?.()}\n      dangerouslySetInnerHTML={{ __html: classes }}\n    />\n  );\n}\n","import type { CssVariable } from '../../Box';\n\nexport type CSSVariables = Record<CssVariable, string>;\n\nexport function cssVariablesObjectToString(variables: CSSVariables) {\n  return Object.entries(variables)\n    .map(([name, value]) => `${name}: ${value};`)\n    .join('');\n}\n","export function wrapWithSelector(selectors: string | string[], code: string) {\n  const _selectors = Array.isArray(selectors) ? selectors : [selectors];\n  return _selectors.reduce((acc, selector) => `${selector}{${acc}}`, code);\n}\n","import type { MantineTheme } from '../../theme.types';\nimport { getPrimaryShade } from '../get-primary-shade/get-primary-shade';\nimport { parseThemeColor } from '../parse-theme-color/parse-theme-color';\n\ninterface GetContrastColorInput {\n  color: string | null | undefined;\n  theme: MantineTheme;\n  autoContrast?: boolean | undefined | null;\n}\n\nexport function getContrastColor({ color, theme, autoContrast }: GetContrastColorInput) {\n  const _autoContrast = typeof autoContrast === 'boolean' ? autoContrast : theme.autoContrast;\n\n  if (!_autoContrast) {\n    return 'var(--mantine-color-white)';\n  }\n\n  const parsed = parseThemeColor({ color: color || theme.primaryColor, theme });\n  return parsed.isLight ? 'var(--mantine-color-black)' : 'var(--mantine-color-white)';\n}\n\nexport function getPrimaryContrastColor(theme: MantineTheme, colorScheme: 'light' | 'dark') {\n  return getContrastColor({\n    color: theme.colors[theme.primaryColor][getPrimaryShade(theme, colorScheme)],\n    theme,\n    autoContrast: null,\n  });\n}\n","import { alpha, getPrimaryShade } from '../color-functions';\nimport { MantineColor, MantineTheme } from '../theme.types';\n\ninterface GetColorVariablesInput {\n  theme: MantineTheme;\n  color: MantineColor;\n  colorScheme: 'light' | 'dark';\n  name?: string;\n  withColorValues?: boolean;\n}\n\nexport function getCSSColorVariables({\n  theme,\n  color,\n  colorScheme,\n  name = color,\n  withColorValues = true,\n}: GetColorVariablesInput) {\n  if (!theme.colors[color]) {\n    return {};\n  }\n\n  if (colorScheme === 'light') {\n    const primaryShade = getPrimaryShade(theme, 'light');\n\n    const dynamicVariables = {\n      [`--mantine-color-${name}-text`]: `var(--mantine-color-${name}-filled)`,\n      [`--mantine-color-${name}-filled`]: `var(--mantine-color-${name}-${primaryShade})`,\n      [`--mantine-color-${name}-filled-hover`]: `var(--mantine-color-${name}-${\n        primaryShade === 9 ? 8 : primaryShade + 1\n      })`,\n      [`--mantine-color-${name}-light`]: alpha(theme.colors[color][primaryShade], 0.1),\n      [`--mantine-color-${name}-light-hover`]: alpha(theme.colors[color][primaryShade], 0.12),\n      [`--mantine-color-${name}-light-color`]: `var(--mantine-color-${name}-${primaryShade})`,\n      [`--mantine-color-${name}-outline`]: `var(--mantine-color-${name}-${primaryShade})`,\n      [`--mantine-color-${name}-outline-hover`]: alpha(theme.colors[color][primaryShade], 0.05),\n    };\n\n    if (!withColorValues) {\n      return dynamicVariables;\n    }\n\n    return {\n      [`--mantine-color-${name}-0`]: theme.colors[color][0],\n      [`--mantine-color-${name}-1`]: theme.colors[color][1],\n      [`--mantine-color-${name}-2`]: theme.colors[color][2],\n      [`--mantine-color-${name}-3`]: theme.colors[color][3],\n      [`--mantine-color-${name}-4`]: theme.colors[color][4],\n      [`--mantine-color-${name}-5`]: theme.colors[color][5],\n      [`--mantine-color-${name}-6`]: theme.colors[color][6],\n      [`--mantine-color-${name}-7`]: theme.colors[color][7],\n      [`--mantine-color-${name}-8`]: theme.colors[color][8],\n      [`--mantine-color-${name}-9`]: theme.colors[color][9],\n      ...dynamicVariables,\n    };\n  }\n\n  const primaryShade = getPrimaryShade(theme, 'dark');\n  const dynamicVariables = {\n    [`--mantine-color-${name}-text`]: `var(--mantine-color-${name}-4)`,\n    [`--mantine-color-${name}-filled`]: `var(--mantine-color-${name}-${primaryShade})`,\n    [`--mantine-color-${name}-filled-hover`]: `var(--mantine-color-${name}-${\n      primaryShade === 9 ? 8 : primaryShade + 1\n    })`,\n    [`--mantine-color-${name}-light`]: alpha(\n      theme.colors[color][Math.max(0, primaryShade - 2)],\n      0.15\n    ),\n    [`--mantine-color-${name}-light-hover`]: alpha(\n      theme.colors[color][Math.max(0, primaryShade - 2)],\n      0.2\n    ),\n    [`--mantine-color-${name}-light-color`]: `var(--mantine-color-${name}-${Math.max(primaryShade - 5, 0)})`,\n    [`--mantine-color-${name}-outline`]: `var(--mantine-color-${name}-${Math.max(primaryShade - 4, 0)})`,\n    [`--mantine-color-${name}-outline-hover`]: alpha(\n      theme.colors[color][Math.max(primaryShade - 4, 0)],\n      0.05\n    ),\n  };\n\n  if (!withColorValues) {\n    return dynamicVariables;\n  }\n\n  return {\n    [`--mantine-color-${name}-0`]: theme.colors[color][0],\n    [`--mantine-color-${name}-1`]: theme.colors[color][1],\n    [`--mantine-color-${name}-2`]: theme.colors[color][2],\n    [`--mantine-color-${name}-3`]: theme.colors[color][3],\n    [`--mantine-color-${name}-4`]: theme.colors[color][4],\n    [`--mantine-color-${name}-5`]: theme.colors[color][5],\n    [`--mantine-color-${name}-6`]: theme.colors[color][6],\n    [`--mantine-color-${name}-7`]: theme.colors[color][7],\n    [`--mantine-color-${name}-8`]: theme.colors[color][8],\n    [`--mantine-color-${name}-9`]: theme.colors[color][9],\n    ...dynamicVariables,\n  };\n}\n","import { keys, rem } from '../../utils';\nimport { getPrimaryContrastColor, getPrimaryShade } from '../color-functions';\nimport { ConvertCSSVariablesInput } from '../convert-css-variables';\nimport { MantineTheme } from '../theme.types';\nimport { getCSSColorVariables } from './get-css-color-variables';\nimport { isVirtualColor } from './virtual-color/virtual-color';\n\nexport type CSSVariablesResolver = (theme: MantineTheme) => ConvertCSSVariablesInput;\n\nfunction assignSizeVariables(\n  variables: Record<string, string>,\n  sizes: Record<string, string>,\n  name: string\n) {\n  keys(sizes).forEach((size) =>\n    Object.assign(variables, { [`--mantine-${name}-${size}`]: sizes[size] })\n  );\n}\n\nexport const defaultCssVariablesResolver: CSSVariablesResolver = (theme) => {\n  const lightPrimaryShade = getPrimaryShade(theme, 'light');\n  const defaultRadius =\n    theme.defaultRadius in theme.radius\n      ? theme.radius[theme.defaultRadius as 'xs']\n      : rem(theme.defaultRadius);\n\n  const result: ConvertCSSVariablesInput = {\n    variables: {\n      '--mantine-scale': theme.scale.toString(),\n      '--mantine-cursor-type': theme.cursorType,\n      '--mantine-color-scheme': 'light dark',\n      '--mantine-webkit-font-smoothing': theme.fontSmoothing ? 'antialiased' : 'unset',\n      '--mantine-moz-font-smoothing': theme.fontSmoothing ? 'grayscale' : 'unset',\n      '--mantine-color-white': theme.white,\n      '--mantine-color-black': theme.black,\n      '--mantine-line-height': theme.lineHeights.md,\n      '--mantine-font-family': theme.fontFamily,\n      '--mantine-font-family-monospace': theme.fontFamilyMonospace,\n      '--mantine-font-family-headings': theme.headings.fontFamily,\n      '--mantine-heading-font-weight': theme.headings.fontWeight,\n      '--mantine-heading-text-wrap': theme.headings.textWrap,\n      '--mantine-radius-default': defaultRadius,\n\n      // Primary colors\n      '--mantine-primary-color-filled': `var(--mantine-color-${theme.primaryColor}-filled)`,\n      '--mantine-primary-color-filled-hover': `var(--mantine-color-${theme.primaryColor}-filled-hover)`,\n      '--mantine-primary-color-light': `var(--mantine-color-${theme.primaryColor}-light)`,\n      '--mantine-primary-color-light-hover': `var(--mantine-color-${theme.primaryColor}-light-hover)`,\n      '--mantine-primary-color-light-color': `var(--mantine-color-${theme.primaryColor}-light-color)`,\n    },\n    light: {\n      '--mantine-primary-color-contrast': getPrimaryContrastColor(theme, 'light'),\n      '--mantine-color-bright': 'var(--mantine-color-black)',\n      '--mantine-color-text': theme.black,\n      '--mantine-color-body': theme.white,\n      '--mantine-color-error': 'var(--mantine-color-red-6)',\n      '--mantine-color-placeholder': 'var(--mantine-color-gray-5)',\n      '--mantine-color-anchor': `var(--mantine-color-${theme.primaryColor}-${lightPrimaryShade})`,\n      '--mantine-color-default': 'var(--mantine-color-white)',\n      '--mantine-color-default-hover': 'var(--mantine-color-gray-0)',\n      '--mantine-color-default-color': 'var(--mantine-color-black)',\n      '--mantine-color-default-border': 'var(--mantine-color-gray-4)',\n      '--mantine-color-dimmed': 'var(--mantine-color-gray-6)',\n    },\n    dark: {\n      '--mantine-primary-color-contrast': getPrimaryContrastColor(theme, 'dark'),\n      '--mantine-color-bright': 'var(--mantine-color-white)',\n      '--mantine-color-text': 'var(--mantine-color-dark-0)',\n      '--mantine-color-body': 'var(--mantine-color-dark-7)',\n      '--mantine-color-error': 'var(--mantine-color-red-8)',\n      '--mantine-color-placeholder': 'var(--mantine-color-dark-3)',\n      '--mantine-color-anchor': `var(--mantine-color-${theme.primaryColor}-4)`,\n      '--mantine-color-default': 'var(--mantine-color-dark-6)',\n      '--mantine-color-default-hover': 'var(--mantine-color-dark-5)',\n      '--mantine-color-default-color': 'var(--mantine-color-white)',\n      '--mantine-color-default-border': 'var(--mantine-color-dark-4)',\n      '--mantine-color-dimmed': 'var(--mantine-color-dark-2)',\n    },\n  };\n\n  assignSizeVariables(result.variables, theme.breakpoints, 'breakpoint');\n  assignSizeVariables(result.variables, theme.spacing, 'spacing');\n  assignSizeVariables(result.variables, theme.fontSizes, 'font-size');\n  assignSizeVariables(result.variables, theme.lineHeights, 'line-height');\n  assignSizeVariables(result.variables, theme.shadows, 'shadow');\n  assignSizeVariables(result.variables, theme.radius, 'radius');\n\n  theme.colors[theme.primaryColor].forEach((_, index) => {\n    result.variables[`--mantine-primary-color-${index}`] =\n      `var(--mantine-color-${theme.primaryColor}-${index})`;\n  });\n\n  keys(theme.colors).forEach((color) => {\n    const value = theme.colors[color];\n\n    if (isVirtualColor(value)) {\n      Object.assign(\n        result.light,\n        getCSSColorVariables({\n          theme,\n          name: value.name,\n          color: value.light,\n          colorScheme: 'light',\n          withColorValues: true,\n        })\n      );\n\n      Object.assign(\n        result.dark,\n        getCSSColorVariables({\n          theme,\n          name: value.name,\n          color: value.dark,\n          colorScheme: 'dark',\n          withColorValues: true,\n        })\n      );\n\n      return;\n    }\n\n    value.forEach((shade, index) => {\n      result.variables[`--mantine-color-${color}-${index}`] = shade;\n    });\n\n    Object.assign(\n      result.light,\n      getCSSColorVariables({\n        theme,\n        color,\n        colorScheme: 'light',\n        withColorValues: false,\n      })\n    );\n\n    Object.assign(\n      result.dark,\n      getCSSColorVariables({\n        theme,\n        color,\n        colorScheme: 'dark',\n        withColorValues: false,\n      })\n    );\n  });\n\n  const headings = theme.headings.sizes;\n\n  keys(headings).forEach((heading) => {\n    result.variables[`--mantine-${heading}-font-size`] = headings[heading].fontSize;\n    result.variables[`--mantine-${heading}-line-height`] = headings[heading].lineHeight;\n    result.variables[`--mantine-${heading}-font-weight`] =\n      headings[heading].fontWeight || theme.headings.fontWeight;\n  });\n\n  return result;\n};\n","import { colorsTuple } from '../../color-functions';\nimport { MantineColor, MantineColorsTuple } from '../../theme.types';\n\ninterface VirtualColorInput {\n  dark: MantineColor;\n  light: MantineColor;\n  name: string;\n}\n\ntype VirtualColor = MantineColorsTuple & {\n  'mantine-virtual-color': true;\n  name: string;\n  dark: MantineColor;\n  light: MantineColor;\n};\n\nexport function virtualColor(input: VirtualColorInput): MantineColorsTuple {\n  const result = colorsTuple(\n    Array.from({ length: 10 }).map((_, i) => `var(--mantine-color-${input.name}-${i})`)\n  );\n\n  Object.defineProperty(result, 'mantine-virtual-color', {\n    enumerable: false,\n    writable: false,\n    configurable: false,\n    value: true,\n  });\n\n  Object.defineProperty(result, 'dark', {\n    enumerable: false,\n    writable: false,\n    configurable: false,\n    value: input.dark,\n  });\n\n  Object.defineProperty(result, 'light', {\n    enumerable: false,\n    writable: false,\n    configurable: false,\n    value: input.light,\n  });\n\n  Object.defineProperty(result, 'name', {\n    enumerable: false,\n    writable: false,\n    configurable: false,\n    value: input.name,\n  });\n\n  return result;\n}\n\nexport function isVirtualColor(value: unknown): value is VirtualColor {\n  return !!value && typeof value === 'object' && 'mantine-virtual-color' in value;\n}\n","import { keys } from '../../utils';\nimport { ConvertCSSVariablesInput } from '../convert-css-variables';\nimport { DEFAULT_THEME } from '../default-theme';\nimport { defaultCssVariablesResolver } from './default-css-variables-resolver';\n\nconst defaultCssVariables = defaultCssVariablesResolver(DEFAULT_THEME);\n\nexport function removeDefaultVariables(input: ConvertCSSVariablesInput): ConvertCSSVariablesInput {\n  const cleaned: ConvertCSSVariablesInput = {\n    variables: {},\n    light: {},\n    dark: {},\n  };\n\n  keys(input.variables).forEach((key) => {\n    if (defaultCssVariables.variables[key] !== input.variables[key]) {\n      cleaned.variables[key] = input.variables[key];\n    }\n  });\n\n  keys(input.light).forEach((key) => {\n    if (defaultCssVariables.light[key] !== input.light[key]) {\n      cleaned.light[key] = input.light[key];\n    }\n  });\n\n  keys(input.dark).forEach((key) => {\n    if (defaultCssVariables.dark[key] !== input.dark[key]) {\n      cleaned.dark[key] = input.dark[key];\n    }\n  });\n\n  return cleaned;\n}\n","import { convertCssVariables } from '../convert-css-variables/convert-css-variables';\nimport { useMantineCssVariablesResolver, useMantineStyleNonce } from '../Mantine.context';\nimport { useMantineTheme } from '../MantineThemeProvider';\nimport { getMergedVariables } from './get-merged-variables';\nimport { removeDefaultVariables } from './remove-default-variables';\n\ninterface MantineCssVariablesProps {\n  cssVariablesSelector: string;\n  deduplicateCssVariables: boolean;\n}\n\nfunction getColorSchemeCssVariables(selector: string) {\n  return `\n  ${selector}[data-mantine-color-scheme=\"dark\"] { --mantine-color-scheme: dark; }\n  ${selector}[data-mantine-color-scheme=\"light\"] { --mantine-color-scheme: light; }\n`;\n}\n\nexport function MantineCssVariables({\n  cssVariablesSelector,\n  deduplicateCssVariables,\n}: MantineCssVariablesProps) {\n  const theme = useMantineTheme();\n  const nonce = useMantineStyleNonce();\n  const generator = useMantineCssVariablesResolver();\n  const mergedVariables = getMergedVariables({ theme, generator });\n  const shouldCleanVariables = cssVariablesSelector === ':root' && deduplicateCssVariables;\n  const cleanedVariables = shouldCleanVariables\n    ? removeDefaultVariables(mergedVariables)\n    : mergedVariables;\n  const css = convertCssVariables(cleanedVariables, cssVariablesSelector);\n\n  if (css) {\n    return (\n      <style\n        data-mantine-styles\n        nonce={nonce?.()}\n        dangerouslySetInnerHTML={{\n          __html: `${css}${\n            shouldCleanVariables ? '' : getColorSchemeCssVariables(cssVariablesSelector)\n          }`,\n        }}\n      />\n    );\n  }\n\n  return null;\n}\n\nMantineCssVariables.displayName = '@mantine/CssVariables';\n","import { deepMerge } from '../../utils';\nimport { ConvertCSSVariablesInput } from '../convert-css-variables';\nimport { MantineTheme } from '../theme.types';\nimport { defaultCssVariablesResolver } from './default-css-variables-resolver';\n\ninterface GetMergedVariablesInput {\n  theme: MantineTheme;\n  generator?: (theme: MantineTheme) => ConvertCSSVariablesInput;\n}\n\nexport function getMergedVariables({ theme, generator }: GetMergedVariablesInput) {\n  const defaultResolver = defaultCssVariablesResolver(theme);\n  const providerGenerator = generator?.(theme);\n  return providerGenerator ? deepMerge(defaultResolver, providerGenerator) : defaultResolver;\n}\n","import { CSSVariables, cssVariablesObjectToString } from './css-variables-object-to-string';\nimport { wrapWithSelector } from './wrap-with-selector';\n\nexport interface ConvertCSSVariablesInput {\n  /** Shared CSS variables that should be accessible independent from color scheme */\n  variables: CSSVariables;\n\n  /** CSS variables available only in dark color scheme */\n  dark: CSSVariables;\n\n  /** CSS variables available only in light color scheme */\n  light: CSSVariables;\n}\n\nexport function convertCssVariables(input: ConvertCSSVariablesInput, selector: string) {\n  const sharedVariables = cssVariablesObjectToString(input.variables);\n  const shared = sharedVariables ? wrapWithSelector(selector, sharedVariables) : '';\n  const dark = cssVariablesObjectToString(input.dark);\n  const light = cssVariablesObjectToString(input.light);\n\n  const darkForced = dark\n    ? selector === ':host'\n      ? wrapWithSelector(`${selector}([data-mantine-color-scheme=\"dark\"])`, dark)\n      : wrapWithSelector(`${selector}[data-mantine-color-scheme=\"dark\"]`, dark)\n    : '';\n\n  const lightForced = light\n    ? selector === ':host'\n      ? wrapWithSelector(`${selector}([data-mantine-color-scheme=\"light\"])`, light)\n      : wrapWithSelector(`${selector}[data-mantine-color-scheme=\"light\"]`, light)\n    : '';\n\n  return `${shared}${darkForced}${lightForced}`;\n}\n","import { useEffect, useLayoutEffect } from 'react';\n\n// UseLayoutEffect will show warning if used during ssr, e.g. with Next.js\n// UseIsomorphicEffect removes it by replacing useLayoutEffect with useEffect during ssr\nexport const useIsomorphicEffect = typeof document !== 'undefined' ? useLayoutEffect : useEffect;\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { useIsomorphicEffect } from '@mantine/hooks';\nimport type { MantineColorSchemeManager } from '../color-scheme-managers';\nimport type { MantineColorScheme } from '../theme.types';\n\nfunction setColorSchemeAttribute(\n  colorScheme: MantineColorScheme,\n  getRootElement: () => HTMLElement | undefined\n) {\n  const hasDarkColorScheme =\n    typeof window !== 'undefined' &&\n    'matchMedia' in window &&\n    window.matchMedia('(prefers-color-scheme: dark)')?.matches;\n\n  const computedColorScheme =\n    colorScheme !== 'auto' ? colorScheme : hasDarkColorScheme ? 'dark' : 'light';\n  getRootElement()?.setAttribute('data-mantine-color-scheme', computedColorScheme);\n}\n\ntype MediaQueryCallback = (event: { matches: boolean; media: string }) => void;\n\ninterface UseProviderColorSchemeOptions {\n  manager: MantineColorSchemeManager;\n  defaultColorScheme: MantineColorScheme;\n  forceColorScheme: 'light' | 'dark' | undefined;\n  getRootElement: () => HTMLElement | undefined;\n}\n\nexport function useProviderColorScheme({\n  manager,\n  defaultColorScheme,\n  getRootElement,\n  forceColorScheme,\n}: UseProviderColorSchemeOptions) {\n  const media = useRef<MediaQueryList>(null);\n  const [value, setValue] = useState(() => manager.get(defaultColorScheme));\n  const colorSchemeValue = forceColorScheme || value;\n\n  const setColorScheme = useCallback(\n    (colorScheme: MantineColorScheme) => {\n      if (!forceColorScheme) {\n        setColorSchemeAttribute(colorScheme, getRootElement);\n        setValue(colorScheme);\n        manager.set(colorScheme);\n      }\n    },\n    [manager.set, colorSchemeValue, forceColorScheme]\n  );\n\n  const clearColorScheme = useCallback(() => {\n    setValue(defaultColorScheme);\n    setColorSchemeAttribute(defaultColorScheme, getRootElement);\n    manager.clear();\n  }, [manager.clear, defaultColorScheme]);\n\n  useEffect(() => {\n    manager.subscribe(setColorScheme);\n    return manager.unsubscribe;\n  }, [manager.subscribe, manager.unsubscribe]);\n\n  useIsomorphicEffect(() => {\n    setColorSchemeAttribute(manager.get(defaultColorScheme), getRootElement);\n  }, []);\n\n  useEffect(() => {\n    if (forceColorScheme) {\n      setColorSchemeAttribute(forceColorScheme, getRootElement);\n      return () => {};\n    }\n\n    if (forceColorScheme === undefined) {\n      setColorSchemeAttribute(value, getRootElement);\n    }\n\n    if (typeof window !== 'undefined' && 'matchMedia' in window) {\n      media.current = window.matchMedia('(prefers-color-scheme: dark)');\n    }\n\n    const listener: MediaQueryCallback = (event) => {\n      if (value === 'auto') {\n        setColorSchemeAttribute(event.matches ? 'dark' : 'light', getRootElement);\n      }\n    };\n\n    media.current?.addEventListener('change', listener);\n    return () => media.current?.removeEventListener('change', listener);\n  }, [value, forceColorScheme]);\n\n  return { colorScheme: colorSchemeValue, setColorScheme, clearColorScheme };\n}\n","import './global.css';\n\nimport { localStorageColorSchemeManager, MantineColorSchemeManager } from './color-scheme-managers';\nimport { MantineContext, MantineStylesTransform } from './Mantine.context';\nimport { MantineClasses } from './MantineClasses';\nimport { CSSVariablesResolver, MantineCssVariables } from './MantineCssVariables';\nimport { MantineThemeProvider } from './MantineThemeProvider';\nimport { suppressNextjsWarning } from './suppress-nextjs-warning';\nimport type { MantineColorScheme, MantineThemeOverride } from './theme.types';\nimport { useProviderColorScheme } from './use-mantine-color-scheme';\nimport { useRespectReduceMotion } from './use-respect-reduce-motion';\n\nsuppressNextjsWarning();\n\nexport interface MantineProviderProps {\n  /** Theme override object */\n  theme?: MantineThemeOverride;\n\n  /** Used to retrieve/set color scheme value in external storage, by default uses `window.localStorage` */\n  colorSchemeManager?: MantineColorSchemeManager;\n\n  /** Default color scheme value used when `colorSchemeManager` cannot retrieve value from external storage, `light` by default */\n  defaultColorScheme?: MantineColorScheme;\n\n  /** Forces color scheme value, if set, MantineProvider ignores `colorSchemeManager` and `defaultColorScheme` */\n  forceColorScheme?: 'light' | 'dark';\n\n  /** CSS selector to which CSS variables should be added, `:root` by default */\n  cssVariablesSelector?: string;\n\n  /** Determines whether theme CSS variables should be added to given `cssVariablesSelector`, `true` by default */\n  withCssVariables?: boolean;\n\n  /** Determines whether CSS variables should be deduplicated: if CSS variable has the same value as in default theme, it is not added in the runtime. `true` by default. */\n  deduplicateCssVariables?: boolean;\n\n  /** Function to resolve root element to set `data-mantine-color-scheme` attribute, must return undefined on server, `() => document.documentElement` by default */\n  getRootElement?: () => HTMLElement | undefined;\n\n  /** A prefix for components static classes (for example {selector}-Text-root), `mantine` by default */\n  classNamesPrefix?: string;\n\n  /** Function to generate nonce attribute added to all generated `<style />` tags */\n  getStyleNonce?: () => string;\n\n  /** Function to generate CSS variables based on theme object */\n  cssVariablesResolver?: CSSVariablesResolver;\n\n  /** Determines whether components should have static classes, for example, `mantine-Button-root`. `true` by default */\n  withStaticClasses?: boolean;\n\n  /** Determines whether global classes should be added with `<style />` tag. Global classes are required for `hiddenFrom`/`visibleFrom` and `lightHidden`/`darkHidden` props to work. `true` by default. */\n  withGlobalClasses?: boolean;\n\n  /** An object to transform `styles` and `sx` props into css classes, can be used with CSS-in-JS libraries */\n  stylesTransform?: MantineStylesTransform;\n\n  /** Your application */\n  children?: React.ReactNode;\n\n  /** Environment at which the provider is used, `'test'` environment disables all transitions and portals */\n  env?: 'default' | 'test';\n}\n\nexport function MantineProvider({\n  theme,\n  children,\n  getStyleNonce,\n  withStaticClasses = true,\n  withGlobalClasses = true,\n  deduplicateCssVariables = true,\n  withCssVariables = true,\n  cssVariablesSelector = ':root',\n  classNamesPrefix = 'mantine',\n  colorSchemeManager = localStorageColorSchemeManager(),\n  defaultColorScheme = 'light',\n  getRootElement = () => document.documentElement,\n  cssVariablesResolver,\n  forceColorScheme,\n  stylesTransform,\n  env,\n}: MantineProviderProps) {\n  const { colorScheme, setColorScheme, clearColorScheme } = useProviderColorScheme({\n    defaultColorScheme,\n    forceColorScheme,\n    manager: colorSchemeManager,\n    getRootElement,\n  });\n\n  useRespectReduceMotion({\n    respectReducedMotion: theme?.respectReducedMotion || false,\n    getRootElement,\n  });\n\n  return (\n    <MantineContext.Provider\n      value={{\n        colorScheme,\n        setColorScheme,\n        clearColorScheme,\n        getRootElement,\n        classNamesPrefix,\n        getStyleNonce,\n        cssVariablesResolver,\n        cssVariablesSelector,\n        withStaticClasses,\n        stylesTransform,\n        env,\n      }}\n    >\n      <MantineThemeProvider theme={theme}>\n        {withCssVariables && (\n          <MantineCssVariables\n            cssVariablesSelector={cssVariablesSelector}\n            deduplicateCssVariables={deduplicateCssVariables}\n          />\n        )}\n        {withGlobalClasses && <MantineClasses />}\n        {children}\n      </MantineThemeProvider>\n    </MantineContext.Provider>\n  );\n}\n\nMantineProvider.displayName = '@mantine/core/MantineProvider';\n\nexport interface HeadlessMantineProviderProps {\n  /** Theme override object */\n  theme?: MantineThemeOverride;\n\n  /** Your application */\n  children?: React.ReactNode;\n}\n\nexport function HeadlessMantineProvider({ children, theme }: HeadlessMantineProviderProps) {\n  return (\n    <MantineContext.Provider\n      value={{\n        colorScheme: 'auto',\n        setColorScheme: () => {},\n        clearColorScheme: () => {},\n        getRootElement: () => document.documentElement,\n        classNamesPrefix: 'mantine',\n        cssVariablesSelector: ':root',\n        withStaticClasses: false,\n        headless: true,\n      }}\n    >\n      <MantineThemeProvider theme={theme}>{children}</MantineThemeProvider>\n    </MantineContext.Provider>\n  );\n}\n\nHeadlessMantineProvider.displayName = '@mantine/core/HeadlessMantineProvider';\n","import { useIsomorphicEffect } from '@mantine/hooks';\n\ninterface UseRespectReduceMotionOptions {\n  respectReducedMotion: boolean;\n  getRootElement: () => HTMLElement | undefined;\n}\n\nexport function useRespectReduceMotion({\n  respectReducedMotion,\n  getRootElement,\n}: UseRespectReduceMotionOptions) {\n  useIsomorphicEffect(() => {\n    if (respectReducedMotion) {\n      getRootElement()?.setAttribute('data-respect-reduced-motion', 'true');\n    }\n  }, [respectReducedMotion]);\n}\n","/* eslint-disable no-console */\nexport function suppressNextjsWarning() {\n  const originalError = console.error;\n\n  console.error = (...args) => {\n    if (\n      args.length > 1 &&\n      typeof args[0] === 'string' &&\n      args[0].toLowerCase().includes('extra attributes from the server') &&\n      typeof args[1] === 'string' &&\n      args[1].toLowerCase().includes('data-mantine-color-scheme')\n    ) {\n      // Suppress the warning\n    } else {\n      originalError(...args);\n    }\n  };\n}\n","////////////////////////////////////////////////////////////////////////////////\n//#region Types and Constants\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Actions represent the type of change to a location value.\n */\nexport enum Action {\n  /**\n   * A POP indicates a change to an arbitrary index in the history stack, such\n   * as a back or forward navigation. It does not describe the direction of the\n   * navigation, only that the current index changed.\n   *\n   * Note: This is the default action for newly created history objects.\n   */\n  Pop = \"POP\",\n\n  /**\n   * A PUSH indicates a new entry being added to the history stack, such as when\n   * a link is clicked and a new page loads. When this happens, all subsequent\n   * entries in the stack are lost.\n   */\n  Push = \"PUSH\",\n\n  /**\n   * A REPLACE indicates the entry at the current index in the history stack\n   * being replaced by a new one.\n   */\n  Replace = \"REPLACE\",\n}\n\n/**\n * The pathname, search, and hash values of a URL.\n */\nexport interface Path {\n  /**\n   * A URL pathname, beginning with a /.\n   */\n  pathname: string;\n\n  /**\n   * A URL search string, beginning with a ?.\n   */\n  search: string;\n\n  /**\n   * A URL fragment identifier, beginning with a #.\n   */\n  hash: string;\n}\n\n// TODO: (v7) Change the Location generic default from `any` to `unknown` and\n// remove Remix `useLocation` wrapper.\n\n/**\n * An entry in a history stack. A location contains information about the\n * URL path, as well as possibly some arbitrary state and a key.\n */\nexport interface Location<State = any> extends Path {\n  /**\n   * A value of arbitrary data associated with this location.\n   */\n  state: State;\n\n  /**\n   * A unique string associated with this location. May be used to safely store\n   * and retrieve data in some other storage API, like `localStorage`.\n   *\n   * Note: This value is always \"default\" on the initial location.\n   */\n  key: string;\n}\n\n/**\n * A change to the current location.\n */\nexport interface Update {\n  /**\n   * The action that triggered the change.\n   */\n  action: Action;\n\n  /**\n   * The new location.\n   */\n  location: Location;\n\n  /**\n   * The delta between this location and the former location in the history stack\n   */\n  delta: number | null;\n}\n\n/**\n * A function that receives notifications about location changes.\n */\nexport interface Listener {\n  (update: Update): void;\n}\n\n/**\n * Describes a location that is the destination of some navigation, either via\n * `history.push` or `history.replace`. This may be either a URL or the pieces\n * of a URL path.\n */\nexport type To = string | Partial<Path>;\n\n/**\n * A history is an interface to the navigation stack. The history serves as the\n * source of truth for the current location, as well as provides a set of\n * methods that may be used to change it.\n *\n * It is similar to the DOM's `window.history` object, but with a smaller, more\n * focused API.\n */\nexport interface History {\n  /**\n   * The last action that modified the current location. This will always be\n   * Action.Pop when a history instance is first created. This value is mutable.\n   */\n  readonly action: Action;\n\n  /**\n   * The current location. This value is mutable.\n   */\n  readonly location: Location;\n\n  /**\n   * Returns a valid href for the given `to` value that may be used as\n   * the value of an <a href> attribute.\n   *\n   * @param to - The destination URL\n   */\n  createHref(to: To): string;\n\n  /**\n   * Returns a URL for the given `to` value\n   *\n   * @param to - The destination URL\n   */\n  createURL(to: To): URL;\n\n  /**\n   * Encode a location the same way window.history would do (no-op for memory\n   * history) so we ensure our PUSH/REPLACE navigations for data routers\n   * behave the same as POP\n   *\n   * @param to Unencoded path\n   */\n  encodeLocation(to: To): Path;\n\n  /**\n   * Pushes a new location onto the history stack, increasing its length by one.\n   * If there were any entries in the stack after the current one, they are\n   * lost.\n   *\n   * @param to - The new URL\n   * @param state - Data to associate with the new location\n   */\n  push(to: To, state?: any): void;\n\n  /**\n   * Replaces the current location in the history stack with a new one.  The\n   * location that was replaced will no longer be available.\n   *\n   * @param to - The new URL\n   * @param state - Data to associate with the new location\n   */\n  replace(to: To, state?: any): void;\n\n  /**\n   * Navigates `n` entries backward/forward in the history stack relative to the\n   * current index. For example, a \"back\" navigation would use go(-1).\n   *\n   * @param delta - The delta in the stack index\n   */\n  go(delta: number): void;\n\n  /**\n   * Sets up a listener that will be called whenever the current location\n   * changes.\n   *\n   * @param listener - A function that will be called when the location changes\n   * @returns unlisten - A function that may be used to stop listening\n   */\n  listen(listener: Listener): () => void;\n}\n\ntype HistoryState = {\n  usr: any;\n  key?: string;\n  idx: number;\n};\n\nconst PopStateEventType = \"popstate\";\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Memory History\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A user-supplied object that describes a location. Used when providing\n * entries to `createMemoryHistory` via its `initialEntries` option.\n */\nexport type InitialEntry = string | Partial<Location>;\n\nexport type MemoryHistoryOptions = {\n  initialEntries?: InitialEntry[];\n  initialIndex?: number;\n  v5Compat?: boolean;\n};\n\n/**\n * A memory history stores locations in memory. This is useful in stateful\n * environments where there is no web browser, such as node tests or React\n * Native.\n */\nexport interface MemoryHistory extends History {\n  /**\n   * The current index in the history stack.\n   */\n  readonly index: number;\n}\n\n/**\n * Memory history stores the current location in memory. It is designed for use\n * in stateful non-browser environments like tests and React Native.\n */\nexport function createMemoryHistory(\n  options: MemoryHistoryOptions = {}\n): MemoryHistory {\n  let { initialEntries = [\"/\"], initialIndex, v5Compat = false } = options;\n  let entries: Location[]; // Declare so we can access from createMemoryLocation\n  entries = initialEntries.map((entry, index) =>\n    createMemoryLocation(\n      entry,\n      typeof entry === \"string\" ? null : entry.state,\n      index === 0 ? \"default\" : undefined\n    )\n  );\n  let index = clampIndex(\n    initialIndex == null ? entries.length - 1 : initialIndex\n  );\n  let action = Action.Pop;\n  let listener: Listener | null = null;\n\n  function clampIndex(n: number): number {\n    return Math.min(Math.max(n, 0), entries.length - 1);\n  }\n  function getCurrentLocation(): Location {\n    return entries[index];\n  }\n  function createMemoryLocation(\n    to: To,\n    state: any = null,\n    key?: string\n  ): Location {\n    let location = createLocation(\n      entries ? getCurrentLocation().pathname : \"/\",\n      to,\n      state,\n      key\n    );\n    warning(\n      location.pathname.charAt(0) === \"/\",\n      `relative pathnames are not supported in memory history: ${JSON.stringify(\n        to\n      )}`\n    );\n    return location;\n  }\n\n  function createHref(to: To) {\n    return typeof to === \"string\" ? to : createPath(to);\n  }\n\n  let history: MemoryHistory = {\n    get index() {\n      return index;\n    },\n    get action() {\n      return action;\n    },\n    get location() {\n      return getCurrentLocation();\n    },\n    createHref,\n    createURL(to) {\n      return new URL(createHref(to), \"http://localhost\");\n    },\n    encodeLocation(to: To) {\n      let path = typeof to === \"string\" ? parsePath(to) : to;\n      return {\n        pathname: path.pathname || \"\",\n        search: path.search || \"\",\n        hash: path.hash || \"\",\n      };\n    },\n    push(to, state) {\n      action = Action.Push;\n      let nextLocation = createMemoryLocation(to, state);\n      index += 1;\n      entries.splice(index, entries.length, nextLocation);\n      if (v5Compat && listener) {\n        listener({ action, location: nextLocation, delta: 1 });\n      }\n    },\n    replace(to, state) {\n      action = Action.Replace;\n      let nextLocation = createMemoryLocation(to, state);\n      entries[index] = nextLocation;\n      if (v5Compat && listener) {\n        listener({ action, location: nextLocation, delta: 0 });\n      }\n    },\n    go(delta) {\n      action = Action.Pop;\n      let nextIndex = clampIndex(index + delta);\n      let nextLocation = entries[nextIndex];\n      index = nextIndex;\n      if (listener) {\n        listener({ action, location: nextLocation, delta });\n      }\n    },\n    listen(fn: Listener) {\n      listener = fn;\n      return () => {\n        listener = null;\n      };\n    },\n  };\n\n  return history;\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Browser History\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A browser history stores the current location in regular URLs in a web\n * browser environment. This is the standard for most web apps and provides the\n * cleanest URLs the browser's address bar.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#browserhistory\n */\nexport interface BrowserHistory extends UrlHistory {}\n\nexport type BrowserHistoryOptions = UrlHistoryOptions;\n\n/**\n * Browser history stores the location in regular URLs. This is the standard for\n * most web apps, but it requires some configuration on the server to ensure you\n * serve the same app at multiple URLs.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createbrowserhistory\n */\nexport function createBrowserHistory(\n  options: BrowserHistoryOptions = {}\n): BrowserHistory {\n  function createBrowserLocation(\n    window: Window,\n    globalHistory: Window[\"history\"]\n  ) {\n    let { pathname, search, hash } = window.location;\n    return createLocation(\n      \"\",\n      { pathname, search, hash },\n      // state defaults to `null` because `window.history.state` does\n      (globalHistory.state && globalHistory.state.usr) || null,\n      (globalHistory.state && globalHistory.state.key) || \"default\"\n    );\n  }\n\n  function createBrowserHref(window: Window, to: To) {\n    return typeof to === \"string\" ? to : createPath(to);\n  }\n\n  return getUrlBasedHistory(\n    createBrowserLocation,\n    createBrowserHref,\n    null,\n    options\n  );\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Hash History\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A hash history stores the current location in the fragment identifier portion\n * of the URL in a web browser environment.\n *\n * This is ideal for apps that do not control the server for some reason\n * (because the fragment identifier is never sent to the server), including some\n * shared hosting environments that do not provide fine-grained controls over\n * which pages are served at which URLs.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#hashhistory\n */\nexport interface HashHistory extends UrlHistory {}\n\nexport type HashHistoryOptions = UrlHistoryOptions;\n\n/**\n * Hash history stores the location in window.location.hash. This makes it ideal\n * for situations where you don't want to send the location to the server for\n * some reason, either because you do cannot configure it or the URL space is\n * reserved for something else.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createhashhistory\n */\nexport function createHashHistory(\n  options: HashHistoryOptions = {}\n): HashHistory {\n  function createHashLocation(\n    window: Window,\n    globalHistory: Window[\"history\"]\n  ) {\n    let {\n      pathname = \"/\",\n      search = \"\",\n      hash = \"\",\n    } = parsePath(window.location.hash.substr(1));\n\n    // Hash URL should always have a leading / just like window.location.pathname\n    // does, so if an app ends up at a route like /#something then we add a\n    // leading slash so all of our path-matching behaves the same as if it would\n    // in a browser router.  This is particularly important when there exists a\n    // root splat route (<Route path=\"*\">) since that matches internally against\n    // \"/*\" and we'd expect /#something to 404 in a hash router app.\n    if (!pathname.startsWith(\"/\") && !pathname.startsWith(\".\")) {\n      pathname = \"/\" + pathname;\n    }\n\n    return createLocation(\n      \"\",\n      { pathname, search, hash },\n      // state defaults to `null` because `window.history.state` does\n      (globalHistory.state && globalHistory.state.usr) || null,\n      (globalHistory.state && globalHistory.state.key) || \"default\"\n    );\n  }\n\n  function createHashHref(window: Window, to: To) {\n    let base = window.document.querySelector(\"base\");\n    let href = \"\";\n\n    if (base && base.getAttribute(\"href\")) {\n      let url = window.location.href;\n      let hashIndex = url.indexOf(\"#\");\n      href = hashIndex === -1 ? url : url.slice(0, hashIndex);\n    }\n\n    return href + \"#\" + (typeof to === \"string\" ? to : createPath(to));\n  }\n\n  function validateHashLocation(location: Location, to: To) {\n    warning(\n      location.pathname.charAt(0) === \"/\",\n      `relative pathnames are not supported in hash history.push(${JSON.stringify(\n        to\n      )})`\n    );\n  }\n\n  return getUrlBasedHistory(\n    createHashLocation,\n    createHashHref,\n    validateHashLocation,\n    options\n  );\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region UTILS\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * @private\n */\nexport function invariant(value: boolean, message?: string): asserts value;\nexport function invariant<T>(\n  value: T | null | undefined,\n  message?: string\n): asserts value is T;\nexport function invariant(value: any, message?: string) {\n  if (value === false || value === null || typeof value === \"undefined\") {\n    throw new Error(message);\n  }\n}\n\nexport function warning(cond: any, message: string) {\n  if (!cond) {\n    // eslint-disable-next-line no-console\n    if (typeof console !== \"undefined\") console.warn(message);\n\n    try {\n      // Welcome to debugging history!\n      //\n      // This error is thrown as a convenience, so you can more easily\n      // find the source for a warning that appears in the console by\n      // enabling \"pause on exceptions\" in your JavaScript debugger.\n      throw new Error(message);\n      // eslint-disable-next-line no-empty\n    } catch (e) {}\n  }\n}\n\nfunction createKey() {\n  return Math.random().toString(36).substr(2, 8);\n}\n\n/**\n * For browser-based histories, we combine the state and key into an object\n */\nfunction getHistoryState(location: Location, index: number): HistoryState {\n  return {\n    usr: location.state,\n    key: location.key,\n    idx: index,\n  };\n}\n\n/**\n * Creates a Location object with a unique key from the given Path\n */\nexport function createLocation(\n  current: string | Location,\n  to: To,\n  state: any = null,\n  key?: string\n): Readonly<Location> {\n  let location: Readonly<Location> = {\n    pathname: typeof current === \"string\" ? current : current.pathname,\n    search: \"\",\n    hash: \"\",\n    ...(typeof to === \"string\" ? parsePath(to) : to),\n    state,\n    // TODO: This could be cleaned up.  push/replace should probably just take\n    // full Locations now and avoid the need to run through this flow at all\n    // But that's a pretty big refactor to the current test suite so going to\n    // keep as is for the time being and just let any incoming keys take precedence\n    key: (to && (to as Location).key) || key || createKey(),\n  };\n  return location;\n}\n\n/**\n * Creates a string URL path from the given pathname, search, and hash components.\n */\nexport function createPath({\n  pathname = \"/\",\n  search = \"\",\n  hash = \"\",\n}: Partial<Path>) {\n  if (search && search !== \"?\")\n    pathname += search.charAt(0) === \"?\" ? search : \"?\" + search;\n  if (hash && hash !== \"#\")\n    pathname += hash.charAt(0) === \"#\" ? hash : \"#\" + hash;\n  return pathname;\n}\n\n/**\n * Parses a string URL path into its separate pathname, search, and hash components.\n */\nexport function parsePath(path: string): Partial<Path> {\n  let parsedPath: Partial<Path> = {};\n\n  if (path) {\n    let hashIndex = path.indexOf(\"#\");\n    if (hashIndex >= 0) {\n      parsedPath.hash = path.substr(hashIndex);\n      path = path.substr(0, hashIndex);\n    }\n\n    let searchIndex = path.indexOf(\"?\");\n    if (searchIndex >= 0) {\n      parsedPath.search = path.substr(searchIndex);\n      path = path.substr(0, searchIndex);\n    }\n\n    if (path) {\n      parsedPath.pathname = path;\n    }\n  }\n\n  return parsedPath;\n}\n\nexport interface UrlHistory extends History {}\n\nexport type UrlHistoryOptions = {\n  window?: Window;\n  v5Compat?: boolean;\n};\n\nfunction getUrlBasedHistory(\n  getLocation: (window: Window, globalHistory: Window[\"history\"]) => Location,\n  createHref: (window: Window, to: To) => string,\n  validateLocation: ((location: Location, to: To) => void) | null,\n  options: UrlHistoryOptions = {}\n): UrlHistory {\n  let { window = document.defaultView!, v5Compat = false } = options;\n  let globalHistory = window.history;\n  let action = Action.Pop;\n  let listener: Listener | null = null;\n\n  let index = getIndex()!;\n  // Index should only be null when we initialize. If not, it's because the\n  // user called history.pushState or history.replaceState directly, in which\n  // case we should log a warning as it will result in bugs.\n  if (index == null) {\n    index = 0;\n    globalHistory.replaceState({ ...globalHistory.state, idx: index }, \"\");\n  }\n\n  function getIndex(): number {\n    let state = globalHistory.state || { idx: null };\n    return state.idx;\n  }\n\n  function handlePop() {\n    action = Action.Pop;\n    let nextIndex = getIndex();\n    let delta = nextIndex == null ? null : nextIndex - index;\n    index = nextIndex;\n    if (listener) {\n      listener({ action, location: history.location, delta });\n    }\n  }\n\n  function push(to: To, state?: any) {\n    action = Action.Push;\n    let location = createLocation(history.location, to, state);\n    if (validateLocation) validateLocation(location, to);\n\n    index = getIndex() + 1;\n    let historyState = getHistoryState(location, index);\n    let url = history.createHref(location);\n\n    // try...catch because iOS limits us to 100 pushState calls :/\n    try {\n      globalHistory.pushState(historyState, \"\", url);\n    } catch (error) {\n      // If the exception is because `state` can't be serialized, let that throw\n      // outwards just like a replace call would so the dev knows the cause\n      // https://html.spec.whatwg.org/multipage/nav-history-apis.html#shared-history-push/replace-state-steps\n      // https://html.spec.whatwg.org/multipage/structured-data.html#structuredserializeinternal\n      if (error instanceof DOMException && error.name === \"DataCloneError\") {\n        throw error;\n      }\n      // They are going to lose state here, but there is no real\n      // way to warn them about it since the page will refresh...\n      window.location.assign(url);\n    }\n\n    if (v5Compat && listener) {\n      listener({ action, location: history.location, delta: 1 });\n    }\n  }\n\n  function replace(to: To, state?: any) {\n    action = Action.Replace;\n    let location = createLocation(history.location, to, state);\n    if (validateLocation) validateLocation(location, to);\n\n    index = getIndex();\n    let historyState = getHistoryState(location, index);\n    let url = history.createHref(location);\n    globalHistory.replaceState(historyState, \"\", url);\n\n    if (v5Compat && listener) {\n      listener({ action, location: history.location, delta: 0 });\n    }\n  }\n\n  function createURL(to: To): URL {\n    // window.location.origin is \"null\" (the literal string value) in Firefox\n    // under certain conditions, notably when serving from a local HTML file\n    // See https://bugzilla.mozilla.org/show_bug.cgi?id=878297\n    let base =\n      window.location.origin !== \"null\"\n        ? window.location.origin\n        : window.location.href;\n\n    let href = typeof to === \"string\" ? to : createPath(to);\n    // Treating this as a full URL will strip any trailing spaces so we need to\n    // pre-encode them since they might be part of a matching splat param from\n    // an ancestor route\n    href = href.replace(/ $/, \"%20\");\n    invariant(\n      base,\n      `No window.location.(origin|href) available to create URL for href: ${href}`\n    );\n    return new URL(href, base);\n  }\n\n  let history: History = {\n    get action() {\n      return action;\n    },\n    get location() {\n      return getLocation(window, globalHistory);\n    },\n    listen(fn: Listener) {\n      if (listener) {\n        throw new Error(\"A history only accepts one active listener\");\n      }\n      window.addEventListener(PopStateEventType, handlePop);\n      listener = fn;\n\n      return () => {\n        window.removeEventListener(PopStateEventType, handlePop);\n        listener = null;\n      };\n    },\n    createHref(to) {\n      return createHref(window, to);\n    },\n    createURL,\n    encodeLocation(to) {\n      // Encode a Location the same way window.location would\n      let url = createURL(to);\n      return {\n        pathname: url.pathname,\n        search: url.search,\n        hash: url.hash,\n      };\n    },\n    push,\n    replace,\n    go(n) {\n      return globalHistory.go(n);\n    },\n  };\n\n  return history;\n}\n\n//#endregion\n","import type { Location, Path, To } from \"./history\";\nimport { invariant, parsePath, warning } from \"./history\";\n\n/**\n * Map of routeId -> data returned from a loader/action/error\n */\nexport interface RouteData {\n  [routeId: string]: any;\n}\n\nexport enum ResultType {\n  data = \"data\",\n  deferred = \"deferred\",\n  redirect = \"redirect\",\n  error = \"error\",\n}\n\n/**\n * Successful result from a loader or action\n */\nexport interface SuccessResult {\n  type: ResultType.data;\n  data: unknown;\n  statusCode?: number;\n  headers?: Headers;\n}\n\n/**\n * Successful defer() result from a loader or action\n */\nexport interface DeferredResult {\n  type: ResultType.deferred;\n  deferredData: DeferredData;\n  statusCode?: number;\n  headers?: Headers;\n}\n\n/**\n * Redirect result from a loader or action\n */\nexport interface RedirectResult {\n  type: ResultType.redirect;\n  // We keep the raw Response for redirects so we can return it verbatim\n  response: Response;\n}\n\n/**\n * Unsuccessful result from a loader or action\n */\nexport interface ErrorResult {\n  type: ResultType.error;\n  error: unknown;\n  statusCode?: number;\n  headers?: Headers;\n}\n\n/**\n * Result from a loader or action - potentially successful or unsuccessful\n */\nexport type DataResult =\n  | SuccessResult\n  | DeferredResult\n  | RedirectResult\n  | ErrorResult;\n\n/**\n * Result from a loader or action called via dataStrategy\n */\nexport interface HandlerResult {\n  type: \"data\" | \"error\";\n  result: unknown; // data, Error, Response, DeferredData\n  status?: number;\n}\n\ntype LowerCaseFormMethod = \"get\" | \"post\" | \"put\" | \"patch\" | \"delete\";\ntype UpperCaseFormMethod = Uppercase<LowerCaseFormMethod>;\n\n/**\n * Users can specify either lowercase or uppercase form methods on `<Form>`,\n * useSubmit(), `<fetcher.Form>`, etc.\n */\nexport type HTMLFormMethod = LowerCaseFormMethod | UpperCaseFormMethod;\n\n/**\n * Active navigation/fetcher form methods are exposed in lowercase on the\n * RouterState\n */\nexport type FormMethod = LowerCaseFormMethod;\nexport type MutationFormMethod = Exclude<FormMethod, \"get\">;\n\n/**\n * In v7, active navigation/fetcher form methods are exposed in uppercase on the\n * RouterState.  This is to align with the normalization done via fetch().\n */\nexport type V7_FormMethod = UpperCaseFormMethod;\nexport type V7_MutationFormMethod = Exclude<V7_FormMethod, \"GET\">;\n\nexport type FormEncType =\n  | \"application/x-www-form-urlencoded\"\n  | \"multipart/form-data\"\n  | \"application/json\"\n  | \"text/plain\";\n\n// Thanks https://github.com/sindresorhus/type-fest!\ntype JsonObject = { [Key in string]: JsonValue } & {\n  [Key in string]?: JsonValue | undefined;\n};\ntype JsonArray = JsonValue[] | readonly JsonValue[];\ntype JsonPrimitive = string | number | boolean | null;\ntype JsonValue = JsonPrimitive | JsonObject | JsonArray;\n\n/**\n * @private\n * Internal interface to pass around for action submissions, not intended for\n * external consumption\n */\nexport type Submission =\n  | {\n      formMethod: FormMethod | V7_FormMethod;\n      formAction: string;\n      formEncType: FormEncType;\n      formData: FormData;\n      json: undefined;\n      text: undefined;\n    }\n  | {\n      formMethod: FormMethod | V7_FormMethod;\n      formAction: string;\n      formEncType: FormEncType;\n      formData: undefined;\n      json: JsonValue;\n      text: undefined;\n    }\n  | {\n      formMethod: FormMethod | V7_FormMethod;\n      formAction: string;\n      formEncType: FormEncType;\n      formData: undefined;\n      json: undefined;\n      text: string;\n    };\n\n/**\n * @private\n * Arguments passed to route loader/action functions.  Same for now but we keep\n * this as a private implementation detail in case they diverge in the future.\n */\ninterface DataFunctionArgs<Context> {\n  request: Request;\n  params: Params;\n  context?: Context;\n}\n\n// TODO: (v7) Change the defaults from any to unknown in and remove Remix wrappers:\n//   ActionFunction, ActionFunctionArgs, LoaderFunction, LoaderFunctionArgs\n//   Also, make them a type alias instead of an interface\n\n/**\n * Arguments passed to loader functions\n */\nexport interface LoaderFunctionArgs<Context = any>\n  extends DataFunctionArgs<Context> {}\n\n/**\n * Arguments passed to action functions\n */\nexport interface ActionFunctionArgs<Context = any>\n  extends DataFunctionArgs<Context> {}\n\n/**\n * Loaders and actions can return anything except `undefined` (`null` is a\n * valid return value if there is no data to return).  Responses are preferred\n * and will ease any future migration to Remix\n */\ntype DataFunctionValue = Response | NonNullable<unknown> | null;\n\ntype DataFunctionReturnValue = Promise<DataFunctionValue> | DataFunctionValue;\n\n/**\n * Route loader function signature\n */\nexport type LoaderFunction<Context = any> = {\n  (\n    args: LoaderFunctionArgs<Context>,\n    handlerCtx?: unknown\n  ): DataFunctionReturnValue;\n} & { hydrate?: boolean };\n\n/**\n * Route action function signature\n */\nexport interface ActionFunction<Context = any> {\n  (\n    args: ActionFunctionArgs<Context>,\n    handlerCtx?: unknown\n  ): DataFunctionReturnValue;\n}\n\n/**\n * Arguments passed to shouldRevalidate function\n */\nexport interface ShouldRevalidateFunctionArgs {\n  currentUrl: URL;\n  currentParams: AgnosticDataRouteMatch[\"params\"];\n  nextUrl: URL;\n  nextParams: AgnosticDataRouteMatch[\"params\"];\n  formMethod?: Submission[\"formMethod\"];\n  formAction?: Submission[\"formAction\"];\n  formEncType?: Submission[\"formEncType\"];\n  text?: Submission[\"text\"];\n  formData?: Submission[\"formData\"];\n  json?: Submission[\"json\"];\n  unstable_actionStatus?: number;\n  actionResult?: any;\n  defaultShouldRevalidate: boolean;\n}\n\n/**\n * Route shouldRevalidate function signature.  This runs after any submission\n * (navigation or fetcher), so we flatten the navigation/fetcher submission\n * onto the arguments.  It shouldn't matter whether it came from a navigation\n * or a fetcher, what really matters is the URLs and the formData since loaders\n * have to re-run based on the data models that were potentially mutated.\n */\nexport interface ShouldRevalidateFunction {\n  (args: ShouldRevalidateFunctionArgs): boolean;\n}\n\n/**\n * Function provided by the framework-aware layers to set `hasErrorBoundary`\n * from the framework-aware `errorElement` prop\n *\n * @deprecated Use `mapRouteProperties` instead\n */\nexport interface DetectErrorBoundaryFunction {\n  (route: AgnosticRouteObject): boolean;\n}\n\nexport interface DataStrategyMatch\n  extends AgnosticRouteMatch<string, AgnosticDataRouteObject> {\n  shouldLoad: boolean;\n  resolve: (\n    handlerOverride?: (\n      handler: (ctx?: unknown) => DataFunctionReturnValue\n    ) => Promise<HandlerResult>\n  ) => Promise<HandlerResult>;\n}\n\nexport interface DataStrategyFunctionArgs<Context = any>\n  extends DataFunctionArgs<Context> {\n  matches: DataStrategyMatch[];\n}\n\nexport interface DataStrategyFunction {\n  (args: DataStrategyFunctionArgs): Promise<HandlerResult[]>;\n}\n\n/**\n * Function provided by the framework-aware layers to set any framework-specific\n * properties from framework-agnostic properties\n */\nexport interface MapRoutePropertiesFunction {\n  (route: AgnosticRouteObject): {\n    hasErrorBoundary: boolean;\n  } & Record<string, any>;\n}\n\n/**\n * Keys we cannot change from within a lazy() function. We spread all other keys\n * onto the route. Either they're meaningful to the router, or they'll get\n * ignored.\n */\nexport type ImmutableRouteKey =\n  | \"lazy\"\n  | \"caseSensitive\"\n  | \"path\"\n  | \"id\"\n  | \"index\"\n  | \"children\";\n\nexport const immutableRouteKeys = new Set<ImmutableRouteKey>([\n  \"lazy\",\n  \"caseSensitive\",\n  \"path\",\n  \"id\",\n  \"index\",\n  \"children\",\n]);\n\ntype RequireOne<T, Key = keyof T> = Exclude<\n  {\n    [K in keyof T]: K extends Key ? Omit<T, K> & Required<Pick<T, K>> : never;\n  }[keyof T],\n  undefined\n>;\n\n/**\n * lazy() function to load a route definition, which can add non-matching\n * related properties to a route\n */\nexport interface LazyRouteFunction<R extends AgnosticRouteObject> {\n  (): Promise<RequireOne<Omit<R, ImmutableRouteKey>>>;\n}\n\n/**\n * Base RouteObject with common props shared by all types of routes\n */\ntype AgnosticBaseRouteObject = {\n  caseSensitive?: boolean;\n  path?: string;\n  id?: string;\n  loader?: LoaderFunction | boolean;\n  action?: ActionFunction | boolean;\n  hasErrorBoundary?: boolean;\n  shouldRevalidate?: ShouldRevalidateFunction;\n  handle?: any;\n  lazy?: LazyRouteFunction<AgnosticBaseRouteObject>;\n};\n\n/**\n * Index routes must not have children\n */\nexport type AgnosticIndexRouteObject = AgnosticBaseRouteObject & {\n  children?: undefined;\n  index: true;\n};\n\n/**\n * Non-index routes may have children, but cannot have index\n */\nexport type AgnosticNonIndexRouteObject = AgnosticBaseRouteObject & {\n  children?: AgnosticRouteObject[];\n  index?: false;\n};\n\n/**\n * A route object represents a logical route, with (optionally) its child\n * routes organized in a tree-like structure.\n */\nexport type AgnosticRouteObject =\n  | AgnosticIndexRouteObject\n  | AgnosticNonIndexRouteObject;\n\nexport type AgnosticDataIndexRouteObject = AgnosticIndexRouteObject & {\n  id: string;\n};\n\nexport type AgnosticDataNonIndexRouteObject = AgnosticNonIndexRouteObject & {\n  children?: AgnosticDataRouteObject[];\n  id: string;\n};\n\n/**\n * A data route object, which is just a RouteObject with a required unique ID\n */\nexport type AgnosticDataRouteObject =\n  | AgnosticDataIndexRouteObject\n  | AgnosticDataNonIndexRouteObject;\n\nexport type RouteManifest = Record<string, AgnosticDataRouteObject | undefined>;\n\n// Recursive helper for finding path parameters in the absence of wildcards\ntype _PathParam<Path extends string> =\n  // split path into individual path segments\n  Path extends `${infer L}/${infer R}`\n    ? _PathParam<L> | _PathParam<R>\n    : // find params after `:`\n    Path extends `:${infer Param}`\n    ? Param extends `${infer Optional}?`\n      ? Optional\n      : Param\n    : // otherwise, there aren't any params present\n      never;\n\n/**\n * Examples:\n * \"/a/b/*\" -> \"*\"\n * \":a\" -> \"a\"\n * \"/a/:b\" -> \"b\"\n * \"/a/blahblahblah:b\" -> \"b\"\n * \"/:a/:b\" -> \"a\" | \"b\"\n * \"/:a/b/:c/*\" -> \"a\" | \"c\" | \"*\"\n */\nexport type PathParam<Path extends string> =\n  // check if path is just a wildcard\n  Path extends \"*\" | \"/*\"\n    ? \"*\"\n    : // look for wildcard at the end of the path\n    Path extends `${infer Rest}/*`\n    ? \"*\" | _PathParam<Rest>\n    : // look for params in the absence of wildcards\n      _PathParam<Path>;\n\n// Attempt to parse the given string segment. If it fails, then just return the\n// plain string type as a default fallback. Otherwise, return the union of the\n// parsed string literals that were referenced as dynamic segments in the route.\nexport type ParamParseKey<Segment extends string> =\n  // if you could not find path params, fallback to `string`\n  [PathParam<Segment>] extends [never] ? string : PathParam<Segment>;\n\n/**\n * The parameters that were parsed from the URL path.\n */\nexport type Params<Key extends string = string> = {\n  readonly [key in Key]: string | undefined;\n};\n\n/**\n * A RouteMatch contains info about how a route matched a URL.\n */\nexport interface AgnosticRouteMatch<\n  ParamKey extends string = string,\n  RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n> {\n  /**\n   * The names and values of dynamic parameters in the URL.\n   */\n  params: Params<ParamKey>;\n  /**\n   * The portion of the URL pathname that was matched.\n   */\n  pathname: string;\n  /**\n   * The portion of the URL pathname that was matched before child routes.\n   */\n  pathnameBase: string;\n  /**\n   * The route object that was used to match.\n   */\n  route: RouteObjectType;\n}\n\nexport interface AgnosticDataRouteMatch\n  extends AgnosticRouteMatch<string, AgnosticDataRouteObject> {}\n\nfunction isIndexRoute(\n  route: AgnosticRouteObject\n): route is AgnosticIndexRouteObject {\n  return route.index === true;\n}\n\n// Walk the route tree generating unique IDs where necessary, so we are working\n// solely with AgnosticDataRouteObject's within the Router\nexport function convertRoutesToDataRoutes(\n  routes: AgnosticRouteObject[],\n  mapRouteProperties: MapRoutePropertiesFunction,\n  parentPath: number[] = [],\n  manifest: RouteManifest = {}\n): AgnosticDataRouteObject[] {\n  return routes.map((route, index) => {\n    let treePath = [...parentPath, index];\n    let id = typeof route.id === \"string\" ? route.id : treePath.join(\"-\");\n    invariant(\n      route.index !== true || !route.children,\n      `Cannot specify children on an index route`\n    );\n    invariant(\n      !manifest[id],\n      `Found a route id collision on id \"${id}\".  Route ` +\n        \"id's must be globally unique within Data Router usages\"\n    );\n\n    if (isIndexRoute(route)) {\n      let indexRoute: AgnosticDataIndexRouteObject = {\n        ...route,\n        ...mapRouteProperties(route),\n        id,\n      };\n      manifest[id] = indexRoute;\n      return indexRoute;\n    } else {\n      let pathOrLayoutRoute: AgnosticDataNonIndexRouteObject = {\n        ...route,\n        ...mapRouteProperties(route),\n        id,\n        children: undefined,\n      };\n      manifest[id] = pathOrLayoutRoute;\n\n      if (route.children) {\n        pathOrLayoutRoute.children = convertRoutesToDataRoutes(\n          route.children,\n          mapRouteProperties,\n          treePath,\n          manifest\n        );\n      }\n\n      return pathOrLayoutRoute;\n    }\n  });\n}\n\n/**\n * Matches the given routes to a location and returns the match data.\n *\n * @see https://reactrouter.com/utils/match-routes\n */\nexport function matchRoutes<\n  RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n  routes: RouteObjectType[],\n  locationArg: Partial<Location> | string,\n  basename = \"/\"\n): AgnosticRouteMatch<string, RouteObjectType>[] | null {\n  let location =\n    typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n\n  let pathname = stripBasename(location.pathname || \"/\", basename);\n\n  if (pathname == null) {\n    return null;\n  }\n\n  let branches = flattenRoutes(routes);\n  rankRouteBranches(branches);\n\n  let matches = null;\n  for (let i = 0; matches == null && i < branches.length; ++i) {\n    // Incoming pathnames are generally encoded from either window.location\n    // or from router.navigate, but we want to match against the unencoded\n    // paths in the route definitions.  Memory router locations won't be\n    // encoded here but there also shouldn't be anything to decode so this\n    // should be a safe operation.  This avoids needing matchRoutes to be\n    // history-aware.\n    let decoded = decodePath(pathname);\n    matches = matchRouteBranch<string, RouteObjectType>(branches[i], decoded);\n  }\n\n  return matches;\n}\n\nexport interface UIMatch<Data = unknown, Handle = unknown> {\n  id: string;\n  pathname: string;\n  params: AgnosticRouteMatch[\"params\"];\n  data: Data;\n  handle: Handle;\n}\n\nexport function convertRouteMatchToUiMatch(\n  match: AgnosticDataRouteMatch,\n  loaderData: RouteData\n): UIMatch {\n  let { route, pathname, params } = match;\n  return {\n    id: route.id,\n    pathname,\n    params,\n    data: loaderData[route.id],\n    handle: route.handle,\n  };\n}\n\ninterface RouteMeta<\n  RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n> {\n  relativePath: string;\n  caseSensitive: boolean;\n  childrenIndex: number;\n  route: RouteObjectType;\n}\n\ninterface RouteBranch<\n  RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n> {\n  path: string;\n  score: number;\n  routesMeta: RouteMeta<RouteObjectType>[];\n}\n\nfunction flattenRoutes<\n  RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n  routes: RouteObjectType[],\n  branches: RouteBranch<RouteObjectType>[] = [],\n  parentsMeta: RouteMeta<RouteObjectType>[] = [],\n  parentPath = \"\"\n): RouteBranch<RouteObjectType>[] {\n  let flattenRoute = (\n    route: RouteObjectType,\n    index: number,\n    relativePath?: string\n  ) => {\n    let meta: RouteMeta<RouteObjectType> = {\n      relativePath:\n        relativePath === undefined ? route.path || \"\" : relativePath,\n      caseSensitive: route.caseSensitive === true,\n      childrenIndex: index,\n      route,\n    };\n\n    if (meta.relativePath.startsWith(\"/\")) {\n      invariant(\n        meta.relativePath.startsWith(parentPath),\n        `Absolute route path \"${meta.relativePath}\" nested under path ` +\n          `\"${parentPath}\" is not valid. An absolute child route path ` +\n          `must start with the combined path of all its parent routes.`\n      );\n\n      meta.relativePath = meta.relativePath.slice(parentPath.length);\n    }\n\n    let path = joinPaths([parentPath, meta.relativePath]);\n    let routesMeta = parentsMeta.concat(meta);\n\n    // Add the children before adding this route to the array, so we traverse the\n    // route tree depth-first and child routes appear before their parents in\n    // the \"flattened\" version.\n    if (route.children && route.children.length > 0) {\n      invariant(\n        // Our types know better, but runtime JS may not!\n        // @ts-expect-error\n        route.index !== true,\n        `Index routes must not have child routes. Please remove ` +\n          `all child routes from route path \"${path}\".`\n      );\n\n      flattenRoutes(route.children, branches, routesMeta, path);\n    }\n\n    // Routes without a path shouldn't ever match by themselves unless they are\n    // index routes, so don't add them to the list of possible branches.\n    if (route.path == null && !route.index) {\n      return;\n    }\n\n    branches.push({\n      path,\n      score: computeScore(path, route.index),\n      routesMeta,\n    });\n  };\n  routes.forEach((route, index) => {\n    // coarse-grain check for optional params\n    if (route.path === \"\" || !route.path?.includes(\"?\")) {\n      flattenRoute(route, index);\n    } else {\n      for (let exploded of explodeOptionalSegments(route.path)) {\n        flattenRoute(route, index, exploded);\n      }\n    }\n  });\n\n  return branches;\n}\n\n/**\n * Computes all combinations of optional path segments for a given path,\n * excluding combinations that are ambiguous and of lower priority.\n *\n * For example, `/one/:two?/three/:four?/:five?` explodes to:\n * - `/one/three`\n * - `/one/:two/three`\n * - `/one/three/:four`\n * - `/one/three/:five`\n * - `/one/:two/three/:four`\n * - `/one/:two/three/:five`\n * - `/one/three/:four/:five`\n * - `/one/:two/three/:four/:five`\n */\nfunction explodeOptionalSegments(path: string): string[] {\n  let segments = path.split(\"/\");\n  if (segments.length === 0) return [];\n\n  let [first, ...rest] = segments;\n\n  // Optional path segments are denoted by a trailing `?`\n  let isOptional = first.endsWith(\"?\");\n  // Compute the corresponding required segment: `foo?` -> `foo`\n  let required = first.replace(/\\?$/, \"\");\n\n  if (rest.length === 0) {\n    // Intepret empty string as omitting an optional segment\n    // `[\"one\", \"\", \"three\"]` corresponds to omitting `:two` from `/one/:two?/three` -> `/one/three`\n    return isOptional ? [required, \"\"] : [required];\n  }\n\n  let restExploded = explodeOptionalSegments(rest.join(\"/\"));\n\n  let result: string[] = [];\n\n  // All child paths with the prefix.  Do this for all children before the\n  // optional version for all children, so we get consistent ordering where the\n  // parent optional aspect is preferred as required.  Otherwise, we can get\n  // child sections interspersed where deeper optional segments are higher than\n  // parent optional segments, where for example, /:two would explode _earlier_\n  // then /:one.  By always including the parent as required _for all children_\n  // first, we avoid this issue\n  result.push(\n    ...restExploded.map((subpath) =>\n      subpath === \"\" ? required : [required, subpath].join(\"/\")\n    )\n  );\n\n  // Then, if this is an optional value, add all child versions without\n  if (isOptional) {\n    result.push(...restExploded);\n  }\n\n  // for absolute paths, ensure `/` instead of empty segment\n  return result.map((exploded) =>\n    path.startsWith(\"/\") && exploded === \"\" ? \"/\" : exploded\n  );\n}\n\nfunction rankRouteBranches(branches: RouteBranch[]): void {\n  branches.sort((a, b) =>\n    a.score !== b.score\n      ? b.score - a.score // Higher score first\n      : compareIndexes(\n          a.routesMeta.map((meta) => meta.childrenIndex),\n          b.routesMeta.map((meta) => meta.childrenIndex)\n        )\n  );\n}\n\nconst paramRe = /^:[\\w-]+$/;\nconst dynamicSegmentValue = 3;\nconst indexRouteValue = 2;\nconst emptySegmentValue = 1;\nconst staticSegmentValue = 10;\nconst splatPenalty = -2;\nconst isSplat = (s: string) => s === \"*\";\n\nfunction computeScore(path: string, index: boolean | undefined): number {\n  let segments = path.split(\"/\");\n  let initialScore = segments.length;\n  if (segments.some(isSplat)) {\n    initialScore += splatPenalty;\n  }\n\n  if (index) {\n    initialScore += indexRouteValue;\n  }\n\n  return segments\n    .filter((s) => !isSplat(s))\n    .reduce(\n      (score, segment) =>\n        score +\n        (paramRe.test(segment)\n          ? dynamicSegmentValue\n          : segment === \"\"\n          ? emptySegmentValue\n          : staticSegmentValue),\n      initialScore\n    );\n}\n\nfunction compareIndexes(a: number[], b: number[]): number {\n  let siblings =\n    a.length === b.length && a.slice(0, -1).every((n, i) => n === b[i]);\n\n  return siblings\n    ? // If two routes are siblings, we should try to match the earlier sibling\n      // first. This allows people to have fine-grained control over the matching\n      // behavior by simply putting routes with identical paths in the order they\n      // want them tried.\n      a[a.length - 1] - b[b.length - 1]\n    : // Otherwise, it doesn't really make sense to rank non-siblings by index,\n      // so they sort equally.\n      0;\n}\n\nfunction matchRouteBranch<\n  ParamKey extends string = string,\n  RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n  branch: RouteBranch<RouteObjectType>,\n  pathname: string\n): AgnosticRouteMatch<ParamKey, RouteObjectType>[] | null {\n  let { routesMeta } = branch;\n\n  let matchedParams = {};\n  let matchedPathname = \"/\";\n  let matches: AgnosticRouteMatch<ParamKey, RouteObjectType>[] = [];\n  for (let i = 0; i < routesMeta.length; ++i) {\n    let meta = routesMeta[i];\n    let end = i === routesMeta.length - 1;\n    let remainingPathname =\n      matchedPathname === \"/\"\n        ? pathname\n        : pathname.slice(matchedPathname.length) || \"/\";\n    let match = matchPath(\n      { path: meta.relativePath, caseSensitive: meta.caseSensitive, end },\n      remainingPathname\n    );\n\n    if (!match) return null;\n\n    Object.assign(matchedParams, match.params);\n\n    let route = meta.route;\n\n    matches.push({\n      // TODO: Can this as be avoided?\n      params: matchedParams as Params<ParamKey>,\n      pathname: joinPaths([matchedPathname, match.pathname]),\n      pathnameBase: normalizePathname(\n        joinPaths([matchedPathname, match.pathnameBase])\n      ),\n      route,\n    });\n\n    if (match.pathnameBase !== \"/\") {\n      matchedPathname = joinPaths([matchedPathname, match.pathnameBase]);\n    }\n  }\n\n  return matches;\n}\n\n/**\n * Returns a path with params interpolated.\n *\n * @see https://reactrouter.com/utils/generate-path\n */\nexport function generatePath<Path extends string>(\n  originalPath: Path,\n  params: {\n    [key in PathParam<Path>]: string | null;\n  } = {} as any\n): string {\n  let path: string = originalPath;\n  if (path.endsWith(\"*\") && path !== \"*\" && !path.endsWith(\"/*\")) {\n    warning(\n      false,\n      `Route path \"${path}\" will be treated as if it were ` +\n        `\"${path.replace(/\\*$/, \"/*\")}\" because the \\`*\\` character must ` +\n        `always follow a \\`/\\` in the pattern. To get rid of this warning, ` +\n        `please change the route path to \"${path.replace(/\\*$/, \"/*\")}\".`\n    );\n    path = path.replace(/\\*$/, \"/*\") as Path;\n  }\n\n  // ensure `/` is added at the beginning if the path is absolute\n  const prefix = path.startsWith(\"/\") ? \"/\" : \"\";\n\n  const stringify = (p: any) =>\n    p == null ? \"\" : typeof p === \"string\" ? p : String(p);\n\n  const segments = path\n    .split(/\\/+/)\n    .map((segment, index, array) => {\n      const isLastSegment = index === array.length - 1;\n\n      // only apply the splat if it's the last segment\n      if (isLastSegment && segment === \"*\") {\n        const star = \"*\" as PathParam<Path>;\n        // Apply the splat\n        return stringify(params[star]);\n      }\n\n      const keyMatch = segment.match(/^:([\\w-]+)(\\??)$/);\n      if (keyMatch) {\n        const [, key, optional] = keyMatch;\n        let param = params[key as PathParam<Path>];\n        invariant(optional === \"?\" || param != null, `Missing \":${key}\" param`);\n        return stringify(param);\n      }\n\n      // Remove any optional markers from optional static segments\n      return segment.replace(/\\?$/g, \"\");\n    })\n    // Remove empty segments\n    .filter((segment) => !!segment);\n\n  return prefix + segments.join(\"/\");\n}\n\n/**\n * A PathPattern is used to match on some portion of a URL pathname.\n */\nexport interface PathPattern<Path extends string = string> {\n  /**\n   * A string to match against a URL pathname. May contain `:id`-style segments\n   * to indicate placeholders for dynamic parameters. May also end with `/*` to\n   * indicate matching the rest of the URL pathname.\n   */\n  path: Path;\n  /**\n   * Should be `true` if the static portions of the `path` should be matched in\n   * the same case.\n   */\n  caseSensitive?: boolean;\n  /**\n   * Should be `true` if this pattern should match the entire URL pathname.\n   */\n  end?: boolean;\n}\n\n/**\n * A PathMatch contains info about how a PathPattern matched on a URL pathname.\n */\nexport interface PathMatch<ParamKey extends string = string> {\n  /**\n   * The names and values of dynamic parameters in the URL.\n   */\n  params: Params<ParamKey>;\n  /**\n   * The portion of the URL pathname that was matched.\n   */\n  pathname: string;\n  /**\n   * The portion of the URL pathname that was matched before child routes.\n   */\n  pathnameBase: string;\n  /**\n   * The pattern that was used to match.\n   */\n  pattern: PathPattern;\n}\n\ntype Mutable<T> = {\n  -readonly [P in keyof T]: T[P];\n};\n\n/**\n * Performs pattern matching on a URL pathname and returns information about\n * the match.\n *\n * @see https://reactrouter.com/utils/match-path\n */\nexport function matchPath<\n  ParamKey extends ParamParseKey<Path>,\n  Path extends string\n>(\n  pattern: PathPattern<Path> | Path,\n  pathname: string\n): PathMatch<ParamKey> | null {\n  if (typeof pattern === \"string\") {\n    pattern = { path: pattern, caseSensitive: false, end: true };\n  }\n\n  let [matcher, compiledParams] = compilePath(\n    pattern.path,\n    pattern.caseSensitive,\n    pattern.end\n  );\n\n  let match = pathname.match(matcher);\n  if (!match) return null;\n\n  let matchedPathname = match[0];\n  let pathnameBase = matchedPathname.replace(/(.)\\/+$/, \"$1\");\n  let captureGroups = match.slice(1);\n  let params: Params = compiledParams.reduce<Mutable<Params>>(\n    (memo, { paramName, isOptional }, index) => {\n      // We need to compute the pathnameBase here using the raw splat value\n      // instead of using params[\"*\"] later because it will be decoded then\n      if (paramName === \"*\") {\n        let splatValue = captureGroups[index] || \"\";\n        pathnameBase = matchedPathname\n          .slice(0, matchedPathname.length - splatValue.length)\n          .replace(/(.)\\/+$/, \"$1\");\n      }\n\n      const value = captureGroups[index];\n      if (isOptional && !value) {\n        memo[paramName] = undefined;\n      } else {\n        memo[paramName] = (value || \"\").replace(/%2F/g, \"/\");\n      }\n      return memo;\n    },\n    {}\n  );\n\n  return {\n    params,\n    pathname: matchedPathname,\n    pathnameBase,\n    pattern,\n  };\n}\n\ntype CompiledPathParam = { paramName: string; isOptional?: boolean };\n\nfunction compilePath(\n  path: string,\n  caseSensitive = false,\n  end = true\n): [RegExp, CompiledPathParam[]] {\n  warning(\n    path === \"*\" || !path.endsWith(\"*\") || path.endsWith(\"/*\"),\n    `Route path \"${path}\" will be treated as if it were ` +\n      `\"${path.replace(/\\*$/, \"/*\")}\" because the \\`*\\` character must ` +\n      `always follow a \\`/\\` in the pattern. To get rid of this warning, ` +\n      `please change the route path to \"${path.replace(/\\*$/, \"/*\")}\".`\n  );\n\n  let params: CompiledPathParam[] = [];\n  let regexpSource =\n    \"^\" +\n    path\n      .replace(/\\/*\\*?$/, \"\") // Ignore trailing / and /*, we'll handle it below\n      .replace(/^\\/*/, \"/\") // Make sure it has a leading /\n      .replace(/[\\\\.*+^${}|()[\\]]/g, \"\\\\$&\") // Escape special regex chars\n      .replace(\n        /\\/:([\\w-]+)(\\?)?/g,\n        (_: string, paramName: string, isOptional) => {\n          params.push({ paramName, isOptional: isOptional != null });\n          return isOptional ? \"/?([^\\\\/]+)?\" : \"/([^\\\\/]+)\";\n        }\n      );\n\n  if (path.endsWith(\"*\")) {\n    params.push({ paramName: \"*\" });\n    regexpSource +=\n      path === \"*\" || path === \"/*\"\n        ? \"(.*)$\" // Already matched the initial /, just match the rest\n        : \"(?:\\\\/(.+)|\\\\/*)$\"; // Don't include the / in params[\"*\"]\n  } else if (end) {\n    // When matching to the end, ignore trailing slashes\n    regexpSource += \"\\\\/*$\";\n  } else if (path !== \"\" && path !== \"/\") {\n    // If our path is non-empty and contains anything beyond an initial slash,\n    // then we have _some_ form of path in our regex, so we should expect to\n    // match only if we find the end of this path segment.  Look for an optional\n    // non-captured trailing slash (to match a portion of the URL) or the end\n    // of the path (if we've matched to the end).  We used to do this with a\n    // word boundary but that gives false positives on routes like\n    // /user-preferences since `-` counts as a word boundary.\n    regexpSource += \"(?:(?=\\\\/|$))\";\n  } else {\n    // Nothing to match for \"\" or \"/\"\n  }\n\n  let matcher = new RegExp(regexpSource, caseSensitive ? undefined : \"i\");\n\n  return [matcher, params];\n}\n\nfunction decodePath(value: string) {\n  try {\n    return value\n      .split(\"/\")\n      .map((v) => decodeURIComponent(v).replace(/\\//g, \"%2F\"))\n      .join(\"/\");\n  } catch (error) {\n    warning(\n      false,\n      `The URL path \"${value}\" could not be decoded because it is is a ` +\n        `malformed URL segment. This is probably due to a bad percent ` +\n        `encoding (${error}).`\n    );\n\n    return value;\n  }\n}\n\n/**\n * @private\n */\nexport function stripBasename(\n  pathname: string,\n  basename: string\n): string | null {\n  if (basename === \"/\") return pathname;\n\n  if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n    return null;\n  }\n\n  // We want to leave trailing slash behavior in the user's control, so if they\n  // specify a basename with a trailing slash, we should support it\n  let startIndex = basename.endsWith(\"/\")\n    ? basename.length - 1\n    : basename.length;\n  let nextChar = pathname.charAt(startIndex);\n  if (nextChar && nextChar !== \"/\") {\n    // pathname does not start with basename/\n    return null;\n  }\n\n  return pathname.slice(startIndex) || \"/\";\n}\n\n/**\n * Returns a resolved path object relative to the given pathname.\n *\n * @see https://reactrouter.com/utils/resolve-path\n */\nexport function resolvePath(to: To, fromPathname = \"/\"): Path {\n  let {\n    pathname: toPathname,\n    search = \"\",\n    hash = \"\",\n  } = typeof to === \"string\" ? parsePath(to) : to;\n\n  let pathname = toPathname\n    ? toPathname.startsWith(\"/\")\n      ? toPathname\n      : resolvePathname(toPathname, fromPathname)\n    : fromPathname;\n\n  return {\n    pathname,\n    search: normalizeSearch(search),\n    hash: normalizeHash(hash),\n  };\n}\n\nfunction resolvePathname(relativePath: string, fromPathname: string): string {\n  let segments = fromPathname.replace(/\\/+$/, \"\").split(\"/\");\n  let relativeSegments = relativePath.split(\"/\");\n\n  relativeSegments.forEach((segment) => {\n    if (segment === \"..\") {\n      // Keep the root \"\" segment so the pathname starts at /\n      if (segments.length > 1) segments.pop();\n    } else if (segment !== \".\") {\n      segments.push(segment);\n    }\n  });\n\n  return segments.length > 1 ? segments.join(\"/\") : \"/\";\n}\n\nfunction getInvalidPathError(\n  char: string,\n  field: string,\n  dest: string,\n  path: Partial<Path>\n) {\n  return (\n    `Cannot include a '${char}' character in a manually specified ` +\n    `\\`to.${field}\\` field [${JSON.stringify(\n      path\n    )}].  Please separate it out to the ` +\n    `\\`to.${dest}\\` field. Alternatively you may provide the full path as ` +\n    `a string in <Link to=\"...\"> and the router will parse it for you.`\n  );\n}\n\n/**\n * @private\n *\n * When processing relative navigation we want to ignore ancestor routes that\n * do not contribute to the path, such that index/pathless layout routes don't\n * interfere.\n *\n * For example, when moving a route element into an index route and/or a\n * pathless layout route, relative link behavior contained within should stay\n * the same.  Both of the following examples should link back to the root:\n *\n *   <Route path=\"/\">\n *     <Route path=\"accounts\" element={<Link to=\"..\"}>\n *   </Route>\n *\n *   <Route path=\"/\">\n *     <Route path=\"accounts\">\n *       <Route element={<AccountsLayout />}>       // <-- Does not contribute\n *         <Route index element={<Link to=\"..\"} />  // <-- Does not contribute\n *       </Route\n *     </Route>\n *   </Route>\n */\nexport function getPathContributingMatches<\n  T extends AgnosticRouteMatch = AgnosticRouteMatch\n>(matches: T[]) {\n  return matches.filter(\n    (match, index) =>\n      index === 0 || (match.route.path && match.route.path.length > 0)\n  );\n}\n\n// Return the array of pathnames for the current route matches - used to\n// generate the routePathnames input for resolveTo()\nexport function getResolveToMatches<\n  T extends AgnosticRouteMatch = AgnosticRouteMatch\n>(matches: T[], v7_relativeSplatPath: boolean) {\n  let pathMatches = getPathContributingMatches(matches);\n\n  // When v7_relativeSplatPath is enabled, use the full pathname for the leaf\n  // match so we include splat values for \".\" links.  See:\n  // https://github.com/remix-run/react-router/issues/11052#issuecomment-1836589329\n  if (v7_relativeSplatPath) {\n    return pathMatches.map((match, idx) =>\n      idx === matches.length - 1 ? match.pathname : match.pathnameBase\n    );\n  }\n\n  return pathMatches.map((match) => match.pathnameBase);\n}\n\n/**\n * @private\n */\nexport function resolveTo(\n  toArg: To,\n  routePathnames: string[],\n  locationPathname: string,\n  isPathRelative = false\n): Path {\n  let to: Partial<Path>;\n  if (typeof toArg === \"string\") {\n    to = parsePath(toArg);\n  } else {\n    to = { ...toArg };\n\n    invariant(\n      !to.pathname || !to.pathname.includes(\"?\"),\n      getInvalidPathError(\"?\", \"pathname\", \"search\", to)\n    );\n    invariant(\n      !to.pathname || !to.pathname.includes(\"#\"),\n      getInvalidPathError(\"#\", \"pathname\", \"hash\", to)\n    );\n    invariant(\n      !to.search || !to.search.includes(\"#\"),\n      getInvalidPathError(\"#\", \"search\", \"hash\", to)\n    );\n  }\n\n  let isEmptyPath = toArg === \"\" || to.pathname === \"\";\n  let toPathname = isEmptyPath ? \"/\" : to.pathname;\n\n  let from: string;\n\n  // Routing is relative to the current pathname if explicitly requested.\n  //\n  // If a pathname is explicitly provided in `to`, it should be relative to the\n  // route context. This is explained in `Note on `<Link to>` values` in our\n  // migration guide from v5 as a means of disambiguation between `to` values\n  // that begin with `/` and those that do not. However, this is problematic for\n  // `to` values that do not provide a pathname. `to` can simply be a search or\n  // hash string, in which case we should assume that the navigation is relative\n  // to the current location's pathname and *not* the route pathname.\n  if (toPathname == null) {\n    from = locationPathname;\n  } else {\n    let routePathnameIndex = routePathnames.length - 1;\n\n    // With relative=\"route\" (the default), each leading .. segment means\n    // \"go up one route\" instead of \"go up one URL segment\".  This is a key\n    // difference from how <a href> works and a major reason we call this a\n    // \"to\" value instead of a \"href\".\n    if (!isPathRelative && toPathname.startsWith(\"..\")) {\n      let toSegments = toPathname.split(\"/\");\n\n      while (toSegments[0] === \"..\") {\n        toSegments.shift();\n        routePathnameIndex -= 1;\n      }\n\n      to.pathname = toSegments.join(\"/\");\n    }\n\n    from = routePathnameIndex >= 0 ? routePathnames[routePathnameIndex] : \"/\";\n  }\n\n  let path = resolvePath(to, from);\n\n  // Ensure the pathname has a trailing slash if the original \"to\" had one\n  let hasExplicitTrailingSlash =\n    toPathname && toPathname !== \"/\" && toPathname.endsWith(\"/\");\n  // Or if this was a link to the current path which has a trailing slash\n  let hasCurrentTrailingSlash =\n    (isEmptyPath || toPathname === \".\") && locationPathname.endsWith(\"/\");\n  if (\n    !path.pathname.endsWith(\"/\") &&\n    (hasExplicitTrailingSlash || hasCurrentTrailingSlash)\n  ) {\n    path.pathname += \"/\";\n  }\n\n  return path;\n}\n\n/**\n * @private\n */\nexport function getToPathname(to: To): string | undefined {\n  // Empty strings should be treated the same as / paths\n  return to === \"\" || (to as Path).pathname === \"\"\n    ? \"/\"\n    : typeof to === \"string\"\n    ? parsePath(to).pathname\n    : to.pathname;\n}\n\n/**\n * @private\n */\nexport const joinPaths = (paths: string[]): string =>\n  paths.join(\"/\").replace(/\\/\\/+/g, \"/\");\n\n/**\n * @private\n */\nexport const normalizePathname = (pathname: string): string =>\n  pathname.replace(/\\/+$/, \"\").replace(/^\\/*/, \"/\");\n\n/**\n * @private\n */\nexport const normalizeSearch = (search: string): string =>\n  !search || search === \"?\"\n    ? \"\"\n    : search.startsWith(\"?\")\n    ? search\n    : \"?\" + search;\n\n/**\n * @private\n */\nexport const normalizeHash = (hash: string): string =>\n  !hash || hash === \"#\" ? \"\" : hash.startsWith(\"#\") ? hash : \"#\" + hash;\n\nexport type JsonFunction = <Data>(\n  data: Data,\n  init?: number | ResponseInit\n) => Response;\n\n/**\n * This is a shortcut for creating `application/json` responses. Converts `data`\n * to JSON and sets the `Content-Type` header.\n */\nexport const json: JsonFunction = (data, init = {}) => {\n  let responseInit = typeof init === \"number\" ? { status: init } : init;\n\n  let headers = new Headers(responseInit.headers);\n  if (!headers.has(\"Content-Type\")) {\n    headers.set(\"Content-Type\", \"application/json; charset=utf-8\");\n  }\n\n  return new Response(JSON.stringify(data), {\n    ...responseInit,\n    headers,\n  });\n};\n\nexport interface TrackedPromise extends Promise<any> {\n  _tracked?: boolean;\n  _data?: any;\n  _error?: any;\n}\n\nexport class AbortedDeferredError extends Error {}\n\nexport class DeferredData {\n  private pendingKeysSet: Set<string> = new Set<string>();\n  private controller: AbortController;\n  private abortPromise: Promise<void>;\n  private unlistenAbortSignal: () => void;\n  private subscribers: Set<(aborted: boolean, settledKey?: string) => void> =\n    new Set();\n  data: Record<string, unknown>;\n  init?: ResponseInit;\n  deferredKeys: string[] = [];\n\n  constructor(data: Record<string, unknown>, responseInit?: ResponseInit) {\n    invariant(\n      data && typeof data === \"object\" && !Array.isArray(data),\n      \"defer() only accepts plain objects\"\n    );\n\n    // Set up an AbortController + Promise we can race against to exit early\n    // cancellation\n    let reject: (e: AbortedDeferredError) => void;\n    this.abortPromise = new Promise((_, r) => (reject = r));\n    this.controller = new AbortController();\n    let onAbort = () =>\n      reject(new AbortedDeferredError(\"Deferred data aborted\"));\n    this.unlistenAbortSignal = () =>\n      this.controller.signal.removeEventListener(\"abort\", onAbort);\n    this.controller.signal.addEventListener(\"abort\", onAbort);\n\n    this.data = Object.entries(data).reduce(\n      (acc, [key, value]) =>\n        Object.assign(acc, {\n          [key]: this.trackPromise(key, value),\n        }),\n      {}\n    );\n\n    if (this.done) {\n      // All incoming values were resolved\n      this.unlistenAbortSignal();\n    }\n\n    this.init = responseInit;\n  }\n\n  private trackPromise(\n    key: string,\n    value: Promise<unknown> | unknown\n  ): TrackedPromise | unknown {\n    if (!(value instanceof Promise)) {\n      return value;\n    }\n\n    this.deferredKeys.push(key);\n    this.pendingKeysSet.add(key);\n\n    // We store a little wrapper promise that will be extended with\n    // _data/_error props upon resolve/reject\n    let promise: TrackedPromise = Promise.race([value, this.abortPromise]).then(\n      (data) => this.onSettle(promise, key, undefined, data as unknown),\n      (error) => this.onSettle(promise, key, error as unknown)\n    );\n\n    // Register rejection listeners to avoid uncaught promise rejections on\n    // errors or aborted deferred values\n    promise.catch(() => {});\n\n    Object.defineProperty(promise, \"_tracked\", { get: () => true });\n    return promise;\n  }\n\n  private onSettle(\n    promise: TrackedPromise,\n    key: string,\n    error: unknown,\n    data?: unknown\n  ): unknown {\n    if (\n      this.controller.signal.aborted &&\n      error instanceof AbortedDeferredError\n    ) {\n      this.unlistenAbortSignal();\n      Object.defineProperty(promise, \"_error\", { get: () => error });\n      return Promise.reject(error);\n    }\n\n    this.pendingKeysSet.delete(key);\n\n    if (this.done) {\n      // Nothing left to abort!\n      this.unlistenAbortSignal();\n    }\n\n    // If the promise was resolved/rejected with undefined, we'll throw an error as you\n    // should always resolve with a value or null\n    if (error === undefined && data === undefined) {\n      let undefinedError = new Error(\n        `Deferred data for key \"${key}\" resolved/rejected with \\`undefined\\`, ` +\n          `you must resolve/reject with a value or \\`null\\`.`\n      );\n      Object.defineProperty(promise, \"_error\", { get: () => undefinedError });\n      this.emit(false, key);\n      return Promise.reject(undefinedError);\n    }\n\n    if (data === undefined) {\n      Object.defineProperty(promise, \"_error\", { get: () => error });\n      this.emit(false, key);\n      return Promise.reject(error);\n    }\n\n    Object.defineProperty(promise, \"_data\", { get: () => data });\n    this.emit(false, key);\n    return data;\n  }\n\n  private emit(aborted: boolean, settledKey?: string) {\n    this.subscribers.forEach((subscriber) => subscriber(aborted, settledKey));\n  }\n\n  subscribe(fn: (aborted: boolean, settledKey?: string) => void) {\n    this.subscribers.add(fn);\n    return () => this.subscribers.delete(fn);\n  }\n\n  cancel() {\n    this.controller.abort();\n    this.pendingKeysSet.forEach((v, k) => this.pendingKeysSet.delete(k));\n    this.emit(true);\n  }\n\n  async resolveData(signal: AbortSignal) {\n    let aborted = false;\n    if (!this.done) {\n      let onAbort = () => this.cancel();\n      signal.addEventListener(\"abort\", onAbort);\n      aborted = await new Promise((resolve) => {\n        this.subscribe((aborted) => {\n          signal.removeEventListener(\"abort\", onAbort);\n          if (aborted || this.done) {\n            resolve(aborted);\n          }\n        });\n      });\n    }\n    return aborted;\n  }\n\n  get done() {\n    return this.pendingKeysSet.size === 0;\n  }\n\n  get unwrappedData() {\n    invariant(\n      this.data !== null && this.done,\n      \"Can only unwrap data on initialized and settled deferreds\"\n    );\n\n    return Object.entries(this.data).reduce(\n      (acc, [key, value]) =>\n        Object.assign(acc, {\n          [key]: unwrapTrackedPromise(value),\n        }),\n      {}\n    );\n  }\n\n  get pendingKeys() {\n    return Array.from(this.pendingKeysSet);\n  }\n}\n\nfunction isTrackedPromise(value: any): value is TrackedPromise {\n  return (\n    value instanceof Promise && (value as TrackedPromise)._tracked === true\n  );\n}\n\nfunction unwrapTrackedPromise(value: any) {\n  if (!isTrackedPromise(value)) {\n    return value;\n  }\n\n  if (value._error) {\n    throw value._error;\n  }\n  return value._data;\n}\n\nexport type DeferFunction = (\n  data: Record<string, unknown>,\n  init?: number | ResponseInit\n) => DeferredData;\n\nexport const defer: DeferFunction = (data, init = {}) => {\n  let responseInit = typeof init === \"number\" ? { status: init } : init;\n\n  return new DeferredData(data, responseInit);\n};\n\nexport type RedirectFunction = (\n  url: string,\n  init?: number | ResponseInit\n) => Response;\n\n/**\n * A redirect response. Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nexport const redirect: RedirectFunction = (url, init = 302) => {\n  let responseInit = init;\n  if (typeof responseInit === \"number\") {\n    responseInit = { status: responseInit };\n  } else if (typeof responseInit.status === \"undefined\") {\n    responseInit.status = 302;\n  }\n\n  let headers = new Headers(responseInit.headers);\n  headers.set(\"Location\", url);\n\n  return new Response(null, {\n    ...responseInit,\n    headers,\n  });\n};\n\n/**\n * A redirect response that will force a document reload to the new location.\n * Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nexport const redirectDocument: RedirectFunction = (url, init) => {\n  let response = redirect(url, init);\n  response.headers.set(\"X-Remix-Reload-Document\", \"true\");\n  return response;\n};\n\nexport type ErrorResponse = {\n  status: number;\n  statusText: string;\n  data: any;\n};\n\n/**\n * @private\n * Utility class we use to hold auto-unwrapped 4xx/5xx Response bodies\n *\n * We don't export the class for public use since it's an implementation\n * detail, but we export the interface above so folks can build their own\n * abstractions around instances via isRouteErrorResponse()\n */\nexport class ErrorResponseImpl implements ErrorResponse {\n  status: number;\n  statusText: string;\n  data: any;\n  private error?: Error;\n  private internal: boolean;\n\n  constructor(\n    status: number,\n    statusText: string | undefined,\n    data: any,\n    internal = false\n  ) {\n    this.status = status;\n    this.statusText = statusText || \"\";\n    this.internal = internal;\n    if (data instanceof Error) {\n      this.data = data.toString();\n      this.error = data;\n    } else {\n      this.data = data;\n    }\n  }\n}\n\n/**\n * Check if the given error is an ErrorResponse generated from a 4xx/5xx\n * Response thrown from an action/loader\n */\nexport function isRouteErrorResponse(error: any): error is ErrorResponse {\n  return (\n    error != null &&\n    typeof error.status === \"number\" &&\n    typeof error.statusText === \"string\" &&\n    typeof error.internal === \"boolean\" &&\n    \"data\" in error\n  );\n}\n","import type { History, Location, Path, To } from \"./history\";\nimport {\n  Action as HistoryAction,\n  createLocation,\n  createPath,\n  invariant,\n  parsePath,\n  warning,\n} from \"./history\";\nimport type {\n  AgnosticDataRouteMatch,\n  AgnosticDataRouteObject,\n  DataStrategyMatch,\n  AgnosticRouteObject,\n  DataResult,\n  DataStrategyFunction,\n  DataStrategyFunctionArgs,\n  DeferredData,\n  DeferredResult,\n  DetectErrorBoundaryFunction,\n  ErrorResult,\n  FormEncType,\n  FormMethod,\n  HTMLFormMethod,\n  HandlerResult,\n  ImmutableRouteKey,\n  MapRoutePropertiesFunction,\n  MutationFormMethod,\n  RedirectResult,\n  RouteData,\n  RouteManifest,\n  ShouldRevalidateFunctionArgs,\n  Submission,\n  SuccessResult,\n  UIMatch,\n  V7_FormMethod,\n  V7_MutationFormMethod,\n} from \"./utils\";\nimport {\n  ErrorResponseImpl,\n  ResultType,\n  convertRouteMatchToUiMatch,\n  convertRoutesToDataRoutes,\n  getPathContributingMatches,\n  getResolveToMatches,\n  immutableRouteKeys,\n  isRouteErrorResponse,\n  joinPaths,\n  matchRoutes,\n  resolveTo,\n  stripBasename,\n} from \"./utils\";\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Types and Constants\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A Router instance manages all navigation and data loading/mutations\n */\nexport interface Router {\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Return the basename for the router\n   */\n  get basename(): RouterInit[\"basename\"];\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Return the future config for the router\n   */\n  get future(): FutureConfig;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Return the current state of the router\n   */\n  get state(): RouterState;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Return the routes for this router instance\n   */\n  get routes(): AgnosticDataRouteObject[];\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Return the window associated with the router\n   */\n  get window(): RouterInit[\"window\"];\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Initialize the router, including adding history listeners and kicking off\n   * initial data fetches.  Returns a function to cleanup listeners and abort\n   * any in-progress loads\n   */\n  initialize(): Router;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Subscribe to router.state updates\n   *\n   * @param fn function to call with the new state\n   */\n  subscribe(fn: RouterSubscriber): () => void;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Enable scroll restoration behavior in the router\n   *\n   * @param savedScrollPositions Object that will manage positions, in case\n   *                             it's being restored from sessionStorage\n   * @param getScrollPosition    Function to get the active Y scroll position\n   * @param getKey               Function to get the key to use for restoration\n   */\n  enableScrollRestoration(\n    savedScrollPositions: Record<string, number>,\n    getScrollPosition: GetScrollPositionFunction,\n    getKey?: GetScrollRestorationKeyFunction\n  ): () => void;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Navigate forward/backward in the history stack\n   * @param to Delta to move in the history stack\n   */\n  navigate(to: number): Promise<void>;\n\n  /**\n   * Navigate to the given path\n   * @param to Path to navigate to\n   * @param opts Navigation options (method, submission, etc.)\n   */\n  navigate(to: To | null, opts?: RouterNavigateOptions): Promise<void>;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Trigger a fetcher load/submission\n   *\n   * @param key     Fetcher key\n   * @param routeId Route that owns the fetcher\n   * @param href    href to fetch\n   * @param opts    Fetcher options, (method, submission, etc.)\n   */\n  fetch(\n    key: string,\n    routeId: string,\n    href: string | null,\n    opts?: RouterFetchOptions\n  ): void;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Trigger a revalidation of all current route loaders and fetcher loads\n   */\n  revalidate(): void;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Utility function to create an href for the given location\n   * @param location\n   */\n  createHref(location: Location | URL): string;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Utility function to URL encode a destination path according to the internal\n   * history implementation\n   * @param to\n   */\n  encodeLocation(to: To): Path;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Get/create a fetcher for the given key\n   * @param key\n   */\n  getFetcher<TData = any>(key: string): Fetcher<TData>;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Delete the fetcher for a given key\n   * @param key\n   */\n  deleteFetcher(key: string): void;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Cleanup listeners and abort any in-progress loads\n   */\n  dispose(): void;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Get a navigation blocker\n   * @param key The identifier for the blocker\n   * @param fn The blocker function implementation\n   */\n  getBlocker(key: string, fn: BlockerFunction): Blocker;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Delete a navigation blocker\n   * @param key The identifier for the blocker\n   */\n  deleteBlocker(key: string): void;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * HMR needs to pass in-flight route updates to React Router\n   * TODO: Replace this with granular route update APIs (addRoute, updateRoute, deleteRoute)\n   */\n  _internalSetRoutes(routes: AgnosticRouteObject[]): void;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Internal fetch AbortControllers accessed by unit tests\n   */\n  _internalFetchControllers: Map<string, AbortController>;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Internal pending DeferredData instances accessed by unit tests\n   */\n  _internalActiveDeferreds: Map<string, DeferredData>;\n}\n\n/**\n * State maintained internally by the router.  During a navigation, all states\n * reflect the the \"old\" location unless otherwise noted.\n */\nexport interface RouterState {\n  /**\n   * The action of the most recent navigation\n   */\n  historyAction: HistoryAction;\n\n  /**\n   * The current location reflected by the router\n   */\n  location: Location;\n\n  /**\n   * The current set of route matches\n   */\n  matches: AgnosticDataRouteMatch[];\n\n  /**\n   * Tracks whether we've completed our initial data load\n   */\n  initialized: boolean;\n\n  /**\n   * Current scroll position we should start at for a new view\n   *  - number -> scroll position to restore to\n   *  - false -> do not restore scroll at all (used during submissions)\n   *  - null -> don't have a saved position, scroll to hash or top of page\n   */\n  restoreScrollPosition: number | false | null;\n\n  /**\n   * Indicate whether this navigation should skip resetting the scroll position\n   * if we are unable to restore the scroll position\n   */\n  preventScrollReset: boolean;\n\n  /**\n   * Tracks the state of the current navigation\n   */\n  navigation: Navigation;\n\n  /**\n   * Tracks any in-progress revalidations\n   */\n  revalidation: RevalidationState;\n\n  /**\n   * Data from the loaders for the current matches\n   */\n  loaderData: RouteData;\n\n  /**\n   * Data from the action for the current matches\n   */\n  actionData: RouteData | null;\n\n  /**\n   * Errors caught from loaders for the current matches\n   */\n  errors: RouteData | null;\n\n  /**\n   * Map of current fetchers\n   */\n  fetchers: Map<string, Fetcher>;\n\n  /**\n   * Map of current blockers\n   */\n  blockers: Map<string, Blocker>;\n}\n\n/**\n * Data that can be passed into hydrate a Router from SSR\n */\nexport type HydrationState = Partial<\n  Pick<RouterState, \"loaderData\" | \"actionData\" | \"errors\">\n>;\n\n/**\n * Future flags to toggle new feature behavior\n */\nexport interface FutureConfig {\n  v7_fetcherPersist: boolean;\n  v7_normalizeFormMethod: boolean;\n  v7_partialHydration: boolean;\n  v7_prependBasename: boolean;\n  v7_relativeSplatPath: boolean;\n  unstable_skipActionErrorRevalidation: boolean;\n}\n\n/**\n * Initialization options for createRouter\n */\nexport interface RouterInit {\n  routes: AgnosticRouteObject[];\n  history: History;\n  basename?: string;\n  /**\n   * @deprecated Use `mapRouteProperties` instead\n   */\n  detectErrorBoundary?: DetectErrorBoundaryFunction;\n  mapRouteProperties?: MapRoutePropertiesFunction;\n  future?: Partial<FutureConfig>;\n  hydrationData?: HydrationState;\n  window?: Window;\n  unstable_dataStrategy?: DataStrategyFunction;\n}\n\n/**\n * State returned from a server-side query() call\n */\nexport interface StaticHandlerContext {\n  basename: Router[\"basename\"];\n  location: RouterState[\"location\"];\n  matches: RouterState[\"matches\"];\n  loaderData: RouterState[\"loaderData\"];\n  actionData: RouterState[\"actionData\"];\n  errors: RouterState[\"errors\"];\n  statusCode: number;\n  loaderHeaders: Record<string, Headers>;\n  actionHeaders: Record<string, Headers>;\n  activeDeferreds: Record<string, DeferredData> | null;\n  _deepestRenderedBoundaryId?: string | null;\n}\n\n/**\n * A StaticHandler instance manages a singular SSR navigation/fetch event\n */\nexport interface StaticHandler {\n  dataRoutes: AgnosticDataRouteObject[];\n  query(\n    request: Request,\n    opts?: {\n      requestContext?: unknown;\n      skipLoaderErrorBubbling?: boolean;\n      unstable_dataStrategy?: DataStrategyFunction;\n    }\n  ): Promise<StaticHandlerContext | Response>;\n  queryRoute(\n    request: Request,\n    opts?: {\n      routeId?: string;\n      requestContext?: unknown;\n      unstable_dataStrategy?: DataStrategyFunction;\n    }\n  ): Promise<any>;\n}\n\ntype ViewTransitionOpts = {\n  currentLocation: Location;\n  nextLocation: Location;\n};\n\n/**\n * Subscriber function signature for changes to router state\n */\nexport interface RouterSubscriber {\n  (\n    state: RouterState,\n    opts: {\n      deletedFetchers: string[];\n      unstable_viewTransitionOpts?: ViewTransitionOpts;\n      unstable_flushSync: boolean;\n    }\n  ): void;\n}\n\n/**\n * Function signature for determining the key to be used in scroll restoration\n * for a given location\n */\nexport interface GetScrollRestorationKeyFunction {\n  (location: Location, matches: UIMatch[]): string | null;\n}\n\n/**\n * Function signature for determining the current scroll position\n */\nexport interface GetScrollPositionFunction {\n  (): number;\n}\n\nexport type RelativeRoutingType = \"route\" | \"path\";\n\n// Allowed for any navigation or fetch\ntype BaseNavigateOrFetchOptions = {\n  preventScrollReset?: boolean;\n  relative?: RelativeRoutingType;\n  unstable_flushSync?: boolean;\n};\n\n// Only allowed for navigations\ntype BaseNavigateOptions = BaseNavigateOrFetchOptions & {\n  replace?: boolean;\n  state?: any;\n  fromRouteId?: string;\n  unstable_viewTransition?: boolean;\n};\n\n// Only allowed for submission navigations\ntype BaseSubmissionOptions = {\n  formMethod?: HTMLFormMethod;\n  formEncType?: FormEncType;\n} & (\n  | { formData: FormData; body?: undefined }\n  | { formData?: undefined; body: any }\n);\n\n/**\n * Options for a navigate() call for a normal (non-submission) navigation\n */\ntype LinkNavigateOptions = BaseNavigateOptions;\n\n/**\n * Options for a navigate() call for a submission navigation\n */\ntype SubmissionNavigateOptions = BaseNavigateOptions & BaseSubmissionOptions;\n\n/**\n * Options to pass to navigate() for a navigation\n */\nexport type RouterNavigateOptions =\n  | LinkNavigateOptions\n  | SubmissionNavigateOptions;\n\n/**\n * Options for a fetch() load\n */\ntype LoadFetchOptions = BaseNavigateOrFetchOptions;\n\n/**\n * Options for a fetch() submission\n */\ntype SubmitFetchOptions = BaseNavigateOrFetchOptions & BaseSubmissionOptions;\n\n/**\n * Options to pass to fetch()\n */\nexport type RouterFetchOptions = LoadFetchOptions | SubmitFetchOptions;\n\n/**\n * Potential states for state.navigation\n */\nexport type NavigationStates = {\n  Idle: {\n    state: \"idle\";\n    location: undefined;\n    formMethod: undefined;\n    formAction: undefined;\n    formEncType: undefined;\n    formData: undefined;\n    json: undefined;\n    text: undefined;\n  };\n  Loading: {\n    state: \"loading\";\n    location: Location;\n    formMethod: Submission[\"formMethod\"] | undefined;\n    formAction: Submission[\"formAction\"] | undefined;\n    formEncType: Submission[\"formEncType\"] | undefined;\n    formData: Submission[\"formData\"] | undefined;\n    json: Submission[\"json\"] | undefined;\n    text: Submission[\"text\"] | undefined;\n  };\n  Submitting: {\n    state: \"submitting\";\n    location: Location;\n    formMethod: Submission[\"formMethod\"];\n    formAction: Submission[\"formAction\"];\n    formEncType: Submission[\"formEncType\"];\n    formData: Submission[\"formData\"];\n    json: Submission[\"json\"];\n    text: Submission[\"text\"];\n  };\n};\n\nexport type Navigation = NavigationStates[keyof NavigationStates];\n\nexport type RevalidationState = \"idle\" | \"loading\";\n\n/**\n * Potential states for fetchers\n */\ntype FetcherStates<TData = any> = {\n  Idle: {\n    state: \"idle\";\n    formMethod: undefined;\n    formAction: undefined;\n    formEncType: undefined;\n    text: undefined;\n    formData: undefined;\n    json: undefined;\n    data: TData | undefined;\n  };\n  Loading: {\n    state: \"loading\";\n    formMethod: Submission[\"formMethod\"] | undefined;\n    formAction: Submission[\"formAction\"] | undefined;\n    formEncType: Submission[\"formEncType\"] | undefined;\n    text: Submission[\"text\"] | undefined;\n    formData: Submission[\"formData\"] | undefined;\n    json: Submission[\"json\"] | undefined;\n    data: TData | undefined;\n  };\n  Submitting: {\n    state: \"submitting\";\n    formMethod: Submission[\"formMethod\"];\n    formAction: Submission[\"formAction\"];\n    formEncType: Submission[\"formEncType\"];\n    text: Submission[\"text\"];\n    formData: Submission[\"formData\"];\n    json: Submission[\"json\"];\n    data: TData | undefined;\n  };\n};\n\nexport type Fetcher<TData = any> =\n  FetcherStates<TData>[keyof FetcherStates<TData>];\n\ninterface BlockerBlocked {\n  state: \"blocked\";\n  reset(): void;\n  proceed(): void;\n  location: Location;\n}\n\ninterface BlockerUnblocked {\n  state: \"unblocked\";\n  reset: undefined;\n  proceed: undefined;\n  location: undefined;\n}\n\ninterface BlockerProceeding {\n  state: \"proceeding\";\n  reset: undefined;\n  proceed: undefined;\n  location: Location;\n}\n\nexport type Blocker = BlockerUnblocked | BlockerBlocked | BlockerProceeding;\n\nexport type BlockerFunction = (args: {\n  currentLocation: Location;\n  nextLocation: Location;\n  historyAction: HistoryAction;\n}) => boolean;\n\ninterface ShortCircuitable {\n  /**\n   * startNavigation does not need to complete the navigation because we\n   * redirected or got interrupted\n   */\n  shortCircuited?: boolean;\n}\n\ntype PendingActionResult = [string, SuccessResult | ErrorResult];\n\ninterface HandleActionResult extends ShortCircuitable {\n  /**\n   * Tuple for the returned or thrown value from the current action.  The routeId\n   * is the action route for success and the bubbled boundary route for errors.\n   */\n  pendingActionResult?: PendingActionResult;\n}\n\ninterface HandleLoadersResult extends ShortCircuitable {\n  /**\n   * loaderData returned from the current set of loaders\n   */\n  loaderData?: RouterState[\"loaderData\"];\n  /**\n   * errors thrown from the current set of loaders\n   */\n  errors?: RouterState[\"errors\"];\n}\n\n/**\n * Cached info for active fetcher.load() instances so they can participate\n * in revalidation\n */\ninterface FetchLoadMatch {\n  routeId: string;\n  path: string;\n}\n\n/**\n * Identified fetcher.load() calls that need to be revalidated\n */\ninterface RevalidatingFetcher extends FetchLoadMatch {\n  key: string;\n  match: AgnosticDataRouteMatch | null;\n  matches: AgnosticDataRouteMatch[] | null;\n  controller: AbortController | null;\n}\n\nconst validMutationMethodsArr: MutationFormMethod[] = [\n  \"post\",\n  \"put\",\n  \"patch\",\n  \"delete\",\n];\nconst validMutationMethods = new Set<MutationFormMethod>(\n  validMutationMethodsArr\n);\n\nconst validRequestMethodsArr: FormMethod[] = [\n  \"get\",\n  ...validMutationMethodsArr,\n];\nconst validRequestMethods = new Set<FormMethod>(validRequestMethodsArr);\n\nconst redirectStatusCodes = new Set([301, 302, 303, 307, 308]);\nconst redirectPreserveMethodStatusCodes = new Set([307, 308]);\n\nexport const IDLE_NAVIGATION: NavigationStates[\"Idle\"] = {\n  state: \"idle\",\n  location: undefined,\n  formMethod: undefined,\n  formAction: undefined,\n  formEncType: undefined,\n  formData: undefined,\n  json: undefined,\n  text: undefined,\n};\n\nexport const IDLE_FETCHER: FetcherStates[\"Idle\"] = {\n  state: \"idle\",\n  data: undefined,\n  formMethod: undefined,\n  formAction: undefined,\n  formEncType: undefined,\n  formData: undefined,\n  json: undefined,\n  text: undefined,\n};\n\nexport const IDLE_BLOCKER: BlockerUnblocked = {\n  state: \"unblocked\",\n  proceed: undefined,\n  reset: undefined,\n  location: undefined,\n};\n\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\n\nconst defaultMapRouteProperties: MapRoutePropertiesFunction = (route) => ({\n  hasErrorBoundary: Boolean(route.hasErrorBoundary),\n});\n\nconst TRANSITIONS_STORAGE_KEY = \"remix-router-transitions\";\n\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region createRouter\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Create a router and listen to history POP navigations\n */\nexport function createRouter(init: RouterInit): Router {\n  const routerWindow = init.window\n    ? init.window\n    : typeof window !== \"undefined\"\n    ? window\n    : undefined;\n  const isBrowser =\n    typeof routerWindow !== \"undefined\" &&\n    typeof routerWindow.document !== \"undefined\" &&\n    typeof routerWindow.document.createElement !== \"undefined\";\n  const isServer = !isBrowser;\n\n  invariant(\n    init.routes.length > 0,\n    \"You must provide a non-empty routes array to createRouter\"\n  );\n\n  let mapRouteProperties: MapRoutePropertiesFunction;\n  if (init.mapRouteProperties) {\n    mapRouteProperties = init.mapRouteProperties;\n  } else if (init.detectErrorBoundary) {\n    // If they are still using the deprecated version, wrap it with the new API\n    let detectErrorBoundary = init.detectErrorBoundary;\n    mapRouteProperties = (route) => ({\n      hasErrorBoundary: detectErrorBoundary(route),\n    });\n  } else {\n    mapRouteProperties = defaultMapRouteProperties;\n  }\n\n  // Routes keyed by ID\n  let manifest: RouteManifest = {};\n  // Routes in tree format for matching\n  let dataRoutes = convertRoutesToDataRoutes(\n    init.routes,\n    mapRouteProperties,\n    undefined,\n    manifest\n  );\n  let inFlightDataRoutes: AgnosticDataRouteObject[] | undefined;\n  let basename = init.basename || \"/\";\n  let dataStrategyImpl = init.unstable_dataStrategy || defaultDataStrategy;\n  // Config driven behavior flags\n  let future: FutureConfig = {\n    v7_fetcherPersist: false,\n    v7_normalizeFormMethod: false,\n    v7_partialHydration: false,\n    v7_prependBasename: false,\n    v7_relativeSplatPath: false,\n    unstable_skipActionErrorRevalidation: false,\n    ...init.future,\n  };\n  // Cleanup function for history\n  let unlistenHistory: (() => void) | null = null;\n  // Externally-provided functions to call on all state changes\n  let subscribers = new Set<RouterSubscriber>();\n  // Externally-provided object to hold scroll restoration locations during routing\n  let savedScrollPositions: Record<string, number> | null = null;\n  // Externally-provided function to get scroll restoration keys\n  let getScrollRestorationKey: GetScrollRestorationKeyFunction | null = null;\n  // Externally-provided function to get current scroll position\n  let getScrollPosition: GetScrollPositionFunction | null = null;\n  // One-time flag to control the initial hydration scroll restoration.  Because\n  // we don't get the saved positions from <ScrollRestoration /> until _after_\n  // the initial render, we need to manually trigger a separate updateState to\n  // send along the restoreScrollPosition\n  // Set to true if we have `hydrationData` since we assume we were SSR'd and that\n  // SSR did the initial scroll restoration.\n  let initialScrollRestored = init.hydrationData != null;\n\n  let initialMatches = matchRoutes(dataRoutes, init.history.location, basename);\n  let initialErrors: RouteData | null = null;\n\n  if (initialMatches == null) {\n    // If we do not match a user-provided-route, fall back to the root\n    // to allow the error boundary to take over\n    let error = getInternalRouterError(404, {\n      pathname: init.history.location.pathname,\n    });\n    let { matches, route } = getShortCircuitMatches(dataRoutes);\n    initialMatches = matches;\n    initialErrors = { [route.id]: error };\n  }\n\n  let initialized: boolean;\n  let hasLazyRoutes = initialMatches.some((m) => m.route.lazy);\n  let hasLoaders = initialMatches.some((m) => m.route.loader);\n  if (hasLazyRoutes) {\n    // All initialMatches need to be loaded before we're ready.  If we have lazy\n    // functions around still then we'll need to run them in initialize()\n    initialized = false;\n  } else if (!hasLoaders) {\n    // If we've got no loaders to run, then we're good to go\n    initialized = true;\n  } else if (future.v7_partialHydration) {\n    // If partial hydration is enabled, we're initialized so long as we were\n    // provided with hydrationData for every route with a loader, and no loaders\n    // were marked for explicit hydration\n    let loaderData = init.hydrationData ? init.hydrationData.loaderData : null;\n    let errors = init.hydrationData ? init.hydrationData.errors : null;\n    let isRouteInitialized = (m: AgnosticDataRouteMatch) => {\n      // No loader, nothing to initialize\n      if (!m.route.loader) {\n        return true;\n      }\n      // Explicitly opting-in to running on hydration\n      if (\n        typeof m.route.loader === \"function\" &&\n        m.route.loader.hydrate === true\n      ) {\n        return false;\n      }\n      // Otherwise, initialized if hydrated with data or an error\n      return (\n        (loaderData && loaderData[m.route.id] !== undefined) ||\n        (errors && errors[m.route.id] !== undefined)\n      );\n    };\n\n    // If errors exist, don't consider routes below the boundary\n    if (errors) {\n      let idx = initialMatches.findIndex(\n        (m) => errors![m.route.id] !== undefined\n      );\n      initialized = initialMatches.slice(0, idx + 1).every(isRouteInitialized);\n    } else {\n      initialized = initialMatches.every(isRouteInitialized);\n    }\n  } else {\n    // Without partial hydration - we're initialized if we were provided any\n    // hydrationData - which is expected to be complete\n    initialized = init.hydrationData != null;\n  }\n\n  let router: Router;\n  let state: RouterState = {\n    historyAction: init.history.action,\n    location: init.history.location,\n    matches: initialMatches,\n    initialized,\n    navigation: IDLE_NAVIGATION,\n    // Don't restore on initial updateState() if we were SSR'd\n    restoreScrollPosition: init.hydrationData != null ? false : null,\n    preventScrollReset: false,\n    revalidation: \"idle\",\n    loaderData: (init.hydrationData && init.hydrationData.loaderData) || {},\n    actionData: (init.hydrationData && init.hydrationData.actionData) || null,\n    errors: (init.hydrationData && init.hydrationData.errors) || initialErrors,\n    fetchers: new Map(),\n    blockers: new Map(),\n  };\n\n  // -- Stateful internal variables to manage navigations --\n  // Current navigation in progress (to be committed in completeNavigation)\n  let pendingAction: HistoryAction = HistoryAction.Pop;\n\n  // Should the current navigation prevent the scroll reset if scroll cannot\n  // be restored?\n  let pendingPreventScrollReset = false;\n\n  // AbortController for the active navigation\n  let pendingNavigationController: AbortController | null;\n\n  // Should the current navigation enable document.startViewTransition?\n  let pendingViewTransitionEnabled = false;\n\n  // Store applied view transitions so we can apply them on POP\n  let appliedViewTransitions: Map<string, Set<string>> = new Map<\n    string,\n    Set<string>\n  >();\n\n  // Cleanup function for persisting applied transitions to sessionStorage\n  let removePageHideEventListener: (() => void) | null = null;\n\n  // We use this to avoid touching history in completeNavigation if a\n  // revalidation is entirely uninterrupted\n  let isUninterruptedRevalidation = false;\n\n  // Use this internal flag to force revalidation of all loaders:\n  //  - submissions (completed or interrupted)\n  //  - useRevalidator()\n  //  - X-Remix-Revalidate (from redirect)\n  let isRevalidationRequired = false;\n\n  // Use this internal array to capture routes that require revalidation due\n  // to a cancelled deferred on action submission\n  let cancelledDeferredRoutes: string[] = [];\n\n  // Use this internal array to capture fetcher loads that were cancelled by an\n  // action navigation and require revalidation\n  let cancelledFetcherLoads: string[] = [];\n\n  // AbortControllers for any in-flight fetchers\n  let fetchControllers = new Map<string, AbortController>();\n\n  // Track loads based on the order in which they started\n  let incrementingLoadId = 0;\n\n  // Track the outstanding pending navigation data load to be compared against\n  // the globally incrementing load when a fetcher load lands after a completed\n  // navigation\n  let pendingNavigationLoadId = -1;\n\n  // Fetchers that triggered data reloads as a result of their actions\n  let fetchReloadIds = new Map<string, number>();\n\n  // Fetchers that triggered redirect navigations\n  let fetchRedirectIds = new Set<string>();\n\n  // Most recent href/match for fetcher.load calls for fetchers\n  let fetchLoadMatches = new Map<string, FetchLoadMatch>();\n\n  // Ref-count mounted fetchers so we know when it's ok to clean them up\n  let activeFetchers = new Map<string, number>();\n\n  // Fetchers that have requested a delete when using v7_fetcherPersist,\n  // they'll be officially removed after they return to idle\n  let deletedFetchers = new Set<string>();\n\n  // Store DeferredData instances for active route matches.  When a\n  // route loader returns defer() we stick one in here.  Then, when a nested\n  // promise resolves we update loaderData.  If a new navigation starts we\n  // cancel active deferreds for eliminated routes.\n  let activeDeferreds = new Map<string, DeferredData>();\n\n  // Store blocker functions in a separate Map outside of router state since\n  // we don't need to update UI state if they change\n  let blockerFunctions = new Map<string, BlockerFunction>();\n\n  // Flag to ignore the next history update, so we can revert the URL change on\n  // a POP navigation that was blocked by the user without touching router state\n  let ignoreNextHistoryUpdate = false;\n\n  // Initialize the router, all side effects should be kicked off from here.\n  // Implemented as a Fluent API for ease of:\n  //   let router = createRouter(init).initialize();\n  function initialize() {\n    // If history informs us of a POP navigation, start the navigation but do not update\n    // state.  We'll update our own state once the navigation completes\n    unlistenHistory = init.history.listen(\n      ({ action: historyAction, location, delta }) => {\n        // Ignore this event if it was just us resetting the URL from a\n        // blocked POP navigation\n        if (ignoreNextHistoryUpdate) {\n          ignoreNextHistoryUpdate = false;\n          return;\n        }\n\n        warning(\n          blockerFunctions.size === 0 || delta != null,\n          \"You are trying to use a blocker on a POP navigation to a location \" +\n            \"that was not created by @remix-run/router. This will fail silently in \" +\n            \"production. This can happen if you are navigating outside the router \" +\n            \"via `window.history.pushState`/`window.location.hash` instead of using \" +\n            \"router navigation APIs.  This can also happen if you are using \" +\n            \"createHashRouter and the user manually changes the URL.\"\n        );\n\n        let blockerKey = shouldBlockNavigation({\n          currentLocation: state.location,\n          nextLocation: location,\n          historyAction,\n        });\n\n        if (blockerKey && delta != null) {\n          // Restore the URL to match the current UI, but don't update router state\n          ignoreNextHistoryUpdate = true;\n          init.history.go(delta * -1);\n\n          // Put the blocker into a blocked state\n          updateBlocker(blockerKey, {\n            state: \"blocked\",\n            location,\n            proceed() {\n              updateBlocker(blockerKey!, {\n                state: \"proceeding\",\n                proceed: undefined,\n                reset: undefined,\n                location,\n              });\n              // Re-do the same POP navigation we just blocked\n              init.history.go(delta);\n            },\n            reset() {\n              let blockers = new Map(state.blockers);\n              blockers.set(blockerKey!, IDLE_BLOCKER);\n              updateState({ blockers });\n            },\n          });\n          return;\n        }\n\n        return startNavigation(historyAction, location);\n      }\n    );\n\n    if (isBrowser) {\n      // FIXME: This feels gross.  How can we cleanup the lines between\n      // scrollRestoration/appliedTransitions persistance?\n      restoreAppliedTransitions(routerWindow, appliedViewTransitions);\n      let _saveAppliedTransitions = () =>\n        persistAppliedTransitions(routerWindow, appliedViewTransitions);\n      routerWindow.addEventListener(\"pagehide\", _saveAppliedTransitions);\n      removePageHideEventListener = () =>\n        routerWindow.removeEventListener(\"pagehide\", _saveAppliedTransitions);\n    }\n\n    // Kick off initial data load if needed.  Use Pop to avoid modifying history\n    // Note we don't do any handling of lazy here.  For SPA's it'll get handled\n    // in the normal navigation flow.  For SSR it's expected that lazy modules are\n    // resolved prior to router creation since we can't go into a fallbackElement\n    // UI for SSR'd apps\n    if (!state.initialized) {\n      startNavigation(HistoryAction.Pop, state.location, {\n        initialHydration: true,\n      });\n    }\n\n    return router;\n  }\n\n  // Clean up a router and it's side effects\n  function dispose() {\n    if (unlistenHistory) {\n      unlistenHistory();\n    }\n    if (removePageHideEventListener) {\n      removePageHideEventListener();\n    }\n    subscribers.clear();\n    pendingNavigationController && pendingNavigationController.abort();\n    state.fetchers.forEach((_, key) => deleteFetcher(key));\n    state.blockers.forEach((_, key) => deleteBlocker(key));\n  }\n\n  // Subscribe to state updates for the router\n  function subscribe(fn: RouterSubscriber) {\n    subscribers.add(fn);\n    return () => subscribers.delete(fn);\n  }\n\n  // Update our state and notify the calling context of the change\n  function updateState(\n    newState: Partial<RouterState>,\n    opts: {\n      flushSync?: boolean;\n      viewTransitionOpts?: ViewTransitionOpts;\n    } = {}\n  ): void {\n    state = {\n      ...state,\n      ...newState,\n    };\n\n    // Prep fetcher cleanup so we can tell the UI which fetcher data entries\n    // can be removed\n    let completedFetchers: string[] = [];\n    let deletedFetchersKeys: string[] = [];\n\n    if (future.v7_fetcherPersist) {\n      state.fetchers.forEach((fetcher, key) => {\n        if (fetcher.state === \"idle\") {\n          if (deletedFetchers.has(key)) {\n            // Unmounted from the UI and can be totally removed\n            deletedFetchersKeys.push(key);\n          } else {\n            // Returned to idle but still mounted in the UI, so semi-remains for\n            // revalidations and such\n            completedFetchers.push(key);\n          }\n        }\n      });\n    }\n\n    // Iterate over a local copy so that if flushSync is used and we end up\n    // removing and adding a new subscriber due to the useCallback dependencies,\n    // we don't get ourselves into a loop calling the new subscriber immediately\n    [...subscribers].forEach((subscriber) =>\n      subscriber(state, {\n        deletedFetchers: deletedFetchersKeys,\n        unstable_viewTransitionOpts: opts.viewTransitionOpts,\n        unstable_flushSync: opts.flushSync === true,\n      })\n    );\n\n    // Remove idle fetchers from state since we only care about in-flight fetchers.\n    if (future.v7_fetcherPersist) {\n      completedFetchers.forEach((key) => state.fetchers.delete(key));\n      deletedFetchersKeys.forEach((key) => deleteFetcher(key));\n    }\n  }\n\n  // Complete a navigation returning the state.navigation back to the IDLE_NAVIGATION\n  // and setting state.[historyAction/location/matches] to the new route.\n  // - Location is a required param\n  // - Navigation will always be set to IDLE_NAVIGATION\n  // - Can pass any other state in newState\n  function completeNavigation(\n    location: Location,\n    newState: Partial<Omit<RouterState, \"action\" | \"location\" | \"navigation\">>,\n    { flushSync }: { flushSync?: boolean } = {}\n  ): void {\n    // Deduce if we're in a loading/actionReload state:\n    // - We have committed actionData in the store\n    // - The current navigation was a mutation submission\n    // - We're past the submitting state and into the loading state\n    // - The location being loaded is not the result of a redirect\n    let isActionReload =\n      state.actionData != null &&\n      state.navigation.formMethod != null &&\n      isMutationMethod(state.navigation.formMethod) &&\n      state.navigation.state === \"loading\" &&\n      location.state?._isRedirect !== true;\n\n    let actionData: RouteData | null;\n    if (newState.actionData) {\n      if (Object.keys(newState.actionData).length > 0) {\n        actionData = newState.actionData;\n      } else {\n        // Empty actionData -> clear prior actionData due to an action error\n        actionData = null;\n      }\n    } else if (isActionReload) {\n      // Keep the current data if we're wrapping up the action reload\n      actionData = state.actionData;\n    } else {\n      // Clear actionData on any other completed navigations\n      actionData = null;\n    }\n\n    // Always preserve any existing loaderData from re-used routes\n    let loaderData = newState.loaderData\n      ? mergeLoaderData(\n          state.loaderData,\n          newState.loaderData,\n          newState.matches || [],\n          newState.errors\n        )\n      : state.loaderData;\n\n    // On a successful navigation we can assume we got through all blockers\n    // so we can start fresh\n    let blockers = state.blockers;\n    if (blockers.size > 0) {\n      blockers = new Map(blockers);\n      blockers.forEach((_, k) => blockers.set(k, IDLE_BLOCKER));\n    }\n\n    // Always respect the user flag.  Otherwise don't reset on mutation\n    // submission navigations unless they redirect\n    let preventScrollReset =\n      pendingPreventScrollReset === true ||\n      (state.navigation.formMethod != null &&\n        isMutationMethod(state.navigation.formMethod) &&\n        location.state?._isRedirect !== true);\n\n    if (inFlightDataRoutes) {\n      dataRoutes = inFlightDataRoutes;\n      inFlightDataRoutes = undefined;\n    }\n\n    if (isUninterruptedRevalidation) {\n      // If this was an uninterrupted revalidation then do not touch history\n    } else if (pendingAction === HistoryAction.Pop) {\n      // Do nothing for POP - URL has already been updated\n    } else if (pendingAction === HistoryAction.Push) {\n      init.history.push(location, location.state);\n    } else if (pendingAction === HistoryAction.Replace) {\n      init.history.replace(location, location.state);\n    }\n\n    let viewTransitionOpts: ViewTransitionOpts | undefined;\n\n    // On POP, enable transitions if they were enabled on the original navigation\n    if (pendingAction === HistoryAction.Pop) {\n      // Forward takes precedence so they behave like the original navigation\n      let priorPaths = appliedViewTransitions.get(state.location.pathname);\n      if (priorPaths && priorPaths.has(location.pathname)) {\n        viewTransitionOpts = {\n          currentLocation: state.location,\n          nextLocation: location,\n        };\n      } else if (appliedViewTransitions.has(location.pathname)) {\n        // If we don't have a previous forward nav, assume we're popping back to\n        // the new location and enable if that location previously enabled\n        viewTransitionOpts = {\n          currentLocation: location,\n          nextLocation: state.location,\n        };\n      }\n    } else if (pendingViewTransitionEnabled) {\n      // Store the applied transition on PUSH/REPLACE\n      let toPaths = appliedViewTransitions.get(state.location.pathname);\n      if (toPaths) {\n        toPaths.add(location.pathname);\n      } else {\n        toPaths = new Set<string>([location.pathname]);\n        appliedViewTransitions.set(state.location.pathname, toPaths);\n      }\n      viewTransitionOpts = {\n        currentLocation: state.location,\n        nextLocation: location,\n      };\n    }\n\n    updateState(\n      {\n        ...newState, // matches, errors, fetchers go through as-is\n        actionData,\n        loaderData,\n        historyAction: pendingAction,\n        location,\n        initialized: true,\n        navigation: IDLE_NAVIGATION,\n        revalidation: \"idle\",\n        restoreScrollPosition: getSavedScrollPosition(\n          location,\n          newState.matches || state.matches\n        ),\n        preventScrollReset,\n        blockers,\n      },\n      {\n        viewTransitionOpts,\n        flushSync: flushSync === true,\n      }\n    );\n\n    // Reset stateful navigation vars\n    pendingAction = HistoryAction.Pop;\n    pendingPreventScrollReset = false;\n    pendingViewTransitionEnabled = false;\n    isUninterruptedRevalidation = false;\n    isRevalidationRequired = false;\n    cancelledDeferredRoutes = [];\n    cancelledFetcherLoads = [];\n  }\n\n  // Trigger a navigation event, which can either be a numerical POP or a PUSH\n  // replace with an optional submission\n  async function navigate(\n    to: number | To | null,\n    opts?: RouterNavigateOptions\n  ): Promise<void> {\n    if (typeof to === \"number\") {\n      init.history.go(to);\n      return;\n    }\n\n    let normalizedPath = normalizeTo(\n      state.location,\n      state.matches,\n      basename,\n      future.v7_prependBasename,\n      to,\n      future.v7_relativeSplatPath,\n      opts?.fromRouteId,\n      opts?.relative\n    );\n    let { path, submission, error } = normalizeNavigateOptions(\n      future.v7_normalizeFormMethod,\n      false,\n      normalizedPath,\n      opts\n    );\n\n    let currentLocation = state.location;\n    let nextLocation = createLocation(state.location, path, opts && opts.state);\n\n    // When using navigate as a PUSH/REPLACE we aren't reading an already-encoded\n    // URL from window.location, so we need to encode it here so the behavior\n    // remains the same as POP and non-data-router usages.  new URL() does all\n    // the same encoding we'd get from a history.pushState/window.location read\n    // without having to touch history\n    nextLocation = {\n      ...nextLocation,\n      ...init.history.encodeLocation(nextLocation),\n    };\n\n    let userReplace = opts && opts.replace != null ? opts.replace : undefined;\n\n    let historyAction = HistoryAction.Push;\n\n    if (userReplace === true) {\n      historyAction = HistoryAction.Replace;\n    } else if (userReplace === false) {\n      // no-op\n    } else if (\n      submission != null &&\n      isMutationMethod(submission.formMethod) &&\n      submission.formAction === state.location.pathname + state.location.search\n    ) {\n      // By default on submissions to the current location we REPLACE so that\n      // users don't have to double-click the back button to get to the prior\n      // location.  If the user redirects to a different location from the\n      // action/loader this will be ignored and the redirect will be a PUSH\n      historyAction = HistoryAction.Replace;\n    }\n\n    let preventScrollReset =\n      opts && \"preventScrollReset\" in opts\n        ? opts.preventScrollReset === true\n        : undefined;\n\n    let flushSync = (opts && opts.unstable_flushSync) === true;\n\n    let blockerKey = shouldBlockNavigation({\n      currentLocation,\n      nextLocation,\n      historyAction,\n    });\n\n    if (blockerKey) {\n      // Put the blocker into a blocked state\n      updateBlocker(blockerKey, {\n        state: \"blocked\",\n        location: nextLocation,\n        proceed() {\n          updateBlocker(blockerKey!, {\n            state: \"proceeding\",\n            proceed: undefined,\n            reset: undefined,\n            location: nextLocation,\n          });\n          // Send the same navigation through\n          navigate(to, opts);\n        },\n        reset() {\n          let blockers = new Map(state.blockers);\n          blockers.set(blockerKey!, IDLE_BLOCKER);\n          updateState({ blockers });\n        },\n      });\n      return;\n    }\n\n    return await startNavigation(historyAction, nextLocation, {\n      submission,\n      // Send through the formData serialization error if we have one so we can\n      // render at the right error boundary after we match routes\n      pendingError: error,\n      preventScrollReset,\n      replace: opts && opts.replace,\n      enableViewTransition: opts && opts.unstable_viewTransition,\n      flushSync,\n    });\n  }\n\n  // Revalidate all current loaders.  If a navigation is in progress or if this\n  // is interrupted by a navigation, allow this to \"succeed\" by calling all\n  // loaders during the next loader round\n  function revalidate() {\n    interruptActiveLoads();\n    updateState({ revalidation: \"loading\" });\n\n    // If we're currently submitting an action, we don't need to start a new\n    // navigation, we'll just let the follow up loader execution call all loaders\n    if (state.navigation.state === \"submitting\") {\n      return;\n    }\n\n    // If we're currently in an idle state, start a new navigation for the current\n    // action/location and mark it as uninterrupted, which will skip the history\n    // update in completeNavigation\n    if (state.navigation.state === \"idle\") {\n      startNavigation(state.historyAction, state.location, {\n        startUninterruptedRevalidation: true,\n      });\n      return;\n    }\n\n    // Otherwise, if we're currently in a loading state, just start a new\n    // navigation to the navigation.location but do not trigger an uninterrupted\n    // revalidation so that history correctly updates once the navigation completes\n    startNavigation(\n      pendingAction || state.historyAction,\n      state.navigation.location,\n      { overrideNavigation: state.navigation }\n    );\n  }\n\n  // Start a navigation to the given action/location.  Can optionally provide a\n  // overrideNavigation which will override the normalLoad in the case of a redirect\n  // navigation\n  async function startNavigation(\n    historyAction: HistoryAction,\n    location: Location,\n    opts?: {\n      initialHydration?: boolean;\n      submission?: Submission;\n      fetcherSubmission?: Submission;\n      overrideNavigation?: Navigation;\n      pendingError?: ErrorResponseImpl;\n      startUninterruptedRevalidation?: boolean;\n      preventScrollReset?: boolean;\n      replace?: boolean;\n      enableViewTransition?: boolean;\n      flushSync?: boolean;\n    }\n  ): Promise<void> {\n    // Abort any in-progress navigations and start a new one. Unset any ongoing\n    // uninterrupted revalidations unless told otherwise, since we want this\n    // new navigation to update history normally\n    pendingNavigationController && pendingNavigationController.abort();\n    pendingNavigationController = null;\n    pendingAction = historyAction;\n    isUninterruptedRevalidation =\n      (opts && opts.startUninterruptedRevalidation) === true;\n\n    // Save the current scroll position every time we start a new navigation,\n    // and track whether we should reset scroll on completion\n    saveScrollPosition(state.location, state.matches);\n    pendingPreventScrollReset = (opts && opts.preventScrollReset) === true;\n\n    pendingViewTransitionEnabled = (opts && opts.enableViewTransition) === true;\n\n    let routesToUse = inFlightDataRoutes || dataRoutes;\n    let loadingNavigation = opts && opts.overrideNavigation;\n    let matches = matchRoutes(routesToUse, location, basename);\n    let flushSync = (opts && opts.flushSync) === true;\n\n    // Short circuit with a 404 on the root error boundary if we match nothing\n    if (!matches) {\n      let error = getInternalRouterError(404, { pathname: location.pathname });\n      let { matches: notFoundMatches, route } =\n        getShortCircuitMatches(routesToUse);\n      // Cancel all pending deferred on 404s since we don't keep any routes\n      cancelActiveDeferreds();\n      completeNavigation(\n        location,\n        {\n          matches: notFoundMatches,\n          loaderData: {},\n          errors: {\n            [route.id]: error,\n          },\n        },\n        { flushSync }\n      );\n      return;\n    }\n\n    // Short circuit if it's only a hash change and not a revalidation or\n    // mutation submission.\n    //\n    // Ignore on initial page loads because since the initial load will always\n    // be \"same hash\".  For example, on /page#hash and submit a <Form method=\"post\">\n    // which will default to a navigation to /page\n    if (\n      state.initialized &&\n      !isRevalidationRequired &&\n      isHashChangeOnly(state.location, location) &&\n      !(opts && opts.submission && isMutationMethod(opts.submission.formMethod))\n    ) {\n      completeNavigation(location, { matches }, { flushSync });\n      return;\n    }\n\n    // Create a controller/Request for this navigation\n    pendingNavigationController = new AbortController();\n    let request = createClientSideRequest(\n      init.history,\n      location,\n      pendingNavigationController.signal,\n      opts && opts.submission\n    );\n    let pendingActionResult: PendingActionResult | undefined;\n\n    if (opts && opts.pendingError) {\n      // If we have a pendingError, it means the user attempted a GET submission\n      // with binary FormData so assign here and skip to handleLoaders.  That\n      // way we handle calling loaders above the boundary etc.  It's not really\n      // different from an actionError in that sense.\n      pendingActionResult = [\n        findNearestBoundary(matches).route.id,\n        { type: ResultType.error, error: opts.pendingError },\n      ];\n    } else if (\n      opts &&\n      opts.submission &&\n      isMutationMethod(opts.submission.formMethod)\n    ) {\n      // Call action if we received an action submission\n      let actionResult = await handleAction(\n        request,\n        location,\n        opts.submission,\n        matches,\n        { replace: opts.replace, flushSync }\n      );\n\n      if (actionResult.shortCircuited) {\n        return;\n      }\n\n      pendingActionResult = actionResult.pendingActionResult;\n      loadingNavigation = getLoadingNavigation(location, opts.submission);\n      flushSync = false;\n\n      // Create a GET request for the loaders\n      request = createClientSideRequest(\n        init.history,\n        request.url,\n        request.signal\n      );\n    }\n\n    // Call loaders\n    let { shortCircuited, loaderData, errors } = await handleLoaders(\n      request,\n      location,\n      matches,\n      loadingNavigation,\n      opts && opts.submission,\n      opts && opts.fetcherSubmission,\n      opts && opts.replace,\n      opts && opts.initialHydration === true,\n      flushSync,\n      pendingActionResult\n    );\n\n    if (shortCircuited) {\n      return;\n    }\n\n    // Clean up now that the action/loaders have completed.  Don't clean up if\n    // we short circuited because pendingNavigationController will have already\n    // been assigned to a new controller for the next navigation\n    pendingNavigationController = null;\n\n    completeNavigation(location, {\n      matches,\n      ...getActionDataForCommit(pendingActionResult),\n      loaderData,\n      errors,\n    });\n  }\n\n  // Call the action matched by the leaf route for this navigation and handle\n  // redirects/errors\n  async function handleAction(\n    request: Request,\n    location: Location,\n    submission: Submission,\n    matches: AgnosticDataRouteMatch[],\n    opts: { replace?: boolean; flushSync?: boolean } = {}\n  ): Promise<HandleActionResult> {\n    interruptActiveLoads();\n\n    // Put us in a submitting state\n    let navigation = getSubmittingNavigation(location, submission);\n    updateState({ navigation }, { flushSync: opts.flushSync === true });\n\n    // Call our action and get the result\n    let result: DataResult;\n    let actionMatch = getTargetMatch(matches, location);\n\n    if (!actionMatch.route.action && !actionMatch.route.lazy) {\n      result = {\n        type: ResultType.error,\n        error: getInternalRouterError(405, {\n          method: request.method,\n          pathname: location.pathname,\n          routeId: actionMatch.route.id,\n        }),\n      };\n    } else {\n      let results = await callDataStrategy(\n        \"action\",\n        request,\n        [actionMatch],\n        matches\n      );\n      result = results[0];\n\n      if (request.signal.aborted) {\n        return { shortCircuited: true };\n      }\n    }\n\n    if (isRedirectResult(result)) {\n      let replace: boolean;\n      if (opts && opts.replace != null) {\n        replace = opts.replace;\n      } else {\n        // If the user didn't explicity indicate replace behavior, replace if\n        // we redirected to the exact same location we're currently at to avoid\n        // double back-buttons\n        let location = normalizeRedirectLocation(\n          result.response.headers.get(\"Location\")!,\n          new URL(request.url),\n          basename\n        );\n        replace = location === state.location.pathname + state.location.search;\n      }\n      await startRedirectNavigation(request, result, {\n        submission,\n        replace,\n      });\n      return { shortCircuited: true };\n    }\n\n    if (isDeferredResult(result)) {\n      throw getInternalRouterError(400, { type: \"defer-action\" });\n    }\n\n    if (isErrorResult(result)) {\n      // Store off the pending error - we use it to determine which loaders\n      // to call and will commit it when we complete the navigation\n      let boundaryMatch = findNearestBoundary(matches, actionMatch.route.id);\n\n      // By default, all submissions are REPLACE navigations, but if the\n      // action threw an error that'll be rendered in an errorElement, we fall\n      // back to PUSH so that the user can use the back button to get back to\n      // the pre-submission form location to try again\n      if ((opts && opts.replace) !== true) {\n        pendingAction = HistoryAction.Push;\n      }\n\n      return {\n        pendingActionResult: [boundaryMatch.route.id, result],\n      };\n    }\n\n    return {\n      pendingActionResult: [actionMatch.route.id, result],\n    };\n  }\n\n  // Call all applicable loaders for the given matches, handling redirects,\n  // errors, etc.\n  async function handleLoaders(\n    request: Request,\n    location: Location,\n    matches: AgnosticDataRouteMatch[],\n    overrideNavigation?: Navigation,\n    submission?: Submission,\n    fetcherSubmission?: Submission,\n    replace?: boolean,\n    initialHydration?: boolean,\n    flushSync?: boolean,\n    pendingActionResult?: PendingActionResult\n  ): Promise<HandleLoadersResult> {\n    // Figure out the right navigation we want to use for data loading\n    let loadingNavigation =\n      overrideNavigation || getLoadingNavigation(location, submission);\n\n    // If this was a redirect from an action we don't have a \"submission\" but\n    // we have it on the loading navigation so use that if available\n    let activeSubmission =\n      submission ||\n      fetcherSubmission ||\n      getSubmissionFromNavigation(loadingNavigation);\n\n    let routesToUse = inFlightDataRoutes || dataRoutes;\n    let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(\n      init.history,\n      state,\n      matches,\n      activeSubmission,\n      location,\n      future.v7_partialHydration && initialHydration === true,\n      future.unstable_skipActionErrorRevalidation,\n      isRevalidationRequired,\n      cancelledDeferredRoutes,\n      cancelledFetcherLoads,\n      deletedFetchers,\n      fetchLoadMatches,\n      fetchRedirectIds,\n      routesToUse,\n      basename,\n      pendingActionResult\n    );\n\n    // Cancel pending deferreds for no-longer-matched routes or routes we're\n    // about to reload.  Note that if this is an action reload we would have\n    // already cancelled all pending deferreds so this would be a no-op\n    cancelActiveDeferreds(\n      (routeId) =>\n        !(matches && matches.some((m) => m.route.id === routeId)) ||\n        (matchesToLoad && matchesToLoad.some((m) => m.route.id === routeId))\n    );\n\n    pendingNavigationLoadId = ++incrementingLoadId;\n\n    // Short circuit if we have no loaders to run\n    if (matchesToLoad.length === 0 && revalidatingFetchers.length === 0) {\n      let updatedFetchers = markFetchRedirectsDone();\n      completeNavigation(\n        location,\n        {\n          matches,\n          loaderData: {},\n          // Commit pending error if we're short circuiting\n          errors:\n            pendingActionResult && isErrorResult(pendingActionResult[1])\n              ? { [pendingActionResult[0]]: pendingActionResult[1].error }\n              : null,\n          ...getActionDataForCommit(pendingActionResult),\n          ...(updatedFetchers ? { fetchers: new Map(state.fetchers) } : {}),\n        },\n        { flushSync }\n      );\n      return { shortCircuited: true };\n    }\n\n    // If this is an uninterrupted revalidation, we remain in our current idle\n    // state.  If not, we need to switch to our loading state and load data,\n    // preserving any new action data or existing action data (in the case of\n    // a revalidation interrupting an actionReload)\n    // If we have partialHydration enabled, then don't update the state for the\n    // initial data load since it's not a \"navigation\"\n    if (\n      !isUninterruptedRevalidation &&\n      (!future.v7_partialHydration || !initialHydration)\n    ) {\n      revalidatingFetchers.forEach((rf) => {\n        let fetcher = state.fetchers.get(rf.key);\n        let revalidatingFetcher = getLoadingFetcher(\n          undefined,\n          fetcher ? fetcher.data : undefined\n        );\n        state.fetchers.set(rf.key, revalidatingFetcher);\n      });\n\n      let actionData: Record<string, RouteData> | null | undefined;\n      if (pendingActionResult && !isErrorResult(pendingActionResult[1])) {\n        // This is cast to `any` currently because `RouteData`uses any and it\n        // would be a breaking change to use any.\n        // TODO: v7 - change `RouteData` to use `unknown` instead of `any`\n        actionData = {\n          [pendingActionResult[0]]: pendingActionResult[1].data as any,\n        };\n      } else if (state.actionData) {\n        if (Object.keys(state.actionData).length === 0) {\n          actionData = null;\n        } else {\n          actionData = state.actionData;\n        }\n      }\n\n      updateState(\n        {\n          navigation: loadingNavigation,\n          ...(actionData !== undefined ? { actionData } : {}),\n          ...(revalidatingFetchers.length > 0\n            ? { fetchers: new Map(state.fetchers) }\n            : {}),\n        },\n        {\n          flushSync,\n        }\n      );\n    }\n\n    revalidatingFetchers.forEach((rf) => {\n      if (fetchControllers.has(rf.key)) {\n        abortFetcher(rf.key);\n      }\n      if (rf.controller) {\n        // Fetchers use an independent AbortController so that aborting a fetcher\n        // (via deleteFetcher) does not abort the triggering navigation that\n        // triggered the revalidation\n        fetchControllers.set(rf.key, rf.controller);\n      }\n    });\n\n    // Proxy navigation abort through to revalidation fetchers\n    let abortPendingFetchRevalidations = () =>\n      revalidatingFetchers.forEach((f) => abortFetcher(f.key));\n    if (pendingNavigationController) {\n      pendingNavigationController.signal.addEventListener(\n        \"abort\",\n        abortPendingFetchRevalidations\n      );\n    }\n\n    let { loaderResults, fetcherResults } =\n      await callLoadersAndMaybeResolveData(\n        state.matches,\n        matches,\n        matchesToLoad,\n        revalidatingFetchers,\n        request\n      );\n\n    if (request.signal.aborted) {\n      return { shortCircuited: true };\n    }\n\n    // Clean up _after_ loaders have completed.  Don't clean up if we short\n    // circuited because fetchControllers would have been aborted and\n    // reassigned to new controllers for the next navigation\n    if (pendingNavigationController) {\n      pendingNavigationController.signal.removeEventListener(\n        \"abort\",\n        abortPendingFetchRevalidations\n      );\n    }\n    revalidatingFetchers.forEach((rf) => fetchControllers.delete(rf.key));\n\n    // If any loaders returned a redirect Response, start a new REPLACE navigation\n    let redirect = findRedirect([...loaderResults, ...fetcherResults]);\n    if (redirect) {\n      if (redirect.idx >= matchesToLoad.length) {\n        // If this redirect came from a fetcher make sure we mark it in\n        // fetchRedirectIds so it doesn't get revalidated on the next set of\n        // loader executions\n        let fetcherKey =\n          revalidatingFetchers[redirect.idx - matchesToLoad.length].key;\n        fetchRedirectIds.add(fetcherKey);\n      }\n      await startRedirectNavigation(request, redirect.result, {\n        replace,\n      });\n      return { shortCircuited: true };\n    }\n\n    // Process and commit output from loaders\n    let { loaderData, errors } = processLoaderData(\n      state,\n      matches,\n      matchesToLoad,\n      loaderResults,\n      pendingActionResult,\n      revalidatingFetchers,\n      fetcherResults,\n      activeDeferreds\n    );\n\n    // Wire up subscribers to update loaderData as promises settle\n    activeDeferreds.forEach((deferredData, routeId) => {\n      deferredData.subscribe((aborted) => {\n        // Note: No need to updateState here since the TrackedPromise on\n        // loaderData is stable across resolve/reject\n        // Remove this instance if we were aborted or if promises have settled\n        if (aborted || deferredData.done) {\n          activeDeferreds.delete(routeId);\n        }\n      });\n    });\n\n    // During partial hydration, preserve SSR errors for routes that don't re-run\n    if (future.v7_partialHydration && initialHydration && state.errors) {\n      Object.entries(state.errors)\n        .filter(([id]) => !matchesToLoad.some((m) => m.route.id === id))\n        .forEach(([routeId, error]) => {\n          errors = Object.assign(errors || {}, { [routeId]: error });\n        });\n    }\n\n    let updatedFetchers = markFetchRedirectsDone();\n    let didAbortFetchLoads = abortStaleFetchLoads(pendingNavigationLoadId);\n    let shouldUpdateFetchers =\n      updatedFetchers || didAbortFetchLoads || revalidatingFetchers.length > 0;\n\n    return {\n      loaderData,\n      errors,\n      ...(shouldUpdateFetchers ? { fetchers: new Map(state.fetchers) } : {}),\n    };\n  }\n\n  // Trigger a fetcher load/submit for the given fetcher key\n  function fetch(\n    key: string,\n    routeId: string,\n    href: string | null,\n    opts?: RouterFetchOptions\n  ) {\n    if (isServer) {\n      throw new Error(\n        \"router.fetch() was called during the server render, but it shouldn't be. \" +\n          \"You are likely calling a useFetcher() method in the body of your component. \" +\n          \"Try moving it to a useEffect or a callback.\"\n      );\n    }\n\n    if (fetchControllers.has(key)) abortFetcher(key);\n    let flushSync = (opts && opts.unstable_flushSync) === true;\n\n    let routesToUse = inFlightDataRoutes || dataRoutes;\n    let normalizedPath = normalizeTo(\n      state.location,\n      state.matches,\n      basename,\n      future.v7_prependBasename,\n      href,\n      future.v7_relativeSplatPath,\n      routeId,\n      opts?.relative\n    );\n    let matches = matchRoutes(routesToUse, normalizedPath, basename);\n\n    if (!matches) {\n      setFetcherError(\n        key,\n        routeId,\n        getInternalRouterError(404, { pathname: normalizedPath }),\n        { flushSync }\n      );\n      return;\n    }\n\n    let { path, submission, error } = normalizeNavigateOptions(\n      future.v7_normalizeFormMethod,\n      true,\n      normalizedPath,\n      opts\n    );\n\n    if (error) {\n      setFetcherError(key, routeId, error, { flushSync });\n      return;\n    }\n\n    let match = getTargetMatch(matches, path);\n\n    pendingPreventScrollReset = (opts && opts.preventScrollReset) === true;\n\n    if (submission && isMutationMethod(submission.formMethod)) {\n      handleFetcherAction(\n        key,\n        routeId,\n        path,\n        match,\n        matches,\n        flushSync,\n        submission\n      );\n      return;\n    }\n\n    // Store off the match so we can call it's shouldRevalidate on subsequent\n    // revalidations\n    fetchLoadMatches.set(key, { routeId, path });\n    handleFetcherLoader(\n      key,\n      routeId,\n      path,\n      match,\n      matches,\n      flushSync,\n      submission\n    );\n  }\n\n  // Call the action for the matched fetcher.submit(), and then handle redirects,\n  // errors, and revalidation\n  async function handleFetcherAction(\n    key: string,\n    routeId: string,\n    path: string,\n    match: AgnosticDataRouteMatch,\n    requestMatches: AgnosticDataRouteMatch[],\n    flushSync: boolean,\n    submission: Submission\n  ) {\n    interruptActiveLoads();\n    fetchLoadMatches.delete(key);\n\n    if (!match.route.action && !match.route.lazy) {\n      let error = getInternalRouterError(405, {\n        method: submission.formMethod,\n        pathname: path,\n        routeId: routeId,\n      });\n      setFetcherError(key, routeId, error, { flushSync });\n      return;\n    }\n\n    // Put this fetcher into it's submitting state\n    let existingFetcher = state.fetchers.get(key);\n    updateFetcherState(key, getSubmittingFetcher(submission, existingFetcher), {\n      flushSync,\n    });\n\n    // Call the action for the fetcher\n    let abortController = new AbortController();\n    let fetchRequest = createClientSideRequest(\n      init.history,\n      path,\n      abortController.signal,\n      submission\n    );\n    fetchControllers.set(key, abortController);\n\n    let originatingLoadId = incrementingLoadId;\n    let actionResults = await callDataStrategy(\n      \"action\",\n      fetchRequest,\n      [match],\n      requestMatches\n    );\n    let actionResult = actionResults[0];\n\n    if (fetchRequest.signal.aborted) {\n      // We can delete this so long as we weren't aborted by our own fetcher\n      // re-submit which would have put _new_ controller is in fetchControllers\n      if (fetchControllers.get(key) === abortController) {\n        fetchControllers.delete(key);\n      }\n      return;\n    }\n\n    // When using v7_fetcherPersist, we don't want errors bubbling up to the UI\n    // or redirects processed for unmounted fetchers so we just revert them to\n    // idle\n    if (future.v7_fetcherPersist && deletedFetchers.has(key)) {\n      if (isRedirectResult(actionResult) || isErrorResult(actionResult)) {\n        updateFetcherState(key, getDoneFetcher(undefined));\n        return;\n      }\n      // Let SuccessResult's fall through for revalidation\n    } else {\n      if (isRedirectResult(actionResult)) {\n        fetchControllers.delete(key);\n        if (pendingNavigationLoadId > originatingLoadId) {\n          // A new navigation was kicked off after our action started, so that\n          // should take precedence over this redirect navigation.  We already\n          // set isRevalidationRequired so all loaders for the new route should\n          // fire unless opted out via shouldRevalidate\n          updateFetcherState(key, getDoneFetcher(undefined));\n          return;\n        } else {\n          fetchRedirectIds.add(key);\n          updateFetcherState(key, getLoadingFetcher(submission));\n          return startRedirectNavigation(fetchRequest, actionResult, {\n            fetcherSubmission: submission,\n          });\n        }\n      }\n\n      // Process any non-redirect errors thrown\n      if (isErrorResult(actionResult)) {\n        setFetcherError(key, routeId, actionResult.error);\n        return;\n      }\n    }\n\n    if (isDeferredResult(actionResult)) {\n      throw getInternalRouterError(400, { type: \"defer-action\" });\n    }\n\n    // Start the data load for current matches, or the next location if we're\n    // in the middle of a navigation\n    let nextLocation = state.navigation.location || state.location;\n    let revalidationRequest = createClientSideRequest(\n      init.history,\n      nextLocation,\n      abortController.signal\n    );\n    let routesToUse = inFlightDataRoutes || dataRoutes;\n    let matches =\n      state.navigation.state !== \"idle\"\n        ? matchRoutes(routesToUse, state.navigation.location, basename)\n        : state.matches;\n\n    invariant(matches, \"Didn't find any matches after fetcher action\");\n\n    let loadId = ++incrementingLoadId;\n    fetchReloadIds.set(key, loadId);\n\n    let loadFetcher = getLoadingFetcher(submission, actionResult.data);\n    state.fetchers.set(key, loadFetcher);\n\n    let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(\n      init.history,\n      state,\n      matches,\n      submission,\n      nextLocation,\n      false,\n      future.unstable_skipActionErrorRevalidation,\n      isRevalidationRequired,\n      cancelledDeferredRoutes,\n      cancelledFetcherLoads,\n      deletedFetchers,\n      fetchLoadMatches,\n      fetchRedirectIds,\n      routesToUse,\n      basename,\n      [match.route.id, actionResult]\n    );\n\n    // Put all revalidating fetchers into the loading state, except for the\n    // current fetcher which we want to keep in it's current loading state which\n    // contains it's action submission info + action data\n    revalidatingFetchers\n      .filter((rf) => rf.key !== key)\n      .forEach((rf) => {\n        let staleKey = rf.key;\n        let existingFetcher = state.fetchers.get(staleKey);\n        let revalidatingFetcher = getLoadingFetcher(\n          undefined,\n          existingFetcher ? existingFetcher.data : undefined\n        );\n        state.fetchers.set(staleKey, revalidatingFetcher);\n        if (fetchControllers.has(staleKey)) {\n          abortFetcher(staleKey);\n        }\n        if (rf.controller) {\n          fetchControllers.set(staleKey, rf.controller);\n        }\n      });\n\n    updateState({ fetchers: new Map(state.fetchers) });\n\n    let abortPendingFetchRevalidations = () =>\n      revalidatingFetchers.forEach((rf) => abortFetcher(rf.key));\n\n    abortController.signal.addEventListener(\n      \"abort\",\n      abortPendingFetchRevalidations\n    );\n\n    let { loaderResults, fetcherResults } =\n      await callLoadersAndMaybeResolveData(\n        state.matches,\n        matches,\n        matchesToLoad,\n        revalidatingFetchers,\n        revalidationRequest\n      );\n\n    if (abortController.signal.aborted) {\n      return;\n    }\n\n    abortController.signal.removeEventListener(\n      \"abort\",\n      abortPendingFetchRevalidations\n    );\n\n    fetchReloadIds.delete(key);\n    fetchControllers.delete(key);\n    revalidatingFetchers.forEach((r) => fetchControllers.delete(r.key));\n\n    let redirect = findRedirect([...loaderResults, ...fetcherResults]);\n    if (redirect) {\n      if (redirect.idx >= matchesToLoad.length) {\n        // If this redirect came from a fetcher make sure we mark it in\n        // fetchRedirectIds so it doesn't get revalidated on the next set of\n        // loader executions\n        let fetcherKey =\n          revalidatingFetchers[redirect.idx - matchesToLoad.length].key;\n        fetchRedirectIds.add(fetcherKey);\n      }\n      return startRedirectNavigation(revalidationRequest, redirect.result);\n    }\n\n    // Process and commit output from loaders\n    let { loaderData, errors } = processLoaderData(\n      state,\n      state.matches,\n      matchesToLoad,\n      loaderResults,\n      undefined,\n      revalidatingFetchers,\n      fetcherResults,\n      activeDeferreds\n    );\n\n    // Since we let revalidations complete even if the submitting fetcher was\n    // deleted, only put it back to idle if it hasn't been deleted\n    if (state.fetchers.has(key)) {\n      let doneFetcher = getDoneFetcher(actionResult.data);\n      state.fetchers.set(key, doneFetcher);\n    }\n\n    abortStaleFetchLoads(loadId);\n\n    // If we are currently in a navigation loading state and this fetcher is\n    // more recent than the navigation, we want the newer data so abort the\n    // navigation and complete it with the fetcher data\n    if (\n      state.navigation.state === \"loading\" &&\n      loadId > pendingNavigationLoadId\n    ) {\n      invariant(pendingAction, \"Expected pending action\");\n      pendingNavigationController && pendingNavigationController.abort();\n\n      completeNavigation(state.navigation.location, {\n        matches,\n        loaderData,\n        errors,\n        fetchers: new Map(state.fetchers),\n      });\n    } else {\n      // otherwise just update with the fetcher data, preserving any existing\n      // loaderData for loaders that did not need to reload.  We have to\n      // manually merge here since we aren't going through completeNavigation\n      updateState({\n        errors,\n        loaderData: mergeLoaderData(\n          state.loaderData,\n          loaderData,\n          matches,\n          errors\n        ),\n        fetchers: new Map(state.fetchers),\n      });\n      isRevalidationRequired = false;\n    }\n  }\n\n  // Call the matched loader for fetcher.load(), handling redirects, errors, etc.\n  async function handleFetcherLoader(\n    key: string,\n    routeId: string,\n    path: string,\n    match: AgnosticDataRouteMatch,\n    matches: AgnosticDataRouteMatch[],\n    flushSync: boolean,\n    submission?: Submission\n  ) {\n    let existingFetcher = state.fetchers.get(key);\n    updateFetcherState(\n      key,\n      getLoadingFetcher(\n        submission,\n        existingFetcher ? existingFetcher.data : undefined\n      ),\n      { flushSync }\n    );\n\n    // Call the loader for this fetcher route match\n    let abortController = new AbortController();\n    let fetchRequest = createClientSideRequest(\n      init.history,\n      path,\n      abortController.signal\n    );\n    fetchControllers.set(key, abortController);\n\n    let originatingLoadId = incrementingLoadId;\n    let results = await callDataStrategy(\n      \"loader\",\n      fetchRequest,\n      [match],\n      matches\n    );\n    let result = results[0];\n\n    // Deferred isn't supported for fetcher loads, await everything and treat it\n    // as a normal load.  resolveDeferredData will return undefined if this\n    // fetcher gets aborted, so we just leave result untouched and short circuit\n    // below if that happens\n    if (isDeferredResult(result)) {\n      result =\n        (await resolveDeferredData(result, fetchRequest.signal, true)) ||\n        result;\n    }\n\n    // We can delete this so long as we weren't aborted by our our own fetcher\n    // re-load which would have put _new_ controller is in fetchControllers\n    if (fetchControllers.get(key) === abortController) {\n      fetchControllers.delete(key);\n    }\n\n    if (fetchRequest.signal.aborted) {\n      return;\n    }\n\n    // We don't want errors bubbling up or redirects followed for unmounted\n    // fetchers, so short circuit here if it was removed from the UI\n    if (deletedFetchers.has(key)) {\n      updateFetcherState(key, getDoneFetcher(undefined));\n      return;\n    }\n\n    // If the loader threw a redirect Response, start a new REPLACE navigation\n    if (isRedirectResult(result)) {\n      if (pendingNavigationLoadId > originatingLoadId) {\n        // A new navigation was kicked off after our loader started, so that\n        // should take precedence over this redirect navigation\n        updateFetcherState(key, getDoneFetcher(undefined));\n        return;\n      } else {\n        fetchRedirectIds.add(key);\n        await startRedirectNavigation(fetchRequest, result);\n        return;\n      }\n    }\n\n    // Process any non-redirect errors thrown\n    if (isErrorResult(result)) {\n      setFetcherError(key, routeId, result.error);\n      return;\n    }\n\n    invariant(!isDeferredResult(result), \"Unhandled fetcher deferred data\");\n\n    // Put the fetcher back into an idle state\n    updateFetcherState(key, getDoneFetcher(result.data));\n  }\n\n  /**\n   * Utility function to handle redirects returned from an action or loader.\n   * Normally, a redirect \"replaces\" the navigation that triggered it.  So, for\n   * example:\n   *\n   *  - user is on /a\n   *  - user clicks a link to /b\n   *  - loader for /b redirects to /c\n   *\n   * In a non-JS app the browser would track the in-flight navigation to /b and\n   * then replace it with /c when it encountered the redirect response.  In\n   * the end it would only ever update the URL bar with /c.\n   *\n   * In client-side routing using pushState/replaceState, we aim to emulate\n   * this behavior and we also do not update history until the end of the\n   * navigation (including processed redirects).  This means that we never\n   * actually touch history until we've processed redirects, so we just use\n   * the history action from the original navigation (PUSH or REPLACE).\n   */\n  async function startRedirectNavigation(\n    request: Request,\n    redirect: RedirectResult,\n    {\n      submission,\n      fetcherSubmission,\n      replace,\n    }: {\n      submission?: Submission;\n      fetcherSubmission?: Submission;\n      replace?: boolean;\n    } = {}\n  ) {\n    if (redirect.response.headers.has(\"X-Remix-Revalidate\")) {\n      isRevalidationRequired = true;\n    }\n\n    let location = redirect.response.headers.get(\"Location\");\n    invariant(location, \"Expected a Location header on the redirect Response\");\n    location = normalizeRedirectLocation(\n      location,\n      new URL(request.url),\n      basename\n    );\n    let redirectLocation = createLocation(state.location, location, {\n      _isRedirect: true,\n    });\n\n    if (isBrowser) {\n      let isDocumentReload = false;\n\n      if (redirect.response.headers.has(\"X-Remix-Reload-Document\")) {\n        // Hard reload if the response contained X-Remix-Reload-Document\n        isDocumentReload = true;\n      } else if (ABSOLUTE_URL_REGEX.test(location)) {\n        const url = init.history.createURL(location);\n        isDocumentReload =\n          // Hard reload if it's an absolute URL to a new origin\n          url.origin !== routerWindow.location.origin ||\n          // Hard reload if it's an absolute URL that does not match our basename\n          stripBasename(url.pathname, basename) == null;\n      }\n\n      if (isDocumentReload) {\n        if (replace) {\n          routerWindow.location.replace(location);\n        } else {\n          routerWindow.location.assign(location);\n        }\n        return;\n      }\n    }\n\n    // There's no need to abort on redirects, since we don't detect the\n    // redirect until the action/loaders have settled\n    pendingNavigationController = null;\n\n    let redirectHistoryAction =\n      replace === true ? HistoryAction.Replace : HistoryAction.Push;\n\n    // Use the incoming submission if provided, fallback on the active one in\n    // state.navigation\n    let { formMethod, formAction, formEncType } = state.navigation;\n    if (\n      !submission &&\n      !fetcherSubmission &&\n      formMethod &&\n      formAction &&\n      formEncType\n    ) {\n      submission = getSubmissionFromNavigation(state.navigation);\n    }\n\n    // If this was a 307/308 submission we want to preserve the HTTP method and\n    // re-submit the GET/POST/PUT/PATCH/DELETE as a submission navigation to the\n    // redirected location\n    let activeSubmission = submission || fetcherSubmission;\n    if (\n      redirectPreserveMethodStatusCodes.has(redirect.response.status) &&\n      activeSubmission &&\n      isMutationMethod(activeSubmission.formMethod)\n    ) {\n      await startNavigation(redirectHistoryAction, redirectLocation, {\n        submission: {\n          ...activeSubmission,\n          formAction: location,\n        },\n        // Preserve this flag across redirects\n        preventScrollReset: pendingPreventScrollReset,\n      });\n    } else {\n      // If we have a navigation submission, we will preserve it through the\n      // redirect navigation\n      let overrideNavigation = getLoadingNavigation(\n        redirectLocation,\n        submission\n      );\n      await startNavigation(redirectHistoryAction, redirectLocation, {\n        overrideNavigation,\n        // Send fetcher submissions through for shouldRevalidate\n        fetcherSubmission,\n        // Preserve this flag across redirects\n        preventScrollReset: pendingPreventScrollReset,\n      });\n    }\n  }\n\n  // Utility wrapper for calling dataStrategy client-side without having to\n  // pass around the manifest, mapRouteProperties, etc.\n  async function callDataStrategy(\n    type: \"loader\" | \"action\",\n    request: Request,\n    matchesToLoad: AgnosticDataRouteMatch[],\n    matches: AgnosticDataRouteMatch[]\n  ): Promise<DataResult[]> {\n    try {\n      let results = await callDataStrategyImpl(\n        dataStrategyImpl,\n        type,\n        request,\n        matchesToLoad,\n        matches,\n        manifest,\n        mapRouteProperties\n      );\n\n      return await Promise.all(\n        results.map((result, i) => {\n          if (isRedirectHandlerResult(result)) {\n            let response = result.result as Response;\n            return {\n              type: ResultType.redirect,\n              response: normalizeRelativeRoutingRedirectResponse(\n                response,\n                request,\n                matchesToLoad[i].route.id,\n                matches,\n                basename,\n                future.v7_relativeSplatPath\n              ),\n            };\n          }\n\n          return convertHandlerResultToDataResult(result);\n        })\n      );\n    } catch (e) {\n      // If the outer dataStrategy method throws, just return the error for all\n      // matches - and it'll naturally bubble to the root\n      return matchesToLoad.map(() => ({\n        type: ResultType.error,\n        error: e,\n      }));\n    }\n  }\n\n  async function callLoadersAndMaybeResolveData(\n    currentMatches: AgnosticDataRouteMatch[],\n    matches: AgnosticDataRouteMatch[],\n    matchesToLoad: AgnosticDataRouteMatch[],\n    fetchersToLoad: RevalidatingFetcher[],\n    request: Request\n  ) {\n    let [loaderResults, ...fetcherResults] = await Promise.all([\n      matchesToLoad.length\n        ? callDataStrategy(\"loader\", request, matchesToLoad, matches)\n        : [],\n      ...fetchersToLoad.map((f) => {\n        if (f.matches && f.match && f.controller) {\n          let fetcherRequest = createClientSideRequest(\n            init.history,\n            f.path,\n            f.controller.signal\n          );\n          return callDataStrategy(\n            \"loader\",\n            fetcherRequest,\n            [f.match],\n            f.matches\n          ).then((r) => r[0]);\n        } else {\n          return Promise.resolve<DataResult>({\n            type: ResultType.error,\n            error: getInternalRouterError(404, {\n              pathname: f.path,\n            }),\n          });\n        }\n      }),\n    ]);\n\n    await Promise.all([\n      resolveDeferredResults(\n        currentMatches,\n        matchesToLoad,\n        loaderResults,\n        loaderResults.map(() => request.signal),\n        false,\n        state.loaderData\n      ),\n      resolveDeferredResults(\n        currentMatches,\n        fetchersToLoad.map((f) => f.match),\n        fetcherResults,\n        fetchersToLoad.map((f) => (f.controller ? f.controller.signal : null)),\n        true\n      ),\n    ]);\n\n    return {\n      loaderResults,\n      fetcherResults,\n    };\n  }\n\n  function interruptActiveLoads() {\n    // Every interruption triggers a revalidation\n    isRevalidationRequired = true;\n\n    // Cancel pending route-level deferreds and mark cancelled routes for\n    // revalidation\n    cancelledDeferredRoutes.push(...cancelActiveDeferreds());\n\n    // Abort in-flight fetcher loads\n    fetchLoadMatches.forEach((_, key) => {\n      if (fetchControllers.has(key)) {\n        cancelledFetcherLoads.push(key);\n        abortFetcher(key);\n      }\n    });\n  }\n\n  function updateFetcherState(\n    key: string,\n    fetcher: Fetcher,\n    opts: { flushSync?: boolean } = {}\n  ) {\n    state.fetchers.set(key, fetcher);\n    updateState(\n      { fetchers: new Map(state.fetchers) },\n      { flushSync: (opts && opts.flushSync) === true }\n    );\n  }\n\n  function setFetcherError(\n    key: string,\n    routeId: string,\n    error: any,\n    opts: { flushSync?: boolean } = {}\n  ) {\n    let boundaryMatch = findNearestBoundary(state.matches, routeId);\n    deleteFetcher(key);\n    updateState(\n      {\n        errors: {\n          [boundaryMatch.route.id]: error,\n        },\n        fetchers: new Map(state.fetchers),\n      },\n      { flushSync: (opts && opts.flushSync) === true }\n    );\n  }\n\n  function getFetcher<TData = any>(key: string): Fetcher<TData> {\n    if (future.v7_fetcherPersist) {\n      activeFetchers.set(key, (activeFetchers.get(key) || 0) + 1);\n      // If this fetcher was previously marked for deletion, unmark it since we\n      // have a new instance\n      if (deletedFetchers.has(key)) {\n        deletedFetchers.delete(key);\n      }\n    }\n    return state.fetchers.get(key) || IDLE_FETCHER;\n  }\n\n  function deleteFetcher(key: string): void {\n    let fetcher = state.fetchers.get(key);\n    // Don't abort the controller if this is a deletion of a fetcher.submit()\n    // in it's loading phase since - we don't want to abort the corresponding\n    // revalidation and want them to complete and land\n    if (\n      fetchControllers.has(key) &&\n      !(fetcher && fetcher.state === \"loading\" && fetchReloadIds.has(key))\n    ) {\n      abortFetcher(key);\n    }\n    fetchLoadMatches.delete(key);\n    fetchReloadIds.delete(key);\n    fetchRedirectIds.delete(key);\n    deletedFetchers.delete(key);\n    state.fetchers.delete(key);\n  }\n\n  function deleteFetcherAndUpdateState(key: string): void {\n    if (future.v7_fetcherPersist) {\n      let count = (activeFetchers.get(key) || 0) - 1;\n      if (count <= 0) {\n        activeFetchers.delete(key);\n        deletedFetchers.add(key);\n      } else {\n        activeFetchers.set(key, count);\n      }\n    } else {\n      deleteFetcher(key);\n    }\n    updateState({ fetchers: new Map(state.fetchers) });\n  }\n\n  function abortFetcher(key: string) {\n    let controller = fetchControllers.get(key);\n    invariant(controller, `Expected fetch controller: ${key}`);\n    controller.abort();\n    fetchControllers.delete(key);\n  }\n\n  function markFetchersDone(keys: string[]) {\n    for (let key of keys) {\n      let fetcher = getFetcher(key);\n      let doneFetcher = getDoneFetcher(fetcher.data);\n      state.fetchers.set(key, doneFetcher);\n    }\n  }\n\n  function markFetchRedirectsDone(): boolean {\n    let doneKeys = [];\n    let updatedFetchers = false;\n    for (let key of fetchRedirectIds) {\n      let fetcher = state.fetchers.get(key);\n      invariant(fetcher, `Expected fetcher: ${key}`);\n      if (fetcher.state === \"loading\") {\n        fetchRedirectIds.delete(key);\n        doneKeys.push(key);\n        updatedFetchers = true;\n      }\n    }\n    markFetchersDone(doneKeys);\n    return updatedFetchers;\n  }\n\n  function abortStaleFetchLoads(landedId: number): boolean {\n    let yeetedKeys = [];\n    for (let [key, id] of fetchReloadIds) {\n      if (id < landedId) {\n        let fetcher = state.fetchers.get(key);\n        invariant(fetcher, `Expected fetcher: ${key}`);\n        if (fetcher.state === \"loading\") {\n          abortFetcher(key);\n          fetchReloadIds.delete(key);\n          yeetedKeys.push(key);\n        }\n      }\n    }\n    markFetchersDone(yeetedKeys);\n    return yeetedKeys.length > 0;\n  }\n\n  function getBlocker(key: string, fn: BlockerFunction) {\n    let blocker: Blocker = state.blockers.get(key) || IDLE_BLOCKER;\n\n    if (blockerFunctions.get(key) !== fn) {\n      blockerFunctions.set(key, fn);\n    }\n\n    return blocker;\n  }\n\n  function deleteBlocker(key: string) {\n    state.blockers.delete(key);\n    blockerFunctions.delete(key);\n  }\n\n  // Utility function to update blockers, ensuring valid state transitions\n  function updateBlocker(key: string, newBlocker: Blocker) {\n    let blocker = state.blockers.get(key) || IDLE_BLOCKER;\n\n    // Poor mans state machine :)\n    // https://mermaid.live/edit#pako:eNqVkc9OwzAMxl8l8nnjAYrEtDIOHEBIgwvKJTReGy3_lDpIqO27k6awMG0XcrLlnz87nwdonESogKXXBuE79rq75XZO3-yHds0RJVuv70YrPlUrCEe2HfrORS3rubqZfuhtpg5C9wk5tZ4VKcRUq88q9Z8RS0-48cE1iHJkL0ugbHuFLus9L6spZy8nX9MP2CNdomVaposqu3fGayT8T8-jJQwhepo_UtpgBQaDEUom04dZhAN1aJBDlUKJBxE1ceB2Smj0Mln-IBW5AFU2dwUiktt_2Qaq2dBfaKdEup85UV7Yd-dKjlnkabl2Pvr0DTkTreM\n    invariant(\n      (blocker.state === \"unblocked\" && newBlocker.state === \"blocked\") ||\n        (blocker.state === \"blocked\" && newBlocker.state === \"blocked\") ||\n        (blocker.state === \"blocked\" && newBlocker.state === \"proceeding\") ||\n        (blocker.state === \"blocked\" && newBlocker.state === \"unblocked\") ||\n        (blocker.state === \"proceeding\" && newBlocker.state === \"unblocked\"),\n      `Invalid blocker state transition: ${blocker.state} -> ${newBlocker.state}`\n    );\n\n    let blockers = new Map(state.blockers);\n    blockers.set(key, newBlocker);\n    updateState({ blockers });\n  }\n\n  function shouldBlockNavigation({\n    currentLocation,\n    nextLocation,\n    historyAction,\n  }: {\n    currentLocation: Location;\n    nextLocation: Location;\n    historyAction: HistoryAction;\n  }): string | undefined {\n    if (blockerFunctions.size === 0) {\n      return;\n    }\n\n    // We ony support a single active blocker at the moment since we don't have\n    // any compelling use cases for multi-blocker yet\n    if (blockerFunctions.size > 1) {\n      warning(false, \"A router only supports one blocker at a time\");\n    }\n\n    let entries = Array.from(blockerFunctions.entries());\n    let [blockerKey, blockerFunction] = entries[entries.length - 1];\n    let blocker = state.blockers.get(blockerKey);\n\n    if (blocker && blocker.state === \"proceeding\") {\n      // If the blocker is currently proceeding, we don't need to re-check\n      // it and can let this navigation continue\n      return;\n    }\n\n    // At this point, we know we're unblocked/blocked so we need to check the\n    // user-provided blocker function\n    if (blockerFunction({ currentLocation, nextLocation, historyAction })) {\n      return blockerKey;\n    }\n  }\n\n  function cancelActiveDeferreds(\n    predicate?: (routeId: string) => boolean\n  ): string[] {\n    let cancelledRouteIds: string[] = [];\n    activeDeferreds.forEach((dfd, routeId) => {\n      if (!predicate || predicate(routeId)) {\n        // Cancel the deferred - but do not remove from activeDeferreds here -\n        // we rely on the subscribers to do that so our tests can assert proper\n        // cleanup via _internalActiveDeferreds\n        dfd.cancel();\n        cancelledRouteIds.push(routeId);\n        activeDeferreds.delete(routeId);\n      }\n    });\n    return cancelledRouteIds;\n  }\n\n  // Opt in to capturing and reporting scroll positions during navigations,\n  // used by the <ScrollRestoration> component\n  function enableScrollRestoration(\n    positions: Record<string, number>,\n    getPosition: GetScrollPositionFunction,\n    getKey?: GetScrollRestorationKeyFunction\n  ) {\n    savedScrollPositions = positions;\n    getScrollPosition = getPosition;\n    getScrollRestorationKey = getKey || null;\n\n    // Perform initial hydration scroll restoration, since we miss the boat on\n    // the initial updateState() because we've not yet rendered <ScrollRestoration/>\n    // and therefore have no savedScrollPositions available\n    if (!initialScrollRestored && state.navigation === IDLE_NAVIGATION) {\n      initialScrollRestored = true;\n      let y = getSavedScrollPosition(state.location, state.matches);\n      if (y != null) {\n        updateState({ restoreScrollPosition: y });\n      }\n    }\n\n    return () => {\n      savedScrollPositions = null;\n      getScrollPosition = null;\n      getScrollRestorationKey = null;\n    };\n  }\n\n  function getScrollKey(location: Location, matches: AgnosticDataRouteMatch[]) {\n    if (getScrollRestorationKey) {\n      let key = getScrollRestorationKey(\n        location,\n        matches.map((m) => convertRouteMatchToUiMatch(m, state.loaderData))\n      );\n      return key || location.key;\n    }\n    return location.key;\n  }\n\n  function saveScrollPosition(\n    location: Location,\n    matches: AgnosticDataRouteMatch[]\n  ): void {\n    if (savedScrollPositions && getScrollPosition) {\n      let key = getScrollKey(location, matches);\n      savedScrollPositions[key] = getScrollPosition();\n    }\n  }\n\n  function getSavedScrollPosition(\n    location: Location,\n    matches: AgnosticDataRouteMatch[]\n  ): number | null {\n    if (savedScrollPositions) {\n      let key = getScrollKey(location, matches);\n      let y = savedScrollPositions[key];\n      if (typeof y === \"number\") {\n        return y;\n      }\n    }\n    return null;\n  }\n\n  function _internalSetRoutes(newRoutes: AgnosticDataRouteObject[]) {\n    manifest = {};\n    inFlightDataRoutes = convertRoutesToDataRoutes(\n      newRoutes,\n      mapRouteProperties,\n      undefined,\n      manifest\n    );\n  }\n\n  router = {\n    get basename() {\n      return basename;\n    },\n    get future() {\n      return future;\n    },\n    get state() {\n      return state;\n    },\n    get routes() {\n      return dataRoutes;\n    },\n    get window() {\n      return routerWindow;\n    },\n    initialize,\n    subscribe,\n    enableScrollRestoration,\n    navigate,\n    fetch,\n    revalidate,\n    // Passthrough to history-aware createHref used by useHref so we get proper\n    // hash-aware URLs in DOM paths\n    createHref: (to: To) => init.history.createHref(to),\n    encodeLocation: (to: To) => init.history.encodeLocation(to),\n    getFetcher,\n    deleteFetcher: deleteFetcherAndUpdateState,\n    dispose,\n    getBlocker,\n    deleteBlocker,\n    _internalFetchControllers: fetchControllers,\n    _internalActiveDeferreds: activeDeferreds,\n    // TODO: Remove setRoutes, it's temporary to avoid dealing with\n    // updating the tree while validating the update algorithm.\n    _internalSetRoutes,\n  };\n\n  return router;\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region createStaticHandler\n////////////////////////////////////////////////////////////////////////////////\n\nexport const UNSAFE_DEFERRED_SYMBOL = Symbol(\"deferred\");\n\n/**\n * Future flags to toggle new feature behavior\n */\nexport interface StaticHandlerFutureConfig {\n  v7_relativeSplatPath: boolean;\n  v7_throwAbortReason: boolean;\n}\n\nexport interface CreateStaticHandlerOptions {\n  basename?: string;\n  /**\n   * @deprecated Use `mapRouteProperties` instead\n   */\n  detectErrorBoundary?: DetectErrorBoundaryFunction;\n  mapRouteProperties?: MapRoutePropertiesFunction;\n  future?: Partial<StaticHandlerFutureConfig>;\n}\n\nexport function createStaticHandler(\n  routes: AgnosticRouteObject[],\n  opts?: CreateStaticHandlerOptions\n): StaticHandler {\n  invariant(\n    routes.length > 0,\n    \"You must provide a non-empty routes array to createStaticHandler\"\n  );\n\n  let manifest: RouteManifest = {};\n  let basename = (opts ? opts.basename : null) || \"/\";\n  let mapRouteProperties: MapRoutePropertiesFunction;\n  if (opts?.mapRouteProperties) {\n    mapRouteProperties = opts.mapRouteProperties;\n  } else if (opts?.detectErrorBoundary) {\n    // If they are still using the deprecated version, wrap it with the new API\n    let detectErrorBoundary = opts.detectErrorBoundary;\n    mapRouteProperties = (route) => ({\n      hasErrorBoundary: detectErrorBoundary(route),\n    });\n  } else {\n    mapRouteProperties = defaultMapRouteProperties;\n  }\n  // Config driven behavior flags\n  let future: StaticHandlerFutureConfig = {\n    v7_relativeSplatPath: false,\n    v7_throwAbortReason: false,\n    ...(opts ? opts.future : null),\n  };\n\n  let dataRoutes = convertRoutesToDataRoutes(\n    routes,\n    mapRouteProperties,\n    undefined,\n    manifest\n  );\n\n  /**\n   * The query() method is intended for document requests, in which we want to\n   * call an optional action and potentially multiple loaders for all nested\n   * routes.  It returns a StaticHandlerContext object, which is very similar\n   * to the router state (location, loaderData, actionData, errors, etc.) and\n   * also adds SSR-specific information such as the statusCode and headers\n   * from action/loaders Responses.\n   *\n   * It _should_ never throw and should report all errors through the\n   * returned context.errors object, properly associating errors to their error\n   * boundary.  Additionally, it tracks _deepestRenderedBoundaryId which can be\n   * used to emulate React error boundaries during SSr by performing a second\n   * pass only down to the boundaryId.\n   *\n   * The one exception where we do not return a StaticHandlerContext is when a\n   * redirect response is returned or thrown from any action/loader.  We\n   * propagate that out and return the raw Response so the HTTP server can\n   * return it directly.\n   *\n   * - `opts.requestContext` is an optional server context that will be passed\n   *   to actions/loaders in the `context` parameter\n   * - `opts.skipLoaderErrorBubbling` is an optional parameter that will prevent\n   *   the bubbling of errors which allows single-fetch-type implementations\n   *   where the client will handle the bubbling and we may need to return data\n   *   for the handling route\n   */\n  async function query(\n    request: Request,\n    {\n      requestContext,\n      skipLoaderErrorBubbling,\n      unstable_dataStrategy,\n    }: {\n      requestContext?: unknown;\n      skipLoaderErrorBubbling?: boolean;\n      unstable_dataStrategy?: DataStrategyFunction;\n    } = {}\n  ): Promise<StaticHandlerContext | Response> {\n    let url = new URL(request.url);\n    let method = request.method;\n    let location = createLocation(\"\", createPath(url), null, \"default\");\n    let matches = matchRoutes(dataRoutes, location, basename);\n\n    // SSR supports HEAD requests while SPA doesn't\n    if (!isValidMethod(method) && method !== \"HEAD\") {\n      let error = getInternalRouterError(405, { method });\n      let { matches: methodNotAllowedMatches, route } =\n        getShortCircuitMatches(dataRoutes);\n      return {\n        basename,\n        location,\n        matches: methodNotAllowedMatches,\n        loaderData: {},\n        actionData: null,\n        errors: {\n          [route.id]: error,\n        },\n        statusCode: error.status,\n        loaderHeaders: {},\n        actionHeaders: {},\n        activeDeferreds: null,\n      };\n    } else if (!matches) {\n      let error = getInternalRouterError(404, { pathname: location.pathname });\n      let { matches: notFoundMatches, route } =\n        getShortCircuitMatches(dataRoutes);\n      return {\n        basename,\n        location,\n        matches: notFoundMatches,\n        loaderData: {},\n        actionData: null,\n        errors: {\n          [route.id]: error,\n        },\n        statusCode: error.status,\n        loaderHeaders: {},\n        actionHeaders: {},\n        activeDeferreds: null,\n      };\n    }\n\n    let result = await queryImpl(\n      request,\n      location,\n      matches,\n      requestContext,\n      unstable_dataStrategy || null,\n      skipLoaderErrorBubbling === true,\n      null\n    );\n    if (isResponse(result)) {\n      return result;\n    }\n\n    // When returning StaticHandlerContext, we patch back in the location here\n    // since we need it for React Context.  But this helps keep our submit and\n    // loadRouteData operating on a Request instead of a Location\n    return { location, basename, ...result };\n  }\n\n  /**\n   * The queryRoute() method is intended for targeted route requests, either\n   * for fetch ?_data requests or resource route requests.  In this case, we\n   * are only ever calling a single action or loader, and we are returning the\n   * returned value directly.  In most cases, this will be a Response returned\n   * from the action/loader, but it may be a primitive or other value as well -\n   * and in such cases the calling context should handle that accordingly.\n   *\n   * We do respect the throw/return differentiation, so if an action/loader\n   * throws, then this method will throw the value.  This is important so we\n   * can do proper boundary identification in Remix where a thrown Response\n   * must go to the Catch Boundary but a returned Response is happy-path.\n   *\n   * One thing to note is that any Router-initiated Errors that make sense\n   * to associate with a status code will be thrown as an ErrorResponse\n   * instance which include the raw Error, such that the calling context can\n   * serialize the error as they see fit while including the proper response\n   * code.  Examples here are 404 and 405 errors that occur prior to reaching\n   * any user-defined loaders.\n   *\n   * - `opts.routeId` allows you to specify the specific route handler to call.\n   *   If not provided the handler will determine the proper route by matching\n   *   against `request.url`\n   * - `opts.requestContext` is an optional server context that will be passed\n   *    to actions/loaders in the `context` parameter\n   */\n  async function queryRoute(\n    request: Request,\n    {\n      routeId,\n      requestContext,\n      unstable_dataStrategy,\n    }: {\n      requestContext?: unknown;\n      routeId?: string;\n      unstable_dataStrategy?: DataStrategyFunction;\n    } = {}\n  ): Promise<any> {\n    let url = new URL(request.url);\n    let method = request.method;\n    let location = createLocation(\"\", createPath(url), null, \"default\");\n    let matches = matchRoutes(dataRoutes, location, basename);\n\n    // SSR supports HEAD requests while SPA doesn't\n    if (!isValidMethod(method) && method !== \"HEAD\" && method !== \"OPTIONS\") {\n      throw getInternalRouterError(405, { method });\n    } else if (!matches) {\n      throw getInternalRouterError(404, { pathname: location.pathname });\n    }\n\n    let match = routeId\n      ? matches.find((m) => m.route.id === routeId)\n      : getTargetMatch(matches, location);\n\n    if (routeId && !match) {\n      throw getInternalRouterError(403, {\n        pathname: location.pathname,\n        routeId,\n      });\n    } else if (!match) {\n      // This should never hit I don't think?\n      throw getInternalRouterError(404, { pathname: location.pathname });\n    }\n\n    let result = await queryImpl(\n      request,\n      location,\n      matches,\n      requestContext,\n      unstable_dataStrategy || null,\n      false,\n      match\n    );\n\n    if (isResponse(result)) {\n      return result;\n    }\n\n    let error = result.errors ? Object.values(result.errors)[0] : undefined;\n    if (error !== undefined) {\n      // If we got back result.errors, that means the loader/action threw\n      // _something_ that wasn't a Response, but it's not guaranteed/required\n      // to be an `instanceof Error` either, so we have to use throw here to\n      // preserve the \"error\" state outside of queryImpl.\n      throw error;\n    }\n\n    // Pick off the right state value to return\n    if (result.actionData) {\n      return Object.values(result.actionData)[0];\n    }\n\n    if (result.loaderData) {\n      let data = Object.values(result.loaderData)[0];\n      if (result.activeDeferreds?.[match.route.id]) {\n        data[UNSAFE_DEFERRED_SYMBOL] = result.activeDeferreds[match.route.id];\n      }\n      return data;\n    }\n\n    return undefined;\n  }\n\n  async function queryImpl(\n    request: Request,\n    location: Location,\n    matches: AgnosticDataRouteMatch[],\n    requestContext: unknown,\n    unstable_dataStrategy: DataStrategyFunction | null,\n    skipLoaderErrorBubbling: boolean,\n    routeMatch: AgnosticDataRouteMatch | null\n  ): Promise<Omit<StaticHandlerContext, \"location\" | \"basename\"> | Response> {\n    invariant(\n      request.signal,\n      \"query()/queryRoute() requests must contain an AbortController signal\"\n    );\n\n    try {\n      if (isMutationMethod(request.method.toLowerCase())) {\n        let result = await submit(\n          request,\n          matches,\n          routeMatch || getTargetMatch(matches, location),\n          requestContext,\n          unstable_dataStrategy,\n          skipLoaderErrorBubbling,\n          routeMatch != null\n        );\n        return result;\n      }\n\n      let result = await loadRouteData(\n        request,\n        matches,\n        requestContext,\n        unstable_dataStrategy,\n        skipLoaderErrorBubbling,\n        routeMatch\n      );\n      return isResponse(result)\n        ? result\n        : {\n            ...result,\n            actionData: null,\n            actionHeaders: {},\n          };\n    } catch (e) {\n      // If the user threw/returned a Response in callLoaderOrAction for a\n      // `queryRoute` call, we throw the `HandlerResult` to bail out early\n      // and then return or throw the raw Response here accordingly\n      if (isHandlerResult(e) && isResponse(e.result)) {\n        if (e.type === ResultType.error) {\n          throw e.result;\n        }\n        return e.result;\n      }\n      // Redirects are always returned since they don't propagate to catch\n      // boundaries\n      if (isRedirectResponse(e)) {\n        return e;\n      }\n      throw e;\n    }\n  }\n\n  async function submit(\n    request: Request,\n    matches: AgnosticDataRouteMatch[],\n    actionMatch: AgnosticDataRouteMatch,\n    requestContext: unknown,\n    unstable_dataStrategy: DataStrategyFunction | null,\n    skipLoaderErrorBubbling: boolean,\n    isRouteRequest: boolean\n  ): Promise<Omit<StaticHandlerContext, \"location\" | \"basename\"> | Response> {\n    let result: DataResult;\n\n    if (!actionMatch.route.action && !actionMatch.route.lazy) {\n      let error = getInternalRouterError(405, {\n        method: request.method,\n        pathname: new URL(request.url).pathname,\n        routeId: actionMatch.route.id,\n      });\n      if (isRouteRequest) {\n        throw error;\n      }\n      result = {\n        type: ResultType.error,\n        error,\n      };\n    } else {\n      let results = await callDataStrategy(\n        \"action\",\n        request,\n        [actionMatch],\n        matches,\n        isRouteRequest,\n        requestContext,\n        unstable_dataStrategy\n      );\n      result = results[0];\n\n      if (request.signal.aborted) {\n        throwStaticHandlerAbortedError(request, isRouteRequest, future);\n      }\n    }\n\n    if (isRedirectResult(result)) {\n      // Uhhhh - this should never happen, we should always throw these from\n      // callLoaderOrAction, but the type narrowing here keeps TS happy and we\n      // can get back on the \"throw all redirect responses\" train here should\n      // this ever happen :/\n      throw new Response(null, {\n        status: result.response.status,\n        headers: {\n          Location: result.response.headers.get(\"Location\")!,\n        },\n      });\n    }\n\n    if (isDeferredResult(result)) {\n      let error = getInternalRouterError(400, { type: \"defer-action\" });\n      if (isRouteRequest) {\n        throw error;\n      }\n      result = {\n        type: ResultType.error,\n        error,\n      };\n    }\n\n    if (isRouteRequest) {\n      // Note: This should only be non-Response values if we get here, since\n      // isRouteRequest should throw any Response received in callLoaderOrAction\n      if (isErrorResult(result)) {\n        throw result.error;\n      }\n\n      return {\n        matches: [actionMatch],\n        loaderData: {},\n        actionData: { [actionMatch.route.id]: result.data },\n        errors: null,\n        // Note: statusCode + headers are unused here since queryRoute will\n        // return the raw Response or value\n        statusCode: 200,\n        loaderHeaders: {},\n        actionHeaders: {},\n        activeDeferreds: null,\n      };\n    }\n\n    // Create a GET request for the loaders\n    let loaderRequest = new Request(request.url, {\n      headers: request.headers,\n      redirect: request.redirect,\n      signal: request.signal,\n    });\n\n    if (isErrorResult(result)) {\n      // Store off the pending error - we use it to determine which loaders\n      // to call and will commit it when we complete the navigation\n      let boundaryMatch = skipLoaderErrorBubbling\n        ? actionMatch\n        : findNearestBoundary(matches, actionMatch.route.id);\n\n      let context = await loadRouteData(\n        loaderRequest,\n        matches,\n        requestContext,\n        unstable_dataStrategy,\n        skipLoaderErrorBubbling,\n        null,\n        [boundaryMatch.route.id, result]\n      );\n\n      // action status codes take precedence over loader status codes\n      return {\n        ...context,\n        statusCode: isRouteErrorResponse(result.error)\n          ? result.error.status\n          : result.statusCode != null\n          ? result.statusCode\n          : 500,\n        actionData: null,\n        actionHeaders: {\n          ...(result.headers ? { [actionMatch.route.id]: result.headers } : {}),\n        },\n      };\n    }\n\n    let context = await loadRouteData(\n      loaderRequest,\n      matches,\n      requestContext,\n      unstable_dataStrategy,\n      skipLoaderErrorBubbling,\n      null\n    );\n\n    return {\n      ...context,\n      actionData: {\n        [actionMatch.route.id]: result.data,\n      },\n      // action status codes take precedence over loader status codes\n      ...(result.statusCode ? { statusCode: result.statusCode } : {}),\n      actionHeaders: result.headers\n        ? { [actionMatch.route.id]: result.headers }\n        : {},\n    };\n  }\n\n  async function loadRouteData(\n    request: Request,\n    matches: AgnosticDataRouteMatch[],\n    requestContext: unknown,\n    unstable_dataStrategy: DataStrategyFunction | null,\n    skipLoaderErrorBubbling: boolean,\n    routeMatch: AgnosticDataRouteMatch | null,\n    pendingActionResult?: PendingActionResult\n  ): Promise<\n    | Omit<\n        StaticHandlerContext,\n        \"location\" | \"basename\" | \"actionData\" | \"actionHeaders\"\n      >\n    | Response\n  > {\n    let isRouteRequest = routeMatch != null;\n\n    // Short circuit if we have no loaders to run (queryRoute())\n    if (\n      isRouteRequest &&\n      !routeMatch?.route.loader &&\n      !routeMatch?.route.lazy\n    ) {\n      throw getInternalRouterError(400, {\n        method: request.method,\n        pathname: new URL(request.url).pathname,\n        routeId: routeMatch?.route.id,\n      });\n    }\n\n    let requestMatches = routeMatch\n      ? [routeMatch]\n      : pendingActionResult && isErrorResult(pendingActionResult[1])\n      ? getLoaderMatchesUntilBoundary(matches, pendingActionResult[0])\n      : matches;\n    let matchesToLoad = requestMatches.filter(\n      (m) => m.route.loader || m.route.lazy\n    );\n\n    // Short circuit if we have no loaders to run (query())\n    if (matchesToLoad.length === 0) {\n      return {\n        matches,\n        // Add a null for all matched routes for proper revalidation on the client\n        loaderData: matches.reduce(\n          (acc, m) => Object.assign(acc, { [m.route.id]: null }),\n          {}\n        ),\n        errors:\n          pendingActionResult && isErrorResult(pendingActionResult[1])\n            ? {\n                [pendingActionResult[0]]: pendingActionResult[1].error,\n              }\n            : null,\n        statusCode: 200,\n        loaderHeaders: {},\n        activeDeferreds: null,\n      };\n    }\n\n    let results = await callDataStrategy(\n      \"loader\",\n      request,\n      matchesToLoad,\n      matches,\n      isRouteRequest,\n      requestContext,\n      unstable_dataStrategy\n    );\n\n    if (request.signal.aborted) {\n      throwStaticHandlerAbortedError(request, isRouteRequest, future);\n    }\n\n    // Process and commit output from loaders\n    let activeDeferreds = new Map<string, DeferredData>();\n    let context = processRouteLoaderData(\n      matches,\n      matchesToLoad,\n      results,\n      pendingActionResult,\n      activeDeferreds,\n      skipLoaderErrorBubbling\n    );\n\n    // Add a null for any non-loader matches for proper revalidation on the client\n    let executedLoaders = new Set<string>(\n      matchesToLoad.map((match) => match.route.id)\n    );\n    matches.forEach((match) => {\n      if (!executedLoaders.has(match.route.id)) {\n        context.loaderData[match.route.id] = null;\n      }\n    });\n\n    return {\n      ...context,\n      matches,\n      activeDeferreds:\n        activeDeferreds.size > 0\n          ? Object.fromEntries(activeDeferreds.entries())\n          : null,\n    };\n  }\n\n  // Utility wrapper for calling dataStrategy server-side without having to\n  // pass around the manifest, mapRouteProperties, etc.\n  async function callDataStrategy(\n    type: \"loader\" | \"action\",\n    request: Request,\n    matchesToLoad: AgnosticDataRouteMatch[],\n    matches: AgnosticDataRouteMatch[],\n    isRouteRequest: boolean,\n    requestContext: unknown,\n    unstable_dataStrategy: DataStrategyFunction | null\n  ): Promise<DataResult[]> {\n    let results = await callDataStrategyImpl(\n      unstable_dataStrategy || defaultDataStrategy,\n      type,\n      request,\n      matchesToLoad,\n      matches,\n      manifest,\n      mapRouteProperties,\n      requestContext\n    );\n\n    return await Promise.all(\n      results.map((result, i) => {\n        if (isRedirectHandlerResult(result)) {\n          let response = result.result as Response;\n          // Throw redirects and let the server handle them with an HTTP redirect\n          throw normalizeRelativeRoutingRedirectResponse(\n            response,\n            request,\n            matchesToLoad[i].route.id,\n            matches,\n            basename,\n            future.v7_relativeSplatPath\n          );\n        }\n        if (isResponse(result.result) && isRouteRequest) {\n          // For SSR single-route requests, we want to hand Responses back\n          // directly without unwrapping\n          throw result;\n        }\n\n        return convertHandlerResultToDataResult(result);\n      })\n    );\n  }\n\n  return {\n    dataRoutes,\n    query,\n    queryRoute,\n  };\n}\n\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Helpers\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Given an existing StaticHandlerContext and an error thrown at render time,\n * provide an updated StaticHandlerContext suitable for a second SSR render\n */\nexport function getStaticContextFromError(\n  routes: AgnosticDataRouteObject[],\n  context: StaticHandlerContext,\n  error: any\n) {\n  let newContext: StaticHandlerContext = {\n    ...context,\n    statusCode: isRouteErrorResponse(error) ? error.status : 500,\n    errors: {\n      [context._deepestRenderedBoundaryId || routes[0].id]: error,\n    },\n  };\n  return newContext;\n}\n\nfunction throwStaticHandlerAbortedError(\n  request: Request,\n  isRouteRequest: boolean,\n  future: StaticHandlerFutureConfig\n) {\n  if (future.v7_throwAbortReason && request.signal.reason !== undefined) {\n    throw request.signal.reason;\n  }\n\n  let method = isRouteRequest ? \"queryRoute\" : \"query\";\n  throw new Error(`${method}() call aborted: ${request.method} ${request.url}`);\n}\n\nfunction isSubmissionNavigation(\n  opts: BaseNavigateOrFetchOptions\n): opts is SubmissionNavigateOptions {\n  return (\n    opts != null &&\n    ((\"formData\" in opts && opts.formData != null) ||\n      (\"body\" in opts && opts.body !== undefined))\n  );\n}\n\nfunction normalizeTo(\n  location: Path,\n  matches: AgnosticDataRouteMatch[],\n  basename: string,\n  prependBasename: boolean,\n  to: To | null,\n  v7_relativeSplatPath: boolean,\n  fromRouteId?: string,\n  relative?: RelativeRoutingType\n) {\n  let contextualMatches: AgnosticDataRouteMatch[];\n  let activeRouteMatch: AgnosticDataRouteMatch | undefined;\n  if (fromRouteId) {\n    // Grab matches up to the calling route so our route-relative logic is\n    // relative to the correct source route\n    contextualMatches = [];\n    for (let match of matches) {\n      contextualMatches.push(match);\n      if (match.route.id === fromRouteId) {\n        activeRouteMatch = match;\n        break;\n      }\n    }\n  } else {\n    contextualMatches = matches;\n    activeRouteMatch = matches[matches.length - 1];\n  }\n\n  // Resolve the relative path\n  let path = resolveTo(\n    to ? to : \".\",\n    getResolveToMatches(contextualMatches, v7_relativeSplatPath),\n    stripBasename(location.pathname, basename) || location.pathname,\n    relative === \"path\"\n  );\n\n  // When `to` is not specified we inherit search/hash from the current\n  // location, unlike when to=\".\" and we just inherit the path.\n  // See https://github.com/remix-run/remix/issues/927\n  if (to == null) {\n    path.search = location.search;\n    path.hash = location.hash;\n  }\n\n  // Add an ?index param for matched index routes if we don't already have one\n  if (\n    (to == null || to === \"\" || to === \".\") &&\n    activeRouteMatch &&\n    activeRouteMatch.route.index &&\n    !hasNakedIndexQuery(path.search)\n  ) {\n    path.search = path.search\n      ? path.search.replace(/^\\?/, \"?index&\")\n      : \"?index\";\n  }\n\n  // If we're operating within a basename, prepend it to the pathname.  If\n  // this is a root navigation, then just use the raw basename which allows\n  // the basename to have full control over the presence of a trailing slash\n  // on root actions\n  if (prependBasename && basename !== \"/\") {\n    path.pathname =\n      path.pathname === \"/\" ? basename : joinPaths([basename, path.pathname]);\n  }\n\n  return createPath(path);\n}\n\n// Normalize navigation options by converting formMethod=GET formData objects to\n// URLSearchParams so they behave identically to links with query params\nfunction normalizeNavigateOptions(\n  normalizeFormMethod: boolean,\n  isFetcher: boolean,\n  path: string,\n  opts?: BaseNavigateOrFetchOptions\n): {\n  path: string;\n  submission?: Submission;\n  error?: ErrorResponseImpl;\n} {\n  // Return location verbatim on non-submission navigations\n  if (!opts || !isSubmissionNavigation(opts)) {\n    return { path };\n  }\n\n  if (opts.formMethod && !isValidMethod(opts.formMethod)) {\n    return {\n      path,\n      error: getInternalRouterError(405, { method: opts.formMethod }),\n    };\n  }\n\n  let getInvalidBodyError = () => ({\n    path,\n    error: getInternalRouterError(400, { type: \"invalid-body\" }),\n  });\n\n  // Create a Submission on non-GET navigations\n  let rawFormMethod = opts.formMethod || \"get\";\n  let formMethod = normalizeFormMethod\n    ? (rawFormMethod.toUpperCase() as V7_FormMethod)\n    : (rawFormMethod.toLowerCase() as FormMethod);\n  let formAction = stripHashFromPath(path);\n\n  if (opts.body !== undefined) {\n    if (opts.formEncType === \"text/plain\") {\n      // text only support POST/PUT/PATCH/DELETE submissions\n      if (!isMutationMethod(formMethod)) {\n        return getInvalidBodyError();\n      }\n\n      let text =\n        typeof opts.body === \"string\"\n          ? opts.body\n          : opts.body instanceof FormData ||\n            opts.body instanceof URLSearchParams\n          ? // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#plain-text-form-data\n            Array.from(opts.body.entries()).reduce(\n              (acc, [name, value]) => `${acc}${name}=${value}\\n`,\n              \"\"\n            )\n          : String(opts.body);\n\n      return {\n        path,\n        submission: {\n          formMethod,\n          formAction,\n          formEncType: opts.formEncType,\n          formData: undefined,\n          json: undefined,\n          text,\n        },\n      };\n    } else if (opts.formEncType === \"application/json\") {\n      // json only supports POST/PUT/PATCH/DELETE submissions\n      if (!isMutationMethod(formMethod)) {\n        return getInvalidBodyError();\n      }\n\n      try {\n        let json =\n          typeof opts.body === \"string\" ? JSON.parse(opts.body) : opts.body;\n\n        return {\n          path,\n          submission: {\n            formMethod,\n            formAction,\n            formEncType: opts.formEncType,\n            formData: undefined,\n            json,\n            text: undefined,\n          },\n        };\n      } catch (e) {\n        return getInvalidBodyError();\n      }\n    }\n  }\n\n  invariant(\n    typeof FormData === \"function\",\n    \"FormData is not available in this environment\"\n  );\n\n  let searchParams: URLSearchParams;\n  let formData: FormData;\n\n  if (opts.formData) {\n    searchParams = convertFormDataToSearchParams(opts.formData);\n    formData = opts.formData;\n  } else if (opts.body instanceof FormData) {\n    searchParams = convertFormDataToSearchParams(opts.body);\n    formData = opts.body;\n  } else if (opts.body instanceof URLSearchParams) {\n    searchParams = opts.body;\n    formData = convertSearchParamsToFormData(searchParams);\n  } else if (opts.body == null) {\n    searchParams = new URLSearchParams();\n    formData = new FormData();\n  } else {\n    try {\n      searchParams = new URLSearchParams(opts.body);\n      formData = convertSearchParamsToFormData(searchParams);\n    } catch (e) {\n      return getInvalidBodyError();\n    }\n  }\n\n  let submission: Submission = {\n    formMethod,\n    formAction,\n    formEncType:\n      (opts && opts.formEncType) || \"application/x-www-form-urlencoded\",\n    formData,\n    json: undefined,\n    text: undefined,\n  };\n\n  if (isMutationMethod(submission.formMethod)) {\n    return { path, submission };\n  }\n\n  // Flatten submission onto URLSearchParams for GET submissions\n  let parsedPath = parsePath(path);\n  // On GET navigation submissions we can drop the ?index param from the\n  // resulting location since all loaders will run.  But fetcher GET submissions\n  // only run a single loader so we need to preserve any incoming ?index params\n  if (isFetcher && parsedPath.search && hasNakedIndexQuery(parsedPath.search)) {\n    searchParams.append(\"index\", \"\");\n  }\n  parsedPath.search = `?${searchParams}`;\n\n  return { path: createPath(parsedPath), submission };\n}\n\n// Filter out all routes below any caught error as they aren't going to\n// render so we don't need to load them\nfunction getLoaderMatchesUntilBoundary(\n  matches: AgnosticDataRouteMatch[],\n  boundaryId: string\n) {\n  let boundaryMatches = matches;\n  if (boundaryId) {\n    let index = matches.findIndex((m) => m.route.id === boundaryId);\n    if (index >= 0) {\n      boundaryMatches = matches.slice(0, index);\n    }\n  }\n  return boundaryMatches;\n}\n\nfunction getMatchesToLoad(\n  history: History,\n  state: RouterState,\n  matches: AgnosticDataRouteMatch[],\n  submission: Submission | undefined,\n  location: Location,\n  isInitialLoad: boolean,\n  skipActionErrorRevalidation: boolean,\n  isRevalidationRequired: boolean,\n  cancelledDeferredRoutes: string[],\n  cancelledFetcherLoads: string[],\n  deletedFetchers: Set<string>,\n  fetchLoadMatches: Map<string, FetchLoadMatch>,\n  fetchRedirectIds: Set<string>,\n  routesToUse: AgnosticDataRouteObject[],\n  basename: string | undefined,\n  pendingActionResult?: PendingActionResult\n): [AgnosticDataRouteMatch[], RevalidatingFetcher[]] {\n  let actionResult = pendingActionResult\n    ? isErrorResult(pendingActionResult[1])\n      ? pendingActionResult[1].error\n      : pendingActionResult[1].data\n    : undefined;\n  let currentUrl = history.createURL(state.location);\n  let nextUrl = history.createURL(location);\n\n  // Pick navigation matches that are net-new or qualify for revalidation\n  let boundaryId =\n    pendingActionResult && isErrorResult(pendingActionResult[1])\n      ? pendingActionResult[0]\n      : undefined;\n  let boundaryMatches = boundaryId\n    ? getLoaderMatchesUntilBoundary(matches, boundaryId)\n    : matches;\n\n  // Don't revalidate loaders by default after action 4xx/5xx responses\n  // when the flag is enabled.  They can still opt-into revalidation via\n  // `shouldRevalidate` via `actionResult`\n  let actionStatus = pendingActionResult\n    ? pendingActionResult[1].statusCode\n    : undefined;\n  let shouldSkipRevalidation =\n    skipActionErrorRevalidation && actionStatus && actionStatus >= 400;\n\n  let navigationMatches = boundaryMatches.filter((match, index) => {\n    let { route } = match;\n    if (route.lazy) {\n      // We haven't loaded this route yet so we don't know if it's got a loader!\n      return true;\n    }\n\n    if (route.loader == null) {\n      return false;\n    }\n\n    if (isInitialLoad) {\n      if (typeof route.loader !== \"function\" || route.loader.hydrate) {\n        return true;\n      }\n      return (\n        state.loaderData[route.id] === undefined &&\n        // Don't re-run if the loader ran and threw an error\n        (!state.errors || state.errors[route.id] === undefined)\n      );\n    }\n\n    // Always call the loader on new route instances and pending defer cancellations\n    if (\n      isNewLoader(state.loaderData, state.matches[index], match) ||\n      cancelledDeferredRoutes.some((id) => id === match.route.id)\n    ) {\n      return true;\n    }\n\n    // This is the default implementation for when we revalidate.  If the route\n    // provides it's own implementation, then we give them full control but\n    // provide this value so they can leverage it if needed after they check\n    // their own specific use cases\n    let currentRouteMatch = state.matches[index];\n    let nextRouteMatch = match;\n\n    return shouldRevalidateLoader(match, {\n      currentUrl,\n      currentParams: currentRouteMatch.params,\n      nextUrl,\n      nextParams: nextRouteMatch.params,\n      ...submission,\n      actionResult,\n      unstable_actionStatus: actionStatus,\n      defaultShouldRevalidate: shouldSkipRevalidation\n        ? false\n        : // Forced revalidation due to submission, useRevalidator, or X-Remix-Revalidate\n          isRevalidationRequired ||\n          currentUrl.pathname + currentUrl.search ===\n            nextUrl.pathname + nextUrl.search ||\n          // Search params affect all loaders\n          currentUrl.search !== nextUrl.search ||\n          isNewRouteInstance(currentRouteMatch, nextRouteMatch),\n    });\n  });\n\n  // Pick fetcher.loads that need to be revalidated\n  let revalidatingFetchers: RevalidatingFetcher[] = [];\n  fetchLoadMatches.forEach((f, key) => {\n    // Don't revalidate:\n    //  - on initial load (shouldn't be any fetchers then anyway)\n    //  - if fetcher won't be present in the subsequent render\n    //    - no longer matches the URL (v7_fetcherPersist=false)\n    //    - was unmounted but persisted due to v7_fetcherPersist=true\n    if (\n      isInitialLoad ||\n      !matches.some((m) => m.route.id === f.routeId) ||\n      deletedFetchers.has(key)\n    ) {\n      return;\n    }\n\n    let fetcherMatches = matchRoutes(routesToUse, f.path, basename);\n\n    // If the fetcher path no longer matches, push it in with null matches so\n    // we can trigger a 404 in callLoadersAndMaybeResolveData.  Note this is\n    // currently only a use-case for Remix HMR where the route tree can change\n    // at runtime and remove a route previously loaded via a fetcher\n    if (!fetcherMatches) {\n      revalidatingFetchers.push({\n        key,\n        routeId: f.routeId,\n        path: f.path,\n        matches: null,\n        match: null,\n        controller: null,\n      });\n      return;\n    }\n\n    // Revalidating fetchers are decoupled from the route matches since they\n    // load from a static href.  They revalidate based on explicit revalidation\n    // (submission, useRevalidator, or X-Remix-Revalidate)\n    let fetcher = state.fetchers.get(key);\n    let fetcherMatch = getTargetMatch(fetcherMatches, f.path);\n\n    let shouldRevalidate = false;\n    if (fetchRedirectIds.has(key)) {\n      // Never trigger a revalidation of an actively redirecting fetcher\n      shouldRevalidate = false;\n    } else if (cancelledFetcherLoads.includes(key)) {\n      // Always revalidate if the fetcher was cancelled\n      shouldRevalidate = true;\n    } else if (\n      fetcher &&\n      fetcher.state !== \"idle\" &&\n      fetcher.data === undefined\n    ) {\n      // If the fetcher hasn't ever completed loading yet, then this isn't a\n      // revalidation, it would just be a brand new load if an explicit\n      // revalidation is required\n      shouldRevalidate = isRevalidationRequired;\n    } else {\n      // Otherwise fall back on any user-defined shouldRevalidate, defaulting\n      // to explicit revalidations only\n      shouldRevalidate = shouldRevalidateLoader(fetcherMatch, {\n        currentUrl,\n        currentParams: state.matches[state.matches.length - 1].params,\n        nextUrl,\n        nextParams: matches[matches.length - 1].params,\n        ...submission,\n        actionResult,\n        unstable_actionStatus: actionStatus,\n        defaultShouldRevalidate: shouldSkipRevalidation\n          ? false\n          : isRevalidationRequired,\n      });\n    }\n\n    if (shouldRevalidate) {\n      revalidatingFetchers.push({\n        key,\n        routeId: f.routeId,\n        path: f.path,\n        matches: fetcherMatches,\n        match: fetcherMatch,\n        controller: new AbortController(),\n      });\n    }\n  });\n\n  return [navigationMatches, revalidatingFetchers];\n}\n\nfunction isNewLoader(\n  currentLoaderData: RouteData,\n  currentMatch: AgnosticDataRouteMatch,\n  match: AgnosticDataRouteMatch\n) {\n  let isNew =\n    // [a] -> [a, b]\n    !currentMatch ||\n    // [a, b] -> [a, c]\n    match.route.id !== currentMatch.route.id;\n\n  // Handle the case that we don't have data for a re-used route, potentially\n  // from a prior error or from a cancelled pending deferred\n  let isMissingData = currentLoaderData[match.route.id] === undefined;\n\n  // Always load if this is a net-new route or we don't yet have data\n  return isNew || isMissingData;\n}\n\nfunction isNewRouteInstance(\n  currentMatch: AgnosticDataRouteMatch,\n  match: AgnosticDataRouteMatch\n) {\n  let currentPath = currentMatch.route.path;\n  return (\n    // param change for this match, /users/123 -> /users/456\n    currentMatch.pathname !== match.pathname ||\n    // splat param changed, which is not present in match.path\n    // e.g. /files/images/avatar.jpg -> files/finances.xls\n    (currentPath != null &&\n      currentPath.endsWith(\"*\") &&\n      currentMatch.params[\"*\"] !== match.params[\"*\"])\n  );\n}\n\nfunction shouldRevalidateLoader(\n  loaderMatch: AgnosticDataRouteMatch,\n  arg: ShouldRevalidateFunctionArgs\n) {\n  if (loaderMatch.route.shouldRevalidate) {\n    let routeChoice = loaderMatch.route.shouldRevalidate(arg);\n    if (typeof routeChoice === \"boolean\") {\n      return routeChoice;\n    }\n  }\n\n  return arg.defaultShouldRevalidate;\n}\n\n/**\n * Execute route.lazy() methods to lazily load route modules (loader, action,\n * shouldRevalidate) and update the routeManifest in place which shares objects\n * with dataRoutes so those get updated as well.\n */\nasync function loadLazyRouteModule(\n  route: AgnosticDataRouteObject,\n  mapRouteProperties: MapRoutePropertiesFunction,\n  manifest: RouteManifest\n) {\n  if (!route.lazy) {\n    return;\n  }\n\n  let lazyRoute = await route.lazy();\n\n  // If the lazy route function was executed and removed by another parallel\n  // call then we can return - first lazy() to finish wins because the return\n  // value of lazy is expected to be static\n  if (!route.lazy) {\n    return;\n  }\n\n  let routeToUpdate = manifest[route.id];\n  invariant(routeToUpdate, \"No route found in manifest\");\n\n  // Update the route in place.  This should be safe because there's no way\n  // we could yet be sitting on this route as we can't get there without\n  // resolving lazy() first.\n  //\n  // This is different than the HMR \"update\" use-case where we may actively be\n  // on the route being updated.  The main concern boils down to \"does this\n  // mutation affect any ongoing navigations or any current state.matches\n  // values?\".  If not, it should be safe to update in place.\n  let routeUpdates: Record<string, any> = {};\n  for (let lazyRouteProperty in lazyRoute) {\n    let staticRouteValue =\n      routeToUpdate[lazyRouteProperty as keyof typeof routeToUpdate];\n\n    let isPropertyStaticallyDefined =\n      staticRouteValue !== undefined &&\n      // This property isn't static since it should always be updated based\n      // on the route updates\n      lazyRouteProperty !== \"hasErrorBoundary\";\n\n    warning(\n      !isPropertyStaticallyDefined,\n      `Route \"${routeToUpdate.id}\" has a static property \"${lazyRouteProperty}\" ` +\n        `defined but its lazy function is also returning a value for this property. ` +\n        `The lazy route property \"${lazyRouteProperty}\" will be ignored.`\n    );\n\n    if (\n      !isPropertyStaticallyDefined &&\n      !immutableRouteKeys.has(lazyRouteProperty as ImmutableRouteKey)\n    ) {\n      routeUpdates[lazyRouteProperty] =\n        lazyRoute[lazyRouteProperty as keyof typeof lazyRoute];\n    }\n  }\n\n  // Mutate the route with the provided updates.  Do this first so we pass\n  // the updated version to mapRouteProperties\n  Object.assign(routeToUpdate, routeUpdates);\n\n  // Mutate the `hasErrorBoundary` property on the route based on the route\n  // updates and remove the `lazy` function so we don't resolve the lazy\n  // route again.\n  Object.assign(routeToUpdate, {\n    // To keep things framework agnostic, we use the provided\n    // `mapRouteProperties` (or wrapped `detectErrorBoundary`) function to\n    // set the framework-aware properties (`element`/`hasErrorBoundary`) since\n    // the logic will differ between frameworks.\n    ...mapRouteProperties(routeToUpdate),\n    lazy: undefined,\n  });\n}\n\n// Default implementation of `dataStrategy` which fetches all loaders in parallel\nfunction defaultDataStrategy(\n  opts: DataStrategyFunctionArgs\n): ReturnType<DataStrategyFunction> {\n  return Promise.all(opts.matches.map((m) => m.resolve()));\n}\n\nasync function callDataStrategyImpl(\n  dataStrategyImpl: DataStrategyFunction,\n  type: \"loader\" | \"action\",\n  request: Request,\n  matchesToLoad: AgnosticDataRouteMatch[],\n  matches: AgnosticDataRouteMatch[],\n  manifest: RouteManifest,\n  mapRouteProperties: MapRoutePropertiesFunction,\n  requestContext?: unknown\n): Promise<HandlerResult[]> {\n  let routeIdsToLoad = matchesToLoad.reduce(\n    (acc, m) => acc.add(m.route.id),\n    new Set<string>()\n  );\n  let loadedMatches = new Set<string>();\n\n  // Send all matches here to allow for a middleware-type implementation.\n  // handler will be a no-op for unneeded routes and we filter those results\n  // back out below.\n  let results = await dataStrategyImpl({\n    matches: matches.map((match) => {\n      let shouldLoad = routeIdsToLoad.has(match.route.id);\n      // `resolve` encapsulates the route.lazy, executing the\n      // loader/action, and mapping return values/thrown errors to a\n      // HandlerResult.  Users can pass a callback to take fine-grained control\n      // over the execution of the loader/action\n      let resolve: DataStrategyMatch[\"resolve\"] = (handlerOverride) => {\n        loadedMatches.add(match.route.id);\n        return shouldLoad\n          ? callLoaderOrAction(\n              type,\n              request,\n              match,\n              manifest,\n              mapRouteProperties,\n              handlerOverride,\n              requestContext\n            )\n          : Promise.resolve({ type: ResultType.data, result: undefined });\n      };\n\n      return {\n        ...match,\n        shouldLoad,\n        resolve,\n      };\n    }),\n    request,\n    params: matches[0].params,\n    context: requestContext,\n  });\n\n  // Throw if any loadRoute implementations not called since they are what\n  // ensures a route is fully loaded\n  matches.forEach((m) =>\n    invariant(\n      loadedMatches.has(m.route.id),\n      `\\`match.resolve()\\` was not called for route id \"${m.route.id}\". ` +\n        \"You must call `match.resolve()` on every match passed to \" +\n        \"`dataStrategy` to ensure all routes are properly loaded.\"\n    )\n  );\n\n  // Filter out any middleware-only matches for which we didn't need to run handlers\n  return results.filter((_, i) => routeIdsToLoad.has(matches[i].route.id));\n}\n\n// Default logic for calling a loader/action is the user has no specified a dataStrategy\nasync function callLoaderOrAction(\n  type: \"loader\" | \"action\",\n  request: Request,\n  match: AgnosticDataRouteMatch,\n  manifest: RouteManifest,\n  mapRouteProperties: MapRoutePropertiesFunction,\n  handlerOverride: Parameters<DataStrategyMatch[\"resolve\"]>[0],\n  staticContext?: unknown\n): Promise<HandlerResult> {\n  let result: HandlerResult;\n  let onReject: (() => void) | undefined;\n\n  let runHandler = (\n    handler: AgnosticRouteObject[\"loader\"] | AgnosticRouteObject[\"action\"]\n  ): Promise<HandlerResult> => {\n    // Setup a promise we can race against so that abort signals short circuit\n    let reject: () => void;\n    // This will never resolve so safe to type it as Promise<HandlerResult> to\n    // satisfy the function return value\n    let abortPromise = new Promise<HandlerResult>((_, r) => (reject = r));\n    onReject = () => reject();\n    request.signal.addEventListener(\"abort\", onReject);\n\n    let actualHandler = (ctx?: unknown) => {\n      if (typeof handler !== \"function\") {\n        return Promise.reject(\n          new Error(\n            `You cannot call the handler for a route which defines a boolean ` +\n              `\"${type}\" [routeId: ${match.route.id}]`\n          )\n        );\n      }\n      return handler(\n        {\n          request,\n          params: match.params,\n          context: staticContext,\n        },\n        ...(ctx !== undefined ? [ctx] : [])\n      );\n    };\n\n    let handlerPromise: Promise<HandlerResult>;\n    if (handlerOverride) {\n      handlerPromise = handlerOverride((ctx: unknown) => actualHandler(ctx));\n    } else {\n      handlerPromise = (async () => {\n        try {\n          let val = await actualHandler();\n          return { type: \"data\", result: val };\n        } catch (e) {\n          return { type: \"error\", result: e };\n        }\n      })();\n    }\n\n    return Promise.race([handlerPromise, abortPromise]);\n  };\n\n  try {\n    let handler = match.route[type];\n\n    if (match.route.lazy) {\n      if (handler) {\n        // Run statically defined handler in parallel with lazy()\n        let handlerError;\n        let [value] = await Promise.all([\n          // If the handler throws, don't let it immediately bubble out,\n          // since we need to let the lazy() execution finish so we know if this\n          // route has a boundary that can handle the error\n          runHandler(handler).catch((e) => {\n            handlerError = e;\n          }),\n          loadLazyRouteModule(match.route, mapRouteProperties, manifest),\n        ]);\n        if (handlerError !== undefined) {\n          throw handlerError;\n        }\n        result = value!;\n      } else {\n        // Load lazy route module, then run any returned handler\n        await loadLazyRouteModule(match.route, mapRouteProperties, manifest);\n\n        handler = match.route[type];\n        if (handler) {\n          // Handler still runs even if we got interrupted to maintain consistency\n          // with un-abortable behavior of handler execution on non-lazy or\n          // previously-lazy-loaded routes\n          result = await runHandler(handler);\n        } else if (type === \"action\") {\n          let url = new URL(request.url);\n          let pathname = url.pathname + url.search;\n          throw getInternalRouterError(405, {\n            method: request.method,\n            pathname,\n            routeId: match.route.id,\n          });\n        } else {\n          // lazy() route has no loader to run.  Short circuit here so we don't\n          // hit the invariant below that errors on returning undefined.\n          return { type: ResultType.data, result: undefined };\n        }\n      }\n    } else if (!handler) {\n      let url = new URL(request.url);\n      let pathname = url.pathname + url.search;\n      throw getInternalRouterError(404, {\n        pathname,\n      });\n    } else {\n      result = await runHandler(handler);\n    }\n\n    invariant(\n      result.result !== undefined,\n      `You defined ${type === \"action\" ? \"an action\" : \"a loader\"} for route ` +\n        `\"${match.route.id}\" but didn't return anything from your \\`${type}\\` ` +\n        `function. Please return a value or \\`null\\`.`\n    );\n  } catch (e) {\n    // We should already be catching and converting normal handler executions to\n    // HandlerResults and returning them, so anything that throws here is an\n    // unexpected error we still need to wrap\n    return { type: ResultType.error, result: e };\n  } finally {\n    if (onReject) {\n      request.signal.removeEventListener(\"abort\", onReject);\n    }\n  }\n\n  return result;\n}\n\nasync function convertHandlerResultToDataResult(\n  handlerResult: HandlerResult\n): Promise<DataResult> {\n  let { result, type, status } = handlerResult;\n\n  if (isResponse(result)) {\n    let data: any;\n\n    try {\n      let contentType = result.headers.get(\"Content-Type\");\n      // Check between word boundaries instead of startsWith() due to the last\n      // paragraph of https://httpwg.org/specs/rfc9110.html#field.content-type\n      if (contentType && /\\bapplication\\/json\\b/.test(contentType)) {\n        if (result.body == null) {\n          data = null;\n        } else {\n          data = await result.json();\n        }\n      } else {\n        data = await result.text();\n      }\n    } catch (e) {\n      return { type: ResultType.error, error: e };\n    }\n\n    if (type === ResultType.error) {\n      return {\n        type: ResultType.error,\n        error: new ErrorResponseImpl(result.status, result.statusText, data),\n        statusCode: result.status,\n        headers: result.headers,\n      };\n    }\n\n    return {\n      type: ResultType.data,\n      data,\n      statusCode: result.status,\n      headers: result.headers,\n    };\n  }\n\n  if (type === ResultType.error) {\n    return {\n      type: ResultType.error,\n      error: result,\n      statusCode: isRouteErrorResponse(result) ? result.status : status,\n    };\n  }\n\n  if (isDeferredData(result)) {\n    return {\n      type: ResultType.deferred,\n      deferredData: result,\n      statusCode: result.init?.status,\n      headers: result.init?.headers && new Headers(result.init.headers),\n    };\n  }\n\n  return { type: ResultType.data, data: result, statusCode: status };\n}\n\n// Support relative routing in internal redirects\nfunction normalizeRelativeRoutingRedirectResponse(\n  response: Response,\n  request: Request,\n  routeId: string,\n  matches: AgnosticDataRouteMatch[],\n  basename: string,\n  v7_relativeSplatPath: boolean\n) {\n  let location = response.headers.get(\"Location\");\n  invariant(\n    location,\n    \"Redirects returned/thrown from loaders/actions must have a Location header\"\n  );\n\n  if (!ABSOLUTE_URL_REGEX.test(location)) {\n    let trimmedMatches = matches.slice(\n      0,\n      matches.findIndex((m) => m.route.id === routeId) + 1\n    );\n    location = normalizeTo(\n      new URL(request.url),\n      trimmedMatches,\n      basename,\n      true,\n      location,\n      v7_relativeSplatPath\n    );\n    response.headers.set(\"Location\", location);\n  }\n\n  return response;\n}\n\nfunction normalizeRedirectLocation(\n  location: string,\n  currentUrl: URL,\n  basename: string\n): string {\n  if (ABSOLUTE_URL_REGEX.test(location)) {\n    // Strip off the protocol+origin for same-origin + same-basename absolute redirects\n    let normalizedLocation = location;\n    let url = normalizedLocation.startsWith(\"//\")\n      ? new URL(currentUrl.protocol + normalizedLocation)\n      : new URL(normalizedLocation);\n    let isSameBasename = stripBasename(url.pathname, basename) != null;\n    if (url.origin === currentUrl.origin && isSameBasename) {\n      return url.pathname + url.search + url.hash;\n    }\n  }\n  return location;\n}\n\n// Utility method for creating the Request instances for loaders/actions during\n// client-side navigations and fetches.  During SSR we will always have a\n// Request instance from the static handler (query/queryRoute)\nfunction createClientSideRequest(\n  history: History,\n  location: string | Location,\n  signal: AbortSignal,\n  submission?: Submission\n): Request {\n  let url = history.createURL(stripHashFromPath(location)).toString();\n  let init: RequestInit = { signal };\n\n  if (submission && isMutationMethod(submission.formMethod)) {\n    let { formMethod, formEncType } = submission;\n    // Didn't think we needed this but it turns out unlike other methods, patch\n    // won't be properly normalized to uppercase and results in a 405 error.\n    // See: https://fetch.spec.whatwg.org/#concept-method\n    init.method = formMethod.toUpperCase();\n\n    if (formEncType === \"application/json\") {\n      init.headers = new Headers({ \"Content-Type\": formEncType });\n      init.body = JSON.stringify(submission.json);\n    } else if (formEncType === \"text/plain\") {\n      // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n      init.body = submission.text;\n    } else if (\n      formEncType === \"application/x-www-form-urlencoded\" &&\n      submission.formData\n    ) {\n      // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n      init.body = convertFormDataToSearchParams(submission.formData);\n    } else {\n      // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n      init.body = submission.formData;\n    }\n  }\n\n  return new Request(url, init);\n}\n\nfunction convertFormDataToSearchParams(formData: FormData): URLSearchParams {\n  let searchParams = new URLSearchParams();\n\n  for (let [key, value] of formData.entries()) {\n    // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#converting-an-entry-list-to-a-list-of-name-value-pairs\n    searchParams.append(key, typeof value === \"string\" ? value : value.name);\n  }\n\n  return searchParams;\n}\n\nfunction convertSearchParamsToFormData(\n  searchParams: URLSearchParams\n): FormData {\n  let formData = new FormData();\n  for (let [key, value] of searchParams.entries()) {\n    formData.append(key, value);\n  }\n  return formData;\n}\n\nfunction processRouteLoaderData(\n  matches: AgnosticDataRouteMatch[],\n  matchesToLoad: AgnosticDataRouteMatch[],\n  results: DataResult[],\n  pendingActionResult: PendingActionResult | undefined,\n  activeDeferreds: Map<string, DeferredData>,\n  skipLoaderErrorBubbling: boolean\n): {\n  loaderData: RouterState[\"loaderData\"];\n  errors: RouterState[\"errors\"] | null;\n  statusCode: number;\n  loaderHeaders: Record<string, Headers>;\n} {\n  // Fill in loaderData/errors from our loaders\n  let loaderData: RouterState[\"loaderData\"] = {};\n  let errors: RouterState[\"errors\"] | null = null;\n  let statusCode: number | undefined;\n  let foundError = false;\n  let loaderHeaders: Record<string, Headers> = {};\n  let pendingError =\n    pendingActionResult && isErrorResult(pendingActionResult[1])\n      ? pendingActionResult[1].error\n      : undefined;\n\n  // Process loader results into state.loaderData/state.errors\n  results.forEach((result, index) => {\n    let id = matchesToLoad[index].route.id;\n    invariant(\n      !isRedirectResult(result),\n      \"Cannot handle redirect results in processLoaderData\"\n    );\n    if (isErrorResult(result)) {\n      let error = result.error;\n      // If we have a pending action error, we report it at the highest-route\n      // that throws a loader error, and then clear it out to indicate that\n      // it was consumed\n      if (pendingError !== undefined) {\n        error = pendingError;\n        pendingError = undefined;\n      }\n\n      errors = errors || {};\n\n      if (skipLoaderErrorBubbling) {\n        errors[id] = error;\n      } else {\n        // Look upwards from the matched route for the closest ancestor error\n        // boundary, defaulting to the root match.  Prefer higher error values\n        // if lower errors bubble to the same boundary\n        let boundaryMatch = findNearestBoundary(matches, id);\n        if (errors[boundaryMatch.route.id] == null) {\n          errors[boundaryMatch.route.id] = error;\n        }\n      }\n\n      // Clear our any prior loaderData for the throwing route\n      loaderData[id] = undefined;\n\n      // Once we find our first (highest) error, we set the status code and\n      // prevent deeper status codes from overriding\n      if (!foundError) {\n        foundError = true;\n        statusCode = isRouteErrorResponse(result.error)\n          ? result.error.status\n          : 500;\n      }\n      if (result.headers) {\n        loaderHeaders[id] = result.headers;\n      }\n    } else {\n      if (isDeferredResult(result)) {\n        activeDeferreds.set(id, result.deferredData);\n        loaderData[id] = result.deferredData.data;\n        // Error status codes always override success status codes, but if all\n        // loaders are successful we take the deepest status code.\n        if (\n          result.statusCode != null &&\n          result.statusCode !== 200 &&\n          !foundError\n        ) {\n          statusCode = result.statusCode;\n        }\n        if (result.headers) {\n          loaderHeaders[id] = result.headers;\n        }\n      } else {\n        loaderData[id] = result.data;\n        // Error status codes always override success status codes, but if all\n        // loaders are successful we take the deepest status code.\n        if (result.statusCode && result.statusCode !== 200 && !foundError) {\n          statusCode = result.statusCode;\n        }\n        if (result.headers) {\n          loaderHeaders[id] = result.headers;\n        }\n      }\n    }\n  });\n\n  // If we didn't consume the pending action error (i.e., all loaders\n  // resolved), then consume it here.  Also clear out any loaderData for the\n  // throwing route\n  if (pendingError !== undefined && pendingActionResult) {\n    errors = { [pendingActionResult[0]]: pendingError };\n    loaderData[pendingActionResult[0]] = undefined;\n  }\n\n  return {\n    loaderData,\n    errors,\n    statusCode: statusCode || 200,\n    loaderHeaders,\n  };\n}\n\nfunction processLoaderData(\n  state: RouterState,\n  matches: AgnosticDataRouteMatch[],\n  matchesToLoad: AgnosticDataRouteMatch[],\n  results: DataResult[],\n  pendingActionResult: PendingActionResult | undefined,\n  revalidatingFetchers: RevalidatingFetcher[],\n  fetcherResults: DataResult[],\n  activeDeferreds: Map<string, DeferredData>\n): {\n  loaderData: RouterState[\"loaderData\"];\n  errors?: RouterState[\"errors\"];\n} {\n  let { loaderData, errors } = processRouteLoaderData(\n    matches,\n    matchesToLoad,\n    results,\n    pendingActionResult,\n    activeDeferreds,\n    false // This method is only called client side so we always want to bubble\n  );\n\n  // Process results from our revalidating fetchers\n  for (let index = 0; index < revalidatingFetchers.length; index++) {\n    let { key, match, controller } = revalidatingFetchers[index];\n    invariant(\n      fetcherResults !== undefined && fetcherResults[index] !== undefined,\n      \"Did not find corresponding fetcher result\"\n    );\n    let result = fetcherResults[index];\n\n    // Process fetcher non-redirect errors\n    if (controller && controller.signal.aborted) {\n      // Nothing to do for aborted fetchers\n      continue;\n    } else if (isErrorResult(result)) {\n      let boundaryMatch = findNearestBoundary(state.matches, match?.route.id);\n      if (!(errors && errors[boundaryMatch.route.id])) {\n        errors = {\n          ...errors,\n          [boundaryMatch.route.id]: result.error,\n        };\n      }\n      state.fetchers.delete(key);\n    } else if (isRedirectResult(result)) {\n      // Should never get here, redirects should get processed above, but we\n      // keep this to type narrow to a success result in the else\n      invariant(false, \"Unhandled fetcher revalidation redirect\");\n    } else if (isDeferredResult(result)) {\n      // Should never get here, deferred data should be awaited for fetchers\n      // in resolveDeferredResults\n      invariant(false, \"Unhandled fetcher deferred data\");\n    } else {\n      let doneFetcher = getDoneFetcher(result.data);\n      state.fetchers.set(key, doneFetcher);\n    }\n  }\n\n  return { loaderData, errors };\n}\n\nfunction mergeLoaderData(\n  loaderData: RouteData,\n  newLoaderData: RouteData,\n  matches: AgnosticDataRouteMatch[],\n  errors: RouteData | null | undefined\n): RouteData {\n  let mergedLoaderData = { ...newLoaderData };\n  for (let match of matches) {\n    let id = match.route.id;\n    if (newLoaderData.hasOwnProperty(id)) {\n      if (newLoaderData[id] !== undefined) {\n        mergedLoaderData[id] = newLoaderData[id];\n      } else {\n        // No-op - this is so we ignore existing data if we have a key in the\n        // incoming object with an undefined value, which is how we unset a prior\n        // loaderData if we encounter a loader error\n      }\n    } else if (loaderData[id] !== undefined && match.route.loader) {\n      // Preserve existing keys not included in newLoaderData and where a loader\n      // wasn't removed by HMR\n      mergedLoaderData[id] = loaderData[id];\n    }\n\n    if (errors && errors.hasOwnProperty(id)) {\n      // Don't keep any loader data below the boundary\n      break;\n    }\n  }\n  return mergedLoaderData;\n}\n\nfunction getActionDataForCommit(\n  pendingActionResult: PendingActionResult | undefined\n) {\n  if (!pendingActionResult) {\n    return {};\n  }\n  return isErrorResult(pendingActionResult[1])\n    ? {\n        // Clear out prior actionData on errors\n        actionData: {},\n      }\n    : {\n        actionData: {\n          [pendingActionResult[0]]: pendingActionResult[1].data,\n        },\n      };\n}\n\n// Find the nearest error boundary, looking upwards from the leaf route (or the\n// route specified by routeId) for the closest ancestor error boundary,\n// defaulting to the root match\nfunction findNearestBoundary(\n  matches: AgnosticDataRouteMatch[],\n  routeId?: string\n): AgnosticDataRouteMatch {\n  let eligibleMatches = routeId\n    ? matches.slice(0, matches.findIndex((m) => m.route.id === routeId) + 1)\n    : [...matches];\n  return (\n    eligibleMatches.reverse().find((m) => m.route.hasErrorBoundary === true) ||\n    matches[0]\n  );\n}\n\nfunction getShortCircuitMatches(routes: AgnosticDataRouteObject[]): {\n  matches: AgnosticDataRouteMatch[];\n  route: AgnosticDataRouteObject;\n} {\n  // Prefer a root layout route if present, otherwise shim in a route object\n  let route =\n    routes.length === 1\n      ? routes[0]\n      : routes.find((r) => r.index || !r.path || r.path === \"/\") || {\n          id: `__shim-error-route__`,\n        };\n\n  return {\n    matches: [\n      {\n        params: {},\n        pathname: \"\",\n        pathnameBase: \"\",\n        route,\n      },\n    ],\n    route,\n  };\n}\n\nfunction getInternalRouterError(\n  status: number,\n  {\n    pathname,\n    routeId,\n    method,\n    type,\n  }: {\n    pathname?: string;\n    routeId?: string;\n    method?: string;\n    type?: \"defer-action\" | \"invalid-body\";\n  } = {}\n) {\n  let statusText = \"Unknown Server Error\";\n  let errorMessage = \"Unknown @remix-run/router error\";\n\n  if (status === 400) {\n    statusText = \"Bad Request\";\n    if (method && pathname && routeId) {\n      errorMessage =\n        `You made a ${method} request to \"${pathname}\" but ` +\n        `did not provide a \\`loader\\` for route \"${routeId}\", ` +\n        `so there is no way to handle the request.`;\n    } else if (type === \"defer-action\") {\n      errorMessage = \"defer() is not supported in actions\";\n    } else if (type === \"invalid-body\") {\n      errorMessage = \"Unable to encode submission body\";\n    }\n  } else if (status === 403) {\n    statusText = \"Forbidden\";\n    errorMessage = `Route \"${routeId}\" does not match URL \"${pathname}\"`;\n  } else if (status === 404) {\n    statusText = \"Not Found\";\n    errorMessage = `No route matches URL \"${pathname}\"`;\n  } else if (status === 405) {\n    statusText = \"Method Not Allowed\";\n    if (method && pathname && routeId) {\n      errorMessage =\n        `You made a ${method.toUpperCase()} request to \"${pathname}\" but ` +\n        `did not provide an \\`action\\` for route \"${routeId}\", ` +\n        `so there is no way to handle the request.`;\n    } else if (method) {\n      errorMessage = `Invalid request method \"${method.toUpperCase()}\"`;\n    }\n  }\n\n  return new ErrorResponseImpl(\n    status || 500,\n    statusText,\n    new Error(errorMessage),\n    true\n  );\n}\n\n// Find any returned redirect errors, starting from the lowest match\nfunction findRedirect(\n  results: DataResult[]\n): { result: RedirectResult; idx: number } | undefined {\n  for (let i = results.length - 1; i >= 0; i--) {\n    let result = results[i];\n    if (isRedirectResult(result)) {\n      return { result, idx: i };\n    }\n  }\n}\n\nfunction stripHashFromPath(path: To) {\n  let parsedPath = typeof path === \"string\" ? parsePath(path) : path;\n  return createPath({ ...parsedPath, hash: \"\" });\n}\n\nfunction isHashChangeOnly(a: Location, b: Location): boolean {\n  if (a.pathname !== b.pathname || a.search !== b.search) {\n    return false;\n  }\n\n  if (a.hash === \"\") {\n    // /page -> /page#hash\n    return b.hash !== \"\";\n  } else if (a.hash === b.hash) {\n    // /page#hash -> /page#hash\n    return true;\n  } else if (b.hash !== \"\") {\n    // /page#hash -> /page#other\n    return true;\n  }\n\n  // If the hash is removed the browser will re-perform a request to the server\n  // /page#hash -> /page\n  return false;\n}\n\nfunction isHandlerResult(result: unknown): result is HandlerResult {\n  return (\n    result != null &&\n    typeof result === \"object\" &&\n    \"type\" in result &&\n    \"result\" in result &&\n    (result.type === ResultType.data || result.type === ResultType.error)\n  );\n}\n\nfunction isRedirectHandlerResult(result: HandlerResult) {\n  return (\n    isResponse(result.result) && redirectStatusCodes.has(result.result.status)\n  );\n}\n\nfunction isDeferredResult(result: DataResult): result is DeferredResult {\n  return result.type === ResultType.deferred;\n}\n\nfunction isErrorResult(result: DataResult): result is ErrorResult {\n  return result.type === ResultType.error;\n}\n\nfunction isRedirectResult(result?: DataResult): result is RedirectResult {\n  return (result && result.type) === ResultType.redirect;\n}\n\nexport function isDeferredData(value: any): value is DeferredData {\n  let deferred: DeferredData = value;\n  return (\n    deferred &&\n    typeof deferred === \"object\" &&\n    typeof deferred.data === \"object\" &&\n    typeof deferred.subscribe === \"function\" &&\n    typeof deferred.cancel === \"function\" &&\n    typeof deferred.resolveData === \"function\"\n  );\n}\n\nfunction isResponse(value: any): value is Response {\n  return (\n    value != null &&\n    typeof value.status === \"number\" &&\n    typeof value.statusText === \"string\" &&\n    typeof value.headers === \"object\" &&\n    typeof value.body !== \"undefined\"\n  );\n}\n\nfunction isRedirectResponse(result: any): result is Response {\n  if (!isResponse(result)) {\n    return false;\n  }\n\n  let status = result.status;\n  let location = result.headers.get(\"Location\");\n  return status >= 300 && status <= 399 && location != null;\n}\n\nfunction isValidMethod(method: string): method is FormMethod | V7_FormMethod {\n  return validRequestMethods.has(method.toLowerCase() as FormMethod);\n}\n\nfunction isMutationMethod(\n  method: string\n): method is MutationFormMethod | V7_MutationFormMethod {\n  return validMutationMethods.has(method.toLowerCase() as MutationFormMethod);\n}\n\nasync function resolveDeferredResults(\n  currentMatches: AgnosticDataRouteMatch[],\n  matchesToLoad: (AgnosticDataRouteMatch | null)[],\n  results: DataResult[],\n  signals: (AbortSignal | null)[],\n  isFetcher: boolean,\n  currentLoaderData?: RouteData\n) {\n  for (let index = 0; index < results.length; index++) {\n    let result = results[index];\n    let match = matchesToLoad[index];\n    // If we don't have a match, then we can have a deferred result to do\n    // anything with.  This is for revalidating fetchers where the route was\n    // removed during HMR\n    if (!match) {\n      continue;\n    }\n\n    let currentMatch = currentMatches.find(\n      (m) => m.route.id === match!.route.id\n    );\n    let isRevalidatingLoader =\n      currentMatch != null &&\n      !isNewRouteInstance(currentMatch, match) &&\n      (currentLoaderData && currentLoaderData[match.route.id]) !== undefined;\n\n    if (isDeferredResult(result) && (isFetcher || isRevalidatingLoader)) {\n      // Note: we do not have to touch activeDeferreds here since we race them\n      // against the signal in resolveDeferredData and they'll get aborted\n      // there if needed\n      let signal = signals[index];\n      invariant(\n        signal,\n        \"Expected an AbortSignal for revalidating fetcher deferred result\"\n      );\n      await resolveDeferredData(result, signal, isFetcher).then((result) => {\n        if (result) {\n          results[index] = result || results[index];\n        }\n      });\n    }\n  }\n}\n\nasync function resolveDeferredData(\n  result: DeferredResult,\n  signal: AbortSignal,\n  unwrap = false\n): Promise<SuccessResult | ErrorResult | undefined> {\n  let aborted = await result.deferredData.resolveData(signal);\n  if (aborted) {\n    return;\n  }\n\n  if (unwrap) {\n    try {\n      return {\n        type: ResultType.data,\n        data: result.deferredData.unwrappedData,\n      };\n    } catch (e) {\n      // Handle any TrackedPromise._error values encountered while unwrapping\n      return {\n        type: ResultType.error,\n        error: e,\n      };\n    }\n  }\n\n  return {\n    type: ResultType.data,\n    data: result.deferredData.data,\n  };\n}\n\nfunction hasNakedIndexQuery(search: string): boolean {\n  return new URLSearchParams(search).getAll(\"index\").some((v) => v === \"\");\n}\n\nfunction getTargetMatch(\n  matches: AgnosticDataRouteMatch[],\n  location: Location | string\n) {\n  let search =\n    typeof location === \"string\" ? parsePath(location).search : location.search;\n  if (\n    matches[matches.length - 1].route.index &&\n    hasNakedIndexQuery(search || \"\")\n  ) {\n    // Return the leaf index route when index is present\n    return matches[matches.length - 1];\n  }\n  // Otherwise grab the deepest \"path contributing\" match (ignoring index and\n  // pathless layout routes)\n  let pathMatches = getPathContributingMatches(matches);\n  return pathMatches[pathMatches.length - 1];\n}\n\nfunction getSubmissionFromNavigation(\n  navigation: Navigation\n): Submission | undefined {\n  let { formMethod, formAction, formEncType, text, formData, json } =\n    navigation;\n  if (!formMethod || !formAction || !formEncType) {\n    return;\n  }\n\n  if (text != null) {\n    return {\n      formMethod,\n      formAction,\n      formEncType,\n      formData: undefined,\n      json: undefined,\n      text,\n    };\n  } else if (formData != null) {\n    return {\n      formMethod,\n      formAction,\n      formEncType,\n      formData,\n      json: undefined,\n      text: undefined,\n    };\n  } else if (json !== undefined) {\n    return {\n      formMethod,\n      formAction,\n      formEncType,\n      formData: undefined,\n      json,\n      text: undefined,\n    };\n  }\n}\n\nfunction getLoadingNavigation(\n  location: Location,\n  submission?: Submission\n): NavigationStates[\"Loading\"] {\n  if (submission) {\n    let navigation: NavigationStates[\"Loading\"] = {\n      state: \"loading\",\n      location,\n      formMethod: submission.formMethod,\n      formAction: submission.formAction,\n      formEncType: submission.formEncType,\n      formData: submission.formData,\n      json: submission.json,\n      text: submission.text,\n    };\n    return navigation;\n  } else {\n    let navigation: NavigationStates[\"Loading\"] = {\n      state: \"loading\",\n      location,\n      formMethod: undefined,\n      formAction: undefined,\n      formEncType: undefined,\n      formData: undefined,\n      json: undefined,\n      text: undefined,\n    };\n    return navigation;\n  }\n}\n\nfunction getSubmittingNavigation(\n  location: Location,\n  submission: Submission\n): NavigationStates[\"Submitting\"] {\n  let navigation: NavigationStates[\"Submitting\"] = {\n    state: \"submitting\",\n    location,\n    formMethod: submission.formMethod,\n    formAction: submission.formAction,\n    formEncType: submission.formEncType,\n    formData: submission.formData,\n    json: submission.json,\n    text: submission.text,\n  };\n  return navigation;\n}\n\nfunction getLoadingFetcher(\n  submission?: Submission,\n  data?: Fetcher[\"data\"]\n): FetcherStates[\"Loading\"] {\n  if (submission) {\n    let fetcher: FetcherStates[\"Loading\"] = {\n      state: \"loading\",\n      formMethod: submission.formMethod,\n      formAction: submission.formAction,\n      formEncType: submission.formEncType,\n      formData: submission.formData,\n      json: submission.json,\n      text: submission.text,\n      data,\n    };\n    return fetcher;\n  } else {\n    let fetcher: FetcherStates[\"Loading\"] = {\n      state: \"loading\",\n      formMethod: undefined,\n      formAction: undefined,\n      formEncType: undefined,\n      formData: undefined,\n      json: undefined,\n      text: undefined,\n      data,\n    };\n    return fetcher;\n  }\n}\n\nfunction getSubmittingFetcher(\n  submission: Submission,\n  existingFetcher?: Fetcher\n): FetcherStates[\"Submitting\"] {\n  let fetcher: FetcherStates[\"Submitting\"] = {\n    state: \"submitting\",\n    formMethod: submission.formMethod,\n    formAction: submission.formAction,\n    formEncType: submission.formEncType,\n    formData: submission.formData,\n    json: submission.json,\n    text: submission.text,\n    data: existingFetcher ? existingFetcher.data : undefined,\n  };\n  return fetcher;\n}\n\nfunction getDoneFetcher(data: Fetcher[\"data\"]): FetcherStates[\"Idle\"] {\n  let fetcher: FetcherStates[\"Idle\"] = {\n    state: \"idle\",\n    formMethod: undefined,\n    formAction: undefined,\n    formEncType: undefined,\n    formData: undefined,\n    json: undefined,\n    text: undefined,\n    data,\n  };\n  return fetcher;\n}\n\nfunction restoreAppliedTransitions(\n  _window: Window,\n  transitions: Map<string, Set<string>>\n) {\n  try {\n    let sessionPositions = _window.sessionStorage.getItem(\n      TRANSITIONS_STORAGE_KEY\n    );\n    if (sessionPositions) {\n      let json = JSON.parse(sessionPositions);\n      for (let [k, v] of Object.entries(json || {})) {\n        if (v && Array.isArray(v)) {\n          transitions.set(k, new Set(v || []));\n        }\n      }\n    }\n  } catch (e) {\n    // no-op, use default empty object\n  }\n}\n\nfunction persistAppliedTransitions(\n  _window: Window,\n  transitions: Map<string, Set<string>>\n) {\n  if (transitions.size > 0) {\n    let json: Record<string, string[]> = {};\n    for (let [k, v] of transitions) {\n      json[k] = [...v];\n    }\n    try {\n      _window.sessionStorage.setItem(\n        TRANSITIONS_STORAGE_KEY,\n        JSON.stringify(json)\n      );\n    } catch (error) {\n      warning(\n        false,\n        `Failed to save applied view transitions in sessionStorage (${error}).`\n      );\n    }\n  }\n}\n\n//#endregion\n","import * as React from \"react\";\nimport type {\n  AgnosticIndexRouteObject,\n  AgnosticNonIndexRouteObject,\n  AgnosticRouteMatch,\n  History,\n  LazyRouteFunction,\n  Location,\n  Action as NavigationType,\n  RelativeRoutingType,\n  Router,\n  StaticHandlerContext,\n  To,\n  TrackedPromise,\n} from \"@remix-run/router\";\n\n// Create react-specific types from the agnostic types in @remix-run/router to\n// export from react-router\nexport interface IndexRouteObject {\n  caseSensitive?: AgnosticIndexRouteObject[\"caseSensitive\"];\n  path?: AgnosticIndexRouteObject[\"path\"];\n  id?: AgnosticIndexRouteObject[\"id\"];\n  loader?: AgnosticIndexRouteObject[\"loader\"];\n  action?: AgnosticIndexRouteObject[\"action\"];\n  hasErrorBoundary?: AgnosticIndexRouteObject[\"hasErrorBoundary\"];\n  shouldRevalidate?: AgnosticIndexRouteObject[\"shouldRevalidate\"];\n  handle?: AgnosticIndexRouteObject[\"handle\"];\n  index: true;\n  children?: undefined;\n  element?: React.ReactNode | null;\n  hydrateFallbackElement?: React.ReactNode | null;\n  errorElement?: React.ReactNode | null;\n  Component?: React.ComponentType | null;\n  HydrateFallback?: React.ComponentType | null;\n  ErrorBoundary?: React.ComponentType | null;\n  lazy?: LazyRouteFunction<RouteObject>;\n}\n\nexport interface NonIndexRouteObject {\n  caseSensitive?: AgnosticNonIndexRouteObject[\"caseSensitive\"];\n  path?: AgnosticNonIndexRouteObject[\"path\"];\n  id?: AgnosticNonIndexRouteObject[\"id\"];\n  loader?: AgnosticNonIndexRouteObject[\"loader\"];\n  action?: AgnosticNonIndexRouteObject[\"action\"];\n  hasErrorBoundary?: AgnosticNonIndexRouteObject[\"hasErrorBoundary\"];\n  shouldRevalidate?: AgnosticNonIndexRouteObject[\"shouldRevalidate\"];\n  handle?: AgnosticNonIndexRouteObject[\"handle\"];\n  index?: false;\n  children?: RouteObject[];\n  element?: React.ReactNode | null;\n  hydrateFallbackElement?: React.ReactNode | null;\n  errorElement?: React.ReactNode | null;\n  Component?: React.ComponentType | null;\n  HydrateFallback?: React.ComponentType | null;\n  ErrorBoundary?: React.ComponentType | null;\n  lazy?: LazyRouteFunction<RouteObject>;\n}\n\nexport type RouteObject = IndexRouteObject | NonIndexRouteObject;\n\nexport type DataRouteObject = RouteObject & {\n  children?: DataRouteObject[];\n  id: string;\n};\n\nexport interface RouteMatch<\n  ParamKey extends string = string,\n  RouteObjectType extends RouteObject = RouteObject\n> extends AgnosticRouteMatch<ParamKey, RouteObjectType> {}\n\nexport interface DataRouteMatch extends RouteMatch<string, DataRouteObject> {}\n\nexport interface DataRouterContextObject\n  // Omit `future` since those can be pulled from the `router`\n  // `NavigationContext` needs future since it doesn't have a `router` in all cases\n  extends Omit<NavigationContextObject, \"future\"> {\n  router: Router;\n  staticContext?: StaticHandlerContext;\n}\n\nexport const DataRouterContext =\n  React.createContext<DataRouterContextObject | null>(null);\nif (__DEV__) {\n  DataRouterContext.displayName = \"DataRouter\";\n}\n\nexport const DataRouterStateContext = React.createContext<\n  Router[\"state\"] | null\n>(null);\nif (__DEV__) {\n  DataRouterStateContext.displayName = \"DataRouterState\";\n}\n\nexport const AwaitContext = React.createContext<TrackedPromise | null>(null);\nif (__DEV__) {\n  AwaitContext.displayName = \"Await\";\n}\n\nexport interface NavigateOptions {\n  replace?: boolean;\n  state?: any;\n  preventScrollReset?: boolean;\n  relative?: RelativeRoutingType;\n  unstable_flushSync?: boolean;\n  unstable_viewTransition?: boolean;\n}\n\n/**\n * A Navigator is a \"location changer\"; it's how you get to different locations.\n *\n * Every history instance conforms to the Navigator interface, but the\n * distinction is useful primarily when it comes to the low-level `<Router>` API\n * where both the location and a navigator must be provided separately in order\n * to avoid \"tearing\" that may occur in a suspense-enabled app if the action\n * and/or location were to be read directly from the history instance.\n */\nexport interface Navigator {\n  createHref: History[\"createHref\"];\n  // Optional for backwards-compat with Router/HistoryRouter usage (edge case)\n  encodeLocation?: History[\"encodeLocation\"];\n  go: History[\"go\"];\n  push(to: To, state?: any, opts?: NavigateOptions): void;\n  replace(to: To, state?: any, opts?: NavigateOptions): void;\n}\n\ninterface NavigationContextObject {\n  basename: string;\n  navigator: Navigator;\n  static: boolean;\n  future: {\n    v7_relativeSplatPath: boolean;\n  };\n}\n\nexport const NavigationContext = React.createContext<NavigationContextObject>(\n  null!\n);\n\nif (__DEV__) {\n  NavigationContext.displayName = \"Navigation\";\n}\n\ninterface LocationContextObject {\n  location: Location;\n  navigationType: NavigationType;\n}\n\nexport const LocationContext = React.createContext<LocationContextObject>(\n  null!\n);\n\nif (__DEV__) {\n  LocationContext.displayName = \"Location\";\n}\n\nexport interface RouteContextObject {\n  outlet: React.ReactElement | null;\n  matches: RouteMatch[];\n  isDataRoute: boolean;\n}\n\nexport const RouteContext = React.createContext<RouteContextObject>({\n  outlet: null,\n  matches: [],\n  isDataRoute: false,\n});\n\nif (__DEV__) {\n  RouteContext.displayName = \"Route\";\n}\n\nexport const RouteErrorContext = React.createContext<any>(null);\n\nif (__DEV__) {\n  RouteErrorContext.displayName = \"RouteError\";\n}\n","import * as React from \"react\";\nimport type {\n  Blocker,\n  BlockerFunction,\n  Location,\n  ParamParseKey,\n  Params,\n  Path,\n  PathMatch,\n  PathPattern,\n  RelativeRoutingType,\n  Router as RemixRouter,\n  RevalidationState,\n  To,\n  UIMatch,\n} from \"@remix-run/router\";\nimport {\n  IDLE_BLOCKER,\n  Action as NavigationType,\n  UNSAFE_convertRouteMatchToUiMatch as convertRouteMatchToUiMatch,\n  UNSAFE_getResolveToMatches as getResolveToMatches,\n  UNSAFE_invariant as invariant,\n  isRouteErrorResponse,\n  joinPaths,\n  matchPath,\n  matchRoutes,\n  parsePath,\n  resolveTo,\n  stripBasename,\n  UNSAFE_warning as warning,\n} from \"@remix-run/router\";\n\nimport type {\n  DataRouteMatch,\n  NavigateOptions,\n  RouteContextObject,\n  RouteMatch,\n  RouteObject,\n} from \"./context\";\nimport {\n  AwaitContext,\n  DataRouterContext,\n  DataRouterStateContext,\n  LocationContext,\n  NavigationContext,\n  RouteContext,\n  RouteErrorContext,\n} from \"./context\";\n\n/**\n * Returns the full href for the given \"to\" value. This is useful for building\n * custom links that are also accessible and preserve right-click behavior.\n *\n * @see https://reactrouter.com/hooks/use-href\n */\nexport function useHref(\n  to: To,\n  { relative }: { relative?: RelativeRoutingType } = {}\n): string {\n  invariant(\n    useInRouterContext(),\n    // TODO: This error is probably because they somehow have 2 versions of the\n    // router loaded. We can help them understand how to avoid that.\n    `useHref() may be used only in the context of a <Router> component.`\n  );\n\n  let { basename, navigator } = React.useContext(NavigationContext);\n  let { hash, pathname, search } = useResolvedPath(to, { relative });\n\n  let joinedPathname = pathname;\n\n  // If we're operating within a basename, prepend it to the pathname prior\n  // to creating the href.  If this is a root navigation, then just use the raw\n  // basename which allows the basename to have full control over the presence\n  // of a trailing slash on root links\n  if (basename !== \"/\") {\n    joinedPathname =\n      pathname === \"/\" ? basename : joinPaths([basename, pathname]);\n  }\n\n  return navigator.createHref({ pathname: joinedPathname, search, hash });\n}\n\n/**\n * Returns true if this component is a descendant of a `<Router>`.\n *\n * @see https://reactrouter.com/hooks/use-in-router-context\n */\nexport function useInRouterContext(): boolean {\n  return React.useContext(LocationContext) != null;\n}\n\n/**\n * Returns the current location object, which represents the current URL in web\n * browsers.\n *\n * Note: If you're using this it may mean you're doing some of your own\n * \"routing\" in your app, and we'd like to know what your use case is. We may\n * be able to provide something higher-level to better suit your needs.\n *\n * @see https://reactrouter.com/hooks/use-location\n */\nexport function useLocation(): Location {\n  invariant(\n    useInRouterContext(),\n    // TODO: This error is probably because they somehow have 2 versions of the\n    // router loaded. We can help them understand how to avoid that.\n    `useLocation() may be used only in the context of a <Router> component.`\n  );\n\n  return React.useContext(LocationContext).location;\n}\n\n/**\n * Returns the current navigation action which describes how the router came to\n * the current location, either by a pop, push, or replace on the history stack.\n *\n * @see https://reactrouter.com/hooks/use-navigation-type\n */\nexport function useNavigationType(): NavigationType {\n  return React.useContext(LocationContext).navigationType;\n}\n\n/**\n * Returns a PathMatch object if the given pattern matches the current URL.\n * This is useful for components that need to know \"active\" state, e.g.\n * `<NavLink>`.\n *\n * @see https://reactrouter.com/hooks/use-match\n */\nexport function useMatch<\n  ParamKey extends ParamParseKey<Path>,\n  Path extends string\n>(pattern: PathPattern<Path> | Path): PathMatch<ParamKey> | null {\n  invariant(\n    useInRouterContext(),\n    // TODO: This error is probably because they somehow have 2 versions of the\n    // router loaded. We can help them understand how to avoid that.\n    `useMatch() may be used only in the context of a <Router> component.`\n  );\n\n  let { pathname } = useLocation();\n  return React.useMemo(\n    () => matchPath<ParamKey, Path>(pattern, pathname),\n    [pathname, pattern]\n  );\n}\n\n/**\n * The interface for the navigate() function returned from useNavigate().\n */\nexport interface NavigateFunction {\n  (to: To, options?: NavigateOptions): void;\n  (delta: number): void;\n}\n\nconst navigateEffectWarning =\n  `You should call navigate() in a React.useEffect(), not when ` +\n  `your component is first rendered.`;\n\n// Mute warnings for calls to useNavigate in SSR environments\nfunction useIsomorphicLayoutEffect(\n  cb: Parameters<typeof React.useLayoutEffect>[0]\n) {\n  let isStatic = React.useContext(NavigationContext).static;\n  if (!isStatic) {\n    // We should be able to get rid of this once react 18.3 is released\n    // See: https://github.com/facebook/react/pull/26395\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    React.useLayoutEffect(cb);\n  }\n}\n\n/**\n * Returns an imperative method for changing the location. Used by `<Link>`s, but\n * may also be used by other elements to change the location.\n *\n * @see https://reactrouter.com/hooks/use-navigate\n */\nexport function useNavigate(): NavigateFunction {\n  let { isDataRoute } = React.useContext(RouteContext);\n  // Conditional usage is OK here because the usage of a data router is static\n  // eslint-disable-next-line react-hooks/rules-of-hooks\n  return isDataRoute ? useNavigateStable() : useNavigateUnstable();\n}\n\nfunction useNavigateUnstable(): NavigateFunction {\n  invariant(\n    useInRouterContext(),\n    // TODO: This error is probably because they somehow have 2 versions of the\n    // router loaded. We can help them understand how to avoid that.\n    `useNavigate() may be used only in the context of a <Router> component.`\n  );\n\n  let dataRouterContext = React.useContext(DataRouterContext);\n  let { basename, future, navigator } = React.useContext(NavigationContext);\n  let { matches } = React.useContext(RouteContext);\n  let { pathname: locationPathname } = useLocation();\n\n  let routePathnamesJson = JSON.stringify(\n    getResolveToMatches(matches, future.v7_relativeSplatPath)\n  );\n\n  let activeRef = React.useRef(false);\n  useIsomorphicLayoutEffect(() => {\n    activeRef.current = true;\n  });\n\n  let navigate: NavigateFunction = React.useCallback(\n    (to: To | number, options: NavigateOptions = {}) => {\n      warning(activeRef.current, navigateEffectWarning);\n\n      // Short circuit here since if this happens on first render the navigate\n      // is useless because we haven't wired up our history listener yet\n      if (!activeRef.current) return;\n\n      if (typeof to === \"number\") {\n        navigator.go(to);\n        return;\n      }\n\n      let path = resolveTo(\n        to,\n        JSON.parse(routePathnamesJson),\n        locationPathname,\n        options.relative === \"path\"\n      );\n\n      // If we're operating within a basename, prepend it to the pathname prior\n      // to handing off to history (but only if we're not in a data router,\n      // otherwise it'll prepend the basename inside of the router).\n      // If this is a root navigation, then we navigate to the raw basename\n      // which allows the basename to have full control over the presence of a\n      // trailing slash on root links\n      if (dataRouterContext == null && basename !== \"/\") {\n        path.pathname =\n          path.pathname === \"/\"\n            ? basename\n            : joinPaths([basename, path.pathname]);\n      }\n\n      (!!options.replace ? navigator.replace : navigator.push)(\n        path,\n        options.state,\n        options\n      );\n    },\n    [\n      basename,\n      navigator,\n      routePathnamesJson,\n      locationPathname,\n      dataRouterContext,\n    ]\n  );\n\n  return navigate;\n}\n\nconst OutletContext = React.createContext<unknown>(null);\n\n/**\n * Returns the context (if provided) for the child route at this level of the route\n * hierarchy.\n * @see https://reactrouter.com/hooks/use-outlet-context\n */\nexport function useOutletContext<Context = unknown>(): Context {\n  return React.useContext(OutletContext) as Context;\n}\n\n/**\n * Returns the element for the child route at this level of the route\n * hierarchy. Used internally by `<Outlet>` to render child routes.\n *\n * @see https://reactrouter.com/hooks/use-outlet\n */\nexport function useOutlet(context?: unknown): React.ReactElement | null {\n  let outlet = React.useContext(RouteContext).outlet;\n  if (outlet) {\n    return (\n      <OutletContext.Provider value={context}>{outlet}</OutletContext.Provider>\n    );\n  }\n  return outlet;\n}\n\n/**\n * Returns an object of key/value pairs of the dynamic params from the current\n * URL that were matched by the route path.\n *\n * @see https://reactrouter.com/hooks/use-params\n */\nexport function useParams<\n  ParamsOrKey extends string | Record<string, string | undefined> = string\n>(): Readonly<\n  [ParamsOrKey] extends [string] ? Params<ParamsOrKey> : Partial<ParamsOrKey>\n> {\n  let { matches } = React.useContext(RouteContext);\n  let routeMatch = matches[matches.length - 1];\n  return routeMatch ? (routeMatch.params as any) : {};\n}\n\n/**\n * Resolves the pathname of the given `to` value against the current location.\n *\n * @see https://reactrouter.com/hooks/use-resolved-path\n */\nexport function useResolvedPath(\n  to: To,\n  { relative }: { relative?: RelativeRoutingType } = {}\n): Path {\n  let { future } = React.useContext(NavigationContext);\n  let { matches } = React.useContext(RouteContext);\n  let { pathname: locationPathname } = useLocation();\n  let routePathnamesJson = JSON.stringify(\n    getResolveToMatches(matches, future.v7_relativeSplatPath)\n  );\n\n  return React.useMemo(\n    () =>\n      resolveTo(\n        to,\n        JSON.parse(routePathnamesJson),\n        locationPathname,\n        relative === \"path\"\n      ),\n    [to, routePathnamesJson, locationPathname, relative]\n  );\n}\n\n/**\n * Returns the element of the route that matched the current location, prepared\n * with the correct context to render the remainder of the route tree. Route\n * elements in the tree must render an `<Outlet>` to render their child route's\n * element.\n *\n * @see https://reactrouter.com/hooks/use-routes\n */\nexport function useRoutes(\n  routes: RouteObject[],\n  locationArg?: Partial<Location> | string\n): React.ReactElement | null {\n  return useRoutesImpl(routes, locationArg);\n}\n\n// Internal implementation with accept optional param for RouterProvider usage\nexport function useRoutesImpl(\n  routes: RouteObject[],\n  locationArg?: Partial<Location> | string,\n  dataRouterState?: RemixRouter[\"state\"],\n  future?: RemixRouter[\"future\"]\n): React.ReactElement | null {\n  invariant(\n    useInRouterContext(),\n    // TODO: This error is probably because they somehow have 2 versions of the\n    // router loaded. We can help them understand how to avoid that.\n    `useRoutes() may be used only in the context of a <Router> component.`\n  );\n\n  let { navigator } = React.useContext(NavigationContext);\n  let { matches: parentMatches } = React.useContext(RouteContext);\n  let routeMatch = parentMatches[parentMatches.length - 1];\n  let parentParams = routeMatch ? routeMatch.params : {};\n  let parentPathname = routeMatch ? routeMatch.pathname : \"/\";\n  let parentPathnameBase = routeMatch ? routeMatch.pathnameBase : \"/\";\n  let parentRoute = routeMatch && routeMatch.route;\n\n  if (__DEV__) {\n    // You won't get a warning about 2 different <Routes> under a <Route>\n    // without a trailing *, but this is a best-effort warning anyway since we\n    // cannot even give the warning unless they land at the parent route.\n    //\n    // Example:\n    //\n    // <Routes>\n    //   {/* This route path MUST end with /* because otherwise\n    //       it will never match /blog/post/123 */}\n    //   <Route path=\"blog\" element={<Blog />} />\n    //   <Route path=\"blog/feed\" element={<BlogFeed />} />\n    // </Routes>\n    //\n    // function Blog() {\n    //   return (\n    //     <Routes>\n    //       <Route path=\"post/:id\" element={<Post />} />\n    //     </Routes>\n    //   );\n    // }\n    let parentPath = (parentRoute && parentRoute.path) || \"\";\n    warningOnce(\n      parentPathname,\n      !parentRoute || parentPath.endsWith(\"*\"),\n      `You rendered descendant <Routes> (or called \\`useRoutes()\\`) at ` +\n        `\"${parentPathname}\" (under <Route path=\"${parentPath}\">) but the ` +\n        `parent route path has no trailing \"*\". This means if you navigate ` +\n        `deeper, the parent won't match anymore and therefore the child ` +\n        `routes will never render.\\n\\n` +\n        `Please change the parent <Route path=\"${parentPath}\"> to <Route ` +\n        `path=\"${parentPath === \"/\" ? \"*\" : `${parentPath}/*`}\">.`\n    );\n  }\n\n  let locationFromContext = useLocation();\n\n  let location;\n  if (locationArg) {\n    let parsedLocationArg =\n      typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n\n    invariant(\n      parentPathnameBase === \"/\" ||\n        parsedLocationArg.pathname?.startsWith(parentPathnameBase),\n      `When overriding the location using \\`<Routes location>\\` or \\`useRoutes(routes, location)\\`, ` +\n        `the location pathname must begin with the portion of the URL pathname that was ` +\n        `matched by all parent routes. The current pathname base is \"${parentPathnameBase}\" ` +\n        `but pathname \"${parsedLocationArg.pathname}\" was given in the \\`location\\` prop.`\n    );\n\n    location = parsedLocationArg;\n  } else {\n    location = locationFromContext;\n  }\n\n  let pathname = location.pathname || \"/\";\n\n  let remainingPathname = pathname;\n  if (parentPathnameBase !== \"/\") {\n    // Determine the remaining pathname by removing the # of URL segments the\n    // parentPathnameBase has, instead of removing based on character count.\n    // This is because we can't guarantee that incoming/outgoing encodings/\n    // decodings will match exactly.\n    // We decode paths before matching on a per-segment basis with\n    // decodeURIComponent(), but we re-encode pathnames via `new URL()` so they\n    // match what `window.location.pathname` would reflect.  Those don't 100%\n    // align when it comes to encoded URI characters such as % and &.\n    //\n    // So we may end up with:\n    //   pathname:           \"/descendant/a%25b/match\"\n    //   parentPathnameBase: \"/descendant/a%b\"\n    //\n    // And the direct substring removal approach won't work :/\n    let parentSegments = parentPathnameBase.replace(/^\\//, \"\").split(\"/\");\n    let segments = pathname.replace(/^\\//, \"\").split(\"/\");\n    remainingPathname = \"/\" + segments.slice(parentSegments.length).join(\"/\");\n  }\n\n  let matches = matchRoutes(routes, { pathname: remainingPathname });\n\n  if (__DEV__) {\n    warning(\n      parentRoute || matches != null,\n      `No routes matched location \"${location.pathname}${location.search}${location.hash}\" `\n    );\n\n    warning(\n      matches == null ||\n        matches[matches.length - 1].route.element !== undefined ||\n        matches[matches.length - 1].route.Component !== undefined ||\n        matches[matches.length - 1].route.lazy !== undefined,\n      `Matched leaf route at location \"${location.pathname}${location.search}${location.hash}\" ` +\n        `does not have an element or Component. This means it will render an <Outlet /> with a ` +\n        `null value by default resulting in an \"empty\" page.`\n    );\n  }\n\n  let renderedMatches = _renderMatches(\n    matches &&\n      matches.map((match) =>\n        Object.assign({}, match, {\n          params: Object.assign({}, parentParams, match.params),\n          pathname: joinPaths([\n            parentPathnameBase,\n            // Re-encode pathnames that were decoded inside matchRoutes\n            navigator.encodeLocation\n              ? navigator.encodeLocation(match.pathname).pathname\n              : match.pathname,\n          ]),\n          pathnameBase:\n            match.pathnameBase === \"/\"\n              ? parentPathnameBase\n              : joinPaths([\n                  parentPathnameBase,\n                  // Re-encode pathnames that were decoded inside matchRoutes\n                  navigator.encodeLocation\n                    ? navigator.encodeLocation(match.pathnameBase).pathname\n                    : match.pathnameBase,\n                ]),\n        })\n      ),\n    parentMatches,\n    dataRouterState,\n    future\n  );\n\n  // When a user passes in a `locationArg`, the associated routes need to\n  // be wrapped in a new `LocationContext.Provider` in order for `useLocation`\n  // to use the scoped location instead of the global location.\n  if (locationArg && renderedMatches) {\n    return (\n      <LocationContext.Provider\n        value={{\n          location: {\n            pathname: \"/\",\n            search: \"\",\n            hash: \"\",\n            state: null,\n            key: \"default\",\n            ...location,\n          },\n          navigationType: NavigationType.Pop,\n        }}\n      >\n        {renderedMatches}\n      </LocationContext.Provider>\n    );\n  }\n\n  return renderedMatches;\n}\n\nfunction DefaultErrorComponent() {\n  let error = useRouteError();\n  let message = isRouteErrorResponse(error)\n    ? `${error.status} ${error.statusText}`\n    : error instanceof Error\n    ? error.message\n    : JSON.stringify(error);\n  let stack = error instanceof Error ? error.stack : null;\n  let lightgrey = \"rgba(200,200,200, 0.5)\";\n  let preStyles = { padding: \"0.5rem\", backgroundColor: lightgrey };\n  let codeStyles = { padding: \"2px 4px\", backgroundColor: lightgrey };\n\n  let devInfo = null;\n  if (__DEV__) {\n    console.error(\n      \"Error handled by React Router default ErrorBoundary:\",\n      error\n    );\n\n    devInfo = (\n      <>\n        <p>💿 Hey developer 👋</p>\n        <p>\n          You can provide a way better UX than this when your app throws errors\n          by providing your own <code style={codeStyles}>ErrorBoundary</code> or{\" \"}\n          <code style={codeStyles}>errorElement</code> prop on your route.\n        </p>\n      </>\n    );\n  }\n\n  return (\n    <>\n      <h2>Unexpected Application Error!</h2>\n      <h3 style={{ fontStyle: \"italic\" }}>{message}</h3>\n      {stack ? <pre style={preStyles}>{stack}</pre> : null}\n      {devInfo}\n    </>\n  );\n}\n\nconst defaultErrorElement = <DefaultErrorComponent />;\n\ntype RenderErrorBoundaryProps = React.PropsWithChildren<{\n  location: Location;\n  revalidation: RevalidationState;\n  error: any;\n  component: React.ReactNode;\n  routeContext: RouteContextObject;\n}>;\n\ntype RenderErrorBoundaryState = {\n  location: Location;\n  revalidation: RevalidationState;\n  error: any;\n};\n\nexport class RenderErrorBoundary extends React.Component<\n  RenderErrorBoundaryProps,\n  RenderErrorBoundaryState\n> {\n  constructor(props: RenderErrorBoundaryProps) {\n    super(props);\n    this.state = {\n      location: props.location,\n      revalidation: props.revalidation,\n      error: props.error,\n    };\n  }\n\n  static getDerivedStateFromError(error: any) {\n    return { error: error };\n  }\n\n  static getDerivedStateFromProps(\n    props: RenderErrorBoundaryProps,\n    state: RenderErrorBoundaryState\n  ) {\n    // When we get into an error state, the user will likely click \"back\" to the\n    // previous page that didn't have an error. Because this wraps the entire\n    // application, that will have no effect--the error page continues to display.\n    // This gives us a mechanism to recover from the error when the location changes.\n    //\n    // Whether we're in an error state or not, we update the location in state\n    // so that when we are in an error state, it gets reset when a new location\n    // comes in and the user recovers from the error.\n    if (\n      state.location !== props.location ||\n      (state.revalidation !== \"idle\" && props.revalidation === \"idle\")\n    ) {\n      return {\n        error: props.error,\n        location: props.location,\n        revalidation: props.revalidation,\n      };\n    }\n\n    // If we're not changing locations, preserve the location but still surface\n    // any new errors that may come through. We retain the existing error, we do\n    // this because the error provided from the app state may be cleared without\n    // the location changing.\n    return {\n      error: props.error !== undefined ? props.error : state.error,\n      location: state.location,\n      revalidation: props.revalidation || state.revalidation,\n    };\n  }\n\n  componentDidCatch(error: any, errorInfo: any) {\n    console.error(\n      \"React Router caught the following error during render\",\n      error,\n      errorInfo\n    );\n  }\n\n  render() {\n    return this.state.error !== undefined ? (\n      <RouteContext.Provider value={this.props.routeContext}>\n        <RouteErrorContext.Provider\n          value={this.state.error}\n          children={this.props.component}\n        />\n      </RouteContext.Provider>\n    ) : (\n      this.props.children\n    );\n  }\n}\n\ninterface RenderedRouteProps {\n  routeContext: RouteContextObject;\n  match: RouteMatch<string, RouteObject>;\n  children: React.ReactNode | null;\n}\n\nfunction RenderedRoute({ routeContext, match, children }: RenderedRouteProps) {\n  let dataRouterContext = React.useContext(DataRouterContext);\n\n  // Track how deep we got in our render pass to emulate SSR componentDidCatch\n  // in a DataStaticRouter\n  if (\n    dataRouterContext &&\n    dataRouterContext.static &&\n    dataRouterContext.staticContext &&\n    (match.route.errorElement || match.route.ErrorBoundary)\n  ) {\n    dataRouterContext.staticContext._deepestRenderedBoundaryId = match.route.id;\n  }\n\n  return (\n    <RouteContext.Provider value={routeContext}>\n      {children}\n    </RouteContext.Provider>\n  );\n}\n\nexport function _renderMatches(\n  matches: RouteMatch[] | null,\n  parentMatches: RouteMatch[] = [],\n  dataRouterState: RemixRouter[\"state\"] | null = null,\n  future: RemixRouter[\"future\"] | null = null\n): React.ReactElement | null {\n  if (matches == null) {\n    if (dataRouterState?.errors) {\n      // Don't bail if we have data router errors so we can render them in the\n      // boundary.  Use the pre-matched (or shimmed) matches\n      matches = dataRouterState.matches as DataRouteMatch[];\n    } else {\n      return null;\n    }\n  }\n\n  let renderedMatches = matches;\n\n  // If we have data errors, trim matches to the highest error boundary\n  let errors = dataRouterState?.errors;\n  if (errors != null) {\n    let errorIndex = renderedMatches.findIndex(\n      (m) => m.route.id && errors?.[m.route.id] !== undefined\n    );\n    invariant(\n      errorIndex >= 0,\n      `Could not find a matching route for errors on route IDs: ${Object.keys(\n        errors\n      ).join(\",\")}`\n    );\n    renderedMatches = renderedMatches.slice(\n      0,\n      Math.min(renderedMatches.length, errorIndex + 1)\n    );\n  }\n\n  // If we're in a partial hydration mode, detect if we need to render down to\n  // a given HydrateFallback while we load the rest of the hydration data\n  let renderFallback = false;\n  let fallbackIndex = -1;\n  if (dataRouterState && future && future.v7_partialHydration) {\n    for (let i = 0; i < renderedMatches.length; i++) {\n      let match = renderedMatches[i];\n      // Track the deepest fallback up until the first route without data\n      if (match.route.HydrateFallback || match.route.hydrateFallbackElement) {\n        fallbackIndex = i;\n      }\n\n      if (match.route.id) {\n        let { loaderData, errors } = dataRouterState;\n        let needsToRunLoader =\n          match.route.loader &&\n          loaderData[match.route.id] === undefined &&\n          (!errors || errors[match.route.id] === undefined);\n        if (match.route.lazy || needsToRunLoader) {\n          // We found the first route that's not ready to render (waiting on\n          // lazy, or has a loader that hasn't run yet).  Flag that we need to\n          // render a fallback and render up until the appropriate fallback\n          renderFallback = true;\n          if (fallbackIndex >= 0) {\n            renderedMatches = renderedMatches.slice(0, fallbackIndex + 1);\n          } else {\n            renderedMatches = [renderedMatches[0]];\n          }\n          break;\n        }\n      }\n    }\n  }\n\n  return renderedMatches.reduceRight((outlet, match, index) => {\n    // Only data routers handle errors/fallbacks\n    let error: any;\n    let shouldRenderHydrateFallback = false;\n    let errorElement: React.ReactNode | null = null;\n    let hydrateFallbackElement: React.ReactNode | null = null;\n    if (dataRouterState) {\n      error = errors && match.route.id ? errors[match.route.id] : undefined;\n      errorElement = match.route.errorElement || defaultErrorElement;\n\n      if (renderFallback) {\n        if (fallbackIndex < 0 && index === 0) {\n          warningOnce(\n            \"route-fallback\",\n            false,\n            \"No `HydrateFallback` element provided to render during initial hydration\"\n          );\n          shouldRenderHydrateFallback = true;\n          hydrateFallbackElement = null;\n        } else if (fallbackIndex === index) {\n          shouldRenderHydrateFallback = true;\n          hydrateFallbackElement = match.route.hydrateFallbackElement || null;\n        }\n      }\n    }\n\n    let matches = parentMatches.concat(renderedMatches.slice(0, index + 1));\n    let getChildren = () => {\n      let children: React.ReactNode;\n      if (error) {\n        children = errorElement;\n      } else if (shouldRenderHydrateFallback) {\n        children = hydrateFallbackElement;\n      } else if (match.route.Component) {\n        // Note: This is a de-optimized path since React won't re-use the\n        // ReactElement since it's identity changes with each new\n        // React.createElement call.  We keep this so folks can use\n        // `<Route Component={...}>` in `<Routes>` but generally `Component`\n        // usage is only advised in `RouterProvider` when we can convert it to\n        // `element` ahead of time.\n        children = <match.route.Component />;\n      } else if (match.route.element) {\n        children = match.route.element;\n      } else {\n        children = outlet;\n      }\n      return (\n        <RenderedRoute\n          match={match}\n          routeContext={{\n            outlet,\n            matches,\n            isDataRoute: dataRouterState != null,\n          }}\n          children={children}\n        />\n      );\n    };\n    // Only wrap in an error boundary within data router usages when we have an\n    // ErrorBoundary/errorElement on this route.  Otherwise let it bubble up to\n    // an ancestor ErrorBoundary/errorElement\n    return dataRouterState &&\n      (match.route.ErrorBoundary || match.route.errorElement || index === 0) ? (\n      <RenderErrorBoundary\n        location={dataRouterState.location}\n        revalidation={dataRouterState.revalidation}\n        component={errorElement}\n        error={error}\n        children={getChildren()}\n        routeContext={{ outlet: null, matches, isDataRoute: true }}\n      />\n    ) : (\n      getChildren()\n    );\n  }, null as React.ReactElement | null);\n}\n\nenum DataRouterHook {\n  UseBlocker = \"useBlocker\",\n  UseRevalidator = \"useRevalidator\",\n  UseNavigateStable = \"useNavigate\",\n}\n\nenum DataRouterStateHook {\n  UseBlocker = \"useBlocker\",\n  UseLoaderData = \"useLoaderData\",\n  UseActionData = \"useActionData\",\n  UseRouteError = \"useRouteError\",\n  UseNavigation = \"useNavigation\",\n  UseRouteLoaderData = \"useRouteLoaderData\",\n  UseMatches = \"useMatches\",\n  UseRevalidator = \"useRevalidator\",\n  UseNavigateStable = \"useNavigate\",\n  UseRouteId = \"useRouteId\",\n}\n\nfunction getDataRouterConsoleError(\n  hookName: DataRouterHook | DataRouterStateHook\n) {\n  return `${hookName} must be used within a data router.  See https://reactrouter.com/routers/picking-a-router.`;\n}\n\nfunction useDataRouterContext(hookName: DataRouterHook) {\n  let ctx = React.useContext(DataRouterContext);\n  invariant(ctx, getDataRouterConsoleError(hookName));\n  return ctx;\n}\n\nfunction useDataRouterState(hookName: DataRouterStateHook) {\n  let state = React.useContext(DataRouterStateContext);\n  invariant(state, getDataRouterConsoleError(hookName));\n  return state;\n}\n\nfunction useRouteContext(hookName: DataRouterStateHook) {\n  let route = React.useContext(RouteContext);\n  invariant(route, getDataRouterConsoleError(hookName));\n  return route;\n}\n\n// Internal version with hookName-aware debugging\nfunction useCurrentRouteId(hookName: DataRouterStateHook) {\n  let route = useRouteContext(hookName);\n  let thisRoute = route.matches[route.matches.length - 1];\n  invariant(\n    thisRoute.route.id,\n    `${hookName} can only be used on routes that contain a unique \"id\"`\n  );\n  return thisRoute.route.id;\n}\n\n/**\n * Returns the ID for the nearest contextual route\n */\nexport function useRouteId() {\n  return useCurrentRouteId(DataRouterStateHook.UseRouteId);\n}\n\n/**\n * Returns the current navigation, defaulting to an \"idle\" navigation when\n * no navigation is in progress\n */\nexport function useNavigation() {\n  let state = useDataRouterState(DataRouterStateHook.UseNavigation);\n  return state.navigation;\n}\n\n/**\n * Returns a revalidate function for manually triggering revalidation, as well\n * as the current state of any manual revalidations\n */\nexport function useRevalidator() {\n  let dataRouterContext = useDataRouterContext(DataRouterHook.UseRevalidator);\n  let state = useDataRouterState(DataRouterStateHook.UseRevalidator);\n  return React.useMemo(\n    () => ({\n      revalidate: dataRouterContext.router.revalidate,\n      state: state.revalidation,\n    }),\n    [dataRouterContext.router.revalidate, state.revalidation]\n  );\n}\n\n/**\n * Returns the active route matches, useful for accessing loaderData for\n * parent/child routes or the route \"handle\" property\n */\nexport function useMatches(): UIMatch[] {\n  let { matches, loaderData } = useDataRouterState(\n    DataRouterStateHook.UseMatches\n  );\n  return React.useMemo(\n    () => matches.map((m) => convertRouteMatchToUiMatch(m, loaderData)),\n    [matches, loaderData]\n  );\n}\n\n/**\n * Returns the loader data for the nearest ancestor Route loader\n */\nexport function useLoaderData(): unknown {\n  let state = useDataRouterState(DataRouterStateHook.UseLoaderData);\n  let routeId = useCurrentRouteId(DataRouterStateHook.UseLoaderData);\n\n  if (state.errors && state.errors[routeId] != null) {\n    console.error(\n      `You cannot \\`useLoaderData\\` in an errorElement (routeId: ${routeId})`\n    );\n    return undefined;\n  }\n  return state.loaderData[routeId];\n}\n\n/**\n * Returns the loaderData for the given routeId\n */\nexport function useRouteLoaderData(routeId: string): unknown {\n  let state = useDataRouterState(DataRouterStateHook.UseRouteLoaderData);\n  return state.loaderData[routeId];\n}\n\n/**\n * Returns the action data for the nearest ancestor Route action\n */\nexport function useActionData(): unknown {\n  let state = useDataRouterState(DataRouterStateHook.UseActionData);\n  let routeId = useCurrentRouteId(DataRouterStateHook.UseLoaderData);\n  return state.actionData ? state.actionData[routeId] : undefined;\n}\n\n/**\n * Returns the nearest ancestor Route error, which could be a loader/action\n * error or a render error.  This is intended to be called from your\n * ErrorBoundary/errorElement to display a proper error message.\n */\nexport function useRouteError(): unknown {\n  let error = React.useContext(RouteErrorContext);\n  let state = useDataRouterState(DataRouterStateHook.UseRouteError);\n  let routeId = useCurrentRouteId(DataRouterStateHook.UseRouteError);\n\n  // If this was a render error, we put it in a RouteError context inside\n  // of RenderErrorBoundary\n  if (error !== undefined) {\n    return error;\n  }\n\n  // Otherwise look for errors from our data router state\n  return state.errors?.[routeId];\n}\n\n/**\n * Returns the happy-path data from the nearest ancestor `<Await />` value\n */\nexport function useAsyncValue(): unknown {\n  let value = React.useContext(AwaitContext);\n  return value?._data;\n}\n\n/**\n * Returns the error from the nearest ancestor `<Await />` value\n */\nexport function useAsyncError(): unknown {\n  let value = React.useContext(AwaitContext);\n  return value?._error;\n}\n\nlet blockerId = 0;\n\n/**\n * Allow the application to block navigations within the SPA and present the\n * user a confirmation dialog to confirm the navigation.  Mostly used to avoid\n * using half-filled form data.  This does not handle hard-reloads or\n * cross-origin navigations.\n */\nexport function useBlocker(shouldBlock: boolean | BlockerFunction): Blocker {\n  let { router, basename } = useDataRouterContext(DataRouterHook.UseBlocker);\n  let state = useDataRouterState(DataRouterStateHook.UseBlocker);\n\n  let [blockerKey, setBlockerKey] = React.useState(\"\");\n  let blockerFunction = React.useCallback<BlockerFunction>(\n    (arg) => {\n      if (typeof shouldBlock !== \"function\") {\n        return !!shouldBlock;\n      }\n      if (basename === \"/\") {\n        return shouldBlock(arg);\n      }\n\n      // If they provided us a function and we've got an active basename, strip\n      // it from the locations we expose to the user to match the behavior of\n      // useLocation\n      let { currentLocation, nextLocation, historyAction } = arg;\n      return shouldBlock({\n        currentLocation: {\n          ...currentLocation,\n          pathname:\n            stripBasename(currentLocation.pathname, basename) ||\n            currentLocation.pathname,\n        },\n        nextLocation: {\n          ...nextLocation,\n          pathname:\n            stripBasename(nextLocation.pathname, basename) ||\n            nextLocation.pathname,\n        },\n        historyAction,\n      });\n    },\n    [basename, shouldBlock]\n  );\n\n  // This effect is in charge of blocker key assignment and deletion (which is\n  // tightly coupled to the key)\n  React.useEffect(() => {\n    let key = String(++blockerId);\n    setBlockerKey(key);\n    return () => router.deleteBlocker(key);\n  }, [router]);\n\n  // This effect handles assigning the blockerFunction.  This is to handle\n  // unstable blocker function identities, and happens only after the prior\n  // effect so we don't get an orphaned blockerFunction in the router with a\n  // key of \"\".  Until then we just have the IDLE_BLOCKER.\n  React.useEffect(() => {\n    if (blockerKey !== \"\") {\n      router.getBlocker(blockerKey, blockerFunction);\n    }\n  }, [router, blockerKey, blockerFunction]);\n\n  // Prefer the blocker from `state` not `router.state` since DataRouterContext\n  // is memoized so this ensures we update on blocker state updates\n  return blockerKey && state.blockers.has(blockerKey)\n    ? state.blockers.get(blockerKey)!\n    : IDLE_BLOCKER;\n}\n\n/**\n * Stable version of useNavigate that is used when we are in the context of\n * a RouterProvider.\n */\nfunction useNavigateStable(): NavigateFunction {\n  let { router } = useDataRouterContext(DataRouterHook.UseNavigateStable);\n  let id = useCurrentRouteId(DataRouterStateHook.UseNavigateStable);\n\n  let activeRef = React.useRef(false);\n  useIsomorphicLayoutEffect(() => {\n    activeRef.current = true;\n  });\n\n  let navigate: NavigateFunction = React.useCallback(\n    (to: To | number, options: NavigateOptions = {}) => {\n      warning(activeRef.current, navigateEffectWarning);\n\n      // Short circuit here since if this happens on first render the navigate\n      // is useless because we haven't wired up our router subscriber yet\n      if (!activeRef.current) return;\n\n      if (typeof to === \"number\") {\n        router.navigate(to);\n      } else {\n        router.navigate(to, { fromRouteId: id, ...options });\n      }\n    },\n    [router, id]\n  );\n\n  return navigate;\n}\n\nconst alreadyWarned: Record<string, boolean> = {};\n\nfunction warningOnce(key: string, cond: boolean, message: string) {\n  if (!cond && !alreadyWarned[key]) {\n    alreadyWarned[key] = true;\n    warning(false, message);\n  }\n}\n","import type {\n  InitialEntry,\n  LazyRouteFunction,\n  Location,\n  MemoryHistory,\n  RelativeRoutingType,\n  Router as RemixRouter,\n  RouterState,\n  RouterSubscriber,\n  To,\n  TrackedPromise,\n} from \"@remix-run/router\";\nimport {\n  AbortedDeferredError,\n  Action as NavigationType,\n  createMemoryHistory,\n  UNSAFE_getResolveToMatches as getResolveToMatches,\n  UNSAFE_invariant as invariant,\n  parsePath,\n  resolveTo,\n  stripBasename,\n  UNSAFE_warning as warning,\n} from \"@remix-run/router\";\nimport * as React from \"react\";\n\nimport type {\n  DataRouteObject,\n  IndexRouteObject,\n  Navigator,\n  NonIndexRouteObject,\n  RouteMatch,\n  RouteObject,\n} from \"./context\";\nimport {\n  AwaitContext,\n  DataRouterContext,\n  DataRouterStateContext,\n  LocationContext,\n  NavigationContext,\n  RouteContext,\n} from \"./context\";\nimport {\n  _renderMatches,\n  useAsyncValue,\n  useInRouterContext,\n  useLocation,\n  useNavigate,\n  useOutlet,\n  useRoutes,\n  useRoutesImpl,\n} from \"./hooks\";\n\nexport interface FutureConfig {\n  v7_relativeSplatPath: boolean;\n  v7_startTransition: boolean;\n}\n\nexport interface RouterProviderProps {\n  fallbackElement?: React.ReactNode;\n  router: RemixRouter;\n  // Only accept future flags relevant to rendering behavior\n  // routing flags should be accessed via router.future\n  future?: Partial<Pick<FutureConfig, \"v7_startTransition\">>;\n}\n\n/**\n  Webpack + React 17 fails to compile on any of the following because webpack\n  complains that `startTransition` doesn't exist in `React`:\n  * import { startTransition } from \"react\"\n  * import * as React from from \"react\";\n    \"startTransition\" in React ? React.startTransition(() => setState()) : setState()\n  * import * as React from from \"react\";\n    \"startTransition\" in React ? React[\"startTransition\"](() => setState()) : setState()\n\n  Moving it to a constant such as the following solves the Webpack/React 17 issue:\n  * import * as React from from \"react\";\n    const START_TRANSITION = \"startTransition\";\n    START_TRANSITION in React ? React[START_TRANSITION](() => setState()) : setState()\n\n  However, that introduces webpack/terser minification issues in production builds\n  in React 18 where minification/obfuscation ends up removing the call of\n  React.startTransition entirely from the first half of the ternary.  Grabbing\n  this exported reference once up front resolves that issue.\n\n  See https://github.com/remix-run/react-router/issues/10579\n*/\nconst START_TRANSITION = \"startTransition\";\nconst startTransitionImpl = React[START_TRANSITION];\n\n/**\n * Given a Remix Router instance, render the appropriate UI\n */\nexport function RouterProvider({\n  fallbackElement,\n  router,\n  future,\n}: RouterProviderProps): React.ReactElement {\n  let [state, setStateImpl] = React.useState(router.state);\n  let { v7_startTransition } = future || {};\n\n  let setState = React.useCallback<RouterSubscriber>(\n    (newState: RouterState) => {\n      if (v7_startTransition && startTransitionImpl) {\n        startTransitionImpl(() => setStateImpl(newState));\n      } else {\n        setStateImpl(newState);\n      }\n    },\n    [setStateImpl, v7_startTransition]\n  );\n\n  // Need to use a layout effect here so we are subscribed early enough to\n  // pick up on any render-driven redirects/navigations (useEffect/<Navigate>)\n  React.useLayoutEffect(() => router.subscribe(setState), [router, setState]);\n\n  React.useEffect(() => {\n    warning(\n      fallbackElement == null || !router.future.v7_partialHydration,\n      \"`<RouterProvider fallbackElement>` is deprecated when using \" +\n        \"`v7_partialHydration`, use a `HydrateFallback` component instead\"\n    );\n    // Only log this once on initial mount\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  let navigator = React.useMemo((): Navigator => {\n    return {\n      createHref: router.createHref,\n      encodeLocation: router.encodeLocation,\n      go: (n) => router.navigate(n),\n      push: (to, state, opts) =>\n        router.navigate(to, {\n          state,\n          preventScrollReset: opts?.preventScrollReset,\n        }),\n      replace: (to, state, opts) =>\n        router.navigate(to, {\n          replace: true,\n          state,\n          preventScrollReset: opts?.preventScrollReset,\n        }),\n    };\n  }, [router]);\n\n  let basename = router.basename || \"/\";\n\n  let dataRouterContext = React.useMemo(\n    () => ({\n      router,\n      navigator,\n      static: false,\n      basename,\n    }),\n    [router, navigator, basename]\n  );\n\n  // The fragment and {null} here are important!  We need them to keep React 18's\n  // useId happy when we are server-rendering since we may have a <script> here\n  // containing the hydrated server-side staticContext (from StaticRouterProvider).\n  // useId relies on the component tree structure to generate deterministic id's\n  // so we need to ensure it remains the same on the client even though\n  // we don't need the <script> tag\n  return (\n    <>\n      <DataRouterContext.Provider value={dataRouterContext}>\n        <DataRouterStateContext.Provider value={state}>\n          <Router\n            basename={basename}\n            location={state.location}\n            navigationType={state.historyAction}\n            navigator={navigator}\n            future={{\n              v7_relativeSplatPath: router.future.v7_relativeSplatPath,\n            }}\n          >\n            {state.initialized || router.future.v7_partialHydration ? (\n              <DataRoutes\n                routes={router.routes}\n                future={router.future}\n                state={state}\n              />\n            ) : (\n              fallbackElement\n            )}\n          </Router>\n        </DataRouterStateContext.Provider>\n      </DataRouterContext.Provider>\n      {null}\n    </>\n  );\n}\n\nfunction DataRoutes({\n  routes,\n  future,\n  state,\n}: {\n  routes: DataRouteObject[];\n  future: RemixRouter[\"future\"];\n  state: RouterState;\n}): React.ReactElement | null {\n  return useRoutesImpl(routes, undefined, state, future);\n}\n\nexport interface MemoryRouterProps {\n  basename?: string;\n  children?: React.ReactNode;\n  initialEntries?: InitialEntry[];\n  initialIndex?: number;\n  future?: Partial<FutureConfig>;\n}\n\n/**\n * A `<Router>` that stores all entries in memory.\n *\n * @see https://reactrouter.com/router-components/memory-router\n */\nexport function MemoryRouter({\n  basename,\n  children,\n  initialEntries,\n  initialIndex,\n  future,\n}: MemoryRouterProps): React.ReactElement {\n  let historyRef = React.useRef<MemoryHistory>();\n  if (historyRef.current == null) {\n    historyRef.current = createMemoryHistory({\n      initialEntries,\n      initialIndex,\n      v5Compat: true,\n    });\n  }\n\n  let history = historyRef.current;\n  let [state, setStateImpl] = React.useState({\n    action: history.action,\n    location: history.location,\n  });\n  let { v7_startTransition } = future || {};\n  let setState = React.useCallback(\n    (newState: { action: NavigationType; location: Location }) => {\n      v7_startTransition && startTransitionImpl\n        ? startTransitionImpl(() => setStateImpl(newState))\n        : setStateImpl(newState);\n    },\n    [setStateImpl, v7_startTransition]\n  );\n\n  React.useLayoutEffect(() => history.listen(setState), [history, setState]);\n\n  return (\n    <Router\n      basename={basename}\n      children={children}\n      location={state.location}\n      navigationType={state.action}\n      navigator={history}\n      future={future}\n    />\n  );\n}\n\nexport interface NavigateProps {\n  to: To;\n  replace?: boolean;\n  state?: any;\n  relative?: RelativeRoutingType;\n}\n\n/**\n * Changes the current location.\n *\n * Note: This API is mostly useful in React.Component subclasses that are not\n * able to use hooks. In functional components, we recommend you use the\n * `useNavigate` hook instead.\n *\n * @see https://reactrouter.com/components/navigate\n */\nexport function Navigate({\n  to,\n  replace,\n  state,\n  relative,\n}: NavigateProps): null {\n  invariant(\n    useInRouterContext(),\n    // TODO: This error is probably because they somehow have 2 versions of\n    // the router loaded. We can help them understand how to avoid that.\n    `<Navigate> may be used only in the context of a <Router> component.`\n  );\n\n  let { future, static: isStatic } = React.useContext(NavigationContext);\n\n  warning(\n    !isStatic,\n    `<Navigate> must not be used on the initial render in a <StaticRouter>. ` +\n      `This is a no-op, but you should modify your code so the <Navigate> is ` +\n      `only ever rendered in response to some user interaction or state change.`\n  );\n\n  let { matches } = React.useContext(RouteContext);\n  let { pathname: locationPathname } = useLocation();\n  let navigate = useNavigate();\n\n  // Resolve the path outside of the effect so that when effects run twice in\n  // StrictMode they navigate to the same place\n  let path = resolveTo(\n    to,\n    getResolveToMatches(matches, future.v7_relativeSplatPath),\n    locationPathname,\n    relative === \"path\"\n  );\n  let jsonPath = JSON.stringify(path);\n\n  React.useEffect(\n    () => navigate(JSON.parse(jsonPath), { replace, state, relative }),\n    [navigate, jsonPath, relative, replace, state]\n  );\n\n  return null;\n}\n\nexport interface OutletProps {\n  context?: unknown;\n}\n\n/**\n * Renders the child route's element, if there is one.\n *\n * @see https://reactrouter.com/components/outlet\n */\nexport function Outlet(props: OutletProps): React.ReactElement | null {\n  return useOutlet(props.context);\n}\n\nexport interface PathRouteProps {\n  caseSensitive?: NonIndexRouteObject[\"caseSensitive\"];\n  path?: NonIndexRouteObject[\"path\"];\n  id?: NonIndexRouteObject[\"id\"];\n  lazy?: LazyRouteFunction<NonIndexRouteObject>;\n  loader?: NonIndexRouteObject[\"loader\"];\n  action?: NonIndexRouteObject[\"action\"];\n  hasErrorBoundary?: NonIndexRouteObject[\"hasErrorBoundary\"];\n  shouldRevalidate?: NonIndexRouteObject[\"shouldRevalidate\"];\n  handle?: NonIndexRouteObject[\"handle\"];\n  index?: false;\n  children?: React.ReactNode;\n  element?: React.ReactNode | null;\n  hydrateFallbackElement?: React.ReactNode | null;\n  errorElement?: React.ReactNode | null;\n  Component?: React.ComponentType | null;\n  HydrateFallback?: React.ComponentType | null;\n  ErrorBoundary?: React.ComponentType | null;\n}\n\nexport interface LayoutRouteProps extends PathRouteProps {}\n\nexport interface IndexRouteProps {\n  caseSensitive?: IndexRouteObject[\"caseSensitive\"];\n  path?: IndexRouteObject[\"path\"];\n  id?: IndexRouteObject[\"id\"];\n  lazy?: LazyRouteFunction<IndexRouteObject>;\n  loader?: IndexRouteObject[\"loader\"];\n  action?: IndexRouteObject[\"action\"];\n  hasErrorBoundary?: IndexRouteObject[\"hasErrorBoundary\"];\n  shouldRevalidate?: IndexRouteObject[\"shouldRevalidate\"];\n  handle?: IndexRouteObject[\"handle\"];\n  index: true;\n  children?: undefined;\n  element?: React.ReactNode | null;\n  hydrateFallbackElement?: React.ReactNode | null;\n  errorElement?: React.ReactNode | null;\n  Component?: React.ComponentType | null;\n  HydrateFallback?: React.ComponentType | null;\n  ErrorBoundary?: React.ComponentType | null;\n}\n\nexport type RouteProps = PathRouteProps | LayoutRouteProps | IndexRouteProps;\n\n/**\n * Declares an element that should be rendered at a certain URL path.\n *\n * @see https://reactrouter.com/components/route\n */\nexport function Route(_props: RouteProps): React.ReactElement | null {\n  invariant(\n    false,\n    `A <Route> is only ever to be used as the child of <Routes> element, ` +\n      `never rendered directly. Please wrap your <Route> in a <Routes>.`\n  );\n}\n\nexport interface RouterProps {\n  basename?: string;\n  children?: React.ReactNode;\n  location: Partial<Location> | string;\n  navigationType?: NavigationType;\n  navigator: Navigator;\n  static?: boolean;\n  future?: Partial<Pick<FutureConfig, \"v7_relativeSplatPath\">>;\n}\n\n/**\n * Provides location context for the rest of the app.\n *\n * Note: You usually won't render a `<Router>` directly. Instead, you'll render a\n * router that is more specific to your environment such as a `<BrowserRouter>`\n * in web browsers or a `<StaticRouter>` for server rendering.\n *\n * @see https://reactrouter.com/router-components/router\n */\nexport function Router({\n  basename: basenameProp = \"/\",\n  children = null,\n  location: locationProp,\n  navigationType = NavigationType.Pop,\n  navigator,\n  static: staticProp = false,\n  future,\n}: RouterProps): React.ReactElement | null {\n  invariant(\n    !useInRouterContext(),\n    `You cannot render a <Router> inside another <Router>.` +\n      ` You should never have more than one in your app.`\n  );\n\n  // Preserve trailing slashes on basename, so we can let the user control\n  // the enforcement of trailing slashes throughout the app\n  let basename = basenameProp.replace(/^\\/*/, \"/\");\n  let navigationContext = React.useMemo(\n    () => ({\n      basename,\n      navigator,\n      static: staticProp,\n      future: {\n        v7_relativeSplatPath: false,\n        ...future,\n      },\n    }),\n    [basename, future, navigator, staticProp]\n  );\n\n  if (typeof locationProp === \"string\") {\n    locationProp = parsePath(locationProp);\n  }\n\n  let {\n    pathname = \"/\",\n    search = \"\",\n    hash = \"\",\n    state = null,\n    key = \"default\",\n  } = locationProp;\n\n  let locationContext = React.useMemo(() => {\n    let trailingPathname = stripBasename(pathname, basename);\n\n    if (trailingPathname == null) {\n      return null;\n    }\n\n    return {\n      location: {\n        pathname: trailingPathname,\n        search,\n        hash,\n        state,\n        key,\n      },\n      navigationType,\n    };\n  }, [basename, pathname, search, hash, state, key, navigationType]);\n\n  warning(\n    locationContext != null,\n    `<Router basename=\"${basename}\"> is not able to match the URL ` +\n      `\"${pathname}${search}${hash}\" because it does not start with the ` +\n      `basename, so the <Router> won't render anything.`\n  );\n\n  if (locationContext == null) {\n    return null;\n  }\n\n  return (\n    <NavigationContext.Provider value={navigationContext}>\n      <LocationContext.Provider children={children} value={locationContext} />\n    </NavigationContext.Provider>\n  );\n}\n\nexport interface RoutesProps {\n  children?: React.ReactNode;\n  location?: Partial<Location> | string;\n}\n\n/**\n * A container for a nested tree of `<Route>` elements that renders the branch\n * that best matches the current location.\n *\n * @see https://reactrouter.com/components/routes\n */\nexport function Routes({\n  children,\n  location,\n}: RoutesProps): React.ReactElement | null {\n  return useRoutes(createRoutesFromChildren(children), location);\n}\n\nexport interface AwaitResolveRenderFunction {\n  (data: Awaited<any>): React.ReactNode;\n}\n\nexport interface AwaitProps {\n  children: React.ReactNode | AwaitResolveRenderFunction;\n  errorElement?: React.ReactNode;\n  resolve: TrackedPromise | any;\n}\n\n/**\n * Component to use for rendering lazily loaded data from returning defer()\n * in a loader function\n */\nexport function Await({ children, errorElement, resolve }: AwaitProps) {\n  return (\n    <AwaitErrorBoundary resolve={resolve} errorElement={errorElement}>\n      <ResolveAwait>{children}</ResolveAwait>\n    </AwaitErrorBoundary>\n  );\n}\n\ntype AwaitErrorBoundaryProps = React.PropsWithChildren<{\n  errorElement?: React.ReactNode;\n  resolve: TrackedPromise | any;\n}>;\n\ntype AwaitErrorBoundaryState = {\n  error: any;\n};\n\nenum AwaitRenderStatus {\n  pending,\n  success,\n  error,\n}\n\nconst neverSettledPromise = new Promise(() => {});\n\nclass AwaitErrorBoundary extends React.Component<\n  AwaitErrorBoundaryProps,\n  AwaitErrorBoundaryState\n> {\n  constructor(props: AwaitErrorBoundaryProps) {\n    super(props);\n    this.state = { error: null };\n  }\n\n  static getDerivedStateFromError(error: any) {\n    return { error };\n  }\n\n  componentDidCatch(error: any, errorInfo: any) {\n    console.error(\n      \"<Await> caught the following error during render\",\n      error,\n      errorInfo\n    );\n  }\n\n  render() {\n    let { children, errorElement, resolve } = this.props;\n\n    let promise: TrackedPromise | null = null;\n    let status: AwaitRenderStatus = AwaitRenderStatus.pending;\n\n    if (!(resolve instanceof Promise)) {\n      // Didn't get a promise - provide as a resolved promise\n      status = AwaitRenderStatus.success;\n      promise = Promise.resolve();\n      Object.defineProperty(promise, \"_tracked\", { get: () => true });\n      Object.defineProperty(promise, \"_data\", { get: () => resolve });\n    } else if (this.state.error) {\n      // Caught a render error, provide it as a rejected promise\n      status = AwaitRenderStatus.error;\n      let renderError = this.state.error;\n      promise = Promise.reject().catch(() => {}); // Avoid unhandled rejection warnings\n      Object.defineProperty(promise, \"_tracked\", { get: () => true });\n      Object.defineProperty(promise, \"_error\", { get: () => renderError });\n    } else if ((resolve as TrackedPromise)._tracked) {\n      // Already tracked promise - check contents\n      promise = resolve;\n      status =\n        \"_error\" in promise\n          ? AwaitRenderStatus.error\n          : \"_data\" in promise\n          ? AwaitRenderStatus.success\n          : AwaitRenderStatus.pending;\n    } else {\n      // Raw (untracked) promise - track it\n      status = AwaitRenderStatus.pending;\n      Object.defineProperty(resolve, \"_tracked\", { get: () => true });\n      promise = resolve.then(\n        (data: any) =>\n          Object.defineProperty(resolve, \"_data\", { get: () => data }),\n        (error: any) =>\n          Object.defineProperty(resolve, \"_error\", { get: () => error })\n      );\n    }\n\n    if (\n      status === AwaitRenderStatus.error &&\n      promise._error instanceof AbortedDeferredError\n    ) {\n      // Freeze the UI by throwing a never resolved promise\n      throw neverSettledPromise;\n    }\n\n    if (status === AwaitRenderStatus.error && !errorElement) {\n      // No errorElement, throw to the nearest route-level error boundary\n      throw promise._error;\n    }\n\n    if (status === AwaitRenderStatus.error) {\n      // Render via our errorElement\n      return <AwaitContext.Provider value={promise} children={errorElement} />;\n    }\n\n    if (status === AwaitRenderStatus.success) {\n      // Render children with resolved value\n      return <AwaitContext.Provider value={promise} children={children} />;\n    }\n\n    // Throw to the suspense boundary\n    throw promise;\n  }\n}\n\n/**\n * @private\n * Indirection to leverage useAsyncValue for a render-prop API on `<Await>`\n */\nfunction ResolveAwait({\n  children,\n}: {\n  children: React.ReactNode | AwaitResolveRenderFunction;\n}) {\n  let data = useAsyncValue();\n  let toRender = typeof children === \"function\" ? children(data) : children;\n  return <>{toRender}</>;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// UTILS\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Creates a route config from a React \"children\" object, which is usually\n * either a `<Route>` element or an array of them. Used internally by\n * `<Routes>` to create a route config from its children.\n *\n * @see https://reactrouter.com/utils/create-routes-from-children\n */\nexport function createRoutesFromChildren(\n  children: React.ReactNode,\n  parentPath: number[] = []\n): RouteObject[] {\n  let routes: RouteObject[] = [];\n\n  React.Children.forEach(children, (element, index) => {\n    if (!React.isValidElement(element)) {\n      // Ignore non-elements. This allows people to more easily inline\n      // conditionals in their route config.\n      return;\n    }\n\n    let treePath = [...parentPath, index];\n\n    if (element.type === React.Fragment) {\n      // Transparently support React.Fragment and its children.\n      routes.push.apply(\n        routes,\n        createRoutesFromChildren(element.props.children, treePath)\n      );\n      return;\n    }\n\n    invariant(\n      element.type === Route,\n      `[${\n        typeof element.type === \"string\" ? element.type : element.type.name\n      }] is not a <Route> component. All component children of <Routes> must be a <Route> or <React.Fragment>`\n    );\n\n    invariant(\n      !element.props.index || !element.props.children,\n      \"An index route cannot have child routes.\"\n    );\n\n    let route: RouteObject = {\n      id: element.props.id || treePath.join(\"-\"),\n      caseSensitive: element.props.caseSensitive,\n      element: element.props.element,\n      Component: element.props.Component,\n      index: element.props.index,\n      path: element.props.path,\n      loader: element.props.loader,\n      action: element.props.action,\n      errorElement: element.props.errorElement,\n      ErrorBoundary: element.props.ErrorBoundary,\n      hasErrorBoundary:\n        element.props.ErrorBoundary != null ||\n        element.props.errorElement != null,\n      shouldRevalidate: element.props.shouldRevalidate,\n      handle: element.props.handle,\n      lazy: element.props.lazy,\n    };\n\n    if (element.props.children) {\n      route.children = createRoutesFromChildren(\n        element.props.children,\n        treePath\n      );\n    }\n\n    routes.push(route);\n  });\n\n  return routes;\n}\n\n/**\n * Renders the result of `matchRoutes()` into a React element.\n */\nexport function renderMatches(\n  matches: RouteMatch[] | null\n): React.ReactElement | null {\n  return _renderMatches(matches);\n}\n","import * as React from \"react\";\nimport type {\n  ActionFunction,\n  ActionFunctionArgs,\n  Blocker,\n  BlockerFunction,\n  unstable_DataStrategyFunction,\n  unstable_DataStrategyFunctionArgs,\n  unstable_DataStrategyMatch,\n  ErrorResponse,\n  Fetcher,\n  HydrationState,\n  InitialEntry,\n  JsonFunction,\n  LazyRouteFunction,\n  LoaderFunction,\n  LoaderFunctionArgs,\n  Location,\n  Navigation,\n  ParamParseKey,\n  Params,\n  Path,\n  PathMatch,\n  PathParam,\n  PathPattern,\n  RedirectFunction,\n  RelativeRoutingType,\n  Router as RemixRouter,\n  FutureConfig as RouterFutureConfig,\n  ShouldRevalidateFunction,\n  ShouldRevalidateFunctionArgs,\n  To,\n  UIMatch,\n  unstable_HandlerResult,\n} from \"@remix-run/router\";\nimport {\n  AbortedDeferredError,\n  Action as NavigationType,\n  createMemoryHistory,\n  createPath,\n  createRouter,\n  defer,\n  generatePath,\n  isRouteErrorResponse,\n  json,\n  matchPath,\n  matchRoutes,\n  parsePath,\n  redirect,\n  redirectDocument,\n  resolvePath,\n  UNSAFE_warning as warning,\n} from \"@remix-run/router\";\n\nimport type {\n  AwaitProps,\n  FutureConfig,\n  IndexRouteProps,\n  LayoutRouteProps,\n  MemoryRouterProps,\n  NavigateProps,\n  OutletProps,\n  PathRouteProps,\n  RouteProps,\n  RouterProps,\n  RouterProviderProps,\n  RoutesProps,\n} from \"./lib/components\";\nimport {\n  Await,\n  MemoryRouter,\n  Navigate,\n  Outlet,\n  Route,\n  Router,\n  RouterProvider,\n  Routes,\n  createRoutesFromChildren,\n  renderMatches,\n} from \"./lib/components\";\nimport type {\n  DataRouteMatch,\n  DataRouteObject,\n  IndexRouteObject,\n  NavigateOptions,\n  Navigator,\n  NonIndexRouteObject,\n  RouteMatch,\n  RouteObject,\n} from \"./lib/context\";\nimport {\n  DataRouterContext,\n  DataRouterStateContext,\n  LocationContext,\n  NavigationContext,\n  RouteContext,\n} from \"./lib/context\";\nimport type { NavigateFunction } from \"./lib/hooks\";\nimport {\n  useActionData,\n  useAsyncError,\n  useAsyncValue,\n  useBlocker,\n  useHref,\n  useInRouterContext,\n  useLoaderData,\n  useLocation,\n  useMatch,\n  useMatches,\n  useNavigate,\n  useNavigation,\n  useNavigationType,\n  useOutlet,\n  useOutletContext,\n  useParams,\n  useResolvedPath,\n  useRevalidator,\n  useRouteError,\n  useRouteId,\n  useRouteLoaderData,\n  useRoutes,\n  useRoutesImpl,\n} from \"./lib/hooks\";\n\n// Exported for backwards compatibility, but not being used internally anymore\ntype Hash = string;\ntype Pathname = string;\ntype Search = string;\n\n// Expose react-router public API\nexport type {\n  ActionFunction,\n  ActionFunctionArgs,\n  AwaitProps,\n  DataRouteMatch,\n  DataRouteObject,\n  unstable_DataStrategyFunction,\n  unstable_DataStrategyFunctionArgs,\n  unstable_DataStrategyMatch,\n  ErrorResponse,\n  Fetcher,\n  FutureConfig,\n  Hash,\n  IndexRouteObject,\n  IndexRouteProps,\n  JsonFunction,\n  LayoutRouteProps,\n  LazyRouteFunction,\n  LoaderFunction,\n  LoaderFunctionArgs,\n  Location,\n  MemoryRouterProps,\n  NavigateFunction,\n  NavigateOptions,\n  NavigateProps,\n  Navigation,\n  Navigator,\n  NonIndexRouteObject,\n  OutletProps,\n  ParamParseKey,\n  Params,\n  Path,\n  PathMatch,\n  PathParam,\n  PathPattern,\n  PathRouteProps,\n  Pathname,\n  RedirectFunction,\n  RelativeRoutingType,\n  RouteMatch,\n  RouteObject,\n  RouteProps,\n  RouterProps,\n  RouterProviderProps,\n  RoutesProps,\n  Search,\n  ShouldRevalidateFunction,\n  ShouldRevalidateFunctionArgs,\n  To,\n  UIMatch,\n  Blocker,\n  BlockerFunction,\n  unstable_HandlerResult,\n};\nexport {\n  AbortedDeferredError,\n  Await,\n  MemoryRouter,\n  Navigate,\n  NavigationType,\n  Outlet,\n  Route,\n  Router,\n  RouterProvider,\n  Routes,\n  createPath,\n  createRoutesFromChildren,\n  createRoutesFromChildren as createRoutesFromElements,\n  defer,\n  generatePath,\n  isRouteErrorResponse,\n  json,\n  matchPath,\n  matchRoutes,\n  parsePath,\n  redirect,\n  redirectDocument,\n  renderMatches,\n  resolvePath,\n  useBlocker,\n  useActionData,\n  useAsyncError,\n  useAsyncValue,\n  useHref,\n  useInRouterContext,\n  useLoaderData,\n  useLocation,\n  useMatch,\n  useMatches,\n  useNavigate,\n  useNavigation,\n  useNavigationType,\n  useOutlet,\n  useOutletContext,\n  useParams,\n  useResolvedPath,\n  useRevalidator,\n  useRouteError,\n  useRouteLoaderData,\n  useRoutes,\n};\n\nfunction mapRouteProperties(route: RouteObject) {\n  let updates: Partial<RouteObject> & { hasErrorBoundary: boolean } = {\n    // Note: this check also occurs in createRoutesFromChildren so update\n    // there if you change this -- please and thank you!\n    hasErrorBoundary: route.ErrorBoundary != null || route.errorElement != null,\n  };\n\n  if (route.Component) {\n    if (__DEV__) {\n      if (route.element) {\n        warning(\n          false,\n          \"You should not include both `Component` and `element` on your route - \" +\n            \"`Component` will be used.\"\n        );\n      }\n    }\n    Object.assign(updates, {\n      element: React.createElement(route.Component),\n      Component: undefined,\n    });\n  }\n\n  if (route.HydrateFallback) {\n    if (__DEV__) {\n      if (route.hydrateFallbackElement) {\n        warning(\n          false,\n          \"You should not include both `HydrateFallback` and `hydrateFallbackElement` on your route - \" +\n            \"`HydrateFallback` will be used.\"\n        );\n      }\n    }\n    Object.assign(updates, {\n      hydrateFallbackElement: React.createElement(route.HydrateFallback),\n      HydrateFallback: undefined,\n    });\n  }\n\n  if (route.ErrorBoundary) {\n    if (__DEV__) {\n      if (route.errorElement) {\n        warning(\n          false,\n          \"You should not include both `ErrorBoundary` and `errorElement` on your route - \" +\n            \"`ErrorBoundary` will be used.\"\n        );\n      }\n    }\n    Object.assign(updates, {\n      errorElement: React.createElement(route.ErrorBoundary),\n      ErrorBoundary: undefined,\n    });\n  }\n\n  return updates;\n}\n\nexport function createMemoryRouter(\n  routes: RouteObject[],\n  opts?: {\n    basename?: string;\n    future?: Partial<Omit<RouterFutureConfig, \"v7_prependBasename\">>;\n    hydrationData?: HydrationState;\n    initialEntries?: InitialEntry[];\n    initialIndex?: number;\n    unstable_dataStrategy?: unstable_DataStrategyFunction;\n  }\n): RemixRouter {\n  return createRouter({\n    basename: opts?.basename,\n    future: {\n      ...opts?.future,\n      v7_prependBasename: true,\n    },\n    history: createMemoryHistory({\n      initialEntries: opts?.initialEntries,\n      initialIndex: opts?.initialIndex,\n    }),\n    hydrationData: opts?.hydrationData,\n    routes,\n    mapRouteProperties,\n    unstable_dataStrategy: opts?.unstable_dataStrategy,\n  }).initialize();\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// DANGER! PLEASE READ ME!\n// We provide these exports as an escape hatch in the event that you need any\n// routing data that we don't provide an explicit API for. With that said, we\n// want to cover your use case if we can, so if you feel the need to use these\n// we want to hear from you. Let us know what you're building and we'll do our\n// best to make sure we can support you!\n//\n// We consider these exports an implementation detail and do not guarantee\n// against any breaking changes, regardless of the semver release. Use with\n// extreme caution and only if you understand the consequences. Godspeed.\n///////////////////////////////////////////////////////////////////////////////\n\n/** @internal */\nexport {\n  DataRouterContext as UNSAFE_DataRouterContext,\n  DataRouterStateContext as UNSAFE_DataRouterStateContext,\n  LocationContext as UNSAFE_LocationContext,\n  NavigationContext as UNSAFE_NavigationContext,\n  RouteContext as UNSAFE_RouteContext,\n  mapRouteProperties as UNSAFE_mapRouteProperties,\n  useRouteId as UNSAFE_useRouteId,\n  useRoutesImpl as UNSAFE_useRoutesImpl,\n};\n","import type {\n  FormEncType,\n  HTMLFormMethod,\n  RelativeRoutingType,\n} from \"@remix-run/router\";\nimport { stripBasename, UNSAFE_warning as warning } from \"@remix-run/router\";\n\nexport const defaultMethod: HTMLFormMethod = \"get\";\nconst defaultEncType: FormEncType = \"application/x-www-form-urlencoded\";\n\nexport function isHtmlElement(object: any): object is HTMLElement {\n  return object != null && typeof object.tagName === \"string\";\n}\n\nexport function isButtonElement(object: any): object is HTMLButtonElement {\n  return isHtmlElement(object) && object.tagName.toLowerCase() === \"button\";\n}\n\nexport function isFormElement(object: any): object is HTMLFormElement {\n  return isHtmlElement(object) && object.tagName.toLowerCase() === \"form\";\n}\n\nexport function isInputElement(object: any): object is HTMLInputElement {\n  return isHtmlElement(object) && object.tagName.toLowerCase() === \"input\";\n}\n\ntype LimitedMouseEvent = Pick<\n  MouseEvent,\n  \"button\" | \"metaKey\" | \"altKey\" | \"ctrlKey\" | \"shiftKey\"\n>;\n\nfunction isModifiedEvent(event: LimitedMouseEvent) {\n  return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\n\nexport function shouldProcessLinkClick(\n  event: LimitedMouseEvent,\n  target?: string\n) {\n  return (\n    event.button === 0 && // Ignore everything but left clicks\n    (!target || target === \"_self\") && // Let browser handle \"target=_blank\" etc.\n    !isModifiedEvent(event) // Ignore clicks with modifier keys\n  );\n}\n\nexport type ParamKeyValuePair = [string, string];\n\nexport type URLSearchParamsInit =\n  | string\n  | ParamKeyValuePair[]\n  | Record<string, string | string[]>\n  | URLSearchParams;\n\n/**\n * Creates a URLSearchParams object using the given initializer.\n *\n * This is identical to `new URLSearchParams(init)` except it also\n * supports arrays as values in the object form of the initializer\n * instead of just strings. This is convenient when you need multiple\n * values for a given key, but don't want to use an array initializer.\n *\n * For example, instead of:\n *\n *   let searchParams = new URLSearchParams([\n *     ['sort', 'name'],\n *     ['sort', 'price']\n *   ]);\n *\n * you can do:\n *\n *   let searchParams = createSearchParams({\n *     sort: ['name', 'price']\n *   });\n */\nexport function createSearchParams(\n  init: URLSearchParamsInit = \"\"\n): URLSearchParams {\n  return new URLSearchParams(\n    typeof init === \"string\" ||\n    Array.isArray(init) ||\n    init instanceof URLSearchParams\n      ? init\n      : Object.keys(init).reduce((memo, key) => {\n          let value = init[key];\n          return memo.concat(\n            Array.isArray(value) ? value.map((v) => [key, v]) : [[key, value]]\n          );\n        }, [] as ParamKeyValuePair[])\n  );\n}\n\nexport function getSearchParamsForLocation(\n  locationSearch: string,\n  defaultSearchParams: URLSearchParams | null\n) {\n  let searchParams = createSearchParams(locationSearch);\n\n  if (defaultSearchParams) {\n    // Use `defaultSearchParams.forEach(...)` here instead of iterating of\n    // `defaultSearchParams.keys()` to work-around a bug in Firefox related to\n    // web extensions. Relevant Bugzilla tickets:\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=1414602\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=1023984\n    defaultSearchParams.forEach((_, key) => {\n      if (!searchParams.has(key)) {\n        defaultSearchParams.getAll(key).forEach((value) => {\n          searchParams.append(key, value);\n        });\n      }\n    });\n  }\n\n  return searchParams;\n}\n\n// Thanks https://github.com/sindresorhus/type-fest!\ntype JsonObject = { [Key in string]: JsonValue } & {\n  [Key in string]?: JsonValue | undefined;\n};\ntype JsonArray = JsonValue[] | readonly JsonValue[];\ntype JsonPrimitive = string | number | boolean | null;\ntype JsonValue = JsonPrimitive | JsonObject | JsonArray;\n\nexport type SubmitTarget =\n  | HTMLFormElement\n  | HTMLButtonElement\n  | HTMLInputElement\n  | FormData\n  | URLSearchParams\n  | JsonValue\n  | null;\n\n// One-time check for submitter support\nlet _formDataSupportsSubmitter: boolean | null = null;\n\nfunction isFormDataSubmitterSupported() {\n  if (_formDataSupportsSubmitter === null) {\n    try {\n      new FormData(\n        document.createElement(\"form\"),\n        // @ts-expect-error if FormData supports the submitter parameter, this will throw\n        0\n      );\n      _formDataSupportsSubmitter = false;\n    } catch (e) {\n      _formDataSupportsSubmitter = true;\n    }\n  }\n  return _formDataSupportsSubmitter;\n}\n\nexport interface SubmitOptions {\n  /**\n   * The HTTP method used to submit the form. Overrides `<form method>`.\n   * Defaults to \"GET\".\n   */\n  method?: HTMLFormMethod;\n\n  /**\n   * The action URL path used to submit the form. Overrides `<form action>`.\n   * Defaults to the path of the current route.\n   */\n  action?: string;\n\n  /**\n   * The encoding used to submit the form. Overrides `<form encType>`.\n   * Defaults to \"application/x-www-form-urlencoded\".\n   */\n  encType?: FormEncType;\n\n  /**\n   * Indicate a specific fetcherKey to use when using navigate=false\n   */\n  fetcherKey?: string;\n\n  /**\n   * navigate=false will use a fetcher instead of a navigation\n   */\n  navigate?: boolean;\n\n  /**\n   * Set `true` to replace the current entry in the browser's history stack\n   * instead of creating a new one (i.e. stay on \"the same page\"). Defaults\n   * to `false`.\n   */\n  replace?: boolean;\n\n  /**\n   * State object to add to the history stack entry for this navigation\n   */\n  state?: any;\n\n  /**\n   * Determines whether the form action is relative to the route hierarchy or\n   * the pathname.  Use this if you want to opt out of navigating the route\n   * hierarchy and want to instead route based on /-delimited URL segments\n   */\n  relative?: RelativeRoutingType;\n\n  /**\n   * In browser-based environments, prevent resetting scroll after this\n   * navigation when using the <ScrollRestoration> component\n   */\n  preventScrollReset?: boolean;\n\n  /**\n   * Enable flushSync for this navigation's state updates\n   */\n  unstable_flushSync?: boolean;\n\n  /**\n   * Enable view transitions on this submission navigation\n   */\n  unstable_viewTransition?: boolean;\n}\n\nconst supportedFormEncTypes: Set<FormEncType> = new Set([\n  \"application/x-www-form-urlencoded\",\n  \"multipart/form-data\",\n  \"text/plain\",\n]);\n\nfunction getFormEncType(encType: string | null) {\n  if (encType != null && !supportedFormEncTypes.has(encType as FormEncType)) {\n    warning(\n      false,\n      `\"${encType}\" is not a valid \\`encType\\` for \\`<Form>\\`/\\`<fetcher.Form>\\` ` +\n        `and will default to \"${defaultEncType}\"`\n    );\n\n    return null;\n  }\n  return encType;\n}\n\nexport function getFormSubmissionInfo(\n  target: SubmitTarget,\n  basename: string\n): {\n  action: string | null;\n  method: string;\n  encType: string;\n  formData: FormData | undefined;\n  body: any;\n} {\n  let method: string;\n  let action: string | null;\n  let encType: string;\n  let formData: FormData | undefined;\n  let body: any;\n\n  if (isFormElement(target)) {\n    // When grabbing the action from the element, it will have had the basename\n    // prefixed to ensure non-JS scenarios work, so strip it since we'll\n    // re-prefix in the router\n    let attr = target.getAttribute(\"action\");\n    action = attr ? stripBasename(attr, basename) : null;\n    method = target.getAttribute(\"method\") || defaultMethod;\n    encType = getFormEncType(target.getAttribute(\"enctype\")) || defaultEncType;\n\n    formData = new FormData(target);\n  } else if (\n    isButtonElement(target) ||\n    (isInputElement(target) &&\n      (target.type === \"submit\" || target.type === \"image\"))\n  ) {\n    let form = target.form;\n\n    if (form == null) {\n      throw new Error(\n        `Cannot submit a <button> or <input type=\"submit\"> without a <form>`\n      );\n    }\n\n    // <button>/<input type=\"submit\"> may override attributes of <form>\n\n    // When grabbing the action from the element, it will have had the basename\n    // prefixed to ensure non-JS scenarios work, so strip it since we'll\n    // re-prefix in the router\n    let attr = target.getAttribute(\"formaction\") || form.getAttribute(\"action\");\n    action = attr ? stripBasename(attr, basename) : null;\n\n    method =\n      target.getAttribute(\"formmethod\") ||\n      form.getAttribute(\"method\") ||\n      defaultMethod;\n    encType =\n      getFormEncType(target.getAttribute(\"formenctype\")) ||\n      getFormEncType(form.getAttribute(\"enctype\")) ||\n      defaultEncType;\n\n    // Build a FormData object populated from a form and submitter\n    formData = new FormData(form, target);\n\n    // If this browser doesn't support the `FormData(el, submitter)` format,\n    // then tack on the submitter value at the end.  This is a lightweight\n    // solution that is not 100% spec compliant.  For complete support in older\n    // browsers, consider using the `formdata-submitter-polyfill` package\n    if (!isFormDataSubmitterSupported()) {\n      let { name, type, value } = target;\n      if (type === \"image\") {\n        let prefix = name ? `${name}.` : \"\";\n        formData.append(`${prefix}x`, \"0\");\n        formData.append(`${prefix}y`, \"0\");\n      } else if (name) {\n        formData.append(name, value);\n      }\n    }\n  } else if (isHtmlElement(target)) {\n    throw new Error(\n      `Cannot submit element that is not <form>, <button>, or ` +\n        `<input type=\"submit|image\">`\n    );\n  } else {\n    method = defaultMethod;\n    action = null;\n    encType = defaultEncType;\n    body = target;\n  }\n\n  // Send body for <Form encType=\"text/plain\" so we encode it into text\n  if (formData && encType === \"text/plain\") {\n    body = formData;\n    formData = undefined;\n  }\n\n  return { action, method: method.toLowerCase(), encType, formData, body };\n}\n","/**\n * NOTE: If you refactor this to split up the modules into separate files,\n * you'll need to update the rollup config for react-router-dom-v5-compat.\n */\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport type {\n  DataRouteObject,\n  FutureConfig,\n  Location,\n  NavigateOptions,\n  NavigationType,\n  Navigator,\n  RelativeRoutingType,\n  RouteObject,\n  RouterProviderProps,\n  To,\n} from \"react-router\";\nimport {\n  Router,\n  createPath,\n  useHref,\n  useLocation,\n  useMatches,\n  useNavigate,\n  useNavigation,\n  useResolvedPath,\n  useBlocker,\n  UNSAFE_DataRouterContext as DataRouterContext,\n  UNSAFE_DataRouterStateContext as DataRouterStateContext,\n  UNSAFE_NavigationContext as NavigationContext,\n  UNSAFE_RouteContext as RouteContext,\n  UNSAFE_mapRouteProperties as mapRouteProperties,\n  UNSAFE_useRouteId as useRouteId,\n  UNSAFE_useRoutesImpl as useRoutesImpl,\n} from \"react-router\";\nimport type {\n  BrowserHistory,\n  unstable_DataStrategyFunction,\n  unstable_DataStrategyFunctionArgs,\n  unstable_DataStrategyMatch,\n  Fetcher,\n  FormEncType,\n  FormMethod,\n  FutureConfig as RouterFutureConfig,\n  GetScrollRestorationKeyFunction,\n  HashHistory,\n  History,\n  HTMLFormMethod,\n  HydrationState,\n  Router as RemixRouter,\n  V7_FormMethod,\n  RouterState,\n  RouterSubscriber,\n  BlockerFunction,\n} from \"@remix-run/router\";\nimport {\n  createRouter,\n  createBrowserHistory,\n  createHashHistory,\n  joinPaths,\n  stripBasename,\n  UNSAFE_ErrorResponseImpl as ErrorResponseImpl,\n  UNSAFE_invariant as invariant,\n  UNSAFE_warning as warning,\n  matchPath,\n  IDLE_FETCHER,\n} from \"@remix-run/router\";\n\nimport type {\n  SubmitOptions,\n  ParamKeyValuePair,\n  URLSearchParamsInit,\n  SubmitTarget,\n} from \"./dom\";\nimport {\n  createSearchParams,\n  defaultMethod,\n  getFormSubmissionInfo,\n  getSearchParamsForLocation,\n  shouldProcessLinkClick,\n} from \"./dom\";\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Re-exports\n////////////////////////////////////////////////////////////////////////////////\n\nexport type {\n  unstable_DataStrategyFunction,\n  unstable_DataStrategyFunctionArgs,\n  unstable_DataStrategyMatch,\n  FormEncType,\n  FormMethod,\n  GetScrollRestorationKeyFunction,\n  ParamKeyValuePair,\n  SubmitOptions,\n  URLSearchParamsInit,\n  V7_FormMethod,\n};\nexport { createSearchParams, ErrorResponseImpl as UNSAFE_ErrorResponseImpl };\n\n// Note: Keep in sync with react-router exports!\nexport type {\n  ActionFunction,\n  ActionFunctionArgs,\n  AwaitProps,\n  Blocker,\n  BlockerFunction,\n  DataRouteMatch,\n  DataRouteObject,\n  ErrorResponse,\n  Fetcher,\n  FutureConfig,\n  Hash,\n  IndexRouteObject,\n  IndexRouteProps,\n  JsonFunction,\n  LazyRouteFunction,\n  LayoutRouteProps,\n  LoaderFunction,\n  LoaderFunctionArgs,\n  Location,\n  MemoryRouterProps,\n  NavigateFunction,\n  NavigateOptions,\n  NavigateProps,\n  Navigation,\n  Navigator,\n  NonIndexRouteObject,\n  OutletProps,\n  Params,\n  ParamParseKey,\n  Path,\n  PathMatch,\n  Pathname,\n  PathParam,\n  PathPattern,\n  PathRouteProps,\n  RedirectFunction,\n  RelativeRoutingType,\n  RouteMatch,\n  RouteObject,\n  RouteProps,\n  RouterProps,\n  RouterProviderProps,\n  RoutesProps,\n  Search,\n  ShouldRevalidateFunction,\n  ShouldRevalidateFunctionArgs,\n  To,\n  UIMatch,\n  unstable_HandlerResult,\n} from \"react-router\";\nexport {\n  AbortedDeferredError,\n  Await,\n  MemoryRouter,\n  Navigate,\n  NavigationType,\n  Outlet,\n  Route,\n  Router,\n  Routes,\n  createMemoryRouter,\n  createPath,\n  createRoutesFromChildren,\n  createRoutesFromElements,\n  defer,\n  isRouteErrorResponse,\n  generatePath,\n  json,\n  matchPath,\n  matchRoutes,\n  parsePath,\n  redirect,\n  redirectDocument,\n  renderMatches,\n  resolvePath,\n  useActionData,\n  useAsyncError,\n  useAsyncValue,\n  useBlocker,\n  useHref,\n  useInRouterContext,\n  useLoaderData,\n  useLocation,\n  useMatch,\n  useMatches,\n  useNavigate,\n  useNavigation,\n  useNavigationType,\n  useOutlet,\n  useOutletContext,\n  useParams,\n  useResolvedPath,\n  useRevalidator,\n  useRouteError,\n  useRouteLoaderData,\n  useRoutes,\n} from \"react-router\";\n\n///////////////////////////////////////////////////////////////////////////////\n// DANGER! PLEASE READ ME!\n// We provide these exports as an escape hatch in the event that you need any\n// routing data that we don't provide an explicit API for. With that said, we\n// want to cover your use case if we can, so if you feel the need to use these\n// we want to hear from you. Let us know what you're building and we'll do our\n// best to make sure we can support you!\n//\n// We consider these exports an implementation detail and do not guarantee\n// against any breaking changes, regardless of the semver release. Use with\n// extreme caution and only if you understand the consequences. Godspeed.\n///////////////////////////////////////////////////////////////////////////////\n\n/** @internal */\nexport {\n  UNSAFE_DataRouterContext,\n  UNSAFE_DataRouterStateContext,\n  UNSAFE_NavigationContext,\n  UNSAFE_LocationContext,\n  UNSAFE_RouteContext,\n  UNSAFE_useRouteId,\n} from \"react-router\";\n//#endregion\n\ndeclare global {\n  var __staticRouterHydrationData: HydrationState | undefined;\n  var __reactRouterVersion: string;\n  interface Document {\n    startViewTransition(cb: () => Promise<void> | void): ViewTransition;\n  }\n}\n\n// HEY YOU! DON'T TOUCH THIS VARIABLE!\n//\n// It is replaced with the proper version at build time via a babel plugin in\n// the rollup config.\n//\n// Export a global property onto the window for React Router detection by the\n// Core Web Vitals Technology Report.  This way they can configure the `wappalyzer`\n// to detect and properly classify live websites as being built with React Router:\n// https://github.com/HTTPArchive/wappalyzer/blob/main/src/technologies/r.json\nconst REACT_ROUTER_VERSION = \"0\";\ntry {\n  window.__reactRouterVersion = REACT_ROUTER_VERSION;\n} catch (e) {\n  // no-op\n}\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Routers\n////////////////////////////////////////////////////////////////////////////////\n\ninterface DOMRouterOpts {\n  basename?: string;\n  future?: Partial<Omit<RouterFutureConfig, \"v7_prependBasename\">>;\n  hydrationData?: HydrationState;\n  unstable_dataStrategy?: unstable_DataStrategyFunction;\n  window?: Window;\n}\n\nexport function createBrowserRouter(\n  routes: RouteObject[],\n  opts?: DOMRouterOpts\n): RemixRouter {\n  return createRouter({\n    basename: opts?.basename,\n    future: {\n      ...opts?.future,\n      v7_prependBasename: true,\n    },\n    history: createBrowserHistory({ window: opts?.window }),\n    hydrationData: opts?.hydrationData || parseHydrationData(),\n    routes,\n    mapRouteProperties,\n    unstable_dataStrategy: opts?.unstable_dataStrategy,\n    window: opts?.window,\n  }).initialize();\n}\n\nexport function createHashRouter(\n  routes: RouteObject[],\n  opts?: DOMRouterOpts\n): RemixRouter {\n  return createRouter({\n    basename: opts?.basename,\n    future: {\n      ...opts?.future,\n      v7_prependBasename: true,\n    },\n    history: createHashHistory({ window: opts?.window }),\n    hydrationData: opts?.hydrationData || parseHydrationData(),\n    routes,\n    mapRouteProperties,\n    unstable_dataStrategy: opts?.unstable_dataStrategy,\n    window: opts?.window,\n  }).initialize();\n}\n\nfunction parseHydrationData(): HydrationState | undefined {\n  let state = window?.__staticRouterHydrationData;\n  if (state && state.errors) {\n    state = {\n      ...state,\n      errors: deserializeErrors(state.errors),\n    };\n  }\n  return state;\n}\n\nfunction deserializeErrors(\n  errors: RemixRouter[\"state\"][\"errors\"]\n): RemixRouter[\"state\"][\"errors\"] {\n  if (!errors) return null;\n  let entries = Object.entries(errors);\n  let serialized: RemixRouter[\"state\"][\"errors\"] = {};\n  for (let [key, val] of entries) {\n    // Hey you!  If you change this, please change the corresponding logic in\n    // serializeErrors in react-router-dom/server.tsx :)\n    if (val && val.__type === \"RouteErrorResponse\") {\n      serialized[key] = new ErrorResponseImpl(\n        val.status,\n        val.statusText,\n        val.data,\n        val.internal === true\n      );\n    } else if (val && val.__type === \"Error\") {\n      // Attempt to reconstruct the right type of Error (i.e., ReferenceError)\n      if (val.__subType) {\n        let ErrorConstructor = window[val.__subType];\n        if (typeof ErrorConstructor === \"function\") {\n          try {\n            // @ts-expect-error\n            let error = new ErrorConstructor(val.message);\n            // Wipe away the client-side stack trace.  Nothing to fill it in with\n            // because we don't serialize SSR stack traces for security reasons\n            error.stack = \"\";\n            serialized[key] = error;\n          } catch (e) {\n            // no-op - fall through and create a normal Error\n          }\n        }\n      }\n\n      if (serialized[key] == null) {\n        let error = new Error(val.message);\n        // Wipe away the client-side stack trace.  Nothing to fill it in with\n        // because we don't serialize SSR stack traces for security reasons\n        error.stack = \"\";\n        serialized[key] = error;\n      }\n    } else {\n      serialized[key] = val;\n    }\n  }\n  return serialized;\n}\n\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Contexts\n////////////////////////////////////////////////////////////////////////////////\n\ntype ViewTransitionContextObject =\n  | {\n      isTransitioning: false;\n    }\n  | {\n      isTransitioning: true;\n      flushSync: boolean;\n      currentLocation: Location;\n      nextLocation: Location;\n    };\n\nconst ViewTransitionContext = React.createContext<ViewTransitionContextObject>({\n  isTransitioning: false,\n});\nif (__DEV__) {\n  ViewTransitionContext.displayName = \"ViewTransition\";\n}\n\nexport { ViewTransitionContext as UNSAFE_ViewTransitionContext };\n\n// TODO: (v7) Change the useFetcher data from `any` to `unknown`\ntype FetchersContextObject = Map<string, any>;\n\nconst FetchersContext = React.createContext<FetchersContextObject>(new Map());\nif (__DEV__) {\n  FetchersContext.displayName = \"Fetchers\";\n}\n\nexport { FetchersContext as UNSAFE_FetchersContext };\n\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Components\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n  Webpack + React 17 fails to compile on any of the following because webpack\n  complains that `startTransition` doesn't exist in `React`:\n  * import { startTransition } from \"react\"\n  * import * as React from from \"react\";\n    \"startTransition\" in React ? React.startTransition(() => setState()) : setState()\n  * import * as React from from \"react\";\n    \"startTransition\" in React ? React[\"startTransition\"](() => setState()) : setState()\n\n  Moving it to a constant such as the following solves the Webpack/React 17 issue:\n  * import * as React from from \"react\";\n    const START_TRANSITION = \"startTransition\";\n    START_TRANSITION in React ? React[START_TRANSITION](() => setState()) : setState()\n\n  However, that introduces webpack/terser minification issues in production builds\n  in React 18 where minification/obfuscation ends up removing the call of\n  React.startTransition entirely from the first half of the ternary.  Grabbing\n  this exported reference once up front resolves that issue.\n\n  See https://github.com/remix-run/react-router/issues/10579\n*/\nconst START_TRANSITION = \"startTransition\";\nconst startTransitionImpl = React[START_TRANSITION];\nconst FLUSH_SYNC = \"flushSync\";\nconst flushSyncImpl = ReactDOM[FLUSH_SYNC];\nconst USE_ID = \"useId\";\nconst useIdImpl = React[USE_ID];\n\nfunction startTransitionSafe(cb: () => void) {\n  if (startTransitionImpl) {\n    startTransitionImpl(cb);\n  } else {\n    cb();\n  }\n}\n\nfunction flushSyncSafe(cb: () => void) {\n  if (flushSyncImpl) {\n    flushSyncImpl(cb);\n  } else {\n    cb();\n  }\n}\n\ninterface ViewTransition {\n  finished: Promise<void>;\n  ready: Promise<void>;\n  updateCallbackDone: Promise<void>;\n  skipTransition(): void;\n}\n\nclass Deferred<T> {\n  status: \"pending\" | \"resolved\" | \"rejected\" = \"pending\";\n  promise: Promise<T>;\n  // @ts-expect-error - no initializer\n  resolve: (value: T) => void;\n  // @ts-expect-error - no initializer\n  reject: (reason?: unknown) => void;\n  constructor() {\n    this.promise = new Promise((resolve, reject) => {\n      this.resolve = (value) => {\n        if (this.status === \"pending\") {\n          this.status = \"resolved\";\n          resolve(value);\n        }\n      };\n      this.reject = (reason) => {\n        if (this.status === \"pending\") {\n          this.status = \"rejected\";\n          reject(reason);\n        }\n      };\n    });\n  }\n}\n\n/**\n * Given a Remix Router instance, render the appropriate UI\n */\nexport function RouterProvider({\n  fallbackElement,\n  router,\n  future,\n}: RouterProviderProps): React.ReactElement {\n  let [state, setStateImpl] = React.useState(router.state);\n  let [pendingState, setPendingState] = React.useState<RouterState>();\n  let [vtContext, setVtContext] = React.useState<ViewTransitionContextObject>({\n    isTransitioning: false,\n  });\n  let [renderDfd, setRenderDfd] = React.useState<Deferred<void>>();\n  let [transition, setTransition] = React.useState<ViewTransition>();\n  let [interruption, setInterruption] = React.useState<{\n    state: RouterState;\n    currentLocation: Location;\n    nextLocation: Location;\n  }>();\n  let fetcherData = React.useRef<Map<string, any>>(new Map());\n  let { v7_startTransition } = future || {};\n\n  let optInStartTransition = React.useCallback(\n    (cb: () => void) => {\n      if (v7_startTransition) {\n        startTransitionSafe(cb);\n      } else {\n        cb();\n      }\n    },\n    [v7_startTransition]\n  );\n\n  let setState = React.useCallback<RouterSubscriber>(\n    (\n      newState: RouterState,\n      {\n        deletedFetchers,\n        unstable_flushSync: flushSync,\n        unstable_viewTransitionOpts: viewTransitionOpts,\n      }\n    ) => {\n      deletedFetchers.forEach((key) => fetcherData.current.delete(key));\n      newState.fetchers.forEach((fetcher, key) => {\n        if (fetcher.data !== undefined) {\n          fetcherData.current.set(key, fetcher.data);\n        }\n      });\n\n      let isViewTransitionUnavailable =\n        router.window == null ||\n        router.window.document == null ||\n        typeof router.window.document.startViewTransition !== \"function\";\n\n      // If this isn't a view transition or it's not available in this browser,\n      // just update and be done with it\n      if (!viewTransitionOpts || isViewTransitionUnavailable) {\n        if (flushSync) {\n          flushSyncSafe(() => setStateImpl(newState));\n        } else {\n          optInStartTransition(() => setStateImpl(newState));\n        }\n        return;\n      }\n\n      // flushSync + startViewTransition\n      if (flushSync) {\n        // Flush through the context to mark DOM elements as transition=ing\n        flushSyncSafe(() => {\n          // Cancel any pending transitions\n          if (transition) {\n            renderDfd && renderDfd.resolve();\n            transition.skipTransition();\n          }\n          setVtContext({\n            isTransitioning: true,\n            flushSync: true,\n            currentLocation: viewTransitionOpts.currentLocation,\n            nextLocation: viewTransitionOpts.nextLocation,\n          });\n        });\n\n        // Update the DOM\n        let t = router.window!.document.startViewTransition(() => {\n          flushSyncSafe(() => setStateImpl(newState));\n        });\n\n        // Clean up after the animation completes\n        t.finished.finally(() => {\n          flushSyncSafe(() => {\n            setRenderDfd(undefined);\n            setTransition(undefined);\n            setPendingState(undefined);\n            setVtContext({ isTransitioning: false });\n          });\n        });\n\n        flushSyncSafe(() => setTransition(t));\n        return;\n      }\n\n      // startTransition + startViewTransition\n      if (transition) {\n        // Interrupting an in-progress transition, cancel and let everything flush\n        // out, and then kick off a new transition from the interruption state\n        renderDfd && renderDfd.resolve();\n        transition.skipTransition();\n        setInterruption({\n          state: newState,\n          currentLocation: viewTransitionOpts.currentLocation,\n          nextLocation: viewTransitionOpts.nextLocation,\n        });\n      } else {\n        // Completed navigation update with opted-in view transitions, let 'er rip\n        setPendingState(newState);\n        setVtContext({\n          isTransitioning: true,\n          flushSync: false,\n          currentLocation: viewTransitionOpts.currentLocation,\n          nextLocation: viewTransitionOpts.nextLocation,\n        });\n      }\n    },\n    [router.window, transition, renderDfd, fetcherData, optInStartTransition]\n  );\n\n  // Need to use a layout effect here so we are subscribed early enough to\n  // pick up on any render-driven redirects/navigations (useEffect/<Navigate>)\n  React.useLayoutEffect(() => router.subscribe(setState), [router, setState]);\n\n  // When we start a view transition, create a Deferred we can use for the\n  // eventual \"completed\" render\n  React.useEffect(() => {\n    if (vtContext.isTransitioning && !vtContext.flushSync) {\n      setRenderDfd(new Deferred<void>());\n    }\n  }, [vtContext]);\n\n  // Once the deferred is created, kick off startViewTransition() to update the\n  // DOM and then wait on the Deferred to resolve (indicating the DOM update has\n  // happened)\n  React.useEffect(() => {\n    if (renderDfd && pendingState && router.window) {\n      let newState = pendingState;\n      let renderPromise = renderDfd.promise;\n      let transition = router.window.document.startViewTransition(async () => {\n        optInStartTransition(() => setStateImpl(newState));\n        await renderPromise;\n      });\n      transition.finished.finally(() => {\n        setRenderDfd(undefined);\n        setTransition(undefined);\n        setPendingState(undefined);\n        setVtContext({ isTransitioning: false });\n      });\n      setTransition(transition);\n    }\n  }, [optInStartTransition, pendingState, renderDfd, router.window]);\n\n  // When the new location finally renders and is committed to the DOM, this\n  // effect will run to resolve the transition\n  React.useEffect(() => {\n    if (\n      renderDfd &&\n      pendingState &&\n      state.location.key === pendingState.location.key\n    ) {\n      renderDfd.resolve();\n    }\n  }, [renderDfd, transition, state.location, pendingState]);\n\n  // If we get interrupted with a new navigation during a transition, we skip\n  // the active transition, let it cleanup, then kick it off again here\n  React.useEffect(() => {\n    if (!vtContext.isTransitioning && interruption) {\n      setPendingState(interruption.state);\n      setVtContext({\n        isTransitioning: true,\n        flushSync: false,\n        currentLocation: interruption.currentLocation,\n        nextLocation: interruption.nextLocation,\n      });\n      setInterruption(undefined);\n    }\n  }, [vtContext.isTransitioning, interruption]);\n\n  React.useEffect(() => {\n    warning(\n      fallbackElement == null || !router.future.v7_partialHydration,\n      \"`<RouterProvider fallbackElement>` is deprecated when using \" +\n        \"`v7_partialHydration`, use a `HydrateFallback` component instead\"\n    );\n    // Only log this once on initial mount\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  let navigator = React.useMemo((): Navigator => {\n    return {\n      createHref: router.createHref,\n      encodeLocation: router.encodeLocation,\n      go: (n) => router.navigate(n),\n      push: (to, state, opts) =>\n        router.navigate(to, {\n          state,\n          preventScrollReset: opts?.preventScrollReset,\n        }),\n      replace: (to, state, opts) =>\n        router.navigate(to, {\n          replace: true,\n          state,\n          preventScrollReset: opts?.preventScrollReset,\n        }),\n    };\n  }, [router]);\n\n  let basename = router.basename || \"/\";\n\n  let dataRouterContext = React.useMemo(\n    () => ({\n      router,\n      navigator,\n      static: false,\n      basename,\n    }),\n    [router, navigator, basename]\n  );\n\n  // The fragment and {null} here are important!  We need them to keep React 18's\n  // useId happy when we are server-rendering since we may have a <script> here\n  // containing the hydrated server-side staticContext (from StaticRouterProvider).\n  // useId relies on the component tree structure to generate deterministic id's\n  // so we need to ensure it remains the same on the client even though\n  // we don't need the <script> tag\n  return (\n    <>\n      <DataRouterContext.Provider value={dataRouterContext}>\n        <DataRouterStateContext.Provider value={state}>\n          <FetchersContext.Provider value={fetcherData.current}>\n            <ViewTransitionContext.Provider value={vtContext}>\n              <Router\n                basename={basename}\n                location={state.location}\n                navigationType={state.historyAction}\n                navigator={navigator}\n                future={{\n                  v7_relativeSplatPath: router.future.v7_relativeSplatPath,\n                }}\n              >\n                {state.initialized || router.future.v7_partialHydration ? (\n                  <DataRoutes\n                    routes={router.routes}\n                    future={router.future}\n                    state={state}\n                  />\n                ) : (\n                  fallbackElement\n                )}\n              </Router>\n            </ViewTransitionContext.Provider>\n          </FetchersContext.Provider>\n        </DataRouterStateContext.Provider>\n      </DataRouterContext.Provider>\n      {null}\n    </>\n  );\n}\n\nfunction DataRoutes({\n  routes,\n  future,\n  state,\n}: {\n  routes: DataRouteObject[];\n  future: RemixRouter[\"future\"];\n  state: RouterState;\n}): React.ReactElement | null {\n  return useRoutesImpl(routes, undefined, state, future);\n}\n\nexport interface BrowserRouterProps {\n  basename?: string;\n  children?: React.ReactNode;\n  future?: Partial<FutureConfig>;\n  window?: Window;\n}\n\n/**\n * A `<Router>` for use in web browsers. Provides the cleanest URLs.\n */\nexport function BrowserRouter({\n  basename,\n  children,\n  future,\n  window,\n}: BrowserRouterProps) {\n  let historyRef = React.useRef<BrowserHistory>();\n  if (historyRef.current == null) {\n    historyRef.current = createBrowserHistory({ window, v5Compat: true });\n  }\n\n  let history = historyRef.current;\n  let [state, setStateImpl] = React.useState({\n    action: history.action,\n    location: history.location,\n  });\n  let { v7_startTransition } = future || {};\n  let setState = React.useCallback(\n    (newState: { action: NavigationType; location: Location }) => {\n      v7_startTransition && startTransitionImpl\n        ? startTransitionImpl(() => setStateImpl(newState))\n        : setStateImpl(newState);\n    },\n    [setStateImpl, v7_startTransition]\n  );\n\n  React.useLayoutEffect(() => history.listen(setState), [history, setState]);\n\n  return (\n    <Router\n      basename={basename}\n      children={children}\n      location={state.location}\n      navigationType={state.action}\n      navigator={history}\n      future={future}\n    />\n  );\n}\n\nexport interface HashRouterProps {\n  basename?: string;\n  children?: React.ReactNode;\n  future?: Partial<FutureConfig>;\n  window?: Window;\n}\n\n/**\n * A `<Router>` for use in web browsers. Stores the location in the hash\n * portion of the URL so it is not sent to the server.\n */\nexport function HashRouter({\n  basename,\n  children,\n  future,\n  window,\n}: HashRouterProps) {\n  let historyRef = React.useRef<HashHistory>();\n  if (historyRef.current == null) {\n    historyRef.current = createHashHistory({ window, v5Compat: true });\n  }\n\n  let history = historyRef.current;\n  let [state, setStateImpl] = React.useState({\n    action: history.action,\n    location: history.location,\n  });\n  let { v7_startTransition } = future || {};\n  let setState = React.useCallback(\n    (newState: { action: NavigationType; location: Location }) => {\n      v7_startTransition && startTransitionImpl\n        ? startTransitionImpl(() => setStateImpl(newState))\n        : setStateImpl(newState);\n    },\n    [setStateImpl, v7_startTransition]\n  );\n\n  React.useLayoutEffect(() => history.listen(setState), [history, setState]);\n\n  return (\n    <Router\n      basename={basename}\n      children={children}\n      location={state.location}\n      navigationType={state.action}\n      navigator={history}\n      future={future}\n    />\n  );\n}\n\nexport interface HistoryRouterProps {\n  basename?: string;\n  children?: React.ReactNode;\n  future?: FutureConfig;\n  history: History;\n}\n\n/**\n * A `<Router>` that accepts a pre-instantiated history object. It's important\n * to note that using your own history object is highly discouraged and may add\n * two versions of the history library to your bundles unless you use the same\n * version of the history library that React Router uses internally.\n */\nfunction HistoryRouter({\n  basename,\n  children,\n  future,\n  history,\n}: HistoryRouterProps) {\n  let [state, setStateImpl] = React.useState({\n    action: history.action,\n    location: history.location,\n  });\n  let { v7_startTransition } = future || {};\n  let setState = React.useCallback(\n    (newState: { action: NavigationType; location: Location }) => {\n      v7_startTransition && startTransitionImpl\n        ? startTransitionImpl(() => setStateImpl(newState))\n        : setStateImpl(newState);\n    },\n    [setStateImpl, v7_startTransition]\n  );\n\n  React.useLayoutEffect(() => history.listen(setState), [history, setState]);\n\n  return (\n    <Router\n      basename={basename}\n      children={children}\n      location={state.location}\n      navigationType={state.action}\n      navigator={history}\n      future={future}\n    />\n  );\n}\n\nif (__DEV__) {\n  HistoryRouter.displayName = \"unstable_HistoryRouter\";\n}\n\nexport { HistoryRouter as unstable_HistoryRouter };\n\nexport interface LinkProps\n  extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"href\"> {\n  reloadDocument?: boolean;\n  replace?: boolean;\n  state?: any;\n  preventScrollReset?: boolean;\n  relative?: RelativeRoutingType;\n  to: To;\n  unstable_viewTransition?: boolean;\n}\n\nconst isBrowser =\n  typeof window !== \"undefined\" &&\n  typeof window.document !== \"undefined\" &&\n  typeof window.document.createElement !== \"undefined\";\n\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\n\n/**\n * The public API for rendering a history-aware `<a>`.\n */\nexport const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(\n  function LinkWithRef(\n    {\n      onClick,\n      relative,\n      reloadDocument,\n      replace,\n      state,\n      target,\n      to,\n      preventScrollReset,\n      unstable_viewTransition,\n      ...rest\n    },\n    ref\n  ) {\n    let { basename } = React.useContext(NavigationContext);\n\n    // Rendered into <a href> for absolute URLs\n    let absoluteHref;\n    let isExternal = false;\n\n    if (typeof to === \"string\" && ABSOLUTE_URL_REGEX.test(to)) {\n      // Render the absolute href server- and client-side\n      absoluteHref = to;\n\n      // Only check for external origins client-side\n      if (isBrowser) {\n        try {\n          let currentUrl = new URL(window.location.href);\n          let targetUrl = to.startsWith(\"//\")\n            ? new URL(currentUrl.protocol + to)\n            : new URL(to);\n          let path = stripBasename(targetUrl.pathname, basename);\n\n          if (targetUrl.origin === currentUrl.origin && path != null) {\n            // Strip the protocol/origin/basename for same-origin absolute URLs\n            to = path + targetUrl.search + targetUrl.hash;\n          } else {\n            isExternal = true;\n          }\n        } catch (e) {\n          // We can't do external URL detection without a valid URL\n          warning(\n            false,\n            `<Link to=\"${to}\"> contains an invalid URL which will probably break ` +\n              `when clicked - please update to a valid URL path.`\n          );\n        }\n      }\n    }\n\n    // Rendered into <a href> for relative URLs\n    let href = useHref(to, { relative });\n\n    let internalOnClick = useLinkClickHandler(to, {\n      replace,\n      state,\n      target,\n      preventScrollReset,\n      relative,\n      unstable_viewTransition,\n    });\n    function handleClick(\n      event: React.MouseEvent<HTMLAnchorElement, MouseEvent>\n    ) {\n      if (onClick) onClick(event);\n      if (!event.defaultPrevented) {\n        internalOnClick(event);\n      }\n    }\n\n    return (\n      // eslint-disable-next-line jsx-a11y/anchor-has-content\n      <a\n        {...rest}\n        href={absoluteHref || href}\n        onClick={isExternal || reloadDocument ? onClick : handleClick}\n        ref={ref}\n        target={target}\n      />\n    );\n  }\n);\n\nif (__DEV__) {\n  Link.displayName = \"Link\";\n}\n\ntype NavLinkRenderProps = {\n  isActive: boolean;\n  isPending: boolean;\n  isTransitioning: boolean;\n};\n\nexport interface NavLinkProps\n  extends Omit<LinkProps, \"className\" | \"style\" | \"children\"> {\n  children?: React.ReactNode | ((props: NavLinkRenderProps) => React.ReactNode);\n  caseSensitive?: boolean;\n  className?: string | ((props: NavLinkRenderProps) => string | undefined);\n  end?: boolean;\n  style?:\n    | React.CSSProperties\n    | ((props: NavLinkRenderProps) => React.CSSProperties | undefined);\n}\n\n/**\n * A `<Link>` wrapper that knows if it's \"active\" or not.\n */\nexport const NavLink = React.forwardRef<HTMLAnchorElement, NavLinkProps>(\n  function NavLinkWithRef(\n    {\n      \"aria-current\": ariaCurrentProp = \"page\",\n      caseSensitive = false,\n      className: classNameProp = \"\",\n      end = false,\n      style: styleProp,\n      to,\n      unstable_viewTransition,\n      children,\n      ...rest\n    },\n    ref\n  ) {\n    let path = useResolvedPath(to, { relative: rest.relative });\n    let location = useLocation();\n    let routerState = React.useContext(DataRouterStateContext);\n    let { navigator, basename } = React.useContext(NavigationContext);\n    let isTransitioning =\n      routerState != null &&\n      // Conditional usage is OK here because the usage of a data router is static\n      // eslint-disable-next-line react-hooks/rules-of-hooks\n      useViewTransitionState(path) &&\n      unstable_viewTransition === true;\n\n    let toPathname = navigator.encodeLocation\n      ? navigator.encodeLocation(path).pathname\n      : path.pathname;\n    let locationPathname = location.pathname;\n    let nextLocationPathname =\n      routerState && routerState.navigation && routerState.navigation.location\n        ? routerState.navigation.location.pathname\n        : null;\n\n    if (!caseSensitive) {\n      locationPathname = locationPathname.toLowerCase();\n      nextLocationPathname = nextLocationPathname\n        ? nextLocationPathname.toLowerCase()\n        : null;\n      toPathname = toPathname.toLowerCase();\n    }\n\n    if (nextLocationPathname && basename) {\n      nextLocationPathname =\n        stripBasename(nextLocationPathname, basename) || nextLocationPathname;\n    }\n\n    // If the `to` has a trailing slash, look at that exact spot.  Otherwise,\n    // we're looking for a slash _after_ what's in `to`.  For example:\n    //\n    // <NavLink to=\"/users\"> and <NavLink to=\"/users/\">\n    // both want to look for a / at index 6 to match URL `/users/matt`\n    const endSlashPosition =\n      toPathname !== \"/\" && toPathname.endsWith(\"/\")\n        ? toPathname.length - 1\n        : toPathname.length;\n    let isActive =\n      locationPathname === toPathname ||\n      (!end &&\n        locationPathname.startsWith(toPathname) &&\n        locationPathname.charAt(endSlashPosition) === \"/\");\n\n    let isPending =\n      nextLocationPathname != null &&\n      (nextLocationPathname === toPathname ||\n        (!end &&\n          nextLocationPathname.startsWith(toPathname) &&\n          nextLocationPathname.charAt(toPathname.length) === \"/\"));\n\n    let renderProps = {\n      isActive,\n      isPending,\n      isTransitioning,\n    };\n\n    let ariaCurrent = isActive ? ariaCurrentProp : undefined;\n\n    let className: string | undefined;\n    if (typeof classNameProp === \"function\") {\n      className = classNameProp(renderProps);\n    } else {\n      // If the className prop is not a function, we use a default `active`\n      // class for <NavLink />s that are active. In v5 `active` was the default\n      // value for `activeClassName`, but we are removing that API and can still\n      // use the old default behavior for a cleaner upgrade path and keep the\n      // simple styling rules working as they currently do.\n      className = [\n        classNameProp,\n        isActive ? \"active\" : null,\n        isPending ? \"pending\" : null,\n        isTransitioning ? \"transitioning\" : null,\n      ]\n        .filter(Boolean)\n        .join(\" \");\n    }\n\n    let style =\n      typeof styleProp === \"function\" ? styleProp(renderProps) : styleProp;\n\n    return (\n      <Link\n        {...rest}\n        aria-current={ariaCurrent}\n        className={className}\n        ref={ref}\n        style={style}\n        to={to}\n        unstable_viewTransition={unstable_viewTransition}\n      >\n        {typeof children === \"function\" ? children(renderProps) : children}\n      </Link>\n    );\n  }\n);\n\nif (__DEV__) {\n  NavLink.displayName = \"NavLink\";\n}\n\nexport interface FetcherFormProps\n  extends React.FormHTMLAttributes<HTMLFormElement> {\n  /**\n   * The HTTP verb to use when the form is submit. Supports \"get\", \"post\",\n   * \"put\", \"delete\", \"patch\".\n   */\n  method?: HTMLFormMethod;\n\n  /**\n   * `<form encType>` - enhancing beyond the normal string type and limiting\n   * to the built-in browser supported values\n   */\n  encType?:\n    | \"application/x-www-form-urlencoded\"\n    | \"multipart/form-data\"\n    | \"text/plain\";\n\n  /**\n   * Normal `<form action>` but supports React Router's relative paths.\n   */\n  action?: string;\n\n  /**\n   * Determines whether the form action is relative to the route hierarchy or\n   * the pathname.  Use this if you want to opt out of navigating the route\n   * hierarchy and want to instead route based on /-delimited URL segments\n   */\n  relative?: RelativeRoutingType;\n\n  /**\n   * Prevent the scroll position from resetting to the top of the viewport on\n   * completion of the navigation when using the <ScrollRestoration> component\n   */\n  preventScrollReset?: boolean;\n\n  /**\n   * A function to call when the form is submitted. If you call\n   * `event.preventDefault()` then this form will not do anything.\n   */\n  onSubmit?: React.FormEventHandler<HTMLFormElement>;\n}\n\nexport interface FormProps extends FetcherFormProps {\n  /**\n   * Indicate a specific fetcherKey to use when using navigate=false\n   */\n  fetcherKey?: string;\n\n  /**\n   * navigate=false will use a fetcher instead of a navigation\n   */\n  navigate?: boolean;\n\n  /**\n   * Forces a full document navigation instead of a fetch.\n   */\n  reloadDocument?: boolean;\n\n  /**\n   * Replaces the current entry in the browser history stack when the form\n   * navigates. Use this if you don't want the user to be able to click \"back\"\n   * to the page with the form on it.\n   */\n  replace?: boolean;\n\n  /**\n   * State object to add to the history stack entry for this navigation\n   */\n  state?: any;\n\n  /**\n   * Enable view transitions on this Form navigation\n   */\n  unstable_viewTransition?: boolean;\n}\n\ntype HTMLSubmitEvent = React.BaseSyntheticEvent<\n  SubmitEvent,\n  Event,\n  HTMLFormElement\n>;\n\ntype HTMLFormSubmitter = HTMLButtonElement | HTMLInputElement;\n\n/**\n * A `@remix-run/router`-aware `<form>`. It behaves like a normal form except\n * that the interaction with the server is with `fetch` instead of new document\n * requests, allowing components to add nicer UX to the page as the form is\n * submitted and returns with data.\n */\nexport const Form = React.forwardRef<HTMLFormElement, FormProps>(\n  (\n    {\n      fetcherKey,\n      navigate,\n      reloadDocument,\n      replace,\n      state,\n      method = defaultMethod,\n      action,\n      onSubmit,\n      relative,\n      preventScrollReset,\n      unstable_viewTransition,\n      ...props\n    },\n    forwardedRef\n  ) => {\n    let submit = useSubmit();\n    let formAction = useFormAction(action, { relative });\n    let formMethod: HTMLFormMethod =\n      method.toLowerCase() === \"get\" ? \"get\" : \"post\";\n\n    let submitHandler: React.FormEventHandler<HTMLFormElement> = (event) => {\n      onSubmit && onSubmit(event);\n      if (event.defaultPrevented) return;\n      event.preventDefault();\n\n      let submitter = (event as unknown as HTMLSubmitEvent).nativeEvent\n        .submitter as HTMLFormSubmitter | null;\n\n      let submitMethod =\n        (submitter?.getAttribute(\"formmethod\") as HTMLFormMethod | undefined) ||\n        method;\n\n      submit(submitter || event.currentTarget, {\n        fetcherKey,\n        method: submitMethod,\n        navigate,\n        replace,\n        state,\n        relative,\n        preventScrollReset,\n        unstable_viewTransition,\n      });\n    };\n\n    return (\n      <form\n        ref={forwardedRef}\n        method={formMethod}\n        action={formAction}\n        onSubmit={reloadDocument ? onSubmit : submitHandler}\n        {...props}\n      />\n    );\n  }\n);\n\nif (__DEV__) {\n  Form.displayName = \"Form\";\n}\n\nexport interface ScrollRestorationProps {\n  getKey?: GetScrollRestorationKeyFunction;\n  storageKey?: string;\n}\n\n/**\n * This component will emulate the browser's scroll restoration on location\n * changes.\n */\nexport function ScrollRestoration({\n  getKey,\n  storageKey,\n}: ScrollRestorationProps) {\n  useScrollRestoration({ getKey, storageKey });\n  return null;\n}\n\nif (__DEV__) {\n  ScrollRestoration.displayName = \"ScrollRestoration\";\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Hooks\n////////////////////////////////////////////////////////////////////////////////\n\nenum DataRouterHook {\n  UseScrollRestoration = \"useScrollRestoration\",\n  UseSubmit = \"useSubmit\",\n  UseSubmitFetcher = \"useSubmitFetcher\",\n  UseFetcher = \"useFetcher\",\n  useViewTransitionState = \"useViewTransitionState\",\n}\n\nenum DataRouterStateHook {\n  UseFetcher = \"useFetcher\",\n  UseFetchers = \"useFetchers\",\n  UseScrollRestoration = \"useScrollRestoration\",\n}\n\n// Internal hooks\n\nfunction getDataRouterConsoleError(\n  hookName: DataRouterHook | DataRouterStateHook\n) {\n  return `${hookName} must be used within a data router.  See https://reactrouter.com/routers/picking-a-router.`;\n}\n\nfunction useDataRouterContext(hookName: DataRouterHook) {\n  let ctx = React.useContext(DataRouterContext);\n  invariant(ctx, getDataRouterConsoleError(hookName));\n  return ctx;\n}\n\nfunction useDataRouterState(hookName: DataRouterStateHook) {\n  let state = React.useContext(DataRouterStateContext);\n  invariant(state, getDataRouterConsoleError(hookName));\n  return state;\n}\n\n// External hooks\n\n/**\n * Handles the click behavior for router `<Link>` components. This is useful if\n * you need to create custom `<Link>` components with the same click behavior we\n * use in our exported `<Link>`.\n */\nexport function useLinkClickHandler<E extends Element = HTMLAnchorElement>(\n  to: To,\n  {\n    target,\n    replace: replaceProp,\n    state,\n    preventScrollReset,\n    relative,\n    unstable_viewTransition,\n  }: {\n    target?: React.HTMLAttributeAnchorTarget;\n    replace?: boolean;\n    state?: any;\n    preventScrollReset?: boolean;\n    relative?: RelativeRoutingType;\n    unstable_viewTransition?: boolean;\n  } = {}\n): (event: React.MouseEvent<E, MouseEvent>) => void {\n  let navigate = useNavigate();\n  let location = useLocation();\n  let path = useResolvedPath(to, { relative });\n\n  return React.useCallback(\n    (event: React.MouseEvent<E, MouseEvent>) => {\n      if (shouldProcessLinkClick(event, target)) {\n        event.preventDefault();\n\n        // If the URL hasn't changed, a regular <a> will do a replace instead of\n        // a push, so do the same here unless the replace prop is explicitly set\n        let replace =\n          replaceProp !== undefined\n            ? replaceProp\n            : createPath(location) === createPath(path);\n\n        navigate(to, {\n          replace,\n          state,\n          preventScrollReset,\n          relative,\n          unstable_viewTransition,\n        });\n      }\n    },\n    [\n      location,\n      navigate,\n      path,\n      replaceProp,\n      state,\n      target,\n      to,\n      preventScrollReset,\n      relative,\n      unstable_viewTransition,\n    ]\n  );\n}\n\n/**\n * A convenient wrapper for reading and writing search parameters via the\n * URLSearchParams interface.\n */\nexport function useSearchParams(\n  defaultInit?: URLSearchParamsInit\n): [URLSearchParams, SetURLSearchParams] {\n  warning(\n    typeof URLSearchParams !== \"undefined\",\n    `You cannot use the \\`useSearchParams\\` hook in a browser that does not ` +\n      `support the URLSearchParams API. If you need to support Internet ` +\n      `Explorer 11, we recommend you load a polyfill such as ` +\n      `https://github.com/ungap/url-search-params\\n\\n` +\n      `If you're unsure how to load polyfills, we recommend you check out ` +\n      `https://polyfill.io/v3/ which provides some recommendations about how ` +\n      `to load polyfills only for users that need them, instead of for every ` +\n      `user.`\n  );\n\n  let defaultSearchParamsRef = React.useRef(createSearchParams(defaultInit));\n  let hasSetSearchParamsRef = React.useRef(false);\n\n  let location = useLocation();\n  let searchParams = React.useMemo(\n    () =>\n      // Only merge in the defaults if we haven't yet called setSearchParams.\n      // Once we call that we want those to take precedence, otherwise you can't\n      // remove a param with setSearchParams({}) if it has an initial value\n      getSearchParamsForLocation(\n        location.search,\n        hasSetSearchParamsRef.current ? null : defaultSearchParamsRef.current\n      ),\n    [location.search]\n  );\n\n  let navigate = useNavigate();\n  let setSearchParams = React.useCallback<SetURLSearchParams>(\n    (nextInit, navigateOptions) => {\n      const newSearchParams = createSearchParams(\n        typeof nextInit === \"function\" ? nextInit(searchParams) : nextInit\n      );\n      hasSetSearchParamsRef.current = true;\n      navigate(\"?\" + newSearchParams, navigateOptions);\n    },\n    [navigate, searchParams]\n  );\n\n  return [searchParams, setSearchParams];\n}\n\nexport type SetURLSearchParams = (\n  nextInit?:\n    | URLSearchParamsInit\n    | ((prev: URLSearchParams) => URLSearchParamsInit),\n  navigateOpts?: NavigateOptions\n) => void;\n\n/**\n * Submits a HTML `<form>` to the server without reloading the page.\n */\nexport interface SubmitFunction {\n  (\n    /**\n     * Specifies the `<form>` to be submitted to the server, a specific\n     * `<button>` or `<input type=\"submit\">` to use to submit the form, or some\n     * arbitrary data to submit.\n     *\n     * Note: When using a `<button>` its `name` and `value` will also be\n     * included in the form data that is submitted.\n     */\n    target: SubmitTarget,\n\n    /**\n     * Options that override the `<form>`'s own attributes. Required when\n     * submitting arbitrary data without a backing `<form>`.\n     */\n    options?: SubmitOptions\n  ): void;\n}\n\n/**\n * Submits a fetcher `<form>` to the server without reloading the page.\n */\nexport interface FetcherSubmitFunction {\n  (\n    target: SubmitTarget,\n    // Fetchers cannot replace or set state because they are not navigation events\n    options?: Omit<SubmitOptions, \"replace\" | \"state\">\n  ): void;\n}\n\nfunction validateClientSideSubmission() {\n  if (typeof document === \"undefined\") {\n    throw new Error(\n      \"You are calling submit during the server render. \" +\n        \"Try calling submit within a `useEffect` or callback instead.\"\n    );\n  }\n}\n\nlet fetcherId = 0;\nlet getUniqueFetcherId = () => `__${String(++fetcherId)}__`;\n\n/**\n * Returns a function that may be used to programmatically submit a form (or\n * some arbitrary data) to the server.\n */\nexport function useSubmit(): SubmitFunction {\n  let { router } = useDataRouterContext(DataRouterHook.UseSubmit);\n  let { basename } = React.useContext(NavigationContext);\n  let currentRouteId = useRouteId();\n\n  return React.useCallback<SubmitFunction>(\n    (target, options = {}) => {\n      validateClientSideSubmission();\n\n      let { action, method, encType, formData, body } = getFormSubmissionInfo(\n        target,\n        basename\n      );\n\n      if (options.navigate === false) {\n        let key = options.fetcherKey || getUniqueFetcherId();\n        router.fetch(key, currentRouteId, options.action || action, {\n          preventScrollReset: options.preventScrollReset,\n          formData,\n          body,\n          formMethod: options.method || (method as HTMLFormMethod),\n          formEncType: options.encType || (encType as FormEncType),\n          unstable_flushSync: options.unstable_flushSync,\n        });\n      } else {\n        router.navigate(options.action || action, {\n          preventScrollReset: options.preventScrollReset,\n          formData,\n          body,\n          formMethod: options.method || (method as HTMLFormMethod),\n          formEncType: options.encType || (encType as FormEncType),\n          replace: options.replace,\n          state: options.state,\n          fromRouteId: currentRouteId,\n          unstable_flushSync: options.unstable_flushSync,\n          unstable_viewTransition: options.unstable_viewTransition,\n        });\n      }\n    },\n    [router, basename, currentRouteId]\n  );\n}\n\n// v7: Eventually we should deprecate this entirely in favor of using the\n// router method directly?\nexport function useFormAction(\n  action?: string,\n  { relative }: { relative?: RelativeRoutingType } = {}\n): string {\n  let { basename } = React.useContext(NavigationContext);\n  let routeContext = React.useContext(RouteContext);\n  invariant(routeContext, \"useFormAction must be used inside a RouteContext\");\n\n  let [match] = routeContext.matches.slice(-1);\n  // Shallow clone path so we can modify it below, otherwise we modify the\n  // object referenced by useMemo inside useResolvedPath\n  let path = { ...useResolvedPath(action ? action : \".\", { relative }) };\n\n  // If no action was specified, browsers will persist current search params\n  // when determining the path, so match that behavior\n  // https://github.com/remix-run/remix/issues/927\n  let location = useLocation();\n  if (action == null) {\n    // Safe to write to this directly here since if action was undefined, we\n    // would have called useResolvedPath(\".\") which will never include a search\n    path.search = location.search;\n\n    // When grabbing search params from the URL, remove any included ?index param\n    // since it might not apply to our contextual route.  We add it back based\n    // on match.route.index below\n    let params = new URLSearchParams(path.search);\n    if (params.has(\"index\") && params.get(\"index\") === \"\") {\n      params.delete(\"index\");\n      path.search = params.toString() ? `?${params.toString()}` : \"\";\n    }\n  }\n\n  if ((!action || action === \".\") && match.route.index) {\n    path.search = path.search\n      ? path.search.replace(/^\\?/, \"?index&\")\n      : \"?index\";\n  }\n\n  // If we're operating within a basename, prepend it to the pathname prior\n  // to creating the form action.  If this is a root navigation, then just use\n  // the raw basename which allows the basename to have full control over the\n  // presence of a trailing slash on root actions\n  if (basename !== \"/\") {\n    path.pathname =\n      path.pathname === \"/\" ? basename : joinPaths([basename, path.pathname]);\n  }\n\n  return createPath(path);\n}\n\nexport type FetcherWithComponents<TData> = Fetcher<TData> & {\n  Form: React.ForwardRefExoticComponent<\n    FetcherFormProps & React.RefAttributes<HTMLFormElement>\n  >;\n  submit: FetcherSubmitFunction;\n  load: (href: string, opts?: { unstable_flushSync?: boolean }) => void;\n};\n\n// TODO: (v7) Change the useFetcher generic default from `any` to `unknown`\n\n/**\n * Interacts with route loaders and actions without causing a navigation. Great\n * for any interaction that stays on the same page.\n */\nexport function useFetcher<TData = any>({\n  key,\n}: { key?: string } = {}): FetcherWithComponents<TData> {\n  let { router } = useDataRouterContext(DataRouterHook.UseFetcher);\n  let state = useDataRouterState(DataRouterStateHook.UseFetcher);\n  let fetcherData = React.useContext(FetchersContext);\n  let route = React.useContext(RouteContext);\n  let routeId = route.matches[route.matches.length - 1]?.route.id;\n\n  invariant(fetcherData, `useFetcher must be used inside a FetchersContext`);\n  invariant(route, `useFetcher must be used inside a RouteContext`);\n  invariant(\n    routeId != null,\n    `useFetcher can only be used on routes that contain a unique \"id\"`\n  );\n\n  // Fetcher key handling\n  // OK to call conditionally to feature detect `useId`\n  // eslint-disable-next-line react-hooks/rules-of-hooks\n  let defaultKey = useIdImpl ? useIdImpl() : \"\";\n  let [fetcherKey, setFetcherKey] = React.useState<string>(key || defaultKey);\n  if (key && key !== fetcherKey) {\n    setFetcherKey(key);\n  } else if (!fetcherKey) {\n    // We will only fall through here when `useId` is not available\n    setFetcherKey(getUniqueFetcherId());\n  }\n\n  // Registration/cleanup\n  React.useEffect(() => {\n    router.getFetcher(fetcherKey);\n    return () => {\n      // Tell the router we've unmounted - if v7_fetcherPersist is enabled this\n      // will not delete immediately but instead queue up a delete after the\n      // fetcher returns to an `idle` state\n      router.deleteFetcher(fetcherKey);\n    };\n  }, [router, fetcherKey]);\n\n  // Fetcher additions\n  let load = React.useCallback(\n    (href: string, opts?: { unstable_flushSync?: boolean }) => {\n      invariant(routeId, \"No routeId available for fetcher.load()\");\n      router.fetch(fetcherKey, routeId, href, opts);\n    },\n    [fetcherKey, routeId, router]\n  );\n\n  let submitImpl = useSubmit();\n  let submit = React.useCallback<FetcherSubmitFunction>(\n    (target, opts) => {\n      submitImpl(target, {\n        ...opts,\n        navigate: false,\n        fetcherKey,\n      });\n    },\n    [fetcherKey, submitImpl]\n  );\n\n  let FetcherForm = React.useMemo(() => {\n    let FetcherForm = React.forwardRef<HTMLFormElement, FetcherFormProps>(\n      (props, ref) => {\n        return (\n          <Form {...props} navigate={false} fetcherKey={fetcherKey} ref={ref} />\n        );\n      }\n    );\n    if (__DEV__) {\n      FetcherForm.displayName = \"fetcher.Form\";\n    }\n    return FetcherForm;\n  }, [fetcherKey]);\n\n  // Exposed FetcherWithComponents\n  let fetcher = state.fetchers.get(fetcherKey) || IDLE_FETCHER;\n  let data = fetcherData.get(fetcherKey);\n  let fetcherWithComponents = React.useMemo(\n    () => ({\n      Form: FetcherForm,\n      submit,\n      load,\n      ...fetcher,\n      data,\n    }),\n    [FetcherForm, submit, load, fetcher, data]\n  );\n\n  return fetcherWithComponents;\n}\n\n/**\n * Provides all fetchers currently on the page. Useful for layouts and parent\n * routes that need to provide pending/optimistic UI regarding the fetch.\n */\nexport function useFetchers(): (Fetcher & { key: string })[] {\n  let state = useDataRouterState(DataRouterStateHook.UseFetchers);\n  return Array.from(state.fetchers.entries()).map(([key, fetcher]) => ({\n    ...fetcher,\n    key,\n  }));\n}\n\nconst SCROLL_RESTORATION_STORAGE_KEY = \"react-router-scroll-positions\";\nlet savedScrollPositions: Record<string, number> = {};\n\n/**\n * When rendered inside a RouterProvider, will restore scroll positions on navigations\n */\nfunction useScrollRestoration({\n  getKey,\n  storageKey,\n}: {\n  getKey?: GetScrollRestorationKeyFunction;\n  storageKey?: string;\n} = {}) {\n  let { router } = useDataRouterContext(DataRouterHook.UseScrollRestoration);\n  let { restoreScrollPosition, preventScrollReset } = useDataRouterState(\n    DataRouterStateHook.UseScrollRestoration\n  );\n  let { basename } = React.useContext(NavigationContext);\n  let location = useLocation();\n  let matches = useMatches();\n  let navigation = useNavigation();\n\n  // Trigger manual scroll restoration while we're active\n  React.useEffect(() => {\n    window.history.scrollRestoration = \"manual\";\n    return () => {\n      window.history.scrollRestoration = \"auto\";\n    };\n  }, []);\n\n  // Save positions on pagehide\n  usePageHide(\n    React.useCallback(() => {\n      if (navigation.state === \"idle\") {\n        let key = (getKey ? getKey(location, matches) : null) || location.key;\n        savedScrollPositions[key] = window.scrollY;\n      }\n      try {\n        sessionStorage.setItem(\n          storageKey || SCROLL_RESTORATION_STORAGE_KEY,\n          JSON.stringify(savedScrollPositions)\n        );\n      } catch (error) {\n        warning(\n          false,\n          `Failed to save scroll positions in sessionStorage, <ScrollRestoration /> will not work properly (${error}).`\n        );\n      }\n      window.history.scrollRestoration = \"auto\";\n    }, [storageKey, getKey, navigation.state, location, matches])\n  );\n\n  // Read in any saved scroll locations\n  if (typeof document !== \"undefined\") {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    React.useLayoutEffect(() => {\n      try {\n        let sessionPositions = sessionStorage.getItem(\n          storageKey || SCROLL_RESTORATION_STORAGE_KEY\n        );\n        if (sessionPositions) {\n          savedScrollPositions = JSON.parse(sessionPositions);\n        }\n      } catch (e) {\n        // no-op, use default empty object\n      }\n    }, [storageKey]);\n\n    // Enable scroll restoration in the router\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    React.useLayoutEffect(() => {\n      let getKeyWithoutBasename: GetScrollRestorationKeyFunction | undefined =\n        getKey && basename !== \"/\"\n          ? (location, matches) =>\n              getKey(\n                // Strip the basename to match useLocation()\n                {\n                  ...location,\n                  pathname:\n                    stripBasename(location.pathname, basename) ||\n                    location.pathname,\n                },\n                matches\n              )\n          : getKey;\n      let disableScrollRestoration = router?.enableScrollRestoration(\n        savedScrollPositions,\n        () => window.scrollY,\n        getKeyWithoutBasename\n      );\n      return () => disableScrollRestoration && disableScrollRestoration();\n    }, [router, basename, getKey]);\n\n    // Restore scrolling when state.restoreScrollPosition changes\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    React.useLayoutEffect(() => {\n      // Explicit false means don't do anything (used for submissions)\n      if (restoreScrollPosition === false) {\n        return;\n      }\n\n      // been here before, scroll to it\n      if (typeof restoreScrollPosition === \"number\") {\n        window.scrollTo(0, restoreScrollPosition);\n        return;\n      }\n\n      // try to scroll to the hash\n      if (location.hash) {\n        let el = document.getElementById(\n          decodeURIComponent(location.hash.slice(1))\n        );\n        if (el) {\n          el.scrollIntoView();\n          return;\n        }\n      }\n\n      // Don't reset if this navigation opted out\n      if (preventScrollReset === true) {\n        return;\n      }\n\n      // otherwise go to the top on new locations\n      window.scrollTo(0, 0);\n    }, [location, restoreScrollPosition, preventScrollReset]);\n  }\n}\n\nexport { useScrollRestoration as UNSAFE_useScrollRestoration };\n\n/**\n * Setup a callback to be fired on the window's `beforeunload` event. This is\n * useful for saving some data to `window.localStorage` just before the page\n * refreshes.\n *\n * Note: The `callback` argument should be a function created with\n * `React.useCallback()`.\n */\nexport function useBeforeUnload(\n  callback: (event: BeforeUnloadEvent) => any,\n  options?: { capture?: boolean }\n): void {\n  let { capture } = options || {};\n  React.useEffect(() => {\n    let opts = capture != null ? { capture } : undefined;\n    window.addEventListener(\"beforeunload\", callback, opts);\n    return () => {\n      window.removeEventListener(\"beforeunload\", callback, opts);\n    };\n  }, [callback, capture]);\n}\n\n/**\n * Setup a callback to be fired on the window's `pagehide` event. This is\n * useful for saving some data to `window.localStorage` just before the page\n * refreshes.  This event is better supported than beforeunload across browsers.\n *\n * Note: The `callback` argument should be a function created with\n * `React.useCallback()`.\n */\nfunction usePageHide(\n  callback: (event: PageTransitionEvent) => any,\n  options?: { capture?: boolean }\n): void {\n  let { capture } = options || {};\n  React.useEffect(() => {\n    let opts = capture != null ? { capture } : undefined;\n    window.addEventListener(\"pagehide\", callback, opts);\n    return () => {\n      window.removeEventListener(\"pagehide\", callback, opts);\n    };\n  }, [callback, capture]);\n}\n\n/**\n * Wrapper around useBlocker to show a window.confirm prompt to users instead\n * of building a custom UI with useBlocker.\n *\n * Warning: This has *a lot of rough edges* and behaves very differently (and\n * very incorrectly in some cases) across browsers if user click addition\n * back/forward navigations while the confirm is open.  Use at your own risk.\n */\nfunction usePrompt({\n  when,\n  message,\n}: {\n  when: boolean | BlockerFunction;\n  message: string;\n}) {\n  let blocker = useBlocker(when);\n\n  React.useEffect(() => {\n    if (blocker.state === \"blocked\") {\n      let proceed = window.confirm(message);\n      if (proceed) {\n        // This timeout is needed to avoid a weird \"race\" on POP navigations\n        // between the `window.history` revert navigation and the result of\n        // `window.confirm`\n        setTimeout(blocker.proceed, 0);\n      } else {\n        blocker.reset();\n      }\n    }\n  }, [blocker, message]);\n\n  React.useEffect(() => {\n    if (blocker.state === \"blocked\" && !when) {\n      blocker.reset();\n    }\n  }, [blocker, when]);\n}\n\nexport { usePrompt as unstable_usePrompt };\n\n/**\n * Return a boolean indicating if there is an active view transition to the\n * given href.  You can use this value to render CSS classes or viewTransitionName\n * styles onto your elements\n *\n * @param href The destination href\n * @param [opts.relative] Relative routing type (\"route\" | \"path\")\n */\nfunction useViewTransitionState(\n  to: To,\n  opts: { relative?: RelativeRoutingType } = {}\n) {\n  let vtContext = React.useContext(ViewTransitionContext);\n\n  invariant(\n    vtContext != null,\n    \"`unstable_useViewTransitionState` must be used within `react-router-dom`'s `RouterProvider`.  \" +\n      \"Did you accidentally import `RouterProvider` from `react-router`?\"\n  );\n\n  let { basename } = useDataRouterContext(\n    DataRouterHook.useViewTransitionState\n  );\n  let path = useResolvedPath(to, { relative: opts.relative });\n  if (!vtContext.isTransitioning) {\n    return false;\n  }\n\n  let currentPath =\n    stripBasename(vtContext.currentLocation.pathname, basename) ||\n    vtContext.currentLocation.pathname;\n  let nextPath =\n    stripBasename(vtContext.nextLocation.pathname, basename) ||\n    vtContext.nextLocation.pathname;\n\n  // Transition is active if we're going to or coming from the indicated\n  // destination.  This ensures that other PUSH navigations that reverse\n  // an indicated transition apply.  I.e., on the list view you have:\n  //\n  //   <NavLink to=\"/details/1\" unstable_viewTransition>\n  //\n  // If you click the breadcrumb back to the list view:\n  //\n  //   <NavLink to=\"/list\" unstable_viewTransition>\n  //\n  // We should apply the transition because it's indicated as active going\n  // from /list -> /details/1 and therefore should be active on the reverse\n  // (even though this isn't strictly a POP reverse)\n  return (\n    matchPath(path.pathname, nextPath) != null ||\n    matchPath(path.pathname, currentPath) != null\n  );\n}\n\nexport { useViewTransitionState as unstable_useViewTransitionState };\n\n//#endregion\n","type FilterPropsRes<T extends Record<string, any>> = {\n  [Key in keyof T]-?: T[Key] extends undefined ? never : T[Key];\n};\n\nexport function filterProps<T extends Record<string, any>>(props: T) {\n  return Object.keys(props).reduce<FilterPropsRes<T>>((acc, key: keyof T) => {\n    if (props[key] !== undefined) {\n      acc[key] = props[key];\n    }\n    return acc;\n  }, {} as FilterPropsRes<T>);\n}\n","import { filterProps } from '../../utils';\nimport { useMantineTheme } from '../MantineThemeProvider';\n\nexport function useProps<T extends Record<string, any>, U extends Partial<T> = {}>(\n  component: string,\n  defaultProps: U,\n  props: T\n): T & {\n  [Key in Extract<keyof T, keyof U>]-?: U[Key] | NonNullable<T[Key]>;\n} {\n  const theme = useMantineTheme();\n  const contextPropsPayload = theme.components[component]?.defaultProps;\n  const contextProps =\n    typeof contextPropsPayload === 'function' ? contextPropsPayload(theme) : contextPropsPayload;\n\n  return { ...defaultProps, ...contextProps, ...filterProps(props) };\n}\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import cx from 'clsx';\nimport { MantineTheme } from '../../../../MantineProvider';\nimport { GetStylesApiOptions } from '../../../styles-api.types';\n\ninterface GetGlobalClassNamesOptions {\n  theme: MantineTheme;\n  unstyled: boolean | undefined;\n  options: GetStylesApiOptions | undefined;\n}\n\nexport const FOCUS_CLASS_NAMES = {\n  always: 'mantine-focus-always',\n  auto: 'mantine-focus-auto',\n  never: 'mantine-focus-never',\n} as const;\n\n/** Returns classes that are defined globally (focus and active styles) based on options */\nexport function getGlobalClassNames({ theme, options, unstyled }: GetGlobalClassNamesOptions) {\n  return cx(\n    options?.focusable && !unstyled && (theme.focusClassName || FOCUS_CLASS_NAMES[theme.focusRing]),\n    options?.active && !unstyled && theme.activeClassName\n  );\n}\n","import cx from 'clsx';\nimport { MantineTheme } from '../../../../MantineProvider';\nimport type { _ClassNames } from '../get-class-name';\n\nexport interface ResolveClassNamesInput {\n  theme: MantineTheme;\n  classNames: _ClassNames;\n  props: Record<string, any>;\n  stylesCtx: Record<string, any> | undefined;\n}\n\nconst EMPTY_CLASS_NAMES: Partial<Record<string, string>> = {};\n\nfunction mergeClassNames(objects: Partial<Record<string, string>>[]) {\n  const merged: Partial<Record<string, string>> = {};\n\n  objects.forEach((obj) => {\n    Object.entries(obj).forEach(([key, value]) => {\n      if (merged[key]) {\n        merged[key] = cx(merged[key], value);\n      } else {\n        merged[key] = value;\n      }\n    });\n  });\n\n  return merged;\n}\n\nexport function resolveClassNames({ theme, classNames, props, stylesCtx }: ResolveClassNamesInput) {\n  const arrayClassNames = Array.isArray(classNames) ? classNames : [classNames];\n  const resolvedClassNames = arrayClassNames.map((item) =>\n    typeof item === 'function' ? item(theme, props, stylesCtx) : item || EMPTY_CLASS_NAMES\n  );\n\n  return mergeClassNames(resolvedClassNames);\n}\n","import {\n  resolveClassNames,\n  ResolveClassNamesInput,\n} from '../resolve-class-names/resolve-class-names';\n\ninterface GetResolvedClassNamesOptions extends ResolveClassNamesInput {\n  selector: string;\n}\n\nexport function getResolvedClassNames({\n  selector,\n  stylesCtx,\n  theme,\n  classNames,\n  props,\n}: GetResolvedClassNamesOptions) {\n  return resolveClassNames({ theme, classNames, props, stylesCtx })[selector];\n}\n","import cx from 'clsx';\nimport { MantineTheme } from '../../../MantineProvider';\nimport { GetStylesApiOptions } from '../../styles-api.types';\nimport { getGlobalClassNames } from './get-global-class-names/get-global-class-names';\nimport { getOptionsClassNames } from './get-options-class-names/get-options-class-names';\nimport { getResolvedClassNames } from './get-resolved-class-names/get-resolved-class-names';\nimport { getRootClassName } from './get-root-class-name/get-root-class-name';\nimport { getSelectorClassName } from './get-selector-class-name/get-selector-class-name';\nimport { getStaticClassNames } from './get-static-class-names/get-static-class-names';\nimport { getThemeClassNames } from './get-theme-class-names/get-theme-class-names';\nimport { getVariantClassName } from './get-variant-class-name/get-variant-class-name';\n\ntype __ClassNames =\n  | undefined\n  | Partial<Record<string, string>>\n  | ((\n      theme: MantineTheme,\n      props: Record<string, any>,\n      ctx: Record<string, any> | undefined\n    ) => Partial<Record<string, string>>);\n\nexport type _ClassNames = __ClassNames | __ClassNames[];\n\nexport interface GetClassNameOptions {\n  /** Theme object, resolved by hook */\n  theme: MantineTheme;\n\n  /** Options for specified selector, may include `classNames` or `className` */\n  options: GetStylesApiOptions | undefined;\n\n  /** Name of the component which is used to get `classNames` from `theme.components` */\n  themeName: string[];\n\n  /** Class part specified in `getStyles` */\n  selector: string;\n\n  /** Prefix for all class names, resolved by hook, `mantine` by default */\n  classNamesPrefix: string;\n\n  /** `classNames` specified in the hook, only resolved `classNames[selector]` is added to the list */\n  classNames: _ClassNames;\n\n  /** Classes object, usually imported from `*.module.css` */\n  classes: Record<string, string>;\n\n  /** Determines whether classes from `classes` should be added to the list */\n  unstyled: boolean | undefined;\n\n  /** `className` specified in the hook, added to the list if `selector` is `rootSelector` */\n  className: string | undefined;\n\n  /** `rootSelector` specified in the hook, determines whether `className` should be added to the list */\n  rootSelector: string;\n\n  /** Component props, used as context for `classNames` and `options.classNames` */\n  props: Record<string, any>;\n\n  /** Component styles context, used as context for `classNames` and `options.classNames` */\n  stylesCtx?: Record<string, any> | undefined;\n\n  /** Determines whether static classes should be added */\n  withStaticClasses?: boolean;\n\n  /** If set, removes all Mantine classes */\n  headless?: boolean;\n\n  /** `styles` prop transformed into classes with CSS-in-JS library, for example, emotion */\n  transformedStyles?: Record<string, string>[];\n}\n\nexport function getClassName({\n  theme,\n  options,\n  themeName,\n  selector,\n  classNamesPrefix,\n  classNames,\n  classes,\n  unstyled,\n  className,\n  rootSelector,\n  props,\n  stylesCtx,\n  withStaticClasses,\n  headless,\n  transformedStyles,\n}: GetClassNameOptions) {\n  return cx(\n    getGlobalClassNames({ theme, options, unstyled: unstyled || headless }),\n    getThemeClassNames({ theme, themeName, selector, props, stylesCtx }),\n    getVariantClassName({ options, classes, selector, unstyled }),\n    getResolvedClassNames({ selector, stylesCtx, theme, classNames, props }),\n    getResolvedClassNames({ selector, stylesCtx, theme, classNames: transformedStyles, props }),\n    getOptionsClassNames({ selector, stylesCtx, options, props, theme }),\n    getRootClassName({ rootSelector, selector, className }),\n    getSelectorClassName({ selector, classes, unstyled: unstyled || headless }),\n    withStaticClasses &&\n      !headless &&\n      getStaticClassNames({\n        themeName,\n        classNamesPrefix,\n        selector,\n        withStaticClass: options?.withStaticClass,\n      }),\n    options?.className\n  );\n}\n","import { MantineTheme } from '../../../../MantineProvider';\nimport { resolveClassNames } from '../resolve-class-names/resolve-class-names';\n\ninterface GetThemeClassNamesOptions {\n  theme: MantineTheme;\n  themeName: string[];\n  selector: string;\n  props: Record<string, any>;\n  stylesCtx: Record<string, any> | undefined;\n}\n\nexport function getThemeClassNames({\n  themeName,\n  theme,\n  selector,\n  props,\n  stylesCtx,\n}: GetThemeClassNamesOptions) {\n  return themeName.map(\n    (n) =>\n      resolveClassNames({\n        theme,\n        classNames: theme.components[n]?.classNames,\n        props,\n        stylesCtx,\n      })?.[selector]\n  );\n}\n","import { GetStylesApiOptions } from '../../../styles-api.types';\n\ninterface GetVariantClassNameInput {\n  options: GetStylesApiOptions | undefined;\n  classes: Record<string, string>;\n  selector: string;\n  unstyled: boolean | undefined;\n}\n\n/** Returns variant className, variant is always separated from selector with `--`, for example, `tab--default` */\nexport function getVariantClassName({\n  options,\n  classes,\n  selector,\n  unstyled,\n}: GetVariantClassNameInput) {\n  return options?.variant && !unstyled ? classes[`${selector}--${options.variant}`] : undefined;\n}\n","import { GetStylesApiOptions } from '../../../styles-api.types';\nimport {\n  resolveClassNames,\n  ResolveClassNamesInput,\n} from '../resolve-class-names/resolve-class-names';\n\ninterface GetOptionsClassNamesInput extends Omit<ResolveClassNamesInput, 'classNames'> {\n  selector: string;\n  options: GetStylesApiOptions | undefined;\n}\n\nexport function getOptionsClassNames({\n  selector,\n  stylesCtx,\n  options,\n  props,\n  theme,\n}: GetOptionsClassNamesInput) {\n  return resolveClassNames({\n    theme,\n    classNames: options?.classNames,\n    props: options?.props || props,\n    stylesCtx,\n  })[selector];\n}\n","interface GetRootClassNameInput {\n  rootSelector: string;\n  selector: string;\n  className: string | undefined;\n}\n\n/** Adds `className` to the list if given selector is root */\nexport function getRootClassName({ rootSelector, selector, className }: GetRootClassNameInput) {\n  return rootSelector === selector ? className : undefined;\n}\n","interface GetSelectorClassNameInput {\n  selector: string;\n  classes: Record<string, string>;\n  unstyled: boolean | undefined;\n}\n\n/** Returns class for given selector from library styles (`*.module.css`) */\nexport function getSelectorClassName({ selector, classes, unstyled }: GetSelectorClassNameInput) {\n  return unstyled ? undefined : classes[selector];\n}\n","interface GetStaticClassNamesInput {\n  themeName: string[];\n  selector: string;\n  classNamesPrefix: string;\n  withStaticClass?: boolean;\n}\n\n/** Returns static component classes, for example, `.mantine-Input-wrapper` */\nexport function getStaticClassNames({\n  themeName,\n  classNamesPrefix,\n  selector,\n  withStaticClass,\n}: GetStaticClassNamesInput) {\n  if (withStaticClass === false) {\n    return [];\n  }\n\n  return themeName.map((n) => `${classNamesPrefix}-${n}-${selector}`);\n}\n","import type { MantineTheme } from '../../../../MantineProvider';\nimport type { _Styles } from '../get-style';\n\nexport interface ResolveStylesInput {\n  theme: MantineTheme;\n  styles: _Styles | _Styles[];\n  props: Record<string, any>;\n  stylesCtx: Record<string, any> | undefined;\n}\n\nexport function resolveStyles({ theme, styles, props, stylesCtx }: ResolveStylesInput) {\n  const arrayStyles = Array.isArray(styles) ? styles : [styles];\n\n  return arrayStyles.reduce<Record<string, any>>((acc, style) => {\n    if (typeof style === 'function') {\n      return { ...acc, ...style(theme, props, stylesCtx) };\n    }\n\n    return { ...acc, ...style };\n  }, {});\n}\n","import { MantineTheme } from '../../../../MantineProvider';\nimport { resolveStyles } from '../resolve-styles/resolve-styles';\n\ninterface GetThemeStylesOptions {\n  theme: MantineTheme;\n  themeName: string[];\n  props: Record<string, any>;\n  stylesCtx: Record<string, any> | undefined;\n  selector: string;\n}\n\nexport function getThemeStyles({\n  theme,\n  themeName,\n  props,\n  stylesCtx,\n  selector,\n}: GetThemeStylesOptions) {\n  return themeName\n    .map(\n      (n) =>\n        resolveStyles({\n          theme,\n          styles: theme.components[n]?.styles,\n          props,\n          stylesCtx,\n        })[selector]\n    )\n    .reduce((acc, val) => ({ ...acc, ...val }), {});\n}\n","import { CSSProperties } from 'react';\nimport { MantineStyleProp } from '../../../../Box';\nimport { MantineTheme } from '../../../../MantineProvider';\n\ninterface ResolveStyleInput {\n  style: MantineStyleProp | undefined;\n  theme: MantineTheme;\n}\n\nexport function resolveStyle({ style, theme }: ResolveStyleInput): CSSProperties {\n  if (Array.isArray(style)) {\n    return [...style].reduce<Record<string, any>>(\n      (acc, item) => ({ ...acc, ...resolveStyle({ style: item, theme }) }),\n      {}\n    );\n  }\n\n  if (typeof style === 'function') {\n    return style(theme);\n  }\n\n  if (style == null) {\n    return {};\n  }\n\n  return style;\n}\n","import { CSSProperties } from 'react';\nimport { CssVariable } from '../../../../Box';\nimport { MantineTheme } from '../../../../MantineProvider';\nimport { mergeVars } from './merge-vars';\n\ntype ResolvedVars = Partial<Record<string, Record<CssVariable, string>>>;\n\nexport type VarsResolver = (\n  theme: MantineTheme,\n  props: Record<string, any>,\n  stylesCtx: Record<string, any> | undefined\n) => ResolvedVars;\n\ninterface ResolveVarsInput {\n  vars: VarsResolver | undefined;\n  varsResolver: VarsResolver | undefined;\n  theme: MantineTheme;\n  props: Record<string, any>;\n  stylesCtx: Record<string, any> | undefined;\n  selector: string;\n  themeName: string[];\n  headless?: boolean;\n}\n\nexport function resolveVars({\n  vars,\n  varsResolver,\n  theme,\n  props,\n  stylesCtx,\n  selector,\n  themeName,\n  headless,\n}: ResolveVarsInput) {\n  return mergeVars([\n    headless ? {} : varsResolver?.(theme, props, stylesCtx),\n    ...themeName.map((name) => theme.components?.[name]?.vars?.(theme, props, stylesCtx)),\n    vars?.(theme, props, stylesCtx),\n  ])?.[selector] as CSSProperties;\n}\n","import { CssVariable } from '../../../../Box';\nimport { filterProps } from '../../../../utils';\n\nexport type ResolvedVars = Partial<Record<string, Record<CssVariable, string | undefined>>>;\n\nexport function mergeVars(vars: (ResolvedVars | undefined)[]) {\n  return vars.reduce<ResolvedVars>((acc, current) => {\n    if (current) {\n      Object.keys(current).forEach((key) => {\n        acc[key] = { ...acc[key], ...filterProps(current[key]!) };\n      });\n    }\n\n    return acc;\n  }, {});\n}\n","import { CSSProperties } from 'react';\nimport { MantineStyleProp } from '../../../Box';\nimport { MantineTheme } from '../../../MantineProvider';\nimport { GetStylesApiOptions } from '../../styles-api.types';\nimport { getThemeStyles } from './get-theme-styles/get-theme-styles';\nimport { resolveStyle } from './resolve-style/resolve-style';\nimport { resolveStyles } from './resolve-styles/resolve-styles';\nimport { resolveVars, VarsResolver } from './resolve-vars/resolve-vars';\n\nexport type _Styles =\n  | undefined\n  | Partial<Record<string, CSSProperties>>\n  | ((\n      theme: MantineTheme,\n      props: Record<string, any>,\n      ctx: Record<string, any> | undefined\n    ) => Partial<Record<string, CSSProperties>>);\n\nexport interface GetStyleInput {\n  theme: MantineTheme;\n  themeName: string[];\n  selector: string;\n  rootSelector: string;\n  options: GetStylesApiOptions | undefined;\n  props: Record<string, any>;\n  stylesCtx: Record<string, any> | undefined;\n  styles: _Styles;\n  style: MantineStyleProp | undefined;\n  vars: VarsResolver | undefined;\n  varsResolver: VarsResolver | undefined;\n  headless?: boolean;\n  withStylesTransform?: boolean;\n}\n\nexport function getStyle({\n  theme,\n  themeName,\n  selector,\n  options,\n  props,\n  stylesCtx,\n  rootSelector,\n  styles,\n  style,\n  vars,\n  varsResolver,\n  headless,\n  withStylesTransform,\n}: GetStyleInput): CSSProperties {\n  return {\n    ...(!withStylesTransform && getThemeStyles({ theme, themeName, props, stylesCtx, selector })),\n    ...(!withStylesTransform && resolveStyles({ theme, styles, props, stylesCtx })[selector]),\n    ...(!withStylesTransform &&\n      resolveStyles({ theme, styles: options?.styles, props: options?.props || props, stylesCtx })[\n        selector\n      ]),\n    ...resolveVars({ theme, props, stylesCtx, vars, varsResolver, selector, themeName, headless }),\n    ...(rootSelector === selector ? resolveStyle({ style, theme }) : null),\n    ...resolveStyle({ style: options?.style, theme }),\n  };\n}\n","import { useMantineStylesTransform, useMantineTheme } from '../../MantineProvider';\n\ninterface UseTransformedStylesInput {\n  props: Record<string, any>;\n  stylesCtx: Record<string, any> | undefined;\n  themeName: string[];\n}\n\nexport function useStylesTransform({ props, stylesCtx, themeName }: UseTransformedStylesInput) {\n  const theme = useMantineTheme();\n  const stylesTransform = useMantineStylesTransform()?.();\n\n  const getTransformedStyles = (styles: any[]) => {\n    if (!stylesTransform) {\n      return [];\n    }\n\n    const transformedStyles = styles.map((style) =>\n      stylesTransform(style, { props, theme, ctx: stylesCtx })\n    );\n\n    return [\n      ...transformedStyles,\n      ...themeName.map((n) =>\n        stylesTransform(theme.components[n]?.styles, { props, theme, ctx: stylesCtx })\n      ),\n    ].filter(Boolean) as Record<string, string>[];\n  };\n\n  return {\n    getTransformedStyles,\n    withStylesTransform: !!stylesTransform,\n  };\n}\n","import { CSSProperties } from 'react';\nimport type { MantineStyleProp } from '../../Box';\nimport { FactoryPayload } from '../../factory';\nimport {\n  useMantineClassNamesPrefix,\n  useMantineIsHeadless,\n  useMantineTheme,\n  useMantineWithStaticClasses,\n} from '../../MantineProvider';\nimport { PartialVarsResolver, VarsResolver } from '../create-vars-resolver/create-vars-resolver';\nimport { ClassNames, ClassNamesArray, GetStylesApiOptions, Styles } from '../styles-api.types';\nimport { getClassName } from './get-class-name/get-class-name';\nimport { getStyle } from './get-style/get-style';\nimport { useStylesTransform } from './use-transformed-styles';\n\nexport interface UseStylesInput<Payload extends FactoryPayload> {\n  name: string | (string | undefined)[];\n  classes: Payload['stylesNames'] extends string ? Record<string, string> : never;\n  props: Payload['props'];\n  stylesCtx?: Payload['ctx'];\n  className?: string;\n  style?: MantineStyleProp;\n  rootSelector?: Payload['stylesNames'];\n  unstyled?: boolean;\n  classNames?: ClassNames<Payload> | ClassNamesArray<Payload>;\n  styles?: Styles<Payload>;\n  vars?: PartialVarsResolver<Payload>;\n  varsResolver?: VarsResolver<Payload>;\n}\n\nexport type GetStylesApi<Payload extends FactoryPayload> = (\n  selector: NonNullable<Payload['stylesNames']>,\n  options?: GetStylesApiOptions\n) => {\n  className: string;\n  style: CSSProperties;\n};\n\nexport function useStyles<Payload extends FactoryPayload>({\n  name,\n  classes,\n  props,\n  stylesCtx,\n  className,\n  style,\n  rootSelector = 'root' as NonNullable<Payload['stylesNames']>,\n  unstyled,\n  classNames,\n  styles,\n  vars,\n  varsResolver,\n}: UseStylesInput<Payload>): GetStylesApi<Payload> {\n  const theme = useMantineTheme();\n  const classNamesPrefix = useMantineClassNamesPrefix();\n  const withStaticClasses = useMantineWithStaticClasses();\n  const headless = useMantineIsHeadless();\n  const themeName = (Array.isArray(name) ? name : [name]).filter((n) => n) as string[];\n  const { withStylesTransform, getTransformedStyles } = useStylesTransform({\n    props,\n    stylesCtx,\n    themeName,\n  });\n\n  return (selector, options) => ({\n    className: getClassName({\n      theme,\n      options,\n      themeName,\n      selector,\n      classNamesPrefix,\n      classNames,\n      classes,\n      unstyled,\n      className,\n      rootSelector,\n      props,\n      stylesCtx,\n      withStaticClasses,\n      headless,\n      transformedStyles: getTransformedStyles([options?.styles, styles]),\n    }),\n\n    style: getStyle({\n      theme,\n      themeName,\n      selector,\n      options,\n      props,\n      stylesCtx,\n      rootSelector,\n      styles,\n      style,\n      vars,\n      varsResolver,\n      headless,\n      withStylesTransform,\n    }),\n  });\n}\n","import { camelToKebabCase, keys } from '../../utils';\n\nexport function cssObjectToString(css: React.CSSProperties) {\n  return keys(css)\n    .reduce(\n      (acc, rule) =>\n        css[rule] !== undefined ? `${acc}${camelToKebabCase(rule)}:${css[rule]};` : acc,\n      ''\n    )\n    .trim();\n}\n","export function camelToKebabCase(value: string) {\n  return value.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n}\n","import { cssObjectToString } from '../css-object-to-string/css-object-to-string';\n\nexport interface InlineStylesMediaQuery {\n  query: string;\n  styles: React.CSSProperties;\n}\n\nexport interface InlineStylesInput {\n  selector: string;\n  styles?: React.CSSProperties;\n  media?: InlineStylesMediaQuery[];\n  container?: InlineStylesMediaQuery[];\n}\n\nexport function stylesToString({ selector, styles, media, container }: InlineStylesInput) {\n  const baseStyles = styles ? cssObjectToString(styles) : '';\n  const mediaQueryStyles = !Array.isArray(media)\n    ? []\n    : media.map((item) => `@media${item.query}{${selector}{${cssObjectToString(item.styles)}}}`);\n\n  const containerStyles = !Array.isArray(container)\n    ? []\n    : container.map(\n        (item) => `@container ${item.query}{${selector}{${cssObjectToString(item.styles)}}}`\n      );\n\n  return `${baseStyles ? `${selector}{${baseStyles}}` : ''}${mediaQueryStyles.join('')}${containerStyles.join('')}`.trim();\n}\n","import { useMantineStyleNonce } from '../MantineProvider';\nimport { InlineStylesInput, stylesToString } from './styles-to-string/styles-to-string';\n\nexport interface InlineStylesProps\n  extends InlineStylesInput,\n    Omit<React.ComponentPropsWithoutRef<'style'>, keyof InlineStylesInput> {}\n\nexport function InlineStyles(props: InlineStylesInput) {\n  const nonce = useMantineStyleNonce();\n  return (\n    <style\n      data-mantine-styles=\"inline\"\n      nonce={nonce?.()}\n      dangerouslySetInnerHTML={{ __html: stylesToString(props) }}\n    />\n  );\n}\n","export function isNumberLike(value: unknown) {\n  if (typeof value === 'number') {\n    return true;\n  }\n\n  if (typeof value === 'string') {\n    if (\n      value.startsWith('calc(') ||\n      value.startsWith('var(') ||\n      (value.includes(' ') && value.trim() !== '')\n    ) {\n      return true;\n    }\n\n    const cssUnitsRegex =\n      /^[+-]?[0-9]+(\\.[0-9]+)?(px|em|rem|ex|ch|lh|rlh|vw|vh|vmin|vmax|vb|vi|svw|svh|lvw|lvh|dvw|dvh|cm|mm|in|pt|pc|q|cqw|cqh|cqi|cqb|cqmin|cqmax|%)?$/;\n    const values = value.trim().split(/\\s+/);\n    return values.every((val) => cssUnitsRegex.test(val));\n  }\n\n  return false;\n}\n","function transformModKey(key: string) {\n  return key.startsWith('data-') ? key : `data-${key}`;\n}\n\nexport function getMod(props: Record<string, any>) {\n  return Object.keys(props).reduce<Record<string, any>>((acc, key) => {\n    const value = props[key];\n\n    if (value === undefined || value === '' || value === false || value === null) {\n      return acc;\n    }\n\n    acc[transformModKey(key)] = props[key];\n    return acc;\n  }, {});\n}\n\nexport function getBoxMod(mod?: any): Record<string, any> | null {\n  if (!mod) {\n    return null;\n  }\n\n  if (typeof mod === 'string') {\n    return { [transformModKey(mod)]: true };\n  }\n\n  if (Array.isArray(mod)) {\n    return [...mod].reduce<Record<`data-${string}`, any>>(\n      (acc, value) => ({ ...acc, ...getBoxMod(value) }),\n      {}\n    );\n  }\n\n  return getMod(mod);\n}\n","import type { MantineTheme } from '../../MantineProvider';\nimport type { CssVarsProp, MantineStyleProp } from '../Box.types';\n\ninterface GetBoxStyleOptions {\n  theme: MantineTheme;\n  styleProps: React.CSSProperties;\n  style?: MantineStyleProp;\n  vars?: CssVarsProp;\n}\n\nfunction mergeStyles(\n  styles: MantineStyleProp | CssVarsProp | undefined,\n  theme: MantineTheme\n): React.CSSProperties {\n  if (Array.isArray(styles)) {\n    return [...styles].reduce<Record<string, any>>(\n      (acc, item) => ({ ...acc, ...mergeStyles(item, theme) }),\n      {}\n    );\n  }\n\n  if (typeof styles === 'function') {\n    return styles(theme);\n  }\n\n  if (styles == null) {\n    return {};\n  }\n\n  return styles;\n}\n\nexport function getBoxStyle({\n  theme,\n  style,\n  vars,\n  styleProps,\n}: GetBoxStyleOptions): React.CSSProperties {\n  const _style = mergeStyles(style, theme);\n  const _vars = mergeStyles(vars, theme);\n  return { ..._style, ..._vars, ...styleProps };\n}\n","import { filterProps } from '../../../utils';\nimport type { MantineStyleProps } from '../style-props.types';\n\nexport function extractStyleProps<T extends Record<string, any>>(\n  others: MantineStyleProps & T\n): { styleProps: MantineStyleProps & { sx?: any }; rest: T } {\n  const {\n    m,\n    mx,\n    my,\n    mt,\n    mb,\n    ml,\n    mr,\n    me,\n    ms,\n    p,\n    px,\n    py,\n    pt,\n    pb,\n    pl,\n    pr,\n    pe,\n    ps,\n    bd,\n    bg,\n    c,\n    opacity,\n    ff,\n    fz,\n    fw,\n    lts,\n    ta,\n    lh,\n    fs,\n    tt,\n    td,\n    w,\n    miw,\n    maw,\n    h,\n    mih,\n    mah,\n    bgsz,\n    bgp,\n    bgr,\n    bga,\n    pos,\n    top,\n    left,\n    bottom,\n    right,\n    inset,\n    display,\n    flex,\n    hiddenFrom,\n    visibleFrom,\n    lightHidden,\n    darkHidden,\n    sx,\n    ...rest\n  } = others;\n\n  const styleProps = filterProps({\n    m,\n    mx,\n    my,\n    mt,\n    mb,\n    ml,\n    mr,\n    me,\n    ms,\n    p,\n    px,\n    py,\n    pt,\n    pb,\n    pl,\n    pr,\n    pe,\n    ps,\n    bd,\n    bg,\n    c,\n    opacity,\n    ff,\n    fz,\n    fw,\n    lts,\n    ta,\n    lh,\n    fs,\n    tt,\n    td,\n    w,\n    miw,\n    maw,\n    h,\n    mih,\n    mah,\n    bgsz,\n    bgp,\n    bgr,\n    bga,\n    pos,\n    top,\n    left,\n    bottom,\n    right,\n    inset,\n    display,\n    flex,\n    hiddenFrom,\n    visibleFrom,\n    lightHidden,\n    darkHidden,\n    sx,\n  });\n\n  return { styleProps, rest: rest as unknown as T };\n}\n","import type { StylePropType } from './resolvers';\nimport type { MantineStyleProps } from './style-props.types';\n\nexport interface SystemPropData {\n  type: StylePropType;\n  property: string | string[];\n}\n\nexport const STYlE_PROPS_DATA: Record<keyof MantineStyleProps, SystemPropData> = {\n  m: { type: 'spacing', property: 'margin' },\n  mt: { type: 'spacing', property: 'marginTop' },\n  mb: { type: 'spacing', property: 'marginBottom' },\n  ml: { type: 'spacing', property: 'marginLeft' },\n  mr: { type: 'spacing', property: 'marginRight' },\n  ms: { type: 'spacing', property: 'marginInlineStart' },\n  me: { type: 'spacing', property: 'marginInlineEnd' },\n  mx: { type: 'spacing', property: 'marginInline' },\n  my: { type: 'spacing', property: 'marginBlock' },\n\n  p: { type: 'spacing', property: 'padding' },\n  pt: { type: 'spacing', property: 'paddingTop' },\n  pb: { type: 'spacing', property: 'paddingBottom' },\n  pl: { type: 'spacing', property: 'paddingLeft' },\n  pr: { type: 'spacing', property: 'paddingRight' },\n  ps: { type: 'spacing', property: 'paddingInlineStart' },\n  pe: { type: 'spacing', property: 'paddingInlineEnd' },\n  px: { type: 'spacing', property: 'paddingInline' },\n  py: { type: 'spacing', property: 'paddingBlock' },\n\n  bd: { type: 'border', property: 'border' },\n  bg: { type: 'color', property: 'background' },\n  c: { type: 'textColor', property: 'color' },\n  opacity: { type: 'identity', property: 'opacity' },\n\n  ff: { type: 'fontFamily', property: 'fontFamily' },\n  fz: { type: 'fontSize', property: 'fontSize' },\n  fw: { type: 'identity', property: 'fontWeight' },\n  lts: { type: 'size', property: 'letterSpacing' },\n  ta: { type: 'identity', property: 'textAlign' },\n  lh: { type: 'lineHeight', property: 'lineHeight' },\n  fs: { type: 'identity', property: 'fontStyle' },\n  tt: { type: 'identity', property: 'textTransform' },\n  td: { type: 'identity', property: 'textDecoration' },\n\n  w: { type: 'spacing', property: 'width' },\n  miw: { type: 'spacing', property: 'minWidth' },\n  maw: { type: 'spacing', property: 'maxWidth' },\n  h: { type: 'spacing', property: 'height' },\n  mih: { type: 'spacing', property: 'minHeight' },\n  mah: { type: 'spacing', property: 'maxHeight' },\n\n  bgsz: { type: 'size', property: 'backgroundSize' },\n  bgp: { type: 'identity', property: 'backgroundPosition' },\n  bgr: { type: 'identity', property: 'backgroundRepeat' },\n  bga: { type: 'identity', property: 'backgroundAttachment' },\n\n  pos: { type: 'identity', property: 'position' },\n  top: { type: 'size', property: 'top' },\n  left: { type: 'size', property: 'left' },\n  bottom: { type: 'size', property: 'bottom' },\n  right: { type: 'size', property: 'right' },\n  inset: { type: 'size', property: 'inset' },\n\n  display: { type: 'identity', property: 'display' },\n  flex: { type: 'identity', property: 'flex' },\n};\n","import { MantineTheme, parseThemeColor } from '../../../../MantineProvider';\n\nexport function colorResolver(color: unknown, theme: MantineTheme) {\n  const parsedColor = parseThemeColor({ color, theme });\n\n  if (parsedColor.color === 'dimmed') {\n    return 'var(--mantine-color-dimmed)';\n  }\n\n  if (parsedColor.color === 'bright') {\n    return 'var(--mantine-color-bright)';\n  }\n  return parsedColor.variable ? `var(${parsedColor.variable})` : parsedColor.color;\n}\n\nexport function textColorResolver(color: unknown, theme: MantineTheme) {\n  const parsedColor = parseThemeColor({ color, theme });\n\n  if (parsedColor.isThemeColor && parsedColor.shade === undefined) {\n    return `var(--mantine-color-${parsedColor.color}-text)`;\n  }\n\n  return colorResolver(color, theme);\n}\n","const values = {\n  text: 'var(--mantine-font-family)',\n  mono: 'var(--mantine-font-family-monospace)',\n  monospace: 'var(--mantine-font-family-monospace)',\n  heading: 'var(--mantine-font-family-headings)',\n  headings: 'var(--mantine-font-family-headings)',\n};\n\nexport function fontFamilyResolver(fontFamily: unknown) {\n  if (typeof fontFamily === 'string' && fontFamily in values) {\n    return values[fontFamily as keyof typeof values];\n  }\n\n  return fontFamily;\n}\n","import { MantineTheme } from '../../../../MantineProvider';\nimport { rem } from '../../../../utils';\n\nconst headings = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\n\nexport function fontSizeResolver(value: unknown, theme: MantineTheme) {\n  if (typeof value === 'string' && value in theme.fontSizes) {\n    return `var(--mantine-font-size-${value})`;\n  }\n\n  if (typeof value === 'string' && headings.includes(value)) {\n    return `var(--mantine-${value}-font-size)`;\n  }\n\n  if (typeof value === 'number') {\n    return rem(value);\n  }\n\n  if (typeof value === 'string') {\n    return rem(value);\n  }\n\n  return value;\n}\n","import { MantineTheme } from '../../../../MantineProvider';\n\nconst headings = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\n\nexport function lineHeightResolver(value: unknown, theme: MantineTheme) {\n  if (typeof value === 'string' && value in theme.lineHeights) {\n    return `var(--mantine-line-height-${value})`;\n  }\n\n  if (typeof value === 'string' && headings.includes(value)) {\n    return `var(--mantine-${value}-line-height)`;\n  }\n\n  return value;\n}\n","import { borderResolver } from './border-resolver/border-resolver';\nimport { colorResolver, textColorResolver } from './color-resolver/color-resolver';\nimport { fontFamilyResolver } from './font-family-resolver/font-family-resolver';\nimport { fontSizeResolver } from './font-size-resolver/font-size-resolver';\nimport { identityResolver } from './identity-resolver/identity-resolver';\nimport { lineHeightResolver } from './line-height-resolver/line-height-resolver';\nimport { sizeResolver } from './size-resolver/size-resolver';\nimport { spacingResolver } from './spacing-resolver/spacing-resolver';\n\nexport const resolvers = {\n  color: colorResolver,\n  textColor: textColorResolver,\n  fontSize: fontSizeResolver,\n  spacing: spacingResolver,\n  identity: identityResolver,\n  size: sizeResolver,\n  lineHeight: lineHeightResolver,\n  fontFamily: fontFamilyResolver,\n  border: borderResolver,\n};\n\nexport type StylePropType = keyof typeof resolvers;\n","import { MantineTheme } from '../../../../MantineProvider';\nimport { rem } from '../../../../utils';\n\nexport function spacingResolver(value: unknown, theme: MantineTheme) {\n  if (typeof value === 'number') {\n    return rem(value);\n  }\n\n  if (typeof value === 'string') {\n    const mod = value.replace('-', '');\n\n    if (!(mod in theme.spacing)) {\n      return rem(value);\n    }\n\n    const variable = `--mantine-spacing-${mod}`;\n    return value.startsWith('-') ? `calc(var(${variable}) * -1)` : `var(${variable})`;\n  }\n\n  return value;\n}\n","export function identityResolver(value: unknown) {\n  return value;\n}\n","import { rem } from '../../../../utils';\n\nexport function sizeResolver(value: unknown) {\n  if (typeof value === 'number') {\n    return rem(value);\n  }\n\n  return value;\n}\n","import { MantineTheme } from '../../../../MantineProvider';\nimport { rem } from '../../../../utils';\nimport { colorResolver } from '../color-resolver/color-resolver';\n\nexport function borderResolver(value: unknown, theme: MantineTheme) {\n  if (typeof value === 'number') {\n    return rem(value);\n  }\n\n  if (typeof value === 'string') {\n    const [size, style, ...colorTuple] = value.split(' ').filter((val) => val.trim() !== '');\n    let result = `${rem(size)}`;\n    style && (result += ` ${style}`);\n    colorTuple.length > 0 && (result += ` ${colorResolver(colorTuple.join(' '), theme)}`);\n    return result.trim();\n  }\n\n  return value;\n}\n","import type { InlineStylesMediaQuery } from '../../../InlineStyles';\nimport type { ParseStylePropsResult } from './parse-style-props';\n\nexport interface SortMediaQueriesResult extends Omit<ParseStylePropsResult, 'media'> {\n  media: InlineStylesMediaQuery[];\n}\n\nfunction replaceMediaQuery(query: string) {\n  return query.replace('(min-width: ', '').replace('em)', '');\n}\n\nexport function sortMediaQueries({\n  media,\n  ...props\n}: ParseStylePropsResult): SortMediaQueriesResult {\n  const breakpoints = Object.keys(media);\n  const sortedMedia = breakpoints\n    .sort((a, b) => Number(replaceMediaQuery(a)) - Number(replaceMediaQuery(b)))\n    .map((query) => ({ query, styles: media[query] }));\n\n  return { ...props, media: sortedMedia };\n}\n","import { MantineTheme } from '../../../MantineProvider';\nimport { keys } from '../../../utils';\nimport { resolvers } from '../resolvers';\nimport type { SystemPropData } from '../style-props-data';\nimport type { StyleProp } from '../style-props.types';\nimport { sortMediaQueries, SortMediaQueriesResult } from './sort-media-queries';\n\nfunction hasResponsiveStyles(styleProp: StyleProp<unknown>) {\n  if (typeof styleProp !== 'object' || styleProp === null) {\n    return false;\n  }\n\n  const breakpoints = Object.keys(styleProp);\n\n  if (breakpoints.length === 1 && breakpoints[0] === 'base') {\n    return false;\n  }\n\n  return true;\n}\n\nfunction getBaseValue(value: StyleProp<unknown>) {\n  if (typeof value === 'object' && value !== null) {\n    if ('base' in value) {\n      return value.base;\n    }\n\n    return undefined;\n  }\n\n  return value;\n}\n\nfunction getBreakpointKeys(value: StyleProp<unknown>) {\n  if (typeof value === 'object' && value !== null) {\n    return keys(value).filter((key) => key !== 'base');\n  }\n\n  return [];\n}\n\nfunction getBreakpointValue(value: StyleProp<unknown>, breakpoint: string) {\n  if (typeof value === 'object' && value !== null && breakpoint in value) {\n    return value[breakpoint as keyof typeof value];\n  }\n\n  return value;\n}\n\ninterface ParseStylePropsOptions {\n  styleProps: Record<string, StyleProp<any>>;\n  theme: MantineTheme;\n  data: Record<string, SystemPropData>;\n}\n\nexport interface ParseStylePropsResult {\n  hasResponsiveStyles: boolean;\n  inlineStyles: React.CSSProperties;\n  styles: React.CSSProperties;\n  media: Record<string, React.CSSProperties>;\n}\n\nexport function parseStyleProps({\n  styleProps,\n  data,\n  theme,\n}: ParseStylePropsOptions): SortMediaQueriesResult {\n  return sortMediaQueries(\n    keys(styleProps).reduce<{\n      hasResponsiveStyles: boolean;\n      inlineStyles: Record<string, unknown>;\n      styles: Record<string, unknown>;\n      media: Record<string, Record<string, unknown>>;\n    }>(\n      (acc, styleProp) => {\n        if (\n          (styleProp as string) === 'hiddenFrom' ||\n          (styleProp as string) === 'visibleFrom' ||\n          (styleProp as string) === 'sx'\n        ) {\n          return acc;\n        }\n\n        const propertyData = data[styleProp];\n        const properties = Array.isArray(propertyData.property)\n          ? propertyData.property\n          : [propertyData.property];\n        const baseValue = getBaseValue(styleProps[styleProp]);\n\n        if (!hasResponsiveStyles(styleProps[styleProp])) {\n          properties.forEach((property) => {\n            acc.inlineStyles[property] = resolvers[propertyData.type](baseValue, theme);\n          });\n\n          return acc;\n        }\n\n        acc.hasResponsiveStyles = true;\n\n        const breakpoints = getBreakpointKeys(styleProps[styleProp]);\n\n        properties.forEach((property) => {\n          if (baseValue) {\n            acc.styles[property] = resolvers[propertyData.type](baseValue, theme);\n          }\n\n          breakpoints.forEach((breakpoint) => {\n            const bp = `(min-width: ${theme.breakpoints[breakpoint]})`;\n            acc.media[bp] = {\n              ...acc.media[bp],\n              [property]: resolvers[propertyData.type](\n                getBreakpointValue(styleProps[styleProp], breakpoint),\n                theme\n              ),\n            };\n          });\n        });\n\n        return acc;\n      },\n      {\n        hasResponsiveStyles: false,\n        styles: {},\n        inlineStyles: {},\n        media: {},\n      }\n    )\n  );\n}\n","import { useId } from 'react';\n\nexport function useRandomClassName() {\n  const id = useId().replace(/:/g, '');\n  return `__m__-${id}`;\n}\n","import { forwardRef } from 'react';\nimport cx from 'clsx';\nimport { createPolymorphicComponent } from '../factory';\nimport { InlineStyles } from '../InlineStyles';\nimport { MantineBreakpoint, useMantineSxTransform, useMantineTheme } from '../MantineProvider';\nimport { isNumberLike } from '../utils';\nimport type { CssVarsProp, MantineStyleProp } from './Box.types';\nimport { getBoxMod } from './get-box-mod/get-box-mod';\nimport { getBoxStyle } from './get-box-style/get-box-style';\nimport {\n  extractStyleProps,\n  MantineStyleProps,\n  parseStyleProps,\n  STYlE_PROPS_DATA,\n} from './style-props';\nimport { useRandomClassName } from './use-random-classname/use-random-classname';\n\nexport type Mod = Record<string, any> | string;\nexport type BoxMod = Mod | Mod[] | BoxMod[];\n\nexport interface BoxProps extends MantineStyleProps {\n  /** Class added to the root element, if applicable */\n  className?: string;\n\n  /** Inline style added to root component element, can subscribe to theme defined on MantineProvider */\n  style?: MantineStyleProp;\n\n  /** CSS variables defined on root component element */\n  __vars?: CssVarsProp;\n\n  /** `size` property passed down the HTML element */\n  __size?: string;\n\n  /** Breakpoint above which the component is hidden with `display: none` */\n  hiddenFrom?: MantineBreakpoint;\n\n  /** Breakpoint below which the component is hidden with `display: none` */\n  visibleFrom?: MantineBreakpoint;\n\n  /** Determines whether component should be hidden in light color scheme with `display: none` */\n  lightHidden?: boolean;\n\n  /** Determines whether component should be hidden in dark color scheme with `display: none` */\n  darkHidden?: boolean;\n\n  /** Element modifiers transformed into `data-` attributes, for example, `{ 'data-size': 'xl' }`, falsy values are removed */\n  mod?: BoxMod;\n}\n\nexport type ElementProps<\n  ElementType extends React.ElementType,\n  PropsToOmit extends string = never,\n> = Omit<React.ComponentPropsWithoutRef<ElementType>, 'style' | PropsToOmit>;\n\nexport interface BoxComponentProps extends BoxProps {\n  /** Variant passed from parent component, sets `data-variant` */\n  variant?: string;\n\n  /** Size passed from parent component, sets `data-size` if value is not number like */\n  size?: string | number;\n}\n\nconst _Box = forwardRef<\n  HTMLDivElement,\n  BoxComponentProps & { component: any; className: string; renderRoot: any }\n>(\n  (\n    {\n      component,\n      style,\n      __vars,\n      className,\n      variant,\n      mod,\n      size,\n      hiddenFrom,\n      visibleFrom,\n      lightHidden,\n      darkHidden,\n      renderRoot,\n      __size,\n      ...others\n    },\n    ref\n  ) => {\n    const theme = useMantineTheme();\n    const Element = component || 'div';\n    const { styleProps, rest } = extractStyleProps(others);\n    const useSxTransform = useMantineSxTransform();\n    const transformedSx = useSxTransform?.()?.(styleProps.sx);\n    const responsiveClassName = useRandomClassName();\n    const parsedStyleProps = parseStyleProps({\n      styleProps,\n      theme,\n      data: STYlE_PROPS_DATA,\n    });\n\n    const props = {\n      ref,\n      style: getBoxStyle({\n        theme,\n        style,\n        vars: __vars,\n        styleProps: parsedStyleProps.inlineStyles,\n      }),\n      className: cx(className, transformedSx, {\n        [responsiveClassName]: parsedStyleProps.hasResponsiveStyles,\n        'mantine-light-hidden': lightHidden,\n        'mantine-dark-hidden': darkHidden,\n        [`mantine-hidden-from-${hiddenFrom}`]: hiddenFrom,\n        [`mantine-visible-from-${visibleFrom}`]: visibleFrom,\n      }),\n      'data-variant': variant,\n      'data-size': isNumberLike(size) ? undefined : size || undefined,\n      size: __size,\n      ...getBoxMod(mod),\n      ...rest,\n    };\n\n    return (\n      <>\n        {parsedStyleProps.hasResponsiveStyles && (\n          <InlineStyles\n            selector={`.${responsiveClassName}`}\n            styles={parsedStyleProps.styles}\n            media={parsedStyleProps.media}\n          />\n        )}\n\n        {typeof renderRoot === 'function' ? renderRoot(props) : <Element {...props} />}\n      </>\n    );\n  }\n);\n\n_Box.displayName = '@mantine/core/Box';\n\nexport const Box = createPolymorphicComponent<'div', BoxComponentProps>(_Box);\n","import { forwardRef } from 'react';\nimport type { MantineThemeComponent } from '../MantineProvider';\nimport type { ClassNames, PartialVarsResolver, Styles } from '../styles-api';\n\nexport type DataAttributes = Record<`data-${string}`, any>;\n\nexport interface FactoryPayload {\n  props: Record<string, any>;\n  ctx?: any;\n  ref?: any;\n  stylesNames?: string;\n  vars?: any;\n  variant?: string;\n  staticComponents?: Record<string, any>;\n  // Compound components cannot have classNames, styles and vars on MantineProvider\n  compound?: boolean;\n}\n\nexport interface ExtendCompoundComponent<Payload extends FactoryPayload> {\n  defaultProps?: Partial<Payload['props']> & DataAttributes;\n}\n\nexport interface ExtendsRootComponent<Payload extends FactoryPayload> {\n  defaultProps?: Partial<Payload['props']> & DataAttributes;\n  classNames?: ClassNames<Payload>;\n  styles?: Styles<Payload>;\n  vars?: PartialVarsResolver<Payload>;\n}\n\nexport type ExtendComponent<Payload extends FactoryPayload> = Payload['compound'] extends true\n  ? ExtendCompoundComponent<Payload>\n  : ExtendsRootComponent<Payload>;\n\nexport type StaticComponents<Input> =\n  Input extends Record<string, any> ? Input : Record<string, never>;\n\nexport interface ThemeExtend<Payload extends FactoryPayload> {\n  extend: (input: ExtendComponent<Payload>) => MantineThemeComponent;\n}\n\nexport type ComponentClasses<Payload extends FactoryPayload> = {\n  classes: Payload['stylesNames'] extends string ? Record<string, string> : never;\n};\n\nexport type MantineComponentStaticProperties<Payload extends FactoryPayload> =\n  ThemeExtend<Payload> &\n    ComponentClasses<Payload> &\n    StaticComponents<Payload['staticComponents']> &\n    FactoryComponentWithProps<Payload>;\n\nexport type FactoryComponentWithProps<Payload extends FactoryPayload> = {\n  withProps: (props: Partial<Payload['props']>) => React.ForwardRefExoticComponent<\n    Payload['props'] &\n      React.RefAttributes<Payload['ref']> & {\n        component?: any;\n        renderRoot?: (props: Record<string, any>) => React.ReactNode;\n      }\n  >;\n};\n\nexport type MantineComponent<Payload extends FactoryPayload> = React.ForwardRefExoticComponent<\n  Payload['props'] &\n    React.RefAttributes<Payload['ref']> & {\n      component?: any;\n      renderRoot?: (props: Record<string, any>) => React.ReactNode;\n    }\n> &\n  MantineComponentStaticProperties<Payload>;\n\nexport function identity<T>(value: T): T {\n  return value;\n}\n\nexport function getWithProps<T, Props>(Component: T): (props: Partial<Props>) => T {\n  const _Component = Component as any;\n  return (fixedProps: any) => {\n    const Extended = forwardRef((props, ref) => (\n      <_Component {...fixedProps} {...props} ref={ref as any} />\n    )) as any;\n    Extended.extend = _Component.extend;\n    Extended.displayName = `WithProps(${_Component.displayName})`;\n    return Extended;\n  };\n}\n\nexport function factory<Payload extends FactoryPayload>(\n  ui: React.ForwardRefRenderFunction<Payload['ref'], Payload['props']>\n) {\n  const Component = forwardRef(ui) as any;\n\n  Component.extend = identity as any;\n  Component.withProps = (fixedProps: any) => {\n    const Extended = forwardRef((props, ref) => (\n      <Component {...fixedProps} {...props} ref={ref as any} />\n    )) as any;\n    Extended.extend = Component.extend;\n    Extended.displayName = `WithProps(${Component.displayName})`;\n    return Extended;\n  };\n\n  return Component as MantineComponent<Payload>;\n}\n","import { rem } from '../../core';\nimport type { TitleOrder, TitleSize } from './Title';\n\nconst headings: unknown[] = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\nconst sizes: unknown[] = ['xs', 'sm', 'md', 'lg', 'xl'];\n\nexport interface GetTitleSizeResult {\n  fontSize: string;\n  fontWeight: string;\n  lineHeight: string;\n}\n\nexport function getTitleSize(order: TitleOrder, size?: TitleSize): GetTitleSizeResult {\n  const titleSize = size !== undefined ? size : `h${order}`;\n\n  if (headings.includes(titleSize)) {\n    return {\n      fontSize: `var(--mantine-${titleSize}-font-size)`,\n      fontWeight: `var(--mantine-${titleSize}-font-weight)`,\n      lineHeight: `var(--mantine-${titleSize}-line-height)`,\n    };\n  } else if (sizes.includes(titleSize)) {\n    return {\n      fontSize: `var(--mantine-font-size-${titleSize})`,\n      fontWeight: `var(--mantine-h${order}-font-weight)`,\n      lineHeight: `var(--mantine-h${order}-line-height)`,\n    };\n  }\n\n  return {\n    fontSize: rem(titleSize),\n    fontWeight: `var(--mantine-h${order}-font-weight)`,\n    lineHeight: `var(--mantine-h${order}-line-height)`,\n  };\n}\n","import {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  factory,\n  Factory,\n  MantineSize,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../core';\nimport { getTitleSize } from './get-title-size';\nimport classes from './Title.module.css';\n\nexport type TitleOrder = 1 | 2 | 3 | 4 | 5 | 6;\nexport type TitleSize = `h${TitleOrder}` | React.CSSProperties['fontSize'] | MantineSize;\n\nexport type TitleStylesNames = 'root';\nexport type TitleCssVariables = {\n  root: '--title-fw' | '--title-lh' | '--title-fz' | '--title-line-clamp' | '--title-text-wrap';\n};\n\nexport interface TitleProps\n  extends BoxProps,\n    StylesApiProps<TitleFactory>,\n    ElementProps<'h1', 'color'> {\n  /** Determines which tag will be used (h1-h6), controls `font-size` style if `size` prop is not set, `1` by default */\n  order?: TitleOrder;\n\n  /** Changes title size, if not set, then size is controlled by `order` prop */\n  size?: TitleSize;\n\n  /** Number of lines after which Text will be truncated */\n  lineClamp?: number;\n\n  /** Controls `text-wrap` property, `'wrap'` by default */\n  textWrap?: 'wrap' | 'nowrap' | 'balance' | 'pretty' | 'stable';\n}\n\nexport type TitleFactory = Factory<{\n  props: TitleProps;\n  ref: HTMLHeadingElement;\n  stylesNames: TitleStylesNames;\n  vars: TitleCssVariables;\n}>;\n\nconst defaultProps: Partial<TitleProps> = {\n  order: 1,\n};\n\nconst varsResolver = createVarsResolver<TitleFactory>((_, { order, size, lineClamp, textWrap }) => {\n  const sizeVariables = getTitleSize(order!, size);\n  return {\n    root: {\n      '--title-fw': sizeVariables.fontWeight,\n      '--title-lh': sizeVariables.lineHeight,\n      '--title-fz': sizeVariables.fontSize,\n      '--title-line-clamp': typeof lineClamp === 'number' ? lineClamp.toString() : undefined,\n      '--title-text-wrap': textWrap,\n    },\n  };\n});\n\nexport const Title = factory<TitleFactory>((_props, ref) => {\n  const props = useProps('Title', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    order,\n    vars,\n    size,\n    variant,\n    lineClamp,\n    textWrap,\n    mod,\n    ...others\n  } = props;\n\n  const getStyles = useStyles<TitleFactory>({\n    name: 'Title',\n    props,\n    classes,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n  });\n\n  if (![1, 2, 3, 4, 5, 6].includes(order!)) {\n    return null;\n  }\n\n  return (\n    <Box\n      {...getStyles('root')}\n      component={`h${order!}`}\n      variant={variant}\n      ref={ref}\n      mod={[{ order, 'data-line-clamp': typeof lineClamp === 'number' }, mod]}\n      size={size}\n      {...others}\n    />\n  );\n});\n\nTitle.classes = classes;\nTitle.displayName = '@mantine/core/Title';\n","import { isNumberLike } from '../is-number-like/is-number-like';\nimport { rem } from '../units-converters';\n\nexport function getSize(size: unknown, prefix = 'size', convertToRem = true): string | undefined {\n  if (size === undefined) {\n    return undefined;\n  }\n\n  return isNumberLike(size)\n    ? convertToRem\n      ? rem(size)\n      : (size as string)\n    : `var(--${prefix}-${size})`;\n}\n\nexport function getSpacing(size: unknown) {\n  return getSize(size, 'mantine-spacing');\n}\n\nexport function getRadius(size: unknown) {\n  if (size === undefined) {\n    return 'var(--mantine-radius-default)';\n  }\n\n  return getSize(size, 'mantine-radius');\n}\n\nexport function getFontSize(size: unknown) {\n  return getSize(size, 'mantine-font-size');\n}\n\nexport function getLineHeight(size: unknown) {\n  return getSize(size, 'mantine-line-height', false);\n}\n\nexport function getShadow(size: unknown) {\n  if (!size) {\n    return undefined;\n  }\n\n  return getSize(size, 'mantine-shadow', false);\n}\n","import { forwardRef } from 'react';\nimport { PolymorphicComponentProps } from './create-polymorphic-component';\nimport {\n  ComponentClasses,\n  FactoryPayload,\n  identity,\n  StaticComponents,\n  ThemeExtend,\n} from './factory';\n\nexport interface PolymorphicFactoryPayload extends FactoryPayload {\n  defaultComponent: any;\n  defaultRef: any;\n}\n\nexport type PolymorphicComponentWithProps<Payload extends PolymorphicFactoryPayload> = {\n  withProps: <C = Payload['defaultComponent']>(\n    fixedProps: PolymorphicComponentProps<C, Payload['props']>\n  ) => <L = C>(props: PolymorphicComponentProps<L, Payload['props']>) => React.ReactElement;\n};\n\nexport function polymorphicFactory<Payload extends PolymorphicFactoryPayload>(\n  ui: React.ForwardRefRenderFunction<Payload['defaultRef'], Payload['props']>\n) {\n  type ComponentProps<C> = PolymorphicComponentProps<C, Payload['props']>;\n\n  type _PolymorphicComponent = <C = Payload['defaultComponent']>(\n    props: ComponentProps<C>\n  ) => React.ReactElement;\n\n  type ComponentProperties = Omit<React.FunctionComponent<ComponentProps<any>>, never>;\n\n  type PolymorphicComponent = _PolymorphicComponent &\n    ComponentProperties &\n    ThemeExtend<Payload> &\n    ComponentClasses<Payload> &\n    PolymorphicComponentWithProps<Payload> &\n    StaticComponents<Payload['staticComponents']>;\n\n  const Component = forwardRef(ui) as unknown as PolymorphicComponent;\n  Component.withProps = (fixedProps: any) => {\n    const Extended = forwardRef((props, ref) => (\n      <Component {...fixedProps} {...props} ref={ref as any} />\n    )) as any;\n    Extended.extend = Component.extend;\n    Extended.displayName = `WithProps(${Component.displayName})`;\n    return Extended;\n  };\n\n  Component.extend = identity as any;\n\n  return Component as PolymorphicComponent;\n}\n","import {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  getFontSize,\n  getGradient,\n  getLineHeight,\n  getThemeColor,\n  MantineColor,\n  MantineGradient,\n  MantineSize,\n  polymorphicFactory,\n  PolymorphicFactory,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../core';\nimport classes from './Text.module.css';\n\ntype TextTruncate = 'end' | 'start' | boolean;\n\nfunction getTextTruncate(truncate: TextTruncate | undefined) {\n  if (truncate === 'start') {\n    return 'start';\n  }\n\n  if (truncate === 'end' || truncate) {\n    return 'end';\n  }\n\n  return undefined;\n}\n\nexport type TextStylesNames = 'root';\nexport type TextVariant = 'text' | 'gradient';\nexport type TextCssVariables = {\n  root: '--text-gradient' | '--text-line-clamp' | '--text-fz' | '--text-lh';\n};\n\nexport interface TextProps extends BoxProps, StylesApiProps<TextFactory> {\n  __staticSelector?: string;\n\n  /** Controls `font-size` and `line-height`, `'md'` by default */\n  size?: MantineSize | (string & {});\n\n  /** Number of lines after which Text will be truncated */\n  lineClamp?: number;\n\n  /** Side on which Text must be truncated, if `true`, text is truncated from the start */\n  truncate?: TextTruncate;\n\n  /** Sets `line-height` to 1 for centering, `false` by default */\n  inline?: boolean;\n\n  /** Determines whether font properties should be inherited from the parent, `false` by default */\n  inherit?: boolean;\n\n  /** Gradient configuration, ignored when `variant` is not `gradient`, `theme.defaultGradient` by default */\n  gradient?: MantineGradient;\n\n  /** Shorthand for `component=\"span\"`, `false` by default, default root element is `p` */\n  span?: boolean;\n\n  /** @deprecated Use `c` prop instead */\n  color?: MantineColor;\n}\n\nexport type TextFactory = PolymorphicFactory<{\n  props: TextProps;\n  defaultComponent: 'p';\n  defaultRef: HTMLParagraphElement;\n  stylesNames: TextStylesNames;\n  vars: TextCssVariables;\n  variant: TextVariant;\n}>;\n\nconst defaultProps: Partial<TextProps> = {\n  inherit: false,\n};\n\nconst varsResolver = createVarsResolver<TextFactory>(\n  (theme, { variant, lineClamp, gradient, size, color }) => ({\n    root: {\n      '--text-fz': getFontSize(size),\n      '--text-lh': getLineHeight(size),\n      '--text-gradient': variant === 'gradient' ? getGradient(gradient, theme) : undefined,\n      '--text-line-clamp': typeof lineClamp === 'number' ? lineClamp.toString() : undefined,\n      '--text-color': color ? getThemeColor(color, theme) : undefined,\n    },\n  })\n);\n\nexport const Text = polymorphicFactory<TextFactory>((_props, ref) => {\n  const props = useProps('Text', defaultProps, _props);\n  const {\n    lineClamp,\n    truncate,\n    inline,\n    inherit,\n    gradient,\n    span,\n    __staticSelector,\n    vars,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    variant,\n    mod,\n    size,\n    ...others\n  } = props;\n\n  const getStyles = useStyles<TextFactory>({\n    name: ['Text', __staticSelector],\n    props,\n    classes,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n  });\n\n  return (\n    <Box\n      {...getStyles('root', { focusable: true })}\n      ref={ref}\n      component={span ? 'span' : 'p'}\n      variant={variant}\n      mod={[\n        {\n          'data-truncate': getTextTruncate(truncate),\n          'data-line-clamp': typeof lineClamp === 'number',\n          'data-inline': inline,\n          'data-inherit': inherit,\n        },\n        mod,\n      ]}\n      size={size}\n      {...others}\n    />\n  );\n});\n\nText.classes = classes;\nText.displayName = '@mantine/core/Text';\n","import { forwardRef } from 'react';\nimport cx from 'clsx';\nimport { Box } from '../../../core';\nimport { MantineLoaderComponent } from '../Loader.types';\nimport classes from '../Loader.module.css';\n\nexport const Bars: MantineLoaderComponent = forwardRef(({ className, ...others }, ref) => (\n  <Box component=\"span\" className={cx(classes.barsLoader, className)} {...others} ref={ref}>\n    <span className={classes.bar} />\n    <span className={classes.bar} />\n    <span className={classes.bar} />\n  </Box>\n));\n\nBars.displayName = '@mantine/core/Bars';\n","import { forwardRef } from 'react';\nimport cx from 'clsx';\nimport { Box } from '../../../core';\nimport { MantineLoaderComponent } from '../Loader.types';\nimport classes from '../Loader.module.css';\n\nexport const Dots: MantineLoaderComponent = forwardRef(({ className, ...others }, ref) => (\n  <Box component=\"span\" className={cx(classes.dotsLoader, className)} {...others} ref={ref}>\n    <span className={classes.dot} />\n    <span className={classes.dot} />\n    <span className={classes.dot} />\n  </Box>\n));\n\nDots.displayName = '@mantine/core/Dots';\n","import { forwardRef } from 'react';\nimport cx from 'clsx';\nimport { Box } from '../../../core';\nimport { MantineLoaderComponent } from '../Loader.types';\nimport classes from '../Loader.module.css';\n\nexport const Oval: MantineLoaderComponent = forwardRef(({ className, ...others }, ref) => (\n  <Box component=\"span\" className={cx(classes.ovalLoader, className)} {...others} ref={ref} />\n));\n\nOval.displayName = '@mantine/core/Oval';\n","import {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  factory,\n  Factory,\n  getSize,\n  getThemeColor,\n  MantineColor,\n  MantineSize,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../core';\nimport type { MantineLoader, MantineLoadersRecord } from './Loader.types';\nimport { Bars } from './loaders/Bars';\nimport { Dots } from './loaders/Dots';\nimport { Oval } from './loaders/Oval';\nimport classes from './Loader.module.css';\n\nexport type LoaderStylesNames = 'root';\nexport type LoaderCssVariables = {\n  root: '--loader-size' | '--loader-color';\n};\n\nexport interface LoaderProps\n  extends BoxProps,\n    StylesApiProps<LoaderFactory>,\n    Omit<React.ComponentPropsWithoutRef<'svg'>, keyof BoxProps> {\n  /** Controls `width` and `height` of the loader. `Loader` has predefined `xs`-`xl` values. Numbers are converted to rem. Default value is `'md'` */\n  size?: MantineSize | (string & {}) | number;\n\n  /** Key of `theme.colors` or any valid CSS color, default value is `theme.primaryColor`  */\n  color?: MantineColor;\n\n  /** Loader type, key of `loaders` prop, default value is `'oval'` */\n  type?: MantineLoader;\n\n  /** Object of loaders components, can be customized via default props or inline. Default value contains `bars`, `oval` and `dots` */\n  loaders?: MantineLoadersRecord;\n\n  /** Overrides default loader with given content */\n  children?: React.ReactNode;\n}\n\nexport type LoaderFactory = Factory<{\n  props: LoaderProps;\n  ref: HTMLSpanElement;\n  stylesNames: LoaderStylesNames;\n  vars: LoaderCssVariables;\n  staticComponents: {\n    defaultLoaders: typeof defaultLoaders;\n  };\n}>;\n\nexport const defaultLoaders: MantineLoadersRecord = {\n  bars: Bars,\n  oval: Oval,\n  dots: Dots,\n};\n\nconst defaultProps: Partial<LoaderProps> = {\n  loaders: defaultLoaders,\n  type: 'oval',\n};\n\nconst varsResolver = createVarsResolver<LoaderFactory>((theme, { size, color }) => ({\n  root: {\n    '--loader-size': getSize(size, 'loader-size'),\n    '--loader-color': color ? getThemeColor(color, theme) : undefined,\n  },\n}));\n\nexport const Loader = factory<LoaderFactory>((_props, ref) => {\n  const props = useProps('Loader', defaultProps, _props);\n  const {\n    size,\n    color,\n    type,\n    vars,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    loaders,\n    variant,\n    children,\n    ...others\n  } = props;\n\n  const getStyles = useStyles<LoaderFactory>({\n    name: 'Loader',\n    props,\n    classes,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n  });\n\n  if (children) {\n    return (\n      <Box {...getStyles('root')} ref={ref as any} {...(others as any)}>\n        {children}\n      </Box>\n    );\n  }\n\n  return (\n    <Box\n      {...getStyles('root')}\n      ref={ref}\n      component={(loaders as any)[type!]}\n      variant={variant}\n      size={size}\n      {...others}\n    />\n  );\n});\n\nLoader.defaultLoaders = defaultLoaders;\nLoader.classes = classes;\nLoader.displayName = '@mantine/core/Loader';\n","export interface MantineTransitionStyles {\n  common?: React.CSSProperties;\n  in: React.CSSProperties;\n  out: React.CSSProperties;\n  transitionProperty: React.CSSProperties['transitionProperty'];\n}\n\nexport type MantineTransitionName =\n  | 'fade'\n  | 'fade-down'\n  | 'fade-up'\n  | 'fade-left'\n  | 'fade-right'\n  | 'skew-up'\n  | 'skew-down'\n  | 'rotate-right'\n  | 'rotate-left'\n  | 'slide-down'\n  | 'slide-up'\n  | 'slide-right'\n  | 'slide-left'\n  | 'scale-y'\n  | 'scale-x'\n  | 'scale'\n  | 'pop'\n  | 'pop-top-left'\n  | 'pop-top-right'\n  | 'pop-bottom-left'\n  | 'pop-bottom-right';\n\nexport type MantineTransition = MantineTransitionName | MantineTransitionStyles;\n\nconst popIn = (from: 'top' | 'bottom') => ({\n  in: { opacity: 1, transform: 'scale(1)' },\n  out: { opacity: 0, transform: `scale(.9) translateY(${from === 'bottom' ? 10 : -10}px)` },\n  transitionProperty: 'transform, opacity',\n});\n\nexport const transitions: Record<MantineTransitionName, MantineTransitionStyles> = {\n  fade: {\n    in: { opacity: 1 },\n    out: { opacity: 0 },\n    transitionProperty: 'opacity',\n  },\n\n  'fade-up': {\n    in: { opacity: 1, transform: 'translateY(0)' },\n    out: { opacity: 0, transform: 'translateY(30px)' },\n    transitionProperty: 'opacity, transform',\n  },\n\n  'fade-down': {\n    in: { opacity: 1, transform: 'translateY(0)' },\n    out: { opacity: 0, transform: 'translateY(-30px)' },\n    transitionProperty: 'opacity, transform',\n  },\n\n  'fade-left': {\n    in: { opacity: 1, transform: 'translateX(0)' },\n    out: { opacity: 0, transform: 'translateX(30px)' },\n    transitionProperty: 'opacity, transform',\n  },\n\n  'fade-right': {\n    in: { opacity: 1, transform: 'translateX(0)' },\n    out: { opacity: 0, transform: 'translateX(-30px)' },\n    transitionProperty: 'opacity, transform',\n  },\n\n  scale: {\n    in: { opacity: 1, transform: 'scale(1)' },\n    out: { opacity: 0, transform: 'scale(0)' },\n    common: { transformOrigin: 'top' },\n    transitionProperty: 'transform, opacity',\n  },\n\n  'scale-y': {\n    in: { opacity: 1, transform: 'scaleY(1)' },\n    out: { opacity: 0, transform: 'scaleY(0)' },\n    common: { transformOrigin: 'top' },\n    transitionProperty: 'transform, opacity',\n  },\n\n  'scale-x': {\n    in: { opacity: 1, transform: 'scaleX(1)' },\n    out: { opacity: 0, transform: 'scaleX(0)' },\n    common: { transformOrigin: 'left' },\n    transitionProperty: 'transform, opacity',\n  },\n\n  'skew-up': {\n    in: { opacity: 1, transform: 'translateY(0) skew(0deg, 0deg)' },\n    out: { opacity: 0, transform: 'translateY(-20px) skew(-10deg, -5deg)' },\n    common: { transformOrigin: 'top' },\n    transitionProperty: 'transform, opacity',\n  },\n\n  'skew-down': {\n    in: { opacity: 1, transform: 'translateY(0) skew(0deg, 0deg)' },\n    out: { opacity: 0, transform: 'translateY(20px) skew(-10deg, -5deg)' },\n    common: { transformOrigin: 'bottom' },\n    transitionProperty: 'transform, opacity',\n  },\n\n  'rotate-left': {\n    in: { opacity: 1, transform: 'translateY(0) rotate(0deg)' },\n    out: { opacity: 0, transform: 'translateY(20px) rotate(-5deg)' },\n    common: { transformOrigin: 'bottom' },\n    transitionProperty: 'transform, opacity',\n  },\n\n  'rotate-right': {\n    in: { opacity: 1, transform: 'translateY(0) rotate(0deg)' },\n    out: { opacity: 0, transform: 'translateY(20px) rotate(5deg)' },\n    common: { transformOrigin: 'top' },\n    transitionProperty: 'transform, opacity',\n  },\n\n  'slide-down': {\n    in: { opacity: 1, transform: 'translateY(0)' },\n    out: { opacity: 0, transform: 'translateY(-100%)' },\n    common: { transformOrigin: 'top' },\n    transitionProperty: 'transform, opacity',\n  },\n\n  'slide-up': {\n    in: { opacity: 1, transform: 'translateY(0)' },\n    out: { opacity: 0, transform: 'translateY(100%)' },\n    common: { transformOrigin: 'bottom' },\n    transitionProperty: 'transform, opacity',\n  },\n\n  'slide-left': {\n    in: { opacity: 1, transform: 'translateX(0)' },\n    out: { opacity: 0, transform: 'translateX(100%)' },\n    common: { transformOrigin: 'left' },\n    transitionProperty: 'transform, opacity',\n  },\n\n  'slide-right': {\n    in: { opacity: 1, transform: 'translateX(0)' },\n    out: { opacity: 0, transform: 'translateX(-100%)' },\n    common: { transformOrigin: 'right' },\n    transitionProperty: 'transform, opacity',\n  },\n\n  pop: {\n    ...popIn('bottom'),\n    common: { transformOrigin: 'center center' },\n  },\n\n  'pop-bottom-left': {\n    ...popIn('bottom'),\n    common: { transformOrigin: 'bottom left' },\n  },\n\n  'pop-bottom-right': {\n    ...popIn('bottom'),\n    common: { transformOrigin: 'bottom right' },\n  },\n\n  'pop-top-left': {\n    ...popIn('top'),\n    common: { transformOrigin: 'top left' },\n  },\n\n  'pop-top-right': {\n    ...popIn('top'),\n    common: { transformOrigin: 'top right' },\n  },\n};\n","import { MantineTransition, transitions } from '../transitions';\n\nconst transitionStatuses = {\n  entering: 'in',\n  entered: 'in',\n  exiting: 'out',\n  exited: 'out',\n  'pre-exiting': 'out',\n  'pre-entering': 'out',\n} as const;\n\nexport function getTransitionStyles({\n  transition,\n  state,\n  duration,\n  timingFunction,\n}: {\n  transition: MantineTransition;\n  state: keyof typeof transitionStatuses;\n  duration: number;\n  timingFunction: React.CSSProperties['transitionTimingFunction'];\n}): React.CSSProperties {\n  const shared: React.CSSProperties = {\n    WebkitBackfaceVisibility: 'hidden',\n    willChange: 'transform, opacity',\n    transitionDuration: `${duration}ms`,\n    transitionTimingFunction: timingFunction,\n  };\n\n  if (typeof transition === 'string') {\n    if (!(transition in transitions)) {\n      return {};\n    }\n\n    return {\n      transitionProperty: transitions[transition].transitionProperty,\n      ...shared,\n      ...transitions[transition].common,\n      ...transitions[transition][transitionStatuses[state]],\n    };\n  }\n\n  return {\n    transitionProperty: transition.transitionProperty,\n    ...shared,\n    ...transition.common,\n    ...transition[transitionStatuses[state]],\n  };\n}\n","import { useEffect, useRef, useState } from 'react';\n\nexport interface UseMediaQueryOptions {\n  getInitialValueInEffect: boolean;\n}\n\ntype MediaQueryCallback = (event: { matches: boolean; media: string }) => void;\n\n/**\n * Older versions of Safari (shipped withCatalina and before) do not support addEventListener on matchMedia\n * https://stackoverflow.com/questions/56466261/matchmedia-addlistener-marked-as-deprecated-addeventlistener-equivalent\n * */\nfunction attachMediaListener(query: MediaQueryList, callback: MediaQueryCallback) {\n  try {\n    query.addEventListener('change', callback);\n    return () => query.removeEventListener('change', callback);\n  } catch (e) {\n    query.addListener(callback);\n    return () => query.removeListener(callback);\n  }\n}\n\nfunction getInitialValue(query: string, initialValue?: boolean) {\n  if (typeof initialValue === 'boolean') {\n    return initialValue;\n  }\n\n  if (typeof window !== 'undefined' && 'matchMedia' in window) {\n    return window.matchMedia(query).matches;\n  }\n\n  return false;\n}\n\nexport function useMediaQuery(\n  query: string,\n  initialValue?: boolean,\n  { getInitialValueInEffect }: UseMediaQueryOptions = {\n    getInitialValueInEffect: true,\n  }\n) {\n  const [matches, setMatches] = useState(\n    getInitialValueInEffect ? initialValue : getInitialValue(query)\n  );\n  const queryRef = useRef<MediaQueryList>(null);\n\n  useEffect(() => {\n    if ('matchMedia' in window) {\n      queryRef.current = window.matchMedia(query);\n      setMatches(queryRef.current.matches);\n      return attachMediaListener(queryRef.current, (event) => setMatches(event.matches));\n    }\n\n    return undefined;\n  }, [query]);\n\n  return matches;\n}\n","import { useMediaQuery, UseMediaQueryOptions } from '../use-media-query/use-media-query';\n\nexport function useReducedMotion(initialValue?: boolean, options?: UseMediaQueryOptions) {\n  return useMediaQuery('(prefers-reduced-motion: reduce)', initialValue, options);\n}\n","import { DependencyList, EffectCallback, useEffect, useRef } from 'react';\n\nexport function useDidUpdate(fn: EffectCallback, dependencies?: DependencyList) {\n  const mounted = useRef(false);\n\n  useEffect(\n    () => () => {\n      mounted.current = false;\n    },\n    []\n  );\n\n  useEffect(() => {\n    if (mounted.current) {\n      return fn();\n    }\n\n    mounted.current = true;\n    return undefined;\n  }, dependencies);\n}\n","import { useEffect, useRef, useState } from 'react';\nimport ReactDOM from 'react-dom';\nimport { useDidUpdate, useReducedMotion } from '@mantine/hooks';\nimport { useMantineTheme } from '../../core';\n\nexport type TransitionStatus =\n  | 'entered'\n  | 'exited'\n  | 'entering'\n  | 'exiting'\n  | 'pre-exiting'\n  | 'pre-entering';\n\ninterface UseTransition {\n  duration: number;\n  exitDuration: number;\n  timingFunction: string;\n  mounted: boolean;\n  onEnter?: () => void;\n  onExit?: () => void;\n  onEntered?: () => void;\n  onExited?: () => void;\n  enterDelay?: number;\n  exitDelay?: number;\n}\n\nexport function useTransition({\n  duration,\n  exitDuration,\n  timingFunction,\n  mounted,\n  onEnter,\n  onExit,\n  onEntered,\n  onExited,\n  enterDelay,\n  exitDelay,\n}: UseTransition) {\n  const theme = useMantineTheme();\n  const shouldReduceMotion = useReducedMotion();\n  const reduceMotion = theme.respectReducedMotion ? shouldReduceMotion : false;\n  const [transitionDuration, setTransitionDuration] = useState(reduceMotion ? 0 : duration);\n  const [transitionStatus, setStatus] = useState<TransitionStatus>(mounted ? 'entered' : 'exited');\n  const transitionTimeoutRef = useRef<number>(-1);\n  const delayTimeoutRef = useRef<number>(-1);\n  const rafRef = useRef(-1);\n\n  const handleStateChange = (shouldMount: boolean) => {\n    const preHandler = shouldMount ? onEnter : onExit;\n    const handler = shouldMount ? onEntered : onExited;\n\n    window.clearTimeout(transitionTimeoutRef.current);\n\n    const newTransitionDuration = reduceMotion ? 0 : shouldMount ? duration : exitDuration;\n    setTransitionDuration(newTransitionDuration);\n\n    if (newTransitionDuration === 0) {\n      typeof preHandler === 'function' && preHandler();\n      typeof handler === 'function' && handler();\n      setStatus(shouldMount ? 'entered' : 'exited');\n    } else {\n      // Make sure new status won't be set within the same frame as this would disrupt animation #3126\n      rafRef.current = requestAnimationFrame(() => {\n        ReactDOM.flushSync(() => {\n          setStatus(shouldMount ? 'pre-entering' : 'pre-exiting');\n        });\n\n        rafRef.current = requestAnimationFrame(() => {\n          typeof preHandler === 'function' && preHandler();\n          setStatus(shouldMount ? 'entering' : 'exiting');\n\n          transitionTimeoutRef.current = window.setTimeout(() => {\n            typeof handler === 'function' && handler();\n            setStatus(shouldMount ? 'entered' : 'exited');\n          }, newTransitionDuration);\n        });\n      });\n    }\n  };\n\n  const handleTransitionWithDelay = (shouldMount: boolean) => {\n    window.clearTimeout(delayTimeoutRef.current);\n    const delay = shouldMount ? enterDelay : exitDelay;\n\n    if (typeof delay !== 'number') {\n      handleStateChange(shouldMount);\n      return;\n    }\n\n    delayTimeoutRef.current = window.setTimeout(\n      () => {\n        handleStateChange(shouldMount);\n      },\n      shouldMount ? enterDelay : exitDelay\n    );\n  };\n\n  useDidUpdate(() => {\n    handleTransitionWithDelay(mounted);\n  }, [mounted]);\n\n  useEffect(\n    () => () => {\n      window.clearTimeout(transitionTimeoutRef.current);\n      cancelAnimationFrame(rafRef.current);\n    },\n    []\n  );\n\n  return {\n    transitionDuration,\n    transitionStatus,\n    transitionTimingFunction: timingFunction || 'ease',\n  };\n}\n","import { useMantineEnv } from '../../core';\nimport { getTransitionStyles } from './get-transition-styles/get-transition-styles';\nimport { MantineTransition } from './transitions';\nimport { useTransition } from './use-transition';\n\nexport interface TransitionProps {\n  /** If set element will not be unmounted from the DOM when it is hidden, `display: none` styles will be applied instead */\n  keepMounted?: boolean;\n\n  /** Transition name or object */\n  transition?: MantineTransition;\n\n  /** Transition duration in ms, `250` by default */\n  duration?: number;\n\n  /** Exit transition duration in ms, `250` by default */\n  exitDuration?: number;\n\n  /** Transition timing function, `theme.transitionTimingFunction` by default */\n  timingFunction?: string;\n\n  /** Determines whether component should be mounted to the DOM */\n  mounted: boolean;\n\n  /** Render function with transition styles argument */\n  children: (styles: React.CSSProperties) => React.JSX.Element;\n\n  /** Called when exit transition ends */\n  onExited?: () => void;\n\n  /** Called when exit transition starts */\n  onExit?: () => void;\n\n  /** Called when enter transition starts */\n  onEnter?: () => void;\n\n  /** Called when enter transition ends */\n  onEntered?: () => void;\n\n  /** Delay in ms before enter transition starts */\n  enterDelay?: number;\n\n  /** Delay in ms before exit transition starts */\n  exitDelay?: number;\n}\n\nexport type TransitionOverride = Partial<Omit<TransitionProps, 'mounted'>>;\n\nexport function Transition({\n  keepMounted,\n  transition = 'fade',\n  duration = 250,\n  exitDuration = duration,\n  mounted,\n  children,\n  timingFunction = 'ease',\n  onExit,\n  onEntered,\n  onEnter,\n  onExited,\n  enterDelay,\n  exitDelay,\n}: TransitionProps) {\n  const env = useMantineEnv();\n  const { transitionDuration, transitionStatus, transitionTimingFunction } = useTransition({\n    mounted,\n    exitDuration,\n    duration,\n    timingFunction,\n    onExit,\n    onEntered,\n    onEnter,\n    onExited,\n    enterDelay,\n    exitDelay,\n  });\n\n  if (transitionDuration === 0 || env === 'test') {\n    return mounted ? <>{children({})}</> : keepMounted ? children({ display: 'none' }) : null;\n  }\n\n  return transitionStatus === 'exited' ? (\n    keepMounted ? (\n      children({ display: 'none' })\n    ) : null\n  ) : (\n    <>\n      {children(\n        getTransitionStyles({\n          transition,\n          duration: transitionDuration,\n          state: transitionStatus,\n          timingFunction: transitionTimingFunction,\n        })\n      )}\n    </>\n  );\n}\n\nTransition.displayName = '@mantine/core/Transition';\n","import {\n  Box,\n  BoxComponentProps,\n  polymorphicFactory,\n  PolymorphicFactory,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../core';\nimport classes from './UnstyledButton.module.css';\n\nexport type UnstyledButtonStylesNames = 'root';\n\nexport interface UnstyledButtonProps\n  extends Omit<BoxComponentProps, 'vars' | 'variant'>,\n    StylesApiProps<UnstyledButtonFactory> {\n  __staticSelector?: string;\n}\n\nconst defaultProps: Partial<UnstyledButtonProps> = {\n  __staticSelector: 'UnstyledButton',\n};\n\nexport type UnstyledButtonFactory = PolymorphicFactory<{\n  props: UnstyledButtonProps;\n  stylesNames: UnstyledButtonStylesNames;\n  defaultComponent: 'button';\n  defaultRef: HTMLButtonElement;\n}>;\n\nexport const UnstyledButton = polymorphicFactory<UnstyledButtonFactory>(\n  (_props: UnstyledButtonProps & { component?: any }, ref) => {\n    const props = useProps('UnstyledButton', defaultProps, _props);\n    const {\n      className,\n      component = 'button',\n      __staticSelector,\n      unstyled,\n      classNames,\n      styles,\n      style,\n      ...others\n    } = props;\n\n    const getStyles = useStyles<UnstyledButtonFactory>({\n      name: __staticSelector!,\n      props,\n      classes,\n      className,\n      style,\n      classNames,\n      styles,\n      unstyled,\n    });\n\n    return (\n      <Box\n        {...getStyles('root', { focusable: true })}\n        component={component}\n        ref={ref}\n        type={component === 'button' ? 'button' : undefined}\n        {...others}\n      />\n    );\n  }\n);\n\nUnstyledButton.classes = classes;\nUnstyledButton.displayName = '@mantine/core/UnstyledButton';\n","import {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  factory,\n  Factory,\n  rem,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../../core';\nimport classes from '../Button.module.css';\n\nexport type ButtonGroupStylesNames = 'group';\nexport type ButtonGroupCssVariables = {\n  group: '--button-border-width';\n};\n\nexport interface ButtonGroupProps extends BoxProps, StylesApiProps<ButtonGroupFactory> {\n  /** `Button` components */\n  children?: React.ReactNode;\n\n  /** Orientation of the group, `horizontal` by default */\n  orientation?: 'horizontal' | 'vertical';\n\n  /** `border-width` of the child `Button` components. Numbers are converted to rem. Default value in `1`. */\n  borderWidth?: number | string;\n}\n\nexport type ButtonGroupFactory = Factory<{\n  props: ButtonGroupProps;\n  ref: HTMLDivElement;\n  stylesNames: ButtonGroupStylesNames;\n  vars: ButtonGroupCssVariables;\n}>;\n\nconst defaultProps: Partial<ButtonGroupProps> = {\n  orientation: 'horizontal',\n};\n\nconst varsResolver = createVarsResolver<ButtonGroupFactory>((_, { borderWidth }) => ({\n  group: { '--button-border-width': rem(borderWidth) },\n}));\n\nexport const ButtonGroup = factory<ButtonGroupFactory>((_props, ref) => {\n  const props = useProps('ButtonGroup', defaultProps, _props);\n  const {\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    orientation,\n    vars,\n    borderWidth,\n    variant,\n    mod,\n    ...others\n  } = useProps('ButtonGroup', defaultProps, _props);\n\n  const getStyles = useStyles<ButtonGroupFactory>({\n    name: 'ButtonGroup',\n    props,\n    classes,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n    rootSelector: 'group',\n  });\n\n  return (\n    <Box\n      {...getStyles('group')}\n      ref={ref}\n      variant={variant}\n      mod={[{ 'data-orientation': orientation }, mod]}\n      role=\"group\"\n      {...others}\n    />\n  );\n});\n\nButtonGroup.classes = classes;\nButtonGroup.displayName = '@mantine/core/ButtonGroup';\n","import {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  factory,\n  Factory,\n  getFontSize,\n  getRadius,\n  getSize,\n  MantineGradient,\n  MantineRadius,\n  MantineSize,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../../core';\nimport type { ButtonVariant } from '../Button';\nimport classes from '../Button.module.css';\n\nexport type ButtonGroupSectionStylesNames = 'groupSection';\nexport type ButtonGroupSectionCssVariables = {\n  groupSection:\n    | '--section-radius'\n    | '--section-bg'\n    | '--section-color'\n    | '--section-bd'\n    | '--section-height'\n    | '--section-padding-x'\n    | '--section-fz';\n};\n\nexport interface ButtonGroupSectionProps\n  extends BoxProps,\n    StylesApiProps<ButtonGroupSectionFactory>,\n    ElementProps<'div'> {\n  /** Key of `theme.radius` or any valid CSS value to set `border-radius`, `theme.defaultRadius` by default */\n  radius?: MantineRadius;\n\n  /** Gradient configuration used when `variant=\"gradient\"`, default value is `theme.defaultGradient` */\n  gradient?: MantineGradient;\n\n  /** Determines whether section text color with filled variant should depend on `background-color`. If luminosity of the `color` prop is less than `theme.luminosityThreshold`, then `theme.white` will be used for text color, otherwise `theme.black`. Overrides `theme.autoContrast`. */\n  autoContrast?: boolean;\n\n  /** Controls section `height`, `font-size` and horizontal `padding`, `'sm'` by default */\n  size?: MantineSize | `compact-${MantineSize}` | (string & {});\n}\n\nexport type ButtonGroupSectionFactory = Factory<{\n  props: ButtonGroupSectionProps;\n  ref: HTMLDivElement;\n  stylesNames: ButtonGroupSectionStylesNames;\n  vars: ButtonGroupSectionCssVariables;\n  variant: ButtonVariant;\n}>;\n\nconst defaultProps: Partial<ButtonGroupSectionProps> = {};\n\nconst varsResolver = createVarsResolver<ButtonGroupSectionFactory>(\n  (theme, { radius, color, gradient, variant, autoContrast, size }) => {\n    const colors = theme.variantColorResolver({\n      color: color || theme.primaryColor,\n      theme,\n      gradient,\n      variant: variant || 'filled',\n      autoContrast,\n    });\n\n    return {\n      groupSection: {\n        '--section-height': getSize(size, 'section-height'),\n        '--section-padding-x': getSize(size, 'section-padding-x'),\n        '--section-fz': size?.includes('compact')\n          ? getFontSize(size.replace('compact-', ''))\n          : getFontSize(size),\n        '--section-radius': radius === undefined ? undefined : getRadius(radius),\n        '--section-bg': color || variant ? colors.background : undefined,\n        '--section-color': colors.color,\n        '--section-bd': color || variant ? colors.border : undefined,\n      },\n    };\n  }\n);\n\nexport const ButtonGroupSection = factory<ButtonGroupSectionFactory>((_props, ref) => {\n  const props = useProps('ButtonGroupSection', defaultProps, _props);\n  const {\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    variant,\n    gradient,\n    radius,\n    autoContrast,\n    ...others\n  } = useProps('ButtonGroupSection', defaultProps, _props);\n\n  const getStyles = useStyles<ButtonGroupSectionFactory>({\n    name: 'ButtonGroupSection',\n    props,\n    classes,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n    rootSelector: 'groupSection',\n  });\n\n  return <Box {...getStyles('groupSection')} ref={ref} variant={variant} {...others} />;\n});\n\nButtonGroupSection.classes = classes;\nButtonGroupSection.displayName = '@mantine/core/ButtonGroupSection';\n","import {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  getFontSize,\n  getRadius,\n  getSize,\n  MantineColor,\n  MantineGradient,\n  MantineRadius,\n  MantineSize,\n  polymorphicFactory,\n  PolymorphicFactory,\n  rem,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../core';\nimport { Loader, LoaderProps } from '../Loader';\nimport { MantineTransition, Transition } from '../Transition';\nimport { UnstyledButton } from '../UnstyledButton';\nimport { ButtonGroup } from './ButtonGroup/ButtonGroup';\nimport { ButtonGroupSection } from './ButtonGroupSection/ButtonGroupSection';\nimport classes from './Button.module.css';\n\nexport type ButtonStylesNames = 'root' | 'inner' | 'loader' | 'section' | 'label';\nexport type ButtonVariant =\n  | 'filled'\n  | 'light'\n  | 'outline'\n  | 'transparent'\n  | 'white'\n  | 'subtle'\n  | 'default'\n  | 'gradient';\n\nexport type ButtonCssVariables = {\n  root:\n    | '--button-justify'\n    | '--button-height'\n    | '--button-padding-x'\n    | '--button-fz'\n    | '--button-radius'\n    | '--button-bg'\n    | '--button-hover'\n    | '--button-hover-color'\n    | '--button-color'\n    | '--button-bd';\n};\n\nexport interface ButtonProps extends BoxProps, StylesApiProps<ButtonFactory> {\n  'data-disabled'?: boolean;\n\n  /** Controls button `height`, `font-size` and horizontal `padding`, `'sm'` by default */\n  size?: MantineSize | `compact-${MantineSize}` | (string & {});\n\n  /** Key of `theme.colors` or any valid CSS color, `theme.primaryColor` by default */\n  color?: MantineColor;\n\n  /** Sets `justify-content` of `inner` element, can be used to change distribution of sections and label, `'center'` by default */\n  justify?: React.CSSProperties['justifyContent'];\n\n  /** Content displayed on the left side of the button label */\n  leftSection?: React.ReactNode;\n\n  /** Content displayed on the right side of the button label */\n  rightSection?: React.ReactNode;\n\n  /** Determines whether button should take 100% width of its parent container, `false` by default */\n  fullWidth?: boolean;\n\n  /** Key of `theme.radius` or any valid CSS value to set `border-radius`, `theme.defaultRadius` by default */\n  radius?: MantineRadius;\n\n  /** Gradient configuration used when `variant=\"gradient\"`, default value is `theme.defaultGradient` */\n  gradient?: MantineGradient;\n\n  /** Indicates disabled state */\n  disabled?: boolean;\n\n  /** Button content */\n  children?: React.ReactNode;\n\n  /** Determines whether the `Loader` component should be displayed over the button */\n  loading?: boolean;\n\n  /** Props added to the `Loader` component (only visible when `loading` prop is set) */\n  loaderProps?: LoaderProps;\n\n  /** Determines whether button text color with filled variant should depend on `background-color`. If luminosity of the `color` prop is less than `theme.luminosityThreshold`, then `theme.white` will be used for text color, otherwise `theme.black`. Overrides `theme.autoContrast`. */\n  autoContrast?: boolean;\n}\n\nexport type ButtonFactory = PolymorphicFactory<{\n  props: ButtonProps;\n  defaultRef: HTMLButtonElement;\n  defaultComponent: 'button';\n  stylesNames: ButtonStylesNames;\n  vars: ButtonCssVariables;\n  variant: ButtonVariant;\n  staticComponents: {\n    Group: typeof ButtonGroup;\n    GroupSection: typeof ButtonGroupSection;\n  };\n}>;\n\nconst loaderTransition: MantineTransition = {\n  in: { opacity: 1, transform: `translate(-50%, calc(-50% + ${rem(1)}))` },\n  out: { opacity: 0, transform: 'translate(-50%, -200%)' },\n  common: { transformOrigin: 'center' },\n  transitionProperty: 'transform, opacity',\n};\n\nconst defaultProps: Partial<ButtonProps> = {};\n\nconst varsResolver = createVarsResolver<ButtonFactory>(\n  (theme, { radius, color, gradient, variant, size, justify, autoContrast }) => {\n    const colors = theme.variantColorResolver({\n      color: color || theme.primaryColor,\n      theme,\n      gradient,\n      variant: variant || 'filled',\n      autoContrast,\n    });\n\n    return {\n      root: {\n        '--button-justify': justify,\n        '--button-height': getSize(size, 'button-height'),\n        '--button-padding-x': getSize(size, 'button-padding-x'),\n        '--button-fz': size?.includes('compact')\n          ? getFontSize(size.replace('compact-', ''))\n          : getFontSize(size),\n        '--button-radius': radius === undefined ? undefined : getRadius(radius),\n        '--button-bg': color || variant ? colors.background : undefined,\n        '--button-hover': color || variant ? colors.hover : undefined,\n        '--button-color': colors.color,\n        '--button-bd': color || variant ? colors.border : undefined,\n        '--button-hover-color': color || variant ? colors.hoverColor : undefined,\n      },\n    };\n  }\n);\n\nexport const Button = polymorphicFactory<ButtonFactory>((_props, ref) => {\n  const props = useProps('Button', defaultProps, _props);\n  const {\n    style,\n    vars,\n    className,\n    color,\n    disabled,\n    children,\n    leftSection,\n    rightSection,\n    fullWidth,\n    variant,\n    radius,\n    loading,\n    loaderProps,\n    gradient,\n    classNames,\n    styles,\n    unstyled,\n    'data-disabled': dataDisabled,\n    autoContrast,\n    mod,\n    ...others\n  } = props;\n\n  const getStyles = useStyles<ButtonFactory>({\n    name: 'Button',\n    props,\n    classes,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n  });\n\n  const hasLeftSection = !!leftSection;\n  const hasRightSection = !!rightSection;\n\n  return (\n    <UnstyledButton\n      ref={ref}\n      {...getStyles('root', { active: !disabled && !loading && !dataDisabled })}\n      unstyled={unstyled}\n      variant={variant}\n      disabled={disabled || loading}\n      mod={[\n        {\n          disabled: disabled || dataDisabled,\n          loading,\n          block: fullWidth,\n          'with-left-section': hasLeftSection,\n          'with-right-section': hasRightSection,\n        },\n        mod,\n      ]}\n      {...others}\n    >\n      <Transition mounted={!!loading} transition={loaderTransition} duration={150}>\n        {(transitionStyles) => (\n          <Box component=\"span\" {...getStyles('loader', { style: transitionStyles })} aria-hidden>\n            <Loader\n              color=\"var(--button-color)\"\n              size=\"calc(var(--button-height) / 1.8)\"\n              {...loaderProps}\n            />\n          </Box>\n        )}\n      </Transition>\n\n      <span {...getStyles('inner')}>\n        {leftSection && (\n          <Box component=\"span\" {...getStyles('section')} mod={{ position: 'left' }}>\n            {leftSection}\n          </Box>\n        )}\n\n        <Box component=\"span\" mod={{ loading }} {...getStyles('label')}>\n          {children}\n        </Box>\n\n        {rightSection && (\n          <Box component=\"span\" {...getStyles('section')} mod={{ position: 'right' }}>\n            {rightSection}\n          </Box>\n        )}\n      </span>\n    </UnstyledButton>\n  );\n});\n\nButton.classes = classes;\nButton.displayName = '@mantine/core/Button';\nButton.Group = ButtonGroup;\nButton.GroupSection = ButtonGroupSection;\n","// extracted by mini-css-extract-plugin\nexport default {\"title\":\"Welcome_title__EAh1s\"};","import { Title, Text, Anchor, Button } from '@mantine/core';\nimport classes from './Welcome.module.css';\nimport { useNavigate } from 'react-router-dom';\n\nexport function Welcome() {\n\n  const navigate = useNavigate();\n\n  return (\n    <>\n      <Title className={classes.title} ta=\"center\" mt={100}>\n        Welcome to{' '}\n        <Text inherit variant=\"gradient\" component=\"span\" gradient={{ from: 'pink', to: 'yellow' }}>\n          3D Map\n        </Text>\n      </Title>\n      <Text c=\"dimmed\" ta=\"center\" size=\"lg\" maw={580} mx=\"auto\" mt=\"xl\">\n        <Button onClick={() => navigate('/map')}>View Map</Button>\n      </Text>\n    </>\n  );\n}\n","export const noop = () => {};\n","import { useCallback, useContext, useEffect, useRef } from 'react';\nimport { useColorScheme } from '@mantine/hooks';\nimport { noop } from '../../utils';\nimport { MantineContext, useMantineStyleNonce } from '../Mantine.context';\nimport { MantineColorScheme } from '../theme.types';\n\nfunction disableTransition(nonce: string | undefined) {\n  const style = document.createElement('style');\n  style.setAttribute('data-mantine-styles', 'inline');\n  style.innerHTML = '*, *::before, *::after {transition: none !important;}';\n  style.setAttribute('data-mantine-disable-transition', 'true');\n  nonce && style.setAttribute('nonce', nonce);\n\n  document.head.appendChild(style);\n  const clear = () =>\n    document\n      .querySelectorAll('[data-mantine-disable-transition]')\n      .forEach((element) => element.remove());\n  return clear;\n}\n\nexport function useMantineColorScheme({ keepTransitions }: { keepTransitions?: boolean } = {}) {\n  const clearStylesRef = useRef<() => void>(noop);\n  const timeoutRef = useRef<number>(-1);\n  const ctx = useContext(MantineContext);\n  const nonce = useMantineStyleNonce();\n  const nonceValue = useRef(nonce?.());\n\n  if (!ctx) {\n    throw new Error('[@mantine/core] MantineProvider was not found in tree');\n  }\n\n  const setColorScheme = (value: MantineColorScheme) => {\n    ctx.setColorScheme(value);\n    clearStylesRef.current = keepTransitions ? () => {} : disableTransition(nonceValue.current);\n    window.clearTimeout(timeoutRef.current);\n    timeoutRef.current = window.setTimeout(() => {\n      clearStylesRef.current?.();\n    }, 10);\n  };\n\n  const clearColorScheme = () => {\n    ctx.clearColorScheme();\n    clearStylesRef.current = keepTransitions ? () => {} : disableTransition(nonceValue.current);\n    window.clearTimeout(timeoutRef.current);\n    timeoutRef.current = window.setTimeout(() => {\n      clearStylesRef.current?.();\n    }, 10);\n  };\n\n  const osColorScheme = useColorScheme('light', { getInitialValueInEffect: false });\n  const computedColorScheme = ctx.colorScheme === 'auto' ? osColorScheme : ctx.colorScheme;\n\n  const toggleColorScheme = useCallback(\n    () => setColorScheme(computedColorScheme === 'light' ? 'dark' : 'light'),\n    [setColorScheme, computedColorScheme]\n  );\n\n  useEffect(\n    () => () => {\n      clearStylesRef.current?.();\n      window.clearTimeout(timeoutRef.current);\n    },\n    []\n  );\n\n  return {\n    colorScheme: ctx.colorScheme,\n    setColorScheme,\n    clearColorScheme,\n    toggleColorScheme,\n  };\n}\n","import { useMediaQuery, UseMediaQueryOptions } from '../use-media-query/use-media-query';\n\nexport function useColorScheme(initialValue?: 'dark' | 'light', options?: UseMediaQueryOptions) {\n  return useMediaQuery('(prefers-color-scheme: dark)', initialValue === 'dark', options)\n    ? 'dark'\n    : 'light';\n}\n","import {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  factory,\n  Factory,\n  getSpacing,\n  MantineSpacing,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../core';\nimport { filterFalsyChildren } from './filter-falsy-children/filter-falsy-children';\nimport classes from './Group.module.css';\n\nexport type GroupStylesNames = 'root';\nexport type GroupCssVariables = {\n  root:\n    | '--group-gap'\n    | '--group-align'\n    | '--group-justify'\n    | '--group-wrap'\n    | '--group-child-width';\n};\n\nexport interface GroupStylesCtx {\n  childWidth: string;\n}\n\nexport interface GroupProps extends BoxProps, StylesApiProps<GroupFactory>, ElementProps<'div'> {\n  __size?: any;\n\n  /** Controls `justify-content` CSS property, `'flex-start'` by default */\n  justify?: React.CSSProperties['justifyContent'];\n\n  /** Controls `align-items` CSS property, `'center'` by default */\n  align?: React.CSSProperties['alignItems'];\n\n  /** Controls `flex-wrap` CSS property, `'wrap'` by default */\n  wrap?: React.CSSProperties['flexWrap'];\n\n  /** Key of `theme.spacing` or any valid CSS value for `gap`, numbers are converted to rem, `'md'` by default */\n  gap?: MantineSpacing;\n\n  /** Determines whether each child element should have `flex-grow: 1` style, `false` by default */\n  grow?: boolean;\n\n  /** Determines whether children should take only dedicated amount of space (`max-width` style is set based on the number of children), `true` by default */\n  preventGrowOverflow?: boolean;\n}\n\nexport type GroupFactory = Factory<{\n  props: GroupProps;\n  ref: HTMLDivElement;\n  stylesNames: GroupStylesNames;\n  vars: GroupCssVariables;\n  ctx: GroupStylesCtx;\n}>;\n\nconst defaultProps: Partial<GroupProps> = {\n  preventGrowOverflow: true,\n  gap: 'md',\n  align: 'center',\n  justify: 'flex-start',\n  wrap: 'wrap',\n};\n\nconst varsResolver = createVarsResolver<GroupFactory>(\n  (_, { grow, preventGrowOverflow, gap, align, justify, wrap }, { childWidth }) => ({\n    root: {\n      '--group-child-width': grow && preventGrowOverflow ? childWidth : undefined,\n      '--group-gap': getSpacing(gap),\n      '--group-align': align,\n      '--group-justify': justify,\n      '--group-wrap': wrap,\n    },\n  })\n);\n\nexport const Group = factory<GroupFactory>((_props, ref) => {\n  const props = useProps('Group', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    children,\n    gap,\n    align,\n    justify,\n    wrap,\n    grow,\n    preventGrowOverflow,\n    vars,\n    variant,\n    __size,\n    mod,\n    ...others\n  } = props;\n\n  const filteredChildren = filterFalsyChildren(children);\n  const childrenCount = filteredChildren.length;\n  const resolvedGap = getSpacing(gap ?? 'md');\n  const childWidth = `calc(${\n    100 / childrenCount\n  }% - (${resolvedGap} - ${resolvedGap} / ${childrenCount}))`;\n\n  const stylesCtx: GroupStylesCtx = { childWidth };\n\n  const getStyles = useStyles<GroupFactory>({\n    name: 'Group',\n    props,\n    stylesCtx,\n    className,\n    style,\n    classes,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n  });\n\n  return (\n    <Box\n      {...getStyles('root')}\n      ref={ref}\n      variant={variant}\n      mod={[{ grow }, mod]}\n      size={__size}\n      {...others}\n    >\n      {filteredChildren}\n    </Box>\n  );\n});\n\nGroup.classes = classes;\nGroup.displayName = '@mantine/core/Group';\n","import { Children, ReactElement, ReactNode } from 'react';\n\nexport function filterFalsyChildren(children: ReactNode) {\n  return (Children.toArray(children) as ReactElement[]).filter(Boolean);\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"colorScheme\":\"ColorSchemeToggle_colorScheme__xsA9O\"};","import { Button, Group, useMantineColorScheme } from '@mantine/core';\nimport classes from './ColorSchemeToggle.module.scss';\n\nexport function ColorSchemeToggle() {\n  const { setColorScheme } = useMantineColorScheme();\n\n  return (\n    <Group justify=\"end\" mt=\"sm\" mr=\"sm\" className={classes.colorScheme}>\n      <Button onClick={() => setColorScheme('light')}>Light</Button>\n      <Button onClick={() => setColorScheme('dark')}>Dark</Button>\n    </Group>\n  );\n}\n","import { Welcome } from '../components/Welcome/Welcome';\nimport { ColorSchemeToggle } from '../components/ColorSchemeToggle/ColorSchemeToggle';\n\nexport function HomePage() {\n  return (\n    <>\n      <ColorSchemeToggle />\n      <Welcome />\n    </>\n  );\n}\n","import * as React from 'react';\nimport {useState, useCallback, useMemo, useContext} from 'react';\n\nimport {MapRef} from '../mapbox/create-ref';\nimport {MapContext} from './map';\nimport {MapInstance} from '../types';\n\ntype MountedMapsContextValue = {\n  maps: {[id: string]: MapRef<MapInstance>};\n  onMapMount: (map: MapRef<MapInstance>, id: string) => void;\n  onMapUnmount: (id: string) => void;\n};\n\nexport const MountedMapsContext = React.createContext<MountedMapsContextValue>(null);\n\nexport const MapProvider: React.FC<{children?: React.ReactNode}> = props => {\n  const [maps, setMaps] = useState<{[id: string]: MapRef<MapInstance>}>({});\n\n  const onMapMount = useCallback((map: MapRef<MapInstance>, id: string = 'default') => {\n    setMaps(currMaps => {\n      if (id === 'current') {\n        throw new Error(\"'current' cannot be used as map id\");\n      }\n      if (currMaps[id]) {\n        throw new Error(`Multiple maps with the same id: ${id}`);\n      }\n      return {...currMaps, [id]: map};\n    });\n  }, []);\n\n  const onMapUnmount = useCallback((id: string = 'default') => {\n    setMaps(currMaps => {\n      if (currMaps[id]) {\n        const nextMaps = {...currMaps};\n        delete nextMaps[id];\n        return nextMaps;\n      }\n      return currMaps;\n    });\n  }, []);\n\n  return (\n    <MountedMapsContext.Provider\n      value={{\n        maps,\n        onMapMount,\n        onMapUnmount\n      }}\n    >\n      {props.children}\n    </MountedMapsContext.Provider>\n  );\n};\n\nexport type MapCollection<MapT extends MapInstance> = {\n  [id: string]: MapRef<MapT> | undefined;\n  current?: MapRef<MapT>;\n};\n\nexport function useMap<MapT extends MapInstance>(): MapCollection<MapT> {\n  const maps = useContext(MountedMapsContext)?.maps;\n  const currentMap = useContext(MapContext);\n\n  const mapsWithCurrent = useMemo(() => {\n    return {...maps, current: currentMap?.map};\n  }, [maps, currentMap]);\n\n  return mapsWithCurrent as MapCollection<MapT>;\n}\n","import type {PointLike} from '../types';\n\n/**\n * Compare two points\n * @param a\n * @param b\n * @returns true if the points are equal\n */\nexport function arePointsEqual(a?: PointLike, b?: PointLike): boolean {\n  const ax = Array.isArray(a) ? a[0] : a ? a.x : 0;\n  const ay = Array.isArray(a) ? a[1] : a ? a.y : 0;\n  const bx = Array.isArray(b) ? b[0] : b ? b.x : 0;\n  const by = Array.isArray(b) ? b[1] : b ? b.y : 0;\n  return ax === bx && ay === by;\n}\n\n/* eslint-disable complexity */\n/**\n * Compare any two objects\n * @param a\n * @param b\n * @returns true if the objects are deep equal\n */\nexport function deepEqual(a: any, b: any): boolean {\n  if (a === b) {\n    return true;\n  }\n  if (!a || !b) {\n    return false;\n  }\n  if (Array.isArray(a)) {\n    if (!Array.isArray(b) || a.length !== b.length) {\n      return false;\n    }\n    for (let i = 0; i < a.length; i++) {\n      if (!deepEqual(a[i], b[i])) {\n        return false;\n      }\n    }\n    return true;\n  } else if (Array.isArray(b)) {\n    return false;\n  }\n  if (typeof a === 'object' && typeof b === 'object') {\n    const aKeys = Object.keys(a);\n    const bKeys = Object.keys(b);\n    if (aKeys.length !== bKeys.length) {\n      return false;\n    }\n    for (const key of aKeys) {\n      if (!b.hasOwnProperty(key)) {\n        return false;\n      }\n      if (!deepEqual(a[key], b[key])) {\n        return false;\n      }\n    }\n    return true;\n  }\n  return false;\n}\n","import type {MapboxProps} from '../mapbox/mapbox';\nimport type {Transform, ViewState} from '../types';\nimport {deepEqual} from './deep-equal';\n\n/**\n * Make a copy of a transform\n * @param tr\n */\nexport function cloneTransform(tr: Transform): Transform {\n  const newTransform = tr.clone();\n  // Work around mapbox bug - this value is not assigned in clone(), only in resize()\n  newTransform.pixelsToGLUnits = tr.pixelsToGLUnits;\n  return newTransform;\n}\n\n/**\n * Copy projection from one transform to another. This only applies to mapbox-gl transforms\n * @param src the transform to copy projection settings from\n * @param dest to transform to copy projection settings to\n */\nexport function syncProjection(src: Transform, dest: Transform): void {\n  if (!src.getProjection) {\n    return;\n  }\n  const srcProjection = src.getProjection();\n  const destProjection = dest.getProjection();\n\n  if (!deepEqual(srcProjection, destProjection)) {\n    dest.setProjection(srcProjection);\n  }\n}\n\n/**\n * Capture a transform's current state\n * @param transform\n * @returns descriptor of the view state\n */\nexport function transformToViewState(tr: Transform): ViewState {\n  return {\n    longitude: tr.center.lng,\n    latitude: tr.center.lat,\n    zoom: tr.zoom,\n    pitch: tr.pitch,\n    bearing: tr.bearing,\n    padding: tr.padding\n  };\n}\n\n/* eslint-disable complexity */\n/**\n * Mutate a transform to match the given view state\n * @param transform\n * @param viewState\n * @returns true if the transform has changed\n */\nexport function applyViewStateToTransform(tr: Transform, props: MapboxProps): boolean {\n  const v: Partial<ViewState> = props.viewState || props;\n  let changed = false;\n\n  if ('longitude' in v && 'latitude' in v) {\n    const center = tr.center;\n    // @ts-ignore\n    tr.center = new center.constructor(v.longitude, v.latitude);\n    changed = changed || center !== tr.center;\n  }\n  if ('zoom' in v) {\n    const zoom = tr.zoom;\n    tr.zoom = v.zoom;\n    changed = changed || zoom !== tr.zoom;\n  }\n  if ('bearing' in v) {\n    const bearing = tr.bearing;\n    tr.bearing = v.bearing;\n    changed = changed || bearing !== tr.bearing;\n  }\n  if ('pitch' in v) {\n    const pitch = tr.pitch;\n    tr.pitch = v.pitch;\n    changed = changed || pitch !== tr.pitch;\n  }\n  if (v.padding && !tr.isPaddingEqual(v.padding)) {\n    changed = true;\n    tr.padding = v.padding;\n  }\n  return changed;\n}\n","import {ImmutableLike, MapStyle} from '../types';\n\nconst refProps = ['type', 'source', 'source-layer', 'minzoom', 'maxzoom', 'filter', 'layout'];\n\n// Prepare a map style object for diffing\n// If immutable - convert to plain object\n// Work around some issues in older styles that would fail Mapbox's diffing\nexport function normalizeStyle(\n  style: string | MapStyle | ImmutableLike<MapStyle>\n): string | MapStyle {\n  if (!style) {\n    return null;\n  }\n  if (typeof style === 'string') {\n    return style;\n  }\n  if ('toJS' in style) {\n    style = style.toJS();\n  }\n  if (!style.layers) {\n    return style;\n  }\n  const layerIndex = {};\n\n  for (const layer of style.layers) {\n    layerIndex[layer.id] = layer;\n  }\n\n  const layers = style.layers.map(layer => {\n    let normalizedLayer: typeof layer = null;\n\n    if ('interactive' in layer) {\n      normalizedLayer = Object.assign({}, layer);\n      // Breaks style diffing :(\n      // @ts-ignore legacy field not typed\n      delete normalizedLayer.interactive;\n    }\n\n    // Style diffing doesn't work with refs so expand them out manually before diffing.\n    // @ts-ignore legacy field not typed\n    const layerRef = layerIndex[layer.ref];\n    if (layerRef) {\n      normalizedLayer = normalizedLayer || Object.assign({}, layer);\n      // @ts-ignore\n      delete normalizedLayer.ref;\n      // https://github.com/mapbox/mapbox-gl-js/blob/master/src/style-spec/deref.js\n      for (const propName of refProps) {\n        if (propName in layerRef) {\n          normalizedLayer[propName] = layerRef[propName];\n        }\n      }\n    }\n\n    return normalizedLayer || layer;\n  });\n\n  // Do not mutate the style object provided by the user\n  return {...style, layers};\n}\n","import {\n  transformToViewState,\n  applyViewStateToTransform,\n  cloneTransform,\n  syncProjection\n} from '../utils/transform';\nimport {normalizeStyle} from '../utils/style-utils';\nimport {deepEqual} from '../utils/deep-equal';\n\nimport type {\n  Transform,\n  ViewState,\n  ViewStateChangeEvent,\n  Point,\n  PointLike,\n  PaddingOptions,\n  MapStyle,\n  ImmutableLike,\n  LngLatBoundsLike,\n  Callbacks,\n  MapEvent,\n  ErrorEvent,\n  MapMouseEvent,\n  MapGeoJSONFeature,\n  MapInstance,\n  MapInstanceInternal\n} from '../types';\n\nexport type MapboxProps<\n  StyleT extends MapStyle = MapStyle,\n  CallbacksT extends Callbacks = {}\n> = Partial<ViewState> &\n  CallbacksT & {\n    // Init options\n    mapboxAccessToken?: string;\n\n    /** Camera options used when constructing the Map instance */\n    initialViewState?: Partial<ViewState> & {\n      /** The initial bounds of the map. If bounds is specified, it overrides longitude, latitude and zoom options. */\n      bounds?: LngLatBoundsLike;\n      /** A fitBounds options object to use only when setting the bounds option. */\n      fitBoundsOptions?: {\n        offset?: PointLike;\n        minZoom?: number;\n        maxZoom?: number;\n        padding?: number | PaddingOptions;\n      };\n    };\n\n    /** If provided, render into an external WebGL context */\n    gl?: WebGLRenderingContext;\n\n    /** For external controller to override the camera state */\n    viewState?: ViewState & {\n      width: number;\n      height: number;\n    };\n\n    // Styling\n\n    /** Mapbox style */\n    mapStyle?: string | StyleT | ImmutableLike<StyleT>;\n    /** Enable diffing when the map style changes\n     * @default true\n     */\n    styleDiffing?: boolean;\n    /** The fog property of the style. Must conform to the Fog Style Specification .\n     * If `undefined` is provided, removes the fog from the map. */\n    fog?: StyleT['fog'];\n    /** Light properties of the map. */\n    light?: StyleT['light'];\n    /** Terrain property of the style. Must conform to the Terrain Style Specification .\n     * If `undefined` is provided, removes terrain from the map. */\n    terrain?: StyleT['terrain'];\n\n    /** Default layers to query on pointer events */\n    interactiveLayerIds?: string[];\n    /** CSS cursor */\n    cursor?: string;\n  };\n\nconst DEFAULT_STYLE = {version: 8, sources: {}, layers: []} as MapStyle;\n\nconst pointerEvents = {\n  mousedown: 'onMouseDown',\n  mouseup: 'onMouseUp',\n  mouseover: 'onMouseOver',\n  mousemove: 'onMouseMove',\n  click: 'onClick',\n  dblclick: 'onDblClick',\n  mouseenter: 'onMouseEnter',\n  mouseleave: 'onMouseLeave',\n  mouseout: 'onMouseOut',\n  contextmenu: 'onContextMenu',\n  touchstart: 'onTouchStart',\n  touchend: 'onTouchEnd',\n  touchmove: 'onTouchMove',\n  touchcancel: 'onTouchCancel'\n};\nconst cameraEvents = {\n  movestart: 'onMoveStart',\n  move: 'onMove',\n  moveend: 'onMoveEnd',\n  dragstart: 'onDragStart',\n  drag: 'onDrag',\n  dragend: 'onDragEnd',\n  zoomstart: 'onZoomStart',\n  zoom: 'onZoom',\n  zoomend: 'onZoomEnd',\n  rotatestart: 'onRotateStart',\n  rotate: 'onRotate',\n  rotateend: 'onRotateEnd',\n  pitchstart: 'onPitchStart',\n  pitch: 'onPitch',\n  pitchend: 'onPitchEnd'\n};\nconst otherEvents = {\n  wheel: 'onWheel',\n  boxzoomstart: 'onBoxZoomStart',\n  boxzoomend: 'onBoxZoomEnd',\n  boxzoomcancel: 'onBoxZoomCancel',\n  resize: 'onResize',\n  load: 'onLoad',\n  render: 'onRender',\n  idle: 'onIdle',\n  remove: 'onRemove',\n  data: 'onData',\n  styledata: 'onStyleData',\n  sourcedata: 'onSourceData',\n  error: 'onError'\n};\nconst settingNames = [\n  'minZoom',\n  'maxZoom',\n  'minPitch',\n  'maxPitch',\n  'maxBounds',\n  'projection',\n  'renderWorldCopies'\n];\nconst handlerNames = [\n  'scrollZoom',\n  'boxZoom',\n  'dragRotate',\n  'dragPan',\n  'keyboard',\n  'doubleClickZoom',\n  'touchZoomRotate',\n  'touchPitch'\n];\n\n/**\n * A wrapper for mapbox-gl's Map class\n */\nexport default class Mapbox<\n  StyleT extends MapStyle = MapStyle,\n  CallbacksT extends Callbacks = {},\n  MapT extends MapInstance = MapInstance\n> {\n  private _MapClass: {new (options: any): MapInstance};\n  // mapboxgl.Map instance\n  private _map: MapInstanceInternal<MapT> = null;\n  // User-supplied props\n  props: MapboxProps<StyleT, CallbacksT>;\n\n  // Mapbox map is stateful.\n  // During method calls/user interactions, map.transform is mutated and\n  // deviate from user-supplied props.\n  // In order to control the map reactively, we shadow the transform\n  // with the one below, which reflects the view state resolved from\n  // both user-supplied props and the underlying state\n  private _renderTransform: Transform;\n\n  // Internal states\n  private _internalUpdate: boolean = false;\n  private _inRender: boolean = false;\n  private _hoveredFeatures: MapGeoJSONFeature[] = null;\n  private _deferredEvents: {\n    move: boolean;\n    zoom: boolean;\n    pitch: boolean;\n    rotate: boolean;\n  } = {\n    move: false,\n    zoom: false,\n    pitch: false,\n    rotate: false\n  };\n\n  static savedMaps: Mapbox[] = [];\n\n  constructor(\n    MapClass: {new (options: any): MapInstance},\n    props: MapboxProps<StyleT, CallbacksT>,\n    container: HTMLDivElement\n  ) {\n    this._MapClass = MapClass;\n    this.props = props;\n    this._initialize(container);\n  }\n\n  get map(): MapT {\n    return this._map;\n  }\n\n  get transform(): Transform {\n    return this._renderTransform;\n  }\n\n  setProps(props: MapboxProps<StyleT, CallbacksT>) {\n    const oldProps = this.props;\n    this.props = props;\n\n    const settingsChanged = this._updateSettings(props, oldProps);\n    if (settingsChanged) {\n      this._createShadowTransform(this._map);\n    }\n    const sizeChanged = this._updateSize(props);\n    const viewStateChanged = this._updateViewState(props, true);\n    this._updateStyle(props, oldProps);\n    this._updateStyleComponents(props, oldProps);\n    this._updateHandlers(props, oldProps);\n\n    // If 1) view state has changed to match props and\n    //    2) the props change is not triggered by map events,\n    // it's driven by an external state change. Redraw immediately\n    if (settingsChanged || sizeChanged || (viewStateChanged && !this._map.isMoving())) {\n      this.redraw();\n    }\n  }\n\n  static reuse<StyleT extends MapStyle, CallbacksT extends Callbacks, MapT extends MapInstance>(\n    props: MapboxProps<StyleT, CallbacksT>,\n    container: HTMLDivElement\n  ): Mapbox<StyleT, CallbacksT, MapT> {\n    const that = Mapbox.savedMaps.pop() as Mapbox<StyleT, CallbacksT, MapT>;\n    if (!that) {\n      return null;\n    }\n\n    const map = that.map;\n    // When reusing the saved map, we need to reparent the map(canvas) and other child nodes\n    // intoto the new container from the props.\n    // Step 1: reparenting child nodes from old container to new container\n    const oldContainer = map.getContainer();\n    container.className = oldContainer.className;\n    while (oldContainer.childNodes.length > 0) {\n      container.appendChild(oldContainer.childNodes[0]);\n    }\n    // Step 2: replace the internal container with new container from the react component\n    // @ts-ignore\n    map._container = container;\n\n    // With maplibre-gl as mapLib, map uses ResizeObserver to observe when its container resizes.\n    // When reusing the saved map, we need to disconnect the observer and observe the new container.\n    // Step 3: telling the ResizeObserver to disconnect and observe the new container\n    // @ts-ignore\n    const resizeObserver = map._resizeObserver;\n    if (resizeObserver) {\n      resizeObserver.disconnect();\n      resizeObserver.observe(container);\n    }\n\n    // Step 4: apply new props\n    that.setProps({...props, styleDiffing: false});\n    map.resize();\n    const {initialViewState} = props;\n    if (initialViewState) {\n      if (initialViewState.bounds) {\n        map.fitBounds(initialViewState.bounds, {...initialViewState.fitBoundsOptions, duration: 0});\n      } else {\n        that._updateViewState(initialViewState, false);\n      }\n    }\n\n    // Simulate load event\n    if (map.isStyleLoaded()) {\n      map.fire('load');\n    } else {\n      map.once('styledata', () => map.fire('load'));\n    }\n\n    // Force reload\n    // @ts-ignore\n    map._update();\n    return that;\n  }\n\n  /* eslint-disable complexity,max-statements */\n  _initialize(container: HTMLDivElement) {\n    const {props} = this;\n    const {mapStyle = DEFAULT_STYLE} = props;\n    const mapOptions = {\n      ...props,\n      ...props.initialViewState,\n      accessToken: props.mapboxAccessToken || getAccessTokenFromEnv() || null,\n      container,\n      style: normalizeStyle(mapStyle)\n    };\n\n    const viewState = mapOptions.initialViewState || mapOptions.viewState || mapOptions;\n    Object.assign(mapOptions, {\n      center: [viewState.longitude || 0, viewState.latitude || 0],\n      zoom: viewState.zoom || 0,\n      pitch: viewState.pitch || 0,\n      bearing: viewState.bearing || 0\n    });\n\n    if (props.gl) {\n      // eslint-disable-next-line\n      const getContext = HTMLCanvasElement.prototype.getContext;\n      // Hijack canvas.getContext to return our own WebGLContext\n      // This will be called inside the mapboxgl.Map constructor\n      // @ts-expect-error\n      HTMLCanvasElement.prototype.getContext = () => {\n        // Unhijack immediately\n        HTMLCanvasElement.prototype.getContext = getContext;\n        return props.gl;\n      };\n    }\n\n    const map = new this._MapClass(mapOptions) as MapInstanceInternal<MapT>;\n    // Props that are not part of constructor options\n    if (viewState.padding) {\n      map.setPadding(viewState.padding);\n    }\n    if (props.cursor) {\n      map.getCanvas().style.cursor = props.cursor;\n    }\n    this._createShadowTransform(map);\n\n    // Hack\n    // Insert code into map's render cycle\n    const renderMap = map._render;\n    map._render = (arg: number) => {\n      this._inRender = true;\n      renderMap.call(map, arg);\n      this._inRender = false;\n    };\n    const runRenderTaskQueue = map._renderTaskQueue.run;\n    map._renderTaskQueue.run = (arg: number) => {\n      runRenderTaskQueue.call(map._renderTaskQueue, arg);\n      this._onBeforeRepaint();\n    };\n    map.on('render', () => this._onAfterRepaint());\n    // Insert code into map's event pipeline\n    // eslint-disable-next-line @typescript-eslint/unbound-method\n    const fireEvent = map.fire;\n    map.fire = this._fireEvent.bind(this, fireEvent);\n\n    // add listeners\n    map.on('resize', () => {\n      this._renderTransform.resize(map.transform.width, map.transform.height);\n    });\n    map.on('styledata', () => {\n      this._updateStyleComponents(this.props, {});\n      // Projection can be set in stylesheet\n      syncProjection(map.transform, this._renderTransform);\n    });\n    map.on('sourcedata', () => this._updateStyleComponents(this.props, {}));\n    for (const eventName in pointerEvents) {\n      map.on(eventName, this._onPointerEvent);\n    }\n    for (const eventName in cameraEvents) {\n      map.on(eventName, this._onCameraEvent);\n    }\n    for (const eventName in otherEvents) {\n      map.on(eventName, this._onEvent);\n    }\n    this._map = map;\n  }\n  /* eslint-enable complexity,max-statements */\n\n  recycle() {\n    // Clean up unnecessary elements before storing for reuse.\n    const container = this.map.getContainer();\n    const children = container.querySelector('[mapboxgl-children]');\n    children?.remove();\n\n    Mapbox.savedMaps.push(this);\n  }\n\n  destroy() {\n    this._map.remove();\n  }\n\n  // Force redraw the map now. Typically resize() and jumpTo() is reflected in the next\n  // render cycle, which is managed by Mapbox's animation loop.\n  // This removes the synchronization issue caused by requestAnimationFrame.\n  redraw() {\n    const map = this._map as any;\n    // map._render will throw error if style does not exist\n    // https://github.com/mapbox/mapbox-gl-js/blob/fb9fc316da14e99ff4368f3e4faa3888fb43c513\n    //   /src/ui/map.js#L1834\n    if (!this._inRender && map.style) {\n      // cancel the scheduled update\n      if (map._frame) {\n        map._frame.cancel();\n        map._frame = null;\n      }\n      // the order is important - render() may schedule another update\n      map._render();\n    }\n  }\n\n  _createShadowTransform(map: any) {\n    const renderTransform = cloneTransform(map.transform);\n    map.painter.transform = renderTransform;\n\n    this._renderTransform = renderTransform;\n  }\n\n  /* Trigger map resize if size is controlled\n     @param {object} nextProps\n     @returns {bool} true if size has changed\n   */\n  _updateSize(nextProps: MapboxProps<StyleT>): boolean {\n    // Check if size is controlled\n    const {viewState} = nextProps;\n    if (viewState) {\n      const map = this._map;\n      if (viewState.width !== map.transform.width || viewState.height !== map.transform.height) {\n        map.resize();\n        return true;\n      }\n    }\n    return false;\n  }\n\n  // Adapted from map.jumpTo\n  /* Update camera to match props\n     @param {object} nextProps\n     @param {bool} triggerEvents - should fire camera events\n     @returns {bool} true if anything is changed\n   */\n  _updateViewState(nextProps: MapboxProps<StyleT>, triggerEvents: boolean): boolean {\n    if (this._internalUpdate) {\n      return false;\n    }\n    const map = this._map;\n\n    const tr = this._renderTransform;\n    // Take a snapshot of the transform before mutation\n    const {zoom, pitch, bearing} = tr;\n    const isMoving = map.isMoving();\n\n    if (isMoving) {\n      // All movement of the camera is done relative to the sea level\n      tr.cameraElevationReference = 'sea';\n    }\n    const changed = applyViewStateToTransform(tr, {\n      ...transformToViewState(map.transform),\n      ...nextProps\n    });\n    if (isMoving) {\n      // Reset camera reference\n      tr.cameraElevationReference = 'ground';\n    }\n\n    if (changed && triggerEvents) {\n      const deferredEvents = this._deferredEvents;\n      // Delay DOM control updates to the next render cycle\n      deferredEvents.move = true;\n      deferredEvents.zoom ||= zoom !== tr.zoom;\n      deferredEvents.rotate ||= bearing !== tr.bearing;\n      deferredEvents.pitch ||= pitch !== tr.pitch;\n    }\n\n    // Avoid manipulating the real transform when interaction/animation is ongoing\n    // as it would interfere with Mapbox's handlers\n    if (!isMoving) {\n      applyViewStateToTransform(map.transform, nextProps);\n    }\n\n    return changed;\n  }\n\n  /* Update camera constraints and projection settings to match props\n     @param {object} nextProps\n     @param {object} currProps\n     @returns {bool} true if anything is changed\n   */\n  _updateSettings(nextProps: MapboxProps<StyleT>, currProps: MapboxProps<StyleT>): boolean {\n    const map = this._map;\n    let changed = false;\n    for (const propName of settingNames) {\n      if (propName in nextProps && !deepEqual(nextProps[propName], currProps[propName])) {\n        changed = true;\n        const setter = map[`set${propName[0].toUpperCase()}${propName.slice(1)}`];\n        setter?.call(map, nextProps[propName]);\n      }\n    }\n    return changed;\n  }\n\n  /* Update map style to match props\n     @param {object} nextProps\n     @param {object} currProps\n     @returns {bool} true if style is changed\n   */\n  _updateStyle(nextProps: MapboxProps<StyleT>, currProps: MapboxProps<StyleT>): boolean {\n    if (nextProps.cursor !== currProps.cursor) {\n      this._map.getCanvas().style.cursor = nextProps.cursor || '';\n    }\n    if (nextProps.mapStyle !== currProps.mapStyle) {\n      const {mapStyle = DEFAULT_STYLE, styleDiffing = true} = nextProps;\n      const options: any = {\n        diff: styleDiffing\n      };\n      if ('localIdeographFontFamily' in nextProps) {\n        // @ts-ignore Mapbox specific prop\n        options.localIdeographFontFamily = nextProps.localIdeographFontFamily;\n      }\n      this._map.setStyle(normalizeStyle(mapStyle), options);\n      return true;\n    }\n    return false;\n  }\n\n  /* Update fog, light and terrain to match props\n     @param {object} nextProps\n     @param {object} currProps\n     @returns {bool} true if anything is changed\n   */\n  _updateStyleComponents(nextProps: MapboxProps<StyleT>, currProps: MapboxProps<StyleT>): boolean {\n    const map = this._map;\n    let changed = false;\n    if (map.isStyleLoaded()) {\n      if ('light' in nextProps && map.setLight && !deepEqual(nextProps.light, currProps.light)) {\n        changed = true;\n        map.setLight(nextProps.light);\n      }\n      if ('fog' in nextProps && map.setFog && !deepEqual(nextProps.fog, currProps.fog)) {\n        changed = true;\n        map.setFog(nextProps.fog);\n      }\n      if (\n        'terrain' in nextProps &&\n        map.setTerrain &&\n        !deepEqual(nextProps.terrain, currProps.terrain)\n      ) {\n        if (!nextProps.terrain || map.getSource(nextProps.terrain.source)) {\n          changed = true;\n          map.setTerrain(nextProps.terrain);\n        }\n      }\n    }\n    return changed;\n  }\n\n  /* Update interaction handlers to match props\n     @param {object} nextProps\n     @param {object} currProps\n     @returns {bool} true if anything is changed\n   */\n  _updateHandlers(nextProps: MapboxProps<StyleT>, currProps: MapboxProps<StyleT>): boolean {\n    const map = this._map;\n    let changed = false;\n    for (const propName of handlerNames) {\n      const newValue = nextProps[propName] ?? true;\n      const oldValue = currProps[propName] ?? true;\n      if (!deepEqual(newValue, oldValue)) {\n        changed = true;\n        if (newValue) {\n          map[propName].enable(newValue);\n        } else {\n          map[propName].disable();\n        }\n      }\n    }\n    return changed;\n  }\n\n  _onEvent = (e: MapEvent<MapT>) => {\n    // @ts-ignore\n    const cb = this.props[otherEvents[e.type]];\n    if (cb) {\n      cb(e);\n    } else if (e.type === 'error') {\n      console.error((e as ErrorEvent<MapT>).error); // eslint-disable-line\n    }\n  };\n\n  private _queryRenderedFeatures(point: Point) {\n    const map = this._map;\n    const tr = map.transform;\n    const {interactiveLayerIds = []} = this.props;\n    try {\n      map.transform = this._renderTransform;\n      return map.queryRenderedFeatures(point, {\n        layers: interactiveLayerIds.filter(map.getLayer.bind(map))\n      });\n    } catch {\n      // May fail if style is not loaded\n      return [];\n    } finally {\n      map.transform = tr;\n    }\n  }\n\n  _updateHover(e: MapMouseEvent<MapT>) {\n    const {props} = this;\n    const shouldTrackHoveredFeatures =\n      props.interactiveLayerIds && (props.onMouseMove || props.onMouseEnter || props.onMouseLeave);\n\n    if (shouldTrackHoveredFeatures) {\n      const eventType = e.type;\n      const wasHovering = this._hoveredFeatures?.length > 0;\n      const features = this._queryRenderedFeatures(e.point);\n      const isHovering = features.length > 0;\n\n      if (!isHovering && wasHovering) {\n        e.type = 'mouseleave';\n        this._onPointerEvent(e);\n      }\n      this._hoveredFeatures = features;\n      if (isHovering && !wasHovering) {\n        e.type = 'mouseenter';\n        this._onPointerEvent(e);\n      }\n      e.type = eventType;\n    } else {\n      this._hoveredFeatures = null;\n    }\n  }\n\n  _onPointerEvent = (e: MapMouseEvent<MapT> | MapMouseEvent<MapT>) => {\n    if (e.type === 'mousemove' || e.type === 'mouseout') {\n      this._updateHover(e);\n    }\n\n    // @ts-ignore\n    const cb = this.props[pointerEvents[e.type]];\n    if (cb) {\n      if (this.props.interactiveLayerIds && e.type !== 'mouseover' && e.type !== 'mouseout') {\n        e.features = this._hoveredFeatures || this._queryRenderedFeatures(e.point);\n      }\n      cb(e);\n      delete e.features;\n    }\n  };\n\n  _onCameraEvent = (e: ViewStateChangeEvent<MapT>) => {\n    if (!this._internalUpdate) {\n      // @ts-ignore\n      const cb = this.props[cameraEvents[e.type]];\n      if (cb) {\n        cb(e);\n      }\n    }\n    if (e.type in this._deferredEvents) {\n      this._deferredEvents[e.type] = false;\n    }\n  };\n\n  _fireEvent(baseFire: Function, event: string | MapEvent<MapT>, properties?: object) {\n    const map = this._map;\n    const tr = map.transform;\n\n    const eventType = typeof event === 'string' ? event : event.type;\n    if (eventType === 'move') {\n      this._updateViewState(this.props, false);\n    }\n    if (eventType in cameraEvents) {\n      if (typeof event === 'object') {\n        (event as unknown as ViewStateChangeEvent<MapT>).viewState = transformToViewState(tr);\n      }\n      if (this._map.isMoving()) {\n        // Replace map.transform with ours during the callbacks\n        map.transform = this._renderTransform;\n        baseFire.call(map, event, properties);\n        map.transform = tr;\n\n        return map;\n      }\n    }\n    baseFire.call(map, event, properties);\n\n    return map;\n  }\n\n  // All camera manipulations are complete, ready to repaint\n  _onBeforeRepaint() {\n    const map = this._map;\n\n    // If there are camera changes driven by props, invoke camera events so that DOM controls are synced\n    this._internalUpdate = true;\n    for (const eventType in this._deferredEvents) {\n      if (this._deferredEvents[eventType]) {\n        map.fire(eventType);\n      }\n    }\n    this._internalUpdate = false;\n\n    const tr = this._map.transform;\n    // Make sure camera matches the current props\n    map.transform = this._renderTransform;\n\n    this._onAfterRepaint = () => {\n      // Mapbox transitions between non-mercator projection and mercator during render time\n      // Copy it back to the other\n      syncProjection(this._renderTransform, tr);\n      // Restores camera state before render/load events are fired\n      map.transform = tr;\n    };\n  }\n\n  _onAfterRepaint: () => void;\n}\n\n/**\n * Access token can be provided via one of:\n *   mapboxAccessToken prop\n *   access_token query parameter\n *   MapboxAccessToken environment variable\n *   REACT_APP_MAPBOX_ACCESS_TOKEN environment variable\n * @returns access token\n */\nfunction getAccessTokenFromEnv(): string {\n  let accessToken = null;\n\n  /* global location, process */\n  if (typeof location !== 'undefined') {\n    const match = /access_token=([^&\\/]*)/.exec(location.search);\n    accessToken = match && match[1];\n  }\n\n  // Note: This depends on bundler plugins (e.g. webpack) importing environment correctly\n  try {\n    accessToken = accessToken || process.env.MapboxAccessToken;\n  } catch {\n    // ignore\n  }\n\n  try {\n    accessToken = accessToken || process.env.REACT_APP_MAPBOX_ACCESS_TOKEN;\n  } catch {\n    // ignore\n  }\n\n  return accessToken;\n}\n","import type {\n  MapInstance,\n  MapInstanceInternal,\n  MapStyle,\n  Callbacks,\n  LngLatLike,\n  PointLike\n} from '../types';\nimport type Mapbox from './mapbox';\n\n/** These methods may break the react binding if called directly */\nconst skipMethods = [\n  'setMaxBounds',\n  'setMinZoom',\n  'setMaxZoom',\n  'setMinPitch',\n  'setMaxPitch',\n  'setRenderWorldCopies',\n  'setProjection',\n  'setStyle',\n  'addSource',\n  'removeSource',\n  'addLayer',\n  'removeLayer',\n  'setLayerZoomRange',\n  'setFilter',\n  'setPaintProperty',\n  'setLayoutProperty',\n  'setLight',\n  'setTerrain',\n  'setFog',\n  'remove'\n] as const;\n\nexport type MapRef<MapT extends MapInstance> = {\n  getMap(): MapT;\n} & Omit<MapT, typeof skipMethods[number]>;\n\nexport default function createRef<\n  StyleT extends MapStyle,\n  CallbacksT extends Callbacks,\n  MapT extends MapInstance\n>(mapInstance: Mapbox<StyleT, CallbacksT, MapT>): MapRef<MapT> | null {\n  if (!mapInstance) {\n    return null;\n  }\n\n  const map = mapInstance.map as MapInstanceInternal<MapT>;\n  const result: any = {\n    getMap: () => map,\n\n    // Overwrite getters to use our shadow transform\n    getCenter: () => mapInstance.transform.center,\n    getZoom: () => mapInstance.transform.zoom,\n    getBearing: () => mapInstance.transform.bearing,\n    getPitch: () => mapInstance.transform.pitch,\n    getPadding: () => mapInstance.transform.padding,\n    getBounds: () => mapInstance.transform.getBounds(),\n    project: (lnglat: LngLatLike) => {\n      const tr = map.transform;\n      map.transform = mapInstance.transform;\n      const result = map.project(lnglat);\n      map.transform = tr;\n      return result;\n    },\n    unproject: (point: PointLike) => {\n      const tr = map.transform;\n      map.transform = mapInstance.transform;\n      const result = map.unproject(point);\n      map.transform = tr;\n      return result;\n    },\n    // options diverge between mapbox and maplibre\n    queryTerrainElevation: (lnglat: LngLatLike, options?: any) => {\n      const tr = map.transform;\n      map.transform = mapInstance.transform;\n      const result = map.queryTerrainElevation(lnglat, options);\n      map.transform = tr;\n      return result;\n    },\n    queryRenderedFeatures: (geometry?: any, options?: any) => {\n      const tr = map.transform;\n      map.transform = mapInstance.transform;\n      const result = map.queryRenderedFeatures(geometry, options);\n      map.transform = tr;\n      return result;\n    }\n  };\n\n  for (const key of getMethodNames(map)) {\n    // @ts-expect-error\n    if (!(key in result) && !skipMethods.includes(key)) {\n      result[key] = map[key].bind(map);\n    }\n  }\n\n  return result;\n}\n\nfunction getMethodNames(obj: Object) {\n  const result = new Set<string>();\n\n  let proto = obj;\n  while (proto) {\n    for (const key of Object.getOwnPropertyNames(proto)) {\n      if (\n        key[0] !== '_' &&\n        typeof obj[key] === 'function' &&\n        key !== 'fire' &&\n        key !== 'setEventedParent'\n      ) {\n        result.add(key);\n      }\n    }\n    proto = Object.getPrototypeOf(proto);\n  }\n  return Array.from(result);\n}\n","// From https://github.com/streamich/react-use/blob/master/src/useIsomorphicLayoutEffect.ts\n// useLayoutEffect but does not trigger warning in server-side rendering\nimport {useEffect, useLayoutEffect} from 'react';\n\nconst useIsomorphicLayoutEffect = typeof document !== 'undefined' ? useLayoutEffect : useEffect;\n\nexport default useIsomorphicLayoutEffect;\n","export type GlobalSettings = {\n  /** The map's default API URL for requesting tiles, styles, sprites, and glyphs. */\n  baseApiUrl?: string;\n  /** The maximum number of images (raster tiles, sprites, icons) to load in parallel.\n   * @default 16\n   */\n  maxParallelImageRequests?: number;\n  /** The map's RTL text plugin. Necessary for supporting the Arabic and Hebrew languages, which are written right-to-left.  */\n  RTLTextPlugin?: string | false;\n  /** Provides an interface for external module bundlers such as Webpack or Rollup to package mapbox-gl's WebWorker into a separate class and integrate it with the library.\nTakes precedence over `workerUrl`. */\n  workerClass?: any;\n  /** The number of web workers instantiated on a page with mapbox-gl maps.\n   * @default 2\n   */\n  workerCount?: number;\n  /** Provides an interface for loading mapbox-gl's WebWorker bundle from a self-hosted URL.\n   * This is useful if your site needs to operate in a strict CSP (Content Security Policy) environment\n   * wherein you are not allowed to load JavaScript code from a Blob URL, which is default behavior. */\n  workerUrl?: string;\n};\n\nconst globalSettings = [\n  'baseApiUrl',\n  'maxParallelImageRequests',\n  'workerClass',\n  'workerCount',\n  'workerUrl'\n] as const;\n\nexport default function setGlobals(mapLib: any, props: GlobalSettings) {\n  for (const key of globalSettings) {\n    if (key in props) {\n      mapLib[key] = props[key];\n    }\n  }\n\n  const {\n    RTLTextPlugin = 'https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-rtl-text/v0.2.3/mapbox-gl-rtl-text.js'\n  } = props;\n  if (\n    RTLTextPlugin &&\n    mapLib.getRTLTextPluginStatus &&\n    mapLib.getRTLTextPluginStatus() === 'unavailable'\n  ) {\n    mapLib.setRTLTextPlugin(\n      RTLTextPlugin,\n      (error?: Error) => {\n        if (error) {\n          // eslint-disable-next-line\n          console.error(error);\n        }\n      },\n      true\n    );\n  }\n}\n","import * as React from 'react';\nimport {useState, useRef, useEffect, useContext, useMemo, useImperativeHandle} from 'react';\n\nimport {MountedMapsContext} from './use-map';\nimport Mapbox, {MapboxProps} from '../mapbox/mapbox';\nimport createRef, {MapRef} from '../mapbox/create-ref';\n\nimport type {CSSProperties} from 'react';\nimport useIsomorphicLayoutEffect from '../utils/use-isomorphic-layout-effect';\nimport setGlobals, {GlobalSettings} from '../utils/set-globals';\nimport type {MapLib, MapInstance, MapStyle, Callbacks} from '../types';\n\nexport type MapContextValue<MapT extends MapInstance = MapInstance> = {\n  mapLib: MapLib<MapT>;\n  map: MapRef<MapT>;\n};\n\nexport const MapContext = React.createContext<MapContextValue>(null);\n\ntype MapInitOptions<MapOptions> = Omit<\n  MapOptions,\n  'style' | 'container' | 'bounds' | 'fitBoundsOptions' | 'center'\n>;\n\nexport type MapProps<\n  MapOptions,\n  StyleT extends MapStyle,\n  CallbacksT extends Callbacks,\n  MapT extends MapInstance\n> = MapInitOptions<MapOptions> &\n  MapboxProps<StyleT, CallbacksT> &\n  GlobalSettings & {\n    mapLib?: MapLib<MapT> | Promise<MapLib<MapT>>;\n    reuseMaps?: boolean;\n    /** Map container id */\n    id?: string;\n    /** Map container CSS style */\n    style?: CSSProperties;\n    children?: any;\n  };\n\nexport default function Map<\n  MapOptions,\n  StyleT extends MapStyle,\n  CallbacksT extends Callbacks,\n  MapT extends MapInstance\n>(\n  props: MapProps<MapOptions, StyleT, CallbacksT, MapT>,\n  ref: React.Ref<MapRef<MapT>>,\n  defaultLib: MapLib<MapT> | Promise<MapLib<MapT>>\n) {\n  const mountedMapsContext = useContext(MountedMapsContext);\n  const [mapInstance, setMapInstance] = useState<Mapbox<StyleT, CallbacksT, MapT>>(null);\n  const containerRef = useRef();\n\n  const {current: contextValue} = useRef<MapContextValue<MapT>>({mapLib: null, map: null});\n\n  useEffect(() => {\n    const mapLib = props.mapLib;\n    let isMounted = true;\n    let mapbox: Mapbox<StyleT, CallbacksT, MapT>;\n\n    Promise.resolve(mapLib || defaultLib)\n      .then((module: MapLib<MapT> | {default: MapLib<MapT>}) => {\n        if (!isMounted) {\n          return;\n        }\n        if (!module) {\n          throw new Error('Invalid mapLib');\n        }\n        const mapboxgl = 'Map' in module ? module : module.default;\n        if (!mapboxgl.Map) {\n          throw new Error('Invalid mapLib');\n        }\n\n        // workerUrl & workerClass may change the result of supported()\n        // https://github.com/visgl/react-map-gl/discussions/2027\n        setGlobals(mapboxgl, props);\n        if (!mapboxgl.supported || mapboxgl.supported(props)) {\n          if (props.reuseMaps) {\n            mapbox = Mapbox.reuse(props, containerRef.current);\n          }\n          if (!mapbox) {\n            mapbox = new Mapbox(mapboxgl.Map, props, containerRef.current);\n          }\n          contextValue.map = createRef(mapbox);\n          contextValue.mapLib = mapboxgl;\n\n          setMapInstance(mapbox);\n          mountedMapsContext?.onMapMount(contextValue.map, props.id);\n        } else {\n          throw new Error('Map is not supported by this browser');\n        }\n      })\n      .catch(error => {\n        const {onError} = props;\n        if (onError) {\n          onError({\n            type: 'error',\n            target: null,\n            originalEvent: null,\n            error\n          });\n        } else {\n          console.error(error); // eslint-disable-line\n        }\n      });\n\n    return () => {\n      isMounted = false;\n      if (mapbox) {\n        mountedMapsContext?.onMapUnmount(props.id);\n        if (props.reuseMaps) {\n          mapbox.recycle();\n        } else {\n          mapbox.destroy();\n        }\n      }\n    };\n  }, []);\n\n  useIsomorphicLayoutEffect(() => {\n    if (mapInstance) {\n      mapInstance.setProps(props);\n    }\n  });\n\n  useImperativeHandle(ref, () => contextValue.map, [mapInstance]);\n\n  const style: CSSProperties = useMemo(\n    () => ({\n      position: 'relative',\n      width: '100%',\n      height: '100%',\n      ...props.style\n    }),\n    [props.style]\n  );\n\n  const CHILD_CONTAINER_STYLE = {\n    height: '100%'\n  };\n\n  return (\n    <div id={props.id} ref={containerRef} style={style}>\n      {mapInstance && (\n        <MapContext.Provider value={contextValue}>\n          <div mapboxgl-children=\"\" style={CHILD_CONTAINER_STYLE}>\n            {props.children}\n          </div>\n        </MapContext.Provider>\n      )}\n    </div>\n  );\n}\n","import * as React from 'react';\n// This is a simplified version of\n// https://github.com/facebook/react/blob/4131af3e4bf52f3a003537ec95a1655147c81270/src/renderers/dom/shared/CSSPropertyOperations.js#L62\nconst unitlessNumber = /box|flex|grid|column|lineHeight|fontWeight|opacity|order|tabSize|zIndex/;\n\nexport function applyReactStyle(element: HTMLElement, styles: React.CSSProperties) {\n  if (!element || !styles) {\n    return;\n  }\n  const style = element.style;\n\n  for (const key in styles) {\n    const value = styles[key];\n    if (Number.isFinite(value) && !unitlessNumber.test(key)) {\n      style[key] = `${value}px`;\n    } else {\n      style[key] = value;\n    }\n  }\n}\n","/* global document */\nimport * as React from 'react';\nimport {createPortal} from 'react-dom';\nimport {useImperativeHandle, useEffect, useMemo, useRef, useContext, forwardRef, memo} from 'react';\nimport {applyReactStyle} from '../utils/apply-react-style';\n\nimport type {MarkerEvent, MarkerDragEvent, PointLike, MarkerInstance} from '../types';\n\nimport {MapContext} from './map';\nimport {arePointsEqual} from '../utils/deep-equal';\n\nexport type MarkerProps<OptionsT, MarkerT extends MarkerInstance> = OptionsT & {\n  /** Longitude of the anchor location */\n  longitude: number;\n  /** Latitude of the anchor location */\n  latitude: number;\n\n  // These types will be further constraint by OptionsT\n  draggable?: boolean;\n  offset?: PointLike;\n  pitchAlignment?: string;\n  rotation?: number;\n  rotationAlignment?: string;\n  popup?: any;\n\n  /** CSS style override, applied to the control's container */\n  style?: React.CSSProperties;\n  onClick?: (e: MarkerEvent<MarkerT, MouseEvent>) => void;\n  onDragStart?: (e: MarkerDragEvent<MarkerT>) => void;\n  onDrag?: (e: MarkerDragEvent<MarkerT>) => void;\n  onDragEnd?: (e: MarkerDragEvent<MarkerT>) => void;\n  children?: React.ReactNode;\n};\n\n/* eslint-disable complexity,max-statements */\nfunction Marker<MarkerOptions, MarkerT extends MarkerInstance>(\n  props: MarkerProps<MarkerOptions, MarkerT>,\n  ref: React.Ref<MarkerT>\n) {\n  const {map, mapLib} = useContext(MapContext);\n  const thisRef = useRef({props});\n  thisRef.current.props = props;\n\n  const marker: MarkerT = useMemo(() => {\n    let hasChildren = false;\n    React.Children.forEach(props.children, el => {\n      if (el) {\n        hasChildren = true;\n      }\n    });\n    const options = {\n      ...props,\n      element: hasChildren ? document.createElement('div') : null\n    };\n\n    const mk = new mapLib.Marker(options) as MarkerT;\n    mk.setLngLat([props.longitude, props.latitude]);\n\n    mk.getElement().addEventListener('click', (e: MouseEvent) => {\n      thisRef.current.props.onClick?.({\n        type: 'click',\n        target: mk,\n        originalEvent: e\n      });\n    });\n\n    mk.on('dragstart', e => {\n      const evt = e as MarkerDragEvent<MarkerT>;\n      evt.lngLat = marker.getLngLat();\n      thisRef.current.props.onDragStart?.(evt);\n    });\n    mk.on('drag', e => {\n      const evt = e as MarkerDragEvent<MarkerT>;\n      evt.lngLat = marker.getLngLat();\n      thisRef.current.props.onDrag?.(evt);\n    });\n    mk.on('dragend', e => {\n      const evt = e as MarkerDragEvent<MarkerT>;\n      evt.lngLat = marker.getLngLat();\n      thisRef.current.props.onDragEnd?.(evt);\n    });\n\n    return mk;\n  }, []);\n\n  useEffect(() => {\n    marker.addTo(map.getMap());\n\n    return () => {\n      marker.remove();\n    };\n  }, []);\n\n  const {\n    longitude,\n    latitude,\n    offset,\n    style,\n    draggable = false,\n    popup = null,\n    rotation = 0,\n    rotationAlignment = 'auto',\n    pitchAlignment = 'auto'\n  } = props;\n\n  useEffect(() => {\n    applyReactStyle(marker.getElement(), style);\n  }, [style]);\n\n  useImperativeHandle(ref, () => marker, []);\n\n  if (marker.getLngLat().lng !== longitude || marker.getLngLat().lat !== latitude) {\n    marker.setLngLat([longitude, latitude]);\n  }\n  if (offset && !arePointsEqual(marker.getOffset(), offset)) {\n    marker.setOffset(offset);\n  }\n  if (marker.isDraggable() !== draggable) {\n    marker.setDraggable(draggable);\n  }\n  if (marker.getRotation() !== rotation) {\n    marker.setRotation(rotation);\n  }\n  if (marker.getRotationAlignment() !== rotationAlignment) {\n    marker.setRotationAlignment(rotationAlignment);\n  }\n  if (marker.getPitchAlignment() !== pitchAlignment) {\n    marker.setPitchAlignment(pitchAlignment);\n  }\n  if (marker.getPopup() !== popup) {\n    marker.setPopup(popup);\n  }\n\n  return createPortal(props.children, marker.getElement());\n}\n\nexport default memo(forwardRef(Marker));\n","/* global document */\nimport * as React from 'react';\nimport {createPortal} from 'react-dom';\nimport {useImperativeHandle, useEffect, useMemo, useRef, useContext, forwardRef, memo} from 'react';\nimport {applyReactStyle} from '../utils/apply-react-style';\n\nimport type {PopupEvent, PopupInstance} from '../types';\n\nimport {MapContext} from './map';\nimport {deepEqual} from '../utils/deep-equal';\n\nexport type PopupProps<OptionsT, PopupT extends PopupInstance> = OptionsT & {\n  /** Longitude of the anchor location */\n  longitude: number;\n  /** Latitude of the anchor location */\n  latitude: number;\n\n  // These types will be further constraint by OptionsT\n  anchor?: string;\n  offset?: any;\n  className?: string;\n  maxWidth?: string;\n\n  /** CSS style override, applied to the control's container */\n  style?: React.CSSProperties;\n\n  onOpen?: (e: PopupEvent<PopupT>) => void;\n  onClose?: (e: PopupEvent<PopupT>) => void;\n  children?: React.ReactNode;\n};\n\n// Adapted from https://github.com/mapbox/mapbox-gl-js/blob/v1.13.0/src/ui/popup.js\nfunction getClassList(className: string) {\n  return new Set(className ? className.trim().split(/\\s+/) : []);\n}\n\n/* eslint-disable complexity,max-statements */\nfunction Popup<PopupOptions, PopupT extends PopupInstance>(\n  props: PopupProps<PopupOptions, PopupT>,\n  ref: React.Ref<PopupT>\n) {\n  const {map, mapLib} = useContext(MapContext);\n  const container = useMemo(() => {\n    return document.createElement('div');\n  }, []);\n  const thisRef = useRef({props});\n  thisRef.current.props = props;\n\n  const popup: PopupT = useMemo(() => {\n    const options = {...props};\n    const pp = new mapLib.Popup(options) as PopupT;\n    pp.setLngLat([props.longitude, props.latitude]);\n    pp.once('open', e => {\n      thisRef.current.props.onOpen?.(e as PopupEvent<PopupT>);\n    });\n    return pp;\n  }, []);\n\n  useEffect(() => {\n    const onClose = e => {\n      thisRef.current.props.onClose?.(e as PopupEvent<PopupT>);\n    };\n    popup.on('close', onClose);\n    popup.setDOMContent(container).addTo(map.getMap());\n\n    return () => {\n      // https://github.com/visgl/react-map-gl/issues/1825\n      // onClose should not be fired if the popup is removed by unmounting\n      // When using React strict mode, the component is mounted twice.\n      // Firing the onClose callback here would be a false signal to remove the component.\n      popup.off('close', onClose);\n      if (popup.isOpen()) {\n        popup.remove();\n      }\n    };\n  }, []);\n\n  useEffect(() => {\n    applyReactStyle(popup.getElement(), props.style);\n  }, [props.style]);\n\n  useImperativeHandle(ref, () => popup, []);\n\n  if (popup.isOpen()) {\n    if (popup.getLngLat().lng !== props.longitude || popup.getLngLat().lat !== props.latitude) {\n      popup.setLngLat([props.longitude, props.latitude]);\n    }\n    if (props.offset && !deepEqual(popup.options.offset, props.offset)) {\n      popup.setOffset(props.offset);\n    }\n    if (popup.options.anchor !== props.anchor || popup.options.maxWidth !== props.maxWidth) {\n      popup.options.anchor = props.anchor;\n      popup.setMaxWidth(props.maxWidth);\n    }\n    if (popup.options.className !== props.className) {\n      const prevClassList = getClassList(popup.options.className);\n      const nextClassList = getClassList(props.className);\n\n      for (const c of prevClassList) {\n        if (!nextClassList.has(c)) {\n          popup.removeClassName(c);\n        }\n      }\n      for (const c of nextClassList) {\n        if (!prevClassList.has(c)) {\n          popup.addClassName(c);\n        }\n      }\n      popup.options.className = props.className;\n    }\n  }\n\n  return createPortal(props.children, container);\n}\n\nexport default memo(forwardRef(Popup));\n","import {useContext, useMemo, useEffect} from 'react';\nimport type {IControl, ControlPosition} from '../types';\nimport {MapContext} from './map';\nimport type {MapContextValue} from './map';\n\ntype ControlOptions = {\n  position?: ControlPosition;\n};\n\nfunction useControl<T extends IControl>(\n  onCreate: (context: MapContextValue) => T,\n  opts?: ControlOptions\n): T;\n\nfunction useControl<T extends IControl>(\n  onCreate: (context: MapContextValue) => T,\n  onRemove: (context: MapContextValue) => void,\n  opts?: ControlOptions\n): T;\n\nfunction useControl<T extends IControl>(\n  onCreate: (context: MapContextValue) => T,\n  onAdd: (context: MapContextValue) => void,\n  onRemove: (context: MapContextValue) => void,\n  opts?: ControlOptions\n): T;\n\nfunction useControl<T extends IControl>(\n  onCreate: (context: MapContextValue) => T,\n  arg1?: ((context: MapContextValue) => void) | ControlOptions,\n  arg2?: ((context: MapContextValue) => void) | ControlOptions,\n  arg3?: ControlOptions\n): T {\n  const context = useContext(MapContext);\n  const ctrl = useMemo(() => onCreate(context), []);\n\n  useEffect(() => {\n    const opts = (arg3 || arg2 || arg1) as ControlOptions;\n    const onAdd = typeof arg1 === 'function' && typeof arg2 === 'function' ? arg1 : null;\n    const onRemove = typeof arg2 === 'function' ? arg2 : typeof arg1 === 'function' ? arg1 : null;\n\n    const {map} = context;\n    if (!map.hasControl(ctrl)) {\n      map.addControl(ctrl, opts?.position);\n      if (onAdd) {\n        onAdd(context);\n      }\n    }\n\n    return () => {\n      if (onRemove) {\n        onRemove(context);\n      }\n      // Map might have been removed (parent effects are destroyed before child ones)\n      if (map.hasControl(ctrl)) {\n        map.removeControl(ctrl);\n      }\n    };\n  }, []);\n\n  return ctrl;\n}\n\nexport default useControl;\n","import * as React from 'react';\nimport {useEffect, memo} from 'react';\nimport {applyReactStyle} from '../utils/apply-react-style';\nimport useControl from './use-control';\n\nimport type {ControlPosition, AttributionControlInstance} from '../types';\n\nexport type AttributionControlProps<OptionsT> = OptionsT & {\n  /** Placement of the control relative to the map. */\n  position?: ControlPosition;\n  /** CSS style override, applied to the control's container */\n  style?: React.CSSProperties;\n};\n\nfunction AttributionControl<AttributionControlOptions, ControlT extends AttributionControlInstance>(\n  props: AttributionControlProps<AttributionControlOptions>\n): null {\n  const ctrl = useControl<ControlT>(\n    ({mapLib}) => new mapLib.AttributionControl(props) as ControlT,\n    {\n      position: props.position\n    }\n  );\n\n  useEffect(() => {\n    applyReactStyle(ctrl._container, props.style);\n  }, [props.style]);\n\n  return null;\n}\n\nexport default memo(AttributionControl);\n","/* global document */\nimport * as React from 'react';\nimport {useEffect, memo} from 'react';\nimport {applyReactStyle} from '../utils/apply-react-style';\nimport useControl from './use-control';\n\nimport type {ControlPosition, FullscreenControlInstance} from '../types';\n\nexport type FullscreenControlProps<OptionsT> = Omit<OptionsT, 'container'> & {\n  /** Id of the DOM element which should be made full screen. By default, the map container\n   * element will be made full screen. */\n  containerId?: string;\n  /** Placement of the control relative to the map. */\n  position?: ControlPosition;\n  /** CSS style override, applied to the control's container */\n  style?: React.CSSProperties;\n};\n\nfunction FullscreenControl<FullscreenControlOptions, ControlT extends FullscreenControlInstance>(\n  props: FullscreenControlProps<FullscreenControlOptions>\n): null {\n  const ctrl = useControl<ControlT>(\n    ({mapLib}) =>\n      new mapLib.FullscreenControl({\n        container: props.containerId && document.getElementById(props.containerId)\n      }) as ControlT,\n    {position: props.position}\n  );\n\n  useEffect(() => {\n    applyReactStyle(ctrl._controlContainer, props.style);\n  }, [props.style]);\n\n  return null;\n}\n\nexport default memo(FullscreenControl);\n","import * as React from 'react';\nimport {useImperativeHandle, useRef, useEffect, forwardRef, memo} from 'react';\nimport {applyReactStyle} from '../utils/apply-react-style';\nimport useControl from './use-control';\n\nimport type {\n  ControlPosition,\n  GeolocateControlInstance,\n  GeolocateEvent,\n  GeolocateResultEvent,\n  GeolocateErrorEvent\n} from '../types';\n\nexport type GeolocateControlProps<\n  OptionsT,\n  ControlT extends GeolocateControlInstance\n> = OptionsT & {\n  /** Placement of the control relative to the map. */\n  position?: ControlPosition;\n  /** CSS style override, applied to the control's container */\n  style?: React.CSSProperties;\n\n  /** Called on each Geolocation API position update that returned as success. */\n  onGeolocate?: (e: GeolocateResultEvent<ControlT>) => void;\n  /** Called on each Geolocation API position update that returned as an error. */\n  onError?: (e: GeolocateErrorEvent<ControlT>) => void;\n  /** Called on each Geolocation API position update that returned as success but user position\n   * is out of map `maxBounds`. */\n  onOutOfMaxBounds?: (e: GeolocateResultEvent<ControlT>) => void;\n  /** Called when the GeolocateControl changes to the active lock state. */\n  onTrackUserLocationStart?: (e: GeolocateEvent<ControlT>) => void;\n  /** Called when the GeolocateControl changes to the background state. */\n  onTrackUserLocationEnd?: (e: GeolocateEvent<ControlT>) => void;\n};\n\nfunction GeolocateControl<GeolocateControlOptions, ControlT extends GeolocateControlInstance>(\n  props: GeolocateControlProps<GeolocateControlOptions, ControlT>,\n  ref: React.Ref<ControlT>\n) {\n  const thisRef = useRef({props});\n\n  const ctrl = useControl<ControlT>(\n    ({mapLib}) => {\n      const gc = new mapLib.GeolocateControl(props) as ControlT;\n\n      // Hack: fix GeolocateControl reuse\n      // When using React strict mode, the component is mounted twice.\n      // GeolocateControl's UI creation is asynchronous. Removing and adding it back causes the UI to be initialized twice.\n      // @ts-expect-error private method\n      const setupUI = gc._setupUI;\n      // @ts-expect-error private method\n      gc._setupUI = args => {\n        if (!gc._container.hasChildNodes()) {\n          setupUI(args);\n        }\n      };\n\n      gc.on('geolocate', e => {\n        thisRef.current.props.onGeolocate?.(e as GeolocateResultEvent<ControlT>);\n      });\n      gc.on('error', e => {\n        thisRef.current.props.onError?.(e as GeolocateErrorEvent<ControlT>);\n      });\n      gc.on('outofmaxbounds', e => {\n        thisRef.current.props.onOutOfMaxBounds?.(e as GeolocateResultEvent<ControlT>);\n      });\n      gc.on('trackuserlocationstart', e => {\n        thisRef.current.props.onTrackUserLocationStart?.(e as GeolocateEvent<ControlT>);\n      });\n      gc.on('trackuserlocationend', e => {\n        thisRef.current.props.onTrackUserLocationEnd?.(e as GeolocateEvent<ControlT>);\n      });\n\n      return gc;\n    },\n    {position: props.position}\n  );\n\n  thisRef.current.props = props;\n\n  useImperativeHandle(ref, () => ctrl, []);\n\n  useEffect(() => {\n    applyReactStyle(ctrl._container, props.style);\n  }, [props.style]);\n\n  return null;\n}\n\nexport default memo(forwardRef(GeolocateControl));\n","import * as React from 'react';\nimport {useEffect, memo} from 'react';\nimport {applyReactStyle} from '../utils/apply-react-style';\nimport useControl from './use-control';\n\nimport type {ControlPosition, NavigationControlInstance} from '../types';\n\nexport type NavigationControlProps<OptionsT> = OptionsT & {\n  /** Placement of the control relative to the map. */\n  position?: ControlPosition;\n  /** CSS style override, applied to the control's container */\n  style?: React.CSSProperties;\n};\n\nfunction NavigationControl<NavigationControlOptions, ControlT extends NavigationControlInstance>(\n  props: NavigationControlProps<NavigationControlOptions>\n): null {\n  const ctrl = useControl<ControlT>(({mapLib}) => new mapLib.NavigationControl(props) as ControlT, {\n    position: props.position\n  });\n\n  useEffect(() => {\n    applyReactStyle(ctrl._container, props.style);\n  }, [props.style]);\n\n  return null;\n}\n\nexport default memo(NavigationControl);\n","import * as React from 'react';\nimport {useEffect, useRef, memo} from 'react';\nimport {applyReactStyle} from '../utils/apply-react-style';\nimport useControl from './use-control';\n\nimport type {ControlPosition, ScaleControlInstance} from '../types';\n\nexport type ScaleControlProps<OptionsT> = OptionsT & {\n  // These props will be further constraint by OptionsT\n  unit?: string;\n  maxWidth?: number;\n\n  /** Placement of the control relative to the map. */\n  position?: ControlPosition;\n  /** CSS style override, applied to the control's container */\n  style?: React.CSSProperties;\n};\n\nfunction ScaleControl<ScaleControlOptions, ControlT extends ScaleControlInstance>(\n  props: ScaleControlProps<ScaleControlOptions>\n): null {\n  const ctrl = useControl<ControlT>(({mapLib}) => new mapLib.ScaleControl(props) as ControlT, {\n    position: props.position\n  });\n  const propsRef = useRef<ScaleControlProps<ScaleControlOptions>>(props);\n\n  const prevProps = propsRef.current;\n  propsRef.current = props;\n\n  const {style} = props;\n\n  if (props.maxWidth !== undefined && props.maxWidth !== prevProps.maxWidth) {\n    ctrl.options.maxWidth = props.maxWidth;\n  }\n  if (props.unit !== undefined && props.unit !== prevProps.unit) {\n    ctrl.setUnit(props.unit);\n  }\n\n  useEffect(() => {\n    applyReactStyle(ctrl._container, style);\n  }, [style]);\n\n  return null;\n}\n\nexport default memo(ScaleControl);\n","export default function assert(condition: any, message: string) {\n  if (!condition) {\n    throw new Error(message);\n  }\n}\n","import {useContext, useEffect, useMemo, useState, useRef} from 'react';\nimport {MapContext} from './map';\nimport assert from '../utils/assert';\nimport {deepEqual} from '../utils/deep-equal';\n\nimport type {MapInstance, CustomLayerInterface, ILayer} from '../types';\n\n// Omiting property from a union type, see\n// https://github.com/microsoft/TypeScript/issues/39556#issuecomment-656925230\ntype OptionalId<T> = T extends {id: string} ? Omit<T, 'id'> & {id?: string} : T;\ntype OptionalSource<T> = T extends {source: string} ? Omit<T, 'source'> & {source?: string} : T;\n\nexport type LayerProps<LayerT> = OptionalSource<OptionalId<LayerT>> & {\n  /** If set, the layer will be inserted before the specified layer */\n  beforeId?: string;\n};\n\n/* eslint-disable complexity, max-statements */\nfunction updateLayer<LayerT extends ILayer>(\n  map: MapInstance,\n  id: string,\n  props: LayerProps<LayerT>,\n  prevProps: LayerProps<LayerT>\n) {\n  assert(props.id === prevProps.id, 'layer id changed');\n  assert(props.type === prevProps.type, 'layer type changed');\n\n  if (props.type === 'custom' || prevProps.type === 'custom') {\n    return;\n  }\n\n  const {layout = {}, paint = {}, filter, minzoom, maxzoom, beforeId} = props;\n\n  if (beforeId !== prevProps.beforeId) {\n    map.moveLayer(id, beforeId);\n  }\n  if (layout !== prevProps.layout) {\n    const prevLayout = prevProps.layout || {};\n    for (const key in layout) {\n      if (!deepEqual(layout[key], prevLayout[key])) {\n        map.setLayoutProperty(id, key, layout[key]);\n      }\n    }\n    for (const key in prevLayout) {\n      if (!layout.hasOwnProperty(key)) {\n        map.setLayoutProperty(id, key, undefined);\n      }\n    }\n  }\n  if (paint !== prevProps.paint) {\n    const prevPaint = prevProps.paint || {};\n    for (const key in paint) {\n      if (!deepEqual(paint[key], prevPaint[key])) {\n        map.setPaintProperty(id, key, paint[key]);\n      }\n    }\n    for (const key in prevPaint) {\n      if (!paint.hasOwnProperty(key)) {\n        map.setPaintProperty(id, key, undefined);\n      }\n    }\n  }\n\n  if (!deepEqual(filter, prevProps.filter)) {\n    map.setFilter(id, filter);\n  }\n  if (minzoom !== prevProps.minzoom || maxzoom !== prevProps.maxzoom) {\n    map.setLayerZoomRange(id, minzoom, maxzoom);\n  }\n}\n\nfunction createLayer<LayerT extends ILayer>(\n  map: MapInstance,\n  id: string,\n  props: LayerProps<LayerT>\n) {\n  // @ts-ignore\n  if (map.style && map.style._loaded && (!('source' in props) || map.getSource(props.source))) {\n    const options: LayerProps<LayerT> = {...props, id};\n    delete options.beforeId;\n\n    // @ts-ignore\n    map.addLayer(options, props.beforeId);\n  }\n}\n\n/* eslint-enable complexity, max-statements */\n\nlet layerCounter = 0;\n\nfunction Layer<LayerT extends ILayer>(props: LayerProps<LayerT | CustomLayerInterface>) {\n  const map = useContext(MapContext).map.getMap();\n  const propsRef = useRef(props);\n  const [, setStyleLoaded] = useState(0);\n\n  const id = useMemo(() => props.id || `jsx-layer-${layerCounter++}`, []);\n\n  useEffect(() => {\n    if (map) {\n      const forceUpdate = () => setStyleLoaded(version => version + 1);\n      map.on('styledata', forceUpdate);\n      forceUpdate();\n\n      return () => {\n        map.off('styledata', forceUpdate);\n        // @ts-ignore\n        if (map.style && map.style._loaded && map.getLayer(id)) {\n          map.removeLayer(id);\n        }\n      };\n    }\n    return undefined;\n  }, [map]);\n\n  // @ts-ignore\n  const layer = map && map.style && map.getLayer(id);\n  if (layer) {\n    try {\n      updateLayer(map, id, props, propsRef.current);\n    } catch (error) {\n      console.warn(error); // eslint-disable-line\n    }\n  } else {\n    createLayer(map, id, props);\n  }\n\n  // Store last rendered props\n  propsRef.current = props;\n\n  return null;\n}\n\nexport default Layer;\n","import * as React from 'react';\nimport {useContext, useEffect, useMemo, useState, useRef} from 'react';\nimport {cloneElement} from 'react';\nimport {MapContext} from './map';\nimport assert from '../utils/assert';\nimport {deepEqual} from '../utils/deep-equal';\n\nimport type {\n  MapInstance,\n  ISource,\n  CustomSource,\n  GeoJSONSourceImplementation,\n  ImageSourceImplemtation,\n  AnySourceImplementation\n} from '../types';\nimport type {GeoJSONSourceRaw, ImageSourceRaw, VectorSourceRaw} from '../types/style-spec-maplibre';\n\nexport type SourceProps<SourceT> = (SourceT | CustomSource) & {\n  id?: string;\n  children?: any;\n};\n\nlet sourceCounter = 0;\n\nfunction createSource<SourceT extends ISource>(\n  map: MapInstance,\n  id: string,\n  props: SourceProps<SourceT>\n) {\n  // @ts-ignore\n  if (map.style && map.style._loaded) {\n    const options = {...props};\n    delete options.id;\n    delete options.children;\n    // @ts-ignore\n    map.addSource(id, options);\n    return map.getSource(id);\n  }\n  return null;\n}\n\n/* eslint-disable complexity */\nfunction updateSource<SourceT extends ISource>(\n  source: AnySourceImplementation,\n  props: SourceProps<SourceT>,\n  prevProps: SourceProps<SourceT>\n) {\n  assert(props.id === prevProps.id, 'source id changed');\n  assert(props.type === prevProps.type, 'source type changed');\n\n  let changedKey = '';\n  let changedKeyCount = 0;\n\n  for (const key in props) {\n    if (key !== 'children' && key !== 'id' && !deepEqual(prevProps[key], props[key])) {\n      changedKey = key;\n      changedKeyCount++;\n    }\n  }\n\n  if (!changedKeyCount) {\n    return;\n  }\n\n  const type = props.type;\n\n  if (type === 'geojson') {\n    (source as GeoJSONSourceImplementation).setData(\n      (props as unknown as GeoJSONSourceRaw).data as any\n    );\n  } else if (type === 'image') {\n    (source as ImageSourceImplemtation).updateImage({\n      url: (props as unknown as ImageSourceRaw).url,\n      coordinates: (props as unknown as ImageSourceRaw).coordinates\n    });\n  } else if ('setCoordinates' in source && changedKeyCount === 1 && changedKey === 'coordinates') {\n    source.setCoordinates((props as ImageSourceRaw).coordinates);\n  } else if ('setUrl' in source) {\n    // Added in 1.12.0:\n    // vectorTileSource.setTiles\n    // vectorTileSource.setUrl\n    switch (changedKey) {\n      case 'url':\n        source.setUrl((props as VectorSourceRaw).url);\n        break;\n      case 'tiles':\n        source.setTiles((props as VectorSourceRaw).tiles);\n        break;\n      default:\n    }\n  } else {\n    // eslint-disable-next-line\n    console.warn(`Unable to update <Source> prop: ${changedKey}`);\n  }\n}\n/* eslint-enable complexity */\n\nfunction Source<SourceT extends ISource>(props: SourceProps<SourceT>) {\n  const map = useContext(MapContext).map.getMap();\n  const propsRef = useRef(props);\n  const [, setStyleLoaded] = useState(0);\n\n  const id = useMemo(() => props.id || `jsx-source-${sourceCounter++}`, []);\n\n  useEffect(() => {\n    if (map) {\n      /* global setTimeout */\n      const forceUpdate = () => setTimeout(() => setStyleLoaded(version => version + 1), 0);\n      map.on('styledata', forceUpdate);\n      forceUpdate();\n\n      return () => {\n        map.off('styledata', forceUpdate);\n        // @ts-ignore\n        if (map.style && map.style._loaded && map.getSource(id)) {\n          // Parent effects are destroyed before child ones, see\n          // https://github.com/facebook/react/issues/16728\n          // Source can only be removed after all child layers are removed\n          const allLayers = map.getStyle()?.layers;\n          if (allLayers) {\n            for (const layer of allLayers) {\n              // @ts-ignore (2339) source does not exist on all layer types\n              if (layer.source === id) {\n                map.removeLayer(layer.id);\n              }\n            }\n          }\n          map.removeSource(id);\n        }\n      };\n    }\n    return undefined;\n  }, [map]);\n\n  // @ts-ignore\n  let source = map && map.style && map.getSource(id);\n  if (source) {\n    updateSource(source, props, propsRef.current);\n  } else {\n    source = createSource(map, id, props);\n  }\n  propsRef.current = props;\n\n  return (\n    (source &&\n      React.Children.map(\n        props.children,\n        child =>\n          child &&\n          cloneElement(child, {\n            source: id\n          })\n      )) ||\n    null\n  );\n}\n\nexport default Source;\n","import * as React from 'react';\nimport type {\n  Map as MapboxMap,\n  MapboxOptions,\n  Marker as MapboxMarker,\n  MarkerOptions,\n  Popup as MapboxPopup,\n  PopupOptions,\n  AttributionControl as MapboxAttributionControl,\n  FullscreenControl as MapboxFullscreenControl,\n  GeolocateControl as MapboxGeolocateControl,\n  NavigationControl as MapboxNavigationControl,\n  ScaleControl as MapboxScaleControl\n} from 'mapbox-gl';\nimport {MapStyle, AnyLayer, AnySource} from './types/style-spec-mapbox';\n\nimport {default as _Map, MapProps as _MapProps} from './components/map';\nimport {default as _Marker, MarkerProps as _MarkerProps} from './components/marker';\nimport {default as _Popup, PopupProps as _PopupProps} from './components/popup';\nimport {\n  default as _AttributionControl,\n  AttributionControlProps as _AttributionControlProps\n} from './components/attribution-control';\nimport {\n  default as _FullscreenControl,\n  FullscreenControlProps as _FullscreenControlProps\n} from './components/fullscreen-control';\nimport {\n  default as _GeolocateControl,\n  GeolocateControlProps as _GeolocateControlProps\n} from './components/geolocate-control';\nimport {\n  default as _NavigationControl,\n  NavigationControlProps as _NavigationControlProps\n} from './components/navigation-control';\nimport {\n  default as _ScaleControl,\n  ScaleControlProps as _ScaleControlProps\n} from './components/scale-control';\nimport {default as _Layer, LayerProps as _LayerProps} from './components/layer';\nimport {default as _Source, SourceProps as _SourceProps} from './components/source';\nimport {useMap as _useMap} from './components/use-map';\nimport type {MapRef as _MapRef} from './mapbox/create-ref';\nimport type * as events from './types/events';\nimport type {MapCallbacks} from './types/events-mapbox';\n\nexport function useMap() {\n  return _useMap<MapboxMap>();\n}\n\nexport type MapProps = _MapProps<MapboxOptions, MapStyle, MapCallbacks, MapboxMap>;\nexport type MapRef = _MapRef<MapboxMap>;\nconst mapLib = import('mapbox-gl');\nexport const Map = (() => {\n  return React.forwardRef(function Map(props: MapProps, ref: React.Ref<MapRef>) {\n    return _Map<MapboxOptions, MapStyle, MapCallbacks, MapboxMap>(props, ref, mapLib);\n  });\n})();\n\nexport type MarkerProps = _MarkerProps<MarkerOptions, MapboxMarker>;\nexport const Marker = _Marker as (\n  props: MarkerProps & React.RefAttributes<MapboxMarker>\n) => React.ReactElement | null;\n\nexport type PopupProps = _PopupProps<PopupOptions, MapboxPopup>;\nexport const Popup = _Popup as (\n  props: PopupProps & React.RefAttributes<MapboxPopup>\n) => React.ReactElement | null;\n\ntype AttributionControlOptions = ConstructorParameters<typeof MapboxAttributionControl>[0];\nexport type AttributionControlProps = _AttributionControlProps<AttributionControlOptions>;\nexport const AttributionControl = _AttributionControl as (\n  props: AttributionControlProps\n) => React.ReactElement | null;\n\ntype FullscreenControlOptions = ConstructorParameters<typeof MapboxFullscreenControl>[0];\nexport type FullscreenControlProps = _FullscreenControlProps<FullscreenControlOptions>;\nexport const FullscreenControl = _FullscreenControl as (\n  props: FullscreenControlProps\n) => React.ReactElement | null;\n\ntype NavigationControlOptions = ConstructorParameters<typeof MapboxNavigationControl>[0];\nexport type NavigationControlProps = _NavigationControlProps<NavigationControlOptions>;\nexport const NavigationControl = _NavigationControl as (\n  props: NavigationControlProps\n) => React.ReactElement | null;\n\ntype GeolocateControlOptions = ConstructorParameters<typeof MapboxGeolocateControl>[0];\nexport type GeolocateControlProps = _GeolocateControlProps<\n  GeolocateControlOptions,\n  MapboxGeolocateControl\n>;\nexport const GeolocateControl = _GeolocateControl as (\n  props: GeolocateControlProps & React.RefAttributes<MapboxGeolocateControl>\n) => React.ReactElement | null;\n\ntype ScaleControlOptions = ConstructorParameters<typeof MapboxScaleControl>[0];\nexport type ScaleControlProps = _ScaleControlProps<ScaleControlOptions>;\nexport const ScaleControl = _ScaleControl as (\n  props: ScaleControlProps\n) => React.ReactElement | null;\n\nexport type LayerProps = _LayerProps<AnyLayer>;\nexport const Layer = _Layer as (props: LayerProps) => React.ReactElement | null;\n\nexport type SourceProps = _SourceProps<AnySource>;\nexport const Source = _Source as (props: SourceProps) => React.ReactElement | null;\n\nexport {default as useControl} from './components/use-control';\nexport {MapProvider} from './components/use-map';\n\nexport default Map;\n\n// Types\nexport * from './types/public';\nexport type {\n  Point,\n  PointLike,\n  LngLat,\n  LngLatLike,\n  LngLatBounds,\n  LngLatBoundsLike,\n  PaddingOptions,\n  MapboxGeoJSONFeature as MapGeoJSONFeature,\n  GeoJSONSource,\n  VideoSource,\n  ImageSource,\n  CanvasSource,\n  VectorSourceImpl as VectorTileSource\n} from 'mapbox-gl';\nexport * from './types/style-spec-mapbox';\n\n// Events\nexport type {\n  MapEvent,\n  MapMouseEvent,\n  MapLayerMouseEvent,\n  MapTouchEvent,\n  MapLayerTouchEvent,\n  MapStyleDataEvent,\n  MapSourceDataEvent,\n  MapWheelEvent,\n  MapBoxZoomEvent,\n  ErrorEvent,\n  ViewStateChangeEvent\n} from './types/events-mapbox';\nexport type PopupEvent = events.PopupEvent<MapboxPopup>;\nexport type MarkerEvent = events.MarkerEvent<MapboxMarker>;\nexport type MarkerDragEvent = events.MarkerDragEvent<MapboxMarker>;\nexport type GeolocateEvent = events.GeolocateEvent<MapboxGeolocateControl>;\nexport type GeolocateResultEvent = events.GeolocateResultEvent<MapboxGeolocateControl>;\nexport type GeolocateErrorEvent = events.GeolocateErrorEvent<MapboxGeolocateControl>;\n\n// v7.0 backward compatibility\n\n/** @deprecated use `MapStyle` */\nexport type MapboxStyle = MapStyle;\n\nexport type {Map as MapboxMap, MapboxEvent, MapboxGeoJSONFeature} from 'mapbox-gl';\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f);else for(t in e)e[t]&&(n&&(n+=\" \"),n+=t);return n}export function clsx(){for(var e,t,f=0,n=\"\";f<arguments.length;)(e=arguments[f++])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","let e={data:\"\"},t=t=>\"object\"==typeof window?((t?t.querySelector(\"#_goober\"):window._goober)||Object.assign((t||document.head).appendChild(document.createElement(\"style\")),{innerHTML:\" \",id:\"_goober\"})).firstChild:t||e,r=e=>{let r=t(e),l=r.data;return r.data=\"\",l},l=/(?:([\\u0080-\\uFFFF\\w-%@]+) *:? *([^{;]+?);|([^;}{]*?) *{)|(}\\s*)/g,a=/\\/\\*[^]*?\\*\\/|  +/g,n=/\\n+/g,o=(e,t)=>{let r=\"\",l=\"\",a=\"\";for(let n in e){let c=e[n];\"@\"==n[0]?\"i\"==n[1]?r=n+\" \"+c+\";\":l+=\"f\"==n[1]?o(c,n):n+\"{\"+o(c,\"k\"==n[1]?\"\":t)+\"}\":\"object\"==typeof c?l+=o(c,t?t.replace(/([^,])+/g,e=>n.replace(/(^:.*)|([^,])+/g,t=>/&/.test(t)?t.replace(/&/g,e):e?e+\" \"+t:t)):n):null!=c&&(n=/^--/.test(n)?n:n.replace(/[A-Z]/g,\"-$&\").toLowerCase(),a+=o.p?o.p(n,c):n+\":\"+c+\";\")}return r+(t&&a?t+\"{\"+a+\"}\":a)+l},c={},s=e=>{if(\"object\"==typeof e){let t=\"\";for(let r in e)t+=r+s(e[r]);return t}return e},i=(e,t,r,i,p)=>{let u=s(e),d=c[u]||(c[u]=(e=>{let t=0,r=11;for(;t<e.length;)r=101*r+e.charCodeAt(t++)>>>0;return\"go\"+r})(u));if(!c[d]){let t=u!==e?e:(e=>{let t,r,o=[{}];for(;t=l.exec(e.replace(a,\"\"));)t[4]?o.shift():t[3]?(r=t[3].replace(n,\" \").trim(),o.unshift(o[0][r]=o[0][r]||{})):o[0][t[1]]=t[2].replace(n,\" \").trim();return o[0]})(e);c[d]=o(p?{[\"@keyframes \"+d]:t}:t,r?\"\":\".\"+d)}let f=r&&c.g?c.g:null;return r&&(c.g=c[d]),((e,t,r,l)=>{l?t.data=t.data.replace(l,e):-1===t.data.indexOf(e)&&(t.data=r?e+t.data:t.data+e)})(c[d],t,i,f),d},p=(e,t,r)=>e.reduce((e,l,a)=>{let n=t[a];if(n&&n.call){let e=n(r),t=e&&e.props&&e.props.className||/^go/.test(e)&&e;n=t?\".\"+t:e&&\"object\"==typeof e?e.props?\"\":o(e,\"\"):!1===e?\"\":e}return e+l+(null==n?\"\":n)},\"\");function u(e){let r=this||{},l=e.call?e(r.p):e;return i(l.unshift?l.raw?p(l,[].slice.call(arguments,1),r.p):l.reduce((e,t)=>Object.assign(e,t&&t.call?t(r.p):t),{}):l,t(r.target),r.g,r.o,r.k)}let d,f,g,b=u.bind({g:1}),h=u.bind({k:1});function m(e,t,r,l){o.p=t,d=e,f=r,g=l}function j(e,t){let r=this||{};return function(){let l=arguments;function a(n,o){let c=Object.assign({},n),s=c.className||a.className;r.p=Object.assign({theme:f&&f()},c),r.o=/ *go\\d+/.test(s),c.className=u.apply(r,l)+(s?\" \"+s:\"\"),t&&(c.ref=o);let i=e;return e[0]&&(i=c.as||e,delete c.as),g&&i[0]&&g(c),d(i,c)}return t?t(a):a}}export{u as css,r as extractCss,b as glob,h as keyframes,m as setup,j as styled};\n","import React from 'react';\nimport { ProviderContext } from './types';\n\nconst noOp = () => {\n    return '';\n};\n\nexport default React.createContext<ProviderContext>({\n    enqueueSnackbar: noOp,\n    closeSnackbar: noOp,\n});\n","import { InternalSnack } from '../types';\n\nexport const breakpoints = {\n    downXs: '@media (max-width:599.95px)',\n    upSm: '@media (min-width:600px)',\n};\n\nconst capitalise = (text: string): string => text.charAt(0).toUpperCase() + text.slice(1);\n\nexport const originKeyExtractor = (anchor: InternalSnack['anchorOrigin']): string =>\n    `${capitalise(anchor.vertical)}${capitalise(anchor.horizontal)}`;\n\nexport const isDefined = (value: string | null | undefined | number): boolean => !!value || value === 0;\n","/**\n * BSD 3-Clause License\n *\n * Copyright (c) 2018, React Community\n * Forked from React (https://github.com/facebook/react) Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n *\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n *\n * * Neither the name of the copyright holder nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport React from 'react';\nimport { TransitionComponentProps, TransitionStatus } from '../../types';\n\nconst UNMOUNTED = 'unmounted';\nconst EXITED = 'exited';\nconst ENTERING = 'entering';\nconst ENTERED = 'entered';\nconst EXITING = 'exiting';\n\ninterface State {\n    status: TransitionStatus;\n}\n\ninterface NextCallback {\n    (): void;\n    cancel?: () => void;\n}\n\nclass Transition extends React.Component<TransitionComponentProps, State> {\n    appearStatus: TransitionStatus | null;\n\n    nextCallback: NextCallback | null;\n\n    constructor(props: TransitionComponentProps) {\n        super(props);\n\n        const { appear } = props;\n\n        let initialStatus: TransitionStatus;\n\n        this.appearStatus = null;\n\n        if (props.in) {\n            if (appear) {\n                initialStatus = EXITED;\n                this.appearStatus = ENTERING;\n            } else {\n                initialStatus = ENTERED;\n            }\n        } else if (props.unmountOnExit || props.mountOnEnter) {\n            initialStatus = UNMOUNTED;\n        } else {\n            initialStatus = EXITED;\n        }\n\n        this.state = { status: initialStatus };\n\n        this.nextCallback = null;\n    }\n\n    static getDerivedStateFromProps({ in: nextIn }: TransitionComponentProps, prevState: State) {\n        if (nextIn && prevState.status === UNMOUNTED) {\n            return { status: EXITED };\n        }\n        return null;\n    }\n\n    componentDidMount() {\n        this.updateStatus(true, this.appearStatus);\n    }\n\n    componentDidUpdate(prevProps: TransitionComponentProps) {\n        let nextStatus: TransitionStatus | null = null;\n        if (prevProps !== this.props) {\n            const { status } = this.state;\n\n            if (this.props.in) {\n                if (status !== ENTERING && status !== ENTERED) {\n                    nextStatus = ENTERING;\n                }\n            } else if (status === ENTERING || status === ENTERED) {\n                nextStatus = EXITING;\n            }\n        }\n        this.updateStatus(false, nextStatus);\n    }\n\n    componentWillUnmount() {\n        this.cancelNextCallback();\n    }\n\n    getTimeouts(): { exit: number; enter: number } {\n        const { timeout } = this.props;\n        let enter = timeout;\n        let exit = timeout;\n\n        if (timeout != null && typeof timeout !== 'number' && typeof timeout !== 'string') {\n            exit = timeout.exit;\n            enter = timeout.enter;\n        }\n        return {\n            exit: exit as number,\n            enter: enter as number,\n        };\n    }\n\n    updateStatus(mounting = false, nextStatus: TransitionStatus | null) {\n        if (nextStatus !== null) {\n            this.cancelNextCallback();\n\n            if (nextStatus === ENTERING) {\n                this.performEnter(mounting);\n            } else {\n                this.performExit();\n            }\n        } else if (this.props.unmountOnExit && this.state.status === EXITED) {\n            this.setState({ status: UNMOUNTED });\n        }\n    }\n\n    get node() {\n        const node = this.props.nodeRef?.current;\n        if (!node) {\n            throw new Error('notistack - Custom snackbar is not refForwarding');\n        }\n        return node;\n    }\n\n    performEnter(mounting: boolean) {\n        const { enter } = this.props;\n        const isAppearing = mounting;\n\n        const timeouts = this.getTimeouts();\n\n        if (!mounting && !enter) {\n            this.safeSetState({ status: ENTERED }, () => {\n                if (this.props.onEntered) {\n                    this.props.onEntered(this.node, isAppearing);\n                }\n            });\n            return;\n        }\n\n        if (this.props.onEnter) {\n            this.props.onEnter(this.node, isAppearing);\n        }\n\n        this.safeSetState({ status: ENTERING }, () => {\n            if (this.props.onEntering) {\n                this.props.onEntering(this.node, isAppearing);\n            }\n\n            this.onTransitionEnd(timeouts.enter, () => {\n                this.safeSetState({ status: ENTERED }, () => {\n                    if (this.props.onEntered) {\n                        this.props.onEntered(this.node, isAppearing);\n                    }\n                });\n            });\n        });\n    }\n\n    performExit() {\n        const { exit } = this.props;\n        const timeouts = this.getTimeouts();\n\n        // no exit animation skip right to EXITED\n        if (!exit) {\n            this.safeSetState({ status: EXITED }, () => {\n                if (this.props.onExited) {\n                    this.props.onExited(this.node);\n                }\n            });\n            return;\n        }\n\n        if (this.props.onExit) {\n            this.props.onExit(this.node);\n        }\n\n        this.safeSetState({ status: EXITING }, () => {\n            if (this.props.onExiting) {\n                this.props.onExiting(this.node);\n            }\n\n            this.onTransitionEnd(timeouts.exit, () => {\n                this.safeSetState({ status: EXITED }, () => {\n                    if (this.props.onExited) {\n                        this.props.onExited(this.node);\n                    }\n                });\n            });\n        });\n    }\n\n    cancelNextCallback() {\n        if (this.nextCallback !== null && this.nextCallback.cancel) {\n            this.nextCallback.cancel();\n            this.nextCallback = null;\n        }\n    }\n\n    safeSetState(nextState: State, callback: () => void) {\n        callback = this.setNextCallback(callback);\n        this.setState(nextState, callback);\n    }\n\n    setNextCallback(callback: () => void) {\n        let active = true;\n\n        this.nextCallback = () => {\n            if (active) {\n                active = false;\n                this.nextCallback = null;\n\n                callback();\n            }\n        };\n\n        (this.nextCallback as NextCallback).cancel = () => {\n            active = false;\n        };\n\n        return this.nextCallback;\n    }\n\n    onTransitionEnd(timeout: number, handler: () => void) {\n        this.setNextCallback(handler);\n        const doesNotHaveTimeoutOrListener = timeout == null && !this.props.addEndListener;\n        if (!this.node || doesNotHaveTimeoutOrListener) {\n            setTimeout(this.nextCallback as NextCallback, 0);\n            return;\n        }\n\n        if (this.props.addEndListener) {\n            this.props.addEndListener(this.node, this.nextCallback as NextCallback);\n        }\n\n        if (timeout != null) {\n            setTimeout(this.nextCallback as NextCallback, timeout);\n        }\n    }\n\n    render() {\n        const { status } = this.state;\n\n        if (status === UNMOUNTED) {\n            return null;\n        }\n\n        const {\n            children,\n            // filter props for `Transition`\n            in: _in,\n            mountOnEnter: _mountOnEnter,\n            unmountOnExit: _unmountOnExit,\n            appear: _appear,\n            enter: _enter,\n            exit: _exit,\n            timeout: _timeout,\n            addEndListener: _addEndListener,\n            onEnter: _onEnter,\n            onEntering: _onEntering,\n            onEntered: _onEntered,\n            onExit: _onExit,\n            onExiting: _onExiting,\n            onExited: _onExited,\n            nodeRef: _nodeRef,\n            ...childProps\n        } = this.props;\n\n        return children(status, childProps);\n    }\n}\n\nfunction noop() {\n    //\n}\n\n(Transition as any).defaultProps = {\n    in: false,\n    mountOnEnter: false,\n    unmountOnExit: false,\n    appear: false,\n    enter: true,\n    exit: true,\n\n    onEnter: noop,\n    onEntering: noop,\n    onEntered: noop,\n\n    onExit: noop,\n    onExiting: noop,\n    onExited: noop,\n};\n\nexport default Transition;\n","/**\n * Credit to MUI team @ https://mui.com\n */\nimport * as React from 'react';\n\n/**\n * passes {value} to {ref}\n *\n * Useful if you want to expose the ref of an inner component to the public API\n * while still using it inside the component.\n * @param ref A ref callback or ref object. If anything falsy, this is a no-op.\n */\nfunction setRef<T>(\n    ref: React.MutableRefObject<T | null> | ((instance: T | null) => void) | null | undefined,\n    value: T | null\n): void {\n    if (typeof ref === 'function') {\n        ref(value);\n    } else if (ref) {\n        ref.current = value;\n    }\n}\n\nexport default function useForkRef<Instance>(\n    refA: React.Ref<Instance> | null | undefined,\n    refB: React.Ref<Instance> | null | undefined\n): React.Ref<Instance> | null {\n    /**\n     * This will create a new function if the ref props change and are defined.\n     * This means react will call the old forkRef with `null` and the new forkRef\n     * with the ref. Cleanup naturally emerges from this behavior.\n     */\n    return React.useMemo(() => {\n        if (refA == null && refB == null) {\n            return null;\n        }\n        return (refValue) => {\n            setRef(refA, refValue);\n            setRef(refB, refValue);\n        };\n    }, [refA, refB]);\n}\n","import { TransitionDuration } from '../types';\n\ninterface ComponentProps {\n    style?: React.CSSProperties | undefined;\n    /**\n     * number: 400\n     * TransitionDuration: { enter: 200, exit: 400 }\n     */\n    timeout: number | TransitionDuration;\n    mode: 'enter' | 'exit';\n}\n\ninterface TransitionPropsReturnType {\n    duration: number;\n    easing: string | undefined;\n    delay: string | undefined;\n}\n\nexport default function getTransitionProps(props: ComponentProps): TransitionPropsReturnType {\n    const { timeout, style = {}, mode } = props;\n    return {\n        duration: typeof timeout === 'object' ? timeout[mode] || 0 : timeout,\n        easing: style.transitionTimingFunction,\n        delay: style.transitionDelay,\n    };\n}\n","/**\n * Credit to MUI team @ https://mui.com\n */\nexport const defaultEasing = {\n    // This is the most common easing curve.\n    easeInOut: 'cubic-bezier(0.4, 0, 0.2, 1)',\n    // Objects enter the screen at full velocity from off-screen and\n    // slowly decelerate to a resting point.\n    easeOut: 'cubic-bezier(0.0, 0, 0.2, 1)',\n    // Objects leave the screen at full velocity. They do not decelerate when off-screen.\n    easeIn: 'cubic-bezier(0.4, 0, 1, 1)',\n    // The sharp curve is used by objects that may return to the screen at any time.\n    sharp: 'cubic-bezier(0.4, 0, 0.6, 1)',\n};\n\n/**\n * CSS hack to force a repaint\n */\nexport const reflow = (node: Element): void => {\n    // We have to do something with node.scrollTop.\n    // Otherwise it's removed from the compiled code by optimisers\n    // eslint-disable-next-line no-self-assign\n    node.scrollTop = node.scrollTop;\n};\n","import { defaultEasing } from './utils';\n\ninterface CreateTransitionOptions {\n    duration: string | number;\n    easing?: string;\n    delay?: string | number;\n}\n\nconst formatMs = (milliseconds: number) => `${Math.round(milliseconds)}ms`;\n\nexport default function createTransition(\n    props: string | string[] = ['all'],\n    options?: CreateTransitionOptions\n): string {\n    const { duration = 300, easing = defaultEasing.easeInOut, delay = 0 } = options || {};\n\n    const properties = Array.isArray(props) ? props : [props];\n\n    return properties\n        .map((animatedProp) => {\n            const formattedDuration = typeof duration === 'string' ? duration : formatMs(duration);\n            const formattedDelay = typeof delay === 'string' ? delay : formatMs(delay);\n            return `${animatedProp} ${formattedDuration} ${easing} ${formattedDelay}`;\n        })\n        .join(',');\n}\n","/**\n * Credit to MUI team @ https://mui.com\n */\nimport * as React from 'react';\nimport TransitionComponent from '../Transition';\nimport useForkRef from '../useForkRef';\nimport getTransitionProps from '../getTransitionProps';\nimport createTransition from '../createTransition';\nimport { defaultEasing, reflow } from '../utils';\nimport { SlideTransitionDirection, TransitionProps } from '../../types';\n\nfunction ownerDocument(node: Node | null | undefined): Document {\n    return (node && node.ownerDocument) || document;\n}\n\nfunction ownerWindow(node: Node | null): Window {\n    const doc = ownerDocument(node);\n    return doc.defaultView || window;\n}\n\n/**\n * Corresponds to 10 frames at 60 Hz.\n * A few bytes payload overhead when lodash/debounce is ~3 kB and debounce ~300 B.\n */\nfunction debounce(func: () => void, wait = 166) {\n    let timeout: ReturnType<typeof setTimeout>;\n    function debounced(...args: any[]) {\n        const later = () => {\n            // @ts-ignore\n            func.apply(this, args);\n        };\n        clearTimeout(timeout);\n        timeout = setTimeout(later, wait);\n    }\n\n    debounced.clear = () => {\n        clearTimeout(timeout);\n    };\n\n    return debounced;\n}\n\n/**\n * Translate the node so it can't be seen on the screen.\n * Later, we're going to translate the node back to its original location with `none`.\n */\nfunction getTranslateValue(\n    direction: SlideTransitionDirection,\n    node: HTMLElement & { fakeTransform?: string }\n): string {\n    const rect = node.getBoundingClientRect();\n    const containerWindow = ownerWindow(node);\n    let transform;\n\n    if (node.fakeTransform) {\n        transform = node.fakeTransform;\n    } else {\n        const computedStyle = containerWindow.getComputedStyle(node);\n        transform = computedStyle.getPropertyValue('-webkit-transform') || computedStyle.getPropertyValue('transform');\n    }\n\n    let offsetX = 0;\n    let offsetY = 0;\n\n    if (transform && transform !== 'none' && typeof transform === 'string') {\n        const transformValues = transform.split('(')[1].split(')')[0].split(',');\n        offsetX = parseInt(transformValues[4], 10);\n        offsetY = parseInt(transformValues[5], 10);\n    }\n\n    switch (direction) {\n        case 'left':\n            return `translateX(${containerWindow.innerWidth + offsetX - rect.left}px)`;\n        case 'right':\n            return `translateX(-${rect.left + rect.width - offsetX}px)`;\n        case 'up':\n            return `translateY(${containerWindow.innerHeight + offsetY - rect.top}px)`;\n        default:\n            // down\n            return `translateY(-${rect.top + rect.height - offsetY}px)`;\n    }\n}\n\nfunction setTranslateValue(direction: SlideTransitionDirection, node: HTMLElement | null): void {\n    if (!node) return;\n    const transform = getTranslateValue(direction, node);\n    if (transform) {\n        node.style.webkitTransform = transform;\n        node.style.transform = transform;\n    }\n}\n\nconst Slide = React.forwardRef<unknown, TransitionProps>((props, ref) => {\n    const {\n        children,\n        direction = 'down',\n        in: inProp,\n        style,\n        timeout = 0,\n        onEnter,\n        onEntered,\n        onExit,\n        onExited,\n        ...other\n    } = props;\n\n    const nodeRef = React.useRef(null);\n    const handleRefIntermediary = useForkRef((children as any).ref, nodeRef);\n    const handleRef = useForkRef(handleRefIntermediary, ref);\n\n    const handleEnter: TransitionProps['onEnter'] = (node, isAppearing) => {\n        setTranslateValue(direction, node);\n        reflow(node);\n\n        if (onEnter) {\n            onEnter(node, isAppearing);\n        }\n    };\n\n    const handleEntering = (node: HTMLElement) => {\n        const easing = style?.transitionTimingFunction || defaultEasing.easeOut;\n        const transitionProps = getTransitionProps({\n            timeout,\n            mode: 'enter',\n            style: { ...style, transitionTimingFunction: easing },\n        });\n\n        node.style.webkitTransition = createTransition('-webkit-transform', transitionProps);\n        node.style.transition = createTransition('transform', transitionProps);\n\n        node.style.webkitTransform = 'none';\n        node.style.transform = 'none';\n    };\n\n    const handleExit: TransitionProps['onExit'] = (node) => {\n        const easing = style?.transitionTimingFunction || defaultEasing.sharp;\n        const transitionProps = getTransitionProps({\n            timeout,\n            mode: 'exit',\n            style: { ...style, transitionTimingFunction: easing },\n        });\n\n        node.style.webkitTransition = createTransition('-webkit-transform', transitionProps);\n        node.style.transition = createTransition('transform', transitionProps);\n\n        setTranslateValue(direction, node);\n\n        if (onExit) {\n            onExit(node);\n        }\n    };\n\n    const handleExited: TransitionProps['onExited'] = (node) => {\n        // No need for transitions when the component is hidden\n        node.style.webkitTransition = '';\n        node.style.transition = '';\n\n        if (onExited) {\n            onExited(node);\n        }\n    };\n\n    const updatePosition = React.useCallback(() => {\n        if (nodeRef.current) {\n            setTranslateValue(direction, nodeRef.current);\n        }\n    }, [direction]);\n\n    React.useEffect(() => {\n        // Skip configuration where the position is screen size invariant.\n        if (inProp || direction === 'down' || direction === 'right') {\n            return undefined;\n        }\n\n        const handleResize = debounce(() => {\n            if (nodeRef.current) {\n                setTranslateValue(direction, nodeRef.current);\n            }\n        });\n\n        const containerWindow = ownerWindow(nodeRef.current);\n        containerWindow.addEventListener('resize', handleResize);\n        return () => {\n            handleResize.clear();\n            containerWindow.removeEventListener('resize', handleResize);\n        };\n    }, [direction, inProp]);\n\n    React.useEffect(() => {\n        if (!inProp) {\n            // We need to update the position of the drawer when the direction change and\n            // when it's hidden.\n            updatePosition();\n        }\n    }, [inProp, updatePosition]);\n\n    return (\n        <TransitionComponent\n            appear\n            nodeRef={nodeRef}\n            onEnter={handleEnter}\n            onEntered={onEntered}\n            onEntering={handleEntering}\n            onExit={handleExit}\n            onExited={handleExited}\n            in={inProp}\n            timeout={timeout}\n            {...other}\n        >\n            {(state, childProps) =>\n                React.cloneElement(children as any, {\n                    ref: handleRef,\n                    style: {\n                        visibility: state === 'exited' && !inProp ? 'hidden' : undefined,\n                        ...style,\n                        ...(children as any).props.style,\n                    },\n                    ...childProps,\n                })\n            }\n        </TransitionComponent>\n    );\n});\n\nSlide.displayName = 'Slide';\n\nexport default Slide;\n","import React from 'react';\n\nconst SvgIcon = (props: { children: JSX.Element }) => (\n    <svg\n        viewBox=\"0 0 24 24\"\n        focusable=\"false\"\n        style={{\n            fontSize: 20,\n            marginInlineEnd: 8,\n            userSelect: 'none',\n            width: '1em',\n            height: '1em',\n            display: 'inline-block',\n            fill: 'currentColor',\n            flexShrink: 0,\n        }}\n        {...props}\n    />\n);\n\nconst CheckIcon: React.FC = () => (\n    <SvgIcon>\n        <path\n            d=\"M12 2C6.5 2 2 6.5 2 12S6.5 22 12 22 22 17.5 22 12 17.5 2 12 2M10 17L5 12L6.41\n        10.59L10 14.17L17.59 6.58L19 8L10 17Z\"\n        />\n    </SvgIcon>\n);\n\nconst WarningIcon: React.FC = () => (\n    <SvgIcon>\n        <path d=\"M13,14H11V10H13M13,18H11V16H13M1,21H23L12,2L1,21Z\" />\n    </SvgIcon>\n);\n\nconst ErrorIcon: React.FC = () => (\n    <SvgIcon>\n        <path\n            d=\"M12,2C17.53,2 22,6.47 22,12C22,17.53 17.53,22 12,22C6.47,22 2,17.53 2,12C2,\n        6.47 6.47,2 12,2M15.59,7L12,10.59L8.41,7L7,8.41L10.59,12L7,15.59L8.41,17L12,\n        13.41L15.59,17L17,15.59L13.41,12L17,8.41L15.59,7Z\"\n        />\n    </SvgIcon>\n);\n\nconst InfoIcon: React.FC = () => (\n    <SvgIcon>\n        <path\n            d=\"M13,9H11V7H13M13,17H11V11H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,\n        0 22,12A10,10 0 0,0 12,2Z\"\n        />\n    </SvgIcon>\n);\n\nconst defaultIconVariants: Record<string, React.ReactNode> = {\n    default: undefined,\n    success: <CheckIcon />,\n    warning: <WarningIcon />,\n    error: <ErrorIcon />,\n    info: <InfoIcon />,\n};\n\nexport default defaultIconVariants;\n","import Slide from '../transitions/Slide';\nimport defaultIconVariants from '../utils/defaultIconVariants';\nimport { InternalSnack } from '../types';\n\nexport const defaults = {\n    maxSnack: 3,\n    persist: false,\n    hideIconVariant: false,\n    disableWindowBlurListener: false,\n    variant: 'default',\n    autoHideDuration: 5000,\n    iconVariant: defaultIconVariants,\n    anchorOrigin: { vertical: 'bottom', horizontal: 'left' },\n    TransitionComponent: Slide,\n    transitionDuration: {\n        enter: 225,\n        exit: 195,\n    },\n};\n\n/**\n * Derives the right autoHideDuration taking into account the following\n * prority order: 1: Options, 2: Props, 3: default fallback\n */\nconst getAutoHideDuration = (optionsDuration: any, propsDuration: any) => {\n    const isNumberOrNull = (numberish: number | null) => typeof numberish === 'number' || numberish === null;\n\n    if (isNumberOrNull(optionsDuration)) return optionsDuration;\n    if (isNumberOrNull(propsDuration)) return propsDuration;\n    return defaults.autoHideDuration;\n};\n\n/**\n * Derives the right transitionDuration taking into account the following\n * prority order: 1: Options, 2: Props, 3: default fallback\n */\nconst getTransitionDuration = (optionsDuration: any, propsDuration: any) => {\n    const is = (item: any, types: string[]) => types.some((t) => typeof item === t);\n\n    if (is(optionsDuration, ['string', 'number'])) {\n        return optionsDuration;\n    }\n\n    if (is(optionsDuration, ['object'])) {\n        return {\n            ...defaults.transitionDuration,\n            ...(is(propsDuration, ['object']) && propsDuration),\n            ...optionsDuration,\n        };\n    }\n\n    if (is(propsDuration, ['string', 'number'])) {\n        return propsDuration;\n    }\n\n    if (is(propsDuration, ['object'])) {\n        return {\n            ...defaults.transitionDuration,\n            ...propsDuration,\n        };\n    }\n\n    return defaults.transitionDuration;\n};\n\nexport const merge =\n    (options: any, props: any) =>\n    (name: keyof InternalSnack, shouldObjectMerge = false): any => {\n        if (shouldObjectMerge) {\n            return {\n                ...(defaults as any)[name],\n                ...props[name],\n                ...options[name],\n            };\n        }\n\n        if (name === 'autoHideDuration') {\n            return getAutoHideDuration(options.autoHideDuration, props.autoHideDuration);\n        }\n\n        if (name === 'transitionDuration') {\n            return getTransitionDuration(options.transitionDuration, props.transitionDuration);\n        }\n\n        return options[name] || props[name] || (defaults as any)[name];\n    };\n","import { css, CSSAttribute } from 'goober';\n\nexport function makeStyles<S extends { [key: string]: CSSAttribute }, K extends keyof S>(\n    styles: S\n): { [key in K]: string } {\n    return Object.entries(styles).reduce(\n        (acc, [key, value]) => ({\n            ...acc,\n            [key]: css(value),\n        }),\n        {} as { [key in K]: string }\n    );\n}\n\nexport const ComponentClasses = {\n    SnackbarContainer: 'notistack-SnackbarContainer',\n    Snackbar: 'notistack-Snackbar',\n    CollapseWrapper: 'notistack-CollapseWrapper',\n    MuiContent: 'notistack-MuiContent',\n    MuiContentVariant: (variant: string) => `notistack-MuiContent-${variant}`,\n};\n","/**\n * Credit to MUI team @ https://mui.com\n */\nimport * as React from 'react';\nimport clsx from 'clsx';\nimport { reflow } from '../utils';\nimport TransitionComponent from '../Transition';\nimport useForkRef from '../useForkRef';\nimport { TransitionProps } from '../../types';\nimport getTransitionProps from '../getTransitionProps';\nimport createTransition from '../createTransition';\nimport { ComponentClasses, makeStyles } from '../../utils/styles';\n\nconst classes = makeStyles({\n    root: {\n        height: 0,\n    },\n    entered: {\n        height: 'auto',\n    },\n});\n\nconst collapsedSize = '0px';\nconst timeout = 175;\n\ninterface CollapseProps {\n    children: JSX.Element;\n    in: boolean;\n    onExited: TransitionProps['onExited'];\n}\n\nconst Collapse = React.forwardRef<HTMLDivElement, CollapseProps>((props, ref) => {\n    const { children, in: inProp, onExited } = props;\n\n    const wrapperRef = React.useRef<HTMLDivElement>(null);\n\n    const nodeRef = React.useRef<HTMLDivElement>(null);\n    const handleRef = useForkRef(ref, nodeRef);\n\n    const getWrapperSize = () => (wrapperRef.current ? wrapperRef.current.clientHeight : 0);\n\n    const handleEnter: TransitionProps['onEnter'] = (node) => {\n        node.style.height = collapsedSize;\n    };\n\n    const handleEntering = (node: HTMLElement) => {\n        const wrapperSize = getWrapperSize();\n\n        const { duration: transitionDuration, easing } = getTransitionProps({\n            timeout,\n            mode: 'enter',\n        });\n\n        node.style.transitionDuration =\n            typeof transitionDuration === 'string' ? transitionDuration : `${transitionDuration}ms`;\n\n        node.style.height = `${wrapperSize}px`;\n        node.style.transitionTimingFunction = easing || '';\n    };\n\n    const handleEntered: TransitionProps['onEntered'] = (node) => {\n        node.style.height = 'auto';\n    };\n\n    const handleExit: TransitionProps['onExit'] = (node) => {\n        node.style.height = `${getWrapperSize()}px`;\n    };\n\n    const handleExiting = (node: HTMLElement) => {\n        reflow(node);\n\n        const { duration: transitionDuration, easing } = getTransitionProps({\n            timeout,\n            mode: 'exit',\n        });\n\n        node.style.transitionDuration =\n            typeof transitionDuration === 'string' ? transitionDuration : `${transitionDuration}ms`;\n        node.style.height = collapsedSize;\n        node.style.transitionTimingFunction = easing || '';\n    };\n\n    return (\n        <TransitionComponent\n            in={inProp}\n            unmountOnExit\n            onEnter={handleEnter}\n            onEntered={handleEntered}\n            onEntering={handleEntering}\n            onExit={handleExit}\n            onExited={onExited}\n            onExiting={handleExiting}\n            nodeRef={nodeRef}\n            timeout={timeout}\n        >\n            {(state, childProps) => (\n                <div\n                    ref={handleRef}\n                    className={clsx(classes.root, { [classes.entered]: state === 'entered' })}\n                    style={{\n                        pointerEvents: 'all',\n                        overflow: 'hidden',\n                        minHeight: collapsedSize,\n                        transition: createTransition('height'),\n                        ...(state === 'entered' && {\n                            overflow: 'visible',\n                        }),\n                        ...(state === 'exited' &&\n                            !inProp && {\n                                visibility: 'hidden',\n                            }),\n                    }}\n                    {...childProps}\n                >\n                    <div\n                        ref={wrapperRef}\n                        className={ComponentClasses.CollapseWrapper}\n                        // Hack to get children with a negative margin to not falsify the height computation.\n                        style={{ display: 'flex', width: '100%' }}\n                    >\n                        {children}\n                    </div>\n                </div>\n            )}\n        </TransitionComponent>\n    );\n});\n\nCollapse.displayName = 'Collapse';\n\nexport default Collapse;\n","import {\n    InternalSnack,\n    SlideTransitionDirection,\n    SnackbarOrigin,\n    SnackbarClassKey,\n    SnackbarProviderProps,\n    ClassNameMap,\n    ContainerClassKey,\n} from '../types';\nimport { originKeyExtractor } from '../utils';\n\nconst direction: Record<string, SlideTransitionDirection> = {\n    right: 'left',\n    left: 'right',\n    bottom: 'up',\n    top: 'down',\n};\n\nexport const getSlideDirection = (anchorOrigin: InternalSnack['anchorOrigin']): SlideTransitionDirection => {\n    if (anchorOrigin.horizontal !== 'center') {\n        return direction[anchorOrigin.horizontal];\n    }\n    return direction[anchorOrigin.vertical];\n};\n\n/** Tranforms classes name */\nexport const toSnackbarAnchorOrigin = (anchorOrigin: SnackbarOrigin): SnackbarClassKey =>\n    `anchorOrigin${originKeyExtractor(anchorOrigin)}` as SnackbarClassKey;\n\n/**\n * Omit SnackbarContainer class keys that are not needed for SnackbarItem\n */\nexport const keepSnackbarClassKeys = (\n    classes: SnackbarProviderProps['classes'] = {}\n): Partial<ClassNameMap<SnackbarClassKey>> => {\n    const containerClasses: Record<ContainerClassKey, true> = {\n        containerRoot: true,\n        containerAnchorOriginTopCenter: true,\n        containerAnchorOriginBottomCenter: true,\n        containerAnchorOriginTopRight: true,\n        containerAnchorOriginBottomRight: true,\n        containerAnchorOriginTopLeft: true,\n        containerAnchorOriginBottomLeft: true,\n    };\n    return (Object.keys(classes) as ContainerClassKey[])\n        .filter((key) => !containerClasses[key])\n        .reduce((obj, key) => ({ ...obj, [key]: classes[key] }), {});\n};\n","import { SnackbarKey } from 'src/types';\n\nconst noOp = () => {\n    /* */\n};\n\n/**\n * Credit to MUI team @ https://mui.com\n * Safe chained function.\n *\n * Will only create a new function if needed,\n * otherwise will pass back existing functions or null.\n */\nexport default function createChainedFunction<Args extends any[], This>(\n    funcs: Array<((this: This, ...args: Args) => any) | undefined>,\n    snackbarId?: SnackbarKey\n): (this: This, ...args: Args) => void {\n    // @ts-ignore\n    return funcs.reduce((acc, func) => {\n        if (func === null || func === undefined) {\n            return acc;\n        }\n\n        return function chainedFunction(...args) {\n            const argums = [...args] as any;\n            if (snackbarId && argums.indexOf(snackbarId) === -1) {\n                argums.push(snackbarId);\n            }\n            // @ts-ignore\n            acc.apply(this, argums);\n            func.apply(this, argums);\n        };\n    }, noOp);\n}\n","/**\n * Credit to MUI team @ https://mui.com\n * https://github.com/facebook/react/issues/14099#issuecomment-440013892\n */\nimport * as React from 'react';\n\nconst useEnhancedEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;\n\nexport default function useEventCallback<Args extends unknown[], Return>(\n    fn: (...args: Args) => Return\n): (...args: Args) => Return {\n    const ref = React.useRef(fn);\n    useEnhancedEffect(() => {\n        ref.current = fn;\n    });\n    return React.useCallback(\n        (...args: Args) =>\n            // @ts-expect-error hide `this`\n            (0, ref.current)(...args),\n        []\n    );\n}\n","/**\n * Credit to MUI team @ https://mui.com\n */\nimport * as React from 'react';\nimport clsx from 'clsx';\nimport useEventCallback from '../utils/useEventCallback';\nimport { CloseReason, SharedProps, SnackbarKey } from '../types';\nimport { ComponentClasses } from '../utils/styles';\n\ninterface SnackbarProps extends Required<Pick<SharedProps, 'disableWindowBlurListener' | 'onClose'>> {\n    open: boolean;\n    id: SnackbarKey;\n    className: string;\n    children: JSX.Element;\n    autoHideDuration: number | null | undefined;\n    SnackbarProps: SharedProps['SnackbarProps'];\n}\n\nconst Snackbar = React.forwardRef<HTMLDivElement, SnackbarProps>((props, ref) => {\n    const {\n        children,\n        className,\n        autoHideDuration,\n        disableWindowBlurListener = false,\n        onClose,\n        id,\n        open,\n        SnackbarProps = {},\n    } = props;\n\n    const timerAutoHide = React.useRef<ReturnType<typeof setTimeout>>();\n\n    const handleClose = useEventCallback((...args: [null, CloseReason, SnackbarKey]) => {\n        if (onClose) {\n            onClose(...args);\n        }\n    });\n\n    const setAutoHideTimer = useEventCallback((autoHideDurationParam?: number | null) => {\n        if (!onClose || autoHideDurationParam == null) {\n            return;\n        }\n\n        if (timerAutoHide.current) {\n            clearTimeout(timerAutoHide.current);\n        }\n        timerAutoHide.current = setTimeout(() => {\n            handleClose(null, 'timeout', id);\n        }, autoHideDurationParam);\n    });\n\n    React.useEffect(() => {\n        if (open) {\n            setAutoHideTimer(autoHideDuration);\n        }\n\n        return () => {\n            if (timerAutoHide.current) {\n                clearTimeout(timerAutoHide.current);\n            }\n        };\n    }, [open, autoHideDuration, setAutoHideTimer]);\n\n    /**\n     * Pause the timer when the user is interacting with the Snackbar\n     * or when the user hide the window.\n     */\n    const handlePause = () => {\n        if (timerAutoHide.current) {\n            clearTimeout(timerAutoHide.current);\n        }\n    };\n\n    /**\n     * Restart the timer when the user is no longer interacting with the Snackbar\n     * or when the window is shown back.\n     */\n    const handleResume = React.useCallback(() => {\n        if (autoHideDuration != null) {\n            setAutoHideTimer(autoHideDuration * 0.5);\n        }\n    }, [autoHideDuration, setAutoHideTimer]);\n\n    const handleMouseEnter: React.MouseEventHandler<HTMLDivElement> = (event) => {\n        if (SnackbarProps.onMouseEnter) {\n            SnackbarProps.onMouseEnter(event);\n        }\n        handlePause();\n    };\n\n    const handleMouseLeave: React.MouseEventHandler<HTMLDivElement> = (event) => {\n        if (SnackbarProps.onMouseLeave) {\n            SnackbarProps.onMouseLeave(event);\n        }\n        handleResume();\n    };\n\n    React.useEffect(() => {\n        if (!disableWindowBlurListener && open) {\n            window.addEventListener('focus', handleResume);\n            window.addEventListener('blur', handlePause);\n\n            return () => {\n                window.removeEventListener('focus', handleResume);\n                window.removeEventListener('blur', handlePause);\n            };\n        }\n\n        return undefined;\n    }, [disableWindowBlurListener, handleResume, open]);\n\n    return (\n        <div\n            ref={ref}\n            {...SnackbarProps}\n            className={clsx(ComponentClasses.Snackbar, className)}\n            onMouseEnter={handleMouseEnter}\n            onMouseLeave={handleMouseLeave}\n        >\n            {children}\n        </div>\n    );\n});\n\nSnackbar.displayName = 'Snackbar';\n\nexport default Snackbar;\n","import React, { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { SnackbarContentProps } from '../types';\nimport { breakpoints } from '../utils';\nimport { makeStyles } from '../utils/styles';\n\nconst classes = makeStyles({\n    root: {\n        display: 'flex',\n        flexWrap: 'wrap',\n        flexGrow: 1,\n        [breakpoints.upSm]: {\n            flexGrow: 'initial',\n            minWidth: '288px',\n        },\n    },\n});\n\nconst SnackbarContent = forwardRef<HTMLDivElement, SnackbarContentProps>(({ className, ...props }, ref) => (\n    <div ref={ref} className={clsx(classes.root, className)} {...props} />\n));\n\nSnackbarContent.displayName = 'SnackbarContent';\n\nexport default SnackbarContent;\n","import React, { memo, forwardRef } from 'react';\nimport clsx from 'clsx';\nimport SnackbarContent from '../../SnackbarContent';\nimport { CustomContentProps } from '../../types';\nimport { ComponentClasses, makeStyles } from '../../utils/styles';\n\nconst classes = makeStyles({\n    root: {\n        backgroundColor: '#313131', // dark grey\n        fontSize: '0.875rem',\n        lineHeight: 1.43,\n        letterSpacing: '0.01071em',\n        color: '#fff',\n        alignItems: 'center',\n        padding: '6px 16px',\n        borderRadius: '4px',\n        boxShadow:\n            '0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)',\n    },\n    lessPadding: {\n        paddingLeft: `${8 * 2.5}px`,\n    },\n    default: {\n        backgroundColor: '#313131', // dark grey\n    },\n    success: {\n        backgroundColor: '#43a047', // green\n    },\n    error: {\n        backgroundColor: '#d32f2f', // dark red\n    },\n    warning: {\n        backgroundColor: '#ff9800', // amber\n    },\n    info: {\n        backgroundColor: '#2196f3', // nice blue\n    },\n    message: {\n        display: 'flex',\n        alignItems: 'center',\n        padding: '8px 0',\n    },\n    action: {\n        display: 'flex',\n        alignItems: 'center',\n        marginLeft: 'auto',\n        paddingLeft: '16px',\n        marginRight: '-8px',\n    },\n});\n\nconst ariaDescribedby = 'notistack-snackbar';\n\nconst MaterialDesignContent = forwardRef<HTMLDivElement, CustomContentProps>((props, forwardedRef) => {\n    const {\n        id,\n        message,\n        action: componentOrFunctionAction,\n        iconVariant,\n        variant,\n        hideIconVariant,\n        style,\n        className,\n    } = props;\n\n    const icon = iconVariant[variant];\n\n    let action = componentOrFunctionAction;\n    if (typeof action === 'function') {\n        action = action(id);\n    }\n\n    return (\n        <SnackbarContent\n            ref={forwardedRef}\n            role=\"alert\"\n            aria-describedby={ariaDescribedby}\n            style={style}\n            className={clsx(\n                ComponentClasses.MuiContent,\n                ComponentClasses.MuiContentVariant(variant),\n                classes.root,\n                { [classes.lessPadding]: !hideIconVariant && icon },\n                classes[variant],\n                className\n            )}\n        >\n            <div id={ariaDescribedby} className={classes.message}>\n                {!hideIconVariant ? icon : null}\n                {message}\n            </div>\n            {action && <div className={classes.action}>{action}</div>}\n        </SnackbarContent>\n    );\n});\n\nMaterialDesignContent.displayName = 'MaterialDesignContent';\n\nexport default memo(MaterialDesignContent);\n","import React, { useState, useEffect, useRef, useCallback, useMemo } from 'react';\nimport clsx from 'clsx';\nimport Collapse from '../transitions/Collapse';\nimport { getSlideDirection, toSnackbarAnchorOrigin, keepSnackbarClassKeys } from './utils';\nimport {\n    TransitionHandlerProps,\n    SnackbarProviderProps,\n    CustomContentProps,\n    InternalSnack,\n    SharedProps,\n} from '../types';\nimport createChainedFunction from '../utils/createChainedFunction';\nimport Snackbar from './Snackbar';\nimport { makeStyles } from '../utils/styles';\nimport MaterialDesignContent from '../ui/MaterialDesignContent';\n\nconst styles = makeStyles({\n    wrappedRoot: {\n        width: '100%',\n        position: 'relative',\n        transform: 'translateX(0)',\n        top: 0,\n        right: 0,\n        bottom: 0,\n        left: 0,\n        minWidth: '288px',\n    },\n});\n\ninterface SnackbarItemProps extends Required<Pick<SnackbarProviderProps, 'onEntered' | 'onExited' | 'onClose'>> {\n    snack: InternalSnack;\n    classes: SnackbarProviderProps['classes'];\n    onEnter: SnackbarProviderProps['onEnter'];\n    onExit: SnackbarProviderProps['onExit'];\n    Component?: React.ComponentType<CustomContentProps>;\n}\n\nconst SnackbarItem: React.FC<SnackbarItemProps> = (props) => {\n    const timeout = useRef<ReturnType<typeof setTimeout>>();\n    const [collapsed, setCollapsed] = useState(true);\n\n    const handleClose: NonNullable<SharedProps['onClose']> = createChainedFunction([\n        props.snack.onClose,\n        props.onClose,\n    ]);\n\n    const handleEntered: TransitionHandlerProps['onEntered'] = () => {\n        if (props.snack.requestClose) {\n            handleClose(null, 'instructed', props.snack.id);\n        }\n    };\n\n    const handleExitedScreen = useCallback((): void => {\n        timeout.current = setTimeout(() => {\n            setCollapsed((col) => !col);\n        }, 125);\n    }, []);\n\n    useEffect(\n        () => (): void => {\n            if (timeout.current) {\n                clearTimeout(timeout.current);\n            }\n        },\n        []\n    );\n\n    const { snack, classes: allClasses, Component = MaterialDesignContent } = props;\n\n    const classes = useMemo(() => keepSnackbarClassKeys(allClasses), [allClasses]);\n\n    const {\n        open,\n        SnackbarProps,\n        TransitionComponent,\n        TransitionProps,\n        transitionDuration,\n        disableWindowBlurListener,\n        content: componentOrFunctionContent,\n        entered: ignoredEntered,\n        requestClose: ignoredRequestClose,\n        onEnter: ignoreOnEnter,\n        onEntered: ignoreOnEntered,\n        onExit: ignoreOnExit,\n        onExited: ignoreOnExited,\n        ...otherSnack\n    } = snack;\n\n    const transitionProps = {\n        direction: getSlideDirection(otherSnack.anchorOrigin),\n        timeout: transitionDuration,\n        ...TransitionProps,\n    };\n\n    let content = componentOrFunctionContent;\n    if (typeof content === 'function') {\n        content = content(otherSnack.id, otherSnack.message);\n    }\n\n    const callbacks: { [key in keyof TransitionHandlerProps]?: any } = (\n        ['onEnter', 'onEntered', 'onExit', 'onExited'] as (keyof TransitionHandlerProps)[]\n    ).reduce(\n        (acc, cbName) => ({\n            ...acc,\n            [cbName]: createChainedFunction([props.snack[cbName] as any, props[cbName] as any], otherSnack.id),\n        }),\n        {}\n    );\n\n    return (\n        <Collapse in={collapsed} onExited={callbacks.onExited}>\n            <Snackbar\n                open={open}\n                id={otherSnack.id}\n                disableWindowBlurListener={disableWindowBlurListener}\n                autoHideDuration={otherSnack.autoHideDuration}\n                className={clsx(\n                    styles.wrappedRoot,\n                    classes.root,\n                    classes[toSnackbarAnchorOrigin(otherSnack.anchorOrigin)]\n                )}\n                SnackbarProps={SnackbarProps}\n                onClose={handleClose}\n            >\n                <TransitionComponent\n                    {...transitionProps}\n                    appear\n                    in={open}\n                    onExit={callbacks.onExit}\n                    onExited={handleExitedScreen}\n                    onEnter={callbacks.onEnter}\n                    // order matters. first callbacks.onEntered to set entered: true,\n                    // then handleEntered to check if there's a request for closing\n                    onEntered={createChainedFunction([callbacks.onEntered, handleEntered], otherSnack.id)}\n                >\n                    {(content as React.ReactElement) || <Component {...otherSnack} />}\n                </TransitionComponent>\n            </Snackbar>\n        </Collapse>\n    );\n};\n\nexport default SnackbarItem;\n","import React, { memo } from 'react';\nimport clsx from 'clsx';\nimport createTransition from '../transitions/createTransition';\nimport { makeStyles, ComponentClasses } from '../utils/styles';\nimport { breakpoints, originKeyExtractor } from '../utils';\nimport { ContainerClassKey, SnackbarProviderProps } from '../types';\n\nconst indents = {\n    view: { default: 20, dense: 4 },\n    snackbar: { default: 6, dense: 2 },\n};\n\nconst collapseWrapper = `.${ComponentClasses.CollapseWrapper}`;\n\nconst xsWidthMargin = 16;\n\nconst styles = makeStyles({\n    root: {\n        boxSizing: 'border-box',\n        display: 'flex',\n        maxHeight: '100%',\n        position: 'fixed',\n        zIndex: 1400,\n        height: 'auto',\n        width: 'auto',\n        transition: createTransition(['top', 'right', 'bottom', 'left', 'max-width'], {\n            duration: 300,\n            easing: 'ease',\n        }),\n        // container itself is invisible and should not block clicks, clicks should be passed to its children\n        // a pointerEvents: all is applied in the collapse component\n        pointerEvents: 'none',\n        [collapseWrapper]: {\n            padding: `${indents.snackbar.default}px 0px`,\n            transition: 'padding 300ms ease 0ms',\n        },\n        maxWidth: `calc(100% - ${indents.view.default * 2}px)`,\n        [breakpoints.downXs]: {\n            width: '100%',\n            maxWidth: `calc(100% - ${xsWidthMargin * 2}px)`,\n        },\n    },\n    rootDense: {\n        [collapseWrapper]: {\n            padding: `${indents.snackbar.dense}px 0px`,\n        },\n    },\n    top: {\n        top: `${indents.view.default - indents.snackbar.default}px`,\n        flexDirection: 'column',\n    },\n    bottom: {\n        bottom: `${indents.view.default - indents.snackbar.default}px`,\n        flexDirection: 'column-reverse',\n    },\n    left: {\n        left: `${indents.view.default}px`,\n        [breakpoints.upSm]: {\n            alignItems: 'flex-start',\n        },\n        [breakpoints.downXs]: {\n            left: `${xsWidthMargin}px`,\n        },\n    },\n    right: {\n        right: `${indents.view.default}px`,\n        [breakpoints.upSm]: {\n            alignItems: 'flex-end',\n        },\n        [breakpoints.downXs]: {\n            right: `${xsWidthMargin}px`,\n        },\n    },\n    center: {\n        left: '50%',\n        transform: 'translateX(-50%)',\n        [breakpoints.upSm]: {\n            alignItems: 'center',\n        },\n    },\n});\n\ninterface SnackbarContainerProps {\n    children: React.ReactNode;\n    dense: SnackbarProviderProps['dense'];\n    anchorOrigin: NonNullable<SnackbarProviderProps['anchorOrigin']>;\n    classes: SnackbarProviderProps['classes'];\n}\n\nconst SnackbarContainer: React.FC<SnackbarContainerProps> = (props) => {\n    const { classes = {}, anchorOrigin, dense, children } = props;\n\n    const combinedClassname = clsx(\n        ComponentClasses.SnackbarContainer,\n        styles[anchorOrigin.vertical],\n        styles[anchorOrigin.horizontal],\n        { [styles.rootDense]: dense },\n        styles.root, // root should come after others to override maxWidth\n        classes.containerRoot,\n        classes[`containerAnchorOrigin${originKeyExtractor(anchorOrigin)}` as ContainerClassKey]\n    );\n\n    return <div className={combinedClassname}>{children}</div>;\n};\n\nexport default memo(SnackbarContainer);\n","import React, { Component, isValidElement } from 'react';\nimport { createPortal } from 'react-dom';\nimport clsx from 'clsx';\nimport SnackbarContext from '../SnackbarContext';\nimport { originKeyExtractor, isDefined } from '../utils';\nimport { defaults, merge } from './merger';\nimport SnackbarItem from '../SnackbarItem';\nimport SnackbarContainer from '../SnackbarContainer';\nimport warning from '../utils/warning';\nimport {\n    SnackbarProviderProps,\n    SnackbarKey,\n    ProviderContext,\n    TransitionHandlerProps,\n    InternalSnack,\n    OptionsObject,\n    SharedProps,\n    SnackbarMessage,\n} from '../types';\nimport createChainedFunction from '../utils/createChainedFunction';\n\nconst isOptions = (\n    messageOrOptions: SnackbarMessage | (OptionsObject & { message?: SnackbarMessage })\n): messageOrOptions is OptionsObject & { message?: SnackbarMessage } => {\n    const isMessage = typeof messageOrOptions === 'string' || isValidElement(messageOrOptions);\n    return !isMessage;\n};\n\ntype Reducer = (state: State) => State;\ntype SnacksByPosition = { [key: string]: InternalSnack[] };\n\ninterface State {\n    snacks: InternalSnack[];\n    queue: InternalSnack[];\n    contextValue: ProviderContext;\n}\n\nexport let enqueueSnackbar: ProviderContext['enqueueSnackbar'];\nexport let closeSnackbar: ProviderContext['closeSnackbar'];\n\nclass SnackbarProvider extends Component<SnackbarProviderProps, State> {\n    constructor(props: SnackbarProviderProps) {\n        super(props);\n        enqueueSnackbar = this.enqueueSnackbar;\n        closeSnackbar = this.closeSnackbar;\n\n        this.state = {\n            snacks: [],\n            queue: [],\n            contextValue: {\n                enqueueSnackbar: this.enqueueSnackbar.bind(this),\n                closeSnackbar: this.closeSnackbar.bind(this),\n            },\n        };\n    }\n\n    get maxSnack(): number {\n        return this.props.maxSnack || defaults.maxSnack;\n    }\n\n    /**\n     * Adds a new snackbar to the queue to be presented.\n     * Returns generated or user defined key referencing the new snackbar or null\n     */\n    enqueueSnackbar = (\n        messageOrOptions: SnackbarMessage | (OptionsObject & { message?: SnackbarMessage }),\n        optsOrUndefined: OptionsObject = {}\n    ): SnackbarKey => {\n        if (messageOrOptions === undefined || messageOrOptions === null) {\n            throw new Error('enqueueSnackbar called with invalid argument');\n        }\n\n        const opts = isOptions(messageOrOptions) ? messageOrOptions : optsOrUndefined;\n\n        const message: SnackbarMessage | undefined = isOptions(messageOrOptions)\n            ? messageOrOptions.message\n            : messageOrOptions;\n\n        const { key, preventDuplicate, ...options } = opts;\n\n        const hasSpecifiedKey = isDefined(key);\n        const id = hasSpecifiedKey ? (key as SnackbarKey) : new Date().getTime() + Math.random();\n\n        const merger = merge(options, this.props);\n        const snack: InternalSnack = {\n            id,\n            ...options,\n            message,\n            open: true,\n            entered: false,\n            requestClose: false,\n            persist: merger('persist'),\n            action: merger('action'),\n            content: merger('content'),\n            variant: merger('variant'),\n            anchorOrigin: merger('anchorOrigin'),\n            disableWindowBlurListener: merger('disableWindowBlurListener'),\n            autoHideDuration: merger('autoHideDuration'),\n            hideIconVariant: merger('hideIconVariant'),\n            TransitionComponent: merger('TransitionComponent'),\n            transitionDuration: merger('transitionDuration'),\n            TransitionProps: merger('TransitionProps', true),\n            iconVariant: merger('iconVariant', true),\n            style: merger('style', true),\n            SnackbarProps: merger('SnackbarProps', true),\n            className: clsx(this.props.className, options.className),\n        };\n\n        if (snack.persist) {\n            snack.autoHideDuration = undefined;\n        }\n\n        this.setState((state) => {\n            if ((preventDuplicate === undefined && this.props.preventDuplicate) || preventDuplicate) {\n                const compareFunction = (item: InternalSnack): boolean =>\n                    hasSpecifiedKey ? item.id === id : item.message === message;\n\n                const inQueue = state.queue.findIndex(compareFunction) > -1;\n                const inView = state.snacks.findIndex(compareFunction) > -1;\n                if (inQueue || inView) {\n                    return state;\n                }\n            }\n\n            return this.handleDisplaySnack({\n                ...state,\n                queue: [...state.queue, snack],\n            });\n        });\n\n        return id;\n    };\n\n    /**\n     * Reducer: Display snack if there's space for it. Otherwise, immediately\n     * begin dismissing the oldest message to start showing the new one.\n     */\n    handleDisplaySnack: Reducer = (state) => {\n        const { snacks } = state;\n        if (snacks.length >= this.maxSnack) {\n            return this.handleDismissOldest(state);\n        }\n        return this.processQueue(state);\n    };\n\n    /**\n     * Reducer: Display items (notifications) in the queue if there's space for them.\n     */\n    processQueue: Reducer = (state) => {\n        const { queue, snacks } = state;\n        if (queue.length > 0) {\n            return {\n                ...state,\n                snacks: [...snacks, queue[0]],\n                queue: queue.slice(1, queue.length),\n            };\n        }\n        return state;\n    };\n\n    /**\n     * Reducer: Hide oldest snackbar on the screen because there exists a new one which we have to display.\n     * (ignoring the one with 'persist' flag. i.e. explicitly told by user not to get dismissed).\n     *\n     * Note 1: If there is already a message leaving the screen, no new messages are dismissed.\n     * Note 2: If the oldest message has not yet entered the screen, only a request to close the\n     *         snackbar is made. Once it entered the screen, it will be immediately dismissed.\n     */\n    handleDismissOldest: Reducer = (state) => {\n        if (state.snacks.some((item) => !item.open || item.requestClose)) {\n            return state;\n        }\n\n        let popped = false;\n        let ignore = false;\n\n        const persistentCount = state.snacks.reduce(\n            (acc, current) => acc + (current.open && current.persist ? 1 : 0),\n            0\n        );\n\n        if (persistentCount === this.maxSnack) {\n            warning('NO_PERSIST_ALL');\n            ignore = true;\n        }\n\n        const snacks = state.snacks.map((item) => {\n            if (!popped && (!item.persist || ignore)) {\n                popped = true;\n\n                if (!item.entered) {\n                    return {\n                        ...item,\n                        requestClose: true,\n                    };\n                }\n\n                if (item.onClose) {\n                    item.onClose(null, 'maxsnack', item.id);\n                }\n\n                if (this.props.onClose) {\n                    this.props.onClose(null, 'maxsnack', item.id);\n                }\n\n                return {\n                    ...item,\n                    open: false,\n                };\n            }\n\n            return { ...item };\n        });\n\n        return { ...state, snacks };\n    };\n\n    /**\n     * Set the entered state of the snackbar with the given key.\n     */\n    handleEnteredSnack: TransitionHandlerProps['onEntered'] = (node, isAppearing, key) => {\n        if (!isDefined(key)) {\n            throw new Error('handleEnteredSnack Cannot be called with undefined key');\n        }\n\n        this.setState(({ snacks }) => ({\n            snacks: snacks.map((item) => (item.id === key ? { ...item, entered: true } : { ...item })),\n        }));\n    };\n\n    /**\n     * Hide a snackbar after its timeout.\n     */\n    handleCloseSnack: NonNullable<SharedProps['onClose']> = (event, reason, key) => {\n        // should not use createChainedFunction for onClose.\n        // because this.closeSnackbar called this function\n        if (this.props.onClose) {\n            this.props.onClose(event, reason, key);\n        }\n\n        const shouldCloseAll = key === undefined;\n\n        this.setState(({ snacks, queue }) => ({\n            snacks: snacks.map((item) => {\n                if (!shouldCloseAll && item.id !== key) {\n                    return { ...item };\n                }\n\n                return item.entered ? { ...item, open: false } : { ...item, requestClose: true };\n            }),\n            queue: queue.filter((item) => item.id !== key),\n        }));\n    };\n\n    /**\n     * Close snackbar with the given key\n     */\n    closeSnackbar: ProviderContext['closeSnackbar'] = (key) => {\n        // call individual snackbar onClose callback passed through options parameter\n        const toBeClosed = this.state.snacks.find((item) => item.id === key);\n        if (isDefined(key) && toBeClosed && toBeClosed.onClose) {\n            toBeClosed.onClose(null, 'instructed', key);\n        }\n\n        this.handleCloseSnack(null, 'instructed', key);\n    };\n\n    /**\n     * When we set open attribute of a snackbar to false (i.e. after we hide a snackbar),\n     * it leaves the screen and immediately after leaving animation is done, this method\n     * gets called. We remove the hidden snackbar from state and then display notifications\n     * waiting in the queue (if any). If after this process the queue is not empty, the\n     * oldest message is dismissed.\n     */\n    handleExitedSnack: TransitionHandlerProps['onExited'] = (node, key) => {\n        if (!isDefined(key)) {\n            throw new Error('handleExitedSnack Cannot be called with undefined key');\n        }\n\n        this.setState((state) => {\n            const newState = this.processQueue({\n                ...state,\n                snacks: state.snacks.filter((item) => item.id !== key),\n            });\n\n            if (newState.queue.length === 0) {\n                return newState;\n            }\n\n            return this.handleDismissOldest(newState);\n        });\n    };\n\n    render(): JSX.Element {\n        const { contextValue } = this.state;\n        const { domRoot, children, dense = false, Components = {}, classes } = this.props;\n\n        const categ = this.state.snacks.reduce<SnacksByPosition>((acc, current) => {\n            const category = originKeyExtractor(current.anchorOrigin);\n            const existingOfCategory = acc[category] || [];\n            return {\n                ...acc,\n                [category]: [...existingOfCategory, current],\n            };\n        }, {});\n\n        const snackbars = Object.keys(categ).map((origin) => {\n            const snacks = categ[origin];\n            const [nomineeSnack] = snacks;\n            return (\n                <SnackbarContainer\n                    key={origin}\n                    dense={dense}\n                    anchorOrigin={nomineeSnack.anchorOrigin}\n                    classes={classes}\n                >\n                    {snacks.map((snack) => (\n                        <SnackbarItem\n                            key={snack.id}\n                            snack={snack}\n                            classes={classes}\n                            Component={Components[snack.variant]}\n                            onClose={this.handleCloseSnack}\n                            onEnter={this.props.onEnter}\n                            onExit={this.props.onExit}\n                            onExited={createChainedFunction([this.handleExitedSnack, this.props.onExited], snack.id)}\n                            onEntered={createChainedFunction([this.handleEnteredSnack, this.props.onEntered], snack.id)}\n                        />\n                    ))}\n                </SnackbarContainer>\n            );\n        });\n\n        return (\n            <SnackbarContext.Provider value={contextValue}>\n                {children}\n                {domRoot ? createPortal(snackbars, domRoot) : snackbars}\n            </SnackbarContext.Provider>\n        );\n    }\n}\n\nexport default SnackbarProvider;\n","import { useState, ReactElement } from 'react';\nimport { useControl, Marker, MarkerProps, ControlPosition } from 'react-map-gl';\nimport MapboxGeocoder, { GeocoderOptions } from '@mapbox/mapbox-gl-geocoder';\nimport '@mapbox/mapbox-gl-geocoder/dist/mapbox-gl-geocoder.css';\n\ntype GeocoderControlProps = Omit<GeocoderOptions, 'accessToken' | 'mapboxgl' | 'marker'> & {\n  mapboxAccessToken: string;\n  marker?: boolean | Omit<MarkerProps, 'longitude' | 'latitude'>;\n\n  position: ControlPosition;\n\n  bbox?: [number, number, number, number];\n  proximity?: { longitude: number, latitude: number };\n\n  onLoading?: (e: object) => void;\n  onResults?: (e: object) => void;\n  onResult?: (e: object) => void;\n  onError?: (e: object) => void;\n};\n\n/* eslint-disable complexity,max-statements */\nexport default function GeocoderControl(props: GeocoderControlProps) {\n  const [marker, setMarker] = useState<ReactElement | null>(null);\n\n  const geocoder = useControl<MapboxGeocoder>(\n    () => {\n      const ctrl = new MapboxGeocoder({\n        ...props,\n        marker: false,\n        bbox: props.bbox,  // Restrict search area\n        proximity: props.proximity,  // Bias search results\n        accessToken: props.mapboxAccessToken,\n        flyTo: {\n          zoom: 16,\n          speed: 4,\n          bearing: 0,\n          pitch: 50,\n          easing: function (t) {\n            return t;\n          },\n        },\n      });\n      props.onLoading && ctrl.on('loading', props.onLoading);\n      props.onResults && ctrl.on('results', props.onResults);\n      ctrl.on('result', (evt: any) => {\n        if (props.onResult) props.onResult(evt);\n\n        const { result } = evt;\n        const location =\n          result &&\n          (result.center || (result.geometry?.type === 'Point' && result.geometry.coordinates));\n        if (location && props.marker) {\n          const markerProps = typeof props.marker === 'object' ? props.marker : {};\n          setMarker(<Marker {...markerProps} longitude={location[0]} latitude={location[1]} />);\n        } else {\n          setMarker(null);\n        }\n      });\n      props.onError && ctrl.on('error', props.onError);\n      return ctrl;\n    },\n    {\n      position: props.position,\n    }\n  );\n\n  // @ts-ignore (TS2339) private member\n  if (geocoder._map) {\n    if (geocoder.getProximity() !== props.proximity && props.proximity !== undefined) {\n      geocoder.setProximity(props.proximity);\n    }\n    if (geocoder.getRenderFunction() !== props.render && props.render !== undefined) {\n      geocoder.setRenderFunction(props.render);\n    }\n    if (geocoder.getLanguage() !== props.language && props.language !== undefined) {\n      geocoder.setLanguage(props.language);\n    }\n    if (geocoder.getZoom() !== props.zoom && props.zoom !== undefined) {\n      geocoder.setZoom(props.zoom);\n    }\n    if (geocoder.getFlyTo() !== props.flyTo && props.flyTo !== undefined) {\n      geocoder.setFlyTo(props.flyTo);\n    }\n    if (geocoder.getPlaceholder() !== props.placeholder && props.placeholder !== undefined) {\n      geocoder.setPlaceholder(props.placeholder);\n    }\n    if (geocoder.getCountries() !== props.countries && props.countries !== undefined) {\n      geocoder.setCountries(props.countries);\n    }\n    if (geocoder.getTypes() !== props.types && props.types !== undefined) {\n      geocoder.setTypes(props.types);\n    }\n    if (geocoder.getMinLength() !== props.minLength && props.minLength !== undefined) {\n      geocoder.setMinLength(props.minLength);\n    }\n    if (geocoder.getLimit() !== props.limit && props.limit !== undefined) {\n      geocoder.setLimit(props.limit);\n    }\n    if (geocoder.getFilter() !== props.filter && props.filter !== undefined) {\n      geocoder.setFilter(props.filter);\n    }\n    if (geocoder.getOrigin() !== props.origin && props.origin !== undefined) {\n      geocoder.setOrigin(props.origin);\n    }\n    // Types missing from @types/mapbox__mapbox-gl-geocoder\n    // if (geocoder.getAutocomplete() !== props.autocomplete && props.autocomplete !== undefined) {\n    //   geocoder.setAutocomplete(props.autocomplete);\n    // }\n    // if (geocoder.getFuzzyMatch() !== props.fuzzyMatch && props.fuzzyMatch !== undefined) {\n    //   geocoder.setFuzzyMatch(props.fuzzyMatch);\n    // }\n    // if (geocoder.getRouting() !== props.routing && props.routing !== undefined) {\n    //   geocoder.setRouting(props.routing);\n    // }\n    // if (geocoder.getWorldview() !== props.worldview && props.worldview !== undefined) {\n    //   geocoder.setWorldview(props.worldview);\n    // }\n  }\n  return marker;\n}\n\nconst noop = () => {};\n\nGeocoderControl.defaultProps = {\n  marker: true,\n  onLoading: noop,\n  onResults: noop,\n  onResult: noop,\n  onError: noop,\n};\n","import type { FillLayer } from \"react-map-gl\";\n// export const baseLayer: FillLayer = {\n//   id: \"base-layer\",\n//   source: \"composite\",\n//   \"source-layer\": \"building\",\n//   filter: [\"==\", \"extrude\", \"true\"],\n//   // @ts-expect-error: \"fill-extrusion\" is being used intentionally here despite the type mismatch.\n//   type: \"fill-extrusion\",\n//   minzoom: 0,\n//   maxzoom: 20,\n//   paint: {\n//     // @ts-expect-error: \"fill-extrusion-color\" is being used intentionally here despite the type mismatch.\n//     \"fill-extrusion-color\": \"#eeeeee\",\n//     \"fill-extrusion-height\": [\n//       \"interpolate\",\n//       [\"linear\"],\n//       [\"zoom\"],\n//       15,\n//       0,\n//       15.05,\n//       [\"*\", [\"get\", \"height\"],1],\n//     ],\n//     \"fill-extrusion-base\": [\n//       \"interpolate\",\n//       [\"linear\"],\n//       [\"zoom\"],\n//       15,\n//       0,\n//       15.05,\n//       [\"get\", \"min_height\"],\n//     ],\n//     \"fill-extrusion-opacity\": 0.4,\n//   },\n// };\n\nexport const permitSubmittedLayer: FillLayer = {\n  id: \"permitSubmitted\",\n  source: \"St_Kilda_Road\",\n  // \"source-layer\": \"St_Kilda_Road_V4\",\n  filter: [\"in\", \"ApplicationStage\", \"INITASSESS\", \"PAYMENTRECEIVED\",\"PUBNOTIFY\",\"INFREQUEST\", \"ATPRPTNG\", \"S5057ALODG\", \"REFERRED\", \"UNDERASSES\", \"CON1PLAN\", \"COND1RECVD\", \"COORDREVIEW\", \"ADVTPREP\"],\n  // @ts-expect-error: \"fill-extrusion\" is being used intentionally here despite the type mismatch.\n  type: \"fill-extrusion\",\n  minzoom: 0,\n  maxzoom: 24,\n  paint: {\n    // @ts-expect-error: \"fill-extrusion-color\" is being used intentionally here despite the type mismatch.\n    \"fill-extrusion-color\": \"#c85e19\",\n    \"fill-extrusion-height\": [\"*\", [\"get\", \"BuildingHeight\"], 1],\n    \"fill-extrusion-base\": 0,\n    \"fill-extrusion-opacity\": 1,\n  },\n};\n\nexport const baseLayer: FillLayer = {\n  id: \"baseLayer\",\n  source: \"St_Kilda_Road\",\n  // \"source-layer\": \"St_Kilda_Road_V4\",\n  filter: [\"!in\", \"ApplicationStage\", \"APPROVED\",\"PMTISSUED\",\"ISSUED\", \"INITASSESS\", \"PAYMENTRECEIVED\",\"PUBNOTIFY\",\"INFREQUEST\", \"ATPRPTNG\", \"S5057ALODG\", \"REFERRED\", \"UNDERASSES\", \"CON1PLAN\", \"COND1RECVD\", \"COORDREVIEW\", \"ADVTPREP\"],\n  // @ts-expect-error: \"fill-extrusion\" is being used intentionally here despite the type mismatch.\n  type: \"fill-extrusion\",\n  minzoom: 0,\n  maxzoom: 24,\n  paint: {\n    // @ts-expect-error: \"fill-extrusion-color\" is being used intentionally here despite the type mismatch.\n    \"fill-extrusion-color\": \"#eeeeee\",\n    \"fill-extrusion-height\": [\"*\", [\"get\", \"EAVE_Elev\"], 1],\n    \"fill-extrusion-base\": 0,\n    \"fill-extrusion-opacity\": 1,\n  },\n};\n\n// export const underAssessmentLayer: FillLayer = {\n//   id: \"underAssessment\",\n//   source: \"St_Kilda_Road\",\n//   // \"source-layer\": \"St_Kilda_Road_V4\",\n//   filter: [\"in\", \"ApplicationStage\", \"PUBNOTIFY\",\"INFREQUEST\", \"ATPRPTNG\", \"S5057ALODG\", \"REFERRED\", \"UNDERASSES\", \"CON1PLAN\", \"COND1RECVD\", \"COORDREVIEW\", \"ADVTPREP\"],\n//   // @ts-expect-error: \"fill-extrusion\" is being used intentionally here despite the type mismatch.\n//   type: \"fill-extrusion\",\n//   minzoom: 0,\n//   maxzoom: 20,\n//   paint: {\n//     // @ts-expect-error: \"fill-extrusion-color\" is being used intentionally here despite the type mismatch.\n//     \"fill-extrusion-color\": \"#fc5a86\",\n//     \"fill-extrusion-height\": [\"*\", [\"get\", \"EAVE_Elev\"], 1],\n//     \"fill-extrusion-base\": 0,\n//     \"fill-extrusion-opacity\": 1,\n//   },\n// };\n\nexport const permitApprovedLayer: FillLayer = {\n  id: \"permitApproved\",\n  source: \"St_Kilda_Road\",\n  // \"source-layer\": \"St_Kilda_Road_V4\",\n  filter: [\"in\", \"ApplicationStage\", \"APPROVED\",\"PMTISSUED\",\"ISSUED\"],\n  // @ts-expect-error: \"fill-extrusion\" is being used intentionally here despite the type mismatch.\n  type: \"fill-extrusion\",\n  minzoom: 0,\n  maxzoom: 20,\n  paint: {\n    // @ts-expect-error: \"fill-extrusion-color\" is being used intentionally here despite the type mismatch.\n    \"fill-extrusion-color\": \"#1a9798\",\n    \"fill-extrusion-height\": [\"*\", [\"get\", \"BuildingHeight\"], 1],\n    \"fill-extrusion-base\": 0,\n    \"fill-extrusion-opacity\": 1,\n  },\n};\n\n// export const permitIssuedLayer: FillLayer = {\n//   id: \"permitIssued\",\n//   source: \"St_Kilda_Road\",\n//   // \"source-layer\": \"St_Kilda_Road_V4\",\n//   filter: [\"in\", \"ApplicationStage\", \"PMTISSUED\",\"ISSUED\"],\n//   // @ts-expect-error: \"fill-extrusion\" is being used intentionally here despite the type mismatch.\n//   type: \"fill-extrusion\",\n//   minzoom: 0,\n//   maxzoom: 20,\n//   paint: {\n//     // @ts-expect-error: \"fill-extrusion-color\" is being used intentionally here despite the type mismatch.\n//     \"fill-extrusion-color\": \"#1b93cb\",\n//     \"fill-extrusion-height\": [\"*\", [\"get\", \"EAVE_Elev\"], 1],\n//     \"fill-extrusion-base\": 0,\n//     \"fill-extrusion-opacity\": 1,\n//   },\n// };\n\nexport const layers : Array<FillLayer> = [\n    permitSubmittedLayer,\n    // underAssessmentLayer,\n    permitApprovedLayer,\n    baseLayer\n    // permitIssuedLayer\n]","// extracted by mini-css-extract-plugin\nexport default {\"filterPanel\":\"FilterPanel_filterPanel__wjht4\",\"filterButton\":\"FilterPanel_filterButton__VHDnG\"};","export function randomId(prefix = 'mantine-'): string {\n  return `${prefix}${Math.random().toString(36).slice(2, 11)}`;\n}\n","import React from 'react';\n\nconst __useId: () => string | undefined = (React as any)['useId'.toString()] || (() => undefined);\n\nexport function useReactId() {\n  const id = __useId();\n  return id ? `mantine-${id.replace(/:/g, '')}` : '';\n}\n","import { useState } from 'react';\nimport { useIsomorphicEffect } from '../use-isomorphic-effect/use-isomorphic-effect';\nimport { randomId } from '../utils';\nimport { useReactId } from './use-react-id';\n\nexport function useId(staticId?: string) {\n  const reactId = useReactId();\n  const [uuid, setUuid] = useState(reactId);\n\n  useIsomorphicEffect(() => {\n    setUuid(randomId());\n  }, []);\n\n  if (typeof staticId === 'string') {\n    return staticId;\n  }\n\n  if (typeof window === 'undefined') {\n    return reactId;\n  }\n\n  return uuid;\n}\n","import type { MantineTheme } from '../../theme.types';\n\nexport function getAutoContrastValue(autoContrast: boolean | undefined, theme: MantineTheme) {\n  return typeof autoContrast === 'boolean' ? autoContrast : theme.autoContrast;\n}\n","import { createContext, useContext } from 'react';\n\nexport function createOptionalContext<ContextValue>(initialValue: ContextValue | null = null) {\n  const Context = createContext<ContextValue | null>(initialValue);\n\n  const useOptionalContext = () => useContext(Context);\n\n  const Provider = ({ children, value }: { value: ContextValue; children: React.ReactNode }) => (\n    <Context.Provider value={value}>{children}</Context.Provider>\n  );\n\n  return [Provider, useOptionalContext] as const;\n}\n","import { createOptionalContext, MantineSize } from '../../core';\n\ninterface InputContext {\n  size: MantineSize | (string & {});\n}\n\nexport const [InputContext, useInputContext] = createOptionalContext<InputContext>({\n  size: 'sm',\n});\n","import { forwardRef } from 'react';\n\nexport interface CloseIconProps extends React.ComponentPropsWithoutRef<'svg'> {\n  /** Icon width and height, `var(--icon-size)` by default */\n  size?: string;\n}\n\nexport const CloseIcon = forwardRef<SVGSVGElement, CloseIconProps>(\n  ({ size = 'var(--cb-icon-size, 70%)', style, ...others }, ref) => (\n    <svg\n      viewBox=\"0 0 15 15\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      style={{ ...style, width: size, height: size }}\n      ref={ref}\n      {...others}\n    >\n      <path\n        d=\"M11.7816 4.03157C12.0062 3.80702 12.0062 3.44295 11.7816 3.2184C11.5571 2.99385 11.193 2.99385 10.9685 3.2184L7.50005 6.68682L4.03164 3.2184C3.80708 2.99385 3.44301 2.99385 3.21846 3.2184C2.99391 3.44295 2.99391 3.80702 3.21846 4.03157L6.68688 7.49999L3.21846 10.9684C2.99391 11.193 2.99391 11.557 3.21846 11.7816C3.44301 12.0061 3.80708 12.0061 4.03164 11.7816L7.50005 8.31316L10.9685 11.7816C11.193 12.0061 11.5571 12.0061 11.7816 11.7816C12.0062 11.557 12.0062 11.193 11.7816 10.9684L8.31322 7.49999L11.7816 4.03157Z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n      />\n    </svg>\n  )\n);\n\nCloseIcon.displayName = '@mantine/core/CloseIcon';\n","import {\n  BoxProps,\n  createVarsResolver,\n  getRadius,\n  getSize,\n  MantineRadius,\n  MantineSize,\n  polymorphicFactory,\n  PolymorphicFactory,\n  rem,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../core';\nimport { UnstyledButton } from '../UnstyledButton';\nimport { CloseIcon } from './CloseIcon';\nimport classes from './CloseButton.module.css';\n\nexport type CloseButtonVariant = 'subtle' | 'transparent';\nexport type CloseButtonStylesNames = 'root';\nexport type CloseButtonCssVariables = {\n  root: '--cb-icon-size' | '--cb-size' | '--cb-radius';\n};\n\nexport interface __CloseButtonProps {\n  'data-disabled'?: boolean;\n\n  /** Controls width and height of the button. Numbers are converted to rem. `'md'` by default. */\n  size?: MantineSize | (string & {}) | number;\n\n  /** Key of `theme.radius` or any valid CSS value to set border-radius. Numbers are converted to rem. `theme.defaultRadius` by default. */\n  radius?: MantineRadius;\n\n  /** Sets `disabled` and `data-disabled` attributes on the button element */\n  disabled?: boolean;\n\n  /** `X` icon `width` and `height`, `80%` by default */\n  iconSize?: number | string;\n\n  /** Content rendered inside the button, for example `VisuallyHidden` with label for screen readers */\n  children?: React.ReactNode;\n\n  /** Replaces default close icon. If set, `iconSize` prop is ignored. */\n  icon?: React.ReactNode;\n}\n\nexport interface CloseButtonProps\n  extends __CloseButtonProps,\n    BoxProps,\n    StylesApiProps<CloseButtonFactory> {\n  __staticSelector?: string;\n}\n\nexport type CloseButtonFactory = PolymorphicFactory<{\n  props: CloseButtonProps;\n  defaultComponent: 'button';\n  defaultRef: HTMLButtonElement;\n  stylesNames: CloseButtonStylesNames;\n  variant: CloseButtonVariant;\n  vars: CloseButtonCssVariables;\n}>;\n\nconst defaultProps: Partial<CloseButtonProps> = {\n  variant: 'subtle',\n};\n\nconst varsResolver = createVarsResolver<CloseButtonFactory>((_, { size, radius, iconSize }) => ({\n  root: {\n    '--cb-size': getSize(size, 'cb-size'),\n    '--cb-radius': radius === undefined ? undefined : getRadius(radius),\n    '--cb-icon-size': rem(iconSize),\n  },\n}));\n\nexport const CloseButton = polymorphicFactory<CloseButtonFactory>((_props, ref) => {\n  const props = useProps('CloseButton', defaultProps, _props);\n  const {\n    iconSize,\n    children,\n    vars,\n    radius,\n    className,\n    classNames,\n    style,\n    styles,\n    unstyled,\n    'data-disabled': dataDisabled,\n    disabled,\n    variant,\n    icon,\n    mod,\n    __staticSelector,\n    ...others\n  } = props;\n\n  const getStyles = useStyles<CloseButtonFactory>({\n    name: __staticSelector || 'CloseButton',\n    props,\n    className,\n    style,\n    classes,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n  });\n\n  return (\n    <UnstyledButton\n      ref={ref}\n      {...others}\n      unstyled={unstyled}\n      variant={variant}\n      disabled={disabled}\n      mod={[{ disabled: disabled || dataDisabled }, mod]}\n      {...getStyles('root', { variant, active: !disabled && !dataDisabled })}\n    >\n      {icon || <CloseIcon />}\n      {children}\n    </UnstyledButton>\n  );\n});\n\nCloseButton.classes = classes;\nCloseButton.displayName = '@mantine/core/CloseButton';\n","import {\n  BoxProps,\n  ElementProps,\n  factory,\n  Factory,\n  MantineSize,\n  StylesApiProps,\n  useProps,\n  useResolvedStylesApi,\n} from '../../../core';\nimport { CloseButton, CloseButtonStylesNames } from '../../CloseButton';\nimport { useInputContext } from '../Input.context';\n\nexport interface InputClearButtonProps\n  extends BoxProps,\n    StylesApiProps<InputClearButtonFactory>,\n    ElementProps<'button'> {\n  /** Size of the button, by default value is based on input context */\n  size?: MantineSize | (string & {});\n}\n\nexport type InputClearButtonFactory = Factory<{\n  props: InputClearButtonProps;\n  ref: HTMLButtonElement;\n  stylesNames: CloseButtonStylesNames;\n}>;\n\nconst defaultProps: Partial<InputClearButtonProps> = {};\n\nexport const InputClearButton = factory<InputClearButtonFactory>((_props, ref) => {\n  const props = useProps('InputClearButton', defaultProps, _props);\n  const { size, variant, vars, classNames, styles, ...others } = props;\n  const ctx = useInputContext();\n\n  const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<InputClearButtonFactory>({\n    classNames,\n    styles,\n    props,\n  });\n\n  return (\n    <CloseButton\n      variant={variant || 'transparent'}\n      ref={ref}\n      size={size || ctx?.size || 'sm'}\n      classNames={resolvedClassNames}\n      styles={resolvedStyles}\n      __staticSelector=\"InputClearButton\"\n      {...others}\n    />\n  );\n});\n\nInputClearButton.displayName = '@mantine/core/InputClearButton';\n","import { FactoryPayload } from '../../factory';\nimport { useMantineTheme } from '../../MantineProvider';\nimport { ClassNames, Styles } from '../styles-api.types';\nimport { resolveClassNames } from '../use-styles/get-class-name/resolve-class-names/resolve-class-names';\nimport { resolveStyles } from '../use-styles/get-style/resolve-styles/resolve-styles';\n\nexport interface UseResolvedStylesApiInput<Payload extends FactoryPayload> {\n  classNames: ClassNames<Payload> | undefined;\n  styles: Styles<Payload> | undefined;\n  props: Record<string, any>;\n  stylesCtx?: Record<string, any>;\n}\n\nexport function useResolvedStylesApi<Payload extends FactoryPayload>({\n  classNames,\n  styles,\n  props,\n  stylesCtx,\n}: UseResolvedStylesApiInput<Payload>) {\n  const theme = useMantineTheme();\n\n  return {\n    resolvedClassNames: resolveClassNames({\n      theme,\n      classNames,\n      props,\n      stylesCtx: stylesCtx || undefined,\n    }),\n\n    resolvedStyles: resolveStyles({\n      theme,\n      styles,\n      props,\n      stylesCtx: stylesCtx || undefined,\n    }),\n  };\n}\n","import { createOptionalContext, GetStylesApi } from '../../core';\nimport type { InputWrapperFactory } from './InputWrapper/InputWrapper';\n\ninterface InputWrapperContextValue {\n  offsetTop: boolean;\n  offsetBottom: boolean;\n  describedBy: string | undefined;\n  inputId: string | undefined;\n  labelId: string | undefined;\n  getStyles: GetStylesApi<InputWrapperFactory> | null;\n}\n\nexport const [InputWrapperProvider, useInputWrapperContext] =\n  createOptionalContext<InputWrapperContextValue>({\n    offsetBottom: false,\n    offsetTop: false,\n    describedBy: undefined,\n    getStyles: null,\n    inputId: undefined,\n    labelId: undefined,\n  });\n","import {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  factory,\n  Factory,\n  getFontSize,\n  MantineSize,\n  rem,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../../core';\nimport { useInputWrapperContext } from '../InputWrapper.context';\nimport classes from '../Input.module.css';\n\nexport type InputDescriptionStylesNames = 'description';\nexport type InputDescriptionCssVariables = {\n  description: '--input-description-size';\n};\n\nexport interface InputDescriptionProps\n  extends BoxProps,\n    StylesApiProps<InputDescriptionFactory>,\n    ElementProps<'div'> {\n  __staticSelector?: string;\n  __inheritStyles?: boolean;\n\n  /** Controls description `font-size`, `'sm'` by default */\n  size?: MantineSize | (string & {});\n}\n\nexport type InputDescriptionFactory = Factory<{\n  props: InputDescriptionProps;\n  ref: HTMLParagraphElement;\n  stylesNames: InputDescriptionStylesNames;\n  vars: InputDescriptionCssVariables;\n}>;\n\nconst defaultProps: Partial<InputDescriptionProps> = {};\n\nconst varsResolver = createVarsResolver<InputDescriptionFactory>((_, { size }) => ({\n  description: {\n    '--input-description-size':\n      size === undefined ? undefined : `calc(${getFontSize(size)} - ${rem(2)})`,\n  },\n}));\n\nexport const InputDescription = factory<InputDescriptionFactory>((_props, ref) => {\n  const props = useProps('InputDescription', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    size,\n    __staticSelector,\n    __inheritStyles = true,\n    variant,\n    ...others\n  } = useProps('InputDescription', defaultProps, props);\n  const ctx = useInputWrapperContext();\n\n  const _getStyles = useStyles<InputDescriptionFactory>({\n    name: ['InputWrapper', __staticSelector],\n    props,\n    classes,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    rootSelector: 'description',\n    vars,\n    varsResolver,\n  });\n\n  const getStyles = (__inheritStyles && ctx?.getStyles) || _getStyles;\n\n  return (\n    <Box\n      component=\"p\"\n      ref={ref}\n      variant={variant}\n      size={size}\n      {...getStyles('description', ctx?.getStyles ? { className, style } : undefined)}\n      {...others}\n    />\n  );\n});\n\nInputDescription.classes = classes;\nInputDescription.displayName = '@mantine/core/InputDescription';\n","import {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  factory,\n  Factory,\n  getFontSize,\n  MantineSize,\n  rem,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../../core';\nimport { useInputWrapperContext } from '../InputWrapper.context';\nimport classes from '../Input.module.css';\n\nexport type InputErrorStylesNames = 'error';\nexport type InputErrorCssVariables = {\n  error: '--input-error-size';\n};\n\nexport interface InputErrorProps\n  extends BoxProps,\n    StylesApiProps<InputErrorFactory>,\n    ElementProps<'div'> {\n  __staticSelector?: string;\n  __inheritStyles?: boolean;\n\n  /** Controls error `font-size`, `'sm'` by default */\n  size?: MantineSize | (string & {});\n}\n\nexport type InputErrorFactory = Factory<{\n  props: InputErrorProps;\n  ref: HTMLParagraphElement;\n  stylesNames: InputErrorStylesNames;\n  vars: InputErrorCssVariables;\n}>;\n\nconst defaultProps: Partial<InputErrorProps> = {};\n\nconst varsResolver = createVarsResolver<InputErrorFactory>((_, { size }) => ({\n  error: {\n    '--input-error-size': size === undefined ? undefined : `calc(${getFontSize(size)} - ${rem(2)})`,\n  },\n}));\n\nexport const InputError = factory<InputErrorFactory>((_props, ref) => {\n  const props = useProps('InputError', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    size,\n    __staticSelector,\n    __inheritStyles = true,\n    variant,\n    ...others\n  } = props;\n\n  const _getStyles = useStyles<InputErrorFactory>({\n    name: ['InputWrapper', __staticSelector],\n    props,\n    classes,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    rootSelector: 'error',\n    vars,\n    varsResolver,\n  });\n\n  const ctx = useInputWrapperContext();\n  const getStyles = (__inheritStyles && ctx?.getStyles) || _getStyles;\n\n  return (\n    <Box\n      component=\"p\"\n      ref={ref}\n      variant={variant}\n      size={size}\n      {...getStyles('error', ctx?.getStyles ? { className, style } : undefined)}\n      {...others}\n    />\n  );\n});\n\nInputError.classes = classes;\nInputError.displayName = '@mantine/core/InputError';\n","import {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  factory,\n  Factory,\n  getFontSize,\n  MantineSize,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../../core';\nimport { useInputWrapperContext } from '../InputWrapper.context';\nimport classes from '../Input.module.css';\n\nexport type InputLabelStylesNames = 'label' | 'required';\nexport type InputLabelCssVariables = {\n  label: '--input-asterisk-color' | '--input-label-size';\n};\n\nexport interface InputLabelProps\n  extends BoxProps,\n    StylesApiProps<InputLabelFactory>,\n    ElementProps<'label'> {\n  __staticSelector?: string;\n\n  /** Determines whether the required asterisk should be displayed  */\n  required?: boolean;\n\n  /** Controls label `font-size`, `'sm'` by default */\n  size?: MantineSize | (string & {});\n\n  /** Root element of the label, `'label'` by default */\n  labelElement?: 'label' | 'div';\n}\n\nexport type InputLabelFactory = Factory<{\n  props: InputLabelProps;\n  ref: HTMLLabelElement;\n  stylesNames: InputLabelStylesNames;\n  vars: InputLabelCssVariables;\n}>;\n\nconst defaultProps: Partial<InputLabelProps> = {\n  labelElement: 'label',\n};\n\nconst varsResolver = createVarsResolver<InputLabelFactory>((_, { size }) => ({\n  label: {\n    '--input-label-size': getFontSize(size),\n    '--input-asterisk-color': undefined,\n  },\n}));\n\nexport const InputLabel = factory<InputLabelFactory>((_props, ref) => {\n  const props = useProps('InputLabel', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    labelElement,\n    size,\n    required,\n    htmlFor,\n    onMouseDown,\n    children,\n    __staticSelector,\n    variant,\n    mod,\n    ...others\n  } = useProps('InputLabel', defaultProps, props);\n\n  const _getStyles = useStyles<InputLabelFactory>({\n    name: ['InputWrapper', __staticSelector],\n    props,\n    classes,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    rootSelector: 'label',\n    vars,\n    varsResolver,\n  });\n\n  const ctx = useInputWrapperContext();\n  const getStyles = ctx?.getStyles || _getStyles;\n\n  return (\n    <Box\n      {...getStyles('label', ctx?.getStyles ? { className, style } : undefined)}\n      component={labelElement as 'label'}\n      variant={variant}\n      size={size}\n      ref={ref}\n      htmlFor={labelElement === 'label' ? htmlFor : undefined}\n      mod={[{ required }, mod]}\n      onMouseDown={(event) => {\n        onMouseDown?.(event);\n        if (!event.defaultPrevented && event.detail > 1) {\n          event.preventDefault();\n        }\n      }}\n      {...others}\n    >\n      {children}\n      {required && (\n        <span {...getStyles('required')} aria-hidden>\n          {' *'}\n        </span>\n      )}\n    </Box>\n  );\n});\n\nInputLabel.classes = classes;\nInputLabel.displayName = '@mantine/core/InputLabel';\n","import {\n  Box,\n  BoxProps,\n  ElementProps,\n  factory,\n  Factory,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../../core';\nimport classes from '../Input.module.css';\n\nexport type InputPlaceholderStylesNames = 'placeholder';\n\nexport interface InputPlaceholderProps\n  extends BoxProps,\n    StylesApiProps<InputPlaceholderFactory>,\n    ElementProps<'span'> {\n  __staticSelector?: string;\n\n  /** If set, the placeholder will have error styles, `false` by default */\n  error?: React.ReactNode;\n}\n\nexport type InputPlaceholderFactory = Factory<{\n  props: InputPlaceholderProps;\n  ref: HTMLSpanElement;\n  stylesNames: InputPlaceholderStylesNames;\n}>;\n\nconst defaultProps: Partial<InputPlaceholderProps> = {};\n\nexport const InputPlaceholder = factory<InputPlaceholderFactory>((_props, ref) => {\n  const props = useProps('InputPlaceholder', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    __staticSelector,\n    variant,\n    error,\n    mod,\n    ...others\n  } = useProps('InputPlaceholder', defaultProps, props);\n\n  const getStyles = useStyles<InputPlaceholderFactory>({\n    name: ['InputPlaceholder', __staticSelector],\n    props,\n    classes,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    rootSelector: 'placeholder',\n  });\n\n  return (\n    <Box\n      {...getStyles('placeholder')}\n      mod={[{ error: !!error }, mod]}\n      component=\"span\"\n      variant={variant}\n      ref={ref}\n      {...others}\n    />\n  );\n});\n\nInputPlaceholder.classes = classes;\nInputPlaceholder.displayName = '@mantine/core/InputPlaceholder';\n","export function getInputOffsets(\n  inputWrapperOrder: ('label' | 'input' | 'description' | 'error')[],\n  { hasDescription, hasError }: { hasDescription: boolean; hasError: boolean }\n) {\n  const inputIndex = inputWrapperOrder.findIndex((part) => part === 'input');\n  const aboveInput = inputWrapperOrder.slice(0, inputIndex);\n  const belowInput = inputWrapperOrder.slice(inputIndex + 1);\n  const offsetTop =\n    (hasDescription && aboveInput.includes('description')) ||\n    (hasError && aboveInput.includes('error'));\n  const offsetBottom =\n    (hasDescription && belowInput.includes('description')) ||\n    (hasError && belowInput.includes('error'));\n  return { offsetBottom, offsetTop };\n}\n","import { Fragment } from 'react';\nimport { useId } from '@mantine/hooks';\nimport {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  factory,\n  Factory,\n  getFontSize,\n  MantineSize,\n  rem,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../../core';\nimport {\n  InputDescription,\n  InputDescriptionCssVariables,\n  InputDescriptionStylesNames,\n} from '../InputDescription/InputDescription';\nimport {\n  InputError,\n  InputErrorCssVariables,\n  InputErrorStylesNames,\n} from '../InputError/InputError';\nimport {\n  InputLabel,\n  InputLabelCssVariables,\n  InputLabelStylesNames,\n} from '../InputLabel/InputLabel';\nimport { InputWrapperProvider } from '../InputWrapper.context';\nimport { getInputOffsets } from './get-input-offsets/get-input-offsets';\nimport classes from '../Input.module.css';\n\nexport type InputWrapperCssVariables = InputLabelCssVariables &\n  InputErrorCssVariables &\n  InputDescriptionCssVariables;\n\nexport type InputWrapperStylesNames =\n  | 'root'\n  | InputLabelStylesNames\n  | InputDescriptionStylesNames\n  | InputErrorStylesNames;\n\nexport interface __InputWrapperProps {\n  /** Contents of `Input.Label` component. If not set, label is not rendered. */\n  label?: React.ReactNode;\n\n  /** Contents of `Input.Description` component. If not set, description is not rendered. */\n  description?: React.ReactNode;\n\n  /** Contents of `Input.Error` component. If not set, error is not rendered. */\n  error?: React.ReactNode;\n\n  /** Adds required attribute to the input and a red asterisk on the right side of label, `false` by default */\n  required?: boolean;\n\n  /** Determines whether the required asterisk should be displayed. Overrides `required` prop. Does not add required attribute to the input. `false` by default */\n  withAsterisk?: boolean;\n\n  /** Props passed down to the `Input.Label` component */\n  labelProps?: Record<string, any>;\n\n  /** Props passed down to the `Input.Description` component */\n  descriptionProps?: Record<string, any>;\n\n  /** Props passed down to the `Input.Error` component */\n  errorProps?: Record<string, any>;\n\n  /** Input container component, `React.Fragment` by default */\n  inputContainer?: (children: React.ReactNode) => React.ReactNode;\n\n  /** Controls order of the elements, `['label', 'description', 'input', 'error']` by default */\n  inputWrapperOrder?: ('label' | 'input' | 'description' | 'error')[];\n}\n\nexport interface InputWrapperProps\n  extends __InputWrapperProps,\n    BoxProps,\n    StylesApiProps<InputWrapperFactory>,\n    ElementProps<'div'> {\n  __staticSelector?: string;\n\n  /** Props passed to Styles API context, replaces Input.Wrapper props */\n  __stylesApiProps?: Record<string, any>;\n\n  /** Static id used as base to generate `aria-` attributes, by default generates random id */\n  id?: string;\n\n  /** Controls size of `Input.Label`, `Input.Description` and `Input.Error` components */\n  size?: MantineSize | (string & {});\n\n  /** `Input.Label` root element, `'label'` by default */\n  labelElement?: 'label' | 'div';\n}\n\nexport type InputWrapperFactory = Factory<{\n  props: InputWrapperProps;\n  ref: HTMLDivElement;\n  stylesNames: InputWrapperStylesNames;\n  vars: InputWrapperCssVariables;\n}>;\n\nconst defaultProps: Partial<InputWrapperProps> = {\n  labelElement: 'label',\n  inputContainer: (children) => children,\n  inputWrapperOrder: ['label', 'description', 'input', 'error'],\n};\n\nconst varsResolver = createVarsResolver<InputWrapperFactory>((_, { size }) => ({\n  label: {\n    '--input-label-size': getFontSize(size),\n    '--input-asterisk-color': undefined,\n  },\n\n  error: {\n    '--input-error-size': size === undefined ? undefined : `calc(${getFontSize(size)} - ${rem(2)})`,\n  },\n\n  description: {\n    '--input-description-size':\n      size === undefined ? undefined : `calc(${getFontSize(size)} - ${rem(2)})`,\n  },\n}));\n\nexport const InputWrapper = factory<InputWrapperFactory>((_props, ref) => {\n  const props = useProps('InputWrapper', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    size,\n    variant,\n    __staticSelector,\n    inputContainer,\n    inputWrapperOrder,\n    label,\n    error,\n    description,\n    labelProps,\n    descriptionProps,\n    errorProps,\n    labelElement,\n    children,\n    withAsterisk,\n    id,\n    required,\n    __stylesApiProps,\n    mod,\n    ...others\n  } = props;\n\n  const getStyles = useStyles<InputWrapperFactory>({\n    name: ['InputWrapper', __staticSelector],\n    props: __stylesApiProps || props,\n    classes,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n  });\n\n  const sharedProps = {\n    size,\n    variant,\n    __staticSelector,\n  };\n\n  const idBase = useId(id);\n  const isRequired = typeof withAsterisk === 'boolean' ? withAsterisk : required;\n  const errorId = errorProps?.id || `${idBase}-error`;\n  const descriptionId = descriptionProps?.id || `${idBase}-description`;\n  const inputId = idBase;\n  const hasError = !!error && typeof error !== 'boolean';\n  const hasDescription = !!description;\n  const _describedBy = `${hasError ? errorId : ''} ${hasDescription ? descriptionId : ''}`;\n  const describedBy = _describedBy.trim().length > 0 ? _describedBy.trim() : undefined;\n  const labelId = labelProps?.id || `${idBase}-label`;\n\n  const _label = label && (\n    <InputLabel\n      key=\"label\"\n      labelElement={labelElement}\n      id={labelId}\n      htmlFor={inputId}\n      required={isRequired}\n      {...sharedProps}\n      {...labelProps}\n    >\n      {label}\n    </InputLabel>\n  );\n\n  const _description = hasDescription && (\n    <InputDescription\n      key=\"description\"\n      {...descriptionProps}\n      {...sharedProps}\n      size={descriptionProps?.size || sharedProps.size}\n      id={descriptionProps?.id || descriptionId}\n    >\n      {description}\n    </InputDescription>\n  );\n\n  const _input = <Fragment key=\"input\">{inputContainer!(children)}</Fragment>;\n\n  const _error = hasError && (\n    <InputError\n      {...errorProps}\n      {...sharedProps}\n      size={errorProps?.size || sharedProps.size}\n      key=\"error\"\n      id={errorProps?.id || errorId}\n    >\n      {error}\n    </InputError>\n  );\n\n  const content = inputWrapperOrder!.map((part) => {\n    switch (part) {\n      case 'label':\n        return _label;\n      case 'input':\n        return _input;\n      case 'description':\n        return _description;\n      case 'error':\n        return _error;\n      default:\n        return null;\n    }\n  });\n\n  return (\n    <InputWrapperProvider\n      value={{\n        getStyles,\n        describedBy,\n        inputId,\n        labelId,\n        ...getInputOffsets(inputWrapperOrder!, { hasDescription, hasError }),\n      }}\n    >\n      <Box\n        ref={ref}\n        variant={variant}\n        size={size}\n        mod={[{ error: !!error }, mod]}\n        {...getStyles('root')}\n        {...others}\n      >\n        {content}\n      </Box>\n    </InputWrapperProvider>\n  );\n});\n\nInputWrapper.classes = classes;\nInputWrapper.displayName = '@mantine/core/InputWrapper';\n","import {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  extractStyleProps,\n  getFontSize,\n  getRadius,\n  getSize,\n  MantineRadius,\n  MantineSize,\n  polymorphicFactory,\n  PolymorphicFactory,\n  rem,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../core';\nimport { InputContext } from './Input.context';\nimport { InputClearButton } from './InputClearButton/InputClearButton';\nimport { InputDescription } from './InputDescription/InputDescription';\nimport { InputError } from './InputError/InputError';\nimport { InputLabel } from './InputLabel/InputLabel';\nimport { InputPlaceholder } from './InputPlaceholder/InputPlaceholder';\nimport { useInputWrapperContext } from './InputWrapper.context';\nimport {\n  __InputWrapperProps,\n  InputWrapper,\n  InputWrapperStylesNames,\n} from './InputWrapper/InputWrapper';\nimport classes from './Input.module.css';\n\nexport interface __BaseInputProps extends __InputWrapperProps, Omit<__InputProps, 'wrapperProps'> {\n  /** Props passed down to the root element */\n  wrapperProps?: Record<string, any>;\n}\n\nexport type __InputStylesNames = InputStylesNames | InputWrapperStylesNames;\n\nexport type InputStylesNames = 'input' | 'wrapper' | 'section';\nexport type InputVariant = 'default' | 'filled' | 'unstyled';\nexport type InputCssVariables = {\n  wrapper:\n    | '--input-height'\n    | '--input-fz'\n    | '--input-radius'\n    | '--input-left-section-width'\n    | '--input-right-section-width'\n    | '--input-left-section-pointer-events'\n    | '--input-right-section-pointer-events'\n    | '--input-padding-y'\n    | '--input-margin-top'\n    | '--input-margin-bottom';\n};\n\nexport interface InputStylesCtx {\n  offsetTop: boolean | undefined;\n  offsetBottom: boolean | undefined;\n}\n\nexport interface __InputProps {\n  /** Content section rendered on the left side of the input */\n  leftSection?: React.ReactNode;\n\n  /** Left section width, used to set `width` of the section and input `padding-left`, by default equals to the input height */\n  leftSectionWidth?: React.CSSProperties['width'];\n\n  /** Props passed down to the `leftSection` element */\n  leftSectionProps?: React.ComponentPropsWithoutRef<'div'>;\n\n  /** Sets `pointer-events` styles on the `leftSection` element, `'none'` by default */\n  leftSectionPointerEvents?: React.CSSProperties['pointerEvents'];\n\n  /** Content section rendered on the right side of the input */\n  rightSection?: React.ReactNode;\n\n  /** Right section width, used to set `width` of the section and input `padding-right`, by default equals to the input height */\n  rightSectionWidth?: React.CSSProperties['width'];\n\n  /** Props passed down to the `rightSection` element */\n  rightSectionProps?: React.ComponentPropsWithoutRef<'div'>;\n\n  /** Sets `pointer-events` styles on the `rightSection` element, `'none'` by default */\n  rightSectionPointerEvents?: React.CSSProperties['pointerEvents'];\n\n  /** Props passed down to the root element of the `Input` component */\n  wrapperProps?: Record<string, any>;\n\n  /** Sets `required` attribute on the `input` element */\n  required?: boolean;\n\n  /** Key of `theme.radius` or any valid CSS value to set `border-radius`, numbers are converted to rem, `theme.defaultRadius` by default */\n  radius?: MantineRadius;\n\n  /** Sets `disabled` attribute on the `input` element */\n  disabled?: boolean;\n\n  /** Controls input `height` and horizontal `padding`, `'sm'` by default */\n  size?: MantineSize | (string & {});\n\n  /** Determines whether the input should have `cursor: pointer` style, `false` by default */\n  pointer?: boolean;\n\n  /** Determines whether the input should have red border and red text color when the `error` prop is set, `true` by default */\n  withErrorStyles?: boolean;\n\n  /** `size` prop added to the input element */\n  inputSize?: string;\n\n  /** Section to be displayed when the input is `__clearable` and `rightSection` is not defined */\n  __clearSection?: React.ReactNode;\n\n  /** Determines whether the `__clearSection` should be displayed if it is passed to the component, has no effect if `rightSection` is defined */\n  __clearable?: boolean;\n\n  /** Right section displayed when both `__clearSection` and `rightSection` are not defined */\n  __defaultRightSection?: React.ReactNode;\n}\n\nexport interface InputProps extends BoxProps, __InputProps, StylesApiProps<InputFactory> {\n  __staticSelector?: string;\n\n  /** Props passed to Styles API context, replaces `Input.Wrapper` props */\n  __stylesApiProps?: Record<string, any>;\n\n  /** Determines whether the input should have error styles and `aria-invalid` attribute */\n  error?: React.ReactNode;\n\n  /** Determines whether the input can have multiple lines, for example when `component=\"textarea\"`, `false` by default */\n  multiline?: boolean;\n\n  /** Input element id */\n  id?: string;\n\n  /** Determines whether `aria-` and other accessibility attributes should be added to the input, `true` by default */\n  withAria?: boolean;\n}\n\nexport type InputFactory = PolymorphicFactory<{\n  props: InputProps;\n  defaultRef: HTMLInputElement;\n  defaultComponent: 'input';\n  stylesNames: InputStylesNames;\n  variant: InputVariant;\n  vars: InputCssVariables;\n  ctx: InputStylesCtx;\n  staticComponents: {\n    Label: typeof InputLabel;\n    Error: typeof InputError;\n    Description: typeof InputDescription;\n    Placeholder: typeof InputPlaceholder;\n    Wrapper: typeof InputWrapper;\n    ClearButton: typeof InputClearButton;\n  };\n}>;\n\nconst defaultProps: Partial<InputProps> = {\n  variant: 'default',\n  leftSectionPointerEvents: 'none',\n  rightSectionPointerEvents: 'none',\n  withAria: true,\n  withErrorStyles: true,\n};\n\nconst varsResolver = createVarsResolver<InputFactory>((_, props, ctx) => ({\n  wrapper: {\n    '--input-margin-top': ctx.offsetTop ? 'calc(var(--mantine-spacing-xs) / 2)' : undefined,\n    '--input-margin-bottom': ctx.offsetBottom ? 'calc(var(--mantine-spacing-xs) / 2)' : undefined,\n    '--input-height': getSize(props.size, 'input-height'),\n    '--input-fz': getFontSize(props.size),\n    '--input-radius': props.radius === undefined ? undefined : getRadius(props.radius),\n    '--input-left-section-width':\n      props.leftSectionWidth !== undefined ? rem(props.leftSectionWidth) : undefined,\n    '--input-right-section-width':\n      props.rightSectionWidth !== undefined ? rem(props.rightSectionWidth) : undefined,\n    '--input-padding-y': props.multiline ? getSize(props.size, 'input-padding-y') : undefined,\n    '--input-left-section-pointer-events': props.leftSectionPointerEvents,\n    '--input-right-section-pointer-events': props.rightSectionPointerEvents,\n  },\n}));\n\nexport const Input = polymorphicFactory<InputFactory>((_props, ref) => {\n  const props = useProps('Input', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    required,\n    __staticSelector,\n    __stylesApiProps,\n    size,\n    wrapperProps,\n    error,\n    disabled,\n    leftSection,\n    leftSectionProps,\n    leftSectionWidth,\n    rightSection,\n    rightSectionProps,\n    rightSectionWidth,\n    rightSectionPointerEvents,\n    leftSectionPointerEvents,\n    variant,\n    vars,\n    pointer,\n    multiline,\n    radius,\n    id,\n    withAria,\n    withErrorStyles,\n    mod,\n    inputSize,\n    __clearSection,\n    __clearable,\n    __defaultRightSection,\n    ...others\n  } = props;\n\n  const { styleProps, rest } = extractStyleProps(others);\n  const ctx = useInputWrapperContext();\n  const stylesCtx: InputStylesCtx = { offsetBottom: ctx?.offsetBottom, offsetTop: ctx?.offsetTop };\n\n  const getStyles = useStyles<InputFactory>({\n    name: ['Input', __staticSelector],\n    props: __stylesApiProps || props,\n    classes,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    stylesCtx,\n    rootSelector: 'wrapper',\n    vars,\n    varsResolver,\n  });\n\n  const ariaAttributes = withAria\n    ? {\n        required,\n        disabled,\n        'aria-invalid': !!error,\n        'aria-describedby': ctx?.describedBy,\n        id: ctx?.inputId || id,\n      }\n    : {};\n\n  const _rightSection: React.ReactNode =\n    rightSection || (__clearable && __clearSection) || __defaultRightSection;\n\n  return (\n    <InputContext value={{ size: size || 'sm' }}>\n      <Box\n        {...getStyles('wrapper')}\n        {...styleProps}\n        {...wrapperProps}\n        mod={[\n          {\n            error: !!error && withErrorStyles,\n            pointer,\n            disabled,\n            multiline,\n            'data-with-right-section': !!_rightSection,\n            'data-with-left-section': !!leftSection,\n          },\n          mod,\n        ]}\n        variant={variant}\n        size={size}\n      >\n        {leftSection && (\n          <div\n            {...leftSectionProps}\n            data-position=\"left\"\n            {...getStyles('section', {\n              className: leftSectionProps?.className,\n              style: leftSectionProps?.style,\n            })}\n          >\n            {leftSection}\n          </div>\n        )}\n\n        <Box\n          component=\"input\"\n          {...rest}\n          {...ariaAttributes}\n          ref={ref}\n          required={required}\n          mod={{ disabled, error: !!error && withErrorStyles }}\n          variant={variant}\n          __size={inputSize}\n          {...getStyles('input')}\n        />\n\n        {_rightSection && (\n          <div\n            {...rightSectionProps}\n            data-position=\"right\"\n            {...getStyles('section', {\n              className: rightSectionProps?.className,\n              style: rightSectionProps?.style,\n            })}\n          >\n            {_rightSection}\n          </div>\n        )}\n      </Box>\n    </InputContext>\n  );\n});\n\nInput.classes = classes;\nInput.Wrapper = InputWrapper;\nInput.Label = InputLabel;\nInput.Error = InputError;\nInput.Description = InputDescription;\nInput.Placeholder = InputPlaceholder;\nInput.ClearButton = InputClearButton;\nInput.displayName = '@mantine/core/Input';\n","import { forwardRef } from 'react';\nimport {\n  Box,\n  BoxProps,\n  ElementProps,\n  Factory,\n  getFontSize,\n  getSize,\n  MantineSize,\n  StylesApiProps,\n  useStyles,\n} from '../../core';\nimport { Input } from '../Input';\nimport classes from './InlineInput.module.css';\n\nexport const InlineInputClasses = classes;\n\nexport type InlineInputStylesNames =\n  | 'root'\n  | 'body'\n  | 'labelWrapper'\n  | 'label'\n  | 'description'\n  | 'error';\n\nexport interface InlineInputProps\n  extends BoxProps,\n    StylesApiProps<InlineInputFactory>,\n    ElementProps<'div'> {\n  __staticSelector: string;\n  __stylesApiProps: Record<string, any>;\n  label: React.ReactNode;\n  description: React.ReactNode;\n  id: string;\n  disabled: boolean | undefined;\n  error: React.ReactNode;\n  size: MantineSize | (string & {}) | undefined;\n  labelPosition?: 'left' | 'right';\n  bodyElement?: any;\n  labelElement?: any;\n}\n\nexport type InlineInputFactory = Factory<{\n  props: any;\n  stylesNames: InlineInputStylesNames;\n}>;\n\nexport const InlineInput = forwardRef<HTMLDivElement, InlineInputProps>(\n  (\n    {\n      __staticSelector,\n      __stylesApiProps,\n      className,\n      classNames,\n      styles,\n      unstyled,\n      children,\n      label,\n      description,\n      id,\n      disabled,\n      error,\n      size,\n      labelPosition = 'left',\n      bodyElement = 'div',\n      labelElement = 'label',\n      variant,\n      style,\n      vars,\n      mod,\n      ...others\n    },\n    ref\n  ) => {\n    const getStyles = useStyles<InlineInputFactory>({\n      name: __staticSelector,\n      props: __stylesApiProps,\n      className,\n      style,\n      classes,\n      classNames,\n      styles,\n      unstyled,\n    });\n\n    return (\n      <Box\n        {...getStyles('root')}\n        ref={ref}\n        __vars={{\n          '--label-fz': getFontSize(size),\n          '--label-lh': getSize(size, 'label-lh'),\n        }}\n        mod={[{ 'label-position': labelPosition }, mod]}\n        variant={variant}\n        size={size}\n        {...others}\n      >\n        <Box\n          component={bodyElement}\n          htmlFor={bodyElement === 'label' ? id : undefined}\n          {...getStyles('body')}\n        >\n          {children}\n\n          <div {...getStyles('labelWrapper')} data-disabled={disabled || undefined}>\n            {label && (\n              <Box\n                component={labelElement}\n                htmlFor={labelElement === 'label' ? id : undefined}\n                {...getStyles('label')}\n                data-disabled={disabled || undefined}\n              >\n                {label}\n              </Box>\n            )}\n\n            {description && (\n              <Input.Description size={size} __inheritStyles={false} {...getStyles('description')}>\n                {description}\n              </Input.Description>\n            )}\n\n            {error && typeof error !== 'boolean' && (\n              <Input.Error size={size} __inheritStyles={false} {...getStyles('error')}>\n                {error}\n              </Input.Error>\n            )}\n          </div>\n        </Box>\n      </Box>\n    );\n  }\n);\n\nInlineInput.displayName = '@mantine/core/InlineInput';\n","import { useState } from 'react';\n\ninterface UseUncontrolledInput<T> {\n  /** Value for controlled state */\n  value?: T;\n\n  /** Initial value for uncontrolled state */\n  defaultValue?: T;\n\n  /** Final value for uncontrolled state when value and defaultValue are not provided */\n  finalValue?: T;\n\n  /** Controlled state onChange handler */\n  onChange?: (value: T, ...payload: any[]) => void;\n}\n\nexport function useUncontrolled<T>({\n  value,\n  defaultValue,\n  finalValue,\n  onChange = () => {},\n}: UseUncontrolledInput<T>): [T, (value: T, ...payload: any[]) => void, boolean] {\n  const [uncontrolledValue, setUncontrolledValue] = useState(\n    defaultValue !== undefined ? defaultValue : finalValue\n  );\n\n  const handleUncontrolledChange = (val: T, ...payload: any[]) => {\n    setUncontrolledValue(val);\n    onChange?.(val, ...payload);\n  };\n\n  if (value !== undefined) {\n    return [value as T, onChange, true];\n  }\n\n  return [uncontrolledValue as T, handleUncontrolledChange, false];\n}\n","import { createContext, useContext } from 'react';\nimport { MantineSize } from '../../core';\n\ninterface CheckboxGroupContextValue {\n  value: string[];\n  onChange: (event: React.ChangeEvent<HTMLInputElement> | string) => void;\n  size: MantineSize | (string & {}) | undefined;\n}\n\nconst CheckboxGroupContext = createContext<CheckboxGroupContextValue | null>(null);\nexport const CheckboxGroupProvider = CheckboxGroupContext.Provider;\nexport const useCheckboxGroupContext = () => useContext(CheckboxGroupContext);\n","import { createOptionalContext } from '../../../core';\n\nexport interface CheckboxCardContextValue {\n  checked: boolean;\n}\n\nexport const [CheckboxCardProvider, useCheckboxCardContext] =\n  createOptionalContext<CheckboxCardContextValue>();\n","import { useUncontrolled } from '@mantine/hooks';\nimport {\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  factory,\n  Factory,\n  getRadius,\n  MantineRadius,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../../core';\nimport { UnstyledButton } from '../../UnstyledButton';\nimport { useCheckboxGroupContext } from '../CheckboxGroup.context';\nimport { CheckboxCardProvider } from './CheckboxCard.context';\nimport classes from './CheckboxCard.module.css';\n\nexport type CheckboxCardStylesNames = 'card';\nexport type CheckboxCardCssVariables = {\n  card: '--card-radius';\n};\n\nexport interface CheckboxCardProps\n  extends BoxProps,\n    StylesApiProps<CheckboxCardFactory>,\n    ElementProps<'button', 'onChange'> {\n  /** Controlled component value */\n  checked?: boolean;\n\n  /** Uncontrolled component default value */\n  defaultChecked?: boolean;\n\n  /** Called when value changes */\n  onChange?: (checked: boolean) => void;\n\n  /** Determines whether the card should have border, `true` by default */\n  withBorder?: boolean;\n\n  /** Key of `theme.radius` or any valid CSS value to set `border-radius`, numbers are converted to rem, `theme.defaultRadius` by default */\n  radius?: MantineRadius;\n\n  /** Value of the checkbox, used with `Checkbox.Group` */\n  value?: string;\n}\n\nexport type CheckboxCardFactory = Factory<{\n  props: CheckboxCardProps;\n  ref: HTMLButtonElement;\n  stylesNames: CheckboxCardStylesNames;\n  vars: CheckboxCardCssVariables;\n}>;\n\nconst defaultProps: Partial<CheckboxCardProps> = {\n  withBorder: true,\n};\n\nconst varsResolver = createVarsResolver<CheckboxCardFactory>((_, { radius }) => ({\n  card: {\n    '--card-radius': getRadius(radius),\n  },\n}));\n\nexport const CheckboxCard = factory<CheckboxCardFactory>((_props, ref) => {\n  const props = useProps('CheckboxCard', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    checked,\n    mod,\n    withBorder,\n    value,\n    onClick,\n    defaultChecked,\n    onChange,\n    ...others\n  } = props;\n\n  const getStyles = useStyles<CheckboxCardFactory>({\n    name: 'CheckboxCard',\n    classes,\n    props,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n    rootSelector: 'card',\n  });\n\n  const ctx = useCheckboxGroupContext();\n  const _checked =\n    typeof checked === 'boolean' ? checked : ctx ? ctx.value.includes(value || '') : undefined;\n\n  const [_value, setValue] = useUncontrolled({\n    value: _checked,\n    defaultValue: defaultChecked,\n    finalValue: false,\n    onChange,\n  });\n\n  return (\n    <CheckboxCardProvider value={{ checked: _value }}>\n      <UnstyledButton\n        ref={ref}\n        mod={[{ 'with-border': withBorder, checked: _value }, mod]}\n        {...getStyles('card')}\n        {...others}\n        role=\"checkbox\"\n        aria-checked={_value}\n        onClick={(event) => {\n          onClick?.(event);\n          ctx?.onChange(value || '');\n          setValue(!_value);\n        }}\n      />\n    </CheckboxCardProvider>\n  );\n});\n\nCheckboxCard.displayName = '@mantine/core/CheckboxCard';\nCheckboxCard.classes = classes;\n","import { useInputWrapperContext } from '../Input';\n\ninterface InputsGroupFieldsetProps {\n  children: React.ReactNode;\n  role: 'radiogroup' | 'group';\n}\n\nexport function InputsGroupFieldset({ children, role }: InputsGroupFieldsetProps) {\n  const ctx = useInputWrapperContext();\n\n  if (!ctx) {\n    return <>{children}</>;\n  }\n\n  return (\n    <div role={role} aria-labelledby={ctx.labelId} aria-describedby={ctx.describedBy}>\n      {children}\n    </div>\n  );\n}\n","import { useUncontrolled } from '@mantine/hooks';\nimport { factory, Factory, MantineSize, useProps } from '../../../core';\nimport { Input, InputWrapperProps, InputWrapperStylesNames } from '../../Input';\nimport { InputsGroupFieldset } from '../../InputsGroupFieldset';\nimport { CheckboxGroupProvider } from '../CheckboxGroup.context';\n\nexport type CheckboxGroupStylesNames = InputWrapperStylesNames;\n\nexport interface CheckboxGroupProps extends Omit<InputWrapperProps, 'onChange'> {\n  /** `Checkbox` components and any other elements */\n  children: React.ReactNode;\n\n  /** Controlled component value */\n  value?: string[];\n\n  /** Default value for uncontrolled component */\n  defaultValue?: string[];\n\n  /** Called with an array of selected checkboxes values when value changes */\n  onChange?: (value: string[]) => void;\n\n  /** Props passed down to the root element (`Input.Wrapper` component) */\n  wrapperProps?: Record<string, any>;\n\n  /** Controls size of the `Input.Wrapper`, `'sm'` by default */\n  size?: MantineSize | (string & {});\n\n  /** If set, value cannot be changed */\n  readOnly?: boolean;\n}\n\nexport type CheckboxGroupFactory = Factory<{\n  props: CheckboxGroupProps;\n  ref: HTMLDivElement;\n  stylesNames: CheckboxGroupStylesNames;\n}>;\n\nconst defaultProps: Partial<CheckboxGroupProps> = {};\n\nexport const CheckboxGroup = factory<CheckboxGroupFactory>((props, ref) => {\n  const { value, defaultValue, onChange, size, wrapperProps, children, readOnly, ...others } =\n    useProps('CheckboxGroup', defaultProps, props);\n\n  const [_value, setValue] = useUncontrolled({\n    value,\n    defaultValue,\n    finalValue: [],\n    onChange,\n  });\n\n  const handleChange = (event: React.ChangeEvent<HTMLInputElement> | string) => {\n    const itemValue = typeof event === 'string' ? event : event.currentTarget.value;\n    !readOnly &&\n      setValue(\n        _value.includes(itemValue)\n          ? _value.filter((item) => item !== itemValue)\n          : [..._value, itemValue]\n      );\n  };\n\n  return (\n    <CheckboxGroupProvider value={{ value: _value, onChange: handleChange, size }}>\n      <Input.Wrapper\n        size={size}\n        ref={ref}\n        {...wrapperProps}\n        {...others}\n        labelElement=\"div\"\n        __staticSelector=\"CheckboxGroup\"\n      >\n        <InputsGroupFieldset role=\"group\">{children}</InputsGroupFieldset>\n      </Input.Wrapper>\n    </CheckboxGroupProvider>\n  );\n});\n\nCheckboxGroup.classes = Input.Wrapper.classes;\nCheckboxGroup.displayName = '@mantine/core/CheckboxGroup';\n","import { rem } from '../../core';\n\nexport interface CheckboxIconProps extends React.ComponentPropsWithoutRef<'svg'> {\n  indeterminate: boolean | undefined;\n}\n\nexport interface CheckIconProps extends React.ComponentPropsWithoutRef<'svg'> {\n  size?: number | string;\n}\n\nexport function CheckIcon({ size, style, ...others }: CheckIconProps) {\n  const _style = size !== undefined ? { width: rem(size), height: rem(size), ...style } : style;\n\n  return (\n    <svg\n      viewBox=\"0 0 10 7\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      style={_style}\n      aria-hidden\n      {...others}\n    >\n      <path\n        d=\"M4 4.586L1.707 2.293A1 1 0 1 0 .293 3.707l3 3a.997.997 0 0 0 1.414 0l5-5A1 1 0 1 0 8.293.293L4 4.586z\"\n        fill=\"currentColor\"\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n      />\n    </svg>\n  );\n}\n\nexport function CheckboxIcon({ indeterminate, ...others }: CheckboxIconProps) {\n  if (indeterminate) {\n    return (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        fill=\"none\"\n        viewBox=\"0 0 32 6\"\n        aria-hidden\n        {...others}\n      >\n        <rect width=\"32\" height=\"6\" fill=\"currentColor\" rx=\"3\" />\n      </svg>\n    );\n  }\n\n  return <CheckIcon {...others} />;\n}\n","import {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  factory,\n  Factory,\n  getAutoContrastValue,\n  getContrastColor,\n  getRadius,\n  getSize,\n  getThemeColor,\n  MantineColor,\n  MantineRadius,\n  MantineSize,\n  parseThemeColor,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../../core';\nimport { useCheckboxCardContext } from '../CheckboxCard/CheckboxCard.context';\nimport { CheckboxIcon } from '../CheckIcon';\nimport classes from './CheckboxIndicator.module.css';\n\nexport type CheckboxIndicatorStylesNames = 'indicator' | 'icon';\nexport type CheckboxIndicatorVariant = 'filled' | 'outline';\nexport type CheckboxIndicatorCssVariables = {\n  indicator: '--checkbox-size' | '--checkbox-radius' | '--checkbox-color' | '--checkbox-icon-color';\n};\n\nexport interface CheckboxIndicatorProps\n  extends BoxProps,\n    StylesApiProps<CheckboxIndicatorFactory>,\n    ElementProps<'div'> {\n  /** Key of `theme.colors` or any valid CSS color to set input background color in checked state, `theme.primaryColor` by default */\n  color?: MantineColor;\n\n  /** Controls size of the component, `'sm'` by default */\n  size?: MantineSize | (string & {});\n\n  /** Key of `theme.radius` or any valid CSS value to set `border-radius,` `theme.defaultRadius` by default */\n  radius?: MantineRadius;\n\n  /** Key of `theme.colors` or any valid CSS color to set icon color, by default value depends on `theme.autoContrast` */\n  iconColor?: MantineColor;\n\n  /** Determines whether icon color with filled variant should depend on `background-color`. If luminosity of the `color` prop is less than `theme.luminosityThreshold`, then `theme.white` will be used for text color, otherwise `theme.black`. Overrides `theme.autoContrast`. */\n  autoContrast?: boolean;\n\n  /** Indeterminate state of the checkbox. If set, `checked` prop is ignored. */\n  indeterminate?: boolean;\n\n  /** Icon displayed when checkbox is in checked or indeterminate state */\n  icon?: React.FC<{ indeterminate: boolean | undefined; className: string }>;\n\n  /** Determines whether the component should have checked styles */\n  checked?: boolean;\n\n  /** Determines whether the component should have disabled styles */\n  disabled?: boolean;\n}\n\nexport type CheckboxIndicatorFactory = Factory<{\n  props: CheckboxIndicatorProps;\n  ref: HTMLDivElement;\n  stylesNames: CheckboxIndicatorStylesNames;\n  vars: CheckboxIndicatorCssVariables;\n  variant: CheckboxIndicatorVariant;\n}>;\n\nconst defaultProps: Partial<CheckboxIndicatorProps> = {\n  icon: CheckboxIcon,\n};\n\nconst varsResolver = createVarsResolver<CheckboxIndicatorFactory>(\n  (theme, { radius, color, size, iconColor, variant, autoContrast }) => {\n    const parsedColor = parseThemeColor({ color: color || theme.primaryColor, theme });\n    const outlineColor =\n      parsedColor.isThemeColor && parsedColor.shade === undefined\n        ? `var(--mantine-color-${parsedColor.color}-outline)`\n        : parsedColor.color;\n\n    return {\n      indicator: {\n        '--checkbox-size': getSize(size, 'checkbox-size'),\n        '--checkbox-radius': radius === undefined ? undefined : getRadius(radius),\n        '--checkbox-color': variant === 'outline' ? outlineColor : getThemeColor(color, theme),\n        '--checkbox-icon-color': iconColor\n          ? getThemeColor(iconColor, theme)\n          : getAutoContrastValue(autoContrast, theme)\n            ? getContrastColor({ color, theme, autoContrast })\n            : undefined,\n      },\n    };\n  }\n);\n\nexport const CheckboxIndicator = factory<CheckboxIndicatorFactory>((_props, ref) => {\n  const props = useProps('CheckboxIndicator', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    icon,\n    indeterminate,\n    radius,\n    color,\n    iconColor,\n    autoContrast,\n    checked,\n    mod,\n    variant,\n    disabled,\n    ...others\n  } = props;\n  const Icon = icon!;\n\n  const getStyles = useStyles<CheckboxIndicatorFactory>({\n    name: 'CheckboxIndicator',\n    classes,\n    props,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n    rootSelector: 'indicator',\n  });\n\n  const ctx = useCheckboxCardContext();\n  const _checked =\n    typeof checked === 'boolean' || typeof indeterminate === 'boolean'\n      ? checked || indeterminate\n      : ctx?.checked || false;\n\n  return (\n    <Box\n      ref={ref}\n      {...getStyles('indicator', { variant })}\n      variant={variant}\n      mod={[{ checked: _checked, disabled }, mod]}\n      {...others}\n    >\n      <Icon indeterminate={indeterminate} {...getStyles('icon')} />\n    </Box>\n  );\n});\n\nCheckboxIndicator.displayName = '@mantine/core/CheckboxIndicator';\nCheckboxIndicator.classes = classes;\n","import { useEffect, useRef } from 'react';\nimport { useId } from '@mantine/hooks';\nimport {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  extractStyleProps,\n  factory,\n  Factory,\n  getAutoContrastValue,\n  getContrastColor,\n  getRadius,\n  getSize,\n  getThemeColor,\n  MantineColor,\n  MantineRadius,\n  MantineSize,\n  parseThemeColor,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../core';\nimport { InlineInput, InlineInputClasses, InlineInputStylesNames } from '../InlineInput';\nimport { CheckboxCard } from './CheckboxCard/CheckboxCard';\nimport { useCheckboxGroupContext } from './CheckboxGroup.context';\nimport { CheckboxGroup } from './CheckboxGroup/CheckboxGroup';\nimport { CheckboxIndicator } from './CheckboxIndicator/CheckboxIndicator';\nimport { CheckboxIcon } from './CheckIcon';\nimport classes from './Checkbox.module.css';\n\nexport type CheckboxVariant = 'filled' | 'outline';\nexport type CheckboxStylesNames = 'icon' | 'inner' | 'input' | InlineInputStylesNames;\nexport type CheckboxCssVariables = {\n  root: '--checkbox-size' | '--checkbox-radius' | '--checkbox-color' | '--checkbox-icon-color';\n};\n\nexport interface CheckboxProps\n  extends BoxProps,\n    StylesApiProps<CheckboxFactory>,\n    ElementProps<'input', 'size' | 'children'> {\n  /** Id used to connect input with the label. If not set, unique id is generated instead. */\n  id?: string;\n\n  /** Content of the `label` associated with the checkbox */\n  label?: React.ReactNode;\n\n  /** Key of `theme.colors` or any valid CSS color to set input background color in checked state, `theme.primaryColor` by default */\n  color?: MantineColor;\n\n  /** Controls size of the component, `'sm'` by default */\n  size?: MantineSize | (string & {});\n\n  /** Key of `theme.radius` or any valid CSS value to set `border-radius,` `theme.defaultRadius` by default */\n  radius?: MantineRadius;\n\n  /** Props passed down to the root element */\n  wrapperProps?: Record<string, any>;\n\n  /** Position of the label relative to the input, `'right'` by default */\n  labelPosition?: 'left' | 'right';\n\n  /** Description displayed below the label */\n  description?: React.ReactNode;\n\n  /** Error message displayed below the label */\n  error?: React.ReactNode;\n\n  /** Indeterminate state of the checkbox. If set, `checked` prop is ignored. */\n  indeterminate?: boolean;\n\n  /** Icon displayed when checkbox is in checked or indeterminate state */\n  icon?: React.FC<{ indeterminate: boolean | undefined; className: string }>;\n\n  /** Assigns ref of the root element */\n  rootRef?: React.ForwardedRef<HTMLDivElement>;\n\n  /** Key of `theme.colors` or any valid CSS color to set icon color, by default value depends on `theme.autoContrast` */\n  iconColor?: MantineColor;\n\n  /** Determines whether icon color with filled variant should depend on `background-color`. If luminosity of the `color` prop is less than `theme.luminosityThreshold`, then `theme.white` will be used for text color, otherwise `theme.black`. Overrides `theme.autoContrast`. */\n  autoContrast?: boolean;\n}\n\nexport type CheckboxFactory = Factory<{\n  props: CheckboxProps;\n  ref: HTMLInputElement;\n  stylesNames: CheckboxStylesNames;\n  vars: CheckboxCssVariables;\n  variant: CheckboxVariant;\n  staticComponents: {\n    Group: typeof CheckboxGroup;\n    Indicator: typeof CheckboxIndicator;\n    Card: typeof CheckboxCard;\n  };\n}>;\n\nconst defaultProps: Partial<CheckboxProps> = {\n  labelPosition: 'right',\n  icon: CheckboxIcon,\n};\n\nconst varsResolver = createVarsResolver<CheckboxFactory>(\n  (theme, { radius, color, size, iconColor, variant, autoContrast }) => {\n    const parsedColor = parseThemeColor({ color: color || theme.primaryColor, theme });\n    const outlineColor =\n      parsedColor.isThemeColor && parsedColor.shade === undefined\n        ? `var(--mantine-color-${parsedColor.color}-outline)`\n        : parsedColor.color;\n\n    return {\n      root: {\n        '--checkbox-size': getSize(size, 'checkbox-size'),\n        '--checkbox-radius': radius === undefined ? undefined : getRadius(radius),\n        '--checkbox-color': variant === 'outline' ? outlineColor : getThemeColor(color, theme),\n        '--checkbox-icon-color': iconColor\n          ? getThemeColor(iconColor, theme)\n          : getAutoContrastValue(autoContrast, theme)\n            ? getContrastColor({ color, theme, autoContrast })\n            : undefined,\n      },\n    };\n  }\n);\n\nexport const Checkbox = factory<CheckboxFactory>((_props, forwardedRef) => {\n  const props = useProps('Checkbox', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    color,\n    label,\n    id,\n    size,\n    radius,\n    wrapperProps,\n    checked,\n    labelPosition,\n    description,\n    error,\n    disabled,\n    variant,\n    indeterminate,\n    icon,\n    rootRef,\n    iconColor,\n    onChange,\n    autoContrast,\n    mod,\n    ...others\n  } = props;\n\n  const ctx = useCheckboxGroupContext();\n  const _size = size || ctx?.size;\n  const Icon = icon!;\n\n  const getStyles = useStyles<CheckboxFactory>({\n    name: 'Checkbox',\n    props,\n    classes,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n  });\n\n  const { styleProps, rest } = extractStyleProps(others);\n  const uuid = useId(id);\n\n  const contextProps = ctx\n    ? {\n        checked: ctx.value.includes(rest.value as string),\n        onChange: (event: React.ChangeEvent<HTMLInputElement>) => {\n          ctx.onChange(event);\n          onChange?.(event);\n        },\n      }\n    : {};\n\n  const fallbackRef = useRef<HTMLInputElement>(null);\n  const ref = forwardedRef || fallbackRef;\n\n  useEffect(() => {\n    if (ref && 'current' in ref && ref.current) {\n      ref.current.indeterminate = indeterminate || false;\n    }\n  }, [indeterminate, ref]);\n\n  return (\n    <InlineInput\n      {...getStyles('root')}\n      __staticSelector=\"Checkbox\"\n      __stylesApiProps={props}\n      id={uuid}\n      size={_size}\n      labelPosition={labelPosition}\n      label={label}\n      description={description}\n      error={error}\n      disabled={disabled}\n      classNames={classNames}\n      styles={styles}\n      unstyled={unstyled}\n      data-checked={contextProps.checked || checked || undefined}\n      variant={variant}\n      ref={rootRef}\n      mod={mod}\n      {...styleProps}\n      {...wrapperProps}\n    >\n      <Box {...getStyles('inner')} mod={{ 'data-label-position': labelPosition }}>\n        <Box\n          component=\"input\"\n          id={uuid}\n          ref={ref}\n          checked={checked}\n          disabled={disabled}\n          mod={{ error: !!error, indeterminate }}\n          {...getStyles('input', { focusable: true, variant })}\n          onChange={onChange}\n          {...rest}\n          {...contextProps}\n          type=\"checkbox\"\n        />\n\n        <Icon indeterminate={indeterminate} {...getStyles('icon')} />\n      </Box>\n    </InlineInput>\n  );\n});\n\nCheckbox.classes = { ...classes, ...InlineInputClasses };\nCheckbox.displayName = '@mantine/core/Checkbox';\nCheckbox.Group = CheckboxGroup;\nCheckbox.Indicator = CheckboxIndicator;\nCheckbox.Card = CheckboxCard;\n","// extracted by mini-css-extract-plugin\nexport default {\"card\":\"Checkbox_card__lmuil\",\"title\":\"Checkbox_title__hGCFS\",\"root\":\"Checkbox_root__ZqUef\",\"label\":\"Checkbox_label__LPlog\"};","import { Button, Paper, Title, useMantineTheme, Text, Checkbox, Center } from '@mantine/core';\nimport classes from './Checkbox.module.scss';\nimport { useState } from 'react';\nimport { theme } from '../../theme';\n\ninterface CustomisedCheckboxProps {\n  name: string;\n  title: string;\n  colourTheme: string;\n  isChecked: boolean;\n  onCheckboxChange?: (name: string, isChecked: boolean) => void;\n}\n\nexport default function CustomisedCheckbox({ name, title, colourTheme, isChecked, onCheckboxChange }: CustomisedCheckboxProps) {\n\n  const handleCheckboxChange = () => {\n    if(onCheckboxChange) {\n      onCheckboxChange(name, !isChecked);\n    }\n  };\n\n  return (\n    <Checkbox\n      size=\"xxl\"\n      classNames={classes}\n      style={{backgroundColor: `${colourTheme}90`, borderColor: colourTheme}}\n      color={colourTheme}\n      label={title}\n      checked={isChecked}\n      onChange={handleCheckboxChange}\n      wrapperProps={{\n        onClick: () => handleCheckboxChange(),\n      }}\n    />\n  );\n}\n","import { createContext, useContext } from 'react';\n\nexport function createSafeContext<ContextValue>(errorMessage: string) {\n  const Context = createContext<ContextValue | null>(null);\n\n  const useSafeContext = () => {\n    const ctx = useContext(Context);\n\n    if (ctx === null) {\n      throw new Error(errorMessage);\n    }\n\n    return ctx;\n  };\n\n  const Provider = ({ children, value }: { value: ContextValue; children: React.ReactNode }) => (\n    <Context.Provider value={value}>{children}</Context.Provider>\n  );\n\n  return [Provider, useSafeContext] as const;\n}\n","import { createSafeContext, GetStylesApi, MantineSize } from '../../core';\nimport type { GridFactory } from './Grid';\n\nexport type GridBreakpoints = Record<MantineSize, string>;\n\ninterface GridContextValue {\n  getStyles: GetStylesApi<GridFactory>;\n  grow: boolean | undefined;\n  columns: number;\n  breakpoints: GridBreakpoints | undefined;\n  type: 'container' | 'media' | undefined;\n}\n\nexport const [GridProvider, useGridContext] = createSafeContext<GridContextValue>(\n  'Grid component was not found in tree'\n);\n","import type { MantineBreakpoint } from '../../MantineProvider';\nimport { px } from '../units-converters';\n\nexport type BreakpointsSource = Record<MantineBreakpoint, number | string>;\n\nexport function getBreakpointValue(breakpoint: number | string, breakpoints: BreakpointsSource) {\n  if (breakpoint in breakpoints) {\n    return px(breakpoints[breakpoint as MantineBreakpoint]) as number;\n  }\n\n  return px(breakpoint) as number;\n}\n","import {\n  BreakpointsSource,\n  getBreakpointValue,\n} from '../get-breakpoint-value/get-breakpoint-value';\n\nexport function getSortedBreakpoints(values: string[], breakpoints: BreakpointsSource) {\n  const convertedBreakpoints = values.map((breakpoint) => ({\n    value: breakpoint,\n    px: getBreakpointValue(breakpoint, breakpoints),\n  }));\n\n  convertedBreakpoints.sort((a, b) => a.px - b.px);\n  return convertedBreakpoints;\n}\n","import type { StyleProp } from '../../Box';\n\nexport function getBaseValue<Value = any>(value: StyleProp<Value>) {\n  if (typeof value === 'object' && value !== null) {\n    if ('base' in value) {\n      return value.base;\n    }\n\n    return undefined;\n  }\n\n  return value;\n}\n","import {\n  filterProps,\n  getBaseValue,\n  getSortedBreakpoints,\n  InlineStyles,\n  keys,\n  useMantineTheme,\n} from '../../../core';\nimport { GridBreakpoints, useGridContext } from '../Grid.context';\nimport type { ColSpan, GridColProps } from './GridCol';\n\ninterface GridColVariablesProps {\n  selector: string;\n  span: GridColProps['span'] | undefined;\n  order?: GridColProps['order'] | undefined;\n  offset?: GridColProps['offset'] | undefined;\n}\n\nconst getColumnFlexBasis = (colSpan: ColSpan | undefined, columns: number) => {\n  if (colSpan === 'content') {\n    return 'auto';\n  }\n\n  if (colSpan === 'auto') {\n    return '0rem';\n  }\n\n  return colSpan ? `${100 / (columns / colSpan)}%` : undefined;\n};\n\nconst getColumnMaxWidth = (\n  colSpan: ColSpan | undefined,\n  columns: number,\n  grow: boolean | undefined\n) => {\n  if (grow || colSpan === 'auto') {\n    return '100%';\n  }\n\n  if (colSpan === 'content') {\n    return 'unset';\n  }\n\n  return getColumnFlexBasis(colSpan, columns);\n};\n\nconst getColumnFlexGrow = (colSpan: ColSpan | undefined, grow: boolean | undefined) => {\n  if (!colSpan) {\n    return undefined;\n  }\n\n  return colSpan === 'auto' || grow ? '1' : 'auto';\n};\n\nconst getColumnOffset = (offset: number | undefined, columns: number) =>\n  offset === 0 ? '0' : offset ? `${100 / (columns / offset)}%` : undefined;\n\nexport function GridColVariables({ span, order, offset, selector }: GridColVariablesProps) {\n  const theme = useMantineTheme();\n  const ctx = useGridContext();\n  const _breakpoints = ctx.breakpoints || theme.breakpoints;\n\n  const baseValue = getBaseValue(span);\n  const baseSpan = baseValue === undefined ? 12 : getBaseValue(span);\n\n  const baseStyles: Record<string, string | undefined> = filterProps({\n    '--col-order': getBaseValue(order)?.toString(),\n    '--col-flex-grow': getColumnFlexGrow(baseSpan, ctx.grow),\n    '--col-flex-basis': getColumnFlexBasis(baseSpan, ctx.columns),\n    '--col-width': baseSpan === 'content' ? 'auto' : undefined,\n    '--col-max-width': getColumnMaxWidth(baseSpan, ctx.columns, ctx.grow),\n    '--col-offset': getColumnOffset(getBaseValue(offset), ctx.columns),\n  });\n\n  const queries = keys(_breakpoints).reduce<Record<string, Record<string, any>>>(\n    (acc, breakpoint) => {\n      if (!acc[breakpoint]) {\n        acc[breakpoint] = {};\n      }\n\n      if (typeof order === 'object' && order[breakpoint] !== undefined) {\n        acc[breakpoint]['--col-order'] = order[breakpoint]?.toString();\n      }\n\n      if (typeof span === 'object' && span[breakpoint] !== undefined) {\n        acc[breakpoint]['--col-flex-grow'] = getColumnFlexGrow(span[breakpoint], ctx.grow);\n        acc[breakpoint]['--col-flex-basis'] = getColumnFlexBasis(span[breakpoint], ctx.columns);\n        acc[breakpoint]['--col-width'] = span[breakpoint] === 'content' ? 'auto' : undefined;\n        acc[breakpoint]['--col-max-width'] = getColumnMaxWidth(\n          span[breakpoint],\n          ctx.columns,\n          ctx.grow\n        );\n      }\n\n      if (typeof offset === 'object' && offset[breakpoint] !== undefined) {\n        acc[breakpoint]['--col-offset'] = getColumnOffset(offset[breakpoint], ctx.columns);\n      }\n\n      return acc;\n    },\n    {}\n  );\n\n  const sortedBreakpoints = getSortedBreakpoints(keys(queries), _breakpoints).filter(\n    (breakpoint) => keys(queries[breakpoint.value]).length > 0\n  );\n\n  const values = sortedBreakpoints.map((breakpoint) => ({\n    query:\n      ctx.type === 'container'\n        ? `mantine-grid (min-width: ${_breakpoints[breakpoint.value as keyof GridBreakpoints]})`\n        : `(min-width: ${_breakpoints[breakpoint.value as keyof GridBreakpoints]})`,\n    styles: queries[breakpoint.value],\n  }));\n\n  return (\n    <InlineStyles\n      styles={baseStyles}\n      media={ctx.type === 'container' ? undefined : values}\n      container={ctx.type === 'container' ? values : undefined}\n      selector={selector}\n    />\n  );\n}\n","import cx from 'clsx';\nimport {\n  Box,\n  BoxProps,\n  CompoundStylesApiProps,\n  ElementProps,\n  factory,\n  Factory,\n  StyleProp,\n  useProps,\n  useRandomClassName,\n} from '../../../core';\nimport { useGridContext } from '../Grid.context';\nimport { GridColVariables } from './GridColVariables';\nimport classes from '../Grid.module.css';\n\nexport type GridColStylesNames = 'col';\nexport type ColSpan = number | 'auto' | 'content';\n\nexport interface GridColProps\n  extends BoxProps,\n    CompoundStylesApiProps<GridColFactory>,\n    ElementProps<'div'> {\n  /** Column span, `12` by default */\n  span?: StyleProp<ColSpan>;\n\n  /** Column order, can be used to reorder columns at different viewport sizes */\n  order?: StyleProp<number>;\n\n  /** Column offset on the left side – number of columns that should be left empty before this column */\n  offset?: StyleProp<number>;\n}\n\nexport type GridColFactory = Factory<{\n  props: GridColProps;\n  ref: HTMLDivElement;\n  stylesNames: GridColStylesNames;\n  compound: true;\n}>;\n\nconst defaultProps: Partial<GridColProps> = {\n  span: 12,\n};\n\nexport const GridCol = factory<GridColFactory>((_props, ref) => {\n  const props = useProps('GridCol', defaultProps, _props);\n  const { classNames, className, style, styles, vars, span, order, offset, ...others } = props;\n  const ctx = useGridContext();\n  const responsiveClassName = useRandomClassName();\n  return (\n    <>\n      <GridColVariables\n        selector={`.${responsiveClassName}`}\n        span={span}\n        order={order}\n        offset={offset}\n      />\n\n      <Box\n        ref={ref}\n        {...ctx.getStyles('col', {\n          className: cx(className, responsiveClassName),\n          style,\n          classNames,\n          styles,\n        })}\n        {...others}\n      />\n    </>\n  );\n});\n\nGridCol.classes = classes;\nGridCol.displayName = '@mantine/core/GridCol';\n","import {\n  filterProps,\n  getBaseValue,\n  getSortedBreakpoints,\n  getSpacing,\n  InlineStyles,\n  keys,\n  useMantineTheme,\n} from '../../core';\nimport type { GridProps } from './Grid';\nimport type { GridBreakpoints } from './Grid.context';\n\ninterface GridVariablesProps extends GridProps {\n  selector: string;\n}\n\nexport function GridVariables({ gutter, selector, breakpoints, type }: GridVariablesProps) {\n  const theme = useMantineTheme();\n  const _breakpoints = breakpoints || theme.breakpoints;\n\n  const baseStyles: Record<string, string | undefined> = filterProps({\n    '--grid-gutter': getSpacing(getBaseValue(gutter)),\n  });\n\n  const queries = keys(_breakpoints).reduce<Record<string, Record<string, any>>>(\n    (acc, breakpoint) => {\n      if (!acc[breakpoint]) {\n        acc[breakpoint] = {};\n      }\n\n      if (typeof gutter === 'object' && gutter[breakpoint] !== undefined) {\n        acc[breakpoint]['--grid-gutter'] = getSpacing(gutter[breakpoint]);\n      }\n\n      return acc;\n    },\n    {}\n  );\n\n  const sortedBreakpoints = getSortedBreakpoints(keys(queries), _breakpoints).filter(\n    (breakpoint) => keys(queries[breakpoint.value]).length > 0\n  );\n\n  const values = sortedBreakpoints.map((breakpoint) => ({\n    query:\n      type === 'container'\n        ? `mantine-grid (min-width: ${_breakpoints[breakpoint.value as keyof GridBreakpoints]})`\n        : `(min-width: ${_breakpoints[breakpoint.value as keyof GridBreakpoints]})`,\n    styles: queries[breakpoint.value],\n  }));\n\n  return (\n    <InlineStyles\n      styles={baseStyles}\n      media={type === 'container' ? undefined : values}\n      container={type === 'container' ? values : undefined}\n      selector={selector}\n    />\n  );\n}\n","import {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  factory,\n  Factory,\n  MantineSpacing,\n  StyleProp,\n  StylesApiProps,\n  useProps,\n  useRandomClassName,\n  useStyles,\n} from '../../core';\nimport { GridBreakpoints, GridProvider } from './Grid.context';\nimport { GridCol } from './GridCol/GridCol';\nimport { GridVariables } from './GridVariables';\nimport classes from './Grid.module.css';\n\nexport type GridStylesNames = 'root' | 'col' | 'inner' | 'container';\nexport type GridCssVariables = {\n  root: '--grid-justify' | '--grid-align' | '--grid-overflow';\n};\n\nexport interface GridProps extends BoxProps, StylesApiProps<GridFactory>, ElementProps<'div'> {\n  /** Gutter between columns, key of `theme.spacing` or any valid CSS value, `'md'` by default */\n  gutter?: StyleProp<MantineSpacing>;\n\n  /** Determines whether columns in the last row should expand to fill all available space, `false` by default */\n  grow?: boolean;\n\n  /** Sets `justify-content`, `flex-start` by default */\n  justify?: React.CSSProperties['justifyContent'];\n\n  /** Sets `align-items`, `stretch` by default */\n  align?: React.CSSProperties['alignItems'];\n\n  /** Number of columns in each row, `12` by default */\n  columns?: number;\n\n  /** Sets `overflow` CSS property on the root element, `'visible'` by default */\n  overflow?: React.CSSProperties['overflow'];\n\n  /** Determines typeof of queries that are used for responsive styles, `'media'` by default */\n  type?: 'media' | 'container';\n\n  /** Breakpoints values, only applicable when `type=\"container\"` is set, ignored when `type` is not set or `type=\"media\"` is set. */\n  breakpoints?: GridBreakpoints;\n}\n\nexport type GridFactory = Factory<{\n  props: GridProps;\n  ref: HTMLDivElement;\n  stylesNames: GridStylesNames;\n  vars: GridCssVariables;\n  staticComponents: {\n    Col: typeof GridCol;\n  };\n}>;\n\nconst defaultProps: Partial<GridProps> = {\n  gutter: 'md',\n  grow: false,\n  columns: 12,\n};\n\nconst varsResolver = createVarsResolver<GridFactory>((_, { justify, align, overflow }) => ({\n  root: {\n    '--grid-justify': justify,\n    '--grid-align': align,\n    '--grid-overflow': overflow,\n  },\n}));\n\nexport const Grid = factory<GridFactory>((_props, ref) => {\n  const props = useProps('Grid', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    grow,\n    gutter,\n    columns,\n    align,\n    justify,\n    children,\n    breakpoints,\n    type,\n    ...others\n  } = props;\n\n  const getStyles = useStyles<GridFactory>({\n    name: 'Grid',\n    classes,\n    props,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n  });\n\n  const responsiveClassName = useRandomClassName();\n\n  if (type === 'container' && breakpoints) {\n    return (\n      <GridProvider value={{ getStyles, grow, columns: columns || 12, breakpoints, type }}>\n        <GridVariables selector={`.${responsiveClassName}`} {...props} />\n        <div {...getStyles('container')}>\n          <Box ref={ref} {...getStyles('root', { className: responsiveClassName })} {...others}>\n            <div {...getStyles('inner')}>{children}</div>\n          </Box>\n        </div>\n      </GridProvider>\n    );\n  }\n\n  return (\n    <GridProvider value={{ getStyles, grow, columns: columns || 12, breakpoints, type }}>\n      <GridVariables selector={`.${responsiveClassName}`} {...props} />\n      <Box ref={ref} {...getStyles('root', { className: responsiveClassName })} {...others}>\n        <div {...getStyles('inner')}>{children}</div>\n      </Box>\n    </GridProvider>\n  );\n});\n\nGrid.classes = classes;\nGrid.displayName = '@mantine/core/Grid';\nGrid.Col = GridCol;\n","import React, { useState, useEffect, FC } from 'react';\nimport classes from './FilterPanel.module.scss';\nimport CustomisedCheckbox from '../../../components/CustomisedCheckbox';\nimport { Grid, GridCol } from '@mantine/core';\n\ninterface FilterTitle {\n  [key: string]: {\n    title: string;\n    color: string;\n  };\n}\n\nconst filterTitle: FilterTitle = {\n  permitSubmitted: {\n    title: 'Applied For Permit',\n    color: '#c85e19',\n  },\n  // underAssessment: {\n  //   title: 'Under Assessment',\n  //   color: '#fc5a86',\n  // },\n  permitApproved: {\n    title: 'Permit Approved',\n    color: '#1a9798',\n  },\n  // permitIssued: {\n  //   title: 'Permit Issued',\n  //   color: '#1b93cb',\n  // }\n};\n\n\ninterface ToggleButtonProps {\n  name: string;\n  title: string;\n  value: boolean;\n  onChange: (name: string, checked: boolean) => void;\n}\n\nconst ToggleButton: FC<ToggleButtonProps> = ({ name, title, value, onChange }) => {\n  const toggle = () => {\n    onChange(name, !value);\n  };\n\n  return (\n    <div\n      key={name}\n      className={`${classes.toggleButton} ${name} ${!value ? 'deactive' : ''}`}\n      onClick={toggle}\n    >\n      <div className=\"icon\"></div>\n      <div className=\"label\">{title}</div>\n    </div>\n  );\n};\n\ninterface StyleControlsProps {\n  onChange: (visibilityChange: any) => void;\n}\n\nconst StyleControls: FC<StyleControlsProps> = (props) => {\n  const [visibility, setVisibility] = useState<Record<string, boolean>>({\n    permitSubmitted: true,\n    // underAssessment: true,\n    permitApproved: true,\n    permitIssued: true,\n  });\n\n  useEffect(() => {\n    // Convert true/false to \"visible\"/\"none\"\n    const visibilityState = Object.fromEntries(\n      Object.entries(visibility).map(([k, v]) => [k, v ? 'visible' : 'none'])\n    );\n    props.onChange(visibilityState);\n  }, [visibility]);\n\n  const handleOnCheckboxChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n\n  }\n\n  const onVisibilityChange = (name: any, value: any) => {\n    setVisibility({ ...visibility, [name]: value });\n  };\n\n  return (\n  <Grid className={classes.filterPanel}>\n    {Object.keys(filterTitle).map((name) => (\n      <GridCol span={6} key={name}>\n        <CustomisedCheckbox\n          name={name}\n          title={filterTitle[name].title}\n          isChecked={visibility[name]}\n          colourTheme={filterTitle[name].color}\n          onCheckboxChange={onVisibilityChange}\n        />\n      </GridCol>\n    ))}\n  </Grid>\n\n  // <ToggleButton key={name} name={name} title={fitlerTitle[name]} value={visibility[name]} onChange={onVisibilityChange} />\n  );\n};\n\nexport default React.memo(StyleControls);\n","import {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  getRadius,\n  getShadow,\n  MantineRadius,\n  MantineShadow,\n  polymorphicFactory,\n  PolymorphicFactory,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../core';\nimport classes from './Paper.module.css';\n\nexport type PaperStylesNames = 'root';\nexport type PaperCssVariables = {\n  root: '--paper-radius' | '--paper-shadow';\n};\n\nexport interface PaperBaseProps {\n  /** Key of `theme.shadows` or any valid CSS value to set `box-shadow`, `none` by default */\n  shadow?: MantineShadow;\n\n  /** Key of `theme.radius` or any valid CSS value to set border-radius, numbers are converted to rem, `theme.defaultRadius` by default */\n  radius?: MantineRadius;\n\n  /** Determines whether the paper should have border, border color depends on color scheme, `false` by default */\n  withBorder?: boolean;\n}\n\nexport interface PaperProps extends BoxProps, PaperBaseProps, StylesApiProps<PaperFactory> {}\n\nexport type PaperFactory = PolymorphicFactory<{\n  props: PaperProps;\n  defaultComponent: 'div';\n  defaultRef: HTMLDivElement;\n  stylesNames: PaperStylesNames;\n  vars: PaperCssVariables;\n}>;\n\nconst defaultProps: Partial<PaperProps> = {};\n\nconst varsResolver = createVarsResolver<PaperFactory>((_, { radius, shadow }) => ({\n  root: {\n    '--paper-radius': radius === undefined ? undefined : getRadius(radius),\n    '--paper-shadow': getShadow(shadow),\n  },\n}));\n\nexport const Paper = polymorphicFactory<PaperFactory>((_props, ref) => {\n  const props = useProps('Paper', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    withBorder,\n    vars,\n    radius,\n    shadow,\n    variant,\n    mod,\n    ...others\n  } = props;\n\n  const getStyles = useStyles<PaperFactory>({\n    name: 'Paper',\n    props,\n    classes,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n  });\n\n  return (\n    <Box\n      ref={ref}\n      mod={[{ 'data-with-border': withBorder }, mod]}\n      {...getStyles('root')}\n      variant={variant}\n      {...others}\n    />\n  );\n});\n\nPaper.classes = classes;\nPaper.displayName = '@mantine/core/Paper';\n","import { createSafeContext, GetStylesApi } from '../../core';\nimport type { CardFactory } from './Card';\n\ninterface CardContextValue {\n  getStyles: GetStylesApi<CardFactory>;\n}\n\nexport const [CardProvider, useCardContext] = createSafeContext<CardContextValue>(\n  'Card component was not found in tree'\n);\n","import {\n  Box,\n  BoxProps,\n  CompoundStylesApiProps,\n  polymorphicFactory,\n  PolymorphicFactory,\n  useProps,\n} from '../../../core';\nimport { useCardContext } from '../Card.context';\nimport classes from '../Card.module.css';\n\nexport type CardSectionStylesNames = 'section';\n\nexport interface CardSectionProps extends BoxProps, CompoundStylesApiProps<CardSectionFactory> {\n  /** Determines whether the section should have a border, `false` by default */\n  withBorder?: boolean;\n\n  /** Determines whether the section should inherit padding from the parent `Card`, `false` by default */\n  inheritPadding?: boolean;\n}\n\nexport type CardSectionFactory = PolymorphicFactory<{\n  props: CardSectionProps;\n  defaultRef: HTMLDivElement;\n  defaultComponent: 'div';\n  stylesNames: CardSectionStylesNames;\n  compound: true;\n}>;\n\nconst defaultProps: Partial<CardSectionProps> = {};\n\nexport const CardSection = polymorphicFactory<CardSectionFactory>((_props, ref) => {\n  const props = useProps('CardSection', defaultProps, _props);\n  const { classNames, className, style, styles, vars, withBorder, inheritPadding, mod, ...others } =\n    props;\n  const ctx = useCardContext();\n\n  return (\n    <Box\n      ref={ref}\n      mod={[{ 'with-border': withBorder, 'inherit-padding': inheritPadding }, mod]}\n      {...ctx.getStyles('section', { className, style, styles, classNames })}\n      {...others}\n    />\n  );\n});\n\nCardSection.classes = classes;\nCardSection.displayName = '@mantine/core/CardSection';\n","import { Children, cloneElement } from 'react';\nimport {\n  BoxProps,\n  createVarsResolver,\n  getSpacing,\n  MantineRadius,\n  MantineShadow,\n  MantineSpacing,\n  polymorphicFactory,\n  PolymorphicFactory,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../core';\nimport { Paper } from '../Paper';\nimport { CardProvider } from './Card.context';\nimport { CardSection } from './CardSection/CardSection';\nimport classes from './Card.module.css';\n\nexport type CardStylesNames = 'root' | 'section';\nexport type CardCssVariables = {\n  root: '--card-padding';\n};\n\nexport interface CardProps extends BoxProps, StylesApiProps<CardFactory> {\n  /** Key of `theme.shadows` or any valid CSS value to set `box-shadow`, `none` by default */\n  shadow?: MantineShadow;\n\n  /** Key of `theme.radius` or any valid CSS value to set border-radius, numbers are converted to rem, `theme.defaultRadius` by default */\n  radius?: MantineRadius;\n\n  /** Determines whether the card should have border, border color depends on color scheme, `false` by default */\n  withBorder?: boolean;\n\n  /** Controls `padding`, key of `theme.spacing` or any valid CSS value, `'md'` by default */\n  padding?: MantineSpacing;\n\n  /** Card content */\n  children?: React.ReactNode;\n}\n\nexport type CardFactory = PolymorphicFactory<{\n  props: CardProps;\n  defaultRef: HTMLDivElement;\n  defaultComponent: 'div';\n  stylesNames: CardStylesNames;\n  vars: CardCssVariables;\n  staticComponents: {\n    Section: typeof CardSection;\n  };\n}>;\n\nconst defaultProps: Partial<CardProps> = {};\n\nconst varsResolver = createVarsResolver<CardFactory>((_, { padding }) => ({\n  root: {\n    '--card-padding': getSpacing(padding),\n  },\n}));\n\nexport const Card = polymorphicFactory<CardFactory>((_props, ref) => {\n  const props = useProps('Card', defaultProps, _props);\n  const { classNames, className, style, styles, unstyled, vars, children, padding, ...others } =\n    props;\n\n  const getStyles = useStyles<CardFactory>({\n    name: 'Card',\n    props,\n    classes,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n  });\n\n  const _children = Children.toArray(children);\n  const content = _children.map((child, index) => {\n    if (typeof child === 'object' && child && 'type' in child && child.type === CardSection) {\n      return cloneElement(child, {\n        'data-first-section': index === 0 || undefined,\n        'data-last-section': index === _children.length - 1 || undefined,\n      } as any);\n    }\n\n    return child;\n  });\n\n  return (\n    <CardProvider value={{ getStyles }}>\n      <Paper ref={ref} unstyled={unstyled} {...getStyles('root')} {...others}>\n        {content}\n      </Paper>\n    </CardProvider>\n  );\n});\n\nCard.classes = classes;\nCard.displayName = '@mantine/core/Card';\nCard.Section = CardSection;\n","import {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  getRadius,\n  getSize,\n  getThemeColor,\n  MantineColor,\n  MantineGradient,\n  MantineRadius,\n  MantineSize,\n  polymorphicFactory,\n  PolymorphicFactory,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../core';\nimport classes from './Badge.module.css';\n\nexport type BadgeStylesNames = 'root' | 'section' | 'label';\nexport type BadgeVariant =\n  | 'filled'\n  | 'light'\n  | 'outline'\n  | 'dot'\n  | 'transparent'\n  | 'white'\n  | 'default'\n  | 'gradient';\n\nexport type BadgeCssVariables = {\n  root:\n    | '--badge-height'\n    | '--badge-padding-x'\n    | '--badge-fz'\n    | '--badge-radius'\n    | '--badge-bg'\n    | '--badge-color'\n    | '--badge-bd'\n    | '--badge-dot-color';\n};\n\nexport interface BadgeProps extends BoxProps, StylesApiProps<BadgeFactory> {\n  /** Controls `font-size`, `height` and horizontal `padding`, `'md'` by default */\n  size?: MantineSize | (string & {});\n\n  /** If set, badge `min-width` becomes equal to its `height` and horizontal padding is removed */\n  circle?: boolean;\n\n  /** Key of `theme.radius` or any valid CSS value to set `border-radius`, `'xl'` by default */\n  radius?: MantineRadius;\n\n  /** Key of `theme.colors` or any valid CSS color, `theme.primaryColor` by default */\n  color?: MantineColor;\n\n  /** Gradient configuration used when `variant=\"gradient\"`, default value is `theme.defaultGradient` */\n  gradient?: MantineGradient;\n\n  /** Content displayed on the left side of the badge label */\n  leftSection?: React.ReactNode;\n\n  /** Content displayed on the right side of the badge label */\n  rightSection?: React.ReactNode;\n\n  /** Determines whether Badge should take 100% of its parent width, `false` by default */\n  fullWidth?: boolean;\n\n  /** Main badge content */\n  children?: React.ReactNode;\n\n  /** Determines whether text color with filled variant should depend on `background-color`. If luminosity of the `color` prop is less than `theme.luminosityThreshold`, then `theme.white` will be used for text color, otherwise `theme.black`. Overrides `theme.autoContrast`. */\n  autoContrast?: boolean;\n}\n\nexport type BadgeFactory = PolymorphicFactory<{\n  props: BadgeProps;\n  defaultRef: HTMLDivElement;\n  defaultComponent: 'div';\n  stylesNames: BadgeStylesNames;\n  vars: BadgeCssVariables;\n  variant: BadgeVariant;\n}>;\n\nconst defaultProps: Partial<BadgeProps> = {};\n\nconst varsResolver = createVarsResolver<BadgeFactory>(\n  (theme, { radius, color, gradient, variant, size, autoContrast }) => {\n    const colors = theme.variantColorResolver({\n      color: color || theme.primaryColor,\n      theme,\n      gradient,\n      variant: variant || 'filled',\n      autoContrast,\n    });\n\n    return {\n      root: {\n        '--badge-height': getSize(size, 'badge-height'),\n        '--badge-padding-x': getSize(size, 'badge-padding-x'),\n        '--badge-fz': getSize(size, 'badge-fz'),\n        '--badge-radius': radius === undefined ? undefined : getRadius(radius),\n        '--badge-bg': color || variant ? colors.background : undefined,\n        '--badge-color': color || variant ? colors.color : undefined,\n        '--badge-bd': color || variant ? colors.border : undefined,\n        '--badge-dot-color': variant === 'dot' ? getThemeColor(color, theme) : undefined,\n      },\n    };\n  }\n);\n\nexport const Badge = polymorphicFactory<BadgeFactory>((_props, ref) => {\n  const props = useProps('Badge', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    radius,\n    color,\n    gradient,\n    leftSection,\n    rightSection,\n    children,\n    variant,\n    fullWidth,\n    autoContrast,\n    circle,\n    mod,\n    ...others\n  } = props;\n\n  const getStyles = useStyles<BadgeFactory>({\n    name: 'Badge',\n    props,\n    classes,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n  });\n\n  return (\n    <Box\n      variant={variant}\n      mod={[\n        {\n          block: fullWidth,\n          circle,\n          'with-right-section': !!rightSection,\n          'with-left-section': !!leftSection,\n        },\n        mod,\n      ]}\n      {...getStyles('root', { variant })}\n      ref={ref}\n      {...others}\n    >\n      {leftSection && (\n        <span {...getStyles('section')} data-position=\"left\">\n          {leftSection}\n        </span>\n      )}\n      <span {...getStyles('label')}>{children}</span>\n      {rightSection && (\n        <span {...getStyles('section')} data-position=\"right\">\n          {rightSection}\n        </span>\n      )}\n    </Box>\n  );\n});\n\nBadge.classes = classes;\nBadge.displayName = '@mantine/core/Badge';\n","import cx from 'clsx';\nimport { polymorphicFactory, PolymorphicFactory, useProps } from '../../core';\nimport { Text, TextCssVariables, TextProps, TextStylesNames, TextVariant } from '../Text';\nimport classes from './Anchor.module.css';\n\nexport type AnchorStylesNames = TextStylesNames;\nexport type AnchorVariant = TextVariant;\nexport type AnchorCssVariables = TextCssVariables;\n\nexport interface AnchorProps extends Omit<TextProps, 'span'> {\n  /** Determines in which cases link should have `text-decoration: underline` styles, `hover` by default */\n  underline?: 'always' | 'hover' | 'not-hover' | 'never';\n}\n\nexport type AnchorFactory = PolymorphicFactory<{\n  props: AnchorProps;\n  defaultComponent: 'a';\n  defaultRef: HTMLAnchorElement;\n  stylesNames: AnchorStylesNames;\n  vars: AnchorCssVariables;\n  variant: AnchorVariant;\n}>;\n\nconst defaultProps: Partial<AnchorProps> = {\n  underline: 'hover',\n};\n\nexport const Anchor = polymorphicFactory<AnchorFactory>((props, ref) => {\n  const { underline, className, unstyled, mod, ...others } = useProps(\n    'Anchor',\n    defaultProps,\n    props\n  );\n  return (\n    <Text\n      component=\"a\"\n      ref={ref}\n      className={cx({ [classes.root]: !unstyled }, className)}\n      {...others}\n      mod={[{ underline }, mod]}\n      __staticSelector=\"Anchor\"\n      unstyled={unstyled}\n    />\n  );\n});\n\nAnchor.classes = classes;\nAnchor.displayName = '@mantine/core/Anchor';\n","import { Anchor, Badge, Card, Group, Text } from \"@mantine/core\"\nimport React from 'react';\n\ninterface CustomisedCardProps {\n    title: string,\n    status: string,\n    stage: string,\n    applicationURL: string,\n    children: React.ReactNode\n}\n\nexport default function CustomisedCard({title, status, stage, applicationURL, children}: CustomisedCardProps) {\n    const statusMapping: { [key: string]: string[] } = {\n        '#c85e19': ['INITASSESS', 'PAYMENTRECEIVED', \"PUBNOTIFY\",\"ADVTPREP\", \"INFREQUEST\", \"ATPRPTNG\", \"S5057ALODG\", \"REFERRED\", \"UNDERASSES\", \"CON1PLAN\",\"COND1RECVD\", \"COORDREVIEW\"], // Example statuses for green\n        '#fc5a86': [], // Example statuses for blue\n        '#1a9798': ['APPROVED', \"PMTISSUED\",\"ISSUED\"], // Example statuses for gray\n        // '#1b93cb': [\"CANCELLED\"], // Example statuses for red\n        // Add more color keys and corresponding status arrays as needed\n    };\n    const getBadgeColor = (status: string) => {\n\n    \n        for (const [color, statuses] of Object.entries(statusMapping)) {\n            if (statuses.includes(status)) {\n                return color;\n            }\n        }\n    \n        return 'dark'; // Default color if status doesn't match\n    };\n    const getAppDetailUrl = (url :string) => {\n        if (!url) {\n            return \"https://copp.t1cloud.com/T1Default/CiAnywhere/Web/COPP/Public/LogOn/PRONLINESERVICE\";\n        }\n        return url;\n      };\n\n    const getStatusTitle = (status: string) => {\n        const statusColorMapping: { [key: string]: string } = {\n            '#c85e19': 'Applied For Permit',\n            '#fc5a86': 'Under Assessment',\n            '#1a9798': 'Permit Approved',\n            '#1b93cb': 'Permit Issued',\n            // Add more color keys and corresponding status arrays as needed\n        };\n\n        for (const [color, statuses] of Object.entries(statusMapping)) {\n            if (statuses.includes(status)) {\n                return statusColorMapping[color];\n            }\n        }\n\n        return 'Unknown Status'; // Default title if status doesn't match any\n    };\n    return (\n        <Card shadow=\"sm\" padding=\"lg\" radius=\"md\" withBorder style={{backgroundColor: \"rgba(74, 82, 94, 0.8)\", color: \"white\"}}>\n            <Group justify=\"space-between\" mt=\"md\" mb=\"xs\">\n                <Text fw={700}>{title}</Text>\n                <Badge color={getBadgeColor(stage)}>{getStatusTitle(stage)}</Badge>\n            </Group>\n            <Text size=\"sm\" c=\"dimmed\">\n                {children}\n            </Text>\n            <Badge style={{ padding: '10px', backgroundColor: 'rgb(216, 235, 227)', textTransform: 'none' }} mb=\"xs\">\n              <Anchor\n                href={getAppDetailUrl(applicationURL)}\n                target=\"_blank\"\n                size=\"sm\"\n                rel=\"noopener noreferrer\"\n                style={{\n                  color:\"black\"\n                }}\n              >\n                Visit OneCouncil Service\n              </Anchor>\n            </Badge>\n        </Card>\n    )\n} ","import { useEffect, useState } from 'react';\nimport {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  getRadius,\n  MantineRadius,\n  polymorphicFactory,\n  PolymorphicFactory,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../core';\nimport classes from './Image.module.css';\n\nexport type ImageStylesNames = 'root';\nexport type ImageCssVariables = {\n  root: '--image-radius' | '--image-object-fit';\n};\n\nexport interface ImageProps extends BoxProps, StylesApiProps<ImageFactory> {\n  /** Key of `theme.radius` or any valid CSS value to set `border-radius`, `0` by default */\n  radius?: MantineRadius;\n\n  /** Controls `object-fit` style, `'cover'` by default */\n  fit?: React.CSSProperties['objectFit'];\n\n  /** Image url that will be used as a fallback in case `src` prop is not set or image cannot be loaded */\n  fallbackSrc?: string;\n\n  /** Image url */\n  src?: any;\n\n  /** Called when image fails to load */\n  onError?: (event: React.SyntheticEvent<HTMLImageElement, Event>) => void;\n}\n\nexport type ImageFactory = PolymorphicFactory<{\n  props: ImageProps;\n  defaultRef: HTMLImageElement;\n  defaultComponent: 'img';\n  stylesNames: ImageStylesNames;\n  vars: ImageCssVariables;\n}>;\n\nconst defaultProps: Partial<ImageProps> = {};\n\nconst varsResolver = createVarsResolver<ImageFactory>((_, { radius, fit }) => ({\n  root: {\n    '--image-radius': radius === undefined ? undefined : getRadius(radius),\n    '--image-object-fit': fit,\n  },\n}));\n\nexport const Image = polymorphicFactory<ImageFactory>((_props, ref) => {\n  const props = useProps('Image', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    onError,\n    src,\n    radius,\n    fit,\n    fallbackSrc,\n    mod,\n    ...others\n  } = props;\n\n  const [error, setError] = useState(!src);\n\n  useEffect(() => setError(!src), [src]);\n\n  const getStyles = useStyles<ImageFactory>({\n    name: 'Image',\n    classes,\n    props,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n  });\n\n  if (error && fallbackSrc) {\n    return (\n      <Box\n        component=\"img\"\n        ref={ref}\n        src={fallbackSrc}\n        {...getStyles('root')}\n        onError={onError}\n        mod={['fallback', mod]}\n        {...others}\n      />\n    );\n  }\n\n  return (\n    <Box\n      component=\"img\"\n      ref={ref}\n      {...getStyles('root')}\n      src={src}\n      onError={(event) => {\n        onError?.(event);\n        setError(true);\n      }}\n      mod={mod}\n      {...others}\n    />\n  );\n});\n\nImage.classes = classes;\nImage.displayName = '@mantine/core/Image';\n","import React, { useState } from \"react\";\nimport {\n  Paper,\n  Text,\n  Group,\n  Image,\n} from \"@mantine/core\";\n\nexport function Banner() {\n  const [visible, setVisible] = useState(true); // Initialize visibility state\n\n  if (!visible) {\n    return null; // Don't render anything if the notification is not visible\n  }\n\n  return (\n    <Paper\n      radius=\"sm\"\n      shadow=\"xs\"\n      style={{\n        padding: \"6px\",\n        zIndex: 99999,\n        backgroundColor: \"#018EA2\",\n        backgroundImage: 'url(\"/banner.png\")',\n        backgroundSize: \"cover\",\n        backgroundPosition: \"center\",\n      }}\n    >\n      <Group align=\"center\">\n        <a\n          href=\"https://www.portphillip.vic.gov.au/\"\n        >\n          <Image\n            src=\"https://intranet.portphillip.vic.gov.au/media/zxto0ego/copplogo.png?mode=min&height=160&rnd=132413124847230000\"\n            alt=\"City of Port Phillip\"\n            width={40}\n            height={40}\n          />\n        </a>\n\n        <Text ml={10} size=\"lg\" fw=\"500\" style={{ color: \"white\" }}>\n          City of Port Phillip\n        </Text>\n        <Text mr={5} ml={5} size=\"lg\" fw=\"500\" style={{ color: \"white\" }}>\n          |\n        </Text>\n        <Text size=\"lg\" fw=\"500\" style={{ color: \"white\" }}>\n          Development Activity Model{\" \"}\n        </Text>\n      </Group>\n    </Paper>\n  );\n}\n","import { Ref, useCallback, type RefCallback } from 'react';\n\ntype PossibleRef<T> = Ref<T> | undefined;\n\ntype RefCleanup<T> = ReturnType<RefCallback<T>>;\n\nexport function assignRef<T>(ref: PossibleRef<T>, value: T): RefCleanup<T> {\n  if (typeof ref === 'function') {\n    return ref(value);\n  } else if (typeof ref === 'object' && ref !== null && 'current' in ref) {\n    ref.current = value;\n  }\n}\n\nexport function mergeRefs<T>(...refs: PossibleRef<T>[]) {\n  const cleanupMap = new Map<PossibleRef<T>, Exclude<RefCleanup<T>, void>>();\n\n  return (node: T | null) => {\n    refs.forEach((ref) => {\n      const cleanup = assignRef(ref, node);\n      if (cleanup) {\n        cleanupMap.set(ref, cleanup);\n      }\n    });\n\n    if (cleanupMap.size > 0) {\n      return () => {\n        refs.forEach((ref) => {\n          const cleanup = cleanupMap.get(ref);\n          if (cleanup) {\n            cleanup();\n          } else {\n            assignRef(ref, null);\n          }\n        });\n        cleanupMap.clear();\n      };\n    }\n  };\n}\n\nexport function useMergedRef<T>(...refs: PossibleRef<T>[]) {\n  return useCallback(mergeRefs(...refs), refs);\n}\n","import { Fragment } from 'react';\n\nexport function isElement(value: any): value is React.ReactElement {\n  if (Array.isArray(value) || value === null) {\n    return false;\n  }\n\n  if (typeof value === 'object') {\n    if (value.type === Fragment) {\n      return false;\n    }\n\n    return true;\n  }\n\n  return false;\n}\n","const elevations = {\n  app: 100,\n  modal: 200,\n  popover: 300,\n  overlay: 400,\n  max: 9999,\n} as const;\n\nexport function getDefaultZIndex(level: keyof typeof elevations) {\n  return elevations[level];\n}\n","import React from 'react';\n\nexport function getRefProp(element: any) {\n  const version = React.version;\n\n  if (typeof React.version !== 'string') {\n    return (element as any)?.ref;\n  }\n\n  if (version.startsWith('18.')) {\n    return (element as any)?.ref;\n  }\n\n  return (element as any)?.props?.ref;\n}\n","import { createContext, useContext, useState } from 'react';\nimport { useIsomorphicEffect } from '@mantine/hooks';\n\nexport type Direction = 'ltr' | 'rtl';\n\nexport interface DirectionContextValue {\n  dir: Direction;\n  toggleDirection: () => void;\n  setDirection: (dir: Direction) => void;\n}\n\nexport const DirectionContext = createContext<DirectionContextValue>({\n  dir: 'ltr',\n  toggleDirection: () => {},\n  setDirection: () => {},\n});\n\nexport function useDirection() {\n  return useContext(DirectionContext);\n}\n\nexport interface DirectionProviderProps {\n  /** Your application */\n  children: React.ReactNode;\n\n  /** Direction set as a default value, `ltr` by default */\n  initialDirection?: Direction;\n\n  /** Determines whether direction should be updated on mount based on `dir` attribute set on root element (usually html element), `true` by default  */\n  detectDirection?: boolean;\n}\n\nexport function DirectionProvider({\n  children,\n  initialDirection = 'ltr',\n  detectDirection = true,\n}: DirectionProviderProps) {\n  const [dir, setDir] = useState<Direction>(initialDirection);\n\n  const setDirection = (direction: Direction) => {\n    setDir(direction);\n    document.documentElement.setAttribute('dir', direction);\n  };\n\n  const toggleDirection = () => setDirection(dir === 'ltr' ? 'rtl' : 'ltr');\n\n  useIsomorphicEffect(() => {\n    if (detectDirection) {\n      const direction = document.documentElement.getAttribute('dir');\n      if (direction === 'rtl' || direction === 'ltr') {\n        setDirection(direction);\n      }\n    }\n  }, []);\n\n  return (\n    <DirectionContext.Provider value={{ dir, toggleDirection, setDirection }}>\n      {children}\n    </DirectionContext.Provider>\n  );\n}\n","import type { FloatingPlacement, FloatingPosition, FloatingSide } from '../types';\n\nexport function getFloatingPosition(\n  dir: 'rtl' | 'ltr',\n  position: FloatingPosition\n): FloatingPosition {\n  if (dir === 'rtl' && (position.includes('right') || position.includes('left'))) {\n    const [side, placement] = position.split('-') as [FloatingSide, FloatingPlacement];\n    const flippedPosition = side === 'right' ? 'left' : 'right';\n    return placement === undefined ? flippedPosition : `${flippedPosition}-${placement}`;\n  }\n\n  return position;\n}\n","import type { ArrowPosition, FloatingPlacement, FloatingPosition, FloatingSide } from '../types';\n\nfunction horizontalSide(\n  placement: FloatingPlacement | 'center',\n  arrowY: number | undefined,\n  arrowOffset: number,\n  arrowPosition: ArrowPosition\n) {\n  if (placement === 'center' || arrowPosition === 'center') {\n    return { top: arrowY };\n  }\n\n  if (placement === 'end') {\n    return { bottom: arrowOffset };\n  }\n\n  if (placement === 'start') {\n    return { top: arrowOffset };\n  }\n\n  return {};\n}\n\nfunction verticalSide(\n  placement: FloatingPlacement | 'center',\n  arrowX: number | undefined,\n  arrowOffset: number,\n  arrowPosition: ArrowPosition,\n  dir: 'rtl' | 'ltr'\n) {\n  if (placement === 'center' || arrowPosition === 'center') {\n    return { left: arrowX };\n  }\n\n  if (placement === 'end') {\n    return { [dir === 'ltr' ? 'right' : 'left']: arrowOffset };\n  }\n\n  if (placement === 'start') {\n    return { [dir === 'ltr' ? 'left' : 'right']: arrowOffset };\n  }\n\n  return {};\n}\n\nconst radiusByFloatingSide: Record<\n  FloatingSide,\n  keyof Pick<\n    React.CSSProperties,\n    | 'borderBottomLeftRadius'\n    | 'borderBottomRightRadius'\n    | 'borderTopLeftRadius'\n    | 'borderTopRightRadius'\n  >\n> = {\n  bottom: 'borderTopLeftRadius',\n  left: 'borderTopRightRadius',\n  right: 'borderBottomLeftRadius',\n  top: 'borderBottomRightRadius',\n};\n\nexport function getArrowPositionStyles({\n  position,\n  arrowSize,\n  arrowOffset,\n  arrowRadius,\n  arrowPosition,\n  arrowX,\n  arrowY,\n  dir,\n}: {\n  position: FloatingPosition;\n  arrowSize: number;\n  arrowOffset: number;\n  arrowRadius: number;\n  arrowPosition: ArrowPosition;\n  arrowX: number | undefined;\n  arrowY: number | undefined;\n  dir: 'rtl' | 'ltr';\n}) {\n  const [side, placement = 'center'] = position.split('-') as [FloatingSide, FloatingPlacement];\n  const baseStyles = {\n    width: arrowSize,\n    height: arrowSize,\n    transform: 'rotate(45deg)',\n    position: 'absolute',\n    [radiusByFloatingSide[side]]: arrowRadius,\n  };\n\n  const arrowPlacement = -arrowSize / 2;\n\n  if (side === 'left') {\n    return {\n      ...baseStyles,\n      ...horizontalSide(placement, arrowY, arrowOffset, arrowPosition),\n      right: arrowPlacement,\n      borderLeftColor: 'transparent',\n      borderBottomColor: 'transparent',\n      clipPath: 'polygon(100% 0, 0 0, 100% 100%)',\n    };\n  }\n\n  if (side === 'right') {\n    return {\n      ...baseStyles,\n      ...horizontalSide(placement, arrowY, arrowOffset, arrowPosition),\n      left: arrowPlacement,\n      borderRightColor: 'transparent',\n      borderTopColor: 'transparent',\n      clipPath: 'polygon(0 100%, 0 0, 100% 100%)',\n    };\n  }\n\n  if (side === 'top') {\n    return {\n      ...baseStyles,\n      ...verticalSide(placement, arrowX, arrowOffset, arrowPosition, dir),\n      bottom: arrowPlacement,\n      borderTopColor: 'transparent',\n      borderLeftColor: 'transparent',\n      clipPath: 'polygon(0 100%, 100% 100%, 100% 0)',\n    };\n  }\n\n  if (side === 'bottom') {\n    return {\n      ...baseStyles,\n      ...verticalSide(placement, arrowX, arrowOffset, arrowPosition, dir),\n      top: arrowPlacement,\n      borderBottomColor: 'transparent',\n      borderRightColor: 'transparent',\n      clipPath: 'polygon(0 100%, 0 0, 100% 0)',\n    };\n  }\n\n  return {};\n}\n","import { forwardRef } from 'react';\nimport { useDirection } from '../../../core';\nimport { ArrowPosition, FloatingPosition } from '../types';\nimport { getArrowPositionStyles } from './get-arrow-position-styles';\n\ninterface FloatingArrowProps extends React.ComponentPropsWithoutRef<'div'> {\n  position: FloatingPosition;\n  arrowSize: number;\n  arrowOffset: number;\n  arrowRadius: number;\n  arrowPosition: ArrowPosition;\n  arrowX: number | undefined;\n  arrowY: number | undefined;\n  visible: boolean | undefined;\n}\n\nexport const FloatingArrow = forwardRef<HTMLDivElement, FloatingArrowProps>(\n  (\n    {\n      position,\n      arrowSize,\n      arrowOffset,\n      arrowRadius,\n      arrowPosition,\n      visible,\n      arrowX,\n      arrowY,\n      style,\n      ...others\n    },\n    ref\n  ) => {\n    const { dir } = useDirection();\n    if (!visible) {\n      return null;\n    }\n\n    return (\n      <div\n        {...others}\n        ref={ref}\n        style={{\n          ...style,\n          ...getArrowPositionStyles({\n            position,\n            arrowSize,\n            arrowOffset,\n            arrowRadius,\n            arrowPosition,\n            dir,\n            arrowX,\n            arrowY,\n          }),\n        }}\n      />\n    );\n  }\n);\n\nFloatingArrow.displayName = '@mantine/core/FloatingArrow';\n","import { useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { assignRef, useIsomorphicEffect } from '@mantine/hooks';\nimport { Factory, factory, useProps } from '../../core';\n\nfunction createPortalNode(props: React.ComponentPropsWithoutRef<'div'>) {\n  const node = document.createElement('div');\n  node.setAttribute('data-portal', 'true');\n  typeof props.className === 'string' &&\n    node.classList.add(...props.className.split(' ').filter(Boolean));\n  typeof props.style === 'object' && Object.assign(node.style, props.style);\n  typeof props.id === 'string' && node.setAttribute('id', props.id);\n  return node;\n}\n\nexport interface PortalProps extends React.ComponentPropsWithoutRef<'div'> {\n  /** Portal children, for example, custom modal or popover */\n  children: React.ReactNode;\n\n  /** Element inside which portal should be created, by default a new div element is created and appended to the `document.body` */\n  target?: HTMLElement | string;\n\n  /** If set, all portals are rendered in the same DOM node, `false` by default */\n  reuseTargetNode?: boolean;\n}\n\nfunction getTargetNode({\n  target,\n  reuseTargetNode,\n  ...others\n}: Omit<PortalProps, 'children'>): HTMLElement {\n  if (target) {\n    if (typeof target === 'string') {\n      return document.querySelector<HTMLElement>(target) || createPortalNode(others);\n    }\n\n    return target;\n  }\n\n  if (reuseTargetNode) {\n    const existingNode = document.querySelector<HTMLElement>('[data-mantine-shared-portal-node]');\n\n    if (existingNode) {\n      return existingNode;\n    }\n\n    const node = createPortalNode(others);\n    node.setAttribute('data-mantine-shared-portal-node', 'true');\n    document.body.appendChild(node);\n    return node;\n  }\n\n  return createPortalNode(others);\n}\n\nexport type PortalFactory = Factory<{\n  props: PortalProps;\n  ref: HTMLDivElement;\n}>;\n\nconst defaultProps: Partial<PortalProps> = {};\n\nexport const Portal = factory<PortalFactory>((props, ref) => {\n  const { children, target, reuseTargetNode, ...others } = useProps('Portal', defaultProps, props);\n\n  const [mounted, setMounted] = useState(false);\n  const nodeRef = useRef<HTMLElement | null>(null);\n\n  useIsomorphicEffect(() => {\n    setMounted(true);\n    nodeRef.current = getTargetNode({ target, reuseTargetNode, ...others });\n    assignRef(ref, nodeRef.current);\n\n    if (!target && !reuseTargetNode && nodeRef.current) {\n      document.body.appendChild(nodeRef.current);\n    }\n\n    return () => {\n      if (!target && !reuseTargetNode && nodeRef.current) {\n        document.body.removeChild(nodeRef.current);\n      }\n    };\n  }, [target]);\n\n  if (!mounted || !nodeRef.current) {\n    return null;\n  }\n\n  return createPortal(<>{children}</>, nodeRef.current);\n});\n\nPortal.displayName = '@mantine/core/Portal';\n","import { factory, Factory, useMantineEnv } from '../../core';\nimport { Portal, PortalProps } from './Portal';\n\nexport interface OptionalPortalProps extends PortalProps {\n  /** Determines whether children should be rendered inside `<Portal />` */\n  withinPortal?: boolean;\n}\n\nexport type OptionalPortalFactory = Factory<{\n  props: OptionalPortalProps;\n  ref: HTMLDivElement;\n}>;\n\nexport const OptionalPortal = factory<OptionalPortalFactory>(\n  ({ withinPortal = true, children, ...others }, ref) => {\n    const env = useMantineEnv();\n\n    if (env === 'test' || !withinPortal) {\n      return <>{children}</>;\n    }\n\n    return (\n      <Portal ref={ref} {...others}>\n        {children}\n      </Portal>\n    );\n  }\n);\n\nOptionalPortal.displayName = '@mantine/core/OptionalPortal';\n","import type { SetRequired } from 'type-fest';\nimport type { TransitionOverride } from '../Transition';\n\ntype MinimalTransitionOverride = SetRequired<TransitionOverride, 'duration' | 'transition'>;\n\nconst defaultTransition: MinimalTransitionOverride = {\n  duration: 100,\n  transition: 'fade',\n};\n\nexport function getTransitionProps(\n  transitionProps: TransitionOverride | undefined,\n  componentTransition: TransitionOverride | undefined\n): MinimalTransitionOverride {\n  return { ...defaultTransition, ...componentTransition, ...transitionProps };\n}\n","import type { MantineTheme } from '../../MantineProvider';\nimport type { MantineStyleProp } from '../Box.types';\n\nexport function getStyleObject(\n  style: MantineStyleProp | undefined,\n  theme: MantineTheme\n): React.CSSProperties {\n  if (Array.isArray(style)) {\n    return [...style].reduce<Record<string, any>>(\n      (acc, item) => ({ ...acc, ...getStyleObject(item, theme) }),\n      {}\n    );\n  }\n\n  if (typeof style === 'function') {\n    return style(theme);\n  }\n\n  if (style == null) {\n    return {};\n  }\n\n  return style;\n}\n","function hasWindow() {\n  return typeof window !== 'undefined';\n}\nfunction getNodeName(node) {\n  if (isNode(node)) {\n    return (node.nodeName || '').toLowerCase();\n  }\n  // Mocked nodes in testing environments may not be instances of Node. By\n  // returning `#document` an infinite loop won't occur.\n  // https://github.com/floating-ui/floating-ui/issues/2317\n  return '#document';\n}\nfunction getWindow(node) {\n  var _node$ownerDocument;\n  return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n  var _ref;\n  return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n  if (!hasWindow()) {\n    return false;\n  }\n  return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n  if (!hasWindow()) {\n    return false;\n  }\n  return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n  if (!hasWindow()) {\n    return false;\n  }\n  return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n  if (!hasWindow() || typeof ShadowRoot === 'undefined') {\n    return false;\n  }\n  return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nfunction isOverflowElement(element) {\n  const {\n    overflow,\n    overflowX,\n    overflowY,\n    display\n  } = getComputedStyle(element);\n  return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !['inline', 'contents'].includes(display);\n}\nfunction isTableElement(element) {\n  return ['table', 'td', 'th'].includes(getNodeName(element));\n}\nfunction isTopLayer(element) {\n  return [':popover-open', ':modal'].some(selector => {\n    try {\n      return element.matches(selector);\n    } catch (e) {\n      return false;\n    }\n  });\n}\nfunction isContainingBlock(elementOrCss) {\n  const webkit = isWebKit();\n  const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n  // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n  // https://drafts.csswg.org/css-transforms-2/#individual-transforms\n  return ['transform', 'translate', 'scale', 'rotate', 'perspective'].some(value => css[value] ? css[value] !== 'none' : false) || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || ['transform', 'translate', 'scale', 'rotate', 'perspective', 'filter'].some(value => (css.willChange || '').includes(value)) || ['paint', 'layout', 'strict', 'content'].some(value => (css.contain || '').includes(value));\n}\nfunction getContainingBlock(element) {\n  let currentNode = getParentNode(element);\n  while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n    if (isContainingBlock(currentNode)) {\n      return currentNode;\n    } else if (isTopLayer(currentNode)) {\n      return null;\n    }\n    currentNode = getParentNode(currentNode);\n  }\n  return null;\n}\nfunction isWebKit() {\n  if (typeof CSS === 'undefined' || !CSS.supports) return false;\n  return CSS.supports('-webkit-backdrop-filter', 'none');\n}\nfunction isLastTraversableNode(node) {\n  return ['html', 'body', '#document'].includes(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n  return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n  if (isElement(element)) {\n    return {\n      scrollLeft: element.scrollLeft,\n      scrollTop: element.scrollTop\n    };\n  }\n  return {\n    scrollLeft: element.scrollX,\n    scrollTop: element.scrollY\n  };\n}\nfunction getParentNode(node) {\n  if (getNodeName(node) === 'html') {\n    return node;\n  }\n  const result =\n  // Step into the shadow DOM of the parent of a slotted node.\n  node.assignedSlot ||\n  // DOM Element detected.\n  node.parentNode ||\n  // ShadowRoot detected.\n  isShadowRoot(node) && node.host ||\n  // Fallback.\n  getDocumentElement(node);\n  return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n  const parentNode = getParentNode(node);\n  if (isLastTraversableNode(parentNode)) {\n    return node.ownerDocument ? node.ownerDocument.body : node.body;\n  }\n  if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n    return parentNode;\n  }\n  return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n  var _node$ownerDocument2;\n  if (list === void 0) {\n    list = [];\n  }\n  if (traverseIframes === void 0) {\n    traverseIframes = true;\n  }\n  const scrollableAncestor = getNearestOverflowAncestor(node);\n  const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n  const win = getWindow(scrollableAncestor);\n  if (isBody) {\n    const frameElement = getFrameElement(win);\n    return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);\n  }\n  return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n}\nfunction getFrameElement(win) {\n  return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n","import { isShadowRoot, isHTMLElement } from '@floating-ui/utils/dom';\n\nfunction activeElement(doc) {\n  let activeElement = doc.activeElement;\n  while (((_activeElement = activeElement) == null || (_activeElement = _activeElement.shadowRoot) == null ? void 0 : _activeElement.activeElement) != null) {\n    var _activeElement;\n    activeElement = activeElement.shadowRoot.activeElement;\n  }\n  return activeElement;\n}\nfunction contains(parent, child) {\n  if (!parent || !child) {\n    return false;\n  }\n  const rootNode = child.getRootNode == null ? void 0 : child.getRootNode();\n\n  // First, attempt with faster native method\n  if (parent.contains(child)) {\n    return true;\n  }\n\n  // then fallback to custom implementation with Shadow DOM support\n  if (rootNode && isShadowRoot(rootNode)) {\n    let next = child;\n    while (next) {\n      if (parent === next) {\n        return true;\n      }\n      // @ts-ignore\n      next = next.parentNode || next.host;\n    }\n  }\n\n  // Give up, the result is false\n  return false;\n}\n// Avoid Chrome DevTools blue warning.\nfunction getPlatform() {\n  const uaData = navigator.userAgentData;\n  if (uaData != null && uaData.platform) {\n    return uaData.platform;\n  }\n  return navigator.platform;\n}\nfunction getUserAgent() {\n  const uaData = navigator.userAgentData;\n  if (uaData && Array.isArray(uaData.brands)) {\n    return uaData.brands.map(_ref => {\n      let {\n        brand,\n        version\n      } = _ref;\n      return brand + \"/\" + version;\n    }).join(' ');\n  }\n  return navigator.userAgent;\n}\n\n// License: https://github.com/adobe/react-spectrum/blob/b35d5c02fe900badccd0cf1a8f23bb593419f238/packages/@react-aria/utils/src/isVirtualEvent.ts\nfunction isVirtualClick(event) {\n  // FIXME: Firefox is now emitting a deprecation warning for `mozInputSource`.\n  // Try to find a workaround for this. `react-aria` source still has the check.\n  if (event.mozInputSource === 0 && event.isTrusted) {\n    return true;\n  }\n  if (isAndroid() && event.pointerType) {\n    return event.type === 'click' && event.buttons === 1;\n  }\n  return event.detail === 0 && !event.pointerType;\n}\nfunction isVirtualPointerEvent(event) {\n  if (isJSDOM()) return false;\n  return !isAndroid() && event.width === 0 && event.height === 0 || isAndroid() && event.width === 1 && event.height === 1 && event.pressure === 0 && event.detail === 0 && event.pointerType === 'mouse' ||\n  // iOS VoiceOver returns 0.333• for width/height.\n  event.width < 1 && event.height < 1 && event.pressure === 0 && event.detail === 0 && event.pointerType === 'touch';\n}\nfunction isSafari() {\n  // Chrome DevTools does not complain about navigator.vendor\n  return /apple/i.test(navigator.vendor);\n}\nfunction isAndroid() {\n  const re = /android/i;\n  return re.test(getPlatform()) || re.test(getUserAgent());\n}\nfunction isMac() {\n  return getPlatform().toLowerCase().startsWith('mac') && !navigator.maxTouchPoints;\n}\nfunction isJSDOM() {\n  return getUserAgent().includes('jsdom/');\n}\nfunction isMouseLikePointerType(pointerType, strict) {\n  // On some Linux machines with Chromium, mouse inputs return a `pointerType`\n  // of \"pen\": https://github.com/floating-ui/floating-ui/issues/2015\n  const values = ['mouse', 'pen'];\n  if (!strict) {\n    values.push('', undefined);\n  }\n  return values.includes(pointerType);\n}\nfunction isReactEvent(event) {\n  return 'nativeEvent' in event;\n}\nfunction isRootElement(element) {\n  return element.matches('html,body');\n}\nfunction getDocument(node) {\n  return (node == null ? void 0 : node.ownerDocument) || document;\n}\nfunction isEventTargetWithin(event, node) {\n  if (node == null) {\n    return false;\n  }\n  if ('composedPath' in event) {\n    return event.composedPath().includes(node);\n  }\n\n  // TS thinks `event` is of type never as it assumes all browsers support composedPath, but browsers without shadow dom don't\n  const e = event;\n  return e.target != null && node.contains(e.target);\n}\nfunction getTarget(event) {\n  if ('composedPath' in event) {\n    return event.composedPath()[0];\n  }\n\n  // TS thinks `event` is of type never as it assumes all browsers support\n  // `composedPath()`, but browsers without shadow DOM don't.\n  return event.target;\n}\nconst TYPEABLE_SELECTOR = \"input:not([type='hidden']):not([disabled]),\" + \"[contenteditable]:not([contenteditable='false']),textarea:not([disabled])\";\nfunction isTypeableElement(element) {\n  return isHTMLElement(element) && element.matches(TYPEABLE_SELECTOR);\n}\nfunction stopEvent(event) {\n  event.preventDefault();\n  event.stopPropagation();\n}\nfunction isTypeableCombobox(element) {\n  if (!element) return false;\n  return element.getAttribute('role') === 'combobox' && isTypeableElement(element);\n}\n\nexport { TYPEABLE_SELECTOR, activeElement, contains, getDocument, getPlatform, getTarget, getUserAgent, isAndroid, isEventTargetWithin, isJSDOM, isMac, isMouseLikePointerType, isReactEvent, isRootElement, isSafari, isTypeableCombobox, isTypeableElement, isVirtualClick, isVirtualPointerEvent, stopEvent };\n","/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n  x: v,\n  y: v\n});\nconst oppositeSideMap = {\n  left: 'right',\n  right: 'left',\n  bottom: 'top',\n  top: 'bottom'\n};\nconst oppositeAlignmentMap = {\n  start: 'end',\n  end: 'start'\n};\nfunction clamp(start, value, end) {\n  return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n  return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n  return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n  return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n  return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n  return axis === 'y' ? 'height' : 'width';\n}\nfunction getSideAxis(placement) {\n  return ['top', 'bottom'].includes(getSide(placement)) ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n  return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n  if (rtl === void 0) {\n    rtl = false;\n  }\n  const alignment = getAlignment(placement);\n  const alignmentAxis = getAlignmentAxis(placement);\n  const length = getAxisLength(alignmentAxis);\n  let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n  if (rects.reference[length] > rects.floating[length]) {\n    mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n  }\n  return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n  const oppositePlacement = getOppositePlacement(placement);\n  return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n  return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);\n}\nfunction getSideList(side, isStart, rtl) {\n  const lr = ['left', 'right'];\n  const rl = ['right', 'left'];\n  const tb = ['top', 'bottom'];\n  const bt = ['bottom', 'top'];\n  switch (side) {\n    case 'top':\n    case 'bottom':\n      if (rtl) return isStart ? rl : lr;\n      return isStart ? lr : rl;\n    case 'left':\n    case 'right':\n      return isStart ? tb : bt;\n    default:\n      return [];\n  }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n  const alignment = getAlignment(placement);\n  let list = getSideList(getSide(placement), direction === 'start', rtl);\n  if (alignment) {\n    list = list.map(side => side + \"-\" + alignment);\n    if (flipAlignment) {\n      list = list.concat(list.map(getOppositeAlignmentPlacement));\n    }\n  }\n  return list;\n}\nfunction getOppositePlacement(placement) {\n  return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);\n}\nfunction expandPaddingObject(padding) {\n  return {\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0,\n    ...padding\n  };\n}\nfunction getPaddingObject(padding) {\n  return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n    top: padding,\n    right: padding,\n    bottom: padding,\n    left: padding\n  };\n}\nfunction rectToClientRect(rect) {\n  const {\n    x,\n    y,\n    width,\n    height\n  } = rect;\n  return {\n    width,\n    height,\n    top: y,\n    left: x,\n    right: x + width,\n    bottom: y + height,\n    x,\n    y\n  };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n","import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n  let {\n    reference,\n    floating\n  } = _ref;\n  const sideAxis = getSideAxis(placement);\n  const alignmentAxis = getAlignmentAxis(placement);\n  const alignLength = getAxisLength(alignmentAxis);\n  const side = getSide(placement);\n  const isVertical = sideAxis === 'y';\n  const commonX = reference.x + reference.width / 2 - floating.width / 2;\n  const commonY = reference.y + reference.height / 2 - floating.height / 2;\n  const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n  let coords;\n  switch (side) {\n    case 'top':\n      coords = {\n        x: commonX,\n        y: reference.y - floating.height\n      };\n      break;\n    case 'bottom':\n      coords = {\n        x: commonX,\n        y: reference.y + reference.height\n      };\n      break;\n    case 'right':\n      coords = {\n        x: reference.x + reference.width,\n        y: commonY\n      };\n      break;\n    case 'left':\n      coords = {\n        x: reference.x - floating.width,\n        y: commonY\n      };\n      break;\n    default:\n      coords = {\n        x: reference.x,\n        y: reference.y\n      };\n  }\n  switch (getAlignment(placement)) {\n    case 'start':\n      coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n      break;\n    case 'end':\n      coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n      break;\n  }\n  return coords;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n  const {\n    placement = 'bottom',\n    strategy = 'absolute',\n    middleware = [],\n    platform\n  } = config;\n  const validMiddleware = middleware.filter(Boolean);\n  const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n  let rects = await platform.getElementRects({\n    reference,\n    floating,\n    strategy\n  });\n  let {\n    x,\n    y\n  } = computeCoordsFromPlacement(rects, placement, rtl);\n  let statefulPlacement = placement;\n  let middlewareData = {};\n  let resetCount = 0;\n  for (let i = 0; i < validMiddleware.length; i++) {\n    const {\n      name,\n      fn\n    } = validMiddleware[i];\n    const {\n      x: nextX,\n      y: nextY,\n      data,\n      reset\n    } = await fn({\n      x,\n      y,\n      initialPlacement: placement,\n      placement: statefulPlacement,\n      strategy,\n      middlewareData,\n      rects,\n      platform,\n      elements: {\n        reference,\n        floating\n      }\n    });\n    x = nextX != null ? nextX : x;\n    y = nextY != null ? nextY : y;\n    middlewareData = {\n      ...middlewareData,\n      [name]: {\n        ...middlewareData[name],\n        ...data\n      }\n    };\n    if (reset && resetCount <= 50) {\n      resetCount++;\n      if (typeof reset === 'object') {\n        if (reset.placement) {\n          statefulPlacement = reset.placement;\n        }\n        if (reset.rects) {\n          rects = reset.rects === true ? await platform.getElementRects({\n            reference,\n            floating,\n            strategy\n          }) : reset.rects;\n        }\n        ({\n          x,\n          y\n        } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n      }\n      i = -1;\n    }\n  }\n  return {\n    x,\n    y,\n    placement: statefulPlacement,\n    strategy,\n    middlewareData\n  };\n};\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n  var _await$platform$isEle;\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    x,\n    y,\n    platform,\n    rects,\n    elements,\n    strategy\n  } = state;\n  const {\n    boundary = 'clippingAncestors',\n    rootBoundary = 'viewport',\n    elementContext = 'floating',\n    altBoundary = false,\n    padding = 0\n  } = evaluate(options, state);\n  const paddingObject = getPaddingObject(padding);\n  const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n  const element = elements[altBoundary ? altContext : elementContext];\n  const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n    element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n    boundary,\n    rootBoundary,\n    strategy\n  }));\n  const rect = elementContext === 'floating' ? {\n    x,\n    y,\n    width: rects.floating.width,\n    height: rects.floating.height\n  } : rects.reference;\n  const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n  const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n    x: 1,\n    y: 1\n  } : {\n    x: 1,\n    y: 1\n  };\n  const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n    elements,\n    rect,\n    offsetParent,\n    strategy\n  }) : rect);\n  return {\n    top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n    bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n    left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n    right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n  };\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n  name: 'arrow',\n  options,\n  async fn(state) {\n    const {\n      x,\n      y,\n      placement,\n      rects,\n      platform,\n      elements,\n      middlewareData\n    } = state;\n    // Since `element` is required, we don't Partial<> the type.\n    const {\n      element,\n      padding = 0\n    } = evaluate(options, state) || {};\n    if (element == null) {\n      return {};\n    }\n    const paddingObject = getPaddingObject(padding);\n    const coords = {\n      x,\n      y\n    };\n    const axis = getAlignmentAxis(placement);\n    const length = getAxisLength(axis);\n    const arrowDimensions = await platform.getDimensions(element);\n    const isYAxis = axis === 'y';\n    const minProp = isYAxis ? 'top' : 'left';\n    const maxProp = isYAxis ? 'bottom' : 'right';\n    const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n    const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n    const startDiff = coords[axis] - rects.reference[axis];\n    const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n    let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n    // DOM platform can return `window` as the `offsetParent`.\n    if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n      clientSize = elements.floating[clientProp] || rects.floating[length];\n    }\n    const centerToReference = endDiff / 2 - startDiff / 2;\n\n    // If the padding is large enough that it causes the arrow to no longer be\n    // centered, modify the padding so that it is centered.\n    const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n    const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n    const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n    // Make sure the arrow doesn't overflow the floating element if the center\n    // point is outside the floating element's bounds.\n    const min$1 = minPadding;\n    const max = clientSize - arrowDimensions[length] - maxPadding;\n    const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n    const offset = clamp(min$1, center, max);\n\n    // If the reference is small enough that the arrow's padding causes it to\n    // to point to nothing for an aligned placement, adjust the offset of the\n    // floating element itself. To ensure `shift()` continues to take action,\n    // a single reset is performed when this is true.\n    const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n    const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n    return {\n      [axis]: coords[axis] + alignmentOffset,\n      data: {\n        [axis]: offset,\n        centerOffset: center - offset - alignmentOffset,\n        ...(shouldAddOffset && {\n          alignmentOffset\n        })\n      },\n      reset: shouldAddOffset\n    };\n  }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n  const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n  return allowedPlacementsSortedByAlignment.filter(placement => {\n    if (alignment) {\n      return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n    }\n    return true;\n  });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'autoPlacement',\n    options,\n    async fn(state) {\n      var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n      const {\n        rects,\n        middlewareData,\n        placement,\n        platform,\n        elements\n      } = state;\n      const {\n        crossAxis = false,\n        alignment,\n        allowedPlacements = placements,\n        autoAlignment = true,\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n      const overflow = await detectOverflow(state, detectOverflowOptions);\n      const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n      const currentPlacement = placements$1[currentIndex];\n      if (currentPlacement == null) {\n        return {};\n      }\n      const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n      // Make `computeCoords` start from the right place.\n      if (placement !== currentPlacement) {\n        return {\n          reset: {\n            placement: placements$1[0]\n          }\n        };\n      }\n      const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n      const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n        placement: currentPlacement,\n        overflows: currentOverflows\n      }];\n      const nextPlacement = placements$1[currentIndex + 1];\n\n      // There are more placements to check.\n      if (nextPlacement) {\n        return {\n          data: {\n            index: currentIndex + 1,\n            overflows: allOverflows\n          },\n          reset: {\n            placement: nextPlacement\n          }\n        };\n      }\n      const placementsSortedByMostSpace = allOverflows.map(d => {\n        const alignment = getAlignment(d.placement);\n        return [d.placement, alignment && crossAxis ?\n        // Check along the mainAxis and main crossAxis side.\n        d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n        // Check only the mainAxis.\n        d.overflows[0], d.overflows];\n      }).sort((a, b) => a[1] - b[1]);\n      const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n      // Aligned placements should not check their opposite crossAxis\n      // side.\n      getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n      const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n      if (resetPlacement !== placement) {\n        return {\n          data: {\n            index: currentIndex + 1,\n            overflows: allOverflows\n          },\n          reset: {\n            placement: resetPlacement\n          }\n        };\n      }\n      return {};\n    }\n  };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'flip',\n    options,\n    async fn(state) {\n      var _middlewareData$arrow, _middlewareData$flip;\n      const {\n        placement,\n        middlewareData,\n        rects,\n        initialPlacement,\n        platform,\n        elements\n      } = state;\n      const {\n        mainAxis: checkMainAxis = true,\n        crossAxis: checkCrossAxis = true,\n        fallbackPlacements: specifiedFallbackPlacements,\n        fallbackStrategy = 'bestFit',\n        fallbackAxisSideDirection = 'none',\n        flipAlignment = true,\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n\n      // If a reset by the arrow was caused due to an alignment offset being\n      // added, we should skip any logic now since `flip()` has already done its\n      // work.\n      // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n      if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n        return {};\n      }\n      const side = getSide(placement);\n      const initialSideAxis = getSideAxis(initialPlacement);\n      const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n      const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n      const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n      const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n      if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n        fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n      }\n      const placements = [initialPlacement, ...fallbackPlacements];\n      const overflow = await detectOverflow(state, detectOverflowOptions);\n      const overflows = [];\n      let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n      if (checkMainAxis) {\n        overflows.push(overflow[side]);\n      }\n      if (checkCrossAxis) {\n        const sides = getAlignmentSides(placement, rects, rtl);\n        overflows.push(overflow[sides[0]], overflow[sides[1]]);\n      }\n      overflowsData = [...overflowsData, {\n        placement,\n        overflows\n      }];\n\n      // One or more sides is overflowing.\n      if (!overflows.every(side => side <= 0)) {\n        var _middlewareData$flip2, _overflowsData$filter;\n        const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n        const nextPlacement = placements[nextIndex];\n        if (nextPlacement) {\n          // Try next placement and re-run the lifecycle.\n          return {\n            data: {\n              index: nextIndex,\n              overflows: overflowsData\n            },\n            reset: {\n              placement: nextPlacement\n            }\n          };\n        }\n\n        // First, find the candidates that fit on the mainAxis side of overflow,\n        // then find the placement that fits the best on the main crossAxis side.\n        let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n        // Otherwise fallback.\n        if (!resetPlacement) {\n          switch (fallbackStrategy) {\n            case 'bestFit':\n              {\n                var _overflowsData$filter2;\n                const placement = (_overflowsData$filter2 = overflowsData.filter(d => {\n                  if (hasFallbackAxisSideDirection) {\n                    const currentSideAxis = getSideAxis(d.placement);\n                    return currentSideAxis === initialSideAxis ||\n                    // Create a bias to the `y` side axis due to horizontal\n                    // reading directions favoring greater width.\n                    currentSideAxis === 'y';\n                  }\n                  return true;\n                }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];\n                if (placement) {\n                  resetPlacement = placement;\n                }\n                break;\n              }\n            case 'initialPlacement':\n              resetPlacement = initialPlacement;\n              break;\n          }\n        }\n        if (placement !== resetPlacement) {\n          return {\n            reset: {\n              placement: resetPlacement\n            }\n          };\n        }\n      }\n      return {};\n    }\n  };\n};\n\nfunction getSideOffsets(overflow, rect) {\n  return {\n    top: overflow.top - rect.height,\n    right: overflow.right - rect.width,\n    bottom: overflow.bottom - rect.height,\n    left: overflow.left - rect.width\n  };\n}\nfunction isAnySideFullyClipped(overflow) {\n  return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'hide',\n    options,\n    async fn(state) {\n      const {\n        rects\n      } = state;\n      const {\n        strategy = 'referenceHidden',\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      switch (strategy) {\n        case 'referenceHidden':\n          {\n            const overflow = await detectOverflow(state, {\n              ...detectOverflowOptions,\n              elementContext: 'reference'\n            });\n            const offsets = getSideOffsets(overflow, rects.reference);\n            return {\n              data: {\n                referenceHiddenOffsets: offsets,\n                referenceHidden: isAnySideFullyClipped(offsets)\n              }\n            };\n          }\n        case 'escaped':\n          {\n            const overflow = await detectOverflow(state, {\n              ...detectOverflowOptions,\n              altBoundary: true\n            });\n            const offsets = getSideOffsets(overflow, rects.floating);\n            return {\n              data: {\n                escapedOffsets: offsets,\n                escaped: isAnySideFullyClipped(offsets)\n              }\n            };\n          }\n        default:\n          {\n            return {};\n          }\n      }\n    }\n  };\n};\n\nfunction getBoundingRect(rects) {\n  const minX = min(...rects.map(rect => rect.left));\n  const minY = min(...rects.map(rect => rect.top));\n  const maxX = max(...rects.map(rect => rect.right));\n  const maxY = max(...rects.map(rect => rect.bottom));\n  return {\n    x: minX,\n    y: minY,\n    width: maxX - minX,\n    height: maxY - minY\n  };\n}\nfunction getRectsByLine(rects) {\n  const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n  const groups = [];\n  let prevRect = null;\n  for (let i = 0; i < sortedRects.length; i++) {\n    const rect = sortedRects[i];\n    if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n      groups.push([rect]);\n    } else {\n      groups[groups.length - 1].push(rect);\n    }\n    prevRect = rect;\n  }\n  return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'inline',\n    options,\n    async fn(state) {\n      const {\n        placement,\n        elements,\n        rects,\n        platform,\n        strategy\n      } = state;\n      // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n      // ClientRect's bounds, despite the event listener being triggered. A\n      // padding of 2 seems to handle this issue.\n      const {\n        padding = 2,\n        x,\n        y\n      } = evaluate(options, state);\n      const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n      const clientRects = getRectsByLine(nativeClientRects);\n      const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n      const paddingObject = getPaddingObject(padding);\n      function getBoundingClientRect() {\n        // There are two rects and they are disjoined.\n        if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n          // Find the first rect in which the point is fully inside.\n          return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n        }\n\n        // There are 2 or more connected rects.\n        if (clientRects.length >= 2) {\n          if (getSideAxis(placement) === 'y') {\n            const firstRect = clientRects[0];\n            const lastRect = clientRects[clientRects.length - 1];\n            const isTop = getSide(placement) === 'top';\n            const top = firstRect.top;\n            const bottom = lastRect.bottom;\n            const left = isTop ? firstRect.left : lastRect.left;\n            const right = isTop ? firstRect.right : lastRect.right;\n            const width = right - left;\n            const height = bottom - top;\n            return {\n              top,\n              bottom,\n              left,\n              right,\n              width,\n              height,\n              x: left,\n              y: top\n            };\n          }\n          const isLeftSide = getSide(placement) === 'left';\n          const maxRight = max(...clientRects.map(rect => rect.right));\n          const minLeft = min(...clientRects.map(rect => rect.left));\n          const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n          const top = measureRects[0].top;\n          const bottom = measureRects[measureRects.length - 1].bottom;\n          const left = minLeft;\n          const right = maxRight;\n          const width = right - left;\n          const height = bottom - top;\n          return {\n            top,\n            bottom,\n            left,\n            right,\n            width,\n            height,\n            x: left,\n            y: top\n          };\n        }\n        return fallback;\n      }\n      const resetRects = await platform.getElementRects({\n        reference: {\n          getBoundingClientRect\n        },\n        floating: elements.floating,\n        strategy\n      });\n      if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n        return {\n          reset: {\n            rects: resetRects\n          }\n        };\n      }\n      return {};\n    }\n  };\n};\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n  const {\n    placement,\n    platform,\n    elements\n  } = state;\n  const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n  const side = getSide(placement);\n  const alignment = getAlignment(placement);\n  const isVertical = getSideAxis(placement) === 'y';\n  const mainAxisMulti = ['left', 'top'].includes(side) ? -1 : 1;\n  const crossAxisMulti = rtl && isVertical ? -1 : 1;\n  const rawValue = evaluate(options, state);\n\n  // eslint-disable-next-line prefer-const\n  let {\n    mainAxis,\n    crossAxis,\n    alignmentAxis\n  } = typeof rawValue === 'number' ? {\n    mainAxis: rawValue,\n    crossAxis: 0,\n    alignmentAxis: null\n  } : {\n    mainAxis: rawValue.mainAxis || 0,\n    crossAxis: rawValue.crossAxis || 0,\n    alignmentAxis: rawValue.alignmentAxis\n  };\n  if (alignment && typeof alignmentAxis === 'number') {\n    crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n  }\n  return isVertical ? {\n    x: crossAxis * crossAxisMulti,\n    y: mainAxis * mainAxisMulti\n  } : {\n    x: mainAxis * mainAxisMulti,\n    y: crossAxis * crossAxisMulti\n  };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n  if (options === void 0) {\n    options = 0;\n  }\n  return {\n    name: 'offset',\n    options,\n    async fn(state) {\n      var _middlewareData$offse, _middlewareData$arrow;\n      const {\n        x,\n        y,\n        placement,\n        middlewareData\n      } = state;\n      const diffCoords = await convertValueToCoords(state, options);\n\n      // If the placement is the same and the arrow caused an alignment offset\n      // then we don't need to change the positioning coordinates.\n      if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n        return {};\n      }\n      return {\n        x: x + diffCoords.x,\n        y: y + diffCoords.y,\n        data: {\n          ...diffCoords,\n          placement\n        }\n      };\n    }\n  };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'shift',\n    options,\n    async fn(state) {\n      const {\n        x,\n        y,\n        placement\n      } = state;\n      const {\n        mainAxis: checkMainAxis = true,\n        crossAxis: checkCrossAxis = false,\n        limiter = {\n          fn: _ref => {\n            let {\n              x,\n              y\n            } = _ref;\n            return {\n              x,\n              y\n            };\n          }\n        },\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      const coords = {\n        x,\n        y\n      };\n      const overflow = await detectOverflow(state, detectOverflowOptions);\n      const crossAxis = getSideAxis(getSide(placement));\n      const mainAxis = getOppositeAxis(crossAxis);\n      let mainAxisCoord = coords[mainAxis];\n      let crossAxisCoord = coords[crossAxis];\n      if (checkMainAxis) {\n        const minSide = mainAxis === 'y' ? 'top' : 'left';\n        const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n        const min = mainAxisCoord + overflow[minSide];\n        const max = mainAxisCoord - overflow[maxSide];\n        mainAxisCoord = clamp(min, mainAxisCoord, max);\n      }\n      if (checkCrossAxis) {\n        const minSide = crossAxis === 'y' ? 'top' : 'left';\n        const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n        const min = crossAxisCoord + overflow[minSide];\n        const max = crossAxisCoord - overflow[maxSide];\n        crossAxisCoord = clamp(min, crossAxisCoord, max);\n      }\n      const limitedCoords = limiter.fn({\n        ...state,\n        [mainAxis]: mainAxisCoord,\n        [crossAxis]: crossAxisCoord\n      });\n      return {\n        ...limitedCoords,\n        data: {\n          x: limitedCoords.x - x,\n          y: limitedCoords.y - y,\n          enabled: {\n            [mainAxis]: checkMainAxis,\n            [crossAxis]: checkCrossAxis\n          }\n        }\n      };\n    }\n  };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    options,\n    fn(state) {\n      const {\n        x,\n        y,\n        placement,\n        rects,\n        middlewareData\n      } = state;\n      const {\n        offset = 0,\n        mainAxis: checkMainAxis = true,\n        crossAxis: checkCrossAxis = true\n      } = evaluate(options, state);\n      const coords = {\n        x,\n        y\n      };\n      const crossAxis = getSideAxis(placement);\n      const mainAxis = getOppositeAxis(crossAxis);\n      let mainAxisCoord = coords[mainAxis];\n      let crossAxisCoord = coords[crossAxis];\n      const rawOffset = evaluate(offset, state);\n      const computedOffset = typeof rawOffset === 'number' ? {\n        mainAxis: rawOffset,\n        crossAxis: 0\n      } : {\n        mainAxis: 0,\n        crossAxis: 0,\n        ...rawOffset\n      };\n      if (checkMainAxis) {\n        const len = mainAxis === 'y' ? 'height' : 'width';\n        const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n        const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n        if (mainAxisCoord < limitMin) {\n          mainAxisCoord = limitMin;\n        } else if (mainAxisCoord > limitMax) {\n          mainAxisCoord = limitMax;\n        }\n      }\n      if (checkCrossAxis) {\n        var _middlewareData$offse, _middlewareData$offse2;\n        const len = mainAxis === 'y' ? 'width' : 'height';\n        const isOriginSide = ['top', 'left'].includes(getSide(placement));\n        const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n        const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n        if (crossAxisCoord < limitMin) {\n          crossAxisCoord = limitMin;\n        } else if (crossAxisCoord > limitMax) {\n          crossAxisCoord = limitMax;\n        }\n      }\n      return {\n        [mainAxis]: mainAxisCoord,\n        [crossAxis]: crossAxisCoord\n      };\n    }\n  };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'size',\n    options,\n    async fn(state) {\n      var _state$middlewareData, _state$middlewareData2;\n      const {\n        placement,\n        rects,\n        platform,\n        elements\n      } = state;\n      const {\n        apply = () => {},\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      const overflow = await detectOverflow(state, detectOverflowOptions);\n      const side = getSide(placement);\n      const alignment = getAlignment(placement);\n      const isYAxis = getSideAxis(placement) === 'y';\n      const {\n        width,\n        height\n      } = rects.floating;\n      let heightSide;\n      let widthSide;\n      if (side === 'top' || side === 'bottom') {\n        heightSide = side;\n        widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n      } else {\n        widthSide = side;\n        heightSide = alignment === 'end' ? 'top' : 'bottom';\n      }\n      const maximumClippingHeight = height - overflow.top - overflow.bottom;\n      const maximumClippingWidth = width - overflow.left - overflow.right;\n      const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);\n      const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);\n      const noShift = !state.middlewareData.shift;\n      let availableHeight = overflowAvailableHeight;\n      let availableWidth = overflowAvailableWidth;\n      if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) {\n        availableWidth = maximumClippingWidth;\n      }\n      if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) {\n        availableHeight = maximumClippingHeight;\n      }\n      if (noShift && !alignment) {\n        const xMin = max(overflow.left, 0);\n        const xMax = max(overflow.right, 0);\n        const yMin = max(overflow.top, 0);\n        const yMax = max(overflow.bottom, 0);\n        if (isYAxis) {\n          availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n        } else {\n          availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n        }\n      }\n      await apply({\n        ...state,\n        availableWidth,\n        availableHeight\n      });\n      const nextDimensions = await platform.getDimensions(elements.floating);\n      if (width !== nextDimensions.width || height !== nextDimensions.height) {\n        return {\n          reset: {\n            rects: true\n          }\n        };\n      }\n      return {};\n    }\n  };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n","import { rectToClientRect, detectOverflow as detectOverflow$1, offset as offset$1, autoPlacement as autoPlacement$1, shift as shift$1, flip as flip$1, size as size$1, hide as hide$1, arrow as arrow$1, inline as inline$1, limitShift as limitShift$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getNodeScroll, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n  const css = getComputedStyle(element);\n  // In testing environments, the `width` and `height` properties are empty\n  // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n  let width = parseFloat(css.width) || 0;\n  let height = parseFloat(css.height) || 0;\n  const hasOffset = isHTMLElement(element);\n  const offsetWidth = hasOffset ? element.offsetWidth : width;\n  const offsetHeight = hasOffset ? element.offsetHeight : height;\n  const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n  if (shouldFallback) {\n    width = offsetWidth;\n    height = offsetHeight;\n  }\n  return {\n    width,\n    height,\n    $: shouldFallback\n  };\n}\n\nfunction unwrapElement(element) {\n  return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n  const domElement = unwrapElement(element);\n  if (!isHTMLElement(domElement)) {\n    return createCoords(1);\n  }\n  const rect = domElement.getBoundingClientRect();\n  const {\n    width,\n    height,\n    $\n  } = getCssDimensions(domElement);\n  let x = ($ ? round(rect.width) : rect.width) / width;\n  let y = ($ ? round(rect.height) : rect.height) / height;\n\n  // 0, NaN, or Infinity should always fallback to 1.\n\n  if (!x || !Number.isFinite(x)) {\n    x = 1;\n  }\n  if (!y || !Number.isFinite(y)) {\n    y = 1;\n  }\n  return {\n    x,\n    y\n  };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n  const win = getWindow(element);\n  if (!isWebKit() || !win.visualViewport) {\n    return noOffsets;\n  }\n  return {\n    x: win.visualViewport.offsetLeft,\n    y: win.visualViewport.offsetTop\n  };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n  if (isFixed === void 0) {\n    isFixed = false;\n  }\n  if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n    return false;\n  }\n  return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n  if (includeScale === void 0) {\n    includeScale = false;\n  }\n  if (isFixedStrategy === void 0) {\n    isFixedStrategy = false;\n  }\n  const clientRect = element.getBoundingClientRect();\n  const domElement = unwrapElement(element);\n  let scale = createCoords(1);\n  if (includeScale) {\n    if (offsetParent) {\n      if (isElement(offsetParent)) {\n        scale = getScale(offsetParent);\n      }\n    } else {\n      scale = getScale(element);\n    }\n  }\n  const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n  let x = (clientRect.left + visualOffsets.x) / scale.x;\n  let y = (clientRect.top + visualOffsets.y) / scale.y;\n  let width = clientRect.width / scale.x;\n  let height = clientRect.height / scale.y;\n  if (domElement) {\n    const win = getWindow(domElement);\n    const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n    let currentWin = win;\n    let currentIFrame = getFrameElement(currentWin);\n    while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n      const iframeScale = getScale(currentIFrame);\n      const iframeRect = currentIFrame.getBoundingClientRect();\n      const css = getComputedStyle(currentIFrame);\n      const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n      const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n      x *= iframeScale.x;\n      y *= iframeScale.y;\n      width *= iframeScale.x;\n      height *= iframeScale.y;\n      x += left;\n      y += top;\n      currentWin = getWindow(currentIFrame);\n      currentIFrame = getFrameElement(currentWin);\n    }\n  }\n  return rectToClientRect({\n    width,\n    height,\n    x,\n    y\n  });\n}\n\n// If <html> has a CSS width greater than the viewport, then this will be\n// incorrect for RTL.\nfunction getWindowScrollBarX(element, rect) {\n  const leftScroll = getNodeScroll(element).scrollLeft;\n  if (!rect) {\n    return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;\n  }\n  return rect.left + leftScroll;\n}\n\nfunction getHTMLOffset(documentElement, scroll, ignoreScrollbarX) {\n  if (ignoreScrollbarX === void 0) {\n    ignoreScrollbarX = false;\n  }\n  const htmlRect = documentElement.getBoundingClientRect();\n  const x = htmlRect.left + scroll.scrollLeft - (ignoreScrollbarX ? 0 :\n  // RTL <body> scrollbar.\n  getWindowScrollBarX(documentElement, htmlRect));\n  const y = htmlRect.top + scroll.scrollTop;\n  return {\n    x,\n    y\n  };\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n  let {\n    elements,\n    rect,\n    offsetParent,\n    strategy\n  } = _ref;\n  const isFixed = strategy === 'fixed';\n  const documentElement = getDocumentElement(offsetParent);\n  const topLayer = elements ? isTopLayer(elements.floating) : false;\n  if (offsetParent === documentElement || topLayer && isFixed) {\n    return rect;\n  }\n  let scroll = {\n    scrollLeft: 0,\n    scrollTop: 0\n  };\n  let scale = createCoords(1);\n  const offsets = createCoords(0);\n  const isOffsetParentAnElement = isHTMLElement(offsetParent);\n  if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n    if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n      scroll = getNodeScroll(offsetParent);\n    }\n    if (isHTMLElement(offsetParent)) {\n      const offsetRect = getBoundingClientRect(offsetParent);\n      scale = getScale(offsetParent);\n      offsets.x = offsetRect.x + offsetParent.clientLeft;\n      offsets.y = offsetRect.y + offsetParent.clientTop;\n    }\n  }\n  const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll, true) : createCoords(0);\n  return {\n    width: rect.width * scale.x,\n    height: rect.height * scale.y,\n    x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x,\n    y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y\n  };\n}\n\nfunction getClientRects(element) {\n  return Array.from(element.getClientRects());\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n  const html = getDocumentElement(element);\n  const scroll = getNodeScroll(element);\n  const body = element.ownerDocument.body;\n  const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n  const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n  let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n  const y = -scroll.scrollTop;\n  if (getComputedStyle(body).direction === 'rtl') {\n    x += max(html.clientWidth, body.clientWidth) - width;\n  }\n  return {\n    width,\n    height,\n    x,\n    y\n  };\n}\n\nfunction getViewportRect(element, strategy) {\n  const win = getWindow(element);\n  const html = getDocumentElement(element);\n  const visualViewport = win.visualViewport;\n  let width = html.clientWidth;\n  let height = html.clientHeight;\n  let x = 0;\n  let y = 0;\n  if (visualViewport) {\n    width = visualViewport.width;\n    height = visualViewport.height;\n    const visualViewportBased = isWebKit();\n    if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n      x = visualViewport.offsetLeft;\n      y = visualViewport.offsetTop;\n    }\n  }\n  return {\n    width,\n    height,\n    x,\n    y\n  };\n}\n\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n  const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n  const top = clientRect.top + element.clientTop;\n  const left = clientRect.left + element.clientLeft;\n  const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n  const width = element.clientWidth * scale.x;\n  const height = element.clientHeight * scale.y;\n  const x = left * scale.x;\n  const y = top * scale.y;\n  return {\n    width,\n    height,\n    x,\n    y\n  };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n  let rect;\n  if (clippingAncestor === 'viewport') {\n    rect = getViewportRect(element, strategy);\n  } else if (clippingAncestor === 'document') {\n    rect = getDocumentRect(getDocumentElement(element));\n  } else if (isElement(clippingAncestor)) {\n    rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n  } else {\n    const visualOffsets = getVisualOffsets(element);\n    rect = {\n      x: clippingAncestor.x - visualOffsets.x,\n      y: clippingAncestor.y - visualOffsets.y,\n      width: clippingAncestor.width,\n      height: clippingAncestor.height\n    };\n  }\n  return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n  const parentNode = getParentNode(element);\n  if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n    return false;\n  }\n  return getComputedStyle(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n  const cachedResult = cache.get(element);\n  if (cachedResult) {\n    return cachedResult;\n  }\n  let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n  let currentContainingBlockComputedStyle = null;\n  const elementIsFixed = getComputedStyle(element).position === 'fixed';\n  let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n  // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n  while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n    const computedStyle = getComputedStyle(currentNode);\n    const currentNodeIsContaining = isContainingBlock(currentNode);\n    if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n      currentContainingBlockComputedStyle = null;\n    }\n    const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && ['absolute', 'fixed'].includes(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n    if (shouldDropCurrentNode) {\n      // Drop non-containing blocks.\n      result = result.filter(ancestor => ancestor !== currentNode);\n    } else {\n      // Record last containing block for next iteration.\n      currentContainingBlockComputedStyle = computedStyle;\n    }\n    currentNode = getParentNode(currentNode);\n  }\n  cache.set(element, result);\n  return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n  let {\n    element,\n    boundary,\n    rootBoundary,\n    strategy\n  } = _ref;\n  const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n  const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n  const firstClippingAncestor = clippingAncestors[0];\n  const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n    const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n    accRect.top = max(rect.top, accRect.top);\n    accRect.right = min(rect.right, accRect.right);\n    accRect.bottom = min(rect.bottom, accRect.bottom);\n    accRect.left = max(rect.left, accRect.left);\n    return accRect;\n  }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n  return {\n    width: clippingRect.right - clippingRect.left,\n    height: clippingRect.bottom - clippingRect.top,\n    x: clippingRect.left,\n    y: clippingRect.top\n  };\n}\n\nfunction getDimensions(element) {\n  const {\n    width,\n    height\n  } = getCssDimensions(element);\n  return {\n    width,\n    height\n  };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n  const isOffsetParentAnElement = isHTMLElement(offsetParent);\n  const documentElement = getDocumentElement(offsetParent);\n  const isFixed = strategy === 'fixed';\n  const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n  let scroll = {\n    scrollLeft: 0,\n    scrollTop: 0\n  };\n  const offsets = createCoords(0);\n  if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n    if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n      scroll = getNodeScroll(offsetParent);\n    }\n    if (isOffsetParentAnElement) {\n      const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n      offsets.x = offsetRect.x + offsetParent.clientLeft;\n      offsets.y = offsetRect.y + offsetParent.clientTop;\n    } else if (documentElement) {\n      // If the <body> scrollbar appears on the left (e.g. RTL systems). Use\n      // Firefox with layout.scrollbar.side = 3 in about:config to test this.\n      offsets.x = getWindowScrollBarX(documentElement);\n    }\n  }\n  const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n  const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;\n  const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;\n  return {\n    x,\n    y,\n    width: rect.width,\n    height: rect.height\n  };\n}\n\nfunction isStaticPositioned(element) {\n  return getComputedStyle(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n  if (!isHTMLElement(element) || getComputedStyle(element).position === 'fixed') {\n    return null;\n  }\n  if (polyfill) {\n    return polyfill(element);\n  }\n  let rawOffsetParent = element.offsetParent;\n\n  // Firefox returns the <html> element as the offsetParent if it's non-static,\n  // while Chrome and Safari return the <body> element. The <body> element must\n  // be used to perform the correct calculations even if the <html> element is\n  // non-static.\n  if (getDocumentElement(element) === rawOffsetParent) {\n    rawOffsetParent = rawOffsetParent.ownerDocument.body;\n  }\n  return rawOffsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n  const win = getWindow(element);\n  if (isTopLayer(element)) {\n    return win;\n  }\n  if (!isHTMLElement(element)) {\n    let svgOffsetParent = getParentNode(element);\n    while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n      if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n        return svgOffsetParent;\n      }\n      svgOffsetParent = getParentNode(svgOffsetParent);\n    }\n    return win;\n  }\n  let offsetParent = getTrueOffsetParent(element, polyfill);\n  while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n    offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n  }\n  if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n    return win;\n  }\n  return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n  const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n  const getDimensionsFn = this.getDimensions;\n  const floatingDimensions = await getDimensionsFn(data.floating);\n  return {\n    reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n    floating: {\n      x: 0,\n      y: 0,\n      width: floatingDimensions.width,\n      height: floatingDimensions.height\n    }\n  };\n};\n\nfunction isRTL(element) {\n  return getComputedStyle(element).direction === 'rtl';\n}\n\nconst platform = {\n  convertOffsetParentRelativeRectToViewportRelativeRect,\n  getDocumentElement,\n  getClippingRect,\n  getOffsetParent,\n  getElementRects,\n  getClientRects,\n  getDimensions,\n  getScale,\n  isElement,\n  isRTL\n};\n\nfunction rectsAreEqual(a, b) {\n  return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n}\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n  let io = null;\n  let timeoutId;\n  const root = getDocumentElement(element);\n  function cleanup() {\n    var _io;\n    clearTimeout(timeoutId);\n    (_io = io) == null || _io.disconnect();\n    io = null;\n  }\n  function refresh(skip, threshold) {\n    if (skip === void 0) {\n      skip = false;\n    }\n    if (threshold === void 0) {\n      threshold = 1;\n    }\n    cleanup();\n    const elementRectForRootMargin = element.getBoundingClientRect();\n    const {\n      left,\n      top,\n      width,\n      height\n    } = elementRectForRootMargin;\n    if (!skip) {\n      onMove();\n    }\n    if (!width || !height) {\n      return;\n    }\n    const insetTop = floor(top);\n    const insetRight = floor(root.clientWidth - (left + width));\n    const insetBottom = floor(root.clientHeight - (top + height));\n    const insetLeft = floor(left);\n    const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n    const options = {\n      rootMargin,\n      threshold: max(0, min(1, threshold)) || 1\n    };\n    let isFirstUpdate = true;\n    function handleObserve(entries) {\n      const ratio = entries[0].intersectionRatio;\n      if (ratio !== threshold) {\n        if (!isFirstUpdate) {\n          return refresh();\n        }\n        if (!ratio) {\n          // If the reference is clipped, the ratio is 0. Throttle the refresh\n          // to prevent an infinite loop of updates.\n          timeoutId = setTimeout(() => {\n            refresh(false, 1e-7);\n          }, 1000);\n        } else {\n          refresh(false, ratio);\n        }\n      }\n      if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) {\n        // It's possible that even though the ratio is reported as 1, the\n        // element is not actually fully within the IntersectionObserver's root\n        // area anymore. This can happen under performance constraints. This may\n        // be a bug in the browser's IntersectionObserver implementation. To\n        // work around this, we compare the element's bounding rect now with\n        // what it was at the time we created the IntersectionObserver. If they\n        // are not equal then the element moved, so we refresh.\n        refresh();\n      }\n      isFirstUpdate = false;\n    }\n\n    // Older browsers don't support a `document` as the root and will throw an\n    // error.\n    try {\n      io = new IntersectionObserver(handleObserve, {\n        ...options,\n        // Handle <iframe>s\n        root: root.ownerDocument\n      });\n    } catch (e) {\n      io = new IntersectionObserver(handleObserve, options);\n    }\n    io.observe(element);\n  }\n  refresh(true);\n  return cleanup;\n}\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * Should only be called when the floating element is mounted on the DOM or\n * visible on the screen.\n * @returns cleanup function that should be invoked when the floating element is\n * removed from the DOM or hidden from the screen.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    ancestorScroll = true,\n    ancestorResize = true,\n    elementResize = typeof ResizeObserver === 'function',\n    layoutShift = typeof IntersectionObserver === 'function',\n    animationFrame = false\n  } = options;\n  const referenceEl = unwrapElement(reference);\n  const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...getOverflowAncestors(floating)] : [];\n  ancestors.forEach(ancestor => {\n    ancestorScroll && ancestor.addEventListener('scroll', update, {\n      passive: true\n    });\n    ancestorResize && ancestor.addEventListener('resize', update);\n  });\n  const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;\n  let reobserveFrame = -1;\n  let resizeObserver = null;\n  if (elementResize) {\n    resizeObserver = new ResizeObserver(_ref => {\n      let [firstEntry] = _ref;\n      if (firstEntry && firstEntry.target === referenceEl && resizeObserver) {\n        // Prevent update loops when using the `size` middleware.\n        // https://github.com/floating-ui/floating-ui/issues/1740\n        resizeObserver.unobserve(floating);\n        cancelAnimationFrame(reobserveFrame);\n        reobserveFrame = requestAnimationFrame(() => {\n          var _resizeObserver;\n          (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);\n        });\n      }\n      update();\n    });\n    if (referenceEl && !animationFrame) {\n      resizeObserver.observe(referenceEl);\n    }\n    resizeObserver.observe(floating);\n  }\n  let frameId;\n  let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n  if (animationFrame) {\n    frameLoop();\n  }\n  function frameLoop() {\n    const nextRefRect = getBoundingClientRect(reference);\n    if (prevRefRect && !rectsAreEqual(prevRefRect, nextRefRect)) {\n      update();\n    }\n    prevRefRect = nextRefRect;\n    frameId = requestAnimationFrame(frameLoop);\n  }\n  update();\n  return () => {\n    var _resizeObserver2;\n    ancestors.forEach(ancestor => {\n      ancestorScroll && ancestor.removeEventListener('scroll', update);\n      ancestorResize && ancestor.removeEventListener('resize', update);\n    });\n    cleanupIo == null || cleanupIo();\n    (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();\n    resizeObserver = null;\n    if (animationFrame) {\n      cancelAnimationFrame(frameId);\n    }\n  };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nconst detectOverflow = detectOverflow$1;\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = offset$1;\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = autoPlacement$1;\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = shift$1;\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = flip$1;\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = size$1;\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = hide$1;\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = arrow$1;\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = inline$1;\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = limitShift$1;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n */\nconst computePosition = (reference, floating, options) => {\n  // This caches the expensive `getClippingElementAncestors` function so that\n  // multiple lifecycle resets re-use the same result. It only lives for a\n  // single call. If other functions become expensive, we can add them as well.\n  const cache = new Map();\n  const mergedOptions = {\n    platform,\n    ...options\n  };\n  const platformWithCache = {\n    ...mergedOptions.platform,\n    _c: cache\n  };\n  return computePosition$1(reference, floating, {\n    ...mergedOptions,\n    platform: platformWithCache\n  });\n};\n\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, platform, shift, size };\n","import { computePosition, arrow as arrow$2, offset as offset$1, shift as shift$1, limitShift as limitShift$1, flip as flip$1, size as size$1, autoPlacement as autoPlacement$1, hide as hide$1, inline as inline$1 } from '@floating-ui/dom';\nexport { autoUpdate, computePosition, detectOverflow, getOverflowAncestors, platform } from '@floating-ui/dom';\nimport * as React from 'react';\nimport { useLayoutEffect, useEffect } from 'react';\nimport * as ReactDOM from 'react-dom';\n\nvar index = typeof document !== 'undefined' ? useLayoutEffect : useEffect;\n\n// Fork of `fast-deep-equal` that only does the comparisons we need and compares\n// functions\nfunction deepEqual(a, b) {\n  if (a === b) {\n    return true;\n  }\n  if (typeof a !== typeof b) {\n    return false;\n  }\n  if (typeof a === 'function' && a.toString() === b.toString()) {\n    return true;\n  }\n  let length;\n  let i;\n  let keys;\n  if (a && b && typeof a === 'object') {\n    if (Array.isArray(a)) {\n      length = a.length;\n      if (length !== b.length) return false;\n      for (i = length; i-- !== 0;) {\n        if (!deepEqual(a[i], b[i])) {\n          return false;\n        }\n      }\n      return true;\n    }\n    keys = Object.keys(a);\n    length = keys.length;\n    if (length !== Object.keys(b).length) {\n      return false;\n    }\n    for (i = length; i-- !== 0;) {\n      if (!{}.hasOwnProperty.call(b, keys[i])) {\n        return false;\n      }\n    }\n    for (i = length; i-- !== 0;) {\n      const key = keys[i];\n      if (key === '_owner' && a.$$typeof) {\n        continue;\n      }\n      if (!deepEqual(a[key], b[key])) {\n        return false;\n      }\n    }\n    return true;\n  }\n  return a !== a && b !== b;\n}\n\nfunction getDPR(element) {\n  if (typeof window === 'undefined') {\n    return 1;\n  }\n  const win = element.ownerDocument.defaultView || window;\n  return win.devicePixelRatio || 1;\n}\n\nfunction roundByDPR(element, value) {\n  const dpr = getDPR(element);\n  return Math.round(value * dpr) / dpr;\n}\n\nfunction useLatestRef(value) {\n  const ref = React.useRef(value);\n  index(() => {\n    ref.current = value;\n  });\n  return ref;\n}\n\n/**\n * Provides data to position a floating element.\n * @see https://floating-ui.com/docs/useFloating\n */\nfunction useFloating(options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    placement = 'bottom',\n    strategy = 'absolute',\n    middleware = [],\n    platform,\n    elements: {\n      reference: externalReference,\n      floating: externalFloating\n    } = {},\n    transform = true,\n    whileElementsMounted,\n    open\n  } = options;\n  const [data, setData] = React.useState({\n    x: 0,\n    y: 0,\n    strategy,\n    placement,\n    middlewareData: {},\n    isPositioned: false\n  });\n  const [latestMiddleware, setLatestMiddleware] = React.useState(middleware);\n  if (!deepEqual(latestMiddleware, middleware)) {\n    setLatestMiddleware(middleware);\n  }\n  const [_reference, _setReference] = React.useState(null);\n  const [_floating, _setFloating] = React.useState(null);\n  const setReference = React.useCallback(node => {\n    if (node !== referenceRef.current) {\n      referenceRef.current = node;\n      _setReference(node);\n    }\n  }, []);\n  const setFloating = React.useCallback(node => {\n    if (node !== floatingRef.current) {\n      floatingRef.current = node;\n      _setFloating(node);\n    }\n  }, []);\n  const referenceEl = externalReference || _reference;\n  const floatingEl = externalFloating || _floating;\n  const referenceRef = React.useRef(null);\n  const floatingRef = React.useRef(null);\n  const dataRef = React.useRef(data);\n  const hasWhileElementsMounted = whileElementsMounted != null;\n  const whileElementsMountedRef = useLatestRef(whileElementsMounted);\n  const platformRef = useLatestRef(platform);\n  const openRef = useLatestRef(open);\n  const update = React.useCallback(() => {\n    if (!referenceRef.current || !floatingRef.current) {\n      return;\n    }\n    const config = {\n      placement,\n      strategy,\n      middleware: latestMiddleware\n    };\n    if (platformRef.current) {\n      config.platform = platformRef.current;\n    }\n    computePosition(referenceRef.current, floatingRef.current, config).then(data => {\n      const fullData = {\n        ...data,\n        // The floating element's position may be recomputed while it's closed\n        // but still mounted (such as when transitioning out). To ensure\n        // `isPositioned` will be `false` initially on the next open, avoid\n        // setting it to `true` when `open === false` (must be specified).\n        isPositioned: openRef.current !== false\n      };\n      if (isMountedRef.current && !deepEqual(dataRef.current, fullData)) {\n        dataRef.current = fullData;\n        ReactDOM.flushSync(() => {\n          setData(fullData);\n        });\n      }\n    });\n  }, [latestMiddleware, placement, strategy, platformRef, openRef]);\n  index(() => {\n    if (open === false && dataRef.current.isPositioned) {\n      dataRef.current.isPositioned = false;\n      setData(data => ({\n        ...data,\n        isPositioned: false\n      }));\n    }\n  }, [open]);\n  const isMountedRef = React.useRef(false);\n  index(() => {\n    isMountedRef.current = true;\n    return () => {\n      isMountedRef.current = false;\n    };\n  }, []);\n  index(() => {\n    if (referenceEl) referenceRef.current = referenceEl;\n    if (floatingEl) floatingRef.current = floatingEl;\n    if (referenceEl && floatingEl) {\n      if (whileElementsMountedRef.current) {\n        return whileElementsMountedRef.current(referenceEl, floatingEl, update);\n      }\n      update();\n    }\n  }, [referenceEl, floatingEl, update, whileElementsMountedRef, hasWhileElementsMounted]);\n  const refs = React.useMemo(() => ({\n    reference: referenceRef,\n    floating: floatingRef,\n    setReference,\n    setFloating\n  }), [setReference, setFloating]);\n  const elements = React.useMemo(() => ({\n    reference: referenceEl,\n    floating: floatingEl\n  }), [referenceEl, floatingEl]);\n  const floatingStyles = React.useMemo(() => {\n    const initialStyles = {\n      position: strategy,\n      left: 0,\n      top: 0\n    };\n    if (!elements.floating) {\n      return initialStyles;\n    }\n    const x = roundByDPR(elements.floating, data.x);\n    const y = roundByDPR(elements.floating, data.y);\n    if (transform) {\n      return {\n        ...initialStyles,\n        transform: \"translate(\" + x + \"px, \" + y + \"px)\",\n        ...(getDPR(elements.floating) >= 1.5 && {\n          willChange: 'transform'\n        })\n      };\n    }\n    return {\n      position: strategy,\n      left: x,\n      top: y\n    };\n  }, [strategy, transform, elements.floating, data.x, data.y]);\n  return React.useMemo(() => ({\n    ...data,\n    update,\n    refs,\n    elements,\n    floatingStyles\n  }), [data, update, refs, elements, floatingStyles]);\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * This wraps the core `arrow` middleware to allow React refs as the element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow$1 = options => {\n  function isRef(value) {\n    return {}.hasOwnProperty.call(value, 'current');\n  }\n  return {\n    name: 'arrow',\n    options,\n    fn(state) {\n      const {\n        element,\n        padding\n      } = typeof options === 'function' ? options(state) : options;\n      if (element && isRef(element)) {\n        if (element.current != null) {\n          return arrow$2({\n            element: element.current,\n            padding\n          }).fn(state);\n        }\n        return {};\n      }\n      if (element) {\n        return arrow$2({\n          element,\n          padding\n        }).fn(state);\n      }\n      return {};\n    }\n  };\n};\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = (options, deps) => ({\n  ...offset$1(options),\n  options: [options, deps]\n});\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = (options, deps) => ({\n  ...shift$1(options),\n  options: [options, deps]\n});\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = (options, deps) => ({\n  ...limitShift$1(options),\n  options: [options, deps]\n});\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = (options, deps) => ({\n  ...flip$1(options),\n  options: [options, deps]\n});\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = (options, deps) => ({\n  ...size$1(options),\n  options: [options, deps]\n});\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = (options, deps) => ({\n  ...autoPlacement$1(options),\n  options: [options, deps]\n});\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = (options, deps) => ({\n  ...hide$1(options),\n  options: [options, deps]\n});\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = (options, deps) => ({\n  ...inline$1(options),\n  options: [options, deps]\n});\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * This wraps the core `arrow` middleware to allow React refs as the element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = (options, deps) => ({\n  ...arrow$1(options),\n  options: [options, deps]\n});\n\nexport { arrow, autoPlacement, flip, hide, inline, limitShift, offset, shift, size, useFloating };\n","import * as React from 'react';\nimport { useLayoutEffect, useEffect, useRef } from 'react';\nimport { stopEvent, getDocument, isMouseLikePointerType, contains, activeElement, isSafari, isTypeableCombobox, isVirtualClick, isVirtualPointerEvent, getTarget, getPlatform, isTypeableElement, isReactEvent, isRootElement, isEventTargetWithin, isMac, getUserAgent } from '@floating-ui/react/utils';\nimport { floor, evaluate, max, min, round } from '@floating-ui/utils';\nimport { getComputedStyle, isElement, getNodeName, isHTMLElement, getWindow, isLastTraversableNode, getParentNode, isWebKit } from '@floating-ui/utils/dom';\nimport { tabbable, isTabbable } from 'tabbable';\nimport * as ReactDOM from 'react-dom';\nimport { getOverflowAncestors, useFloating as useFloating$1, offset, detectOverflow } from '@floating-ui/react-dom';\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, getOverflowAncestors, hide, inline, limitShift, offset, platform, shift, size } from '@floating-ui/react-dom';\n\n/**\n * Merges an array of refs into a single memoized callback ref or `null`.\n * @see https://floating-ui.com/docs/react-utils#usemergerefs\n */\nfunction useMergeRefs(refs) {\n  return React.useMemo(() => {\n    if (refs.every(ref => ref == null)) {\n      return null;\n    }\n    return value => {\n      refs.forEach(ref => {\n        if (typeof ref === 'function') {\n          ref(value);\n        } else if (ref != null) {\n          ref.current = value;\n        }\n      });\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, refs);\n}\n\n// https://github.com/mui/material-ui/issues/41190#issuecomment-2040873379\nconst SafeReact = {\n  ...React\n};\n\nconst useInsertionEffect = SafeReact.useInsertionEffect;\nconst useSafeInsertionEffect = useInsertionEffect || (fn => fn());\nfunction useEffectEvent(callback) {\n  const ref = React.useRef(() => {\n    if (process.env.NODE_ENV !== \"production\") {\n      throw new Error('Cannot call an event handler while rendering.');\n    }\n  });\n  useSafeInsertionEffect(() => {\n    ref.current = callback;\n  });\n  return React.useCallback(function () {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n    return ref.current == null ? void 0 : ref.current(...args);\n  }, []);\n}\n\nconst ARROW_UP = 'ArrowUp';\nconst ARROW_DOWN = 'ArrowDown';\nconst ARROW_LEFT = 'ArrowLeft';\nconst ARROW_RIGHT = 'ArrowRight';\nfunction isDifferentRow(index, cols, prevRow) {\n  return Math.floor(index / cols) !== prevRow;\n}\nfunction isIndexOutOfBounds(listRef, index) {\n  return index < 0 || index >= listRef.current.length;\n}\nfunction getMinIndex(listRef, disabledIndices) {\n  return findNonDisabledIndex(listRef, {\n    disabledIndices\n  });\n}\nfunction getMaxIndex(listRef, disabledIndices) {\n  return findNonDisabledIndex(listRef, {\n    decrement: true,\n    startingIndex: listRef.current.length,\n    disabledIndices\n  });\n}\nfunction findNonDisabledIndex(listRef, _temp) {\n  let {\n    startingIndex = -1,\n    decrement = false,\n    disabledIndices,\n    amount = 1\n  } = _temp === void 0 ? {} : _temp;\n  const list = listRef.current;\n  let index = startingIndex;\n  do {\n    index += decrement ? -amount : amount;\n  } while (index >= 0 && index <= list.length - 1 && isDisabled(list, index, disabledIndices));\n  return index;\n}\nfunction getGridNavigatedIndex(elementsRef, _ref) {\n  let {\n    event,\n    orientation,\n    loop,\n    rtl,\n    cols,\n    disabledIndices,\n    minIndex,\n    maxIndex,\n    prevIndex,\n    stopEvent: stop = false\n  } = _ref;\n  let nextIndex = prevIndex;\n  if (event.key === ARROW_UP) {\n    stop && stopEvent(event);\n    if (prevIndex === -1) {\n      nextIndex = maxIndex;\n    } else {\n      nextIndex = findNonDisabledIndex(elementsRef, {\n        startingIndex: nextIndex,\n        amount: cols,\n        decrement: true,\n        disabledIndices\n      });\n      if (loop && (prevIndex - cols < minIndex || nextIndex < 0)) {\n        const col = prevIndex % cols;\n        const maxCol = maxIndex % cols;\n        const offset = maxIndex - (maxCol - col);\n        if (maxCol === col) {\n          nextIndex = maxIndex;\n        } else {\n          nextIndex = maxCol > col ? offset : offset - cols;\n        }\n      }\n    }\n    if (isIndexOutOfBounds(elementsRef, nextIndex)) {\n      nextIndex = prevIndex;\n    }\n  }\n  if (event.key === ARROW_DOWN) {\n    stop && stopEvent(event);\n    if (prevIndex === -1) {\n      nextIndex = minIndex;\n    } else {\n      nextIndex = findNonDisabledIndex(elementsRef, {\n        startingIndex: prevIndex,\n        amount: cols,\n        disabledIndices\n      });\n      if (loop && prevIndex + cols > maxIndex) {\n        nextIndex = findNonDisabledIndex(elementsRef, {\n          startingIndex: prevIndex % cols - cols,\n          amount: cols,\n          disabledIndices\n        });\n      }\n    }\n    if (isIndexOutOfBounds(elementsRef, nextIndex)) {\n      nextIndex = prevIndex;\n    }\n  }\n\n  // Remains on the same row/column.\n  if (orientation === 'both') {\n    const prevRow = floor(prevIndex / cols);\n    if (event.key === (rtl ? ARROW_LEFT : ARROW_RIGHT)) {\n      stop && stopEvent(event);\n      if (prevIndex % cols !== cols - 1) {\n        nextIndex = findNonDisabledIndex(elementsRef, {\n          startingIndex: prevIndex,\n          disabledIndices\n        });\n        if (loop && isDifferentRow(nextIndex, cols, prevRow)) {\n          nextIndex = findNonDisabledIndex(elementsRef, {\n            startingIndex: prevIndex - prevIndex % cols - 1,\n            disabledIndices\n          });\n        }\n      } else if (loop) {\n        nextIndex = findNonDisabledIndex(elementsRef, {\n          startingIndex: prevIndex - prevIndex % cols - 1,\n          disabledIndices\n        });\n      }\n      if (isDifferentRow(nextIndex, cols, prevRow)) {\n        nextIndex = prevIndex;\n      }\n    }\n    if (event.key === (rtl ? ARROW_RIGHT : ARROW_LEFT)) {\n      stop && stopEvent(event);\n      if (prevIndex % cols !== 0) {\n        nextIndex = findNonDisabledIndex(elementsRef, {\n          startingIndex: prevIndex,\n          decrement: true,\n          disabledIndices\n        });\n        if (loop && isDifferentRow(nextIndex, cols, prevRow)) {\n          nextIndex = findNonDisabledIndex(elementsRef, {\n            startingIndex: prevIndex + (cols - prevIndex % cols),\n            decrement: true,\n            disabledIndices\n          });\n        }\n      } else if (loop) {\n        nextIndex = findNonDisabledIndex(elementsRef, {\n          startingIndex: prevIndex + (cols - prevIndex % cols),\n          decrement: true,\n          disabledIndices\n        });\n      }\n      if (isDifferentRow(nextIndex, cols, prevRow)) {\n        nextIndex = prevIndex;\n      }\n    }\n    const lastRow = floor(maxIndex / cols) === prevRow;\n    if (isIndexOutOfBounds(elementsRef, nextIndex)) {\n      if (loop && lastRow) {\n        nextIndex = event.key === (rtl ? ARROW_RIGHT : ARROW_LEFT) ? maxIndex : findNonDisabledIndex(elementsRef, {\n          startingIndex: prevIndex - prevIndex % cols - 1,\n          disabledIndices\n        });\n      } else {\n        nextIndex = prevIndex;\n      }\n    }\n  }\n  return nextIndex;\n}\n\n/** For each cell index, gets the item index that occupies that cell */\nfunction buildCellMap(sizes, cols, dense) {\n  const cellMap = [];\n  let startIndex = 0;\n  sizes.forEach((_ref2, index) => {\n    let {\n      width,\n      height\n    } = _ref2;\n    if (width > cols) {\n      if (process.env.NODE_ENV !== \"production\") {\n        throw new Error(\"[Floating UI]: Invalid grid - item width at index \" + index + \" is greater than grid columns\");\n      }\n    }\n    let itemPlaced = false;\n    if (dense) {\n      startIndex = 0;\n    }\n    while (!itemPlaced) {\n      const targetCells = [];\n      for (let i = 0; i < width; i++) {\n        for (let j = 0; j < height; j++) {\n          targetCells.push(startIndex + i + j * cols);\n        }\n      }\n      if (startIndex % cols + width <= cols && targetCells.every(cell => cellMap[cell] == null)) {\n        targetCells.forEach(cell => {\n          cellMap[cell] = index;\n        });\n        itemPlaced = true;\n      } else {\n        startIndex++;\n      }\n    }\n  });\n\n  // convert into a non-sparse array\n  return [...cellMap];\n}\n\n/** Gets cell index of an item's corner or -1 when index is -1. */\nfunction getCellIndexOfCorner(index, sizes, cellMap, cols, corner) {\n  if (index === -1) return -1;\n  const firstCellIndex = cellMap.indexOf(index);\n  const sizeItem = sizes[index];\n  switch (corner) {\n    case 'tl':\n      return firstCellIndex;\n    case 'tr':\n      if (!sizeItem) {\n        return firstCellIndex;\n      }\n      return firstCellIndex + sizeItem.width - 1;\n    case 'bl':\n      if (!sizeItem) {\n        return firstCellIndex;\n      }\n      return firstCellIndex + (sizeItem.height - 1) * cols;\n    case 'br':\n      return cellMap.lastIndexOf(index);\n  }\n}\n\n/** Gets all cell indices that correspond to the specified indices */\nfunction getCellIndices(indices, cellMap) {\n  return cellMap.flatMap((index, cellIndex) => indices.includes(index) ? [cellIndex] : []);\n}\nfunction isDisabled(list, index, disabledIndices) {\n  if (disabledIndices) {\n    return disabledIndices.includes(index);\n  }\n  const element = list[index];\n  return element == null || element.hasAttribute('disabled') || element.getAttribute('aria-disabled') === 'true';\n}\n\nvar index = typeof document !== 'undefined' ? useLayoutEffect : useEffect;\n\nfunction sortByDocumentPosition(a, b) {\n  const position = a.compareDocumentPosition(b);\n  if (position & Node.DOCUMENT_POSITION_FOLLOWING || position & Node.DOCUMENT_POSITION_CONTAINED_BY) {\n    return -1;\n  }\n  if (position & Node.DOCUMENT_POSITION_PRECEDING || position & Node.DOCUMENT_POSITION_CONTAINS) {\n    return 1;\n  }\n  return 0;\n}\nfunction areMapsEqual(map1, map2) {\n  if (map1.size !== map2.size) {\n    return false;\n  }\n  for (const [key, value] of map1.entries()) {\n    if (value !== map2.get(key)) {\n      return false;\n    }\n  }\n  return true;\n}\nconst FloatingListContext = /*#__PURE__*/React.createContext({\n  register: () => {},\n  unregister: () => {},\n  map: /*#__PURE__*/new Map(),\n  elementsRef: {\n    current: []\n  }\n});\n/**\n * Provides context for a list of items within the floating element.\n * @see https://floating-ui.com/docs/FloatingList\n */\nfunction FloatingList(props) {\n  const {\n    children,\n    elementsRef,\n    labelsRef\n  } = props;\n  const [map, setMap] = React.useState(() => new Map());\n  const register = React.useCallback(node => {\n    setMap(prevMap => new Map(prevMap).set(node, null));\n  }, []);\n  const unregister = React.useCallback(node => {\n    setMap(prevMap => {\n      const map = new Map(prevMap);\n      map.delete(node);\n      return map;\n    });\n  }, []);\n  index(() => {\n    const newMap = new Map(map);\n    const nodes = Array.from(newMap.keys()).sort(sortByDocumentPosition);\n    nodes.forEach((node, index) => {\n      newMap.set(node, index);\n    });\n    if (!areMapsEqual(map, newMap)) {\n      setMap(newMap);\n    }\n  }, [map]);\n  return /*#__PURE__*/React.createElement(FloatingListContext.Provider, {\n    value: React.useMemo(() => ({\n      register,\n      unregister,\n      map,\n      elementsRef,\n      labelsRef\n    }), [register, unregister, map, elementsRef, labelsRef])\n  }, children);\n}\n/**\n * Used to register a list item and its index (DOM position) in the\n * `FloatingList`.\n * @see https://floating-ui.com/docs/FloatingList#uselistitem\n */\nfunction useListItem(props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    label\n  } = props;\n  const {\n    register,\n    unregister,\n    map,\n    elementsRef,\n    labelsRef\n  } = React.useContext(FloatingListContext);\n  const [index$1, setIndex] = React.useState(null);\n  const componentRef = React.useRef(null);\n  const ref = React.useCallback(node => {\n    componentRef.current = node;\n    if (index$1 !== null) {\n      elementsRef.current[index$1] = node;\n      if (labelsRef) {\n        var _node$textContent;\n        const isLabelDefined = label !== undefined;\n        labelsRef.current[index$1] = isLabelDefined ? label : (_node$textContent = node == null ? void 0 : node.textContent) != null ? _node$textContent : null;\n      }\n    }\n  }, [index$1, elementsRef, labelsRef, label]);\n  index(() => {\n    const node = componentRef.current;\n    if (node) {\n      register(node);\n      return () => {\n        unregister(node);\n      };\n    }\n  }, [register, unregister]);\n  index(() => {\n    const index = componentRef.current ? map.get(componentRef.current) : null;\n    if (index != null) {\n      setIndex(index);\n    }\n  }, [map]);\n  return React.useMemo(() => ({\n    ref,\n    index: index$1 == null ? -1 : index$1\n  }), [index$1, ref]);\n}\n\nfunction renderJsx(render, computedProps) {\n  if (typeof render === 'function') {\n    return render(computedProps);\n  }\n  if (render) {\n    return /*#__PURE__*/React.cloneElement(render, computedProps);\n  }\n  return /*#__PURE__*/React.createElement(\"div\", computedProps);\n}\nconst CompositeContext = /*#__PURE__*/React.createContext({\n  activeIndex: 0,\n  onNavigate: () => {}\n});\nconst horizontalKeys = [ARROW_LEFT, ARROW_RIGHT];\nconst verticalKeys = [ARROW_UP, ARROW_DOWN];\nconst allKeys = [...horizontalKeys, ...verticalKeys];\n\n/**\n * Creates a single tab stop whose items are navigated by arrow keys, which\n * provides list navigation outside of floating element contexts.\n *\n * This is useful to enable navigation of a list of items that aren’t part of a\n * floating element. A menubar is an example of a composite, with each reference\n * element being an item.\n * @see https://floating-ui.com/docs/Composite\n */\nconst Composite = /*#__PURE__*/React.forwardRef(function Composite(props, forwardedRef) {\n  const {\n    render,\n    orientation = 'both',\n    loop = true,\n    rtl = false,\n    cols = 1,\n    disabledIndices,\n    activeIndex: externalActiveIndex,\n    onNavigate: externalSetActiveIndex,\n    itemSizes,\n    dense = false,\n    ...domProps\n  } = props;\n  const [internalActiveIndex, internalSetActiveIndex] = React.useState(0);\n  const activeIndex = externalActiveIndex != null ? externalActiveIndex : internalActiveIndex;\n  const onNavigate = useEffectEvent(externalSetActiveIndex != null ? externalSetActiveIndex : internalSetActiveIndex);\n  const elementsRef = React.useRef([]);\n  const renderElementProps = render && typeof render !== 'function' ? render.props : {};\n  const contextValue = React.useMemo(() => ({\n    activeIndex,\n    onNavigate\n  }), [activeIndex, onNavigate]);\n  const isGrid = cols > 1;\n  function handleKeyDown(event) {\n    if (!allKeys.includes(event.key)) return;\n    let nextIndex = activeIndex;\n    const minIndex = getMinIndex(elementsRef, disabledIndices);\n    const maxIndex = getMaxIndex(elementsRef, disabledIndices);\n    const horizontalEndKey = rtl ? ARROW_LEFT : ARROW_RIGHT;\n    const horizontalStartKey = rtl ? ARROW_RIGHT : ARROW_LEFT;\n    if (isGrid) {\n      const sizes = itemSizes || Array.from({\n        length: elementsRef.current.length\n      }, () => ({\n        width: 1,\n        height: 1\n      }));\n      // To calculate movements on the grid, we use hypothetical cell indices\n      // as if every item was 1x1, then convert back to real indices.\n      const cellMap = buildCellMap(sizes, cols, dense);\n      const minGridIndex = cellMap.findIndex(index => index != null && !isDisabled(elementsRef.current, index, disabledIndices));\n      // last enabled index\n      const maxGridIndex = cellMap.reduce((foundIndex, index, cellIndex) => index != null && !isDisabled(elementsRef.current, index, disabledIndices) ? cellIndex : foundIndex, -1);\n      const maybeNextIndex = cellMap[getGridNavigatedIndex({\n        current: cellMap.map(itemIndex => itemIndex ? elementsRef.current[itemIndex] : null)\n      }, {\n        event,\n        orientation,\n        loop,\n        rtl,\n        cols,\n        // treat undefined (empty grid spaces) as disabled indices so we\n        // don't end up in them\n        disabledIndices: getCellIndices([...(disabledIndices || elementsRef.current.map((_, index) => isDisabled(elementsRef.current, index) ? index : undefined)), undefined], cellMap),\n        minIndex: minGridIndex,\n        maxIndex: maxGridIndex,\n        prevIndex: getCellIndexOfCorner(activeIndex > maxIndex ? minIndex : activeIndex, sizes, cellMap, cols,\n        // use a corner matching the edge closest to the direction we're\n        // moving in so we don't end up in the same item. Prefer\n        // top/left over bottom/right.\n        event.key === ARROW_DOWN ? 'bl' : event.key === horizontalEndKey ? 'tr' : 'tl')\n      })];\n      if (maybeNextIndex != null) {\n        nextIndex = maybeNextIndex;\n      }\n    }\n    const toEndKeys = {\n      horizontal: [horizontalEndKey],\n      vertical: [ARROW_DOWN],\n      both: [horizontalEndKey, ARROW_DOWN]\n    }[orientation];\n    const toStartKeys = {\n      horizontal: [horizontalStartKey],\n      vertical: [ARROW_UP],\n      both: [horizontalStartKey, ARROW_UP]\n    }[orientation];\n    const preventedKeys = isGrid ? allKeys : {\n      horizontal: horizontalKeys,\n      vertical: verticalKeys,\n      both: allKeys\n    }[orientation];\n    if (nextIndex === activeIndex && [...toEndKeys, ...toStartKeys].includes(event.key)) {\n      if (loop && nextIndex === maxIndex && toEndKeys.includes(event.key)) {\n        nextIndex = minIndex;\n      } else if (loop && nextIndex === minIndex && toStartKeys.includes(event.key)) {\n        nextIndex = maxIndex;\n      } else {\n        nextIndex = findNonDisabledIndex(elementsRef, {\n          startingIndex: nextIndex,\n          decrement: toStartKeys.includes(event.key),\n          disabledIndices\n        });\n      }\n    }\n    if (nextIndex !== activeIndex && !isIndexOutOfBounds(elementsRef, nextIndex)) {\n      var _elementsRef$current$;\n      event.stopPropagation();\n      if (preventedKeys.includes(event.key)) {\n        event.preventDefault();\n      }\n      onNavigate(nextIndex);\n      (_elementsRef$current$ = elementsRef.current[nextIndex]) == null || _elementsRef$current$.focus();\n    }\n  }\n  const computedProps = {\n    ...domProps,\n    ...renderElementProps,\n    ref: forwardedRef,\n    'aria-orientation': orientation === 'both' ? undefined : orientation,\n    onKeyDown(e) {\n      domProps.onKeyDown == null || domProps.onKeyDown(e);\n      renderElementProps.onKeyDown == null || renderElementProps.onKeyDown(e);\n      handleKeyDown(e);\n    }\n  };\n  return /*#__PURE__*/React.createElement(CompositeContext.Provider, {\n    value: contextValue\n  }, /*#__PURE__*/React.createElement(FloatingList, {\n    elementsRef: elementsRef\n  }, renderJsx(render, computedProps)));\n});\n/**\n * @see https://floating-ui.com/docs/Composite\n */\nconst CompositeItem = /*#__PURE__*/React.forwardRef(function CompositeItem(props, forwardedRef) {\n  const {\n    render,\n    ...domProps\n  } = props;\n  const renderElementProps = render && typeof render !== 'function' ? render.props : {};\n  const {\n    activeIndex,\n    onNavigate\n  } = React.useContext(CompositeContext);\n  const {\n    ref,\n    index\n  } = useListItem();\n  const mergedRef = useMergeRefs([ref, forwardedRef, renderElementProps.ref]);\n  const isActive = activeIndex === index;\n  const computedProps = {\n    ...domProps,\n    ...renderElementProps,\n    ref: mergedRef,\n    tabIndex: isActive ? 0 : -1,\n    'data-active': isActive ? '' : undefined,\n    onFocus(e) {\n      domProps.onFocus == null || domProps.onFocus(e);\n      renderElementProps.onFocus == null || renderElementProps.onFocus(e);\n      onNavigate(index);\n    }\n  };\n  return renderJsx(render, computedProps);\n});\n\nfunction _extends() {\n  _extends = Object.assign ? Object.assign.bind() : function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n    return target;\n  };\n  return _extends.apply(this, arguments);\n}\n\nlet serverHandoffComplete = false;\nlet count = 0;\nconst genId = () => // Ensure the id is unique with multiple independent versions of Floating UI\n// on <React 18\n\"floating-ui-\" + Math.random().toString(36).slice(2, 6) + count++;\nfunction useFloatingId() {\n  const [id, setId] = React.useState(() => serverHandoffComplete ? genId() : undefined);\n  index(() => {\n    if (id == null) {\n      setId(genId());\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n  React.useEffect(() => {\n    serverHandoffComplete = true;\n  }, []);\n  return id;\n}\nconst useReactId = SafeReact.useId;\n\n/**\n * Uses React 18's built-in `useId()` when available, or falls back to a\n * slightly less performant (requiring a double render) implementation for\n * earlier React versions.\n * @see https://floating-ui.com/docs/react-utils#useid\n */\nconst useId = useReactId || useFloatingId;\n\nlet devMessageSet;\nif (process.env.NODE_ENV !== \"production\") {\n  devMessageSet = /*#__PURE__*/new Set();\n}\nfunction warn() {\n  var _devMessageSet;\n  for (var _len = arguments.length, messages = new Array(_len), _key = 0; _key < _len; _key++) {\n    messages[_key] = arguments[_key];\n  }\n  const message = \"Floating UI: \" + messages.join(' ');\n  if (!((_devMessageSet = devMessageSet) != null && _devMessageSet.has(message))) {\n    var _devMessageSet2;\n    (_devMessageSet2 = devMessageSet) == null || _devMessageSet2.add(message);\n    console.warn(message);\n  }\n}\nfunction error() {\n  var _devMessageSet3;\n  for (var _len2 = arguments.length, messages = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n    messages[_key2] = arguments[_key2];\n  }\n  const message = \"Floating UI: \" + messages.join(' ');\n  if (!((_devMessageSet3 = devMessageSet) != null && _devMessageSet3.has(message))) {\n    var _devMessageSet4;\n    (_devMessageSet4 = devMessageSet) == null || _devMessageSet4.add(message);\n    console.error(message);\n  }\n}\n\n/**\n * Renders a pointing arrow triangle.\n * @see https://floating-ui.com/docs/FloatingArrow\n */\nconst FloatingArrow = /*#__PURE__*/React.forwardRef(function FloatingArrow(props, ref) {\n  const {\n    context: {\n      placement,\n      elements: {\n        floating\n      },\n      middlewareData: {\n        arrow,\n        shift\n      }\n    },\n    width = 14,\n    height = 7,\n    tipRadius = 0,\n    strokeWidth = 0,\n    staticOffset,\n    stroke,\n    d,\n    style: {\n      transform,\n      ...restStyle\n    } = {},\n    ...rest\n  } = props;\n  if (process.env.NODE_ENV !== \"production\") {\n    if (!ref) {\n      warn('The `ref` prop is required for `FloatingArrow`.');\n    }\n  }\n  const clipPathId = useId();\n  const [isRTL, setIsRTL] = React.useState(false);\n\n  // https://github.com/floating-ui/floating-ui/issues/2932\n  index(() => {\n    if (!floating) return;\n    const isRTL = getComputedStyle(floating).direction === 'rtl';\n    if (isRTL) {\n      setIsRTL(true);\n    }\n  }, [floating]);\n  if (!floating) {\n    return null;\n  }\n  const [side, alignment] = placement.split('-');\n  const isVerticalSide = side === 'top' || side === 'bottom';\n  let computedStaticOffset = staticOffset;\n  if (isVerticalSide && shift != null && shift.x || !isVerticalSide && shift != null && shift.y) {\n    computedStaticOffset = null;\n  }\n\n  // Strokes must be double the border width, this ensures the stroke's width\n  // works as you'd expect.\n  const computedStrokeWidth = strokeWidth * 2;\n  const halfStrokeWidth = computedStrokeWidth / 2;\n  const svgX = width / 2 * (tipRadius / -8 + 1);\n  const svgY = height / 2 * tipRadius / 4;\n  const isCustomShape = !!d;\n  const yOffsetProp = computedStaticOffset && alignment === 'end' ? 'bottom' : 'top';\n  let xOffsetProp = computedStaticOffset && alignment === 'end' ? 'right' : 'left';\n  if (computedStaticOffset && isRTL) {\n    xOffsetProp = alignment === 'end' ? 'left' : 'right';\n  }\n  const arrowX = (arrow == null ? void 0 : arrow.x) != null ? computedStaticOffset || arrow.x : '';\n  const arrowY = (arrow == null ? void 0 : arrow.y) != null ? computedStaticOffset || arrow.y : '';\n  const dValue = d || 'M0,0' + (\" H\" + width) + (\" L\" + (width - svgX) + \",\" + (height - svgY)) + (\" Q\" + width / 2 + \",\" + height + \" \" + svgX + \",\" + (height - svgY)) + ' Z';\n  const rotation = {\n    top: isCustomShape ? 'rotate(180deg)' : '',\n    left: isCustomShape ? 'rotate(90deg)' : 'rotate(-90deg)',\n    bottom: isCustomShape ? '' : 'rotate(180deg)',\n    right: isCustomShape ? 'rotate(-90deg)' : 'rotate(90deg)'\n  }[side];\n  return /*#__PURE__*/React.createElement(\"svg\", _extends({}, rest, {\n    \"aria-hidden\": true,\n    ref: ref,\n    width: isCustomShape ? width : width + computedStrokeWidth,\n    height: width,\n    viewBox: \"0 0 \" + width + \" \" + (height > width ? height : width),\n    style: {\n      position: 'absolute',\n      pointerEvents: 'none',\n      [xOffsetProp]: arrowX,\n      [yOffsetProp]: arrowY,\n      [side]: isVerticalSide || isCustomShape ? '100%' : \"calc(100% - \" + computedStrokeWidth / 2 + \"px)\",\n      transform: [rotation, transform].filter(t => !!t).join(' '),\n      ...restStyle\n    }\n  }), computedStrokeWidth > 0 && /*#__PURE__*/React.createElement(\"path\", {\n    clipPath: \"url(#\" + clipPathId + \")\",\n    fill: \"none\",\n    stroke: stroke\n    // Account for the stroke on the fill path rendered below.\n    ,\n    strokeWidth: computedStrokeWidth + (d ? 0 : 1),\n    d: dValue\n  }), /*#__PURE__*/React.createElement(\"path\", {\n    stroke: computedStrokeWidth && !d ? rest.fill : 'none',\n    d: dValue\n  }), /*#__PURE__*/React.createElement(\"clipPath\", {\n    id: clipPathId\n  }, /*#__PURE__*/React.createElement(\"rect\", {\n    x: -halfStrokeWidth,\n    y: halfStrokeWidth * (isCustomShape ? -1 : 1),\n    width: width + computedStrokeWidth,\n    height: width\n  })));\n});\n\nfunction createPubSub() {\n  const map = new Map();\n  return {\n    emit(event, data) {\n      var _map$get;\n      (_map$get = map.get(event)) == null || _map$get.forEach(handler => handler(data));\n    },\n    on(event, listener) {\n      map.set(event, [...(map.get(event) || []), listener]);\n    },\n    off(event, listener) {\n      var _map$get2;\n      map.set(event, ((_map$get2 = map.get(event)) == null ? void 0 : _map$get2.filter(l => l !== listener)) || []);\n    }\n  };\n}\n\nconst FloatingNodeContext = /*#__PURE__*/React.createContext(null);\nconst FloatingTreeContext = /*#__PURE__*/React.createContext(null);\n\n/**\n * Returns the parent node id for nested floating elements, if available.\n * Returns `null` for top-level floating elements.\n */\nconst useFloatingParentNodeId = () => {\n  var _React$useContext;\n  return ((_React$useContext = React.useContext(FloatingNodeContext)) == null ? void 0 : _React$useContext.id) || null;\n};\n\n/**\n * Returns the nearest floating tree context, if available.\n */\nconst useFloatingTree = () => React.useContext(FloatingTreeContext);\n\n/**\n * Registers a node into the `FloatingTree`, returning its id.\n * @see https://floating-ui.com/docs/FloatingTree\n */\nfunction useFloatingNodeId(customParentId) {\n  const id = useId();\n  const tree = useFloatingTree();\n  const reactParentId = useFloatingParentNodeId();\n  const parentId = customParentId || reactParentId;\n  index(() => {\n    const node = {\n      id,\n      parentId\n    };\n    tree == null || tree.addNode(node);\n    return () => {\n      tree == null || tree.removeNode(node);\n    };\n  }, [tree, id, parentId]);\n  return id;\n}\n/**\n * Provides parent node context for nested floating elements.\n * @see https://floating-ui.com/docs/FloatingTree\n */\nfunction FloatingNode(props) {\n  const {\n    children,\n    id\n  } = props;\n  const parentId = useFloatingParentNodeId();\n  return /*#__PURE__*/React.createElement(FloatingNodeContext.Provider, {\n    value: React.useMemo(() => ({\n      id,\n      parentId\n    }), [id, parentId])\n  }, children);\n}\n/**\n * Provides context for nested floating elements when they are not children of\n * each other on the DOM.\n * This is not necessary in all cases, except when there must be explicit communication between parent and child floating elements. It is necessary for:\n * - The `bubbles` option in the `useDismiss()` Hook\n * - Nested virtual list navigation\n * - Nested floating elements that each open on hover\n * - Custom communication between parent and child floating elements\n * @see https://floating-ui.com/docs/FloatingTree\n */\nfunction FloatingTree(props) {\n  const {\n    children\n  } = props;\n  const nodesRef = React.useRef([]);\n  const addNode = React.useCallback(node => {\n    nodesRef.current = [...nodesRef.current, node];\n  }, []);\n  const removeNode = React.useCallback(node => {\n    nodesRef.current = nodesRef.current.filter(n => n !== node);\n  }, []);\n  const events = React.useState(() => createPubSub())[0];\n  return /*#__PURE__*/React.createElement(FloatingTreeContext.Provider, {\n    value: React.useMemo(() => ({\n      nodesRef,\n      addNode,\n      removeNode,\n      events\n    }), [addNode, removeNode, events])\n  }, children);\n}\n\nfunction createAttribute(name) {\n  return \"data-floating-ui-\" + name;\n}\n\nfunction useLatestRef(value) {\n  const ref = useRef(value);\n  index(() => {\n    ref.current = value;\n  });\n  return ref;\n}\n\nconst safePolygonIdentifier = /*#__PURE__*/createAttribute('safe-polygon');\nfunction getDelay(value, prop, pointerType) {\n  if (pointerType && !isMouseLikePointerType(pointerType)) {\n    return 0;\n  }\n  if (typeof value === 'number') {\n    return value;\n  }\n  return value == null ? void 0 : value[prop];\n}\n/**\n * Opens the floating element while hovering over the reference element, like\n * CSS `:hover`.\n * @see https://floating-ui.com/docs/useHover\n */\nfunction useHover(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    dataRef,\n    events,\n    elements\n  } = context;\n  const {\n    enabled = true,\n    delay = 0,\n    handleClose = null,\n    mouseOnly = false,\n    restMs = 0,\n    move = true\n  } = props;\n  const tree = useFloatingTree();\n  const parentId = useFloatingParentNodeId();\n  const handleCloseRef = useLatestRef(handleClose);\n  const delayRef = useLatestRef(delay);\n  const openRef = useLatestRef(open);\n  const pointerTypeRef = React.useRef();\n  const timeoutRef = React.useRef(-1);\n  const handlerRef = React.useRef();\n  const restTimeoutRef = React.useRef(-1);\n  const blockMouseMoveRef = React.useRef(true);\n  const performedPointerEventsMutationRef = React.useRef(false);\n  const unbindMouseMoveRef = React.useRef(() => {});\n  const restTimeoutPendingRef = React.useRef(false);\n  const isHoverOpen = React.useCallback(() => {\n    var _dataRef$current$open;\n    const type = (_dataRef$current$open = dataRef.current.openEvent) == null ? void 0 : _dataRef$current$open.type;\n    return (type == null ? void 0 : type.includes('mouse')) && type !== 'mousedown';\n  }, [dataRef]);\n\n  // When closing before opening, clear the delay timeouts to cancel it\n  // from showing.\n  React.useEffect(() => {\n    if (!enabled) return;\n    function onOpenChange(_ref) {\n      let {\n        open\n      } = _ref;\n      if (!open) {\n        clearTimeout(timeoutRef.current);\n        clearTimeout(restTimeoutRef.current);\n        blockMouseMoveRef.current = true;\n        restTimeoutPendingRef.current = false;\n      }\n    }\n    events.on('openchange', onOpenChange);\n    return () => {\n      events.off('openchange', onOpenChange);\n    };\n  }, [enabled, events]);\n  React.useEffect(() => {\n    if (!enabled) return;\n    if (!handleCloseRef.current) return;\n    if (!open) return;\n    function onLeave(event) {\n      if (isHoverOpen()) {\n        onOpenChange(false, event, 'hover');\n      }\n    }\n    const html = getDocument(elements.floating).documentElement;\n    html.addEventListener('mouseleave', onLeave);\n    return () => {\n      html.removeEventListener('mouseleave', onLeave);\n    };\n  }, [elements.floating, open, onOpenChange, enabled, handleCloseRef, isHoverOpen]);\n  const closeWithDelay = React.useCallback(function (event, runElseBranch, reason) {\n    if (runElseBranch === void 0) {\n      runElseBranch = true;\n    }\n    if (reason === void 0) {\n      reason = 'hover';\n    }\n    const closeDelay = getDelay(delayRef.current, 'close', pointerTypeRef.current);\n    if (closeDelay && !handlerRef.current) {\n      clearTimeout(timeoutRef.current);\n      timeoutRef.current = window.setTimeout(() => onOpenChange(false, event, reason), closeDelay);\n    } else if (runElseBranch) {\n      clearTimeout(timeoutRef.current);\n      onOpenChange(false, event, reason);\n    }\n  }, [delayRef, onOpenChange]);\n  const cleanupMouseMoveHandler = useEffectEvent(() => {\n    unbindMouseMoveRef.current();\n    handlerRef.current = undefined;\n  });\n  const clearPointerEvents = useEffectEvent(() => {\n    if (performedPointerEventsMutationRef.current) {\n      const body = getDocument(elements.floating).body;\n      body.style.pointerEvents = '';\n      body.removeAttribute(safePolygonIdentifier);\n      performedPointerEventsMutationRef.current = false;\n    }\n  });\n  const isClickLikeOpenEvent = useEffectEvent(() => {\n    return dataRef.current.openEvent ? ['click', 'mousedown'].includes(dataRef.current.openEvent.type) : false;\n  });\n\n  // Registering the mouse events on the reference directly to bypass React's\n  // delegation system. If the cursor was on a disabled element and then entered\n  // the reference (no gap), `mouseenter` doesn't fire in the delegation system.\n  React.useEffect(() => {\n    if (!enabled) return;\n    function onMouseEnter(event) {\n      clearTimeout(timeoutRef.current);\n      blockMouseMoveRef.current = false;\n      if (mouseOnly && !isMouseLikePointerType(pointerTypeRef.current) || restMs > 0 && !getDelay(delayRef.current, 'open')) {\n        return;\n      }\n      const openDelay = getDelay(delayRef.current, 'open', pointerTypeRef.current);\n      if (openDelay) {\n        timeoutRef.current = window.setTimeout(() => {\n          if (!openRef.current) {\n            onOpenChange(true, event, 'hover');\n          }\n        }, openDelay);\n      } else if (!open) {\n        onOpenChange(true, event, 'hover');\n      }\n    }\n    function onMouseLeave(event) {\n      if (isClickLikeOpenEvent()) return;\n      unbindMouseMoveRef.current();\n      const doc = getDocument(elements.floating);\n      clearTimeout(restTimeoutRef.current);\n      restTimeoutPendingRef.current = false;\n      if (handleCloseRef.current && dataRef.current.floatingContext) {\n        // Prevent clearing `onScrollMouseLeave` timeout.\n        if (!open) {\n          clearTimeout(timeoutRef.current);\n        }\n        handlerRef.current = handleCloseRef.current({\n          ...dataRef.current.floatingContext,\n          tree,\n          x: event.clientX,\n          y: event.clientY,\n          onClose() {\n            clearPointerEvents();\n            cleanupMouseMoveHandler();\n            if (!isClickLikeOpenEvent()) {\n              closeWithDelay(event, true, 'safe-polygon');\n            }\n          }\n        });\n        const handler = handlerRef.current;\n        doc.addEventListener('mousemove', handler);\n        unbindMouseMoveRef.current = () => {\n          doc.removeEventListener('mousemove', handler);\n        };\n        return;\n      }\n\n      // Allow interactivity without `safePolygon` on touch devices. With a\n      // pointer, a short close delay is an alternative, so it should work\n      // consistently.\n      const shouldClose = pointerTypeRef.current === 'touch' ? !contains(elements.floating, event.relatedTarget) : true;\n      if (shouldClose) {\n        closeWithDelay(event);\n      }\n    }\n\n    // Ensure the floating element closes after scrolling even if the pointer\n    // did not move.\n    // https://github.com/floating-ui/floating-ui/discussions/1692\n    function onScrollMouseLeave(event) {\n      if (isClickLikeOpenEvent()) return;\n      if (!dataRef.current.floatingContext) return;\n      handleCloseRef.current == null || handleCloseRef.current({\n        ...dataRef.current.floatingContext,\n        tree,\n        x: event.clientX,\n        y: event.clientY,\n        onClose() {\n          clearPointerEvents();\n          cleanupMouseMoveHandler();\n          if (!isClickLikeOpenEvent()) {\n            closeWithDelay(event);\n          }\n        }\n      })(event);\n    }\n    if (isElement(elements.domReference)) {\n      var _elements$floating;\n      const ref = elements.domReference;\n      open && ref.addEventListener('mouseleave', onScrollMouseLeave);\n      (_elements$floating = elements.floating) == null || _elements$floating.addEventListener('mouseleave', onScrollMouseLeave);\n      move && ref.addEventListener('mousemove', onMouseEnter, {\n        once: true\n      });\n      ref.addEventListener('mouseenter', onMouseEnter);\n      ref.addEventListener('mouseleave', onMouseLeave);\n      return () => {\n        var _elements$floating2;\n        open && ref.removeEventListener('mouseleave', onScrollMouseLeave);\n        (_elements$floating2 = elements.floating) == null || _elements$floating2.removeEventListener('mouseleave', onScrollMouseLeave);\n        move && ref.removeEventListener('mousemove', onMouseEnter);\n        ref.removeEventListener('mouseenter', onMouseEnter);\n        ref.removeEventListener('mouseleave', onMouseLeave);\n      };\n    }\n  }, [elements, enabled, context, mouseOnly, restMs, move, closeWithDelay, cleanupMouseMoveHandler, clearPointerEvents, onOpenChange, open, openRef, tree, delayRef, handleCloseRef, dataRef, isClickLikeOpenEvent]);\n\n  // Block pointer-events of every element other than the reference and floating\n  // while the floating element is open and has a `handleClose` handler. Also\n  // handles nested floating elements.\n  // https://github.com/floating-ui/floating-ui/issues/1722\n  index(() => {\n    var _handleCloseRef$curre;\n    if (!enabled) return;\n    if (open && (_handleCloseRef$curre = handleCloseRef.current) != null && _handleCloseRef$curre.__options.blockPointerEvents && isHoverOpen()) {\n      performedPointerEventsMutationRef.current = true;\n      const floatingEl = elements.floating;\n      if (isElement(elements.domReference) && floatingEl) {\n        var _tree$nodesRef$curren;\n        const body = getDocument(elements.floating).body;\n        body.setAttribute(safePolygonIdentifier, '');\n        const ref = elements.domReference;\n        const parentFloating = tree == null || (_tree$nodesRef$curren = tree.nodesRef.current.find(node => node.id === parentId)) == null || (_tree$nodesRef$curren = _tree$nodesRef$curren.context) == null ? void 0 : _tree$nodesRef$curren.elements.floating;\n        if (parentFloating) {\n          parentFloating.style.pointerEvents = '';\n        }\n        body.style.pointerEvents = 'none';\n        ref.style.pointerEvents = 'auto';\n        floatingEl.style.pointerEvents = 'auto';\n        return () => {\n          body.style.pointerEvents = '';\n          ref.style.pointerEvents = '';\n          floatingEl.style.pointerEvents = '';\n        };\n      }\n    }\n  }, [enabled, open, parentId, elements, tree, handleCloseRef, isHoverOpen]);\n  index(() => {\n    if (!open) {\n      pointerTypeRef.current = undefined;\n      restTimeoutPendingRef.current = false;\n      cleanupMouseMoveHandler();\n      clearPointerEvents();\n    }\n  }, [open, cleanupMouseMoveHandler, clearPointerEvents]);\n  React.useEffect(() => {\n    return () => {\n      cleanupMouseMoveHandler();\n      clearTimeout(timeoutRef.current);\n      clearTimeout(restTimeoutRef.current);\n      clearPointerEvents();\n    };\n  }, [enabled, elements.domReference, cleanupMouseMoveHandler, clearPointerEvents]);\n  const reference = React.useMemo(() => {\n    function setPointerRef(event) {\n      pointerTypeRef.current = event.pointerType;\n    }\n    return {\n      onPointerDown: setPointerRef,\n      onPointerEnter: setPointerRef,\n      onMouseMove(event) {\n        const {\n          nativeEvent\n        } = event;\n        function handleMouseMove() {\n          if (!blockMouseMoveRef.current && !openRef.current) {\n            onOpenChange(true, nativeEvent, 'hover');\n          }\n        }\n        if (mouseOnly && !isMouseLikePointerType(pointerTypeRef.current)) {\n          return;\n        }\n        if (open || restMs === 0) {\n          return;\n        }\n\n        // Ignore insignificant movements to account for tremors.\n        if (restTimeoutPendingRef.current && event.movementX ** 2 + event.movementY ** 2 < 2) {\n          return;\n        }\n        clearTimeout(restTimeoutRef.current);\n        if (pointerTypeRef.current === 'touch') {\n          handleMouseMove();\n        } else {\n          restTimeoutPendingRef.current = true;\n          restTimeoutRef.current = window.setTimeout(handleMouseMove, restMs);\n        }\n      }\n    };\n  }, [mouseOnly, onOpenChange, open, openRef, restMs]);\n  const floating = React.useMemo(() => ({\n    onMouseEnter() {\n      clearTimeout(timeoutRef.current);\n    },\n    onMouseLeave(event) {\n      if (!isClickLikeOpenEvent()) {\n        closeWithDelay(event.nativeEvent, false);\n      }\n    }\n  }), [closeWithDelay, isClickLikeOpenEvent]);\n  return React.useMemo(() => enabled ? {\n    reference,\n    floating\n  } : {}, [enabled, reference, floating]);\n}\n\nconst NOOP = () => {};\nconst FloatingDelayGroupContext = /*#__PURE__*/React.createContext({\n  delay: 0,\n  initialDelay: 0,\n  timeoutMs: 0,\n  currentId: null,\n  setCurrentId: NOOP,\n  setState: NOOP,\n  isInstantPhase: false\n});\n\n/**\n * @deprecated\n * Use the return value of `useDelayGroup()` instead.\n */\nconst useDelayGroupContext = () => React.useContext(FloatingDelayGroupContext);\n/**\n * Provides context for a group of floating elements that should share a\n * `delay`.\n * @see https://floating-ui.com/docs/FloatingDelayGroup\n */\nfunction FloatingDelayGroup(props) {\n  const {\n    children,\n    delay,\n    timeoutMs = 0\n  } = props;\n  const [state, setState] = React.useReducer((prev, next) => ({\n    ...prev,\n    ...next\n  }), {\n    delay,\n    timeoutMs,\n    initialDelay: delay,\n    currentId: null,\n    isInstantPhase: false\n  });\n  const initialCurrentIdRef = React.useRef(null);\n  const setCurrentId = React.useCallback(currentId => {\n    setState({\n      currentId\n    });\n  }, []);\n  index(() => {\n    if (state.currentId) {\n      if (initialCurrentIdRef.current === null) {\n        initialCurrentIdRef.current = state.currentId;\n      } else if (!state.isInstantPhase) {\n        setState({\n          isInstantPhase: true\n        });\n      }\n    } else {\n      if (state.isInstantPhase) {\n        setState({\n          isInstantPhase: false\n        });\n      }\n      initialCurrentIdRef.current = null;\n    }\n  }, [state.currentId, state.isInstantPhase]);\n  return /*#__PURE__*/React.createElement(FloatingDelayGroupContext.Provider, {\n    value: React.useMemo(() => ({\n      ...state,\n      setState,\n      setCurrentId\n    }), [state, setCurrentId])\n  }, children);\n}\n/**\n * Enables grouping when called inside a component that's a child of a\n * `FloatingDelayGroup`.\n * @see https://floating-ui.com/docs/FloatingDelayGroup\n */\nfunction useDelayGroup(context, options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    floatingId\n  } = context;\n  const {\n    id: optionId,\n    enabled = true\n  } = options;\n  const id = optionId != null ? optionId : floatingId;\n  const groupContext = useDelayGroupContext();\n  const {\n    currentId,\n    setCurrentId,\n    initialDelay,\n    setState,\n    timeoutMs\n  } = groupContext;\n  index(() => {\n    if (!enabled) return;\n    if (!currentId) return;\n    setState({\n      delay: {\n        open: 1,\n        close: getDelay(initialDelay, 'close')\n      }\n    });\n    if (currentId !== id) {\n      onOpenChange(false);\n    }\n  }, [enabled, id, onOpenChange, setState, currentId, initialDelay]);\n  index(() => {\n    function unset() {\n      onOpenChange(false);\n      setState({\n        delay: initialDelay,\n        currentId: null\n      });\n    }\n    if (!enabled) return;\n    if (!currentId) return;\n    if (!open && currentId === id) {\n      if (timeoutMs) {\n        const timeout = window.setTimeout(unset, timeoutMs);\n        return () => {\n          clearTimeout(timeout);\n        };\n      }\n      unset();\n    }\n  }, [enabled, open, setState, currentId, id, onOpenChange, initialDelay, timeoutMs]);\n  index(() => {\n    if (!enabled) return;\n    if (setCurrentId === NOOP || !open) return;\n    setCurrentId(id);\n  }, [enabled, open, setCurrentId, id]);\n  return groupContext;\n}\n\nlet rafId = 0;\nfunction enqueueFocus(el, options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    preventScroll = false,\n    cancelPrevious = true,\n    sync = false\n  } = options;\n  cancelPrevious && cancelAnimationFrame(rafId);\n  const exec = () => el == null ? void 0 : el.focus({\n    preventScroll\n  });\n  if (sync) {\n    exec();\n  } else {\n    rafId = requestAnimationFrame(exec);\n  }\n}\n\nfunction getAncestors(nodes, id) {\n  var _nodes$find;\n  let allAncestors = [];\n  let currentParentId = (_nodes$find = nodes.find(node => node.id === id)) == null ? void 0 : _nodes$find.parentId;\n  while (currentParentId) {\n    const currentNode = nodes.find(node => node.id === currentParentId);\n    currentParentId = currentNode == null ? void 0 : currentNode.parentId;\n    if (currentNode) {\n      allAncestors = allAncestors.concat(currentNode);\n    }\n  }\n  return allAncestors;\n}\n\nfunction getChildren(nodes, id) {\n  let allChildren = nodes.filter(node => {\n    var _node$context;\n    return node.parentId === id && ((_node$context = node.context) == null ? void 0 : _node$context.open);\n  });\n  let currentChildren = allChildren;\n  while (currentChildren.length) {\n    currentChildren = nodes.filter(node => {\n      var _currentChildren;\n      return (_currentChildren = currentChildren) == null ? void 0 : _currentChildren.some(n => {\n        var _node$context2;\n        return node.parentId === n.id && ((_node$context2 = node.context) == null ? void 0 : _node$context2.open);\n      });\n    });\n    allChildren = allChildren.concat(currentChildren);\n  }\n  return allChildren;\n}\nfunction getDeepestNode(nodes, id) {\n  let deepestNodeId;\n  let maxDepth = -1;\n  function findDeepest(nodeId, depth) {\n    if (depth > maxDepth) {\n      deepestNodeId = nodeId;\n      maxDepth = depth;\n    }\n    const children = getChildren(nodes, nodeId);\n    children.forEach(child => {\n      findDeepest(child.id, depth + 1);\n    });\n  }\n  findDeepest(id, 0);\n  return nodes.find(node => node.id === deepestNodeId);\n}\n\n// Modified to add conditional `aria-hidden` support:\n// https://github.com/theKashey/aria-hidden/blob/9220c8f4a4fd35f63bee5510a9f41a37264382d4/src/index.ts\nlet counterMap = /*#__PURE__*/new WeakMap();\nlet uncontrolledElementsSet = /*#__PURE__*/new WeakSet();\nlet markerMap = {};\nlet lockCount$1 = 0;\nconst supportsInert = () => typeof HTMLElement !== 'undefined' && 'inert' in HTMLElement.prototype;\nconst unwrapHost = node => node && (node.host || unwrapHost(node.parentNode));\nconst correctElements = (parent, targets) => targets.map(target => {\n  if (parent.contains(target)) {\n    return target;\n  }\n  const correctedTarget = unwrapHost(target);\n  if (parent.contains(correctedTarget)) {\n    return correctedTarget;\n  }\n  return null;\n}).filter(x => x != null);\nfunction applyAttributeToOthers(uncorrectedAvoidElements, body, ariaHidden, inert) {\n  const markerName = 'data-floating-ui-inert';\n  const controlAttribute = inert ? 'inert' : ariaHidden ? 'aria-hidden' : null;\n  const avoidElements = correctElements(body, uncorrectedAvoidElements);\n  const elementsToKeep = new Set();\n  const elementsToStop = new Set(avoidElements);\n  const hiddenElements = [];\n  if (!markerMap[markerName]) {\n    markerMap[markerName] = new WeakMap();\n  }\n  const markerCounter = markerMap[markerName];\n  avoidElements.forEach(keep);\n  deep(body);\n  elementsToKeep.clear();\n  function keep(el) {\n    if (!el || elementsToKeep.has(el)) {\n      return;\n    }\n    elementsToKeep.add(el);\n    el.parentNode && keep(el.parentNode);\n  }\n  function deep(parent) {\n    if (!parent || elementsToStop.has(parent)) {\n      return;\n    }\n    [].forEach.call(parent.children, node => {\n      if (getNodeName(node) === 'script') return;\n      if (elementsToKeep.has(node)) {\n        deep(node);\n      } else {\n        const attr = controlAttribute ? node.getAttribute(controlAttribute) : null;\n        const alreadyHidden = attr !== null && attr !== 'false';\n        const counterValue = (counterMap.get(node) || 0) + 1;\n        const markerValue = (markerCounter.get(node) || 0) + 1;\n        counterMap.set(node, counterValue);\n        markerCounter.set(node, markerValue);\n        hiddenElements.push(node);\n        if (counterValue === 1 && alreadyHidden) {\n          uncontrolledElementsSet.add(node);\n        }\n        if (markerValue === 1) {\n          node.setAttribute(markerName, '');\n        }\n        if (!alreadyHidden && controlAttribute) {\n          node.setAttribute(controlAttribute, 'true');\n        }\n      }\n    });\n  }\n  lockCount$1++;\n  return () => {\n    hiddenElements.forEach(element => {\n      const counterValue = (counterMap.get(element) || 0) - 1;\n      const markerValue = (markerCounter.get(element) || 0) - 1;\n      counterMap.set(element, counterValue);\n      markerCounter.set(element, markerValue);\n      if (!counterValue) {\n        if (!uncontrolledElementsSet.has(element) && controlAttribute) {\n          element.removeAttribute(controlAttribute);\n        }\n        uncontrolledElementsSet.delete(element);\n      }\n      if (!markerValue) {\n        element.removeAttribute(markerName);\n      }\n    });\n    lockCount$1--;\n    if (!lockCount$1) {\n      counterMap = new WeakMap();\n      counterMap = new WeakMap();\n      uncontrolledElementsSet = new WeakSet();\n      markerMap = {};\n    }\n  };\n}\nfunction markOthers(avoidElements, ariaHidden, inert) {\n  if (ariaHidden === void 0) {\n    ariaHidden = false;\n  }\n  if (inert === void 0) {\n    inert = false;\n  }\n  const body = getDocument(avoidElements[0]).body;\n  return applyAttributeToOthers(avoidElements.concat(Array.from(body.querySelectorAll('[aria-live]'))), body, ariaHidden, inert);\n}\n\nconst getTabbableOptions = () => ({\n  getShadowRoot: true,\n  displayCheck:\n  // JSDOM does not support the `tabbable` library. To solve this we can\n  // check if `ResizeObserver` is a real function (not polyfilled), which\n  // determines if the current environment is JSDOM-like.\n  typeof ResizeObserver === 'function' && ResizeObserver.toString().includes('[native code]') ? 'full' : 'none'\n});\nfunction getTabbableIn(container, direction) {\n  const allTabbable = tabbable(container, getTabbableOptions());\n  if (direction === 'prev') {\n    allTabbable.reverse();\n  }\n  const activeIndex = allTabbable.indexOf(activeElement(getDocument(container)));\n  const nextTabbableElements = allTabbable.slice(activeIndex + 1);\n  return nextTabbableElements[0];\n}\nfunction getNextTabbable() {\n  return getTabbableIn(document.body, 'next');\n}\nfunction getPreviousTabbable() {\n  return getTabbableIn(document.body, 'prev');\n}\nfunction isOutsideEvent(event, container) {\n  const containerElement = container || event.currentTarget;\n  const relatedTarget = event.relatedTarget;\n  return !relatedTarget || !contains(containerElement, relatedTarget);\n}\nfunction disableFocusInside(container) {\n  const tabbableElements = tabbable(container, getTabbableOptions());\n  tabbableElements.forEach(element => {\n    element.dataset.tabindex = element.getAttribute('tabindex') || '';\n    element.setAttribute('tabindex', '-1');\n  });\n}\nfunction enableFocusInside(container) {\n  const elements = container.querySelectorAll('[data-tabindex]');\n  elements.forEach(element => {\n    const tabindex = element.dataset.tabindex;\n    delete element.dataset.tabindex;\n    if (tabindex) {\n      element.setAttribute('tabindex', tabindex);\n    } else {\n      element.removeAttribute('tabindex');\n    }\n  });\n}\n\n// See Diego Haz's Sandbox for making this logic work well on Safari/iOS:\n// https://codesandbox.io/s/tabbable-portal-f4tng?file=/src/FocusTrap.tsx\n\nconst HIDDEN_STYLES = {\n  border: 0,\n  clip: 'rect(0 0 0 0)',\n  height: '1px',\n  margin: '-1px',\n  overflow: 'hidden',\n  padding: 0,\n  position: 'fixed',\n  whiteSpace: 'nowrap',\n  width: '1px',\n  top: 0,\n  left: 0\n};\nlet timeoutId;\nfunction setActiveElementOnTab(event) {\n  if (event.key === 'Tab') {\n    event.target;\n    clearTimeout(timeoutId);\n  }\n}\nconst FocusGuard = /*#__PURE__*/React.forwardRef(function FocusGuard(props, ref) {\n  const [role, setRole] = React.useState();\n  index(() => {\n    if (isSafari()) {\n      // Unlike other screen readers such as NVDA and JAWS, the virtual cursor\n      // on VoiceOver does trigger the onFocus event, so we can use the focus\n      // trap element. On Safari, only buttons trigger the onFocus event.\n      // NB: \"group\" role in the Sandbox no longer appears to work, must be a\n      // button role.\n      setRole('button');\n    }\n    document.addEventListener('keydown', setActiveElementOnTab);\n    return () => {\n      document.removeEventListener('keydown', setActiveElementOnTab);\n    };\n  }, []);\n  const restProps = {\n    ref,\n    tabIndex: 0,\n    // Role is only for VoiceOver\n    role,\n    'aria-hidden': role ? undefined : true,\n    [createAttribute('focus-guard')]: '',\n    style: HIDDEN_STYLES\n  };\n  return /*#__PURE__*/React.createElement(\"span\", _extends({}, props, restProps));\n});\n\nconst PortalContext = /*#__PURE__*/React.createContext(null);\nconst attr = /*#__PURE__*/createAttribute('portal');\n/**\n * @see https://floating-ui.com/docs/FloatingPortal#usefloatingportalnode\n */\nfunction useFloatingPortalNode(props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    id,\n    root\n  } = props;\n  const uniqueId = useId();\n  const portalContext = usePortalContext();\n  const [portalNode, setPortalNode] = React.useState(null);\n  const portalNodeRef = React.useRef(null);\n  index(() => {\n    return () => {\n      portalNode == null || portalNode.remove();\n      // Allow the subsequent layout effects to create a new node on updates.\n      // The portal node will still be cleaned up on unmount.\n      // https://github.com/floating-ui/floating-ui/issues/2454\n      queueMicrotask(() => {\n        portalNodeRef.current = null;\n      });\n    };\n  }, [portalNode]);\n  index(() => {\n    // Wait for the uniqueId to be generated before creating the portal node in\n    // React <18 (using `useFloatingId` instead of the native `useId`).\n    // https://github.com/floating-ui/floating-ui/issues/2778\n    if (!uniqueId) return;\n    if (portalNodeRef.current) return;\n    const existingIdRoot = id ? document.getElementById(id) : null;\n    if (!existingIdRoot) return;\n    const subRoot = document.createElement('div');\n    subRoot.id = uniqueId;\n    subRoot.setAttribute(attr, '');\n    existingIdRoot.appendChild(subRoot);\n    portalNodeRef.current = subRoot;\n    setPortalNode(subRoot);\n  }, [id, uniqueId]);\n  index(() => {\n    // Wait for the root to exist before creating the portal node. The root must\n    // be stored in state, not a ref, for this to work reactively.\n    if (root === null) return;\n    if (!uniqueId) return;\n    if (portalNodeRef.current) return;\n    let container = root || (portalContext == null ? void 0 : portalContext.portalNode);\n    if (container && !isElement(container)) container = container.current;\n    container = container || document.body;\n    let idWrapper = null;\n    if (id) {\n      idWrapper = document.createElement('div');\n      idWrapper.id = id;\n      container.appendChild(idWrapper);\n    }\n    const subRoot = document.createElement('div');\n    subRoot.id = uniqueId;\n    subRoot.setAttribute(attr, '');\n    container = idWrapper || container;\n    container.appendChild(subRoot);\n    portalNodeRef.current = subRoot;\n    setPortalNode(subRoot);\n  }, [id, root, uniqueId, portalContext]);\n  return portalNode;\n}\n/**\n * Portals the floating element into a given container element — by default,\n * outside of the app root and into the body.\n * This is necessary to ensure the floating element can appear outside any\n * potential parent containers that cause clipping (such as `overflow: hidden`),\n * while retaining its location in the React tree.\n * @see https://floating-ui.com/docs/FloatingPortal\n */\nfunction FloatingPortal(props) {\n  const {\n    children,\n    id,\n    root,\n    preserveTabOrder = true\n  } = props;\n  const portalNode = useFloatingPortalNode({\n    id,\n    root\n  });\n  const [focusManagerState, setFocusManagerState] = React.useState(null);\n  const beforeOutsideRef = React.useRef(null);\n  const afterOutsideRef = React.useRef(null);\n  const beforeInsideRef = React.useRef(null);\n  const afterInsideRef = React.useRef(null);\n  const modal = focusManagerState == null ? void 0 : focusManagerState.modal;\n  const open = focusManagerState == null ? void 0 : focusManagerState.open;\n  const shouldRenderGuards =\n  // The FocusManager and therefore floating element are currently open/\n  // rendered.\n  !!focusManagerState &&\n  // Guards are only for non-modal focus management.\n  !focusManagerState.modal &&\n  // Don't render if unmount is transitioning.\n  focusManagerState.open && preserveTabOrder && !!(root || portalNode);\n\n  // https://codesandbox.io/s/tabbable-portal-f4tng?file=/src/TabbablePortal.tsx\n  React.useEffect(() => {\n    if (!portalNode || !preserveTabOrder || modal) {\n      return;\n    }\n\n    // Make sure elements inside the portal element are tabbable only when the\n    // portal has already been focused, either by tabbing into a focus trap\n    // element outside or using the mouse.\n    function onFocus(event) {\n      if (portalNode && isOutsideEvent(event)) {\n        const focusing = event.type === 'focusin';\n        const manageFocus = focusing ? enableFocusInside : disableFocusInside;\n        manageFocus(portalNode);\n      }\n    }\n    // Listen to the event on the capture phase so they run before the focus\n    // trap elements onFocus prop is called.\n    portalNode.addEventListener('focusin', onFocus, true);\n    portalNode.addEventListener('focusout', onFocus, true);\n    return () => {\n      portalNode.removeEventListener('focusin', onFocus, true);\n      portalNode.removeEventListener('focusout', onFocus, true);\n    };\n  }, [portalNode, preserveTabOrder, modal]);\n  React.useEffect(() => {\n    if (!portalNode) return;\n    if (open) return;\n    enableFocusInside(portalNode);\n  }, [open, portalNode]);\n  return /*#__PURE__*/React.createElement(PortalContext.Provider, {\n    value: React.useMemo(() => ({\n      preserveTabOrder,\n      beforeOutsideRef,\n      afterOutsideRef,\n      beforeInsideRef,\n      afterInsideRef,\n      portalNode,\n      setFocusManagerState\n    }), [preserveTabOrder, portalNode])\n  }, shouldRenderGuards && portalNode && /*#__PURE__*/React.createElement(FocusGuard, {\n    \"data-type\": \"outside\",\n    ref: beforeOutsideRef,\n    onFocus: event => {\n      if (isOutsideEvent(event, portalNode)) {\n        var _beforeInsideRef$curr;\n        (_beforeInsideRef$curr = beforeInsideRef.current) == null || _beforeInsideRef$curr.focus();\n      } else {\n        const prevTabbable = getPreviousTabbable() || (focusManagerState == null ? void 0 : focusManagerState.refs.domReference.current);\n        prevTabbable == null || prevTabbable.focus();\n      }\n    }\n  }), shouldRenderGuards && portalNode && /*#__PURE__*/React.createElement(\"span\", {\n    \"aria-owns\": portalNode.id,\n    style: HIDDEN_STYLES\n  }), portalNode && /*#__PURE__*/ReactDOM.createPortal(children, portalNode), shouldRenderGuards && portalNode && /*#__PURE__*/React.createElement(FocusGuard, {\n    \"data-type\": \"outside\",\n    ref: afterOutsideRef,\n    onFocus: event => {\n      if (isOutsideEvent(event, portalNode)) {\n        var _afterInsideRef$curre;\n        (_afterInsideRef$curre = afterInsideRef.current) == null || _afterInsideRef$curre.focus();\n      } else {\n        const nextTabbable = getNextTabbable() || (focusManagerState == null ? void 0 : focusManagerState.refs.domReference.current);\n        nextTabbable == null || nextTabbable.focus();\n        (focusManagerState == null ? void 0 : focusManagerState.closeOnFocusOut) && (focusManagerState == null ? void 0 : focusManagerState.onOpenChange(false, event.nativeEvent, 'focus-out'));\n      }\n    }\n  }));\n}\nconst usePortalContext = () => React.useContext(PortalContext);\n\nconst FOCUSABLE_ATTRIBUTE = 'data-floating-ui-focusable';\nfunction getFloatingFocusElement(floatingElement) {\n  if (!floatingElement) {\n    return null;\n  }\n  // Try to find the element that has `{...getFloatingProps()}` spread on it.\n  // This indicates the floating element is acting as a positioning wrapper, and\n  // so focus should be managed on the child element with the event handlers and\n  // aria props.\n  return floatingElement.hasAttribute(FOCUSABLE_ATTRIBUTE) ? floatingElement : floatingElement.querySelector(\"[\" + FOCUSABLE_ATTRIBUTE + \"]\") || floatingElement;\n}\n\nconst LIST_LIMIT = 20;\nlet previouslyFocusedElements = [];\nfunction addPreviouslyFocusedElement(element) {\n  previouslyFocusedElements = previouslyFocusedElements.filter(el => el.isConnected);\n  let tabbableEl = element;\n  if (!tabbableEl || getNodeName(tabbableEl) === 'body') return;\n  if (!isTabbable(tabbableEl, getTabbableOptions())) {\n    const tabbableChild = tabbable(tabbableEl, getTabbableOptions())[0];\n    if (tabbableChild) {\n      tabbableEl = tabbableChild;\n    }\n  }\n  previouslyFocusedElements.push(tabbableEl);\n  if (previouslyFocusedElements.length > LIST_LIMIT) {\n    previouslyFocusedElements = previouslyFocusedElements.slice(-LIST_LIMIT);\n  }\n}\nfunction getPreviouslyFocusedElement() {\n  return previouslyFocusedElements.slice().reverse().find(el => el.isConnected);\n}\nconst VisuallyHiddenDismiss = /*#__PURE__*/React.forwardRef(function VisuallyHiddenDismiss(props, ref) {\n  return /*#__PURE__*/React.createElement(\"button\", _extends({}, props, {\n    type: \"button\",\n    ref: ref,\n    tabIndex: -1,\n    style: HIDDEN_STYLES\n  }));\n});\n/**\n * Provides focus management for the floating element.\n * @see https://floating-ui.com/docs/FloatingFocusManager\n */\nfunction FloatingFocusManager(props) {\n  const {\n    context,\n    children,\n    disabled = false,\n    order = ['content'],\n    guards: _guards = true,\n    initialFocus = 0,\n    returnFocus = true,\n    restoreFocus = false,\n    modal = true,\n    visuallyHiddenDismiss = false,\n    closeOnFocusOut = true\n  } = props;\n  const {\n    open,\n    refs,\n    nodeId,\n    onOpenChange,\n    events,\n    dataRef,\n    floatingId,\n    elements: {\n      domReference,\n      floating\n    }\n  } = context;\n  const ignoreInitialFocus = typeof initialFocus === 'number' && initialFocus < 0;\n  // If the reference is a combobox and is typeable (e.g. input/textarea),\n  // there are different focus semantics. The guards should not be rendered, but\n  // aria-hidden should be applied to all nodes still. Further, the visually\n  // hidden dismiss button should only appear at the end of the list, not the\n  // start.\n  const isUntrappedTypeableCombobox = isTypeableCombobox(domReference) && ignoreInitialFocus;\n\n  // Force the guards to be rendered if the `inert` attribute is not supported.\n  const guards = supportsInert() ? _guards : true;\n  const orderRef = useLatestRef(order);\n  const initialFocusRef = useLatestRef(initialFocus);\n  const returnFocusRef = useLatestRef(returnFocus);\n  const tree = useFloatingTree();\n  const portalContext = usePortalContext();\n  const startDismissButtonRef = React.useRef(null);\n  const endDismissButtonRef = React.useRef(null);\n  const preventReturnFocusRef = React.useRef(false);\n  const isPointerDownRef = React.useRef(false);\n  const tabbableIndexRef = React.useRef(-1);\n  const isInsidePortal = portalContext != null;\n  const floatingFocusElement = getFloatingFocusElement(floating);\n  const getTabbableContent = useEffectEvent(function (container) {\n    if (container === void 0) {\n      container = floatingFocusElement;\n    }\n    return container ? tabbable(container, getTabbableOptions()) : [];\n  });\n  const getTabbableElements = useEffectEvent(container => {\n    const content = getTabbableContent(container);\n    return orderRef.current.map(type => {\n      if (domReference && type === 'reference') {\n        return domReference;\n      }\n      if (floatingFocusElement && type === 'floating') {\n        return floatingFocusElement;\n      }\n      return content;\n    }).filter(Boolean).flat();\n  });\n  React.useEffect(() => {\n    if (disabled) return;\n    if (!modal) return;\n    function onKeyDown(event) {\n      if (event.key === 'Tab') {\n        // The focus guards have nothing to focus, so we need to stop the event.\n        if (contains(floatingFocusElement, activeElement(getDocument(floatingFocusElement))) && getTabbableContent().length === 0 && !isUntrappedTypeableCombobox) {\n          stopEvent(event);\n        }\n        const els = getTabbableElements();\n        const target = getTarget(event);\n        if (orderRef.current[0] === 'reference' && target === domReference) {\n          stopEvent(event);\n          if (event.shiftKey) {\n            enqueueFocus(els[els.length - 1]);\n          } else {\n            enqueueFocus(els[1]);\n          }\n        }\n        if (orderRef.current[1] === 'floating' && target === floatingFocusElement && event.shiftKey) {\n          stopEvent(event);\n          enqueueFocus(els[0]);\n        }\n      }\n    }\n    const doc = getDocument(floatingFocusElement);\n    doc.addEventListener('keydown', onKeyDown);\n    return () => {\n      doc.removeEventListener('keydown', onKeyDown);\n    };\n  }, [disabled, domReference, floatingFocusElement, modal, orderRef, isUntrappedTypeableCombobox, getTabbableContent, getTabbableElements]);\n  React.useEffect(() => {\n    if (disabled) return;\n    if (!floating) return;\n    function handleFocusIn(event) {\n      const target = getTarget(event);\n      const tabbableContent = getTabbableContent();\n      const tabbableIndex = tabbableContent.indexOf(target);\n      if (tabbableIndex !== -1) {\n        tabbableIndexRef.current = tabbableIndex;\n      }\n    }\n    floating.addEventListener('focusin', handleFocusIn);\n    return () => {\n      floating.removeEventListener('focusin', handleFocusIn);\n    };\n  }, [disabled, floating, getTabbableContent]);\n  React.useEffect(() => {\n    if (disabled) return;\n    if (!closeOnFocusOut) return;\n\n    // In Safari, buttons lose focus when pressing them.\n    function handlePointerDown() {\n      isPointerDownRef.current = true;\n      setTimeout(() => {\n        isPointerDownRef.current = false;\n      });\n    }\n    function handleFocusOutside(event) {\n      const relatedTarget = event.relatedTarget;\n      queueMicrotask(() => {\n        const movedToUnrelatedNode = !(contains(domReference, relatedTarget) || contains(floating, relatedTarget) || contains(relatedTarget, floating) || contains(portalContext == null ? void 0 : portalContext.portalNode, relatedTarget) || relatedTarget != null && relatedTarget.hasAttribute(createAttribute('focus-guard')) || tree && (getChildren(tree.nodesRef.current, nodeId).find(node => {\n          var _node$context, _node$context2;\n          return contains((_node$context = node.context) == null ? void 0 : _node$context.elements.floating, relatedTarget) || contains((_node$context2 = node.context) == null ? void 0 : _node$context2.elements.domReference, relatedTarget);\n        }) || getAncestors(tree.nodesRef.current, nodeId).find(node => {\n          var _node$context3, _node$context4;\n          return ((_node$context3 = node.context) == null ? void 0 : _node$context3.elements.floating) === relatedTarget || ((_node$context4 = node.context) == null ? void 0 : _node$context4.elements.domReference) === relatedTarget;\n        })));\n\n        // Restore focus to the previous tabbable element index to prevent\n        // focus from being lost outside the floating tree.\n        if (restoreFocus && movedToUnrelatedNode && activeElement(getDocument(floatingFocusElement)) === getDocument(floatingFocusElement).body) {\n          // Let `FloatingPortal` effect knows that focus is still inside the\n          // floating tree.\n          if (isHTMLElement(floatingFocusElement)) {\n            floatingFocusElement.focus();\n          }\n          const prevTabbableIndex = tabbableIndexRef.current;\n          const tabbableContent = getTabbableContent();\n          const nodeToFocus = tabbableContent[prevTabbableIndex] || tabbableContent[tabbableContent.length - 1] || floatingFocusElement;\n          if (isHTMLElement(nodeToFocus)) {\n            nodeToFocus.focus();\n          }\n        }\n\n        // Focus did not move inside the floating tree, and there are no tabbable\n        // portal guards to handle closing.\n        if ((isUntrappedTypeableCombobox ? true : !modal) && relatedTarget && movedToUnrelatedNode && !isPointerDownRef.current &&\n        // Fix React 18 Strict Mode returnFocus due to double rendering.\n        relatedTarget !== getPreviouslyFocusedElement()) {\n          preventReturnFocusRef.current = true;\n          onOpenChange(false, event, 'focus-out');\n        }\n      });\n    }\n    if (floating && isHTMLElement(domReference)) {\n      domReference.addEventListener('focusout', handleFocusOutside);\n      domReference.addEventListener('pointerdown', handlePointerDown);\n      floating.addEventListener('focusout', handleFocusOutside);\n      return () => {\n        domReference.removeEventListener('focusout', handleFocusOutside);\n        domReference.removeEventListener('pointerdown', handlePointerDown);\n        floating.removeEventListener('focusout', handleFocusOutside);\n      };\n    }\n  }, [disabled, domReference, floating, floatingFocusElement, modal, nodeId, tree, portalContext, onOpenChange, closeOnFocusOut, restoreFocus, getTabbableContent, isUntrappedTypeableCombobox]);\n  React.useEffect(() => {\n    var _portalContext$portal;\n    if (disabled) return;\n\n    // Don't hide portals nested within the parent portal.\n    const portalNodes = Array.from((portalContext == null || (_portalContext$portal = portalContext.portalNode) == null ? void 0 : _portalContext$portal.querySelectorAll(\"[\" + createAttribute('portal') + \"]\")) || []);\n    if (floating) {\n      const insideElements = [floating, ...portalNodes, startDismissButtonRef.current, endDismissButtonRef.current, orderRef.current.includes('reference') || isUntrappedTypeableCombobox ? domReference : null].filter(x => x != null);\n      const cleanup = modal || isUntrappedTypeableCombobox ? markOthers(insideElements, guards, !guards) : markOthers(insideElements);\n      return () => {\n        cleanup();\n      };\n    }\n  }, [disabled, domReference, floating, modal, orderRef, portalContext, isUntrappedTypeableCombobox, guards]);\n  index(() => {\n    if (disabled || !isHTMLElement(floatingFocusElement)) return;\n    const doc = getDocument(floatingFocusElement);\n    const previouslyFocusedElement = activeElement(doc);\n\n    // Wait for any layout effect state setters to execute to set `tabIndex`.\n    queueMicrotask(() => {\n      const focusableElements = getTabbableElements(floatingFocusElement);\n      const initialFocusValue = initialFocusRef.current;\n      const elToFocus = (typeof initialFocusValue === 'number' ? focusableElements[initialFocusValue] : initialFocusValue.current) || floatingFocusElement;\n      const focusAlreadyInsideFloatingEl = contains(floatingFocusElement, previouslyFocusedElement);\n      if (!ignoreInitialFocus && !focusAlreadyInsideFloatingEl && open) {\n        enqueueFocus(elToFocus, {\n          preventScroll: elToFocus === floatingFocusElement\n        });\n      }\n    });\n  }, [disabled, open, floatingFocusElement, ignoreInitialFocus, getTabbableElements, initialFocusRef]);\n  index(() => {\n    if (disabled || !floatingFocusElement) return;\n    let preventReturnFocusScroll = false;\n    const doc = getDocument(floatingFocusElement);\n    const previouslyFocusedElement = activeElement(doc);\n    const contextData = dataRef.current;\n    let openEvent = contextData.openEvent;\n    addPreviouslyFocusedElement(previouslyFocusedElement);\n\n    // Dismissing via outside press should always ignore `returnFocus` to\n    // prevent unwanted scrolling.\n    function onOpenChange(_ref) {\n      let {\n        open,\n        reason,\n        event,\n        nested\n      } = _ref;\n      if (open) {\n        openEvent = event;\n      }\n      if (reason === 'escape-key' && refs.domReference.current) {\n        addPreviouslyFocusedElement(refs.domReference.current);\n      }\n      if (reason === 'hover' && event.type === 'mouseleave') {\n        preventReturnFocusRef.current = true;\n      }\n      if (reason !== 'outside-press') return;\n      if (nested) {\n        preventReturnFocusRef.current = false;\n        preventReturnFocusScroll = true;\n      } else {\n        preventReturnFocusRef.current = !(isVirtualClick(event) || isVirtualPointerEvent(event));\n      }\n    }\n    events.on('openchange', onOpenChange);\n    const fallbackEl = doc.createElement('span');\n    fallbackEl.setAttribute('tabindex', '-1');\n    fallbackEl.setAttribute('aria-hidden', 'true');\n    Object.assign(fallbackEl.style, HIDDEN_STYLES);\n    if (isInsidePortal && domReference) {\n      domReference.insertAdjacentElement('afterend', fallbackEl);\n    }\n    function getReturnElement() {\n      if (typeof returnFocusRef.current === 'boolean') {\n        return getPreviouslyFocusedElement() || fallbackEl;\n      }\n      return returnFocusRef.current.current || fallbackEl;\n    }\n    return () => {\n      events.off('openchange', onOpenChange);\n      const activeEl = activeElement(doc);\n      const isFocusInsideFloatingTree = contains(floating, activeEl) || tree && getChildren(tree.nodesRef.current, nodeId).some(node => {\n        var _node$context5;\n        return contains((_node$context5 = node.context) == null ? void 0 : _node$context5.elements.floating, activeEl);\n      });\n      const shouldFocusReference = isFocusInsideFloatingTree || openEvent && ['click', 'mousedown'].includes(openEvent.type);\n      if (shouldFocusReference && refs.domReference.current) {\n        addPreviouslyFocusedElement(refs.domReference.current);\n      }\n      const returnElement = getReturnElement();\n      queueMicrotask(() => {\n        if (\n        // eslint-disable-next-line react-hooks/exhaustive-deps\n        returnFocusRef.current && !preventReturnFocusRef.current && isHTMLElement(returnElement) && (\n        // If the focus moved somewhere else after mount, avoid returning focus\n        // since it likely entered a different element which should be\n        // respected: https://github.com/floating-ui/floating-ui/issues/2607\n        returnElement !== activeEl && activeEl !== doc.body ? isFocusInsideFloatingTree : true)) {\n          returnElement.focus({\n            preventScroll: preventReturnFocusScroll\n          });\n        }\n        fallbackEl.remove();\n      });\n    };\n  }, [disabled, floating, floatingFocusElement, returnFocusRef, dataRef, refs, events, tree, nodeId, isInsidePortal, domReference]);\n  React.useEffect(() => {\n    // The `returnFocus` cleanup behavior is inside a microtask; ensure we\n    // wait for it to complete before resetting the flag.\n    queueMicrotask(() => {\n      preventReturnFocusRef.current = false;\n    });\n  }, [disabled]);\n\n  // Synchronize the `context` & `modal` value to the FloatingPortal context.\n  // It will decide whether or not it needs to render its own guards.\n  index(() => {\n    if (disabled) return;\n    if (!portalContext) return;\n    portalContext.setFocusManagerState({\n      modal,\n      closeOnFocusOut,\n      open,\n      onOpenChange,\n      refs\n    });\n    return () => {\n      portalContext.setFocusManagerState(null);\n    };\n  }, [disabled, portalContext, modal, open, onOpenChange, refs, closeOnFocusOut]);\n  index(() => {\n    if (disabled) return;\n    if (!floatingFocusElement) return;\n    if (typeof MutationObserver !== 'function') return;\n    if (ignoreInitialFocus) return;\n    const handleMutation = () => {\n      const tabIndex = floatingFocusElement.getAttribute('tabindex');\n      const tabbableContent = getTabbableContent();\n      const activeEl = activeElement(getDocument(floating));\n      const tabbableIndex = tabbableContent.indexOf(activeEl);\n      if (tabbableIndex !== -1) {\n        tabbableIndexRef.current = tabbableIndex;\n      }\n      if (orderRef.current.includes('floating') || activeEl !== refs.domReference.current && tabbableContent.length === 0) {\n        if (tabIndex !== '0') {\n          floatingFocusElement.setAttribute('tabindex', '0');\n        }\n      } else if (tabIndex !== '-1') {\n        floatingFocusElement.setAttribute('tabindex', '-1');\n      }\n    };\n    handleMutation();\n    const observer = new MutationObserver(handleMutation);\n    observer.observe(floatingFocusElement, {\n      childList: true,\n      subtree: true,\n      attributes: true\n    });\n    return () => {\n      observer.disconnect();\n    };\n  }, [disabled, floating, floatingFocusElement, refs, orderRef, getTabbableContent, ignoreInitialFocus]);\n  function renderDismissButton(location) {\n    if (disabled || !visuallyHiddenDismiss || !modal) {\n      return null;\n    }\n    return /*#__PURE__*/React.createElement(VisuallyHiddenDismiss, {\n      ref: location === 'start' ? startDismissButtonRef : endDismissButtonRef,\n      onClick: event => onOpenChange(false, event.nativeEvent)\n    }, typeof visuallyHiddenDismiss === 'string' ? visuallyHiddenDismiss : 'Dismiss');\n  }\n  const shouldRenderGuards = !disabled && guards && (modal ? !isUntrappedTypeableCombobox : true) && (isInsidePortal || modal);\n  return /*#__PURE__*/React.createElement(React.Fragment, null, shouldRenderGuards && /*#__PURE__*/React.createElement(FocusGuard, {\n    \"data-type\": \"inside\",\n    ref: portalContext == null ? void 0 : portalContext.beforeInsideRef,\n    onFocus: event => {\n      if (modal) {\n        const els = getTabbableElements();\n        enqueueFocus(order[0] === 'reference' ? els[0] : els[els.length - 1]);\n      } else if (portalContext != null && portalContext.preserveTabOrder && portalContext.portalNode) {\n        preventReturnFocusRef.current = false;\n        if (isOutsideEvent(event, portalContext.portalNode)) {\n          const nextTabbable = getNextTabbable() || domReference;\n          nextTabbable == null || nextTabbable.focus();\n        } else {\n          var _portalContext$before;\n          (_portalContext$before = portalContext.beforeOutsideRef.current) == null || _portalContext$before.focus();\n        }\n      }\n    }\n  }), !isUntrappedTypeableCombobox && renderDismissButton('start'), children, renderDismissButton('end'), shouldRenderGuards && /*#__PURE__*/React.createElement(FocusGuard, {\n    \"data-type\": \"inside\",\n    ref: portalContext == null ? void 0 : portalContext.afterInsideRef,\n    onFocus: event => {\n      if (modal) {\n        enqueueFocus(getTabbableElements()[0]);\n      } else if (portalContext != null && portalContext.preserveTabOrder && portalContext.portalNode) {\n        if (closeOnFocusOut) {\n          preventReturnFocusRef.current = true;\n        }\n        if (isOutsideEvent(event, portalContext.portalNode)) {\n          const prevTabbable = getPreviousTabbable() || domReference;\n          prevTabbable == null || prevTabbable.focus();\n        } else {\n          var _portalContext$afterO;\n          (_portalContext$afterO = portalContext.afterOutsideRef.current) == null || _portalContext$afterO.focus();\n        }\n      }\n    }\n  }));\n}\n\nlet lockCount = 0;\nfunction enableScrollLock() {\n  const isIOS = /iP(hone|ad|od)|iOS/.test(getPlatform());\n  const bodyStyle = document.body.style;\n  // RTL <body> scrollbar\n  const scrollbarX = Math.round(document.documentElement.getBoundingClientRect().left) + document.documentElement.scrollLeft;\n  const paddingProp = scrollbarX ? 'paddingLeft' : 'paddingRight';\n  const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n  const scrollX = bodyStyle.left ? parseFloat(bodyStyle.left) : window.scrollX;\n  const scrollY = bodyStyle.top ? parseFloat(bodyStyle.top) : window.scrollY;\n  bodyStyle.overflow = 'hidden';\n  if (scrollbarWidth) {\n    bodyStyle[paddingProp] = scrollbarWidth + \"px\";\n  }\n\n  // Only iOS doesn't respect `overflow: hidden` on document.body, and this\n  // technique has fewer side effects.\n  if (isIOS) {\n    var _window$visualViewpor, _window$visualViewpor2;\n    // iOS 12 does not support `visualViewport`.\n    const offsetLeft = ((_window$visualViewpor = window.visualViewport) == null ? void 0 : _window$visualViewpor.offsetLeft) || 0;\n    const offsetTop = ((_window$visualViewpor2 = window.visualViewport) == null ? void 0 : _window$visualViewpor2.offsetTop) || 0;\n    Object.assign(bodyStyle, {\n      position: 'fixed',\n      top: -(scrollY - Math.floor(offsetTop)) + \"px\",\n      left: -(scrollX - Math.floor(offsetLeft)) + \"px\",\n      right: '0'\n    });\n  }\n  return () => {\n    Object.assign(bodyStyle, {\n      overflow: '',\n      [paddingProp]: ''\n    });\n    if (isIOS) {\n      Object.assign(bodyStyle, {\n        position: '',\n        top: '',\n        left: '',\n        right: ''\n      });\n      window.scrollTo(scrollX, scrollY);\n    }\n  };\n}\nlet cleanup = () => {};\n\n/**\n * Provides base styling for a fixed overlay element to dim content or block\n * pointer events behind a floating element.\n * It's a regular `<div>`, so it can be styled via any CSS solution you prefer.\n * @see https://floating-ui.com/docs/FloatingOverlay\n */\nconst FloatingOverlay = /*#__PURE__*/React.forwardRef(function FloatingOverlay(props, ref) {\n  const {\n    lockScroll = false,\n    ...rest\n  } = props;\n  index(() => {\n    if (!lockScroll) return;\n    lockCount++;\n    if (lockCount === 1) {\n      cleanup = enableScrollLock();\n    }\n    return () => {\n      lockCount--;\n      if (lockCount === 0) {\n        cleanup();\n      }\n    };\n  }, [lockScroll]);\n  return /*#__PURE__*/React.createElement(\"div\", _extends({\n    ref: ref\n  }, rest, {\n    style: {\n      position: 'fixed',\n      overflow: 'auto',\n      top: 0,\n      right: 0,\n      bottom: 0,\n      left: 0,\n      ...rest.style\n    }\n  }));\n});\n\nfunction isButtonTarget(event) {\n  return isHTMLElement(event.target) && event.target.tagName === 'BUTTON';\n}\nfunction isSpaceIgnored(element) {\n  return isTypeableElement(element);\n}\n/**\n * Opens or closes the floating element when clicking the reference element.\n * @see https://floating-ui.com/docs/useClick\n */\nfunction useClick(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    dataRef,\n    elements: {\n      domReference\n    }\n  } = context;\n  const {\n    enabled = true,\n    event: eventOption = 'click',\n    toggle = true,\n    ignoreMouse = false,\n    keyboardHandlers = true,\n    stickIfOpen = true\n  } = props;\n  const pointerTypeRef = React.useRef();\n  const didKeyDownRef = React.useRef(false);\n  const reference = React.useMemo(() => ({\n    onPointerDown(event) {\n      pointerTypeRef.current = event.pointerType;\n    },\n    onMouseDown(event) {\n      const pointerType = pointerTypeRef.current;\n\n      // Ignore all buttons except for the \"main\" button.\n      // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button\n      if (event.button !== 0) return;\n      if (eventOption === 'click') return;\n      if (isMouseLikePointerType(pointerType, true) && ignoreMouse) return;\n      if (open && toggle && (dataRef.current.openEvent && stickIfOpen ? dataRef.current.openEvent.type === 'mousedown' : true)) {\n        onOpenChange(false, event.nativeEvent, 'click');\n      } else {\n        // Prevent stealing focus from the floating element\n        event.preventDefault();\n        onOpenChange(true, event.nativeEvent, 'click');\n      }\n    },\n    onClick(event) {\n      const pointerType = pointerTypeRef.current;\n      if (eventOption === 'mousedown' && pointerTypeRef.current) {\n        pointerTypeRef.current = undefined;\n        return;\n      }\n      if (isMouseLikePointerType(pointerType, true) && ignoreMouse) return;\n      if (open && toggle && (dataRef.current.openEvent && stickIfOpen ? dataRef.current.openEvent.type === 'click' : true)) {\n        onOpenChange(false, event.nativeEvent, 'click');\n      } else {\n        onOpenChange(true, event.nativeEvent, 'click');\n      }\n    },\n    onKeyDown(event) {\n      pointerTypeRef.current = undefined;\n      if (event.defaultPrevented || !keyboardHandlers || isButtonTarget(event)) {\n        return;\n      }\n      if (event.key === ' ' && !isSpaceIgnored(domReference)) {\n        // Prevent scrolling\n        event.preventDefault();\n        didKeyDownRef.current = true;\n      }\n      if (event.key === 'Enter') {\n        if (open && toggle) {\n          onOpenChange(false, event.nativeEvent, 'click');\n        } else {\n          onOpenChange(true, event.nativeEvent, 'click');\n        }\n      }\n    },\n    onKeyUp(event) {\n      if (event.defaultPrevented || !keyboardHandlers || isButtonTarget(event) || isSpaceIgnored(domReference)) {\n        return;\n      }\n      if (event.key === ' ' && didKeyDownRef.current) {\n        didKeyDownRef.current = false;\n        if (open && toggle) {\n          onOpenChange(false, event.nativeEvent, 'click');\n        } else {\n          onOpenChange(true, event.nativeEvent, 'click');\n        }\n      }\n    }\n  }), [dataRef, domReference, eventOption, ignoreMouse, keyboardHandlers, onOpenChange, open, stickIfOpen, toggle]);\n  return React.useMemo(() => enabled ? {\n    reference\n  } : {}, [enabled, reference]);\n}\n\nfunction createVirtualElement(domElement, data) {\n  let offsetX = null;\n  let offsetY = null;\n  let isAutoUpdateEvent = false;\n  return {\n    contextElement: domElement || undefined,\n    getBoundingClientRect() {\n      var _data$dataRef$current;\n      const domRect = (domElement == null ? void 0 : domElement.getBoundingClientRect()) || {\n        width: 0,\n        height: 0,\n        x: 0,\n        y: 0\n      };\n      const isXAxis = data.axis === 'x' || data.axis === 'both';\n      const isYAxis = data.axis === 'y' || data.axis === 'both';\n      const canTrackCursorOnAutoUpdate = ['mouseenter', 'mousemove'].includes(((_data$dataRef$current = data.dataRef.current.openEvent) == null ? void 0 : _data$dataRef$current.type) || '') && data.pointerType !== 'touch';\n      let width = domRect.width;\n      let height = domRect.height;\n      let x = domRect.x;\n      let y = domRect.y;\n      if (offsetX == null && data.x && isXAxis) {\n        offsetX = domRect.x - data.x;\n      }\n      if (offsetY == null && data.y && isYAxis) {\n        offsetY = domRect.y - data.y;\n      }\n      x -= offsetX || 0;\n      y -= offsetY || 0;\n      width = 0;\n      height = 0;\n      if (!isAutoUpdateEvent || canTrackCursorOnAutoUpdate) {\n        width = data.axis === 'y' ? domRect.width : 0;\n        height = data.axis === 'x' ? domRect.height : 0;\n        x = isXAxis && data.x != null ? data.x : x;\n        y = isYAxis && data.y != null ? data.y : y;\n      } else if (isAutoUpdateEvent && !canTrackCursorOnAutoUpdate) {\n        height = data.axis === 'x' ? domRect.height : height;\n        width = data.axis === 'y' ? domRect.width : width;\n      }\n      isAutoUpdateEvent = true;\n      return {\n        width,\n        height,\n        x,\n        y,\n        top: y,\n        right: x + width,\n        bottom: y + height,\n        left: x\n      };\n    }\n  };\n}\nfunction isMouseBasedEvent(event) {\n  return event != null && event.clientX != null;\n}\n/**\n * Positions the floating element relative to a client point (in the viewport),\n * such as the mouse position. By default, it follows the mouse cursor.\n * @see https://floating-ui.com/docs/useClientPoint\n */\nfunction useClientPoint(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    dataRef,\n    elements: {\n      floating,\n      domReference\n    },\n    refs\n  } = context;\n  const {\n    enabled = true,\n    axis = 'both',\n    x = null,\n    y = null\n  } = props;\n  const initialRef = React.useRef(false);\n  const cleanupListenerRef = React.useRef(null);\n  const [pointerType, setPointerType] = React.useState();\n  const [reactive, setReactive] = React.useState([]);\n  const setReference = useEffectEvent((x, y) => {\n    if (initialRef.current) return;\n\n    // Prevent setting if the open event was not a mouse-like one\n    // (e.g. focus to open, then hover over the reference element).\n    // Only apply if the event exists.\n    if (dataRef.current.openEvent && !isMouseBasedEvent(dataRef.current.openEvent)) {\n      return;\n    }\n    refs.setPositionReference(createVirtualElement(domReference, {\n      x,\n      y,\n      axis,\n      dataRef,\n      pointerType\n    }));\n  });\n  const handleReferenceEnterOrMove = useEffectEvent(event => {\n    if (x != null || y != null) return;\n    if (!open) {\n      setReference(event.clientX, event.clientY);\n    } else if (!cleanupListenerRef.current) {\n      // If there's no cleanup, there's no listener, but we want to ensure\n      // we add the listener if the cursor landed on the floating element and\n      // then back on the reference (i.e. it's interactive).\n      setReactive([]);\n    }\n  });\n\n  // If the pointer is a mouse-like pointer, we want to continue following the\n  // mouse even if the floating element is transitioning out. On touch\n  // devices, this is undesirable because the floating element will move to\n  // the dismissal touch point.\n  const openCheck = isMouseLikePointerType(pointerType) ? floating : open;\n  const addListener = React.useCallback(() => {\n    // Explicitly specified `x`/`y` coordinates shouldn't add a listener.\n    if (!openCheck || !enabled || x != null || y != null) return;\n    const win = getWindow(floating);\n    function handleMouseMove(event) {\n      const target = getTarget(event);\n      if (!contains(floating, target)) {\n        setReference(event.clientX, event.clientY);\n      } else {\n        win.removeEventListener('mousemove', handleMouseMove);\n        cleanupListenerRef.current = null;\n      }\n    }\n    if (!dataRef.current.openEvent || isMouseBasedEvent(dataRef.current.openEvent)) {\n      win.addEventListener('mousemove', handleMouseMove);\n      const cleanup = () => {\n        win.removeEventListener('mousemove', handleMouseMove);\n        cleanupListenerRef.current = null;\n      };\n      cleanupListenerRef.current = cleanup;\n      return cleanup;\n    }\n    refs.setPositionReference(domReference);\n  }, [openCheck, enabled, x, y, floating, dataRef, refs, domReference, setReference]);\n  React.useEffect(() => {\n    return addListener();\n  }, [addListener, reactive]);\n  React.useEffect(() => {\n    if (enabled && !floating) {\n      initialRef.current = false;\n    }\n  }, [enabled, floating]);\n  React.useEffect(() => {\n    if (!enabled && open) {\n      initialRef.current = true;\n    }\n  }, [enabled, open]);\n  index(() => {\n    if (enabled && (x != null || y != null)) {\n      initialRef.current = false;\n      setReference(x, y);\n    }\n  }, [enabled, x, y, setReference]);\n  const reference = React.useMemo(() => {\n    function setPointerTypeRef(_ref) {\n      let {\n        pointerType\n      } = _ref;\n      setPointerType(pointerType);\n    }\n    return {\n      onPointerDown: setPointerTypeRef,\n      onPointerEnter: setPointerTypeRef,\n      onMouseMove: handleReferenceEnterOrMove,\n      onMouseEnter: handleReferenceEnterOrMove\n    };\n  }, [handleReferenceEnterOrMove]);\n  return React.useMemo(() => enabled ? {\n    reference\n  } : {}, [enabled, reference]);\n}\n\nconst bubbleHandlerKeys = {\n  pointerdown: 'onPointerDown',\n  mousedown: 'onMouseDown',\n  click: 'onClick'\n};\nconst captureHandlerKeys = {\n  pointerdown: 'onPointerDownCapture',\n  mousedown: 'onMouseDownCapture',\n  click: 'onClickCapture'\n};\nconst normalizeProp = normalizable => {\n  var _normalizable$escapeK, _normalizable$outside;\n  return {\n    escapeKey: typeof normalizable === 'boolean' ? normalizable : (_normalizable$escapeK = normalizable == null ? void 0 : normalizable.escapeKey) != null ? _normalizable$escapeK : false,\n    outsidePress: typeof normalizable === 'boolean' ? normalizable : (_normalizable$outside = normalizable == null ? void 0 : normalizable.outsidePress) != null ? _normalizable$outside : true\n  };\n};\n/**\n * Closes the floating element when a dismissal is requested — by default, when\n * the user presses the `escape` key or outside of the floating element.\n * @see https://floating-ui.com/docs/useDismiss\n */\nfunction useDismiss(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    elements,\n    dataRef\n  } = context;\n  const {\n    enabled = true,\n    escapeKey = true,\n    outsidePress: unstable_outsidePress = true,\n    outsidePressEvent = 'pointerdown',\n    referencePress = false,\n    referencePressEvent = 'pointerdown',\n    ancestorScroll = false,\n    bubbles,\n    capture\n  } = props;\n  const tree = useFloatingTree();\n  const outsidePressFn = useEffectEvent(typeof unstable_outsidePress === 'function' ? unstable_outsidePress : () => false);\n  const outsidePress = typeof unstable_outsidePress === 'function' ? outsidePressFn : unstable_outsidePress;\n  const insideReactTreeRef = React.useRef(false);\n  const endedOrStartedInsideRef = React.useRef(false);\n  const {\n    escapeKey: escapeKeyBubbles,\n    outsidePress: outsidePressBubbles\n  } = normalizeProp(bubbles);\n  const {\n    escapeKey: escapeKeyCapture,\n    outsidePress: outsidePressCapture\n  } = normalizeProp(capture);\n  const isComposingRef = React.useRef(false);\n  const closeOnEscapeKeyDown = useEffectEvent(event => {\n    var _dataRef$current$floa;\n    if (!open || !enabled || !escapeKey || event.key !== 'Escape') {\n      return;\n    }\n\n    // Wait until IME is settled. Pressing `Escape` while composing should\n    // close the compose menu, but not the floating element.\n    if (isComposingRef.current) {\n      return;\n    }\n    const nodeId = (_dataRef$current$floa = dataRef.current.floatingContext) == null ? void 0 : _dataRef$current$floa.nodeId;\n    const children = tree ? getChildren(tree.nodesRef.current, nodeId) : [];\n    if (!escapeKeyBubbles) {\n      event.stopPropagation();\n      if (children.length > 0) {\n        let shouldDismiss = true;\n        children.forEach(child => {\n          var _child$context;\n          if ((_child$context = child.context) != null && _child$context.open && !child.context.dataRef.current.__escapeKeyBubbles) {\n            shouldDismiss = false;\n            return;\n          }\n        });\n        if (!shouldDismiss) {\n          return;\n        }\n      }\n    }\n    onOpenChange(false, isReactEvent(event) ? event.nativeEvent : event, 'escape-key');\n  });\n  const closeOnEscapeKeyDownCapture = useEffectEvent(event => {\n    var _getTarget2;\n    const callback = () => {\n      var _getTarget;\n      closeOnEscapeKeyDown(event);\n      (_getTarget = getTarget(event)) == null || _getTarget.removeEventListener('keydown', callback);\n    };\n    (_getTarget2 = getTarget(event)) == null || _getTarget2.addEventListener('keydown', callback);\n  });\n  const closeOnPressOutside = useEffectEvent(event => {\n    var _dataRef$current$floa2;\n    // Given developers can stop the propagation of the synthetic event,\n    // we can only be confident with a positive value.\n    const insideReactTree = insideReactTreeRef.current;\n    insideReactTreeRef.current = false;\n\n    // When click outside is lazy (`click` event), handle dragging.\n    // Don't close if:\n    // - The click started inside the floating element.\n    // - The click ended inside the floating element.\n    const endedOrStartedInside = endedOrStartedInsideRef.current;\n    endedOrStartedInsideRef.current = false;\n    if (outsidePressEvent === 'click' && endedOrStartedInside) {\n      return;\n    }\n    if (insideReactTree) {\n      return;\n    }\n    if (typeof outsidePress === 'function' && !outsidePress(event)) {\n      return;\n    }\n    const target = getTarget(event);\n    const inertSelector = \"[\" + createAttribute('inert') + \"]\";\n    const markers = getDocument(elements.floating).querySelectorAll(inertSelector);\n    let targetRootAncestor = isElement(target) ? target : null;\n    while (targetRootAncestor && !isLastTraversableNode(targetRootAncestor)) {\n      const nextParent = getParentNode(targetRootAncestor);\n      if (isLastTraversableNode(nextParent) || !isElement(nextParent)) {\n        break;\n      }\n      targetRootAncestor = nextParent;\n    }\n\n    // Check if the click occurred on a third-party element injected after the\n    // floating element rendered.\n    if (markers.length && isElement(target) && !isRootElement(target) &&\n    // Clicked on a direct ancestor (e.g. FloatingOverlay).\n    !contains(target, elements.floating) &&\n    // If the target root element contains none of the markers, then the\n    // element was injected after the floating element rendered.\n    Array.from(markers).every(marker => !contains(targetRootAncestor, marker))) {\n      return;\n    }\n\n    // Check if the click occurred on the scrollbar\n    if (isHTMLElement(target) && floating) {\n      // In Firefox, `target.scrollWidth > target.clientWidth` for inline\n      // elements.\n      const canScrollX = target.clientWidth > 0 && target.scrollWidth > target.clientWidth;\n      const canScrollY = target.clientHeight > 0 && target.scrollHeight > target.clientHeight;\n      let xCond = canScrollY && event.offsetX > target.clientWidth;\n\n      // In some browsers it is possible to change the <body> (or window)\n      // scrollbar to the left side, but is very rare and is difficult to\n      // check for. Plus, for modal dialogs with backdrops, it is more\n      // important that the backdrop is checked but not so much the window.\n      if (canScrollY) {\n        const isRTL = getComputedStyle(target).direction === 'rtl';\n        if (isRTL) {\n          xCond = event.offsetX <= target.offsetWidth - target.clientWidth;\n        }\n      }\n      if (xCond || canScrollX && event.offsetY > target.clientHeight) {\n        return;\n      }\n    }\n    const nodeId = (_dataRef$current$floa2 = dataRef.current.floatingContext) == null ? void 0 : _dataRef$current$floa2.nodeId;\n    const targetIsInsideChildren = tree && getChildren(tree.nodesRef.current, nodeId).some(node => {\n      var _node$context;\n      return isEventTargetWithin(event, (_node$context = node.context) == null ? void 0 : _node$context.elements.floating);\n    });\n    if (isEventTargetWithin(event, elements.floating) || isEventTargetWithin(event, elements.domReference) || targetIsInsideChildren) {\n      return;\n    }\n    const children = tree ? getChildren(tree.nodesRef.current, nodeId) : [];\n    if (children.length > 0) {\n      let shouldDismiss = true;\n      children.forEach(child => {\n        var _child$context2;\n        if ((_child$context2 = child.context) != null && _child$context2.open && !child.context.dataRef.current.__outsidePressBubbles) {\n          shouldDismiss = false;\n          return;\n        }\n      });\n      if (!shouldDismiss) {\n        return;\n      }\n    }\n    onOpenChange(false, event, 'outside-press');\n  });\n  const closeOnPressOutsideCapture = useEffectEvent(event => {\n    var _getTarget4;\n    const callback = () => {\n      var _getTarget3;\n      closeOnPressOutside(event);\n      (_getTarget3 = getTarget(event)) == null || _getTarget3.removeEventListener(outsidePressEvent, callback);\n    };\n    (_getTarget4 = getTarget(event)) == null || _getTarget4.addEventListener(outsidePressEvent, callback);\n  });\n  React.useEffect(() => {\n    if (!open || !enabled) {\n      return;\n    }\n    dataRef.current.__escapeKeyBubbles = escapeKeyBubbles;\n    dataRef.current.__outsidePressBubbles = outsidePressBubbles;\n    let compositionTimeout = -1;\n    function onScroll(event) {\n      onOpenChange(false, event, 'ancestor-scroll');\n    }\n    function handleCompositionStart() {\n      window.clearTimeout(compositionTimeout);\n      isComposingRef.current = true;\n    }\n    function handleCompositionEnd() {\n      // Safari fires `compositionend` before `keydown`, so we need to wait\n      // until the next tick to set `isComposing` to `false`.\n      // https://bugs.webkit.org/show_bug.cgi?id=165004\n      compositionTimeout = window.setTimeout(() => {\n        isComposingRef.current = false;\n      },\n      // 0ms or 1ms don't work in Safari. 5ms appears to consistently work.\n      // Only apply to WebKit for the test to remain 0ms.\n      isWebKit() ? 5 : 0);\n    }\n    const doc = getDocument(elements.floating);\n    if (escapeKey) {\n      doc.addEventListener('keydown', escapeKeyCapture ? closeOnEscapeKeyDownCapture : closeOnEscapeKeyDown, escapeKeyCapture);\n      doc.addEventListener('compositionstart', handleCompositionStart);\n      doc.addEventListener('compositionend', handleCompositionEnd);\n    }\n    outsidePress && doc.addEventListener(outsidePressEvent, outsidePressCapture ? closeOnPressOutsideCapture : closeOnPressOutside, outsidePressCapture);\n    let ancestors = [];\n    if (ancestorScroll) {\n      if (isElement(elements.domReference)) {\n        ancestors = getOverflowAncestors(elements.domReference);\n      }\n      if (isElement(elements.floating)) {\n        ancestors = ancestors.concat(getOverflowAncestors(elements.floating));\n      }\n      if (!isElement(elements.reference) && elements.reference && elements.reference.contextElement) {\n        ancestors = ancestors.concat(getOverflowAncestors(elements.reference.contextElement));\n      }\n    }\n\n    // Ignore the visual viewport for scrolling dismissal (allow pinch-zoom)\n    ancestors = ancestors.filter(ancestor => {\n      var _doc$defaultView;\n      return ancestor !== ((_doc$defaultView = doc.defaultView) == null ? void 0 : _doc$defaultView.visualViewport);\n    });\n    ancestors.forEach(ancestor => {\n      ancestor.addEventListener('scroll', onScroll, {\n        passive: true\n      });\n    });\n    return () => {\n      if (escapeKey) {\n        doc.removeEventListener('keydown', escapeKeyCapture ? closeOnEscapeKeyDownCapture : closeOnEscapeKeyDown, escapeKeyCapture);\n        doc.removeEventListener('compositionstart', handleCompositionStart);\n        doc.removeEventListener('compositionend', handleCompositionEnd);\n      }\n      outsidePress && doc.removeEventListener(outsidePressEvent, outsidePressCapture ? closeOnPressOutsideCapture : closeOnPressOutside, outsidePressCapture);\n      ancestors.forEach(ancestor => {\n        ancestor.removeEventListener('scroll', onScroll);\n      });\n      window.clearTimeout(compositionTimeout);\n    };\n  }, [dataRef, elements, escapeKey, outsidePress, outsidePressEvent, open, onOpenChange, ancestorScroll, enabled, escapeKeyBubbles, outsidePressBubbles, closeOnEscapeKeyDown, escapeKeyCapture, closeOnEscapeKeyDownCapture, closeOnPressOutside, outsidePressCapture, closeOnPressOutsideCapture]);\n  React.useEffect(() => {\n    insideReactTreeRef.current = false;\n  }, [outsidePress, outsidePressEvent]);\n  const reference = React.useMemo(() => ({\n    onKeyDown: closeOnEscapeKeyDown,\n    [bubbleHandlerKeys[referencePressEvent]]: event => {\n      if (referencePress) {\n        onOpenChange(false, event.nativeEvent, 'reference-press');\n      }\n    }\n  }), [closeOnEscapeKeyDown, onOpenChange, referencePress, referencePressEvent]);\n  const floating = React.useMemo(() => ({\n    onKeyDown: closeOnEscapeKeyDown,\n    onMouseDown() {\n      endedOrStartedInsideRef.current = true;\n    },\n    onMouseUp() {\n      endedOrStartedInsideRef.current = true;\n    },\n    [captureHandlerKeys[outsidePressEvent]]: () => {\n      insideReactTreeRef.current = true;\n    }\n  }), [closeOnEscapeKeyDown, outsidePressEvent]);\n  return React.useMemo(() => enabled ? {\n    reference,\n    floating\n  } : {}, [enabled, reference, floating]);\n}\n\nfunction useFloatingRootContext(options) {\n  const {\n    open = false,\n    onOpenChange: onOpenChangeProp,\n    elements: elementsProp\n  } = options;\n  const floatingId = useId();\n  const dataRef = React.useRef({});\n  const [events] = React.useState(() => createPubSub());\n  const nested = useFloatingParentNodeId() != null;\n  if (process.env.NODE_ENV !== \"production\") {\n    const optionDomReference = elementsProp.reference;\n    if (optionDomReference && !isElement(optionDomReference)) {\n      error('Cannot pass a virtual element to the `elements.reference` option,', 'as it must be a real DOM element. Use `refs.setPositionReference()`', 'instead.');\n    }\n  }\n  const [positionReference, setPositionReference] = React.useState(elementsProp.reference);\n  const onOpenChange = useEffectEvent((open, event, reason) => {\n    dataRef.current.openEvent = open ? event : undefined;\n    events.emit('openchange', {\n      open,\n      event,\n      reason,\n      nested\n    });\n    onOpenChangeProp == null || onOpenChangeProp(open, event, reason);\n  });\n  const refs = React.useMemo(() => ({\n    setPositionReference\n  }), []);\n  const elements = React.useMemo(() => ({\n    reference: positionReference || elementsProp.reference || null,\n    floating: elementsProp.floating || null,\n    domReference: elementsProp.reference\n  }), [positionReference, elementsProp.reference, elementsProp.floating]);\n  return React.useMemo(() => ({\n    dataRef,\n    open,\n    onOpenChange,\n    elements,\n    events,\n    floatingId,\n    refs\n  }), [open, onOpenChange, elements, events, floatingId, refs]);\n}\n\n/**\n * Provides data to position a floating element and context to add interactions.\n * @see https://floating-ui.com/docs/useFloating\n */\nfunction useFloating(options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    nodeId\n  } = options;\n  const internalRootContext = useFloatingRootContext({\n    ...options,\n    elements: {\n      reference: null,\n      floating: null,\n      ...options.elements\n    }\n  });\n  const rootContext = options.rootContext || internalRootContext;\n  const computedElements = rootContext.elements;\n  const [_domReference, setDomReference] = React.useState(null);\n  const [positionReference, _setPositionReference] = React.useState(null);\n  const optionDomReference = computedElements == null ? void 0 : computedElements.domReference;\n  const domReference = optionDomReference || _domReference;\n  const domReferenceRef = React.useRef(null);\n  const tree = useFloatingTree();\n  index(() => {\n    if (domReference) {\n      domReferenceRef.current = domReference;\n    }\n  }, [domReference]);\n  const position = useFloating$1({\n    ...options,\n    elements: {\n      ...computedElements,\n      ...(positionReference && {\n        reference: positionReference\n      })\n    }\n  });\n  const setPositionReference = React.useCallback(node => {\n    const computedPositionReference = isElement(node) ? {\n      getBoundingClientRect: () => node.getBoundingClientRect(),\n      contextElement: node\n    } : node;\n    // Store the positionReference in state if the DOM reference is specified externally via the\n    // `elements.reference` option. This ensures that it won't be overridden on future renders.\n    _setPositionReference(computedPositionReference);\n    position.refs.setReference(computedPositionReference);\n  }, [position.refs]);\n  const setReference = React.useCallback(node => {\n    if (isElement(node) || node === null) {\n      domReferenceRef.current = node;\n      setDomReference(node);\n    }\n\n    // Backwards-compatibility for passing a virtual element to `reference`\n    // after it has set the DOM reference.\n    if (isElement(position.refs.reference.current) || position.refs.reference.current === null ||\n    // Don't allow setting virtual elements using the old technique back to\n    // `null` to support `positionReference` + an unstable `reference`\n    // callback ref.\n    node !== null && !isElement(node)) {\n      position.refs.setReference(node);\n    }\n  }, [position.refs]);\n  const refs = React.useMemo(() => ({\n    ...position.refs,\n    setReference,\n    setPositionReference,\n    domReference: domReferenceRef\n  }), [position.refs, setReference, setPositionReference]);\n  const elements = React.useMemo(() => ({\n    ...position.elements,\n    domReference: domReference\n  }), [position.elements, domReference]);\n  const context = React.useMemo(() => ({\n    ...position,\n    ...rootContext,\n    refs,\n    elements,\n    nodeId\n  }), [position, refs, elements, nodeId, rootContext]);\n  index(() => {\n    rootContext.dataRef.current.floatingContext = context;\n    const node = tree == null ? void 0 : tree.nodesRef.current.find(node => node.id === nodeId);\n    if (node) {\n      node.context = context;\n    }\n  });\n  return React.useMemo(() => ({\n    ...position,\n    context,\n    refs,\n    elements\n  }), [position, refs, elements, context]);\n}\n\n/**\n * Opens the floating element while the reference element has focus, like CSS\n * `:focus`.\n * @see https://floating-ui.com/docs/useFocus\n */\nfunction useFocus(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    events,\n    dataRef,\n    elements\n  } = context;\n  const {\n    enabled = true,\n    visibleOnly = true\n  } = props;\n  const blockFocusRef = React.useRef(false);\n  const timeoutRef = React.useRef();\n  const keyboardModalityRef = React.useRef(true);\n  React.useEffect(() => {\n    if (!enabled) return;\n    const win = getWindow(elements.domReference);\n\n    // If the reference was focused and the user left the tab/window, and the\n    // floating element was not open, the focus should be blocked when they\n    // return to the tab/window.\n    function onBlur() {\n      if (!open && isHTMLElement(elements.domReference) && elements.domReference === activeElement(getDocument(elements.domReference))) {\n        blockFocusRef.current = true;\n      }\n    }\n    function onKeyDown() {\n      keyboardModalityRef.current = true;\n    }\n    win.addEventListener('blur', onBlur);\n    win.addEventListener('keydown', onKeyDown, true);\n    return () => {\n      win.removeEventListener('blur', onBlur);\n      win.removeEventListener('keydown', onKeyDown, true);\n    };\n  }, [elements.domReference, open, enabled]);\n  React.useEffect(() => {\n    if (!enabled) return;\n    function onOpenChange(_ref) {\n      let {\n        reason\n      } = _ref;\n      if (reason === 'reference-press' || reason === 'escape-key') {\n        blockFocusRef.current = true;\n      }\n    }\n    events.on('openchange', onOpenChange);\n    return () => {\n      events.off('openchange', onOpenChange);\n    };\n  }, [events, enabled]);\n  React.useEffect(() => {\n    return () => {\n      clearTimeout(timeoutRef.current);\n    };\n  }, []);\n  const reference = React.useMemo(() => ({\n    onPointerDown(event) {\n      if (isVirtualPointerEvent(event.nativeEvent)) return;\n      keyboardModalityRef.current = false;\n    },\n    onMouseLeave() {\n      blockFocusRef.current = false;\n    },\n    onFocus(event) {\n      if (blockFocusRef.current) return;\n      const target = getTarget(event.nativeEvent);\n      if (visibleOnly && isElement(target)) {\n        try {\n          // Mac Safari unreliably matches `:focus-visible` on the reference\n          // if focus was outside the page initially - use the fallback\n          // instead.\n          if (isSafari() && isMac()) throw Error();\n          if (!target.matches(':focus-visible')) return;\n        } catch (e) {\n          // Old browsers will throw an error when using `:focus-visible`.\n          if (!keyboardModalityRef.current && !isTypeableElement(target)) {\n            return;\n          }\n        }\n      }\n      onOpenChange(true, event.nativeEvent, 'focus');\n    },\n    onBlur(event) {\n      blockFocusRef.current = false;\n      const relatedTarget = event.relatedTarget;\n      const nativeEvent = event.nativeEvent;\n\n      // Hit the non-modal focus management portal guard. Focus will be\n      // moved into the floating element immediately after.\n      const movedToFocusGuard = isElement(relatedTarget) && relatedTarget.hasAttribute(createAttribute('focus-guard')) && relatedTarget.getAttribute('data-type') === 'outside';\n\n      // Wait for the window blur listener to fire.\n      timeoutRef.current = window.setTimeout(() => {\n        var _dataRef$current$floa;\n        const activeEl = activeElement(elements.domReference ? elements.domReference.ownerDocument : document);\n\n        // Focus left the page, keep it open.\n        if (!relatedTarget && activeEl === elements.domReference) return;\n\n        // When focusing the reference element (e.g. regular click), then\n        // clicking into the floating element, prevent it from hiding.\n        // Note: it must be focusable, e.g. `tabindex=\"-1\"`.\n        // We can not rely on relatedTarget to point to the correct element\n        // as it will only point to the shadow host of the newly focused element\n        // and not the element that actually has received focus if it is located\n        // inside a shadow root.\n        if (contains((_dataRef$current$floa = dataRef.current.floatingContext) == null ? void 0 : _dataRef$current$floa.refs.floating.current, activeEl) || contains(elements.domReference, activeEl) || movedToFocusGuard) {\n          return;\n        }\n        onOpenChange(false, nativeEvent, 'focus');\n      });\n    }\n  }), [dataRef, elements.domReference, onOpenChange, visibleOnly]);\n  return React.useMemo(() => enabled ? {\n    reference\n  } : {}, [enabled, reference]);\n}\n\nconst ACTIVE_KEY = 'active';\nconst SELECTED_KEY = 'selected';\nfunction mergeProps(userProps, propsList, elementKey) {\n  const map = new Map();\n  const isItem = elementKey === 'item';\n  let domUserProps = userProps;\n  if (isItem && userProps) {\n    const {\n      [ACTIVE_KEY]: _,\n      [SELECTED_KEY]: __,\n      ...validProps\n    } = userProps;\n    domUserProps = validProps;\n  }\n  return {\n    ...(elementKey === 'floating' && {\n      tabIndex: -1,\n      [FOCUSABLE_ATTRIBUTE]: ''\n    }),\n    ...domUserProps,\n    ...propsList.map(value => {\n      const propsOrGetProps = value ? value[elementKey] : null;\n      if (typeof propsOrGetProps === 'function') {\n        return userProps ? propsOrGetProps(userProps) : null;\n      }\n      return propsOrGetProps;\n    }).concat(userProps).reduce((acc, props) => {\n      if (!props) {\n        return acc;\n      }\n      Object.entries(props).forEach(_ref => {\n        let [key, value] = _ref;\n        if (isItem && [ACTIVE_KEY, SELECTED_KEY].includes(key)) {\n          return;\n        }\n        if (key.indexOf('on') === 0) {\n          if (!map.has(key)) {\n            map.set(key, []);\n          }\n          if (typeof value === 'function') {\n            var _map$get;\n            (_map$get = map.get(key)) == null || _map$get.push(value);\n            acc[key] = function () {\n              var _map$get2;\n              for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n                args[_key] = arguments[_key];\n              }\n              return (_map$get2 = map.get(key)) == null ? void 0 : _map$get2.map(fn => fn(...args)).find(val => val !== undefined);\n            };\n          }\n        } else {\n          acc[key] = value;\n        }\n      });\n      return acc;\n    }, {})\n  };\n}\n/**\n * Merges an array of interaction hooks' props into prop getters, allowing\n * event handler functions to be composed together without overwriting one\n * another.\n * @see https://floating-ui.com/docs/useInteractions\n */\nfunction useInteractions(propsList) {\n  if (propsList === void 0) {\n    propsList = [];\n  }\n  const referenceDeps = propsList.map(key => key == null ? void 0 : key.reference);\n  const floatingDeps = propsList.map(key => key == null ? void 0 : key.floating);\n  const itemDeps = propsList.map(key => key == null ? void 0 : key.item);\n  const getReferenceProps = React.useCallback(userProps => mergeProps(userProps, propsList, 'reference'),\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  referenceDeps);\n  const getFloatingProps = React.useCallback(userProps => mergeProps(userProps, propsList, 'floating'),\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  floatingDeps);\n  const getItemProps = React.useCallback(userProps => mergeProps(userProps, propsList, 'item'),\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  itemDeps);\n  return React.useMemo(() => ({\n    getReferenceProps,\n    getFloatingProps,\n    getItemProps\n  }), [getReferenceProps, getFloatingProps, getItemProps]);\n}\n\nlet isPreventScrollSupported = false;\nfunction doSwitch(orientation, vertical, horizontal) {\n  switch (orientation) {\n    case 'vertical':\n      return vertical;\n    case 'horizontal':\n      return horizontal;\n    default:\n      return vertical || horizontal;\n  }\n}\nfunction isMainOrientationKey(key, orientation) {\n  const vertical = key === ARROW_UP || key === ARROW_DOWN;\n  const horizontal = key === ARROW_LEFT || key === ARROW_RIGHT;\n  return doSwitch(orientation, vertical, horizontal);\n}\nfunction isMainOrientationToEndKey(key, orientation, rtl) {\n  const vertical = key === ARROW_DOWN;\n  const horizontal = rtl ? key === ARROW_LEFT : key === ARROW_RIGHT;\n  return doSwitch(orientation, vertical, horizontal) || key === 'Enter' || key === ' ' || key === '';\n}\nfunction isCrossOrientationOpenKey(key, orientation, rtl) {\n  const vertical = rtl ? key === ARROW_LEFT : key === ARROW_RIGHT;\n  const horizontal = key === ARROW_DOWN;\n  return doSwitch(orientation, vertical, horizontal);\n}\nfunction isCrossOrientationCloseKey(key, orientation, rtl) {\n  const vertical = rtl ? key === ARROW_RIGHT : key === ARROW_LEFT;\n  const horizontal = key === ARROW_UP;\n  return doSwitch(orientation, vertical, horizontal);\n}\n/**\n * Adds arrow key-based navigation of a list of items, either using real DOM\n * focus or virtual focus.\n * @see https://floating-ui.com/docs/useListNavigation\n */\nfunction useListNavigation(context, props) {\n  const {\n    open,\n    onOpenChange,\n    elements\n  } = context;\n  const {\n    listRef,\n    activeIndex,\n    onNavigate: unstable_onNavigate = () => {},\n    enabled = true,\n    selectedIndex = null,\n    allowEscape = false,\n    loop = false,\n    nested = false,\n    rtl = false,\n    virtual = false,\n    focusItemOnOpen = 'auto',\n    focusItemOnHover = true,\n    openOnArrowKeyDown = true,\n    disabledIndices = undefined,\n    orientation = 'vertical',\n    cols = 1,\n    scrollItemIntoView = true,\n    virtualItemRef,\n    itemSizes,\n    dense = false\n  } = props;\n  if (process.env.NODE_ENV !== \"production\") {\n    if (allowEscape) {\n      if (!loop) {\n        warn('`useListNavigation` looping must be enabled to allow escaping.');\n      }\n      if (!virtual) {\n        warn('`useListNavigation` must be virtual to allow escaping.');\n      }\n    }\n    if (orientation === 'vertical' && cols > 1) {\n      warn('In grid list navigation mode (`cols` > 1), the `orientation` should', 'be either \"horizontal\" or \"both\".');\n    }\n  }\n  const floatingFocusElement = getFloatingFocusElement(elements.floating);\n  const floatingFocusElementRef = useLatestRef(floatingFocusElement);\n  const parentId = useFloatingParentNodeId();\n  const tree = useFloatingTree();\n  const onNavigate = useEffectEvent(unstable_onNavigate);\n  const typeableComboboxReference = isTypeableCombobox(elements.domReference);\n  const focusItemOnOpenRef = React.useRef(focusItemOnOpen);\n  const indexRef = React.useRef(selectedIndex != null ? selectedIndex : -1);\n  const keyRef = React.useRef(null);\n  const isPointerModalityRef = React.useRef(true);\n  const previousOnNavigateRef = React.useRef(onNavigate);\n  const previousMountedRef = React.useRef(!!elements.floating);\n  const previousOpenRef = React.useRef(open);\n  const forceSyncFocus = React.useRef(false);\n  const forceScrollIntoViewRef = React.useRef(false);\n  const disabledIndicesRef = useLatestRef(disabledIndices);\n  const latestOpenRef = useLatestRef(open);\n  const scrollItemIntoViewRef = useLatestRef(scrollItemIntoView);\n  const selectedIndexRef = useLatestRef(selectedIndex);\n  const [activeId, setActiveId] = React.useState();\n  const [virtualId, setVirtualId] = React.useState();\n  const focusItem = useEffectEvent(function (listRef, indexRef, forceScrollIntoView) {\n    if (forceScrollIntoView === void 0) {\n      forceScrollIntoView = false;\n    }\n    function runFocus(item) {\n      if (virtual) {\n        setActiveId(item.id);\n        tree == null || tree.events.emit('virtualfocus', item);\n        if (virtualItemRef) {\n          virtualItemRef.current = item;\n        }\n      } else {\n        enqueueFocus(item, {\n          preventScroll: true,\n          // Mac Safari does not move the virtual cursor unless the focus call\n          // is sync. However, for the very first focus call, we need to wait\n          // for the position to be ready in order to prevent unwanted\n          // scrolling. This means the virtual cursor will not move to the first\n          // item when first opening the floating element, but will on\n          // subsequent calls. `preventScroll` is supported in modern Safari,\n          // so we can use that instead.\n          // iOS Safari must be async or the first item will not be focused.\n          sync: isMac() && isSafari() ? isPreventScrollSupported || forceSyncFocus.current : false\n        });\n      }\n    }\n    const initialItem = listRef.current[indexRef.current];\n    if (initialItem) {\n      runFocus(initialItem);\n    }\n    requestAnimationFrame(() => {\n      const waitedItem = listRef.current[indexRef.current] || initialItem;\n      if (!waitedItem) return;\n      if (!initialItem) {\n        runFocus(waitedItem);\n      }\n      const scrollIntoViewOptions = scrollItemIntoViewRef.current;\n      const shouldScrollIntoView = scrollIntoViewOptions && item && (forceScrollIntoView || !isPointerModalityRef.current);\n      if (shouldScrollIntoView) {\n        // JSDOM doesn't support `.scrollIntoView()` but it's widely supported\n        // by all browsers.\n        waitedItem.scrollIntoView == null || waitedItem.scrollIntoView(typeof scrollIntoViewOptions === 'boolean' ? {\n          block: 'nearest',\n          inline: 'nearest'\n        } : scrollIntoViewOptions);\n      }\n    });\n  });\n  index(() => {\n    document.createElement('div').focus({\n      get preventScroll() {\n        isPreventScrollSupported = true;\n        return false;\n      }\n    });\n  }, []);\n\n  // Sync `selectedIndex` to be the `activeIndex` upon opening the floating\n  // element. Also, reset `activeIndex` upon closing the floating element.\n  index(() => {\n    if (!enabled) return;\n    if (open && elements.floating) {\n      if (focusItemOnOpenRef.current && selectedIndex != null) {\n        // Regardless of the pointer modality, we want to ensure the selected\n        // item comes into view when the floating element is opened.\n        forceScrollIntoViewRef.current = true;\n        indexRef.current = selectedIndex;\n        onNavigate(selectedIndex);\n      }\n    } else if (previousMountedRef.current) {\n      // Since the user can specify `onNavigate` conditionally\n      // (onNavigate: open ? setActiveIndex : setSelectedIndex),\n      // we store and call the previous function.\n      indexRef.current = -1;\n      previousOnNavigateRef.current(null);\n    }\n  }, [enabled, open, elements.floating, selectedIndex, onNavigate]);\n\n  // Sync `activeIndex` to be the focused item while the floating element is\n  // open.\n  index(() => {\n    if (!enabled) return;\n    if (open && elements.floating) {\n      if (activeIndex == null) {\n        forceSyncFocus.current = false;\n        if (selectedIndexRef.current != null) {\n          return;\n        }\n\n        // Reset while the floating element was open (e.g. the list changed).\n        if (previousMountedRef.current) {\n          indexRef.current = -1;\n          focusItem(listRef, indexRef);\n        }\n\n        // Initial sync.\n        if ((!previousOpenRef.current || !previousMountedRef.current) && focusItemOnOpenRef.current && (keyRef.current != null || focusItemOnOpenRef.current === true && keyRef.current == null)) {\n          let runs = 0;\n          const waitForListPopulated = () => {\n            if (listRef.current[0] == null) {\n              // Avoid letting the browser paint if possible on the first try,\n              // otherwise use rAF. Don't try more than twice, since something\n              // is wrong otherwise.\n              if (runs < 2) {\n                const scheduler = runs ? requestAnimationFrame : queueMicrotask;\n                scheduler(waitForListPopulated);\n              }\n              runs++;\n            } else {\n              indexRef.current = keyRef.current == null || isMainOrientationToEndKey(keyRef.current, orientation, rtl) || nested ? getMinIndex(listRef, disabledIndicesRef.current) : getMaxIndex(listRef, disabledIndicesRef.current);\n              keyRef.current = null;\n              onNavigate(indexRef.current);\n            }\n          };\n          waitForListPopulated();\n        }\n      } else if (!isIndexOutOfBounds(listRef, activeIndex)) {\n        indexRef.current = activeIndex;\n        focusItem(listRef, indexRef, forceScrollIntoViewRef.current);\n        forceScrollIntoViewRef.current = false;\n      }\n    }\n  }, [enabled, open, elements.floating, activeIndex, selectedIndexRef, nested, listRef, orientation, rtl, onNavigate, focusItem, disabledIndicesRef]);\n\n  // Ensure the parent floating element has focus when a nested child closes\n  // to allow arrow key navigation to work after the pointer leaves the child.\n  index(() => {\n    var _nodes$find;\n    if (!enabled || elements.floating || !tree || virtual || !previousMountedRef.current) {\n      return;\n    }\n    const nodes = tree.nodesRef.current;\n    const parent = (_nodes$find = nodes.find(node => node.id === parentId)) == null || (_nodes$find = _nodes$find.context) == null ? void 0 : _nodes$find.elements.floating;\n    const activeEl = activeElement(getDocument(elements.floating));\n    const treeContainsActiveEl = nodes.some(node => node.context && contains(node.context.elements.floating, activeEl));\n    if (parent && !treeContainsActiveEl && isPointerModalityRef.current) {\n      parent.focus({\n        preventScroll: true\n      });\n    }\n  }, [enabled, elements.floating, tree, parentId, virtual]);\n  index(() => {\n    if (!enabled) return;\n    if (!tree) return;\n    if (!virtual) return;\n    if (parentId) return;\n    function handleVirtualFocus(item) {\n      setVirtualId(item.id);\n      if (virtualItemRef) {\n        virtualItemRef.current = item;\n      }\n    }\n    tree.events.on('virtualfocus', handleVirtualFocus);\n    return () => {\n      tree.events.off('virtualfocus', handleVirtualFocus);\n    };\n  }, [enabled, tree, virtual, parentId, virtualItemRef]);\n  index(() => {\n    previousOnNavigateRef.current = onNavigate;\n    previousMountedRef.current = !!elements.floating;\n  });\n  index(() => {\n    if (!open) {\n      keyRef.current = null;\n    }\n  }, [open]);\n  index(() => {\n    previousOpenRef.current = open;\n  }, [open]);\n  const hasActiveIndex = activeIndex != null;\n  const item = React.useMemo(() => {\n    function syncCurrentTarget(currentTarget) {\n      if (!open) return;\n      const index = listRef.current.indexOf(currentTarget);\n      if (index !== -1) {\n        onNavigate(index);\n      }\n    }\n    const props = {\n      onFocus(_ref) {\n        let {\n          currentTarget\n        } = _ref;\n        syncCurrentTarget(currentTarget);\n      },\n      onClick: _ref2 => {\n        let {\n          currentTarget\n        } = _ref2;\n        return currentTarget.focus({\n          preventScroll: true\n        });\n      },\n      // Safari\n      ...(focusItemOnHover && {\n        onMouseMove(_ref3) {\n          let {\n            currentTarget\n          } = _ref3;\n          syncCurrentTarget(currentTarget);\n        },\n        onPointerLeave(_ref4) {\n          let {\n            pointerType\n          } = _ref4;\n          if (!isPointerModalityRef.current || pointerType === 'touch') {\n            return;\n          }\n          indexRef.current = -1;\n          focusItem(listRef, indexRef);\n          onNavigate(null);\n          if (!virtual) {\n            enqueueFocus(floatingFocusElementRef.current, {\n              preventScroll: true\n            });\n          }\n        }\n      })\n    };\n    return props;\n  }, [open, floatingFocusElementRef, focusItem, focusItemOnHover, listRef, onNavigate, virtual]);\n  const commonOnKeyDown = useEffectEvent(event => {\n    isPointerModalityRef.current = false;\n    forceSyncFocus.current = true;\n\n    // When composing a character, Chrome fires ArrowDown twice. Firefox/Safari\n    // don't appear to suffer from this. `event.isComposing` is avoided due to\n    // Safari not supporting it properly (although it's not needed in the first\n    // place for Safari, just avoiding any possible issues).\n    if (event.which === 229) {\n      return;\n    }\n\n    // If the floating element is animating out, ignore navigation. Otherwise,\n    // the `activeIndex` gets set to 0 despite not being open so the next time\n    // the user ArrowDowns, the first item won't be focused.\n    if (!latestOpenRef.current && event.currentTarget === floatingFocusElementRef.current) {\n      return;\n    }\n    if (nested && isCrossOrientationCloseKey(event.key, orientation, rtl)) {\n      stopEvent(event);\n      onOpenChange(false, event.nativeEvent, 'list-navigation');\n      if (isHTMLElement(elements.domReference)) {\n        if (virtual) {\n          tree == null || tree.events.emit('virtualfocus', elements.domReference);\n        } else {\n          elements.domReference.focus();\n        }\n      }\n      return;\n    }\n    const currentIndex = indexRef.current;\n    const minIndex = getMinIndex(listRef, disabledIndices);\n    const maxIndex = getMaxIndex(listRef, disabledIndices);\n    if (!typeableComboboxReference) {\n      if (event.key === 'Home') {\n        stopEvent(event);\n        indexRef.current = minIndex;\n        onNavigate(indexRef.current);\n      }\n      if (event.key === 'End') {\n        stopEvent(event);\n        indexRef.current = maxIndex;\n        onNavigate(indexRef.current);\n      }\n    }\n\n    // Grid navigation.\n    if (cols > 1) {\n      const sizes = itemSizes || Array.from({\n        length: listRef.current.length\n      }, () => ({\n        width: 1,\n        height: 1\n      }));\n      // To calculate movements on the grid, we use hypothetical cell indices\n      // as if every item was 1x1, then convert back to real indices.\n      const cellMap = buildCellMap(sizes, cols, dense);\n      const minGridIndex = cellMap.findIndex(index => index != null && !isDisabled(listRef.current, index, disabledIndices));\n      // last enabled index\n      const maxGridIndex = cellMap.reduce((foundIndex, index, cellIndex) => index != null && !isDisabled(listRef.current, index, disabledIndices) ? cellIndex : foundIndex, -1);\n      const index = cellMap[getGridNavigatedIndex({\n        current: cellMap.map(itemIndex => itemIndex != null ? listRef.current[itemIndex] : null)\n      }, {\n        event,\n        orientation,\n        loop,\n        rtl,\n        cols,\n        // treat undefined (empty grid spaces) as disabled indices so we\n        // don't end up in them\n        disabledIndices: getCellIndices([...(disabledIndices || listRef.current.map((_, index) => isDisabled(listRef.current, index) ? index : undefined)), undefined], cellMap),\n        minIndex: minGridIndex,\n        maxIndex: maxGridIndex,\n        prevIndex: getCellIndexOfCorner(indexRef.current > maxIndex ? minIndex : indexRef.current, sizes, cellMap, cols,\n        // use a corner matching the edge closest to the direction\n        // we're moving in so we don't end up in the same item. Prefer\n        // top/left over bottom/right.\n        event.key === ARROW_DOWN ? 'bl' : event.key === (rtl ? ARROW_LEFT : ARROW_RIGHT) ? 'tr' : 'tl'),\n        stopEvent: true\n      })];\n      if (index != null) {\n        indexRef.current = index;\n        onNavigate(indexRef.current);\n      }\n      if (orientation === 'both') {\n        return;\n      }\n    }\n    if (isMainOrientationKey(event.key, orientation)) {\n      stopEvent(event);\n\n      // Reset the index if no item is focused.\n      if (open && !virtual && activeElement(event.currentTarget.ownerDocument) === event.currentTarget) {\n        indexRef.current = isMainOrientationToEndKey(event.key, orientation, rtl) ? minIndex : maxIndex;\n        onNavigate(indexRef.current);\n        return;\n      }\n      if (isMainOrientationToEndKey(event.key, orientation, rtl)) {\n        if (loop) {\n          indexRef.current = currentIndex >= maxIndex ? allowEscape && currentIndex !== listRef.current.length ? -1 : minIndex : findNonDisabledIndex(listRef, {\n            startingIndex: currentIndex,\n            disabledIndices\n          });\n        } else {\n          indexRef.current = Math.min(maxIndex, findNonDisabledIndex(listRef, {\n            startingIndex: currentIndex,\n            disabledIndices\n          }));\n        }\n      } else {\n        if (loop) {\n          indexRef.current = currentIndex <= minIndex ? allowEscape && currentIndex !== -1 ? listRef.current.length : maxIndex : findNonDisabledIndex(listRef, {\n            startingIndex: currentIndex,\n            decrement: true,\n            disabledIndices\n          });\n        } else {\n          indexRef.current = Math.max(minIndex, findNonDisabledIndex(listRef, {\n            startingIndex: currentIndex,\n            decrement: true,\n            disabledIndices\n          }));\n        }\n      }\n      if (isIndexOutOfBounds(listRef, indexRef.current)) {\n        onNavigate(null);\n      } else {\n        onNavigate(indexRef.current);\n      }\n    }\n  });\n  const ariaActiveDescendantProp = React.useMemo(() => {\n    return virtual && open && hasActiveIndex && {\n      'aria-activedescendant': virtualId || activeId\n    };\n  }, [virtual, open, hasActiveIndex, virtualId, activeId]);\n  const floating = React.useMemo(() => {\n    return {\n      'aria-orientation': orientation === 'both' ? undefined : orientation,\n      ...(!isTypeableCombobox(elements.domReference) && ariaActiveDescendantProp),\n      onKeyDown: commonOnKeyDown,\n      onPointerMove() {\n        isPointerModalityRef.current = true;\n      }\n    };\n  }, [ariaActiveDescendantProp, commonOnKeyDown, elements.domReference, orientation]);\n  const reference = React.useMemo(() => {\n    function checkVirtualMouse(event) {\n      if (focusItemOnOpen === 'auto' && isVirtualClick(event.nativeEvent)) {\n        focusItemOnOpenRef.current = true;\n      }\n    }\n    function checkVirtualPointer(event) {\n      // `pointerdown` fires first, reset the state then perform the checks.\n      focusItemOnOpenRef.current = focusItemOnOpen;\n      if (focusItemOnOpen === 'auto' && isVirtualPointerEvent(event.nativeEvent)) {\n        focusItemOnOpenRef.current = true;\n      }\n    }\n    return {\n      ...ariaActiveDescendantProp,\n      onKeyDown(event) {\n        isPointerModalityRef.current = false;\n        const isArrowKey = event.key.startsWith('Arrow');\n        const isHomeOrEndKey = ['Home', 'End'].includes(event.key);\n        const isMoveKey = isArrowKey || isHomeOrEndKey;\n        const isCrossOpenKey = isCrossOrientationOpenKey(event.key, orientation, rtl);\n        const isCrossCloseKey = isCrossOrientationCloseKey(event.key, orientation, rtl);\n        const isMainKey = isMainOrientationKey(event.key, orientation);\n        const isNavigationKey = (nested ? isCrossOpenKey : isMainKey) || event.key === 'Enter' || event.key.trim() === '';\n        if (virtual && open) {\n          const rootNode = tree == null ? void 0 : tree.nodesRef.current.find(node => node.parentId == null);\n          const deepestNode = tree && rootNode ? getDeepestNode(tree.nodesRef.current, rootNode.id) : null;\n          if (isMoveKey && deepestNode && virtualItemRef) {\n            const eventObject = new KeyboardEvent('keydown', {\n              key: event.key,\n              bubbles: true\n            });\n            if (isCrossOpenKey || isCrossCloseKey) {\n              var _deepestNode$context, _deepestNode$context2;\n              const isCurrentTarget = ((_deepestNode$context = deepestNode.context) == null ? void 0 : _deepestNode$context.elements.domReference) === event.currentTarget;\n              const dispatchItem = isCrossCloseKey && !isCurrentTarget ? (_deepestNode$context2 = deepestNode.context) == null ? void 0 : _deepestNode$context2.elements.domReference : isCrossOpenKey ? listRef.current.find(item => (item == null ? void 0 : item.id) === activeId) : null;\n              if (dispatchItem) {\n                stopEvent(event);\n                dispatchItem.dispatchEvent(eventObject);\n                setVirtualId(undefined);\n              }\n            }\n            if ((isMainKey || isHomeOrEndKey) && deepestNode.context) {\n              if (deepestNode.context.open && deepestNode.parentId && event.currentTarget !== deepestNode.context.elements.domReference) {\n                var _deepestNode$context$;\n                stopEvent(event);\n                (_deepestNode$context$ = deepestNode.context.elements.domReference) == null || _deepestNode$context$.dispatchEvent(eventObject);\n                return;\n              }\n            }\n          }\n          return commonOnKeyDown(event);\n        }\n\n        // If a floating element should not open on arrow key down, avoid\n        // setting `activeIndex` while it's closed.\n        if (!open && !openOnArrowKeyDown && isArrowKey) {\n          return;\n        }\n        if (isNavigationKey) {\n          keyRef.current = nested && isMainKey ? null : event.key;\n        }\n        if (nested) {\n          if (isCrossOpenKey) {\n            stopEvent(event);\n            if (open) {\n              indexRef.current = getMinIndex(listRef, disabledIndicesRef.current);\n              onNavigate(indexRef.current);\n            } else {\n              onOpenChange(true, event.nativeEvent, 'list-navigation');\n            }\n          }\n          return;\n        }\n        if (isMainKey) {\n          if (selectedIndex != null) {\n            indexRef.current = selectedIndex;\n          }\n          stopEvent(event);\n          if (!open && openOnArrowKeyDown) {\n            onOpenChange(true, event.nativeEvent, 'list-navigation');\n          } else {\n            commonOnKeyDown(event);\n          }\n          if (open) {\n            onNavigate(indexRef.current);\n          }\n        }\n      },\n      onFocus() {\n        if (open && !virtual) {\n          onNavigate(null);\n        }\n      },\n      onPointerDown: checkVirtualPointer,\n      onMouseDown: checkVirtualMouse,\n      onClick: checkVirtualMouse\n    };\n  }, [activeId, ariaActiveDescendantProp, commonOnKeyDown, disabledIndicesRef, focusItemOnOpen, listRef, nested, onNavigate, onOpenChange, open, openOnArrowKeyDown, orientation, rtl, selectedIndex, tree, virtual, virtualItemRef]);\n  return React.useMemo(() => enabled ? {\n    reference,\n    floating,\n    item\n  } : {}, [enabled, reference, floating, item]);\n}\n\nconst componentRoleToAriaRoleMap = /*#__PURE__*/new Map([['select', 'listbox'], ['combobox', 'listbox'], ['label', false]]);\n\n/**\n * Adds base screen reader props to the reference and floating elements for a\n * given floating element `role`.\n * @see https://floating-ui.com/docs/useRole\n */\nfunction useRole(context, props) {\n  var _componentRoleToAriaR;\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    floatingId\n  } = context;\n  const {\n    enabled = true,\n    role = 'dialog'\n  } = props;\n  const ariaRole = (_componentRoleToAriaR = componentRoleToAriaRoleMap.get(role)) != null ? _componentRoleToAriaR : role;\n  const referenceId = useId();\n  const parentId = useFloatingParentNodeId();\n  const isNested = parentId != null;\n  const reference = React.useMemo(() => {\n    if (ariaRole === 'tooltip' || role === 'label') {\n      return {\n        [\"aria-\" + (role === 'label' ? 'labelledby' : 'describedby')]: open ? floatingId : undefined\n      };\n    }\n    return {\n      'aria-expanded': open ? 'true' : 'false',\n      'aria-haspopup': ariaRole === 'alertdialog' ? 'dialog' : ariaRole,\n      'aria-controls': open ? floatingId : undefined,\n      ...(ariaRole === 'listbox' && {\n        role: 'combobox'\n      }),\n      ...(ariaRole === 'menu' && {\n        id: referenceId\n      }),\n      ...(ariaRole === 'menu' && isNested && {\n        role: 'menuitem'\n      }),\n      ...(role === 'select' && {\n        'aria-autocomplete': 'none'\n      }),\n      ...(role === 'combobox' && {\n        'aria-autocomplete': 'list'\n      })\n    };\n  }, [ariaRole, floatingId, isNested, open, referenceId, role]);\n  const floating = React.useMemo(() => {\n    const floatingProps = {\n      id: floatingId,\n      ...(ariaRole && {\n        role: ariaRole\n      })\n    };\n    if (ariaRole === 'tooltip' || role === 'label') {\n      return floatingProps;\n    }\n    return {\n      ...floatingProps,\n      ...(ariaRole === 'menu' && {\n        'aria-labelledby': referenceId\n      })\n    };\n  }, [ariaRole, floatingId, referenceId, role]);\n  const item = React.useCallback(_ref => {\n    let {\n      active,\n      selected\n    } = _ref;\n    const commonProps = {\n      role: 'option',\n      ...(active && {\n        id: floatingId + \"-option\"\n      })\n    };\n\n    // For `menu`, we are unable to tell if the item is a `menuitemradio`\n    // or `menuitemcheckbox`. For backwards-compatibility reasons, also\n    // avoid defaulting to `menuitem` as it may overwrite custom role props.\n    switch (role) {\n      case 'select':\n        return {\n          ...commonProps,\n          'aria-selected': active && selected\n        };\n      case 'combobox':\n        {\n          return {\n            ...commonProps,\n            ...(active && {\n              'aria-selected': true\n            })\n          };\n        }\n    }\n    return {};\n  }, [floatingId, role]);\n  return React.useMemo(() => enabled ? {\n    reference,\n    floating,\n    item\n  } : {}, [enabled, reference, floating, item]);\n}\n\n// Converts a JS style key like `backgroundColor` to a CSS transition-property\n// like `background-color`.\nconst camelCaseToKebabCase = str => str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? '-' : '') + $.toLowerCase());\nfunction execWithArgsOrReturn(valueOrFn, args) {\n  return typeof valueOrFn === 'function' ? valueOrFn(args) : valueOrFn;\n}\nfunction useDelayUnmount(open, durationMs) {\n  const [isMounted, setIsMounted] = React.useState(open);\n  if (open && !isMounted) {\n    setIsMounted(true);\n  }\n  React.useEffect(() => {\n    if (!open && isMounted) {\n      const timeout = setTimeout(() => setIsMounted(false), durationMs);\n      return () => clearTimeout(timeout);\n    }\n  }, [open, isMounted, durationMs]);\n  return isMounted;\n}\n/**\n * Provides a status string to apply CSS transitions to a floating element,\n * correctly handling placement-aware transitions.\n * @see https://floating-ui.com/docs/useTransition#usetransitionstatus\n */\nfunction useTransitionStatus(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    elements: {\n      floating\n    }\n  } = context;\n  const {\n    duration = 250\n  } = props;\n  const isNumberDuration = typeof duration === 'number';\n  const closeDuration = (isNumberDuration ? duration : duration.close) || 0;\n  const [status, setStatus] = React.useState('unmounted');\n  const isMounted = useDelayUnmount(open, closeDuration);\n  if (!isMounted && status === 'close') {\n    setStatus('unmounted');\n  }\n  index(() => {\n    if (!floating) return;\n    if (open) {\n      setStatus('initial');\n      const frame = requestAnimationFrame(() => {\n        setStatus('open');\n      });\n      return () => {\n        cancelAnimationFrame(frame);\n      };\n    }\n    setStatus('close');\n  }, [open, floating]);\n  return {\n    isMounted,\n    status\n  };\n}\n/**\n * Provides styles to apply CSS transitions to a floating element, correctly\n * handling placement-aware transitions. Wrapper around `useTransitionStatus`.\n * @see https://floating-ui.com/docs/useTransition#usetransitionstyles\n */\nfunction useTransitionStyles(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    initial: unstable_initial = {\n      opacity: 0\n    },\n    open: unstable_open,\n    close: unstable_close,\n    common: unstable_common,\n    duration = 250\n  } = props;\n  const placement = context.placement;\n  const side = placement.split('-')[0];\n  const fnArgs = React.useMemo(() => ({\n    side,\n    placement\n  }), [side, placement]);\n  const isNumberDuration = typeof duration === 'number';\n  const openDuration = (isNumberDuration ? duration : duration.open) || 0;\n  const closeDuration = (isNumberDuration ? duration : duration.close) || 0;\n  const [styles, setStyles] = React.useState(() => ({\n    ...execWithArgsOrReturn(unstable_common, fnArgs),\n    ...execWithArgsOrReturn(unstable_initial, fnArgs)\n  }));\n  const {\n    isMounted,\n    status\n  } = useTransitionStatus(context, {\n    duration\n  });\n  const initialRef = useLatestRef(unstable_initial);\n  const openRef = useLatestRef(unstable_open);\n  const closeRef = useLatestRef(unstable_close);\n  const commonRef = useLatestRef(unstable_common);\n  index(() => {\n    const initialStyles = execWithArgsOrReturn(initialRef.current, fnArgs);\n    const closeStyles = execWithArgsOrReturn(closeRef.current, fnArgs);\n    const commonStyles = execWithArgsOrReturn(commonRef.current, fnArgs);\n    const openStyles = execWithArgsOrReturn(openRef.current, fnArgs) || Object.keys(initialStyles).reduce((acc, key) => {\n      acc[key] = '';\n      return acc;\n    }, {});\n    if (status === 'initial') {\n      setStyles(styles => ({\n        transitionProperty: styles.transitionProperty,\n        ...commonStyles,\n        ...initialStyles\n      }));\n    }\n    if (status === 'open') {\n      setStyles({\n        transitionProperty: Object.keys(openStyles).map(camelCaseToKebabCase).join(','),\n        transitionDuration: openDuration + \"ms\",\n        ...commonStyles,\n        ...openStyles\n      });\n    }\n    if (status === 'close') {\n      const styles = closeStyles || initialStyles;\n      setStyles({\n        transitionProperty: Object.keys(styles).map(camelCaseToKebabCase).join(','),\n        transitionDuration: closeDuration + \"ms\",\n        ...commonStyles,\n        ...styles\n      });\n    }\n  }, [closeDuration, closeRef, initialRef, openRef, commonRef, openDuration, status, fnArgs]);\n  return {\n    isMounted,\n    styles\n  };\n}\n\n/**\n * Provides a matching callback that can be used to focus an item as the user\n * types, often used in tandem with `useListNavigation()`.\n * @see https://floating-ui.com/docs/useTypeahead\n */\nfunction useTypeahead(context, props) {\n  var _ref;\n  const {\n    open,\n    dataRef\n  } = context;\n  const {\n    listRef,\n    activeIndex,\n    onMatch: unstable_onMatch,\n    onTypingChange: unstable_onTypingChange,\n    enabled = true,\n    findMatch = null,\n    resetMs = 750,\n    ignoreKeys = [],\n    selectedIndex = null\n  } = props;\n  const timeoutIdRef = React.useRef();\n  const stringRef = React.useRef('');\n  const prevIndexRef = React.useRef((_ref = selectedIndex != null ? selectedIndex : activeIndex) != null ? _ref : -1);\n  const matchIndexRef = React.useRef(null);\n  const onMatch = useEffectEvent(unstable_onMatch);\n  const onTypingChange = useEffectEvent(unstable_onTypingChange);\n  const findMatchRef = useLatestRef(findMatch);\n  const ignoreKeysRef = useLatestRef(ignoreKeys);\n  index(() => {\n    if (open) {\n      clearTimeout(timeoutIdRef.current);\n      matchIndexRef.current = null;\n      stringRef.current = '';\n    }\n  }, [open]);\n  index(() => {\n    // Sync arrow key navigation but not typeahead navigation.\n    if (open && stringRef.current === '') {\n      var _ref2;\n      prevIndexRef.current = (_ref2 = selectedIndex != null ? selectedIndex : activeIndex) != null ? _ref2 : -1;\n    }\n  }, [open, selectedIndex, activeIndex]);\n  const setTypingChange = useEffectEvent(value => {\n    if (value) {\n      if (!dataRef.current.typing) {\n        dataRef.current.typing = value;\n        onTypingChange(value);\n      }\n    } else {\n      if (dataRef.current.typing) {\n        dataRef.current.typing = value;\n        onTypingChange(value);\n      }\n    }\n  });\n  const onKeyDown = useEffectEvent(event => {\n    function getMatchingIndex(list, orderedList, string) {\n      const str = findMatchRef.current ? findMatchRef.current(orderedList, string) : orderedList.find(text => (text == null ? void 0 : text.toLocaleLowerCase().indexOf(string.toLocaleLowerCase())) === 0);\n      return str ? list.indexOf(str) : -1;\n    }\n    const listContent = listRef.current;\n    if (stringRef.current.length > 0 && stringRef.current[0] !== ' ') {\n      if (getMatchingIndex(listContent, listContent, stringRef.current) === -1) {\n        setTypingChange(false);\n      } else if (event.key === ' ') {\n        stopEvent(event);\n      }\n    }\n    if (listContent == null || ignoreKeysRef.current.includes(event.key) ||\n    // Character key.\n    event.key.length !== 1 ||\n    // Modifier key.\n    event.ctrlKey || event.metaKey || event.altKey) {\n      return;\n    }\n    if (open && event.key !== ' ') {\n      stopEvent(event);\n      setTypingChange(true);\n    }\n\n    // Bail out if the list contains a word like \"llama\" or \"aaron\". TODO:\n    // allow it in this case, too.\n    const allowRapidSuccessionOfFirstLetter = listContent.every(text => {\n      var _text$, _text$2;\n      return text ? ((_text$ = text[0]) == null ? void 0 : _text$.toLocaleLowerCase()) !== ((_text$2 = text[1]) == null ? void 0 : _text$2.toLocaleLowerCase()) : true;\n    });\n\n    // Allows the user to cycle through items that start with the same letter\n    // in rapid succession.\n    if (allowRapidSuccessionOfFirstLetter && stringRef.current === event.key) {\n      stringRef.current = '';\n      prevIndexRef.current = matchIndexRef.current;\n    }\n    stringRef.current += event.key;\n    clearTimeout(timeoutIdRef.current);\n    timeoutIdRef.current = setTimeout(() => {\n      stringRef.current = '';\n      prevIndexRef.current = matchIndexRef.current;\n      setTypingChange(false);\n    }, resetMs);\n    const prevIndex = prevIndexRef.current;\n    const index = getMatchingIndex(listContent, [...listContent.slice((prevIndex || 0) + 1), ...listContent.slice(0, (prevIndex || 0) + 1)], stringRef.current);\n    if (index !== -1) {\n      onMatch(index);\n      matchIndexRef.current = index;\n    } else if (event.key !== ' ') {\n      stringRef.current = '';\n      setTypingChange(false);\n    }\n  });\n  const reference = React.useMemo(() => ({\n    onKeyDown\n  }), [onKeyDown]);\n  const floating = React.useMemo(() => {\n    return {\n      onKeyDown,\n      onKeyUp(event) {\n        if (event.key === ' ') {\n          setTypingChange(false);\n        }\n      }\n    };\n  }, [onKeyDown, setTypingChange]);\n  return React.useMemo(() => enabled ? {\n    reference,\n    floating\n  } : {}, [enabled, reference, floating]);\n}\n\nfunction getArgsWithCustomFloatingHeight(state, height) {\n  return {\n    ...state,\n    rects: {\n      ...state.rects,\n      floating: {\n        ...state.rects.floating,\n        height\n      }\n    }\n  };\n}\n/**\n * Positions the floating element such that an inner element inside of it is\n * anchored to the reference element.\n * @see https://floating-ui.com/docs/inner\n */\nconst inner = props => ({\n  name: 'inner',\n  options: props,\n  async fn(state) {\n    const {\n      listRef,\n      overflowRef,\n      onFallbackChange,\n      offset: innerOffset = 0,\n      index = 0,\n      minItemsVisible = 4,\n      referenceOverflowThreshold = 0,\n      scrollRef,\n      ...detectOverflowOptions\n    } = evaluate(props, state);\n    const {\n      rects,\n      elements: {\n        floating\n      }\n    } = state;\n    const item = listRef.current[index];\n    const scrollEl = (scrollRef == null ? void 0 : scrollRef.current) || floating;\n\n    // Valid combinations:\n    // 1. Floating element is the scrollRef and has a border (default)\n    // 2. Floating element is not the scrollRef, floating element has a border\n    // 3. Floating element is not the scrollRef, scrollRef has a border\n    // Floating > {...getFloatingProps()} wrapper > scrollRef > items is not\n    // allowed as VoiceOver doesn't work.\n    const clientTop = floating.clientTop || scrollEl.clientTop;\n    const floatingIsBordered = floating.clientTop !== 0;\n    const scrollElIsBordered = scrollEl.clientTop !== 0;\n    const floatingIsScrollEl = floating === scrollEl;\n    if (process.env.NODE_ENV !== \"production\") {\n      if (!state.placement.startsWith('bottom')) {\n        warn('`placement` side must be \"bottom\" when using the `inner`', 'middleware.');\n      }\n    }\n    if (!item) {\n      return {};\n    }\n    const nextArgs = {\n      ...state,\n      ...(await offset(-item.offsetTop - floating.clientTop - rects.reference.height / 2 - item.offsetHeight / 2 - innerOffset).fn(state))\n    };\n    const overflow = await detectOverflow(getArgsWithCustomFloatingHeight(nextArgs, scrollEl.scrollHeight + clientTop + floating.clientTop), detectOverflowOptions);\n    const refOverflow = await detectOverflow(nextArgs, {\n      ...detectOverflowOptions,\n      elementContext: 'reference'\n    });\n    const diffY = max(0, overflow.top);\n    const nextY = nextArgs.y + diffY;\n    const isScrollable = scrollEl.scrollHeight > scrollEl.clientHeight;\n    const rounder = isScrollable ? v => v : round;\n    const maxHeight = rounder(max(0, scrollEl.scrollHeight + (floatingIsBordered && floatingIsScrollEl || scrollElIsBordered ? clientTop * 2 : 0) - diffY - max(0, overflow.bottom)));\n    scrollEl.style.maxHeight = maxHeight + \"px\";\n    scrollEl.scrollTop = diffY;\n\n    // There is not enough space, fallback to standard anchored positioning\n    if (onFallbackChange) {\n      const shouldFallback = scrollEl.offsetHeight < item.offsetHeight * min(minItemsVisible, listRef.current.length) - 1 || refOverflow.top >= -referenceOverflowThreshold || refOverflow.bottom >= -referenceOverflowThreshold;\n      ReactDOM.flushSync(() => onFallbackChange(shouldFallback));\n    }\n    if (overflowRef) {\n      overflowRef.current = await detectOverflow(getArgsWithCustomFloatingHeight({\n        ...nextArgs,\n        y: nextY\n      }, scrollEl.offsetHeight + clientTop + floating.clientTop), detectOverflowOptions);\n    }\n    return {\n      y: nextY\n    };\n  }\n});\n/**\n * Changes the `inner` middleware's `offset` upon a `wheel` event to\n * expand the floating element's height, revealing more list items.\n * @see https://floating-ui.com/docs/inner\n */\nfunction useInnerOffset(context, props) {\n  const {\n    open,\n    elements\n  } = context;\n  const {\n    enabled = true,\n    overflowRef,\n    scrollRef,\n    onChange: unstable_onChange\n  } = props;\n  const onChange = useEffectEvent(unstable_onChange);\n  const controlledScrollingRef = React.useRef(false);\n  const prevScrollTopRef = React.useRef(null);\n  const initialOverflowRef = React.useRef(null);\n  React.useEffect(() => {\n    if (!enabled) return;\n    function onWheel(e) {\n      if (e.ctrlKey || !el || overflowRef.current == null) {\n        return;\n      }\n      const dY = e.deltaY;\n      const isAtTop = overflowRef.current.top >= -0.5;\n      const isAtBottom = overflowRef.current.bottom >= -0.5;\n      const remainingScroll = el.scrollHeight - el.clientHeight;\n      const sign = dY < 0 ? -1 : 1;\n      const method = dY < 0 ? 'max' : 'min';\n      if (el.scrollHeight <= el.clientHeight) {\n        return;\n      }\n      if (!isAtTop && dY > 0 || !isAtBottom && dY < 0) {\n        e.preventDefault();\n        ReactDOM.flushSync(() => {\n          onChange(d => d + Math[method](dY, remainingScroll * sign));\n        });\n      } else if (/firefox/i.test(getUserAgent())) {\n        // Needed to propagate scrolling during momentum scrolling phase once\n        // it gets limited by the boundary. UX improvement, not critical.\n        el.scrollTop += dY;\n      }\n    }\n    const el = (scrollRef == null ? void 0 : scrollRef.current) || elements.floating;\n    if (open && el) {\n      el.addEventListener('wheel', onWheel);\n\n      // Wait for the position to be ready.\n      requestAnimationFrame(() => {\n        prevScrollTopRef.current = el.scrollTop;\n        if (overflowRef.current != null) {\n          initialOverflowRef.current = {\n            ...overflowRef.current\n          };\n        }\n      });\n      return () => {\n        prevScrollTopRef.current = null;\n        initialOverflowRef.current = null;\n        el.removeEventListener('wheel', onWheel);\n      };\n    }\n  }, [enabled, open, elements.floating, overflowRef, scrollRef, onChange]);\n  const floating = React.useMemo(() => ({\n    onKeyDown() {\n      controlledScrollingRef.current = true;\n    },\n    onWheel() {\n      controlledScrollingRef.current = false;\n    },\n    onPointerMove() {\n      controlledScrollingRef.current = false;\n    },\n    onScroll() {\n      const el = (scrollRef == null ? void 0 : scrollRef.current) || elements.floating;\n      if (!overflowRef.current || !el || !controlledScrollingRef.current) {\n        return;\n      }\n      if (prevScrollTopRef.current !== null) {\n        const scrollDiff = el.scrollTop - prevScrollTopRef.current;\n        if (overflowRef.current.bottom < -0.5 && scrollDiff < -1 || overflowRef.current.top < -0.5 && scrollDiff > 1) {\n          ReactDOM.flushSync(() => onChange(d => d + scrollDiff));\n        }\n      }\n\n      // [Firefox] Wait for the height change to have been applied.\n      requestAnimationFrame(() => {\n        prevScrollTopRef.current = el.scrollTop;\n      });\n    }\n  }), [elements.floating, onChange, overflowRef, scrollRef]);\n  return React.useMemo(() => enabled ? {\n    floating\n  } : {}, [enabled, floating]);\n}\n\nfunction isPointInPolygon(point, polygon) {\n  const [x, y] = point;\n  let isInside = false;\n  const length = polygon.length;\n  for (let i = 0, j = length - 1; i < length; j = i++) {\n    const [xi, yi] = polygon[i] || [0, 0];\n    const [xj, yj] = polygon[j] || [0, 0];\n    const intersect = yi >= y !== yj >= y && x <= (xj - xi) * (y - yi) / (yj - yi) + xi;\n    if (intersect) {\n      isInside = !isInside;\n    }\n  }\n  return isInside;\n}\nfunction isInside(point, rect) {\n  return point[0] >= rect.x && point[0] <= rect.x + rect.width && point[1] >= rect.y && point[1] <= rect.y + rect.height;\n}\n/**\n * Generates a safe polygon area that the user can traverse without closing the\n * floating element once leaving the reference element.\n * @see https://floating-ui.com/docs/useHover#safepolygon\n */\nfunction safePolygon(options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    buffer = 0.5,\n    blockPointerEvents = false,\n    requireIntent = true\n  } = options;\n  let timeoutId;\n  let hasLanded = false;\n  let lastX = null;\n  let lastY = null;\n  let lastCursorTime = performance.now();\n  function getCursorSpeed(x, y) {\n    const currentTime = performance.now();\n    const elapsedTime = currentTime - lastCursorTime;\n    if (lastX === null || lastY === null || elapsedTime === 0) {\n      lastX = x;\n      lastY = y;\n      lastCursorTime = currentTime;\n      return null;\n    }\n    const deltaX = x - lastX;\n    const deltaY = y - lastY;\n    const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n    const speed = distance / elapsedTime; // px / ms\n\n    lastX = x;\n    lastY = y;\n    lastCursorTime = currentTime;\n    return speed;\n  }\n  const fn = _ref => {\n    let {\n      x,\n      y,\n      placement,\n      elements,\n      onClose,\n      nodeId,\n      tree\n    } = _ref;\n    return function onMouseMove(event) {\n      function close() {\n        clearTimeout(timeoutId);\n        onClose();\n      }\n      clearTimeout(timeoutId);\n      if (!elements.domReference || !elements.floating || placement == null || x == null || y == null) {\n        return;\n      }\n      const {\n        clientX,\n        clientY\n      } = event;\n      const clientPoint = [clientX, clientY];\n      const target = getTarget(event);\n      const isLeave = event.type === 'mouseleave';\n      const isOverFloatingEl = contains(elements.floating, target);\n      const isOverReferenceEl = contains(elements.domReference, target);\n      const refRect = elements.domReference.getBoundingClientRect();\n      const rect = elements.floating.getBoundingClientRect();\n      const side = placement.split('-')[0];\n      const cursorLeaveFromRight = x > rect.right - rect.width / 2;\n      const cursorLeaveFromBottom = y > rect.bottom - rect.height / 2;\n      const isOverReferenceRect = isInside(clientPoint, refRect);\n      const isFloatingWider = rect.width > refRect.width;\n      const isFloatingTaller = rect.height > refRect.height;\n      const left = (isFloatingWider ? refRect : rect).left;\n      const right = (isFloatingWider ? refRect : rect).right;\n      const top = (isFloatingTaller ? refRect : rect).top;\n      const bottom = (isFloatingTaller ? refRect : rect).bottom;\n      if (isOverFloatingEl) {\n        hasLanded = true;\n        if (!isLeave) {\n          return;\n        }\n      }\n      if (isOverReferenceEl) {\n        hasLanded = false;\n      }\n      if (isOverReferenceEl && !isLeave) {\n        hasLanded = true;\n        return;\n      }\n\n      // Prevent overlapping floating element from being stuck in an open-close\n      // loop: https://github.com/floating-ui/floating-ui/issues/1910\n      if (isLeave && isElement(event.relatedTarget) && contains(elements.floating, event.relatedTarget)) {\n        return;\n      }\n\n      // If any nested child is open, abort.\n      if (tree && getChildren(tree.nodesRef.current, nodeId).some(_ref2 => {\n        let {\n          context\n        } = _ref2;\n        return context == null ? void 0 : context.open;\n      })) {\n        return;\n      }\n\n      // If the pointer is leaving from the opposite side, the \"buffer\" logic\n      // creates a point where the floating element remains open, but should be\n      // ignored.\n      // A constant of 1 handles floating point rounding errors.\n      if (side === 'top' && y >= refRect.bottom - 1 || side === 'bottom' && y <= refRect.top + 1 || side === 'left' && x >= refRect.right - 1 || side === 'right' && x <= refRect.left + 1) {\n        return close();\n      }\n\n      // Ignore when the cursor is within the rectangular trough between the\n      // two elements. Since the triangle is created from the cursor point,\n      // which can start beyond the ref element's edge, traversing back and\n      // forth from the ref to the floating element can cause it to close. This\n      // ensures it always remains open in that case.\n      let rectPoly = [];\n      switch (side) {\n        case 'top':\n          rectPoly = [[left, refRect.top + 1], [left, rect.bottom - 1], [right, rect.bottom - 1], [right, refRect.top + 1]];\n          break;\n        case 'bottom':\n          rectPoly = [[left, rect.top + 1], [left, refRect.bottom - 1], [right, refRect.bottom - 1], [right, rect.top + 1]];\n          break;\n        case 'left':\n          rectPoly = [[rect.right - 1, bottom], [rect.right - 1, top], [refRect.left + 1, top], [refRect.left + 1, bottom]];\n          break;\n        case 'right':\n          rectPoly = [[refRect.right - 1, bottom], [refRect.right - 1, top], [rect.left + 1, top], [rect.left + 1, bottom]];\n          break;\n      }\n      function getPolygon(_ref3) {\n        let [x, y] = _ref3;\n        switch (side) {\n          case 'top':\n            {\n              const cursorPointOne = [isFloatingWider ? x + buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y + buffer + 1];\n              const cursorPointTwo = [isFloatingWider ? x - buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y + buffer + 1];\n              const commonPoints = [[rect.left, cursorLeaveFromRight ? rect.bottom - buffer : isFloatingWider ? rect.bottom - buffer : rect.top], [rect.right, cursorLeaveFromRight ? isFloatingWider ? rect.bottom - buffer : rect.top : rect.bottom - buffer]];\n              return [cursorPointOne, cursorPointTwo, ...commonPoints];\n            }\n          case 'bottom':\n            {\n              const cursorPointOne = [isFloatingWider ? x + buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y - buffer];\n              const cursorPointTwo = [isFloatingWider ? x - buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y - buffer];\n              const commonPoints = [[rect.left, cursorLeaveFromRight ? rect.top + buffer : isFloatingWider ? rect.top + buffer : rect.bottom], [rect.right, cursorLeaveFromRight ? isFloatingWider ? rect.top + buffer : rect.bottom : rect.top + buffer]];\n              return [cursorPointOne, cursorPointTwo, ...commonPoints];\n            }\n          case 'left':\n            {\n              const cursorPointOne = [x + buffer + 1, isFloatingTaller ? y + buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n              const cursorPointTwo = [x + buffer + 1, isFloatingTaller ? y - buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n              const commonPoints = [[cursorLeaveFromBottom ? rect.right - buffer : isFloatingTaller ? rect.right - buffer : rect.left, rect.top], [cursorLeaveFromBottom ? isFloatingTaller ? rect.right - buffer : rect.left : rect.right - buffer, rect.bottom]];\n              return [...commonPoints, cursorPointOne, cursorPointTwo];\n            }\n          case 'right':\n            {\n              const cursorPointOne = [x - buffer, isFloatingTaller ? y + buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n              const cursorPointTwo = [x - buffer, isFloatingTaller ? y - buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n              const commonPoints = [[cursorLeaveFromBottom ? rect.left + buffer : isFloatingTaller ? rect.left + buffer : rect.right, rect.top], [cursorLeaveFromBottom ? isFloatingTaller ? rect.left + buffer : rect.right : rect.left + buffer, rect.bottom]];\n              return [cursorPointOne, cursorPointTwo, ...commonPoints];\n            }\n        }\n      }\n      if (isPointInPolygon([clientX, clientY], rectPoly)) {\n        return;\n      }\n      if (hasLanded && !isOverReferenceRect) {\n        return close();\n      }\n      if (!isLeave && requireIntent) {\n        const cursorSpeed = getCursorSpeed(event.clientX, event.clientY);\n        const cursorSpeedThreshold = 0.1;\n        if (cursorSpeed !== null && cursorSpeed < cursorSpeedThreshold) {\n          return close();\n        }\n      }\n      if (!isPointInPolygon([clientX, clientY], getPolygon([x, y]))) {\n        close();\n      } else if (!hasLanded && requireIntent) {\n        timeoutId = window.setTimeout(close, 40);\n      }\n    };\n  };\n  fn.__options = {\n    blockPointerEvents\n  };\n  return fn;\n}\n\nexport { Composite, CompositeItem, FloatingArrow, FloatingDelayGroup, FloatingFocusManager, FloatingList, FloatingNode, FloatingOverlay, FloatingPortal, FloatingTree, inner, safePolygon, useClick, useClientPoint, useDelayGroup, useDelayGroupContext, useDismiss, useFloating, useFloatingNodeId, useFloatingParentNodeId, useFloatingPortalNode, useFloatingRootContext, useFloatingTree, useFocus, useHover, useId, useInnerOffset, useInteractions, useListItem, useListNavigation, useMergeRefs, useRole, useTransitionStatus, useTransitionStyles, useTypeahead };\n","import { cloneElement } from 'react';\nimport { useMergedRef } from '@mantine/hooks';\nimport {\n  Box,\n  createVarsResolver,\n  factory,\n  Factory,\n  getDefaultZIndex,\n  getRadius,\n  getRefProp,\n  getStyleObject,\n  getThemeColor,\n  isElement,\n  useMantineTheme,\n  useProps,\n  useStyles,\n} from '../../../core';\nimport { OptionalPortal } from '../../Portal';\nimport { TooltipBaseProps, TooltipCssVariables, TooltipStylesNames } from '../Tooltip.types';\nimport { useFloatingTooltip } from './use-floating-tooltip';\nimport classes from '../Tooltip.module.css';\n\nexport interface TooltipFloatingProps extends TooltipBaseProps {\n  /** Offset from mouse in px, `10` by default */\n  offset?: number;\n  /** Uncontrolled tooltip initial opened state */\n  defaultOpened?: boolean;\n}\n\nexport type TooltipFloatingFactory = Factory<{\n  props: TooltipFloatingProps;\n  ref: HTMLDivElement;\n  stylesNames: TooltipStylesNames;\n  vars: TooltipCssVariables;\n}>;\n\nconst defaultProps: Partial<TooltipFloatingProps> = {\n  refProp: 'ref',\n  withinPortal: true,\n  offset: 10,\n  defaultOpened: false,\n  position: 'right',\n  zIndex: getDefaultZIndex('popover'),\n};\n\nconst varsResolver = createVarsResolver<TooltipFloatingFactory>((theme, { radius, color }) => ({\n  tooltip: {\n    '--tooltip-radius': radius === undefined ? undefined : getRadius(radius),\n    '--tooltip-bg': color ? getThemeColor(color, theme) : undefined,\n    '--tooltip-color': color ? 'var(--mantine-color-white)' : undefined,\n  },\n}));\n\nexport const TooltipFloating = factory<TooltipFloatingFactory>((_props, ref) => {\n  const props = useProps('TooltipFloating', defaultProps, _props);\n  const {\n    children,\n    refProp,\n    withinPortal,\n    style,\n    className,\n    classNames,\n    styles,\n    unstyled,\n    radius,\n    color,\n    label,\n    offset,\n    position,\n    multiline,\n    zIndex,\n    disabled,\n    defaultOpened,\n    variant,\n    vars,\n    portalProps,\n    ...others\n  } = props;\n\n  const theme = useMantineTheme();\n  const getStyles = useStyles<TooltipFloatingFactory>({\n    name: 'TooltipFloating',\n    props,\n    classes,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    rootSelector: 'tooltip',\n    vars,\n    varsResolver,\n  });\n\n  const { handleMouseMove, x, y, opened, boundaryRef, floating, setOpened } = useFloatingTooltip({\n    offset: offset!,\n    position: position!,\n    defaultOpened: defaultOpened!,\n  });\n\n  if (!isElement(children)) {\n    throw new Error(\n      '[@mantine/core] Tooltip.Floating component children should be an element or a component that accepts ref, fragments, strings, numbers and other primitive values are not supported'\n    );\n  }\n\n  const targetRef = useMergedRef(boundaryRef, getRefProp(children), ref);\n  const _childrenProps = children.props as any;\n\n  const onMouseEnter = (event: React.MouseEvent<unknown, MouseEvent>) => {\n    _childrenProps.onMouseEnter?.(event);\n    handleMouseMove(event);\n    setOpened(true);\n  };\n\n  const onMouseLeave = (event: React.MouseEvent<unknown, MouseEvent>) => {\n    _childrenProps.onMouseLeave?.(event);\n    setOpened(false);\n  };\n\n  return (\n    <>\n      <OptionalPortal {...portalProps} withinPortal={withinPortal}>\n        <Box\n          {...others}\n          {...getStyles('tooltip', {\n            style: {\n              ...getStyleObject(style, theme),\n              zIndex: zIndex as React.CSSProperties['zIndex'],\n              display: !disabled && opened ? 'block' : 'none',\n              top: (y && Math.round(y)) ?? '',\n              left: (x && Math.round(x)) ?? '',\n            },\n          })}\n          variant={variant}\n          ref={floating}\n          mod={{ multiline }}\n        >\n          {label}\n        </Box>\n      </OptionalPortal>\n\n      {cloneElement(children, {\n        ..._childrenProps,\n        [refProp!]: targetRef,\n        onMouseEnter,\n        onMouseLeave,\n      })}\n    </>\n  );\n});\n\nTooltipFloating.classes = classes;\nTooltipFloating.displayName = '@mantine/core/TooltipFloating';\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { getOverflowAncestors, shift, useFloating } from '@floating-ui/react';\nimport { FloatingPosition } from '../../Floating';\n\ninterface UseFloatingTooltip {\n  offset: number;\n  position: FloatingPosition;\n  defaultOpened?: boolean;\n}\n\nexport function useFloatingTooltip<T extends HTMLElement = any>({\n  offset,\n  position,\n  defaultOpened,\n}: UseFloatingTooltip) {\n  const [opened, setOpened] = useState(defaultOpened);\n  const boundaryRef = useRef<T>(null);\n  const { x, y, elements, refs, update, placement } = useFloating({\n    placement: position,\n    middleware: [\n      shift({\n        crossAxis: true,\n        padding: 5,\n        rootBoundary: 'document',\n      }),\n    ],\n  });\n\n  const horizontalOffset = placement.includes('right')\n    ? offset\n    : position.includes('left')\n      ? offset * -1\n      : 0;\n\n  const verticalOffset = placement.includes('bottom')\n    ? offset\n    : position.includes('top')\n      ? offset * -1\n      : 0;\n\n  const handleMouseMove = useCallback(\n    ({ clientX, clientY }: MouseEvent | React.MouseEvent<T, MouseEvent>) => {\n      refs.setPositionReference({\n        getBoundingClientRect() {\n          return {\n            width: 0,\n            height: 0,\n            x: clientX,\n            y: clientY,\n            left: clientX + horizontalOffset,\n            top: clientY + verticalOffset,\n            right: clientX,\n            bottom: clientY,\n          };\n        },\n      });\n    },\n    [elements.reference]\n  );\n\n  useEffect(() => {\n    if (refs.floating.current) {\n      const boundary = boundaryRef.current!;\n      boundary.addEventListener('mousemove', handleMouseMove);\n\n      const parents = getOverflowAncestors(refs.floating.current);\n      parents.forEach((parent) => {\n        parent.addEventListener('scroll', update);\n      });\n\n      return () => {\n        boundary.removeEventListener('mousemove', handleMouseMove);\n        parents.forEach((parent) => {\n          parent.removeEventListener('scroll', update);\n        });\n      };\n    }\n\n    return undefined;\n  }, [elements.reference, refs.floating.current, update, handleMouseMove, opened]);\n\n  return { handleMouseMove, x, y, opened, setOpened, boundaryRef, floating: refs.setFloating };\n}\n","import { createContext, useContext } from 'react';\n\nconst TooltipGroupContext = createContext(false);\n\nexport const TooltipGroupProvider = TooltipGroupContext.Provider;\nexport const useTooltipGroupContext = () => useContext(TooltipGroupContext);\n","import { FloatingDelayGroup } from '@floating-ui/react';\nimport { ExtendComponent, Factory, MantineThemeComponent, useProps } from '../../../core';\nimport { TooltipGroupProvider } from './TooltipGroup.context';\n\nexport interface TooltipGroupProps {\n  /** <Tooltip /> components */\n  children: React.ReactNode;\n\n  /** Open delay in ms */\n  openDelay?: number;\n\n  /** Close delay in ms */\n  closeDelay?: number;\n}\n\nconst defaultProps: Partial<TooltipGroupProps> = {\n  openDelay: 0,\n  closeDelay: 0,\n};\n\nexport function TooltipGroup(props: TooltipGroupProps) {\n  const { openDelay, closeDelay, children } = useProps('TooltipGroup', defaultProps, props);\n\n  return (\n    <TooltipGroupProvider value>\n      <FloatingDelayGroup delay={{ open: openDelay, close: closeDelay }}>\n        {children}\n      </FloatingDelayGroup>\n    </TooltipGroupProvider>\n  );\n}\n\nexport type TooltipGroupFactory = Factory<{\n  props: TooltipGroupProps;\n}>;\n\nTooltipGroup.displayName = '@mantine/core/TooltipGroup';\nTooltipGroup.extend = (c: ExtendComponent<TooltipGroupFactory>): MantineThemeComponent => c;\n","import { useCallback, useState } from 'react';\nimport {\n  arrow,\n  flip,\n  inline,\n  offset,\n  shift,\n  useDelayGroup,\n  useDismiss,\n  useFloating,\n  useFocus,\n  useHover,\n  useInteractions,\n  useRole,\n  type Middleware,\n} from '@floating-ui/react';\nimport { useDidUpdate, useId } from '@mantine/hooks';\nimport {\n  FloatingAxesOffsets,\n  FloatingPosition,\n  FloatingStrategy,\n  useFloatingAutoUpdate,\n} from '../Floating';\nimport { type TooltipMiddlewares } from './Tooltip.types';\nimport { useTooltipGroupContext } from './TooltipGroup/TooltipGroup.context';\n\ninterface UseTooltip {\n  position: FloatingPosition;\n  closeDelay?: number;\n  openDelay?: number;\n  onPositionChange?: (position: FloatingPosition) => void;\n  opened?: boolean;\n  defaultOpened?: boolean;\n  offset: number | FloatingAxesOffsets;\n  arrowRef?: React.RefObject<HTMLDivElement | null>;\n  arrowOffset?: number;\n  events?: { hover: boolean; focus: boolean; touch: boolean };\n  positionDependencies: any[];\n  inline?: boolean;\n  strategy?: FloatingStrategy;\n  middlewares?: TooltipMiddlewares;\n}\n\nfunction getDefaultMiddlewares(middlewares: TooltipMiddlewares | undefined): TooltipMiddlewares {\n  if (middlewares === undefined) {\n    return { shift: true, flip: true };\n  }\n\n  const result = { ...middlewares };\n  if (middlewares.shift === undefined) {\n    result.shift = true;\n  }\n\n  if (middlewares.flip === undefined) {\n    result.flip = true;\n  }\n\n  return result;\n}\n\nfunction getTooltipMiddlewares(settings: UseTooltip) {\n  const middlewaresOptions = getDefaultMiddlewares(settings.middlewares);\n  const middlewares: Middleware[] = [offset(settings.offset)];\n\n  if (middlewaresOptions.shift) {\n    middlewares.push(\n      shift(\n        typeof middlewaresOptions.shift === 'boolean'\n          ? { padding: 8 }\n          : { padding: 8, ...middlewaresOptions.shift }\n      )\n    );\n  }\n\n  if (middlewaresOptions.flip) {\n    middlewares.push(\n      typeof middlewaresOptions.flip === 'boolean' ? flip() : flip(middlewaresOptions.flip)\n    );\n  }\n\n  middlewares.push(arrow({ element: settings.arrowRef!, padding: settings.arrowOffset }));\n\n  if (middlewaresOptions.inline) {\n    middlewares.push(\n      typeof middlewaresOptions.inline === 'boolean' ? inline() : inline(middlewaresOptions.inline)\n    );\n  } else if (settings.inline) {\n    middlewares.push(inline());\n  }\n\n  return middlewares;\n}\n\nexport function useTooltip(settings: UseTooltip) {\n  const [uncontrolledOpened, setUncontrolledOpened] = useState(settings.defaultOpened);\n  const controlled = typeof settings.opened === 'boolean';\n  const opened = controlled ? settings.opened : uncontrolledOpened;\n  const withinGroup = useTooltipGroupContext();\n  const uid = useId();\n\n  const onChange = useCallback(\n    (_opened: boolean) => {\n      setUncontrolledOpened(_opened);\n\n      if (_opened) {\n        setCurrentId(uid);\n      }\n    },\n    [uid]\n  );\n\n  const {\n    x,\n    y,\n    context,\n    refs,\n    update,\n    placement,\n    middlewareData: { arrow: { x: arrowX, y: arrowY } = {} },\n  } = useFloating({\n    strategy: settings.strategy,\n    placement: settings.position,\n    open: opened,\n    onOpenChange: onChange,\n    middleware: getTooltipMiddlewares(settings),\n  });\n\n  const { delay: groupDelay, currentId, setCurrentId } = useDelayGroup(context, { id: uid });\n\n  const { getReferenceProps, getFloatingProps } = useInteractions([\n    useHover(context, {\n      enabled: settings.events?.hover,\n      delay: withinGroup ? groupDelay : { open: settings.openDelay, close: settings.closeDelay },\n      mouseOnly: !settings.events?.touch,\n    }),\n    useFocus(context, { enabled: settings.events?.focus, visibleOnly: true }),\n    useRole(context, { role: 'tooltip' }),\n    // Cannot be used with controlled tooltip, page jumps\n    useDismiss(context, { enabled: typeof settings.opened === 'undefined' }),\n  ]);\n\n  useFloatingAutoUpdate({\n    opened,\n    position: settings.position,\n    positionDependencies: settings.positionDependencies,\n    floating: { refs, update },\n  });\n\n  useDidUpdate(() => {\n    settings.onPositionChange?.(placement);\n  }, [placement]);\n\n  const isGroupPhase = opened && currentId && currentId !== uid;\n\n  return {\n    x,\n    y,\n    arrowX,\n    arrowY,\n    reference: refs.setReference,\n    floating: refs.setFloating,\n    getFloatingProps,\n    getReferenceProps,\n    isGroupPhase,\n    opened,\n    placement,\n  };\n}\n","import { useEffect, useState } from 'react';\nimport { autoUpdate } from '@floating-ui/react';\nimport { useDidUpdate } from '@mantine/hooks';\nimport { FloatingPosition } from './types';\n\ninterface Payload {\n  opened: boolean | undefined;\n  floating: {\n    update: () => void;\n    refs: {\n      floating: React.MutableRefObject<any>;\n      reference: React.MutableRefObject<any>;\n    };\n  };\n  positionDependencies: any[];\n  position: FloatingPosition;\n}\n\nexport function useFloatingAutoUpdate({\n  opened,\n  floating,\n  position,\n  positionDependencies,\n}: Payload) {\n  const [delayedUpdate, setDelayedUpdate] = useState(0);\n\n  useEffect(() => {\n    if (floating.refs.reference.current && floating.refs.floating.current && opened) {\n      return autoUpdate(\n        floating.refs.reference.current,\n        floating.refs.floating.current,\n        floating.update\n      );\n    }\n\n    return undefined;\n  }, [\n    floating.refs.reference.current,\n    floating.refs.floating.current,\n    opened,\n    delayedUpdate,\n    position,\n  ]);\n\n  useDidUpdate(() => {\n    floating.update();\n  }, positionDependencies);\n\n  useDidUpdate(() => {\n    setDelayedUpdate((c) => c + 1);\n  }, [opened]);\n}\n","import { cloneElement, useRef } from 'react';\nimport cx from 'clsx';\nimport { useMergedRef } from '@mantine/hooks';\nimport {\n  Box,\n  createVarsResolver,\n  factory,\n  Factory,\n  getDefaultZIndex,\n  getRadius,\n  getRefProp,\n  getThemeColor,\n  isElement,\n  useDirection,\n  useProps,\n  useStyles,\n} from '../../core';\nimport {\n  ArrowPosition,\n  FloatingArrow,\n  FloatingAxesOffsets,\n  FloatingPosition,\n  FloatingStrategy,\n  getFloatingPosition,\n} from '../Floating';\nimport { OptionalPortal } from '../Portal';\nimport { getTransitionProps, Transition, TransitionOverride } from '../Transition';\nimport { TooltipBaseProps, TooltipCssVariables, TooltipStylesNames } from './Tooltip.types';\nimport { TooltipFloating } from './TooltipFloating/TooltipFloating';\nimport { TooltipGroup } from './TooltipGroup/TooltipGroup';\nimport { useTooltip } from './use-tooltip';\nimport classes from './Tooltip.module.css';\n\nexport interface TooltipProps extends TooltipBaseProps {\n  /** Called when tooltip position changes */\n  onPositionChange?: (position: FloatingPosition) => void;\n\n  /** Open delay in ms */\n  openDelay?: number;\n\n  /** Close delay in ms, `0` by default */\n  closeDelay?: number;\n\n  /** Controlled opened state */\n  opened?: boolean;\n\n  /** Uncontrolled tooltip initial opened state */\n  defaultOpened?: boolean;\n\n  /** Space between target element and tooltip in px, `5` by default */\n  offset?: number | FloatingAxesOffsets;\n\n  /** Determines whether the tooltip should have an arrow, `false` by default */\n  withArrow?: boolean;\n\n  /** Arrow size in px, `4` by default */\n  arrowSize?: number;\n\n  /** Arrow offset in px, `5` by default */\n  arrowOffset?: number;\n\n  /** Arrow `border-radius` in px, `0` by default */\n  arrowRadius?: number;\n\n  /** Arrow position relative to the tooltip, `side` by default */\n  arrowPosition?: ArrowPosition;\n\n  /** Props passed down to the `Transition` component that used to animate tooltip presence, use to configure duration and animation type, `{ duration: 100, transition: 'fade' }` by default */\n  transitionProps?: TransitionOverride;\n\n  /** Determines which events will be used to show tooltip, `{ hover: true, focus: false, touch: false }` by default */\n  events?: { hover: boolean; focus: boolean; touch: boolean };\n\n  /** `useEffect` dependencies to force update tooltip position */\n  positionDependencies?: any[];\n\n  /** Must be set if the tooltip target is an inline element */\n  inline?: boolean;\n\n  /** If set, the tooltip will not be unmounted from the DOM when it is hidden, `display: none` styles will be applied instead */\n  keepMounted?: boolean;\n\n  /** Changes floating ui [position strategy](https://floating-ui.com/docs/usefloating#strategy), `'absolute'` by default */\n  floatingStrategy?: FloatingStrategy;\n}\n\nexport type TooltipFactory = Factory<{\n  props: TooltipProps;\n  ref: HTMLDivElement;\n  stylesNames: TooltipStylesNames;\n  vars: TooltipCssVariables;\n  staticComponents: {\n    Floating: typeof TooltipFloating;\n    Group: typeof TooltipGroup;\n  };\n}>;\n\nconst defaultProps: Partial<TooltipProps> = {\n  position: 'top',\n  refProp: 'ref',\n  withinPortal: true,\n  inline: false,\n  defaultOpened: false,\n  arrowSize: 4,\n  arrowOffset: 5,\n  arrowRadius: 0,\n  arrowPosition: 'side',\n  offset: 5,\n  transitionProps: { duration: 100, transition: 'fade' },\n  events: { hover: true, focus: false, touch: false },\n  zIndex: getDefaultZIndex('popover'),\n  positionDependencies: [],\n  middlewares: { flip: true, shift: true, inline: false },\n};\n\nconst varsResolver = createVarsResolver<TooltipFactory>((theme, { radius, color }) => ({\n  tooltip: {\n    '--tooltip-radius': radius === undefined ? undefined : getRadius(radius),\n    '--tooltip-bg': color ? getThemeColor(color, theme) : undefined,\n    '--tooltip-color': color ? 'var(--mantine-color-white)' : undefined,\n  },\n}));\n\nexport const Tooltip = factory<TooltipFactory>((_props, ref) => {\n  const props = useProps('Tooltip', defaultProps, _props);\n  const {\n    children,\n    position,\n    refProp,\n    label,\n    openDelay,\n    closeDelay,\n    onPositionChange,\n    opened,\n    defaultOpened,\n    withinPortal,\n    radius,\n    color,\n    classNames,\n    styles,\n    unstyled,\n    style,\n    className,\n    withArrow,\n    arrowSize,\n    arrowOffset,\n    arrowRadius,\n    arrowPosition,\n    offset,\n    transitionProps,\n    multiline,\n    events,\n    zIndex,\n    disabled,\n    positionDependencies,\n    onClick,\n    onMouseEnter,\n    onMouseLeave,\n    inline,\n    variant,\n    keepMounted,\n    vars,\n    portalProps,\n    mod,\n    floatingStrategy,\n    middlewares,\n    ...others\n  } = useProps('Tooltip', defaultProps, props);\n\n  const { dir } = useDirection();\n  const arrowRef = useRef<HTMLDivElement>(null);\n  const tooltip = useTooltip({\n    position: getFloatingPosition(dir, position!),\n    closeDelay,\n    openDelay,\n    onPositionChange,\n    opened,\n    defaultOpened,\n    events,\n    arrowRef,\n    arrowOffset,\n    offset: typeof offset === 'number' ? offset! + (withArrow ? arrowSize! / 2 : 0) : offset!,\n    positionDependencies: [...positionDependencies!, children],\n    inline,\n    strategy: floatingStrategy,\n    middlewares,\n  });\n\n  const getStyles = useStyles<TooltipFactory>({\n    name: 'Tooltip',\n    props,\n    classes,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    rootSelector: 'tooltip',\n    vars,\n    varsResolver,\n  });\n\n  if (!isElement(children)) {\n    throw new Error(\n      '[@mantine/core] Tooltip component children should be an element or a component that accepts ref, fragments, strings, numbers and other primitive values are not supported'\n    );\n  }\n\n  const targetRef = useMergedRef(tooltip.reference, getRefProp(children), ref);\n  const transition = getTransitionProps(transitionProps, { duration: 100, transition: 'fade' });\n  const _childrenProps = children.props as any;\n\n  return (\n    <>\n      <OptionalPortal {...portalProps} withinPortal={withinPortal}>\n        <Transition\n          {...transition}\n          keepMounted={keepMounted}\n          mounted={!disabled && !!tooltip.opened}\n          duration={tooltip.isGroupPhase ? 10 : transition.duration}\n        >\n          {(transitionStyles) => (\n            <Box\n              {...others}\n              data-fixed={floatingStrategy === 'fixed' || undefined}\n              variant={variant}\n              mod={[{ multiline }, mod]}\n              {...tooltip.getFloatingProps({\n                ref: tooltip.floating,\n                className: getStyles('tooltip').className,\n                style: {\n                  ...getStyles('tooltip').style,\n                  ...transitionStyles,\n                  zIndex: zIndex as React.CSSProperties['zIndex'],\n                  top: tooltip.y ?? 0,\n                  left: tooltip.x ?? 0,\n                },\n              })}\n            >\n              {label}\n\n              <FloatingArrow\n                ref={arrowRef}\n                arrowX={tooltip.arrowX!}\n                arrowY={tooltip.arrowY!}\n                visible={withArrow!}\n                position={tooltip.placement!}\n                arrowSize={arrowSize!}\n                arrowOffset={arrowOffset!}\n                arrowRadius={arrowRadius!}\n                arrowPosition={arrowPosition!}\n                {...getStyles('arrow')}\n              />\n            </Box>\n          )}\n        </Transition>\n      </OptionalPortal>\n\n      {cloneElement(\n        children,\n        tooltip.getReferenceProps({\n          onClick,\n          onMouseEnter,\n          onMouseLeave,\n          onMouseMove: props.onMouseMove,\n          onPointerDown: props.onPointerDown,\n          onPointerEnter: props.onPointerEnter,\n          className: cx(className, _childrenProps.className),\n          ..._childrenProps,\n          [refProp!]: targetRef,\n        })\n      )}\n    </>\n  );\n});\n\nTooltip.classes = classes;\nTooltip.displayName = '@mantine/core/Tooltip';\nTooltip.Floating = TooltipFloating;\nTooltip.Group = TooltipGroup;\n","import {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  factory,\n  Factory,\n  rem,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../../core';\nimport classes from '../ActionIcon.module.css';\n\nexport type ActionIconGroupStylesNames = 'group';\nexport type ActionIconGroupCssVariables = {\n  group: '--ai-border-width';\n};\n\nexport interface ActionIconGroupProps extends BoxProps, StylesApiProps<ActionIconGroupFactory> {\n  /** `ActionIcon` components only */\n  children?: React.ReactNode;\n\n  /** Controls group orientation, `'horizontal'` by default */\n  orientation?: 'horizontal' | 'vertical';\n\n  /** `border-width` of the child `ActionIcon` components. Default value in `1` */\n  borderWidth?: number | string;\n}\n\nexport type ActionIconGroupFactory = Factory<{\n  props: ActionIconGroupProps;\n  ref: HTMLDivElement;\n  stylesNames: ActionIconGroupStylesNames;\n  vars: ActionIconGroupCssVariables;\n}>;\n\nconst defaultProps: Partial<ActionIconGroupProps> = {\n  orientation: 'horizontal',\n};\n\nconst varsResolver = createVarsResolver<ActionIconGroupFactory>((_, { borderWidth }) => ({\n  group: { '--ai-border-width': rem(borderWidth) },\n}));\n\nexport const ActionIconGroup = factory<ActionIconGroupFactory>((_props, ref) => {\n  const props = useProps('ActionIconGroup', defaultProps, _props);\n  const {\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    orientation,\n    vars,\n    borderWidth,\n    variant,\n    mod,\n    ...others\n  } = useProps('ActionIconGroup', defaultProps, _props);\n\n  const getStyles = useStyles<ActionIconGroupFactory>({\n    name: 'ActionIconGroup',\n    props,\n    classes,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n    rootSelector: 'group',\n  });\n\n  return (\n    <Box\n      {...getStyles('group')}\n      ref={ref}\n      variant={variant}\n      mod={[{ 'data-orientation': orientation }, mod]}\n      role=\"group\"\n      {...others}\n    />\n  );\n});\n\nActionIconGroup.classes = classes;\nActionIconGroup.displayName = '@mantine/core/ActionIconGroup';\n","import {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  factory,\n  Factory,\n  getFontSize,\n  getRadius,\n  getSize,\n  MantineGradient,\n  MantineRadius,\n  MantineSize,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../../core';\nimport type { ActionIconVariant } from '../ActionIcon';\nimport classes from '../ActionIcon.module.css';\n\nexport type ActionIconGroupSectionStylesNames = 'groupSection';\nexport type ActionIconGroupSectionCssVariables = {\n  groupSection:\n    | '--section-radius'\n    | '--section-bg'\n    | '--section-color'\n    | '--section-bd'\n    | '--section-height'\n    | '--section-padding-x'\n    | '--section-fz';\n};\n\nexport interface ActionIconGroupSectionProps\n  extends BoxProps,\n    StylesApiProps<ActionIconGroupSectionFactory>,\n    ElementProps<'div'> {\n  /** Key of `theme.radius` or any valid CSS value to set `border-radius`, `theme.defaultRadius` by default */\n  radius?: MantineRadius;\n\n  /** Gradient configuration used when `variant=\"gradient\"`, default value is `theme.defaultGradient` */\n  gradient?: MantineGradient;\n\n  /** Determines whether section text color with filled variant should depend on `background-color`. If luminosity of the `color` prop is less than `theme.luminosityThreshold`, then `theme.white` will be used for text color, otherwise `theme.black`. Overrides `theme.autoContrast`. */\n  autoContrast?: boolean;\n\n  /** Controls section `height`, `font-size` and horizontal `padding`, `'sm'` by default */\n  size?: MantineSize | (string & {}) | number;\n}\n\nexport type ActionIconGroupSectionFactory = Factory<{\n  props: ActionIconGroupSectionProps;\n  ref: HTMLDivElement;\n  stylesNames: ActionIconGroupSectionStylesNames;\n  vars: ActionIconGroupSectionCssVariables;\n  variant: ActionIconVariant;\n}>;\n\nconst defaultProps: Partial<ActionIconGroupSectionProps> = {};\n\nconst varsResolver = createVarsResolver<ActionIconGroupSectionFactory>(\n  (theme, { radius, color, gradient, variant, autoContrast, size }) => {\n    const colors = theme.variantColorResolver({\n      color: color || theme.primaryColor,\n      theme,\n      gradient,\n      variant: variant || 'filled',\n      autoContrast,\n    });\n\n    return {\n      groupSection: {\n        '--section-height': getSize(size, 'section-height'),\n        '--section-padding-x': getSize(size, 'section-padding-x'),\n        '--section-fz': getFontSize(size),\n        '--section-radius': radius === undefined ? undefined : getRadius(radius),\n        '--section-bg': color || variant ? colors.background : undefined,\n        '--section-color': colors.color,\n        '--section-bd': color || variant ? colors.border : undefined,\n      },\n    };\n  }\n);\n\nexport const ActionIconGroupSection = factory<ActionIconGroupSectionFactory>((_props, ref) => {\n  const props = useProps('ActionIconGroupSection', defaultProps, _props);\n  const {\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    variant,\n    gradient,\n    radius,\n    autoContrast,\n    ...others\n  } = useProps('ActionIconGroupSection', defaultProps, _props);\n\n  const getStyles = useStyles<ActionIconGroupSectionFactory>({\n    name: 'ActionIconGroupSection',\n    props,\n    classes,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n    rootSelector: 'groupSection',\n  });\n\n  return <Box {...getStyles('groupSection')} ref={ref} variant={variant} {...others} />;\n});\n\nActionIconGroupSection.classes = classes;\nActionIconGroupSection.displayName = '@mantine/core/ActionIconGroupSection';\n","import {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  getRadius,\n  getSize,\n  MantineColor,\n  MantineGradient,\n  MantineRadius,\n  MantineSize,\n  polymorphicFactory,\n  PolymorphicFactory,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../core';\nimport { Loader, LoaderProps } from '../Loader';\nimport { Transition } from '../Transition';\nimport { UnstyledButton } from '../UnstyledButton';\nimport { ActionIconGroup } from './ActionIconGroup/ActionIconGroup';\nimport { ActionIconGroupSection } from './ActionIconGroupSection/ActionIconGroupSection';\nimport classes from './ActionIcon.module.css';\n\nexport type ActionIconVariant =\n  | 'filled'\n  | 'light'\n  | 'outline'\n  | 'transparent'\n  | 'white'\n  | 'subtle'\n  | 'default'\n  | 'gradient';\n\nexport type ActionIconStylesNames = 'root' | 'loader' | 'icon';\nexport type ActionIconCssVariables = {\n  root:\n    | '--ai-radius'\n    | '--ai-size'\n    | '--ai-bg'\n    | '--ai-hover'\n    | '--ai-hover-color'\n    | '--ai-color'\n    | '--ai-bd';\n};\n\nexport interface ActionIconProps extends BoxProps, StylesApiProps<ActionIconFactory> {\n  'data-disabled'?: boolean;\n  __staticSelector?: string;\n\n  /** Determines whether `Loader` component should be displayed instead of the `children`, `false` by default */\n  loading?: boolean;\n\n  /** Props added to the `Loader` component (only visible when `loading` prop is set) */\n  loaderProps?: LoaderProps;\n\n  /** Controls width and height of the button. Numbers are converted to rem. `'md'` by default. */\n  size?: MantineSize | `input-${MantineSize}` | (string & {}) | number;\n\n  /** Key of `theme.colors` or any valid CSS color. Default value is `theme.primaryColor`.  */\n  color?: MantineColor;\n\n  /** Key of `theme.radius` or any valid CSS value to set border-radius. Numbers are converted to rem. `theme.defaultRadius` by default. */\n  radius?: MantineRadius;\n\n  /** Gradient data used when `variant=\"gradient\"`, default value is `theme.defaultGradient` */\n  gradient?: MantineGradient;\n\n  /** Sets `disabled` and `data-disabled` attributes on the button element */\n  disabled?: boolean;\n\n  /** Icon displayed inside the button */\n  children?: React.ReactNode;\n\n  /** Determines whether button text color with filled variant should depend on `background-color`. If luminosity of the `color` prop is less than `theme.luminosityThreshold`, then `theme.white` will be used for text color, otherwise `theme.black`. Overrides `theme.autoContrast`. */\n  autoContrast?: boolean;\n}\n\nexport type ActionIconFactory = PolymorphicFactory<{\n  props: ActionIconProps;\n  defaultComponent: 'button';\n  defaultRef: HTMLButtonElement;\n  stylesNames: ActionIconStylesNames;\n  variant: ActionIconVariant;\n  vars: ActionIconCssVariables;\n  staticComponents: {\n    Group: typeof ActionIconGroup;\n    GroupSection: typeof ActionIconGroupSection;\n  };\n}>;\n\nconst defaultProps: Partial<ActionIconProps> = {};\n\nconst varsResolver = createVarsResolver<ActionIconFactory>(\n  (theme, { size, radius, variant, gradient, color, autoContrast }) => {\n    const colors = theme.variantColorResolver({\n      color: color || theme.primaryColor,\n      theme,\n      gradient,\n      variant: variant || 'filled',\n      autoContrast,\n    });\n\n    return {\n      root: {\n        '--ai-size': getSize(size, 'ai-size'),\n        '--ai-radius': radius === undefined ? undefined : getRadius(radius),\n        '--ai-bg': color || variant ? colors.background : undefined,\n        '--ai-hover': color || variant ? colors.hover : undefined,\n        '--ai-hover-color': color || variant ? colors.hoverColor : undefined,\n        '--ai-color': colors.color,\n        '--ai-bd': color || variant ? colors.border : undefined,\n      },\n    };\n  }\n);\n\nexport const ActionIcon = polymorphicFactory<ActionIconFactory>((_props, ref) => {\n  const props = useProps('ActionIcon', defaultProps, _props);\n  const {\n    className,\n    unstyled,\n    variant,\n    classNames,\n    styles,\n    style,\n    loading,\n    loaderProps,\n    size,\n    color,\n    radius,\n    __staticSelector,\n    gradient,\n    vars,\n    children,\n    disabled,\n    'data-disabled': dataDisabled,\n    autoContrast,\n    mod,\n    ...others\n  } = props;\n\n  const getStyles = useStyles<ActionIconFactory>({\n    name: ['ActionIcon', __staticSelector],\n    props,\n    className,\n    style,\n    classes,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n  });\n\n  return (\n    <UnstyledButton\n      {...getStyles('root', { active: !disabled && !loading && !dataDisabled })}\n      {...others}\n      unstyled={unstyled}\n      variant={variant}\n      size={size}\n      disabled={disabled || loading}\n      ref={ref}\n      mod={[{ loading, disabled: disabled || dataDisabled }, mod]}\n    >\n      <Transition mounted={!!loading} transition=\"slide-down\" duration={150}>\n        {(transitionStyles) => (\n          <Box component=\"span\" {...getStyles('loader', { style: transitionStyles })} aria-hidden>\n            <Loader color=\"var(--ai-color)\" size=\"calc(var(--ai-size) * 0.55)\" {...loaderProps} />\n          </Box>\n        )}\n      </Transition>\n\n      <Box component=\"span\" mod={{ loading }} {...getStyles('icon')}>\n        {children}\n      </Box>\n    </UnstyledButton>\n  );\n});\n\nActionIcon.classes = classes;\nActionIcon.displayName = '@mantine/core/ActionIcon';\nActionIcon.Group = ActionIconGroup;\nActionIcon.GroupSection = ActionIconGroupSection;\n","export default {\n  outline: {\n    xmlns: 'http://www.w3.org/2000/svg',\n    width: 24,\n    height: 24,\n    viewBox: '0 0 24 24',\n    fill: 'none',\n    stroke: 'currentColor',\n    strokeWidth: 2,\n    strokeLinecap: 'round',\n    strokeLinejoin: 'round',\n  },\n  filled: {\n    xmlns: 'http://www.w3.org/2000/svg',\n    width: 24,\n    height: 24,\n    viewBox: '0 0 24 24',\n    fill: 'currentColor',\n    stroke: 'none',\n  },\n};\n","import { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport type { IconNode, IconProps, Icon } from './types';\n\nconst createReactComponent = (\n  type: 'outline' | 'filled',\n  iconName: string,\n  iconNamePascal: string,\n  iconNode: IconNode,\n) => {\n  const Component = forwardRef<Icon, IconProps>(\n    (\n      { color = 'currentColor', size = 24, stroke = 2, className, children, ...rest }: IconProps,\n      ref,\n    ) =>\n      createElement(\n        'svg',\n        {\n          ref,\n          ...defaultAttributes[type],\n          width: size,\n          height: size,\n          className: [`tabler-icon`, `tabler-icon-${iconName}`, className].join(' '),\n          ...(type === 'filled'\n            ? {\n                fill: color,\n              }\n            : {\n                strokeWidth: stroke,\n                stroke: color,\n              }),\n          ...rest,\n        },\n        [\n          ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n          ...(Array.isArray(children) ? children : [children]),\n        ],\n      ),\n  );\n\n  Component.displayName = `${iconNamePascal}`;\n\n  return Component;\n};\n\nexport default createReactComponent;\n","import createReactComponent from '../createReactComponent';\nexport default createReactComponent('outline', 'polygon-off', 'IconPolygonOff', [[\"path\",{\"d\":\"M12 5m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M19 8m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0\",\"key\":\"svg-1\"}],[\"path\",{\"d\":\"M5 11m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0\",\"key\":\"svg-2\"}],[\"path\",{\"d\":\"M15 19m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0\",\"key\":\"svg-3\"}],[\"path\",{\"d\":\"M6.5 9.5l1.546 -1.311\",\"key\":\"svg-4\"}],[\"path\",{\"d\":\"M14 5.5l3 1.5\",\"key\":\"svg-5\"}],[\"path\",{\"d\":\"M18.5 10l-1.185 3.318m-1.062 2.972l-.253 .71\",\"key\":\"svg-6\"}],[\"path\",{\"d\":\"M13.5 17.5l-7 -5\",\"key\":\"svg-7\"}],[\"path\",{\"d\":\"M3 3l18 18\",\"key\":\"svg-8\"}]]);","import createReactComponent from '../createReactComponent';\nexport default createReactComponent('outline', 'polygon', 'IconPolygon', [[\"path\",{\"d\":\"M12 5m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M19 8m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0\",\"key\":\"svg-1\"}],[\"path\",{\"d\":\"M5 11m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0\",\"key\":\"svg-2\"}],[\"path\",{\"d\":\"M15 19m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0\",\"key\":\"svg-3\"}],[\"path\",{\"d\":\"M6.5 9.5l3.5 -3\",\"key\":\"svg-4\"}],[\"path\",{\"d\":\"M14 5.5l3 1.5\",\"key\":\"svg-5\"}],[\"path\",{\"d\":\"M18.5 10l-2.5 7\",\"key\":\"svg-6\"}],[\"path\",{\"d\":\"M13.5 17.5l-7 -5\",\"key\":\"svg-7\"}]]);","import createReactComponent from '../createReactComponent';\nexport default createReactComponent('outline', 'pinned-off', 'IconPinnedOff', [[\"path\",{\"d\":\"M3 3l18 18\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M15 4.5l-3.249 3.249m-2.57 1.433l-2.181 .818l-1.5 1.5l7 7l1.5 -1.5l.82 -2.186m1.43 -2.563l3.25 -3.251\",\"key\":\"svg-1\"}],[\"path\",{\"d\":\"M9 15l-4.5 4.5\",\"key\":\"svg-2\"}],[\"path\",{\"d\":\"M14.5 4l5.5 5.5\",\"key\":\"svg-3\"}]]);","import createReactComponent from '../createReactComponent';\nexport default createReactComponent('outline', 'pin', 'IconPin', [[\"path\",{\"d\":\"M15 4.5l-4 4l-4 1.5l-1.5 1.5l7 7l1.5 -1.5l1.5 -4l4 -4\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M9 15l-4.5 4.5\",\"key\":\"svg-1\"}],[\"path\",{\"d\":\"M14.5 4l5.5 5.5\",\"key\":\"svg-2\"}]]);","import createReactComponent from '../createReactComponent';\nexport default createReactComponent('outline', 'home', 'IconHome', [[\"path\",{\"d\":\"M5 12l-2 0l9 -9l9 9l-2 0\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M5 12v7a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-7\",\"key\":\"svg-1\"}],[\"path\",{\"d\":\"M9 21v-6a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2v6\",\"key\":\"svg-2\"}]]);","import { createSafeContext } from '../../core';\nimport { TransitionOverride } from '../Transition';\n\ninterface ModalBaseContextValue {\n  unstyled: boolean | undefined;\n  titleMounted: boolean;\n  bodyMounted: boolean;\n  setTitleMounted: (value: boolean) => void;\n  setBodyMounted: (value: boolean) => void;\n  getTitleId: () => string;\n  getBodyId: () => string;\n  transitionProps: Partial<TransitionOverride> | undefined;\n  onExitTransitionEnd: (() => void) | undefined;\n  onEnterTransitionEnd: (() => void) | undefined;\n  zIndex: string | number | undefined;\n\n  opened: boolean;\n  onClose: () => void;\n\n  closeOnEscape: boolean | undefined;\n  trapFocus: boolean | undefined;\n  closeOnClickOutside: boolean | undefined;\n}\n\nexport const [ModalBaseProvider, useModalBaseContext] = createSafeContext<ModalBaseContextValue>(\n  'ModalBase component was not found in tree'\n);\n","import { forwardRef } from 'react';\nimport cx from 'clsx';\nimport { Box, BoxProps, ElementProps } from '../../core';\nimport { useModalBaseContext } from './ModalBase.context';\nimport { useModalBodyId } from './use-modal-body-id';\nimport classes from './ModalBase.module.css';\n\nexport interface ModalBaseBodyProps extends BoxProps, ElementProps<'div'> {}\n\nexport const ModalBaseBody = forwardRef<HTMLDivElement, ModalBaseBodyProps>(\n  ({ className, ...others }, ref) => {\n    const bodyId = useModalBodyId();\n    const ctx = useModalBaseContext();\n    return (\n      <Box\n        ref={ref}\n        {...others}\n        id={bodyId}\n        className={cx({ [classes.body]: !ctx.unstyled }, className)}\n      />\n    );\n  }\n);\n\nModalBaseBody.displayName = '@mantine/core/ModalBaseBody';\n","import { useEffect } from 'react';\nimport { useModalBaseContext } from './ModalBase.context';\n\nexport function useModalBodyId() {\n  const ctx = useModalBaseContext();\n\n  useEffect(() => {\n    ctx.setBodyMounted(true);\n    return () => ctx.setBodyMounted(false);\n  }, []);\n\n  return ctx.getBodyId();\n}\n","import { createSafeContext, GetStylesApi } from '../../core';\nimport type { ModalRootFactory } from './ModalRoot';\n\nexport type ScrollAreaComponent = React.FC<any>;\n\ninterface ModalContext {\n  fullScreen: boolean | undefined;\n  yOffset: string | number | undefined;\n  scrollAreaComponent: ScrollAreaComponent | undefined;\n  getStyles: GetStylesApi<ModalRootFactory>;\n}\n\nexport const [ModalProvider, useModalContext] = createSafeContext<ModalContext>(\n  'Modal component was not found in tree'\n);\n","import { CompoundStylesApiProps, factory, Factory, useProps } from '../../core';\nimport { ModalBaseBody, ModalBaseBodyProps } from '../ModalBase';\nimport { useModalContext } from './Modal.context';\nimport classes from './Modal.module.css';\n\nexport type ModalBodyStylesNames = 'body';\n\nexport interface ModalBodyProps\n  extends ModalBaseBodyProps,\n    CompoundStylesApiProps<ModalBodyFactory> {}\n\nexport type ModalBodyFactory = Factory<{\n  props: ModalBodyProps;\n  ref: HTMLDivElement;\n  stylesNames: ModalBodyStylesNames;\n  compound: true;\n}>;\n\nconst defaultProps: Partial<ModalBodyProps> = {};\n\nexport const ModalBody = factory<ModalBodyFactory>((_props, ref) => {\n  const props = useProps('ModalBody', defaultProps, _props);\n  const { classNames, className, style, styles, vars, ...others } = props;\n\n  const ctx = useModalContext();\n\n  return (\n    <ModalBaseBody\n      ref={ref}\n      {...ctx.getStyles('body', { classNames, style, styles, className })}\n      {...others}\n    />\n  );\n});\n\nModalBody.classes = classes;\nModalBody.displayName = '@mantine/core/ModalBody';\n","import { forwardRef } from 'react';\nimport cx from 'clsx';\nimport { BoxProps, ElementProps } from '../../core';\nimport { __CloseButtonProps, CloseButton } from '../CloseButton';\nimport { useModalBaseContext } from './ModalBase.context';\nimport classes from './ModalBase.module.css';\n\nexport interface ModalBaseCloseButtonProps\n  extends __CloseButtonProps,\n    BoxProps,\n    ElementProps<'button'> {}\n\nexport const ModalBaseCloseButton = forwardRef<HTMLButtonElement, ModalBaseCloseButtonProps>(\n  ({ className, onClick, ...others }, ref) => {\n    const ctx = useModalBaseContext();\n    return (\n      <CloseButton\n        ref={ref}\n        {...others}\n        onClick={(event) => {\n          ctx.onClose();\n          onClick?.(event);\n        }}\n        className={cx({ [classes.close]: !ctx.unstyled }, className)}\n        unstyled={ctx.unstyled}\n      />\n    );\n  }\n);\n\nModalBaseCloseButton.displayName = '@mantine/core/ModalBaseCloseButton';\n","import { CompoundStylesApiProps, factory, Factory, useProps } from '../../core';\nimport { ModalBaseCloseButton, ModalBaseCloseButtonProps } from '../ModalBase';\nimport { useModalContext } from './Modal.context';\nimport classes from './Modal.module.css';\n\nexport type ModalCloseButtonStylesNames = 'close';\n\nexport interface ModalCloseButtonProps\n  extends ModalBaseCloseButtonProps,\n    CompoundStylesApiProps<ModalCloseButtonFactory> {}\n\nexport type ModalCloseButtonFactory = Factory<{\n  props: ModalCloseButtonProps;\n  ref: HTMLButtonElement;\n  stylesNames: ModalCloseButtonStylesNames;\n  compound: true;\n}>;\n\nconst defaultProps: Partial<ModalCloseButtonProps> = {};\n\nexport const ModalCloseButton = factory<ModalCloseButtonFactory>((_props, ref) => {\n  const props = useProps('ModalCloseButton', defaultProps, _props);\n  const { classNames, className, style, styles, vars, ...others } = props;\n\n  const ctx = useModalContext();\n\n  return (\n    <ModalBaseCloseButton\n      ref={ref}\n      {...ctx.getStyles('close', { classNames, style, styles, className })}\n      {...others}\n    />\n  );\n});\n\nModalCloseButton.classes = classes;\nModalCloseButton.displayName = '@mantine/core/ModalCloseButton';\n","const TABBABLE_NODES = /input|select|textarea|button|object/;\nexport const FOCUS_SELECTOR = 'a, input, select, textarea, button, object, [tabindex]';\n\nfunction hidden(element: HTMLElement) {\n  if (process.env.NODE_ENV === 'test') {\n    return false;\n  }\n\n  return element.style.display === 'none';\n}\n\nfunction visible(element: HTMLElement) {\n  const isHidden =\n    element.getAttribute('aria-hidden') ||\n    element.getAttribute('hidden') ||\n    element.getAttribute('type') === 'hidden';\n\n  if (isHidden) {\n    return false;\n  }\n\n  let parentElement: HTMLElement = element;\n  while (parentElement) {\n    if (parentElement === document.body || parentElement.nodeType === 11) {\n      break;\n    }\n\n    if (hidden(parentElement)) {\n      return false;\n    }\n\n    parentElement = parentElement.parentNode as HTMLElement;\n  }\n\n  return true;\n}\n\nfunction getElementTabIndex(element: HTMLElement) {\n  let tabIndex: string | null | undefined = element.getAttribute('tabindex');\n  if (tabIndex === null) {\n    tabIndex = undefined;\n  }\n  return parseInt(tabIndex as string, 10);\n}\n\nexport function focusable(element: HTMLElement) {\n  const nodeName = element.nodeName.toLowerCase();\n  const isTabIndexNotNaN = !Number.isNaN(getElementTabIndex(element));\n  const res =\n    // @ts-expect-error function accepts any html element but if it is a button, it should not be disabled to trigger the condition\n    (TABBABLE_NODES.test(nodeName) && !element.disabled) ||\n    (element instanceof HTMLAnchorElement ? element.href || isTabIndexNotNaN : isTabIndexNotNaN);\n\n  return res && visible(element);\n}\n\nexport function tabbable(element: HTMLElement) {\n  const tabIndex = getElementTabIndex(element);\n  const isTabIndexNaN = Number.isNaN(tabIndex);\n  return (isTabIndexNaN || tabIndex >= 0) && focusable(element);\n}\n\nexport function findTabbableDescendants(element: HTMLElement): HTMLElement[] {\n  return Array.from(element.querySelectorAll<HTMLElement>(FOCUS_SELECTOR)).filter(tabbable);\n}\n","import { findTabbableDescendants } from './tabbable';\n\nexport function scopeTab(node: HTMLElement, event: KeyboardEvent) {\n  const tabbable = findTabbableDescendants(node);\n  if (!tabbable.length) {\n    event.preventDefault();\n    return;\n  }\n  const finalTabbable = tabbable[event.shiftKey ? 0 : tabbable.length - 1];\n  const root = node.getRootNode() as unknown as DocumentOrShadowRoot;\n  let leavingFinalTabbable = finalTabbable === root.activeElement || node === root.activeElement;\n\n  const activeElement = root.activeElement as Element;\n  const activeElementIsRadio =\n    activeElement.tagName === 'INPUT' && activeElement.getAttribute('type') === 'radio';\n  if (activeElementIsRadio) {\n    const activeRadioGroup = tabbable.filter(\n      (element) =>\n        element.getAttribute('type') === 'radio' &&\n        element.getAttribute('name') === activeElement.getAttribute('name')\n    );\n    leavingFinalTabbable = activeRadioGroup.includes(finalTabbable);\n  }\n\n  if (!leavingFinalTabbable) {\n    return;\n  }\n\n  event.preventDefault();\n\n  const target = tabbable[event.shiftKey ? tabbable.length - 1 : 0];\n\n  if (target) {\n    target.focus();\n  }\n}\n","import {\n  Box,\n  BoxProps,\n  ElementProps,\n  factory,\n  Factory,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../core';\nimport classes from './VisuallyHidden.module.css';\n\nexport type VisuallyHiddenStylesNames = 'root';\n\nexport interface VisuallyHiddenProps\n  extends BoxProps,\n    StylesApiProps<VisuallyHiddenFactory>,\n    ElementProps<'div'> {}\n\nexport type VisuallyHiddenFactory = Factory<{\n  props: VisuallyHiddenProps;\n  ref: HTMLDivElement;\n  stylesNames: VisuallyHiddenStylesNames;\n}>;\n\nconst defaultProps: Partial<VisuallyHiddenProps> = {};\n\nexport const VisuallyHidden = factory<VisuallyHiddenFactory>((_props, ref) => {\n  const props = useProps('VisuallyHidden', defaultProps, _props);\n  const { classNames, className, style, styles, unstyled, vars, ...others } = props;\n\n  const getStyles = useStyles<VisuallyHiddenFactory>({\n    name: 'VisuallyHidden',\n    classes,\n    props,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n  });\n\n  return <Box component=\"span\" ref={ref} {...getStyles('root')} {...others} />;\n});\n\nVisuallyHidden.classes = classes;\nVisuallyHidden.displayName = '@mantine/core/VisuallyHidden';\n","import { cloneElement } from 'react';\nimport { useFocusTrap, useMergedRef } from '@mantine/hooks';\nimport { isElement } from '../../core';\nimport { VisuallyHidden } from '../VisuallyHidden';\n\nexport interface FocusTrapProps {\n  /** Element at which focus should be trapped, should support ref prop */\n  children: any;\n\n  /** Determines whether focus should be trapped within child element */\n  active?: boolean;\n\n  /** Prop that should be used to access component ref */\n  refProp?: string;\n\n  /** Assigns element `ref` */\n  innerRef?: React.ForwardedRef<any>;\n}\n\nexport function FocusTrap({\n  children,\n  active = true,\n  refProp = 'ref',\n  innerRef,\n}: FocusTrapProps): React.ReactElement {\n  const focusTrapRef = useFocusTrap(active);\n  const ref = useMergedRef(focusTrapRef, innerRef);\n\n  if (!isElement(children)) {\n    return children;\n  }\n\n  return cloneElement(children, { [refProp]: ref });\n}\n\nexport function FocusTrapInitialFocus(props: React.ComponentPropsWithoutRef<'span'>) {\n  return <VisuallyHidden tabIndex={-1} data-autofocus {...props} />;\n}\n\nFocusTrap.displayName = '@mantine/core/FocusTrap';\nFocusTrapInitialFocus.displayName = '@mantine/core/FocusTrapInitialFocus';\nFocusTrap.InitialFocus = FocusTrapInitialFocus;\n","import { useCallback, useEffect, useRef } from 'react';\nimport { scopeTab } from './scope-tab';\nimport { FOCUS_SELECTOR, focusable, tabbable } from './tabbable';\n\nexport function useFocusTrap(active = true): (instance: HTMLElement | null) => void {\n  const ref = useRef<HTMLElement>(null);\n\n  const focusNode = (node: HTMLElement) => {\n    let focusElement: HTMLElement | null = node.querySelector('[data-autofocus]');\n\n    if (!focusElement) {\n      const children = Array.from<HTMLElement>(node.querySelectorAll(FOCUS_SELECTOR));\n      focusElement = children.find(tabbable) || children.find(focusable) || null;\n      if (!focusElement && focusable(node)) {\n        focusElement = node;\n      }\n    }\n\n    if (focusElement) {\n      focusElement.focus({ preventScroll: true });\n    } else if (process.env.NODE_ENV === 'development') {\n      // eslint-disable-next-line no-console\n      console.warn(\n        '[@mantine/hooks/use-focus-trap] Failed to find focusable element within provided node',\n        node\n      );\n    }\n  };\n\n  const setRef = useCallback(\n    (node: HTMLElement | null) => {\n      if (!active) {\n        return;\n      }\n\n      if (node === null) {\n        return;\n      }\n\n      if (ref.current === node) {\n        return;\n      }\n\n      if (node) {\n        // Delay processing the HTML node by a frame. This ensures focus is assigned correctly.\n        setTimeout(() => {\n          if (node.getRootNode()) {\n            focusNode(node);\n          } else if (process.env.NODE_ENV === 'development') {\n            // eslint-disable-next-line no-console\n            console.warn('[@mantine/hooks/use-focus-trap] Ref node is not part of the dom', node);\n          }\n        });\n\n        ref.current = node;\n      } else {\n        ref.current = null;\n      }\n    },\n    [active]\n  );\n\n  useEffect(() => {\n    if (!active) {\n      return undefined;\n    }\n\n    ref.current && setTimeout(() => focusNode(ref.current!));\n\n    const handleKeyDown = (event: KeyboardEvent) => {\n      if (event.key === 'Tab' && ref.current) {\n        scopeTab(ref.current, event);\n      }\n    };\n\n    document.addEventListener('keydown', handleKeyDown);\n    return () => document.removeEventListener('keydown', handleKeyDown);\n  }, [active]);\n\n  return setRef;\n}\n","import { forwardRef } from 'react';\nimport cx from 'clsx';\nimport { BoxProps, ElementProps, MantineRadius, MantineShadow } from '../../core';\nimport { FocusTrap } from '../FocusTrap';\nimport { Paper } from '../Paper';\nimport { Transition, TransitionOverride } from '../Transition';\nimport { useModalBaseContext } from './ModalBase.context';\nimport classes from './ModalBase.module.css';\n\nexport interface ModalBaseContentProps extends BoxProps, ElementProps<'div'> {\n  /** Props passed down to the `Transition` component */\n  transitionProps?: TransitionOverride;\n\n  /** Key of `theme.shadows` or any valid CSS value to set `box-shadow`, `none` by default */\n  shadow?: MantineShadow;\n\n  /** Key of `theme.radius` or any valid CSS value to set border-radius, numbers are converted to rem, `theme.defaultRadius` by default */\n  radius?: MantineRadius;\n}\n\ninterface _ModalBaseContentProps extends ModalBaseContentProps {\n  innerProps: React.ComponentPropsWithoutRef<'div'>;\n}\n\nexport const ModalBaseContent = forwardRef<HTMLDivElement, _ModalBaseContentProps>(\n  ({ transitionProps, className, innerProps, onKeyDown, style, ...others }, ref) => {\n    const ctx = useModalBaseContext();\n\n    return (\n      <Transition\n        mounted={ctx.opened}\n        transition=\"pop\"\n        {...ctx.transitionProps}\n        onExited={() => {\n          ctx.onExitTransitionEnd?.();\n          ctx.transitionProps?.onExited?.();\n        }}\n        onEntered={() => {\n          ctx.onEnterTransitionEnd?.();\n          ctx.transitionProps?.onEntered?.();\n        }}\n        {...transitionProps}\n      >\n        {(transitionStyles) => (\n          <div\n            {...innerProps}\n            className={cx({ [classes.inner]: !ctx.unstyled }, innerProps.className)}\n          >\n            <FocusTrap active={ctx.opened && ctx.trapFocus} innerRef={ref}>\n              <Paper\n                {...others}\n                component=\"section\"\n                role=\"dialog\"\n                tabIndex={-1}\n                aria-modal\n                aria-describedby={ctx.bodyMounted ? ctx.getBodyId() : undefined}\n                aria-labelledby={ctx.titleMounted ? ctx.getTitleId() : undefined}\n                style={[style, transitionStyles]}\n                className={cx({ [classes.content]: !ctx.unstyled }, className)}\n                unstyled={ctx.unstyled}\n              >\n                {others.children}\n              </Paper>\n            </FocusTrap>\n          </div>\n        )}\n      </Transition>\n    );\n  }\n);\n\nModalBaseContent.displayName = '@mantine/core/ModalBaseContent';\n","interface NativeScrollAreaProps {\n  children: React.ReactNode;\n}\n\nexport function NativeScrollArea({ children }: NativeScrollAreaProps) {\n  return <>{children}</>;\n}\n","import { CompoundStylesApiProps, factory, Factory, rem, useProps } from '../../core';\nimport { ModalBaseContent, ModalBaseContentProps, NativeScrollArea } from '../ModalBase';\nimport { useModalContext } from './Modal.context';\nimport classes from './Modal.module.css';\n\nexport type ModalContentStylesNames = 'content' | 'inner';\n\nexport interface ModalContentProps\n  extends ModalBaseContentProps,\n    CompoundStylesApiProps<ModalContentFactory> {\n  __hidden?: boolean;\n}\n\nexport type ModalContentFactory = Factory<{\n  props: ModalContentProps;\n  ref: HTMLDivElement;\n  stylesNames: ModalContentStylesNames;\n  compound: true;\n}>;\n\nconst defaultProps: Partial<ModalContentProps> = {};\n\nexport const ModalContent = factory<ModalContentFactory>((_props, ref) => {\n  const props = useProps('ModalContent', defaultProps, _props);\n  const { classNames, className, style, styles, vars, children, __hidden, ...others } = props;\n\n  const ctx = useModalContext();\n  const Scroll: React.FC<any> = ctx.scrollAreaComponent || NativeScrollArea;\n\n  return (\n    <ModalBaseContent\n      {...ctx.getStyles('content', { className, style, styles, classNames })}\n      innerProps={ctx.getStyles('inner', { className, style, styles, classNames })}\n      data-full-screen={ctx.fullScreen || undefined}\n      data-modal-content\n      data-hidden={__hidden || undefined}\n      ref={ref}\n      {...others}\n    >\n      <Scroll\n        style={{\n          maxHeight: ctx.fullScreen ? '100dvh' : `calc(100dvh - (${rem(ctx.yOffset)} * 2))`,\n        }}\n      >\n        {children}\n      </Scroll>\n    </ModalBaseContent>\n  );\n});\n\nModalContent.classes = classes;\nModalContent.displayName = '@mantine/core/ModalContent';\n","import { forwardRef } from 'react';\nimport cx from 'clsx';\nimport { Box, BoxProps, ElementProps } from '../../core';\nimport { useModalBaseContext } from './ModalBase.context';\nimport classes from './ModalBase.module.css';\n\nexport interface ModalBaseHeaderProps extends BoxProps, ElementProps<'header'> {}\n\nexport const ModalBaseHeader = forwardRef<HTMLElement, ModalBaseHeaderProps>(\n  ({ className, ...others }, ref) => {\n    const ctx = useModalBaseContext();\n    return (\n      <Box\n        component=\"header\"\n        ref={ref}\n        className={cx({ [classes.header]: !ctx.unstyled }, className)}\n        {...others}\n      />\n    );\n  }\n);\n\nModalBaseHeader.displayName = '@mantine/core/ModalBaseHeader';\n","import { CompoundStylesApiProps, factory, Factory, useProps } from '../../core';\nimport { ModalBaseHeader, ModalBaseHeaderProps } from '../ModalBase';\nimport { useModalContext } from './Modal.context';\nimport classes from './Modal.module.css';\n\nexport type ModalHeaderStylesNames = 'header';\n\nexport interface ModalHeaderProps\n  extends ModalBaseHeaderProps,\n    CompoundStylesApiProps<ModalHeaderFactory> {}\n\nexport type ModalHeaderFactory = Factory<{\n  props: ModalHeaderProps;\n  ref: HTMLElement;\n  stylesNames: ModalHeaderStylesNames;\n  compound: true;\n}>;\n\nconst defaultProps: Partial<ModalHeaderProps> = {};\n\nexport const ModalHeader = factory<ModalHeaderFactory>((_props, ref) => {\n  const props = useProps('ModalHeader', defaultProps, _props);\n  const { classNames, className, style, styles, vars, ...others } = props;\n\n  const ctx = useModalContext();\n\n  return (\n    <ModalBaseHeader\n      ref={ref}\n      {...ctx.getStyles('header', { classNames, style, styles, className })}\n      {...others}\n    />\n  );\n});\n\nModalHeader.classes = classes;\nModalHeader.displayName = '@mantine/core/ModalHeader';\n","import {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  getDefaultZIndex,\n  getRadius,\n  MantineRadius,\n  polymorphicFactory,\n  PolymorphicFactory,\n  rem,\n  rgba,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../core';\nimport classes from './Overlay.module.css';\n\nexport type OverlayStylesNames = 'root';\nexport type OverlayCssVariables = {\n  root: '--overlay-bg' | '--overlay-filter' | '--overlay-radius' | '--overlay-z-index';\n};\n\nexport interface OverlayProps extends BoxProps, StylesApiProps<OverlayFactory> {\n  /** Controls overlay `background-color` opacity 0–1, disregarded when `gradient` prop is set, `0.6` by default */\n  backgroundOpacity?: number;\n\n  /** Overlay `background-color`, `#000` by default */\n  color?: React.CSSProperties['backgroundColor'];\n\n  /** Overlay background blur, `0` by default */\n  blur?: number | string;\n\n  /** Changes overlay to gradient. If set, `color` prop is ignored */\n  gradient?: string;\n\n  /** Overlay z-index, `200` by default */\n  zIndex?: string | number;\n\n  /** Key of `theme.radius` or any valid CSS value to set border-radius, `0` by default */\n  radius?: MantineRadius;\n\n  /** Content inside overlay */\n  children?: React.ReactNode;\n\n  /** Determines whether content inside overlay should be vertically and horizontally centered, `false` by default */\n  center?: boolean;\n\n  /** Determines whether overlay should have fixed position instead of absolute, `false` by default */\n  fixed?: boolean;\n}\n\nexport type OverlayFactory = PolymorphicFactory<{\n  props: OverlayProps;\n  defaultRef: HTMLDivElement;\n  defaultComponent: 'div';\n  stylesNames: OverlayStylesNames;\n  vars: OverlayCssVariables;\n}>;\n\nconst defaultProps: Partial<OverlayProps> = {\n  zIndex: getDefaultZIndex('modal'),\n};\n\nconst varsResolver = createVarsResolver<OverlayFactory>(\n  (_, { gradient, color, backgroundOpacity, blur, radius, zIndex }) => ({\n    root: {\n      '--overlay-bg':\n        gradient ||\n        ((color !== undefined || backgroundOpacity !== undefined) &&\n          rgba(color || '#000', backgroundOpacity ?? 0.6)) ||\n        undefined,\n      '--overlay-filter': blur ? `blur(${rem(blur)})` : undefined,\n      '--overlay-radius': radius === undefined ? undefined : getRadius(radius),\n      '--overlay-z-index': zIndex?.toString(),\n    },\n  })\n);\n\nexport const Overlay = polymorphicFactory<OverlayFactory>((_props, ref) => {\n  const props = useProps('Overlay', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    fixed,\n    center,\n    children,\n    radius,\n    zIndex,\n    gradient,\n    blur,\n    color,\n    backgroundOpacity,\n    mod,\n    ...others\n  } = props;\n\n  const getStyles = useStyles<OverlayFactory>({\n    name: 'Overlay',\n    props,\n    classes,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n  });\n\n  return (\n    <Box ref={ref} {...getStyles('root')} mod={[{ center, fixed }, mod]} {...others}>\n      {children}\n    </Box>\n  );\n});\n\nOverlay.classes = classes;\nOverlay.displayName = '@mantine/core/Overlay';\n","import { TransitionOverride } from '../Transition';\nimport { useModalBaseContext } from './ModalBase.context';\n\nconst DEFAULT_TRANSITION: TransitionOverride = {\n  duration: 200,\n  timingFunction: 'ease',\n  transition: 'fade',\n};\n\nexport function useModalTransition(\n  transitionOverride: TransitionOverride | undefined\n): TransitionOverride {\n  const ctx = useModalBaseContext();\n  return { ...DEFAULT_TRANSITION, ...ctx.transitionProps, ...transitionOverride };\n}\n","import { forwardRef } from 'react';\nimport { ElementProps } from '../../core';\nimport { Overlay, OverlayProps } from '../Overlay';\nimport { Transition, TransitionOverride } from '../Transition';\nimport { useModalBaseContext } from './ModalBase.context';\nimport { useModalTransition } from './use-modal-transition';\n\nexport interface ModalBaseOverlayProps\n  extends Omit<OverlayProps, 'styles' | 'classNames' | 'variant' | 'vars'>,\n    ElementProps<'div', 'color'> {\n  /** Props passed down to the `Transition` component */\n  transitionProps?: TransitionOverride;\n\n  /** Determines whether the overlay should be visible. By default, has the same value as `opened` state. */\n  visible?: boolean;\n}\n\nexport const ModalBaseOverlay = forwardRef<HTMLDivElement, ModalBaseOverlayProps>(\n  ({ onClick, transitionProps, style, visible, ...others }, ref) => {\n    const ctx = useModalBaseContext();\n    const transition = useModalTransition(transitionProps);\n\n    return (\n      <Transition\n        mounted={visible !== undefined ? visible : ctx.opened}\n        {...transition}\n        transition=\"fade\"\n      >\n        {(transitionStyles) => (\n          <Overlay\n            ref={ref}\n            fixed\n            style={[style, transitionStyles]}\n            zIndex={ctx.zIndex}\n            unstyled={ctx.unstyled}\n            onClick={(event) => {\n              onClick?.(event);\n              ctx.closeOnClickOutside && ctx.onClose();\n            }}\n            {...others}\n          />\n        )}\n      </Transition>\n    );\n  }\n);\n\nModalBaseOverlay.displayName = '@mantine/core/ModalBaseOverlay';\n","import { CompoundStylesApiProps, factory, Factory, useProps } from '../../core';\nimport { ModalBaseOverlay, ModalBaseOverlayProps } from '../ModalBase';\nimport { useModalContext } from './Modal.context';\nimport classes from './Modal.module.css';\n\nexport type ModalOverlayStylesNames = 'overlay';\n\nexport interface ModalOverlayProps\n  extends ModalBaseOverlayProps,\n    CompoundStylesApiProps<ModalOverlayFactory> {}\n\nexport type ModalOverlayFactory = Factory<{\n  props: ModalOverlayProps;\n  ref: HTMLDivElement;\n  stylesNames: ModalOverlayStylesNames;\n  compound: true;\n}>;\n\nconst defaultProps: Partial<ModalOverlayProps> = {};\n\nexport const ModalOverlay = factory<ModalOverlayFactory>((_props, ref) => {\n  const props = useProps('ModalOverlay', defaultProps, _props);\n  const { classNames, className, style, styles, vars, ...others } = props;\n\n  const ctx = useModalContext();\n\n  return (\n    <ModalBaseOverlay\n      ref={ref}\n      {...ctx.getStyles('overlay', { classNames, style, styles, className })}\n      {...others}\n    />\n  );\n});\n\nModalOverlay.classes = classes;\nModalOverlay.displayName = '@mantine/core/ModalOverlay';\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol */\n\nvar extendStatics = function(d, b) {\n  extendStatics = Object.setPrototypeOf ||\n      ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n      function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n  return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n  if (typeof b !== \"function\" && b !== null)\n      throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n  extendStatics(d, b);\n  function __() { this.constructor = d; }\n  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n  __assign = Object.assign || function __assign(t) {\n      for (var s, i = 1, n = arguments.length; i < n; i++) {\n          s = arguments[i];\n          for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n      }\n      return t;\n  }\n  return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n  var t = {};\n  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n      t[p] = s[p];\n  if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n      for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n          if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n              t[p[i]] = s[p[i]];\n      }\n  return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n  if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n  return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n  return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n  function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n  var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n  var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n  var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n  var _, done = false;\n  for (var i = decorators.length - 1; i >= 0; i--) {\n      var context = {};\n      for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n      for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n      context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n      var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n      if (kind === \"accessor\") {\n          if (result === void 0) continue;\n          if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n          if (_ = accept(result.get)) descriptor.get = _;\n          if (_ = accept(result.set)) descriptor.set = _;\n          if (_ = accept(result.init)) initializers.unshift(_);\n      }\n      else if (_ = accept(result)) {\n          if (kind === \"field\") initializers.unshift(_);\n          else descriptor[key] = _;\n      }\n  }\n  if (target) Object.defineProperty(target, contextIn.name, descriptor);\n  done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n  var useValue = arguments.length > 2;\n  for (var i = 0; i < initializers.length; i++) {\n      value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n  }\n  return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n  return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n  if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n  return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n  if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n  return new (P || (P = Promise))(function (resolve, reject) {\n      function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n      function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n      function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n  });\n}\n\nexport function __generator(thisArg, body) {\n  var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n  return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n  function verb(n) { return function (v) { return step([n, v]); }; }\n  function step(op) {\n      if (f) throw new TypeError(\"Generator is already executing.\");\n      while (g && (g = 0, op[0] && (_ = 0)), _) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n              case 0: case 1: t = op; break;\n              case 4: _.label++; return { value: op[1], done: false };\n              case 5: _.label++; y = op[1]; op = [0]; continue;\n              case 7: op = _.ops.pop(); _.trys.pop(); continue;\n              default:\n                  if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n                  if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n                  if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n                  if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n                  if (t[2]) _.ops.pop();\n                  _.trys.pop(); continue;\n          }\n          op = body.call(thisArg, _);\n      } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n      if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n  }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n  if (k2 === undefined) k2 = k;\n  var desc = Object.getOwnPropertyDescriptor(m, k);\n  if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n      desc = { enumerable: true, get: function() { return m[k]; } };\n  }\n  Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n  if (k2 === undefined) k2 = k;\n  o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n  for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n  var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n  if (m) return m.call(o);\n  if (o && typeof o.length === \"number\") return {\n      next: function () {\n          if (o && i >= o.length) o = void 0;\n          return { value: o && o[i++], done: !o };\n      }\n  };\n  throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n  var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n  if (!m) return o;\n  var i = m.call(o), r, ar = [], e;\n  try {\n      while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n  }\n  catch (error) { e = { error: error }; }\n  finally {\n      try {\n          if (r && !r.done && (m = i[\"return\"])) m.call(i);\n      }\n      finally { if (e) throw e.error; }\n  }\n  return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n  for (var ar = [], i = 0; i < arguments.length; i++)\n      ar = ar.concat(__read(arguments[i]));\n  return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n  for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n  for (var r = Array(s), k = 0, i = 0; i < il; i++)\n      for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n          r[k] = a[j];\n  return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n  if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n      if (ar || !(i in from)) {\n          if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n          ar[i] = from[i];\n      }\n  }\n  return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n  return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n  if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n  var g = generator.apply(thisArg, _arguments || []), i, q = [];\n  return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\n  function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\n  function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n  function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n  function fulfill(value) { resume(\"next\", value); }\n  function reject(value) { resume(\"throw\", value); }\n  function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n  var i, p;\n  return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n  function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n  if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n  var m = o[Symbol.asyncIterator], i;\n  return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n  function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n  function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n  if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n  return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n  Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n  o[\"default\"] = v;\n};\n\nexport function __importStar(mod) {\n  if (mod && mod.__esModule) return mod;\n  var result = {};\n  if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n  __setModuleDefault(result, mod);\n  return result;\n}\n\nexport function __importDefault(mod) {\n  return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n  if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n  if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n  return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n  if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n  if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n  if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n  return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n  if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n  return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n  if (value !== null && value !== void 0) {\n    if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n    var dispose;\n    if (async) {\n        if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n        dispose = value[Symbol.asyncDispose];\n    }\n    if (dispose === void 0) {\n        if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n        dispose = value[Symbol.dispose];\n    }\n    if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n    env.stack.push({ value: value, dispose: dispose, async: async });\n  }\n  else if (async) {\n    env.stack.push({ async: true });\n  }\n  return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n  var e = new Error(message);\n  return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n  function fail(e) {\n    env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n    env.hasError = true;\n  }\n  function next() {\n    while (env.stack.length) {\n      var rec = env.stack.pop();\n      try {\n        var result = rec.dispose && rec.dispose.call(rec.value);\n        if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n      }\n      catch (e) {\n          fail(e);\n      }\n    }\n    if (env.hasError) throw env.error;\n  }\n  return next();\n}\n\nexport default {\n  __extends,\n  __assign,\n  __rest,\n  __decorate,\n  __param,\n  __metadata,\n  __awaiter,\n  __generator,\n  __createBinding,\n  __exportStar,\n  __values,\n  __read,\n  __spread,\n  __spreadArrays,\n  __spreadArray,\n  __await,\n  __asyncGenerator,\n  __asyncDelegator,\n  __asyncValues,\n  __makeTemplateObject,\n  __importStar,\n  __importDefault,\n  __classPrivateFieldGet,\n  __classPrivateFieldSet,\n  __classPrivateFieldIn,\n  __addDisposableResource,\n  __disposeResources,\n};\n","export var zeroRightClassName = 'right-scroll-bar-position';\nexport var fullWidthClassName = 'width-before-scroll-bar';\nexport var noScrollbarsClassName = 'with-scroll-bars-hidden';\n/**\n * Name of a CSS variable containing the amount of \"hidden\" scrollbar\n * ! might be undefined ! use will fallback!\n */\nexport var removedBarSizeVariable = '--removed-body-scroll-bar-size';\n","/**\n * Assigns a value for a given ref, no matter of the ref format\n * @param {RefObject} ref - a callback function or ref object\n * @param value - a new value\n *\n * @see https://github.com/theKashey/use-callback-ref#assignref\n * @example\n * const refObject = useRef();\n * const refFn = (ref) => {....}\n *\n * assignRef(refObject, \"refValue\");\n * assignRef(refFn, \"refValue\");\n */\nexport function assignRef(ref, value) {\n    if (typeof ref === 'function') {\n        ref(value);\n    }\n    else if (ref) {\n        ref.current = value;\n    }\n    return ref;\n}\n","import * as React from 'react';\nimport { assignRef } from './assignRef';\nimport { useCallbackRef } from './useRef';\nvar useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;\nvar currentValues = new WeakMap();\n/**\n * Merges two or more refs together providing a single interface to set their value\n * @param {RefObject|Ref} refs\n * @returns {MutableRefObject} - a new ref, which translates all changes to {refs}\n *\n * @see {@link mergeRefs} a version without buit-in memoization\n * @see https://github.com/theKashey/use-callback-ref#usemergerefs\n * @example\n * const Component = React.forwardRef((props, ref) => {\n *   const ownRef = useRef();\n *   const domRef = useMergeRefs([ref, ownRef]); // 👈 merge together\n *   return <div ref={domRef}>...</div>\n * }\n */\nexport function useMergeRefs(refs, defaultValue) {\n    var callbackRef = useCallbackRef(defaultValue || null, function (newValue) {\n        return refs.forEach(function (ref) { return assignRef(ref, newValue); });\n    });\n    // handle refs changes - added or removed\n    useIsomorphicLayoutEffect(function () {\n        var oldValue = currentValues.get(callbackRef);\n        if (oldValue) {\n            var prevRefs_1 = new Set(oldValue);\n            var nextRefs_1 = new Set(refs);\n            var current_1 = callbackRef.current;\n            prevRefs_1.forEach(function (ref) {\n                if (!nextRefs_1.has(ref)) {\n                    assignRef(ref, null);\n                }\n            });\n            nextRefs_1.forEach(function (ref) {\n                if (!prevRefs_1.has(ref)) {\n                    assignRef(ref, current_1);\n                }\n            });\n        }\n        currentValues.set(callbackRef, refs);\n    }, [refs]);\n    return callbackRef;\n}\n","import { useState } from 'react';\n/**\n * creates a MutableRef with ref change callback\n * @param initialValue - initial ref value\n * @param {Function} callback - a callback to run when value changes\n *\n * @example\n * const ref = useCallbackRef(0, (newValue, oldValue) => console.log(oldValue, '->', newValue);\n * ref.current = 1;\n * // prints 0 -> 1\n *\n * @see https://reactjs.org/docs/hooks-reference.html#useref\n * @see https://github.com/theKashey/use-callback-ref#usecallbackref---to-replace-reactuseref\n * @returns {MutableRefObject}\n */\nexport function useCallbackRef(initialValue, callback) {\n    var ref = useState(function () { return ({\n        // value\n        value: initialValue,\n        // last callback\n        callback: callback,\n        // \"memoized\" public interface\n        facade: {\n            get current() {\n                return ref.value;\n            },\n            set current(value) {\n                var last = ref.value;\n                if (last !== value) {\n                    ref.value = value;\n                    ref.callback(value, last);\n                }\n            },\n        },\n    }); })[0];\n    // update callback\n    ref.callback = callback;\n    return ref.facade;\n}\n","import { __assign } from \"tslib\";\nfunction ItoI(a) {\n    return a;\n}\nfunction innerCreateMedium(defaults, middleware) {\n    if (middleware === void 0) { middleware = ItoI; }\n    var buffer = [];\n    var assigned = false;\n    var medium = {\n        read: function () {\n            if (assigned) {\n                throw new Error('Sidecar: could not `read` from an `assigned` medium. `read` could be used only with `useMedium`.');\n            }\n            if (buffer.length) {\n                return buffer[buffer.length - 1];\n            }\n            return defaults;\n        },\n        useMedium: function (data) {\n            var item = middleware(data, assigned);\n            buffer.push(item);\n            return function () {\n                buffer = buffer.filter(function (x) { return x !== item; });\n            };\n        },\n        assignSyncMedium: function (cb) {\n            assigned = true;\n            while (buffer.length) {\n                var cbs = buffer;\n                buffer = [];\n                cbs.forEach(cb);\n            }\n            buffer = {\n                push: function (x) { return cb(x); },\n                filter: function () { return buffer; },\n            };\n        },\n        assignMedium: function (cb) {\n            assigned = true;\n            var pendingQueue = [];\n            if (buffer.length) {\n                var cbs = buffer;\n                buffer = [];\n                cbs.forEach(cb);\n                pendingQueue = buffer;\n            }\n            var executeQueue = function () {\n                var cbs = pendingQueue;\n                pendingQueue = [];\n                cbs.forEach(cb);\n            };\n            var cycle = function () { return Promise.resolve().then(executeQueue); };\n            cycle();\n            buffer = {\n                push: function (x) {\n                    pendingQueue.push(x);\n                    cycle();\n                },\n                filter: function (filter) {\n                    pendingQueue = pendingQueue.filter(filter);\n                    return buffer;\n                },\n            };\n        },\n    };\n    return medium;\n}\nexport function createMedium(defaults, middleware) {\n    if (middleware === void 0) { middleware = ItoI; }\n    return innerCreateMedium(defaults, middleware);\n}\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function createSidecarMedium(options) {\n    if (options === void 0) { options = {}; }\n    var medium = innerCreateMedium(null);\n    medium.options = __assign({ async: true, ssr: false }, options);\n    return medium;\n}\n","import { createSidecarMedium } from 'use-sidecar';\nexport var effectCar = createSidecarMedium();\n","import { __assign, __rest } from \"tslib\";\nimport * as React from 'react';\nimport { fullWidthClassName, zeroRightClassName } from 'react-remove-scroll-bar/constants';\nimport { useMergeRefs } from 'use-callback-ref';\nimport { effectCar } from './medium';\nvar nothing = function () {\n    return;\n};\n/**\n * Removes scrollbar from the page and contain the scroll within the Lock\n */\nvar RemoveScroll = React.forwardRef(function (props, parentRef) {\n    var ref = React.useRef(null);\n    var _a = React.useState({\n        onScrollCapture: nothing,\n        onWheelCapture: nothing,\n        onTouchMoveCapture: nothing,\n    }), callbacks = _a[0], setCallbacks = _a[1];\n    var forwardProps = props.forwardProps, children = props.children, className = props.className, removeScrollBar = props.removeScrollBar, enabled = props.enabled, shards = props.shards, sideCar = props.sideCar, noIsolation = props.noIsolation, inert = props.inert, allowPinchZoom = props.allowPinchZoom, _b = props.as, Container = _b === void 0 ? 'div' : _b, gapMode = props.gapMode, rest = __rest(props, [\"forwardProps\", \"children\", \"className\", \"removeScrollBar\", \"enabled\", \"shards\", \"sideCar\", \"noIsolation\", \"inert\", \"allowPinchZoom\", \"as\", \"gapMode\"]);\n    var SideCar = sideCar;\n    var containerRef = useMergeRefs([ref, parentRef]);\n    var containerProps = __assign(__assign({}, rest), callbacks);\n    return (React.createElement(React.Fragment, null,\n        enabled && (React.createElement(SideCar, { sideCar: effectCar, removeScrollBar: removeScrollBar, shards: shards, noIsolation: noIsolation, inert: inert, setCallbacks: setCallbacks, allowPinchZoom: !!allowPinchZoom, lockRef: ref, gapMode: gapMode })),\n        forwardProps ? (React.cloneElement(React.Children.only(children), __assign(__assign({}, containerProps), { ref: containerRef }))) : (React.createElement(Container, __assign({}, containerProps, { className: className, ref: containerRef }), children))));\n});\nRemoveScroll.defaultProps = {\n    enabled: true,\n    removeScrollBar: true,\n    inert: false,\n};\nRemoveScroll.classNames = {\n    fullWidth: fullWidthClassName,\n    zeroRight: zeroRightClassName,\n};\nexport { RemoveScroll };\n","import { __assign, __rest } from \"tslib\";\nimport * as React from 'react';\nvar SideCar = function (_a) {\n    var sideCar = _a.sideCar, rest = __rest(_a, [\"sideCar\"]);\n    if (!sideCar) {\n        throw new Error('Sidecar: please provide `sideCar` property to import the right car');\n    }\n    var Target = sideCar.read();\n    if (!Target) {\n        throw new Error('Sidecar medium not found');\n    }\n    return React.createElement(Target, __assign({}, rest));\n};\nSideCar.isSideCarExport = true;\nexport function exportSidecar(medium, exported) {\n    medium.useMedium(exported);\n    return SideCar;\n}\n","var currentNonce;\nexport var setNonce = function (nonce) {\n    currentNonce = nonce;\n};\nexport var getNonce = function () {\n    if (currentNonce) {\n        return currentNonce;\n    }\n    if (typeof __webpack_nonce__ !== 'undefined') {\n        return __webpack_nonce__;\n    }\n    return undefined;\n};\n","import { getNonce } from 'get-nonce';\nfunction makeStyleTag() {\n    if (!document)\n        return null;\n    var tag = document.createElement('style');\n    tag.type = 'text/css';\n    var nonce = getNonce();\n    if (nonce) {\n        tag.setAttribute('nonce', nonce);\n    }\n    return tag;\n}\nfunction injectStyles(tag, css) {\n    // @ts-ignore\n    if (tag.styleSheet) {\n        // @ts-ignore\n        tag.styleSheet.cssText = css;\n    }\n    else {\n        tag.appendChild(document.createTextNode(css));\n    }\n}\nfunction insertStyleTag(tag) {\n    var head = document.head || document.getElementsByTagName('head')[0];\n    head.appendChild(tag);\n}\nexport var stylesheetSingleton = function () {\n    var counter = 0;\n    var stylesheet = null;\n    return {\n        add: function (style) {\n            if (counter == 0) {\n                if ((stylesheet = makeStyleTag())) {\n                    injectStyles(stylesheet, style);\n                    insertStyleTag(stylesheet);\n                }\n            }\n            counter++;\n        },\n        remove: function () {\n            counter--;\n            if (!counter && stylesheet) {\n                stylesheet.parentNode && stylesheet.parentNode.removeChild(stylesheet);\n                stylesheet = null;\n            }\n        },\n    };\n};\n","import { styleHookSingleton } from './hook';\n/**\n * create a Component to add styles on demand\n * - styles are added when first instance is mounted\n * - styles are removed when the last instance is unmounted\n * - changing styles in runtime does nothing unless dynamic is set. But with multiple components that can lead to the undefined behavior\n */\nexport var styleSingleton = function () {\n    var useStyle = styleHookSingleton();\n    var Sheet = function (_a) {\n        var styles = _a.styles, dynamic = _a.dynamic;\n        useStyle(styles, dynamic);\n        return null;\n    };\n    return Sheet;\n};\n","import * as React from 'react';\nimport { stylesheetSingleton } from './singleton';\n/**\n * creates a hook to control style singleton\n * @see {@link styleSingleton} for a safer component version\n * @example\n * ```tsx\n * const useStyle = styleHookSingleton();\n * ///\n * useStyle('body { overflow: hidden}');\n */\nexport var styleHookSingleton = function () {\n    var sheet = stylesheetSingleton();\n    return function (styles, isDynamic) {\n        React.useEffect(function () {\n            sheet.add(styles);\n            return function () {\n                sheet.remove();\n            };\n        }, [styles && isDynamic]);\n    };\n};\n","export var zeroGap = {\n    left: 0,\n    top: 0,\n    right: 0,\n    gap: 0,\n};\nvar parse = function (x) { return parseInt(x || '', 10) || 0; };\nvar getOffset = function (gapMode) {\n    var cs = window.getComputedStyle(document.body);\n    var left = cs[gapMode === 'padding' ? 'paddingLeft' : 'marginLeft'];\n    var top = cs[gapMode === 'padding' ? 'paddingTop' : 'marginTop'];\n    var right = cs[gapMode === 'padding' ? 'paddingRight' : 'marginRight'];\n    return [parse(left), parse(top), parse(right)];\n};\nexport var getGapWidth = function (gapMode) {\n    if (gapMode === void 0) { gapMode = 'margin'; }\n    if (typeof window === 'undefined') {\n        return zeroGap;\n    }\n    var offsets = getOffset(gapMode);\n    var documentWidth = document.documentElement.clientWidth;\n    var windowWidth = window.innerWidth;\n    return {\n        left: offsets[0],\n        top: offsets[1],\n        right: offsets[2],\n        gap: Math.max(0, windowWidth - documentWidth + offsets[2] - offsets[0]),\n    };\n};\n","import * as React from 'react';\nimport { styleSingleton } from 'react-style-singleton';\nimport { fullWidthClassName, zeroRightClassName, noScrollbarsClassName, removedBarSizeVariable } from './constants';\nimport { getGapWidth } from './utils';\nvar Style = styleSingleton();\nexport var lockAttribute = 'data-scroll-locked';\n// important tip - once we measure scrollBar width and remove them\n// we could not repeat this operation\n// thus we are using style-singleton - only the first \"yet correct\" style will be applied.\nvar getStyles = function (_a, allowRelative, gapMode, important) {\n    var left = _a.left, top = _a.top, right = _a.right, gap = _a.gap;\n    if (gapMode === void 0) { gapMode = 'margin'; }\n    return \"\\n  .\".concat(noScrollbarsClassName, \" {\\n   overflow: hidden \").concat(important, \";\\n   padding-right: \").concat(gap, \"px \").concat(important, \";\\n  }\\n  body[\").concat(lockAttribute, \"] {\\n    overflow: hidden \").concat(important, \";\\n    overscroll-behavior: contain;\\n    \").concat([\n        allowRelative && \"position: relative \".concat(important, \";\"),\n        gapMode === 'margin' &&\n            \"\\n    padding-left: \".concat(left, \"px;\\n    padding-top: \").concat(top, \"px;\\n    padding-right: \").concat(right, \"px;\\n    margin-left:0;\\n    margin-top:0;\\n    margin-right: \").concat(gap, \"px \").concat(important, \";\\n    \"),\n        gapMode === 'padding' && \"padding-right: \".concat(gap, \"px \").concat(important, \";\"),\n    ]\n        .filter(Boolean)\n        .join(''), \"\\n  }\\n  \\n  .\").concat(zeroRightClassName, \" {\\n    right: \").concat(gap, \"px \").concat(important, \";\\n  }\\n  \\n  .\").concat(fullWidthClassName, \" {\\n    margin-right: \").concat(gap, \"px \").concat(important, \";\\n  }\\n  \\n  .\").concat(zeroRightClassName, \" .\").concat(zeroRightClassName, \" {\\n    right: 0 \").concat(important, \";\\n  }\\n  \\n  .\").concat(fullWidthClassName, \" .\").concat(fullWidthClassName, \" {\\n    margin-right: 0 \").concat(important, \";\\n  }\\n  \\n  body[\").concat(lockAttribute, \"] {\\n    \").concat(removedBarSizeVariable, \": \").concat(gap, \"px;\\n  }\\n\");\n};\nvar getCurrentUseCounter = function () {\n    var counter = parseInt(document.body.getAttribute(lockAttribute) || '0', 10);\n    return isFinite(counter) ? counter : 0;\n};\nexport var useLockAttribute = function () {\n    React.useEffect(function () {\n        document.body.setAttribute(lockAttribute, (getCurrentUseCounter() + 1).toString());\n        return function () {\n            var newCounter = getCurrentUseCounter() - 1;\n            if (newCounter <= 0) {\n                document.body.removeAttribute(lockAttribute);\n            }\n            else {\n                document.body.setAttribute(lockAttribute, newCounter.toString());\n            }\n        };\n    }, []);\n};\n/**\n * Removes page scrollbar and blocks page scroll when mounted\n */\nexport var RemoveScrollBar = function (_a) {\n    var noRelative = _a.noRelative, noImportant = _a.noImportant, _b = _a.gapMode, gapMode = _b === void 0 ? 'margin' : _b;\n    useLockAttribute();\n    /*\n     gap will be measured on every component mount\n     however it will be used only by the \"first\" invocation\n     due to singleton nature of <Style\n     */\n    var gap = React.useMemo(function () { return getGapWidth(gapMode); }, [gapMode]);\n    return React.createElement(Style, { styles: getStyles(gap, !noRelative, gapMode, !noImportant ? '!important' : '') });\n};\n","var passiveSupported = false;\nif (typeof window !== 'undefined') {\n    try {\n        var options = Object.defineProperty({}, 'passive', {\n            get: function () {\n                passiveSupported = true;\n                return true;\n            },\n        });\n        // @ts-ignore\n        window.addEventListener('test', options, options);\n        // @ts-ignore\n        window.removeEventListener('test', options, options);\n    }\n    catch (err) {\n        passiveSupported = false;\n    }\n}\nexport var nonPassive = passiveSupported ? { passive: false } : false;\n","var alwaysContainsScroll = function (node) {\n    // textarea will always _contain_ scroll inside self. It only can be hidden\n    return node.tagName === 'TEXTAREA';\n};\nvar elementCanBeScrolled = function (node, overflow) {\n    if (!(node instanceof Element)) {\n        return false;\n    }\n    var styles = window.getComputedStyle(node);\n    return (\n    // not-not-scrollable\n    styles[overflow] !== 'hidden' &&\n        // contains scroll inside self\n        !(styles.overflowY === styles.overflowX && !alwaysContainsScroll(node) && styles[overflow] === 'visible'));\n};\nvar elementCouldBeVScrolled = function (node) { return elementCanBeScrolled(node, 'overflowY'); };\nvar elementCouldBeHScrolled = function (node) { return elementCanBeScrolled(node, 'overflowX'); };\nexport var locationCouldBeScrolled = function (axis, node) {\n    var ownerDocument = node.ownerDocument;\n    var current = node;\n    do {\n        // Skip over shadow root\n        if (typeof ShadowRoot !== 'undefined' && current instanceof ShadowRoot) {\n            current = current.host;\n        }\n        var isScrollable = elementCouldBeScrolled(axis, current);\n        if (isScrollable) {\n            var _a = getScrollVariables(axis, current), scrollHeight = _a[1], clientHeight = _a[2];\n            if (scrollHeight > clientHeight) {\n                return true;\n            }\n        }\n        current = current.parentNode;\n    } while (current && current !== ownerDocument.body);\n    return false;\n};\nvar getVScrollVariables = function (_a) {\n    var scrollTop = _a.scrollTop, scrollHeight = _a.scrollHeight, clientHeight = _a.clientHeight;\n    return [\n        scrollTop,\n        scrollHeight,\n        clientHeight,\n    ];\n};\nvar getHScrollVariables = function (_a) {\n    var scrollLeft = _a.scrollLeft, scrollWidth = _a.scrollWidth, clientWidth = _a.clientWidth;\n    return [\n        scrollLeft,\n        scrollWidth,\n        clientWidth,\n    ];\n};\nvar elementCouldBeScrolled = function (axis, node) {\n    return axis === 'v' ? elementCouldBeVScrolled(node) : elementCouldBeHScrolled(node);\n};\nvar getScrollVariables = function (axis, node) {\n    return axis === 'v' ? getVScrollVariables(node) : getHScrollVariables(node);\n};\nvar getDirectionFactor = function (axis, direction) {\n    /**\n     * If the element's direction is rtl (right-to-left), then scrollLeft is 0 when the scrollbar is at its rightmost position,\n     * and then increasingly negative as you scroll towards the end of the content.\n     * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollLeft\n     */\n    return axis === 'h' && direction === 'rtl' ? -1 : 1;\n};\nexport var handleScroll = function (axis, endTarget, event, sourceDelta, noOverscroll) {\n    var directionFactor = getDirectionFactor(axis, window.getComputedStyle(endTarget).direction);\n    var delta = directionFactor * sourceDelta;\n    // find scrollable target\n    var target = event.target;\n    var targetInLock = endTarget.contains(target);\n    var shouldCancelScroll = false;\n    var isDeltaPositive = delta > 0;\n    var availableScroll = 0;\n    var availableScrollTop = 0;\n    do {\n        var _a = getScrollVariables(axis, target), position = _a[0], scroll_1 = _a[1], capacity = _a[2];\n        var elementScroll = scroll_1 - capacity - directionFactor * position;\n        if (position || elementScroll) {\n            if (elementCouldBeScrolled(axis, target)) {\n                availableScroll += elementScroll;\n                availableScrollTop += position;\n            }\n        }\n        if (target instanceof ShadowRoot) {\n            target = target.host;\n        }\n        else {\n            target = target.parentNode;\n        }\n    } while (\n    // portaled content\n    (!targetInLock && target !== document.body) ||\n        // self content\n        (targetInLock && (endTarget.contains(target) || endTarget === target)));\n    // handle epsilon around 0 (non standard zoom levels)\n    if (isDeltaPositive &&\n        ((noOverscroll && Math.abs(availableScroll) < 1) || (!noOverscroll && delta > availableScroll))) {\n        shouldCancelScroll = true;\n    }\n    else if (!isDeltaPositive &&\n        ((noOverscroll && Math.abs(availableScrollTop) < 1) || (!noOverscroll && -delta > availableScrollTop))) {\n        shouldCancelScroll = true;\n    }\n    return shouldCancelScroll;\n};\n","import { __spreadArray } from \"tslib\";\nimport * as React from 'react';\nimport { RemoveScrollBar } from 'react-remove-scroll-bar';\nimport { styleSingleton } from 'react-style-singleton';\nimport { nonPassive } from './aggresiveCapture';\nimport { handleScroll, locationCouldBeScrolled } from './handleScroll';\nexport var getTouchXY = function (event) {\n    return 'changedTouches' in event ? [event.changedTouches[0].clientX, event.changedTouches[0].clientY] : [0, 0];\n};\nexport var getDeltaXY = function (event) { return [event.deltaX, event.deltaY]; };\nvar extractRef = function (ref) {\n    return ref && 'current' in ref ? ref.current : ref;\n};\nvar deltaCompare = function (x, y) { return x[0] === y[0] && x[1] === y[1]; };\nvar generateStyle = function (id) { return \"\\n  .block-interactivity-\".concat(id, \" {pointer-events: none;}\\n  .allow-interactivity-\").concat(id, \" {pointer-events: all;}\\n\"); };\nvar idCounter = 0;\nvar lockStack = [];\nexport function RemoveScrollSideCar(props) {\n    var shouldPreventQueue = React.useRef([]);\n    var touchStartRef = React.useRef([0, 0]);\n    var activeAxis = React.useRef();\n    var id = React.useState(idCounter++)[0];\n    var Style = React.useState(styleSingleton)[0];\n    var lastProps = React.useRef(props);\n    React.useEffect(function () {\n        lastProps.current = props;\n    }, [props]);\n    React.useEffect(function () {\n        if (props.inert) {\n            document.body.classList.add(\"block-interactivity-\".concat(id));\n            var allow_1 = __spreadArray([props.lockRef.current], (props.shards || []).map(extractRef), true).filter(Boolean);\n            allow_1.forEach(function (el) { return el.classList.add(\"allow-interactivity-\".concat(id)); });\n            return function () {\n                document.body.classList.remove(\"block-interactivity-\".concat(id));\n                allow_1.forEach(function (el) { return el.classList.remove(\"allow-interactivity-\".concat(id)); });\n            };\n        }\n        return;\n    }, [props.inert, props.lockRef.current, props.shards]);\n    var shouldCancelEvent = React.useCallback(function (event, parent) {\n        if (('touches' in event && event.touches.length === 2) || (event.type === 'wheel' && event.ctrlKey)) {\n            return !lastProps.current.allowPinchZoom;\n        }\n        var touch = getTouchXY(event);\n        var touchStart = touchStartRef.current;\n        var deltaX = 'deltaX' in event ? event.deltaX : touchStart[0] - touch[0];\n        var deltaY = 'deltaY' in event ? event.deltaY : touchStart[1] - touch[1];\n        var currentAxis;\n        var target = event.target;\n        var moveDirection = Math.abs(deltaX) > Math.abs(deltaY) ? 'h' : 'v';\n        // allow horizontal touch move on Range inputs. They will not cause any scroll\n        if ('touches' in event && moveDirection === 'h' && target.type === 'range') {\n            return false;\n        }\n        var canBeScrolledInMainDirection = locationCouldBeScrolled(moveDirection, target);\n        if (!canBeScrolledInMainDirection) {\n            return true;\n        }\n        if (canBeScrolledInMainDirection) {\n            currentAxis = moveDirection;\n        }\n        else {\n            currentAxis = moveDirection === 'v' ? 'h' : 'v';\n            canBeScrolledInMainDirection = locationCouldBeScrolled(moveDirection, target);\n            // other axis might be not scrollable\n        }\n        if (!canBeScrolledInMainDirection) {\n            return false;\n        }\n        if (!activeAxis.current && 'changedTouches' in event && (deltaX || deltaY)) {\n            activeAxis.current = currentAxis;\n        }\n        if (!currentAxis) {\n            return true;\n        }\n        var cancelingAxis = activeAxis.current || currentAxis;\n        return handleScroll(cancelingAxis, parent, event, cancelingAxis === 'h' ? deltaX : deltaY, true);\n    }, []);\n    var shouldPrevent = React.useCallback(function (_event) {\n        var event = _event;\n        if (!lockStack.length || lockStack[lockStack.length - 1] !== Style) {\n            // not the last active\n            return;\n        }\n        var delta = 'deltaY' in event ? getDeltaXY(event) : getTouchXY(event);\n        var sourceEvent = shouldPreventQueue.current.filter(function (e) { return e.name === event.type && (e.target === event.target || event.target === e.shadowParent) && deltaCompare(e.delta, delta); })[0];\n        // self event, and should be canceled\n        if (sourceEvent && sourceEvent.should) {\n            if (event.cancelable) {\n                event.preventDefault();\n            }\n            return;\n        }\n        // outside or shard event\n        if (!sourceEvent) {\n            var shardNodes = (lastProps.current.shards || [])\n                .map(extractRef)\n                .filter(Boolean)\n                .filter(function (node) { return node.contains(event.target); });\n            var shouldStop = shardNodes.length > 0 ? shouldCancelEvent(event, shardNodes[0]) : !lastProps.current.noIsolation;\n            if (shouldStop) {\n                if (event.cancelable) {\n                    event.preventDefault();\n                }\n            }\n        }\n    }, []);\n    var shouldCancel = React.useCallback(function (name, delta, target, should) {\n        var event = { name: name, delta: delta, target: target, should: should, shadowParent: getOutermostShadowParent(target) };\n        shouldPreventQueue.current.push(event);\n        setTimeout(function () {\n            shouldPreventQueue.current = shouldPreventQueue.current.filter(function (e) { return e !== event; });\n        }, 1);\n    }, []);\n    var scrollTouchStart = React.useCallback(function (event) {\n        touchStartRef.current = getTouchXY(event);\n        activeAxis.current = undefined;\n    }, []);\n    var scrollWheel = React.useCallback(function (event) {\n        shouldCancel(event.type, getDeltaXY(event), event.target, shouldCancelEvent(event, props.lockRef.current));\n    }, []);\n    var scrollTouchMove = React.useCallback(function (event) {\n        shouldCancel(event.type, getTouchXY(event), event.target, shouldCancelEvent(event, props.lockRef.current));\n    }, []);\n    React.useEffect(function () {\n        lockStack.push(Style);\n        props.setCallbacks({\n            onScrollCapture: scrollWheel,\n            onWheelCapture: scrollWheel,\n            onTouchMoveCapture: scrollTouchMove,\n        });\n        document.addEventListener('wheel', shouldPrevent, nonPassive);\n        document.addEventListener('touchmove', shouldPrevent, nonPassive);\n        document.addEventListener('touchstart', scrollTouchStart, nonPassive);\n        return function () {\n            lockStack = lockStack.filter(function (inst) { return inst !== Style; });\n            document.removeEventListener('wheel', shouldPrevent, nonPassive);\n            document.removeEventListener('touchmove', shouldPrevent, nonPassive);\n            document.removeEventListener('touchstart', scrollTouchStart, nonPassive);\n        };\n    }, []);\n    var removeScrollBar = props.removeScrollBar, inert = props.inert;\n    return (React.createElement(React.Fragment, null,\n        inert ? React.createElement(Style, { styles: generateStyle(id) }) : null,\n        removeScrollBar ? React.createElement(RemoveScrollBar, { gapMode: props.gapMode }) : null));\n}\nfunction getOutermostShadowParent(node) {\n    var shadowParent = null;\n    while (node !== null) {\n        if (node instanceof ShadowRoot) {\n            shadowParent = node.host;\n            node = node.host;\n        }\n        node = node.parentNode;\n    }\n    return shadowParent;\n}\n","import { exportSidecar } from 'use-sidecar';\nimport { RemoveScrollSideCar } from './SideEffect';\nimport { effectCar } from './medium';\nexport default exportSidecar(effectCar, RemoveScrollSideCar);\n","import { __assign } from \"tslib\";\nimport * as React from 'react';\nimport { RemoveScroll } from './UI';\nimport SideCar from './sidecar';\nvar ReactRemoveScroll = React.forwardRef(function (props, ref) { return (React.createElement(RemoveScroll, __assign({}, props, { ref: ref, sideCar: SideCar }))); });\nReactRemoveScroll.classNames = RemoveScroll.classNames;\nexport default ReactRemoveScroll;\n","import { useState } from 'react';\nimport { useFocusReturn, useId, useWindowEvent } from '@mantine/hooks';\nimport { TransitionOverride } from '../Transition';\nimport { useLockScroll } from './use-lock-scroll';\n\ninterface UseModalInput {\n  opened: boolean;\n  onClose: () => void;\n  id: string | undefined;\n  transitionProps: TransitionOverride | undefined;\n  trapFocus: boolean | undefined;\n  closeOnEscape: boolean | undefined;\n  returnFocus: boolean | undefined;\n}\n\nexport function useModal({\n  id,\n  transitionProps,\n  opened,\n  trapFocus,\n  closeOnEscape,\n  onClose,\n  returnFocus,\n}: UseModalInput) {\n  const _id = useId(id);\n  const [titleMounted, setTitleMounted] = useState(false);\n  const [bodyMounted, setBodyMounted] = useState(false);\n\n  const transitionDuration =\n    typeof transitionProps?.duration === 'number' ? transitionProps?.duration : 200;\n\n  const shouldLockScroll = useLockScroll({ opened, transitionDuration });\n\n  useWindowEvent(\n    'keydown',\n    (event) => {\n      if (event.key === 'Escape' && closeOnEscape && opened) {\n        const shouldTrigger =\n          (event.target as HTMLElement)?.getAttribute('data-mantine-stop-propagation') !== 'true';\n        shouldTrigger && onClose();\n      }\n    },\n    { capture: true }\n  );\n\n  useFocusReturn({ opened, shouldReturnFocus: trapFocus && returnFocus });\n\n  return {\n    _id,\n    titleMounted,\n    bodyMounted,\n    shouldLockScroll,\n    setTitleMounted,\n    setBodyMounted,\n  };\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { useReducedMotion } from '@mantine/hooks';\n\ninterface UseScrollLock {\n  opened: boolean;\n  transitionDuration: number;\n}\n\nexport function useLockScroll({ opened, transitionDuration }: UseScrollLock) {\n  const [shouldLockScroll, setShouldLockScroll] = useState(opened);\n  const timeout = useRef<number>(-1);\n  const reduceMotion = useReducedMotion();\n  const _transitionDuration = reduceMotion ? 0 : transitionDuration;\n\n  useEffect(() => {\n    if (opened) {\n      setShouldLockScroll(true);\n      window.clearTimeout(timeout.current);\n    } else if (_transitionDuration === 0) {\n      setShouldLockScroll(false);\n    } else {\n      timeout.current = window.setTimeout(() => setShouldLockScroll(false), _transitionDuration);\n    }\n\n    return () => window.clearTimeout(timeout.current);\n  }, [opened, _transitionDuration]);\n\n  return shouldLockScroll;\n}\n","import { useEffect } from 'react';\n\nexport function useWindowEvent<K extends string>(\n  type: K,\n  listener: K extends keyof WindowEventMap\n    ? (this: Window, ev: WindowEventMap[K]) => void\n    : (this: Window, ev: CustomEvent) => void,\n  options?: boolean | AddEventListenerOptions\n) {\n  useEffect(() => {\n    window.addEventListener(type as any, listener, options);\n    return () => window.removeEventListener(type as any, listener, options);\n  }, [type, listener]);\n}\n","import { useRef } from 'react';\nimport { useDidUpdate } from '../use-did-update/use-did-update';\n\ninterface UseFocusReturn {\n  opened: boolean;\n  shouldReturnFocus?: boolean;\n}\n\n/** Returns focus to last active element, used in Modal and Drawer */\nexport function useFocusReturn({ opened, shouldReturnFocus = true }: UseFocusReturn) {\n  const lastActiveElement = useRef<HTMLElement>(null);\n  const returnFocus = () => {\n    if (\n      lastActiveElement.current &&\n      'focus' in lastActiveElement.current &&\n      typeof lastActiveElement.current.focus === 'function'\n    ) {\n      lastActiveElement.current?.focus({ preventScroll: true });\n    }\n  };\n\n  useDidUpdate(() => {\n    let timeout = -1;\n\n    const clearFocusTimeout = (event: KeyboardEvent) => {\n      if (event.key === 'Tab') {\n        window.clearTimeout(timeout);\n      }\n    };\n\n    document.addEventListener('keydown', clearFocusTimeout);\n\n    if (opened) {\n      lastActiveElement.current = document.activeElement as HTMLElement;\n    } else if (shouldReturnFocus) {\n      timeout = window.setTimeout(returnFocus, 10);\n    }\n\n    return () => {\n      window.clearTimeout(timeout);\n      document.removeEventListener('keydown', clearFocusTimeout);\n    };\n  }, [opened, shouldReturnFocus]);\n\n  return returnFocus;\n}\n","import { forwardRef } from 'react';\nimport { RemoveScroll } from 'react-remove-scroll';\nimport {\n  Box,\n  BoxProps,\n  ElementProps,\n  getDefaultZIndex,\n  getShadow,\n  getSpacing,\n  MantineShadow,\n  MantineSize,\n  MantineSpacing,\n} from '../../core';\nimport { OptionalPortal, PortalProps } from '../Portal';\nimport { TransitionOverride } from '../Transition';\nimport { ModalBaseProvider } from './ModalBase.context';\nimport { useModal } from './use-modal';\n\ntype RemoveScrollProps = Omit<React.ComponentProps<typeof RemoveScroll>, 'children'>;\n\nexport interface ModalBaseProps extends BoxProps, ElementProps<'div', 'title'> {\n  unstyled?: boolean;\n\n  /** If set modal/drawer will not be unmounted from the DOM when it is hidden, `display: none` styles will be added instead, `false` by default */\n  keepMounted?: boolean;\n\n  /** Determines whether modal/drawer is opened */\n  opened: boolean;\n\n  /** Called when modal/drawer is closed */\n  onClose: () => void;\n\n  /** Id used to connect modal/drawer with body and title */\n  id?: string;\n\n  /** Determines whether scroll should be locked when `opened={true}`, `true` by default */\n  lockScroll?: boolean;\n\n  /** Determines whether focus should be trapped, `true` by default */\n  trapFocus?: boolean;\n\n  /** Determines whether the component should be rendered inside `Portal`, `true` by default */\n  withinPortal?: boolean;\n\n  /** Props passed down to the Portal component when `withinPortal` is set */\n  portalProps?: Omit<PortalProps, 'children'>;\n\n  /** Modal/drawer content */\n  children?: React.ReactNode;\n\n  /** Determines whether the modal/drawer should be closed when user clicks on the overlay, `true` by default */\n  closeOnClickOutside?: boolean;\n\n  /** Props added to the `Transition` component that used to animate overlay and body, use to configure duration and animation type, `{ duration: 200, transition: 'fade-down' }` by default */\n  transitionProps?: TransitionOverride;\n\n  /** Called when exit transition ends */\n  onExitTransitionEnd?: () => void;\n\n  /** Called when enter transition ends */\n  onEnterTransitionEnd?: () => void;\n\n  /** Determines whether `onClose` should be called when user presses the escape key, `true` by default */\n  closeOnEscape?: boolean;\n\n  /** Determines whether focus should be returned to the last active element when `onClose` is called, `true` by default */\n  returnFocus?: boolean;\n\n  /** `z-index` CSS property of the root element, `200` by default */\n  zIndex?: string | number;\n\n  /** Key of `theme.shadows` or any valid CSS box-shadow value, 'xl' by default */\n  shadow?: MantineShadow;\n\n  /** Key of `theme.spacing` or any valid CSS value to set content, header and footer padding, `'md'` by default */\n  padding?: MantineSpacing;\n\n  /** Controls width of the content area, `'md'` by default */\n  size?: MantineSize | (string & {}) | number;\n\n  /** Props passed down to react-remove-scroll, can be used to customize scroll lock behavior */\n  removeScrollProps?: RemoveScrollProps;\n}\n\nexport const ModalBase = forwardRef<HTMLDivElement, ModalBaseProps>(\n  (\n    {\n      keepMounted,\n      opened,\n      onClose,\n      id,\n      transitionProps,\n      onExitTransitionEnd,\n      onEnterTransitionEnd,\n      trapFocus,\n      closeOnEscape,\n      returnFocus,\n      closeOnClickOutside,\n      withinPortal,\n      portalProps,\n      lockScroll,\n      children,\n      zIndex,\n      shadow,\n      padding,\n      __vars,\n      unstyled,\n      removeScrollProps,\n      ...others\n    },\n    ref\n  ) => {\n    const { _id, titleMounted, bodyMounted, shouldLockScroll, setTitleMounted, setBodyMounted } =\n      useModal({ id, transitionProps, opened, trapFocus, closeOnEscape, onClose, returnFocus });\n\n    const { key: removeScrollKey, ...otherRemoveScrollProps } = removeScrollProps || {};\n\n    return (\n      <OptionalPortal {...portalProps} withinPortal={withinPortal}>\n        <ModalBaseProvider\n          value={{\n            opened,\n            onClose,\n            closeOnClickOutside,\n            onExitTransitionEnd,\n            onEnterTransitionEnd,\n            transitionProps: { ...transitionProps, keepMounted },\n            getTitleId: () => `${_id}-title`,\n            getBodyId: () => `${_id}-body`,\n            titleMounted,\n            bodyMounted,\n            setTitleMounted,\n            setBodyMounted,\n            trapFocus,\n            closeOnEscape,\n            zIndex,\n            unstyled,\n          }}\n        >\n          <RemoveScroll\n            enabled={shouldLockScroll && lockScroll}\n            key={removeScrollKey}\n            {...otherRemoveScrollProps}\n          >\n            <Box\n              ref={ref}\n              {...others}\n              __vars={{\n                ...__vars,\n                '--mb-z-index': (zIndex || getDefaultZIndex('modal')).toString(),\n                '--mb-shadow': getShadow(shadow),\n                '--mb-padding': getSpacing(padding),\n              }}\n            >\n              {children}\n            </Box>\n          </RemoveScroll>\n        </ModalBaseProvider>\n      </OptionalPortal>\n    );\n  }\n);\n\nModalBase.displayName = '@mantine/core/ModalBase';\n","import {\n  createVarsResolver,\n  factory,\n  Factory,\n  getDefaultZIndex,\n  getRadius,\n  getSize,\n  MantineRadius,\n  rem,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../core';\nimport { ModalBase, ModalBaseProps, ModalBaseStylesNames } from '../ModalBase';\nimport { ModalProvider, ScrollAreaComponent } from './Modal.context';\nimport classes from './Modal.module.css';\n\nexport type ModalRootStylesNames = ModalBaseStylesNames;\nexport type ModalRootCssVariables = {\n  root: '--modal-radius' | '--modal-size' | '--modal-y-offset' | '--modal-x-offset';\n};\n\nexport interface ModalRootProps extends StylesApiProps<ModalRootFactory>, ModalBaseProps {\n  __staticSelector?: string;\n\n  /** Top/bottom modal offset, `5dvh` by default */\n  yOffset?: React.CSSProperties['marginTop'];\n\n  /** Left/right modal offset, `5vw` by default */\n  xOffset?: React.CSSProperties['marginLeft'];\n\n  /** Scroll area component, native `div` element by default */\n  scrollAreaComponent?: ScrollAreaComponent;\n\n  /** Key of `theme.radius` or any valid CSS value to set `border-radius`, `theme.defaultRadius` by default */\n  radius?: MantineRadius;\n\n  /** Determines whether the modal should be centered vertically, `false` by default */\n  centered?: boolean;\n\n  /** Determines whether the modal should take the entire screen, `false` by default */\n  fullScreen?: boolean;\n}\n\nexport type ModalRootFactory = Factory<{\n  props: ModalRootProps;\n  ref: HTMLDivElement;\n  stylesNames: ModalRootStylesNames;\n  vars: ModalRootCssVariables;\n  compound: true;\n}>;\n\nconst defaultProps: Partial<ModalRootProps> = {\n  __staticSelector: 'Modal',\n  closeOnClickOutside: true,\n  withinPortal: true,\n  lockScroll: true,\n  trapFocus: true,\n  returnFocus: true,\n  closeOnEscape: true,\n  keepMounted: false,\n  zIndex: getDefaultZIndex('modal'),\n  transitionProps: { duration: 200, transition: 'fade-down' },\n  yOffset: '5dvh',\n};\n\nconst varsResolver = createVarsResolver<ModalRootFactory>(\n  (_, { radius, size, yOffset, xOffset }) => ({\n    root: {\n      '--modal-radius': radius === undefined ? undefined : getRadius(radius),\n      '--modal-size': getSize(size, 'modal-size'),\n      '--modal-y-offset': rem(yOffset),\n      '--modal-x-offset': rem(xOffset),\n    },\n  })\n);\n\nexport const ModalRoot = factory<ModalRootFactory>((_props, ref) => {\n  const props = useProps('ModalRoot', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    yOffset,\n    scrollAreaComponent,\n    radius,\n    fullScreen,\n    centered,\n    xOffset,\n    __staticSelector,\n    ...others\n  } = props;\n\n  const getStyles = useStyles<ModalRootFactory>({\n    name: __staticSelector!,\n    classes,\n    props,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n  });\n\n  return (\n    <ModalProvider value={{ yOffset, scrollAreaComponent, getStyles, fullScreen }}>\n      <ModalBase\n        ref={ref}\n        {...getStyles('root')}\n        data-full-screen={fullScreen || undefined}\n        data-centered={centered || undefined}\n        unstyled={unstyled}\n        {...others}\n      />\n    </ModalProvider>\n  );\n});\n\nModalRoot.classes = classes;\nModalRoot.displayName = '@mantine/core/ModalRoot';\n","import { useState } from 'react';\nimport { createOptionalContext, getDefaultZIndex } from '../../core';\n\ninterface ModalStackContext {\n  stack: string[];\n  addModal: (id: string, zIndex: number | string) => void;\n  removeModal: (id: string) => void;\n  getZIndex: (id: string) => string;\n  currentId: string;\n  maxZIndex: string | number;\n}\n\nconst [ModalStackProvider, useModalStackContext] = createOptionalContext<ModalStackContext>();\n\nexport { useModalStackContext };\n\nexport interface ModalStackProps {\n  children: React.ReactNode;\n}\n\nexport function ModalStack({ children }: ModalStackProps) {\n  const [stack, setStack] = useState<string[]>([]);\n  const [maxZIndex, setMaxZIndex] = useState<number | string>(getDefaultZIndex('modal'));\n\n  return (\n    <ModalStackProvider\n      value={{\n        stack,\n        addModal: (id, zIndex) => {\n          setStack((current) => [...new Set([...current, id])]);\n          setMaxZIndex((current) =>\n            typeof zIndex === 'number' && typeof current === 'number'\n              ? Math.max(current, zIndex)\n              : current\n          );\n        },\n        removeModal: (id) => setStack((current) => current.filter((currentId) => currentId !== id)),\n        getZIndex: (id) => `calc(${maxZIndex} + ${stack.indexOf(id)} + 1)`,\n        currentId: stack[stack.length - 1],\n        maxZIndex,\n      }}\n    >\n      {children}\n    </ModalStackProvider>\n  );\n}\n\nModalStack.displayName = '@mantine/core/ModalStack';\n","import { forwardRef } from 'react';\nimport cx from 'clsx';\nimport { Box, BoxProps, ElementProps } from '../../core';\nimport { useModalBaseContext } from './ModalBase.context';\nimport { useModalTitle } from './use-modal-title-id';\nimport classes from './ModalBase.module.css';\n\nexport interface ModalBaseTitleProps extends BoxProps, ElementProps<'h2'> {}\n\nexport const ModalBaseTitle = forwardRef<HTMLHeadingElement, ModalBaseTitleProps>(\n  ({ className, ...others }, ref) => {\n    const id = useModalTitle();\n    const ctx = useModalBaseContext();\n    return (\n      <Box\n        component=\"h2\"\n        ref={ref}\n        className={cx({ [classes.title]: !ctx.unstyled }, className)}\n        {...others}\n        id={id}\n      />\n    );\n  }\n);\n\nModalBaseTitle.displayName = '@mantine/core/ModalBaseTitle';\n","import { useEffect } from 'react';\nimport { useModalBaseContext } from './ModalBase.context';\n\nexport function useModalTitle() {\n  const ctx = useModalBaseContext();\n\n  useEffect(() => {\n    ctx.setTitleMounted(true);\n    return () => ctx.setTitleMounted(false);\n  }, []);\n\n  return ctx.getTitleId();\n}\n","import { CompoundStylesApiProps, factory, Factory, useProps } from '../../core';\nimport { ModalBaseTitle, ModalBaseTitleProps } from '../ModalBase';\nimport { useModalContext } from './Modal.context';\nimport classes from './Modal.module.css';\n\nexport type ModalTitleStylesNames = 'title';\n\nexport interface ModalTitleProps\n  extends ModalBaseTitleProps,\n    CompoundStylesApiProps<ModalTitleFactory> {}\n\nexport type ModalTitleFactory = Factory<{\n  props: ModalTitleProps;\n  ref: HTMLHeadingElement;\n  stylesNames: ModalTitleStylesNames;\n  compound: true;\n}>;\n\nconst defaultProps: Partial<ModalTitleProps> = {};\n\nexport const ModalTitle = factory<ModalTitleFactory>((_props, ref) => {\n  const props = useProps('ModalTitle', defaultProps, _props);\n  const { classNames, className, style, styles, vars, ...others } = props;\n\n  const ctx = useModalContext();\n\n  return (\n    <ModalBaseTitle\n      ref={ref}\n      {...ctx.getStyles('title', { classNames, style, styles, className })}\n      {...others}\n    />\n  );\n});\n\nModalTitle.classes = classes;\nModalTitle.displayName = '@mantine/core/ModalTitle';\n","import { useEffect } from 'react';\nimport { factory, Factory, getDefaultZIndex, useProps } from '../../core';\nimport { ModalBaseCloseButtonProps, ModalBaseOverlayProps } from '../ModalBase';\nimport { ModalBody } from './ModalBody';\nimport { ModalCloseButton } from './ModalCloseButton';\nimport { ModalContent } from './ModalContent';\nimport { ModalHeader } from './ModalHeader';\nimport { ModalOverlay } from './ModalOverlay';\nimport {\n  ModalRoot,\n  ModalRootCssVariables,\n  ModalRootProps,\n  ModalRootStylesNames,\n} from './ModalRoot';\nimport { ModalStack, useModalStackContext } from './ModalStack';\nimport { ModalTitle } from './ModalTitle';\nimport classes from './Modal.module.css';\n\nexport type ModalStylesNames = ModalRootStylesNames;\nexport type ModalCssVariables = ModalRootCssVariables;\n\nexport interface ModalProps extends ModalRootProps {\n  __staticSelector?: string;\n\n  /** Modal title */\n  title?: React.ReactNode;\n\n  /** Determines whether the overlay should be rendered, `true` by default */\n  withOverlay?: boolean;\n\n  /** Props passed down to the `Overlay` component, use to configure opacity, `background-color`, styles and other properties */\n  overlayProps?: ModalBaseOverlayProps;\n\n  /** Modal content */\n  children?: React.ReactNode;\n\n  /** Determines whether the close button should be rendered, `true` by default */\n  withCloseButton?: boolean;\n\n  /** Props passed down to the close button */\n  closeButtonProps?: ModalBaseCloseButtonProps;\n\n  /** Id of the modal in the `Modal.Stack` */\n  stackId?: string;\n}\n\nexport type ModalFactory = Factory<{\n  props: ModalProps;\n  ref: HTMLDivElement;\n  stylesNames: ModalStylesNames;\n  vars: ModalCssVariables;\n  staticComponents: {\n    Root: typeof ModalRoot;\n    Overlay: typeof ModalOverlay;\n    Content: typeof ModalContent;\n    Body: typeof ModalBody;\n    Header: typeof ModalHeader;\n    Title: typeof ModalTitle;\n    CloseButton: typeof ModalCloseButton;\n    Stack: typeof ModalStack;\n  };\n}>;\n\nconst defaultProps: Partial<ModalProps> = {\n  closeOnClickOutside: true,\n  withinPortal: true,\n  lockScroll: true,\n  trapFocus: true,\n  returnFocus: true,\n  closeOnEscape: true,\n  keepMounted: false,\n  zIndex: getDefaultZIndex('modal'),\n  transitionProps: { duration: 200, transition: 'fade-down' },\n  withOverlay: true,\n  withCloseButton: true,\n};\n\nexport const Modal = factory<ModalFactory>((_props, ref) => {\n  const {\n    title,\n    withOverlay,\n    overlayProps,\n    withCloseButton,\n    closeButtonProps,\n    children,\n    radius,\n    opened,\n    stackId,\n    zIndex,\n    ...others\n  } = useProps('Modal', defaultProps, _props);\n  const ctx = useModalStackContext();\n  const hasHeader = !!title || withCloseButton;\n  const stackProps =\n    ctx && stackId\n      ? {\n          closeOnEscape: ctx.currentId === stackId,\n          trapFocus: ctx.currentId === stackId,\n          zIndex: ctx.getZIndex(stackId),\n        }\n      : {};\n\n  const overlayVisible =\n    withOverlay === false ? false : stackId && ctx ? ctx.currentId === stackId : opened;\n\n  useEffect(() => {\n    if (ctx && stackId) {\n      opened\n        ? ctx.addModal(stackId, zIndex || getDefaultZIndex('modal'))\n        : ctx.removeModal(stackId);\n    }\n  }, [opened, stackId, zIndex]);\n\n  return (\n    <ModalRoot\n      ref={ref}\n      radius={radius}\n      opened={opened}\n      zIndex={ctx && stackId ? ctx.getZIndex(stackId) : zIndex}\n      {...others}\n      {...stackProps}\n    >\n      {withOverlay && (\n        <ModalOverlay\n          visible={overlayVisible}\n          transitionProps={ctx && stackId ? { duration: 0 } : undefined}\n          {...overlayProps}\n        />\n      )}\n      <ModalContent\n        radius={radius}\n        __hidden={ctx && stackId && opened ? stackId !== ctx.currentId : false}\n      >\n        {hasHeader && (\n          <ModalHeader>\n            {title && <ModalTitle>{title}</ModalTitle>}\n            {withCloseButton && <ModalCloseButton {...closeButtonProps} />}\n          </ModalHeader>\n        )}\n\n        <ModalBody>{children}</ModalBody>\n      </ModalContent>\n    </ModalRoot>\n  );\n});\n\nModal.classes = classes;\nModal.displayName = '@mantine/core/Modal';\nModal.Root = ModalRoot;\nModal.Overlay = ModalOverlay;\nModal.Content = ModalContent;\nModal.Body = ModalBody;\nModal.Header = ModalHeader;\nModal.Title = ModalTitle;\nModal.CloseButton = ModalCloseButton;\nModal.Stack = ModalStack;\n","import { NotificationProps } from '@mantine/core';\nimport { randomId } from '@mantine/hooks';\nimport { createStore, MantineStore, useStore } from '@mantine/store';\n\nexport type NotificationPosition =\n  | 'top-left'\n  | 'top-right'\n  | 'top-center'\n  | 'bottom-left'\n  | 'bottom-right'\n  | 'bottom-center';\n\nexport interface NotificationData\n  extends Omit<NotificationProps, 'onClose'>,\n    Record<`data-${string}`, any> {\n  /** Notification id, can be used to close or update notification */\n  id?: string;\n\n  /** Position of the notification, if not set, the position is determined based on `position` prop on Notifications component */\n  position?: NotificationPosition;\n\n  /** Notification message, required for all notifications */\n  message: React.ReactNode;\n\n  /** Determines whether notification should be closed automatically,\n   *  number is auto close timeout in ms, overrides `autoClose` from `Notifications`\n   * */\n  autoClose?: boolean | number;\n\n  /** Called when notification closes */\n  onClose?: (props: NotificationData) => void;\n\n  /** Called when notification opens */\n  onOpen?: (props: NotificationData) => void;\n}\n\nexport interface NotificationsState {\n  notifications: NotificationData[];\n  queue: NotificationData[];\n  defaultPosition: NotificationPosition;\n  limit: number;\n}\n\nexport type NotificationsStore = MantineStore<NotificationsState>;\n\nfunction getDistributedNotifications(\n  data: NotificationData[],\n  defaultPosition: NotificationPosition,\n  limit: number\n) {\n  const queue: NotificationData[] = [];\n  const notifications: NotificationData[] = [];\n  const count: Record<string, number> = {};\n\n  for (const item of data) {\n    const position = item.position || defaultPosition;\n    count[position] = count[position] || 0;\n    count[position] += 1;\n\n    if (count[position] <= limit) {\n      notifications.push(item);\n    } else {\n      queue.push(item);\n    }\n  }\n\n  return { notifications, queue };\n}\n\nexport const createNotificationsStore = () =>\n  createStore<NotificationsState>({\n    notifications: [],\n    queue: [],\n    defaultPosition: 'bottom-right',\n    limit: 5,\n  });\n\nexport const notificationsStore = createNotificationsStore();\nexport const useNotifications = (store: NotificationsStore = notificationsStore) => useStore(store);\n\nexport function updateNotificationsState(\n  store: NotificationsStore,\n  update: (notifications: NotificationData[]) => NotificationData[]\n) {\n  const state = store.getState();\n  const notifications = update([...state.notifications, ...state.queue]);\n  const updated = getDistributedNotifications(notifications, state.defaultPosition, state.limit);\n\n  store.setState({\n    notifications: updated.notifications,\n    queue: updated.queue,\n    limit: state.limit,\n    defaultPosition: state.defaultPosition,\n  });\n}\n\nexport function showNotification(\n  notification: NotificationData,\n  store: NotificationsStore = notificationsStore\n) {\n  const id = notification.id || randomId();\n\n  updateNotificationsState(store, (notifications) => {\n    if (notification.id && notifications.some((n) => n.id === notification.id)) {\n      return notifications;\n    }\n\n    return [...notifications, { ...notification, id }];\n  });\n\n  return id;\n}\n\nexport function hideNotification(id: string, store: NotificationsStore = notificationsStore) {\n  updateNotificationsState(store, (notifications) =>\n    notifications.filter((notification) => {\n      if (notification.id === id) {\n        notification.onClose?.(notification);\n        return false;\n      }\n\n      return true;\n    })\n  );\n\n  return id;\n}\n\nexport function updateNotification(\n  notification: NotificationData,\n  store: NotificationsStore = notificationsStore\n) {\n  updateNotificationsState(store, (notifications) =>\n    notifications.map((item) => {\n      if (item.id === notification.id) {\n        return { ...item, ...notification };\n      }\n\n      return item;\n    })\n  );\n\n  return notification.id;\n}\n\nexport function cleanNotifications(store: NotificationsStore = notificationsStore) {\n  updateNotificationsState(store, () => []);\n}\n\nexport function cleanNotificationsQueue(store: NotificationsStore = notificationsStore) {\n  updateNotificationsState(store, (notifications) =>\n    notifications.slice(0, store.getState().limit)\n  );\n}\n\nexport const notifications = {\n  show: showNotification,\n  hide: hideNotification,\n  update: updateNotification,\n  clean: cleanNotifications,\n  cleanQueue: cleanNotificationsQueue,\n  updateState: updateNotificationsState,\n} as const;\n","import { useSyncExternalStore } from 'react';\n\nexport type MantineStoreSubscriber<Value> = (value: Value) => void;\ntype SetStateCallback<Value> = (value: Value) => Value;\n\nexport interface MantineStore<Value> {\n  getState: () => Value;\n  setState: (value: Value | SetStateCallback<Value>) => void;\n  updateState: (value: Value | SetStateCallback<Value>) => void;\n  initialize: (value: Value) => void;\n  subscribe: (callback: MantineStoreSubscriber<Value>) => () => void;\n}\n\nexport type MantineStoreValue<Store extends MantineStore<any>> = ReturnType<Store['getState']>;\n\nexport function createStore<Value extends Record<string, any>>(\n  initialState: Value\n): MantineStore<Value> {\n  let state = initialState;\n  let initialized = false;\n  const listeners = new Set<MantineStoreSubscriber<Value>>();\n\n  return {\n    getState() {\n      return state;\n    },\n\n    updateState(value) {\n      state = typeof value === 'function' ? value(state) : value;\n    },\n\n    setState(value) {\n      this.updateState(value);\n      listeners.forEach((listener) => listener(state));\n    },\n\n    initialize(value) {\n      if (!initialized) {\n        state = value;\n        initialized = true;\n      }\n    },\n\n    subscribe(callback) {\n      listeners.add(callback);\n      return () => listeners.delete(callback);\n    },\n  };\n}\n\nexport function useStore<Store extends MantineStore<any>>(store: Store) {\n  return useSyncExternalStore<MantineStoreValue<Store>>(\n    store.subscribe,\n    () => store.getState(),\n    () => store.getState()\n  );\n}\n","function _objectWithoutPropertiesLoose(r, e) {\n  if (null == r) return {};\n  var t = {};\n  for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n    if (e.indexOf(n) >= 0) continue;\n    t[n] = r[n];\n  }\n  return t;\n}\nexport { _objectWithoutPropertiesLoose as default };","function _setPrototypeOf(t, e) {\n  return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {\n    return t.__proto__ = e, t;\n  }, _setPrototypeOf(t, e);\n}\nexport { _setPrototypeOf as default };","import setPrototypeOf from \"./setPrototypeOf.js\";\nfunction _inheritsLoose(t, o) {\n  t.prototype = Object.create(o.prototype), t.prototype.constructor = t, setPrototypeOf(t, o);\n}\nexport { _inheritsLoose as default };","export default {\n  disabled: false\n};","import React from 'react';\nexport default React.createContext(null);","export var forceReflow = function forceReflow(node) {\n  return node.scrollTop;\n};","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _inheritsLoose from \"@babel/runtime/helpers/esm/inheritsLoose\";\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport config from './config';\nimport { timeoutsShape } from './utils/PropTypes';\nimport TransitionGroupContext from './TransitionGroupContext';\nimport { forceReflow } from './utils/reflow';\nexport var UNMOUNTED = 'unmounted';\nexport var EXITED = 'exited';\nexport var ENTERING = 'entering';\nexport var ENTERED = 'entered';\nexport var EXITING = 'exiting';\n/**\n * The Transition component lets you describe a transition from one component\n * state to another _over time_ with a simple declarative API. Most commonly\n * it's used to animate the mounting and unmounting of a component, but can also\n * be used to describe in-place transition states as well.\n *\n * ---\n *\n * **Note**: `Transition` is a platform-agnostic base component. If you're using\n * transitions in CSS, you'll probably want to use\n * [`CSSTransition`](https://reactcommunity.org/react-transition-group/css-transition)\n * instead. It inherits all the features of `Transition`, but contains\n * additional features necessary to play nice with CSS transitions (hence the\n * name of the component).\n *\n * ---\n *\n * By default the `Transition` component does not alter the behavior of the\n * component it renders, it only tracks \"enter\" and \"exit\" states for the\n * components. It's up to you to give meaning and effect to those states. For\n * example we can add styles to a component when it enters or exits:\n *\n * ```jsx\n * import { Transition } from 'react-transition-group';\n *\n * const duration = 300;\n *\n * const defaultStyle = {\n *   transition: `opacity ${duration}ms ease-in-out`,\n *   opacity: 0,\n * }\n *\n * const transitionStyles = {\n *   entering: { opacity: 1 },\n *   entered:  { opacity: 1 },\n *   exiting:  { opacity: 0 },\n *   exited:  { opacity: 0 },\n * };\n *\n * const Fade = ({ in: inProp }) => (\n *   <Transition in={inProp} timeout={duration}>\n *     {state => (\n *       <div style={{\n *         ...defaultStyle,\n *         ...transitionStyles[state]\n *       }}>\n *         I'm a fade Transition!\n *       </div>\n *     )}\n *   </Transition>\n * );\n * ```\n *\n * There are 4 main states a Transition can be in:\n *  - `'entering'`\n *  - `'entered'`\n *  - `'exiting'`\n *  - `'exited'`\n *\n * Transition state is toggled via the `in` prop. When `true` the component\n * begins the \"Enter\" stage. During this stage, the component will shift from\n * its current transition state, to `'entering'` for the duration of the\n * transition and then to the `'entered'` stage once it's complete. Let's take\n * the following example (we'll use the\n * [useState](https://reactjs.org/docs/hooks-reference.html#usestate) hook):\n *\n * ```jsx\n * function App() {\n *   const [inProp, setInProp] = useState(false);\n *   return (\n *     <div>\n *       <Transition in={inProp} timeout={500}>\n *         {state => (\n *           // ...\n *         )}\n *       </Transition>\n *       <button onClick={() => setInProp(true)}>\n *         Click to Enter\n *       </button>\n *     </div>\n *   );\n * }\n * ```\n *\n * When the button is clicked the component will shift to the `'entering'` state\n * and stay there for 500ms (the value of `timeout`) before it finally switches\n * to `'entered'`.\n *\n * When `in` is `false` the same thing happens except the state moves from\n * `'exiting'` to `'exited'`.\n */\n\nvar Transition = /*#__PURE__*/function (_React$Component) {\n  _inheritsLoose(Transition, _React$Component);\n\n  function Transition(props, context) {\n    var _this;\n\n    _this = _React$Component.call(this, props, context) || this;\n    var parentGroup = context; // In the context of a TransitionGroup all enters are really appears\n\n    var appear = parentGroup && !parentGroup.isMounting ? props.enter : props.appear;\n    var initialStatus;\n    _this.appearStatus = null;\n\n    if (props.in) {\n      if (appear) {\n        initialStatus = EXITED;\n        _this.appearStatus = ENTERING;\n      } else {\n        initialStatus = ENTERED;\n      }\n    } else {\n      if (props.unmountOnExit || props.mountOnEnter) {\n        initialStatus = UNMOUNTED;\n      } else {\n        initialStatus = EXITED;\n      }\n    }\n\n    _this.state = {\n      status: initialStatus\n    };\n    _this.nextCallback = null;\n    return _this;\n  }\n\n  Transition.getDerivedStateFromProps = function getDerivedStateFromProps(_ref, prevState) {\n    var nextIn = _ref.in;\n\n    if (nextIn && prevState.status === UNMOUNTED) {\n      return {\n        status: EXITED\n      };\n    }\n\n    return null;\n  } // getSnapshotBeforeUpdate(prevProps) {\n  //   let nextStatus = null\n  //   if (prevProps !== this.props) {\n  //     const { status } = this.state\n  //     if (this.props.in) {\n  //       if (status !== ENTERING && status !== ENTERED) {\n  //         nextStatus = ENTERING\n  //       }\n  //     } else {\n  //       if (status === ENTERING || status === ENTERED) {\n  //         nextStatus = EXITING\n  //       }\n  //     }\n  //   }\n  //   return { nextStatus }\n  // }\n  ;\n\n  var _proto = Transition.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    this.updateStatus(true, this.appearStatus);\n  };\n\n  _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n    var nextStatus = null;\n\n    if (prevProps !== this.props) {\n      var status = this.state.status;\n\n      if (this.props.in) {\n        if (status !== ENTERING && status !== ENTERED) {\n          nextStatus = ENTERING;\n        }\n      } else {\n        if (status === ENTERING || status === ENTERED) {\n          nextStatus = EXITING;\n        }\n      }\n    }\n\n    this.updateStatus(false, nextStatus);\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    this.cancelNextCallback();\n  };\n\n  _proto.getTimeouts = function getTimeouts() {\n    var timeout = this.props.timeout;\n    var exit, enter, appear;\n    exit = enter = appear = timeout;\n\n    if (timeout != null && typeof timeout !== 'number') {\n      exit = timeout.exit;\n      enter = timeout.enter; // TODO: remove fallback for next major\n\n      appear = timeout.appear !== undefined ? timeout.appear : enter;\n    }\n\n    return {\n      exit: exit,\n      enter: enter,\n      appear: appear\n    };\n  };\n\n  _proto.updateStatus = function updateStatus(mounting, nextStatus) {\n    if (mounting === void 0) {\n      mounting = false;\n    }\n\n    if (nextStatus !== null) {\n      // nextStatus will always be ENTERING or EXITING.\n      this.cancelNextCallback();\n\n      if (nextStatus === ENTERING) {\n        if (this.props.unmountOnExit || this.props.mountOnEnter) {\n          var node = this.props.nodeRef ? this.props.nodeRef.current : ReactDOM.findDOMNode(this); // https://github.com/reactjs/react-transition-group/pull/749\n          // With unmountOnExit or mountOnEnter, the enter animation should happen at the transition between `exited` and `entering`.\n          // To make the animation happen,  we have to separate each rendering and avoid being processed as batched.\n\n          if (node) forceReflow(node);\n        }\n\n        this.performEnter(mounting);\n      } else {\n        this.performExit();\n      }\n    } else if (this.props.unmountOnExit && this.state.status === EXITED) {\n      this.setState({\n        status: UNMOUNTED\n      });\n    }\n  };\n\n  _proto.performEnter = function performEnter(mounting) {\n    var _this2 = this;\n\n    var enter = this.props.enter;\n    var appearing = this.context ? this.context.isMounting : mounting;\n\n    var _ref2 = this.props.nodeRef ? [appearing] : [ReactDOM.findDOMNode(this), appearing],\n        maybeNode = _ref2[0],\n        maybeAppearing = _ref2[1];\n\n    var timeouts = this.getTimeouts();\n    var enterTimeout = appearing ? timeouts.appear : timeouts.enter; // no enter animation skip right to ENTERED\n    // if we are mounting and running this it means appear _must_ be set\n\n    if (!mounting && !enter || config.disabled) {\n      this.safeSetState({\n        status: ENTERED\n      }, function () {\n        _this2.props.onEntered(maybeNode);\n      });\n      return;\n    }\n\n    this.props.onEnter(maybeNode, maybeAppearing);\n    this.safeSetState({\n      status: ENTERING\n    }, function () {\n      _this2.props.onEntering(maybeNode, maybeAppearing);\n\n      _this2.onTransitionEnd(enterTimeout, function () {\n        _this2.safeSetState({\n          status: ENTERED\n        }, function () {\n          _this2.props.onEntered(maybeNode, maybeAppearing);\n        });\n      });\n    });\n  };\n\n  _proto.performExit = function performExit() {\n    var _this3 = this;\n\n    var exit = this.props.exit;\n    var timeouts = this.getTimeouts();\n    var maybeNode = this.props.nodeRef ? undefined : ReactDOM.findDOMNode(this); // no exit animation skip right to EXITED\n\n    if (!exit || config.disabled) {\n      this.safeSetState({\n        status: EXITED\n      }, function () {\n        _this3.props.onExited(maybeNode);\n      });\n      return;\n    }\n\n    this.props.onExit(maybeNode);\n    this.safeSetState({\n      status: EXITING\n    }, function () {\n      _this3.props.onExiting(maybeNode);\n\n      _this3.onTransitionEnd(timeouts.exit, function () {\n        _this3.safeSetState({\n          status: EXITED\n        }, function () {\n          _this3.props.onExited(maybeNode);\n        });\n      });\n    });\n  };\n\n  _proto.cancelNextCallback = function cancelNextCallback() {\n    if (this.nextCallback !== null) {\n      this.nextCallback.cancel();\n      this.nextCallback = null;\n    }\n  };\n\n  _proto.safeSetState = function safeSetState(nextState, callback) {\n    // This shouldn't be necessary, but there are weird race conditions with\n    // setState callbacks and unmounting in testing, so always make sure that\n    // we can cancel any pending setState callbacks after we unmount.\n    callback = this.setNextCallback(callback);\n    this.setState(nextState, callback);\n  };\n\n  _proto.setNextCallback = function setNextCallback(callback) {\n    var _this4 = this;\n\n    var active = true;\n\n    this.nextCallback = function (event) {\n      if (active) {\n        active = false;\n        _this4.nextCallback = null;\n        callback(event);\n      }\n    };\n\n    this.nextCallback.cancel = function () {\n      active = false;\n    };\n\n    return this.nextCallback;\n  };\n\n  _proto.onTransitionEnd = function onTransitionEnd(timeout, handler) {\n    this.setNextCallback(handler);\n    var node = this.props.nodeRef ? this.props.nodeRef.current : ReactDOM.findDOMNode(this);\n    var doesNotHaveTimeoutOrListener = timeout == null && !this.props.addEndListener;\n\n    if (!node || doesNotHaveTimeoutOrListener) {\n      setTimeout(this.nextCallback, 0);\n      return;\n    }\n\n    if (this.props.addEndListener) {\n      var _ref3 = this.props.nodeRef ? [this.nextCallback] : [node, this.nextCallback],\n          maybeNode = _ref3[0],\n          maybeNextCallback = _ref3[1];\n\n      this.props.addEndListener(maybeNode, maybeNextCallback);\n    }\n\n    if (timeout != null) {\n      setTimeout(this.nextCallback, timeout);\n    }\n  };\n\n  _proto.render = function render() {\n    var status = this.state.status;\n\n    if (status === UNMOUNTED) {\n      return null;\n    }\n\n    var _this$props = this.props,\n        children = _this$props.children,\n        _in = _this$props.in,\n        _mountOnEnter = _this$props.mountOnEnter,\n        _unmountOnExit = _this$props.unmountOnExit,\n        _appear = _this$props.appear,\n        _enter = _this$props.enter,\n        _exit = _this$props.exit,\n        _timeout = _this$props.timeout,\n        _addEndListener = _this$props.addEndListener,\n        _onEnter = _this$props.onEnter,\n        _onEntering = _this$props.onEntering,\n        _onEntered = _this$props.onEntered,\n        _onExit = _this$props.onExit,\n        _onExiting = _this$props.onExiting,\n        _onExited = _this$props.onExited,\n        _nodeRef = _this$props.nodeRef,\n        childProps = _objectWithoutPropertiesLoose(_this$props, [\"children\", \"in\", \"mountOnEnter\", \"unmountOnExit\", \"appear\", \"enter\", \"exit\", \"timeout\", \"addEndListener\", \"onEnter\", \"onEntering\", \"onEntered\", \"onExit\", \"onExiting\", \"onExited\", \"nodeRef\"]);\n\n    return (\n      /*#__PURE__*/\n      // allows for nested Transitions\n      React.createElement(TransitionGroupContext.Provider, {\n        value: null\n      }, typeof children === 'function' ? children(status, childProps) : React.cloneElement(React.Children.only(children), childProps))\n    );\n  };\n\n  return Transition;\n}(React.Component);\n\nTransition.contextType = TransitionGroupContext;\nTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n  /**\n   * A React reference to DOM element that need to transition:\n   * https://stackoverflow.com/a/51127130/4671932\n   *\n   *   - When `nodeRef` prop is used, `node` is not passed to callback functions\n   *      (e.g. `onEnter`) because user already has direct access to the node.\n   *   - When changing `key` prop of `Transition` in a `TransitionGroup` a new\n   *     `nodeRef` need to be provided to `Transition` with changed `key` prop\n   *     (see\n   *     [test/CSSTransition-test.js](https://github.com/reactjs/react-transition-group/blob/13435f897b3ab71f6e19d724f145596f5910581c/test/CSSTransition-test.js#L362-L437)).\n   */\n  nodeRef: PropTypes.shape({\n    current: typeof Element === 'undefined' ? PropTypes.any : function (propValue, key, componentName, location, propFullName, secret) {\n      var value = propValue[key];\n      return PropTypes.instanceOf(value && 'ownerDocument' in value ? value.ownerDocument.defaultView.Element : Element)(propValue, key, componentName, location, propFullName, secret);\n    }\n  }),\n\n  /**\n   * A `function` child can be used instead of a React element. This function is\n   * called with the current transition status (`'entering'`, `'entered'`,\n   * `'exiting'`, `'exited'`), which can be used to apply context\n   * specific props to a component.\n   *\n   * ```jsx\n   * <Transition in={this.state.in} timeout={150}>\n   *   {state => (\n   *     <MyComponent className={`fade fade-${state}`} />\n   *   )}\n   * </Transition>\n   * ```\n   */\n  children: PropTypes.oneOfType([PropTypes.func.isRequired, PropTypes.element.isRequired]).isRequired,\n\n  /**\n   * Show the component; triggers the enter or exit states\n   */\n  in: PropTypes.bool,\n\n  /**\n   * By default the child component is mounted immediately along with\n   * the parent `Transition` component. If you want to \"lazy mount\" the component on the\n   * first `in={true}` you can set `mountOnEnter`. After the first enter transition the component will stay\n   * mounted, even on \"exited\", unless you also specify `unmountOnExit`.\n   */\n  mountOnEnter: PropTypes.bool,\n\n  /**\n   * By default the child component stays mounted after it reaches the `'exited'` state.\n   * Set `unmountOnExit` if you'd prefer to unmount the component after it finishes exiting.\n   */\n  unmountOnExit: PropTypes.bool,\n\n  /**\n   * By default the child component does not perform the enter transition when\n   * it first mounts, regardless of the value of `in`. If you want this\n   * behavior, set both `appear` and `in` to `true`.\n   *\n   * > **Note**: there are no special appear states like `appearing`/`appeared`, this prop\n   * > only adds an additional enter transition. However, in the\n   * > `<CSSTransition>` component that first enter transition does result in\n   * > additional `.appear-*` classes, that way you can choose to style it\n   * > differently.\n   */\n  appear: PropTypes.bool,\n\n  /**\n   * Enable or disable enter transitions.\n   */\n  enter: PropTypes.bool,\n\n  /**\n   * Enable or disable exit transitions.\n   */\n  exit: PropTypes.bool,\n\n  /**\n   * The duration of the transition, in milliseconds.\n   * Required unless `addEndListener` is provided.\n   *\n   * You may specify a single timeout for all transitions:\n   *\n   * ```jsx\n   * timeout={500}\n   * ```\n   *\n   * or individually:\n   *\n   * ```jsx\n   * timeout={{\n   *  appear: 500,\n   *  enter: 300,\n   *  exit: 500,\n   * }}\n   * ```\n   *\n   * - `appear` defaults to the value of `enter`\n   * - `enter` defaults to `0`\n   * - `exit` defaults to `0`\n   *\n   * @type {number | { enter?: number, exit?: number, appear?: number }}\n   */\n  timeout: function timeout(props) {\n    var pt = timeoutsShape;\n    if (!props.addEndListener) pt = pt.isRequired;\n\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n\n    return pt.apply(void 0, [props].concat(args));\n  },\n\n  /**\n   * Add a custom transition end trigger. Called with the transitioning\n   * DOM node and a `done` callback. Allows for more fine grained transition end\n   * logic. Timeouts are still used as a fallback if provided.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * ```jsx\n   * addEndListener={(node, done) => {\n   *   // use the css transitionend event to mark the finish of a transition\n   *   node.addEventListener('transitionend', done, false);\n   * }}\n   * ```\n   */\n  addEndListener: PropTypes.func,\n\n  /**\n   * Callback fired before the \"entering\" status is applied. An extra parameter\n   * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool) -> void\n   */\n  onEnter: PropTypes.func,\n\n  /**\n   * Callback fired after the \"entering\" status is applied. An extra parameter\n   * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool)\n   */\n  onEntering: PropTypes.func,\n\n  /**\n   * Callback fired after the \"entered\" status is applied. An extra parameter\n   * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool) -> void\n   */\n  onEntered: PropTypes.func,\n\n  /**\n   * Callback fired before the \"exiting\" status is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement) -> void\n   */\n  onExit: PropTypes.func,\n\n  /**\n   * Callback fired after the \"exiting\" status is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement) -> void\n   */\n  onExiting: PropTypes.func,\n\n  /**\n   * Callback fired after the \"exited\" status is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed\n   *\n   * @type Function(node: HtmlElement) -> void\n   */\n  onExited: PropTypes.func\n} : {}; // Name the function so it is clearer in the documentation\n\nfunction noop() {}\n\nTransition.defaultProps = {\n  in: false,\n  mountOnEnter: false,\n  unmountOnExit: false,\n  appear: false,\n  enter: true,\n  exit: true,\n  onEnter: noop,\n  onEntering: noop,\n  onEntered: noop,\n  onExit: noop,\n  onExiting: noop,\n  onExited: noop\n};\nTransition.UNMOUNTED = UNMOUNTED;\nTransition.EXITED = EXITED;\nTransition.ENTERING = ENTERING;\nTransition.ENTERED = ENTERED;\nTransition.EXITING = EXITING;\nexport default Transition;","function _extends() {\n  return _extends = Object.assign ? Object.assign.bind() : function (n) {\n    for (var e = 1; e < arguments.length; e++) {\n      var t = arguments[e];\n      for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n    }\n    return n;\n  }, _extends.apply(null, arguments);\n}\nexport { _extends as default };","import { Children, cloneElement, isValidElement } from 'react';\n/**\n * Given `this.props.children`, return an object mapping key to child.\n *\n * @param {*} children `this.props.children`\n * @return {object} Mapping of key to child\n */\n\nexport function getChildMapping(children, mapFn) {\n  var mapper = function mapper(child) {\n    return mapFn && isValidElement(child) ? mapFn(child) : child;\n  };\n\n  var result = Object.create(null);\n  if (children) Children.map(children, function (c) {\n    return c;\n  }).forEach(function (child) {\n    // run the map function here instead so that the key is the computed one\n    result[child.key] = mapper(child);\n  });\n  return result;\n}\n/**\n * When you're adding or removing children some may be added or removed in the\n * same render pass. We want to show *both* since we want to simultaneously\n * animate elements in and out. This function takes a previous set of keys\n * and a new set of keys and merges them with its best guess of the correct\n * ordering. In the future we may expose some of the utilities in\n * ReactMultiChild to make this easy, but for now React itself does not\n * directly have this concept of the union of prevChildren and nextChildren\n * so we implement it here.\n *\n * @param {object} prev prev children as returned from\n * `ReactTransitionChildMapping.getChildMapping()`.\n * @param {object} next next children as returned from\n * `ReactTransitionChildMapping.getChildMapping()`.\n * @return {object} a key set that contains all keys in `prev` and all keys\n * in `next` in a reasonable order.\n */\n\nexport function mergeChildMappings(prev, next) {\n  prev = prev || {};\n  next = next || {};\n\n  function getValueForKey(key) {\n    return key in next ? next[key] : prev[key];\n  } // For each key of `next`, the list of keys to insert before that key in\n  // the combined list\n\n\n  var nextKeysPending = Object.create(null);\n  var pendingKeys = [];\n\n  for (var prevKey in prev) {\n    if (prevKey in next) {\n      if (pendingKeys.length) {\n        nextKeysPending[prevKey] = pendingKeys;\n        pendingKeys = [];\n      }\n    } else {\n      pendingKeys.push(prevKey);\n    }\n  }\n\n  var i;\n  var childMapping = {};\n\n  for (var nextKey in next) {\n    if (nextKeysPending[nextKey]) {\n      for (i = 0; i < nextKeysPending[nextKey].length; i++) {\n        var pendingNextKey = nextKeysPending[nextKey][i];\n        childMapping[nextKeysPending[nextKey][i]] = getValueForKey(pendingNextKey);\n      }\n    }\n\n    childMapping[nextKey] = getValueForKey(nextKey);\n  } // Finally, add the keys which didn't appear before any key in `next`\n\n\n  for (i = 0; i < pendingKeys.length; i++) {\n    childMapping[pendingKeys[i]] = getValueForKey(pendingKeys[i]);\n  }\n\n  return childMapping;\n}\n\nfunction getProp(child, prop, props) {\n  return props[prop] != null ? props[prop] : child.props[prop];\n}\n\nexport function getInitialChildMapping(props, onExited) {\n  return getChildMapping(props.children, function (child) {\n    return cloneElement(child, {\n      onExited: onExited.bind(null, child),\n      in: true,\n      appear: getProp(child, 'appear', props),\n      enter: getProp(child, 'enter', props),\n      exit: getProp(child, 'exit', props)\n    });\n  });\n}\nexport function getNextChildMapping(nextProps, prevChildMapping, onExited) {\n  var nextChildMapping = getChildMapping(nextProps.children);\n  var children = mergeChildMappings(prevChildMapping, nextChildMapping);\n  Object.keys(children).forEach(function (key) {\n    var child = children[key];\n    if (!isValidElement(child)) return;\n    var hasPrev = (key in prevChildMapping);\n    var hasNext = (key in nextChildMapping);\n    var prevChild = prevChildMapping[key];\n    var isLeaving = isValidElement(prevChild) && !prevChild.props.in; // item is new (entering)\n\n    if (hasNext && (!hasPrev || isLeaving)) {\n      // console.log('entering', key)\n      children[key] = cloneElement(child, {\n        onExited: onExited.bind(null, child),\n        in: true,\n        exit: getProp(child, 'exit', nextProps),\n        enter: getProp(child, 'enter', nextProps)\n      });\n    } else if (!hasNext && hasPrev && !isLeaving) {\n      // item is old (exiting)\n      // console.log('leaving', key)\n      children[key] = cloneElement(child, {\n        in: false\n      });\n    } else if (hasNext && hasPrev && isValidElement(prevChild)) {\n      // item hasn't changed transition states\n      // copy over the last transition props;\n      // console.log('unchanged', key)\n      children[key] = cloneElement(child, {\n        onExited: onExited.bind(null, child),\n        in: prevChild.props.in,\n        exit: getProp(child, 'exit', nextProps),\n        enter: getProp(child, 'enter', nextProps)\n      });\n    }\n  });\n  return children;\n}","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _assertThisInitialized from \"@babel/runtime/helpers/esm/assertThisInitialized\";\nimport _inheritsLoose from \"@babel/runtime/helpers/esm/inheritsLoose\";\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport TransitionGroupContext from './TransitionGroupContext';\nimport { getChildMapping, getInitialChildMapping, getNextChildMapping } from './utils/ChildMapping';\n\nvar values = Object.values || function (obj) {\n  return Object.keys(obj).map(function (k) {\n    return obj[k];\n  });\n};\n\nvar defaultProps = {\n  component: 'div',\n  childFactory: function childFactory(child) {\n    return child;\n  }\n};\n/**\n * The `<TransitionGroup>` component manages a set of transition components\n * (`<Transition>` and `<CSSTransition>`) in a list. Like with the transition\n * components, `<TransitionGroup>` is a state machine for managing the mounting\n * and unmounting of components over time.\n *\n * Consider the example below. As items are removed or added to the TodoList the\n * `in` prop is toggled automatically by the `<TransitionGroup>`.\n *\n * Note that `<TransitionGroup>`  does not define any animation behavior!\n * Exactly _how_ a list item animates is up to the individual transition\n * component. This means you can mix and match animations across different list\n * items.\n */\n\nvar TransitionGroup = /*#__PURE__*/function (_React$Component) {\n  _inheritsLoose(TransitionGroup, _React$Component);\n\n  function TransitionGroup(props, context) {\n    var _this;\n\n    _this = _React$Component.call(this, props, context) || this;\n\n    var handleExited = _this.handleExited.bind(_assertThisInitialized(_this)); // Initial children should all be entering, dependent on appear\n\n\n    _this.state = {\n      contextValue: {\n        isMounting: true\n      },\n      handleExited: handleExited,\n      firstRender: true\n    };\n    return _this;\n  }\n\n  var _proto = TransitionGroup.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    this.mounted = true;\n    this.setState({\n      contextValue: {\n        isMounting: false\n      }\n    });\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    this.mounted = false;\n  };\n\n  TransitionGroup.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, _ref) {\n    var prevChildMapping = _ref.children,\n        handleExited = _ref.handleExited,\n        firstRender = _ref.firstRender;\n    return {\n      children: firstRender ? getInitialChildMapping(nextProps, handleExited) : getNextChildMapping(nextProps, prevChildMapping, handleExited),\n      firstRender: false\n    };\n  } // node is `undefined` when user provided `nodeRef` prop\n  ;\n\n  _proto.handleExited = function handleExited(child, node) {\n    var currentChildMapping = getChildMapping(this.props.children);\n    if (child.key in currentChildMapping) return;\n\n    if (child.props.onExited) {\n      child.props.onExited(node);\n    }\n\n    if (this.mounted) {\n      this.setState(function (state) {\n        var children = _extends({}, state.children);\n\n        delete children[child.key];\n        return {\n          children: children\n        };\n      });\n    }\n  };\n\n  _proto.render = function render() {\n    var _this$props = this.props,\n        Component = _this$props.component,\n        childFactory = _this$props.childFactory,\n        props = _objectWithoutPropertiesLoose(_this$props, [\"component\", \"childFactory\"]);\n\n    var contextValue = this.state.contextValue;\n    var children = values(this.state.children).map(childFactory);\n    delete props.appear;\n    delete props.enter;\n    delete props.exit;\n\n    if (Component === null) {\n      return /*#__PURE__*/React.createElement(TransitionGroupContext.Provider, {\n        value: contextValue\n      }, children);\n    }\n\n    return /*#__PURE__*/React.createElement(TransitionGroupContext.Provider, {\n      value: contextValue\n    }, /*#__PURE__*/React.createElement(Component, props, children));\n  };\n\n  return TransitionGroup;\n}(React.Component);\n\nTransitionGroup.propTypes = process.env.NODE_ENV !== \"production\" ? {\n  /**\n   * `<TransitionGroup>` renders a `<div>` by default. You can change this\n   * behavior by providing a `component` prop.\n   * If you use React v16+ and would like to avoid a wrapping `<div>` element\n   * you can pass in `component={null}`. This is useful if the wrapping div\n   * borks your css styles.\n   */\n  component: PropTypes.any,\n\n  /**\n   * A set of `<Transition>` components, that are toggled `in` and out as they\n   * leave. the `<TransitionGroup>` will inject specific transition props, so\n   * remember to spread them through if you are wrapping the `<Transition>` as\n   * with our `<Fade>` example.\n   *\n   * While this component is meant for multiple `Transition` or `CSSTransition`\n   * children, sometimes you may want to have a single transition child with\n   * content that you want to be transitioned out and in when you change it\n   * (e.g. routes, images etc.) In that case you can change the `key` prop of\n   * the transition child as you change its content, this will cause\n   * `TransitionGroup` to transition the child out and back in.\n   */\n  children: PropTypes.node,\n\n  /**\n   * A convenience prop that enables or disables appear animations\n   * for all children. Note that specifying this will override any defaults set\n   * on individual children Transitions.\n   */\n  appear: PropTypes.bool,\n\n  /**\n   * A convenience prop that enables or disables enter animations\n   * for all children. Note that specifying this will override any defaults set\n   * on individual children Transitions.\n   */\n  enter: PropTypes.bool,\n\n  /**\n   * A convenience prop that enables or disables exit animations\n   * for all children. Note that specifying this will override any defaults set\n   * on individual children Transitions.\n   */\n  exit: PropTypes.bool,\n\n  /**\n   * You may need to apply reactive updates to a child as it is exiting.\n   * This is generally done by using `cloneElement` however in the case of an exiting\n   * child the element has already been removed and not accessible to the consumer.\n   *\n   * If you do need to update a child as it leaves you can provide a `childFactory`\n   * to wrap every child, even the ones that are leaving.\n   *\n   * @type Function(child: ReactElement) -> ReactElement\n   */\n  childFactory: PropTypes.func\n} : {};\nTransitionGroup.defaultProps = defaultProps;\nexport default TransitionGroup;","function _assertThisInitialized(e) {\n  if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  return e;\n}\nexport { _assertThisInitialized as default };","import { useReducer } from 'react';\n\nconst reducer = (value: number) => (value + 1) % 1000000;\n\nexport function useForceUpdate(): () => void {\n  const [, update] = useReducer(reducer, 0);\n  return update;\n}\n","import { NotificationData, NotificationPosition } from '../notifications.store';\n\nexport type GroupedNotifications = Record<NotificationPosition, NotificationData[]>;\n\nexport const positions: NotificationPosition[] = [\n  'bottom-center',\n  'bottom-left',\n  'bottom-right',\n  'top-center',\n  'top-left',\n  'top-right',\n];\n\nexport function getGroupedNotifications(\n  notifications: NotificationData[],\n  defaultPosition: NotificationPosition\n) {\n  return notifications.reduce<GroupedNotifications>(\n    (acc, notification) => {\n      acc[notification.position || defaultPosition].push(notification);\n      return acc;\n    },\n    positions.reduce<GroupedNotifications>((acc, item) => {\n      acc[item] = [];\n      return acc;\n    }, {} as GroupedNotifications)\n  );\n}\n","import { TransitionStatus } from 'react-transition-group';\nimport type { NotificationsProps } from './Notifications';\n\ninterface NotificationStateStylesProps {\n  state: TransitionStatus;\n  maxHeight: number | string;\n  position: NotificationsProps['position'];\n  transitionDuration: number;\n}\n\nconst transforms = {\n  left: 'translateX(-100%)',\n  right: 'translateX(100%)',\n  'top-center': 'translateY(-100%)',\n  'bottom-center': 'translateY(100%)',\n};\n\nconst noTransform = {\n  left: 'translateX(0)',\n  right: 'translateX(0)',\n  'top-center': 'translateY(0)',\n  'bottom-center': 'translateY(0)',\n};\n\nexport function getNotificationStateStyles({\n  state,\n  maxHeight,\n  position,\n  transitionDuration,\n}: NotificationStateStylesProps): React.CSSProperties {\n  const [vertical, horizontal] = position!.split('-');\n  const property = (\n    horizontal === 'center' ? `${vertical}-center` : horizontal\n  ) as keyof typeof transforms;\n\n  const commonStyles: React.CSSProperties = {\n    opacity: 0,\n    maxHeight,\n    transform: transforms[property],\n    transitionDuration: `${transitionDuration}ms, ${transitionDuration}ms, ${transitionDuration}ms`,\n    transitionTimingFunction: 'cubic-bezier(.51,.3,0,1.21), cubic-bezier(.51,.3,0,1.21), linear',\n    transitionProperty: 'opacity, transform, max-height',\n  };\n\n  const inState: React.CSSProperties = {\n    opacity: 1,\n    transform: noTransform[property],\n  };\n\n  const outState: React.CSSProperties = {\n    opacity: 0,\n    maxHeight: 0,\n    transform: transforms[property],\n  };\n\n  const transitionStyles = {\n    entering: inState,\n    entered: inState,\n    exiting: outState,\n    exited: outState,\n  };\n\n  return { ...commonStyles, ...transitionStyles[state as keyof typeof transitionStyles] };\n}\n","import {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  factory,\n  Factory,\n  getRadius,\n  getThemeColor,\n  MantineColor,\n  MantineRadius,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../core';\nimport { CloseButton } from '../CloseButton';\nimport { Loader, LoaderProps } from '../Loader';\nimport classes from './Notification.module.css';\n\nexport type NotificationStylesNames =\n  | 'root'\n  | 'icon'\n  | 'loader'\n  | 'body'\n  | 'title'\n  | 'description'\n  | 'closeButton';\nexport type NotificationCssVariables = {\n  root: '--notification-radius' | '--notification-color';\n};\n\nexport interface NotificationProps\n  extends BoxProps,\n    StylesApiProps<NotificationFactory>,\n    ElementProps<'div', 'title'> {\n  variant?: string;\n\n  /** Called when close button is clicked */\n  onClose?: () => void;\n\n  /** Controls notification line or icon color, key of `theme.colors` or any valid CSS color, `theme.primaryColor` by default */\n  color?: MantineColor;\n\n  /** Key of `theme.radius` or any valid CSS value to set `border-radius`, `theme.defaultRadius` by default */\n  radius?: MantineRadius;\n\n  /** Notification icon, replaces color line */\n  icon?: React.ReactNode;\n\n  /** Notification title, displayed before body */\n  title?: React.ReactNode;\n\n  /** Notification body, place main text here */\n  children?: React.ReactNode;\n\n  /** Replaces colored line or icon with Loader component */\n  loading?: boolean;\n\n  /** Determines whether notification should have a border, `false` by default */\n  withBorder?: boolean;\n\n  /** Determines whether close button should be visible, `true` by default */\n  withCloseButton?: boolean;\n\n  /** Props passed down to the close button */\n  closeButtonProps?: Record<string, any>;\n\n  /** Props passed down to `Loader` component */\n  loaderProps?: LoaderProps;\n}\n\nexport type NotificationFactory = Factory<{\n  props: NotificationProps;\n  ref: HTMLDivElement;\n  stylesNames: NotificationStylesNames;\n  vars: NotificationCssVariables;\n}>;\n\nconst defaultProps: Partial<NotificationProps> = {\n  withCloseButton: true,\n};\n\nconst varsResolver = createVarsResolver<NotificationFactory>((theme, { radius, color }) => ({\n  root: {\n    '--notification-radius': radius === undefined ? undefined : getRadius(radius),\n    '--notification-color': color ? getThemeColor(color, theme) : undefined,\n  },\n}));\n\nexport const Notification = factory<NotificationFactory>((_props, ref) => {\n  const props = useProps('Notification', defaultProps, _props);\n  const {\n    className,\n    color,\n    radius,\n    loading,\n    withCloseButton,\n    withBorder,\n    title,\n    icon,\n    children,\n    onClose,\n    closeButtonProps,\n    classNames,\n    style,\n    styles,\n    unstyled,\n    variant,\n    vars,\n    mod,\n    loaderProps,\n    ...others\n  } = props;\n\n  const getStyles = useStyles<NotificationFactory>({\n    name: 'Notification',\n    classes,\n    props,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n  });\n\n  return (\n    <Box\n      {...getStyles('root')}\n      mod={[{ 'data-with-icon': !!icon || loading, 'data-with-border': withBorder }, mod]}\n      ref={ref}\n      variant={variant}\n      {...others}\n      role=\"alert\"\n    >\n      {icon && !loading && <div {...getStyles('icon')}>{icon}</div>}\n      {loading && <Loader size={28} color={color} {...loaderProps} {...getStyles('loader')} />}\n\n      <div {...getStyles('body')}>\n        {title && <div {...getStyles('title')}>{title}</div>}\n\n        <Box {...getStyles('description')} mod={{ 'data-with-title': !!title }}>\n          {children}\n        </Box>\n      </div>\n\n      {withCloseButton && (\n        <CloseButton\n          iconSize={16}\n          color=\"gray\"\n          {...closeButtonProps}\n          unstyled={unstyled}\n          onClick={onClose}\n          {...getStyles('closeButton')}\n        />\n      )}\n    </Box>\n  );\n});\n\nNotification.classes = classes;\nNotification.displayName = '@mantine/core/Notification';\n","import { forwardRef, useEffect, useRef } from 'react';\nimport { Notification, NotificationProps } from '@mantine/core';\nimport { getAutoClose } from './get-auto-close/get-auto-close';\nimport { NotificationData } from './notifications.store';\n\ninterface NotificationContainerProps extends NotificationProps {\n  data: NotificationData;\n  onHide: (id: string) => void;\n  autoClose: number | false;\n}\n\nexport const NotificationContainer = forwardRef<HTMLDivElement, NotificationContainerProps>(\n  ({ data, onHide, autoClose, ...others }, ref) => {\n    const { autoClose: _autoClose, message, ...notificationProps } = data;\n    const autoCloseDuration = getAutoClose(autoClose, data.autoClose);\n    const autoCloseTimeout = useRef<number>(-1);\n\n    const cancelAutoClose = () => window.clearTimeout(autoCloseTimeout.current);\n\n    const handleHide = () => {\n      onHide(data.id!);\n      cancelAutoClose();\n    };\n\n    const handleAutoClose = () => {\n      if (typeof autoCloseDuration === 'number') {\n        autoCloseTimeout.current = window.setTimeout(handleHide, autoCloseDuration);\n      }\n    };\n\n    useEffect(() => {\n      data.onOpen?.(data);\n    }, []);\n\n    useEffect(() => {\n      handleAutoClose();\n      return cancelAutoClose;\n    }, [autoCloseDuration]);\n\n    return (\n      <Notification\n        {...others}\n        {...notificationProps}\n        onClose={handleHide}\n        ref={ref}\n        onMouseEnter={cancelAutoClose}\n        onMouseLeave={handleAutoClose}\n      >\n        {message}\n      </Notification>\n    );\n  }\n);\n\nNotificationContainer.displayName = '@mantine/notifications/NotificationContainer';\n","export function getAutoClose(\n  autoClose: boolean | number | undefined,\n  notificationAutoClose: boolean | number | undefined\n) {\n  if (typeof notificationAutoClose === 'number') {\n    return notificationAutoClose;\n  }\n\n  if (notificationAutoClose === false || autoClose === false) {\n    return false;\n  }\n\n  return autoClose;\n}\n","import { useEffect, useRef } from 'react';\nimport {\n  Transition as _Transition,\n  TransitionGroup,\n  TransitionStatus,\n} from 'react-transition-group';\nimport {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  factory,\n  Factory,\n  getDefaultZIndex,\n  OptionalPortal,\n  PortalProps,\n  rem,\n  RemoveScroll,\n  StylesApiProps,\n  useMantineTheme,\n  useProps,\n  useStyles,\n} from '@mantine/core';\nimport { useDidUpdate, useForceUpdate, useReducedMotion } from '@mantine/hooks';\nimport {\n  getGroupedNotifications,\n  positions,\n} from './get-grouped-notifications/get-grouped-notifications';\nimport { getNotificationStateStyles } from './get-notification-state-styles';\nimport { NotificationContainer } from './NotificationContainer';\nimport {\n  hideNotification,\n  NotificationPosition,\n  notifications,\n  NotificationsStore,\n  notificationsStore,\n  useNotifications,\n} from './notifications.store';\nimport classes from './Notifications.module.css';\n\nconst Transition: any = _Transition;\n\nexport type NotificationsStylesNames = 'root' | 'notification';\nexport type NotificationsCssVariables = {\n  root: '--notifications-z-index' | '--notifications-container-width';\n};\n\nexport interface NotificationsProps\n  extends BoxProps,\n    StylesApiProps<NotificationsFactory>,\n    ElementProps<'div'> {\n  /** Notifications default position, `'bottom-right'` by default */\n  position?: NotificationPosition;\n\n  /** Auto close timeout for all notifications in ms, `false` to disable auto close, can be overwritten for individual notifications in `notifications.show` function, `4000` by default */\n  autoClose?: number | false;\n\n  /** Notification transition duration in ms, `250` by default */\n  transitionDuration?: number;\n\n  /** Notification width, cannot exceed 100%, `440` by default */\n  containerWidth?: number | string;\n\n  /** Notification `max-height`, used for transitions, `200` by default */\n  notificationMaxHeight?: number | string;\n\n  /** Maximum number of notifications displayed at a time, other new notifications will be added to queue, `5` by default */\n  limit?: number;\n\n  /** Notifications container z-index, `400` by default */\n  zIndex?: string | number;\n\n  /** Props passed down to the `Portal` component */\n  portalProps?: Omit<PortalProps, 'children'>;\n\n  /** Store for notifications state, can be used to create multiple instances of notifications system in your application */\n  store?: NotificationsStore;\n\n  /** Determines whether notifications container should be rendered inside `Portal`, `true` by default */\n  withinPortal?: boolean;\n}\n\nexport type NotificationsFactory = Factory<{\n  props: NotificationsProps;\n  ref: HTMLDivElement;\n  stylesNames: NotificationsStylesNames;\n  vars: NotificationsCssVariables;\n  staticComponents: {\n    show: typeof notifications.show;\n    hide: typeof notifications.hide;\n    update: typeof notifications.update;\n    clean: typeof notifications.clean;\n    cleanQueue: typeof notifications.cleanQueue;\n    updateState: typeof notifications.updateState;\n  };\n}>;\n\nconst defaultProps: Partial<NotificationsProps> = {\n  position: 'bottom-right',\n  autoClose: 4000,\n  transitionDuration: 250,\n  containerWidth: 440,\n  notificationMaxHeight: 200,\n  limit: 5,\n  zIndex: getDefaultZIndex('overlay'),\n  store: notificationsStore,\n  withinPortal: true,\n};\n\nconst varsResolver = createVarsResolver<NotificationsFactory>((_, { zIndex, containerWidth }) => ({\n  root: {\n    '--notifications-z-index': zIndex?.toString(),\n    '--notifications-container-width': rem(containerWidth),\n  },\n}));\n\nexport const Notifications = factory<NotificationsFactory>((_props, ref) => {\n  const props = useProps('Notifications', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    position,\n    autoClose,\n    transitionDuration,\n    containerWidth,\n    notificationMaxHeight,\n    limit,\n    zIndex,\n    store,\n    portalProps,\n    withinPortal,\n    ...others\n  } = props;\n\n  const theme = useMantineTheme();\n  const data = useNotifications(store);\n  const forceUpdate = useForceUpdate();\n  const shouldReduceMotion = useReducedMotion();\n  const refs = useRef<Record<string, HTMLDivElement>>({});\n  const previousLength = useRef<number>(0);\n\n  const reduceMotion = theme.respectReducedMotion ? shouldReduceMotion : false;\n  const duration = reduceMotion ? 1 : transitionDuration;\n\n  const getStyles = useStyles<NotificationsFactory>({\n    name: 'Notifications',\n    classes,\n    props,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n  });\n\n  useEffect(() => {\n    store?.updateState((current) => ({\n      ...current,\n      limit: limit || 5,\n      defaultPosition: position!,\n    }));\n  }, [limit, position]);\n\n  useDidUpdate(() => {\n    if (data.notifications.length > previousLength.current) {\n      setTimeout(() => forceUpdate(), 0);\n    }\n    previousLength.current = data.notifications.length;\n  }, [data.notifications]);\n\n  const grouped = getGroupedNotifications(data.notifications, position!);\n  const groupedComponents = positions.reduce(\n    (acc, pos) => {\n      acc[pos] = grouped[pos].map(({ style: notificationStyle, ...notification }) => (\n        <Transition\n          key={notification.id}\n          timeout={duration}\n          onEnter={() => refs.current[notification.id!].offsetHeight}\n          nodeRef={{ current: refs.current[notification.id!] }}\n        >\n          {(state: TransitionStatus) => (\n            <NotificationContainer\n              ref={(node) => {\n                refs.current[notification.id!] = node!;\n              }}\n              data={notification}\n              onHide={(id) => hideNotification(id, store)}\n              autoClose={autoClose!}\n              {...getStyles('notification', {\n                style: {\n                  ...getNotificationStateStyles({\n                    state,\n                    position: pos,\n                    transitionDuration: duration!,\n                    maxHeight: notificationMaxHeight!,\n                  }),\n                  ...notificationStyle,\n                },\n              })}\n            />\n          )}\n        </Transition>\n      ));\n\n      return acc;\n    },\n    {} as Record<NotificationPosition, React.ReactNode>\n  );\n\n  return (\n    <OptionalPortal withinPortal={withinPortal} {...portalProps}>\n      <Box {...getStyles('root')} data-position=\"top-center\" ref={ref} {...others}>\n        <TransitionGroup>{groupedComponents['top-center']}</TransitionGroup>\n      </Box>\n\n      <Box {...getStyles('root')} data-position=\"top-left\" {...others}>\n        <TransitionGroup>{groupedComponents['top-left']}</TransitionGroup>\n      </Box>\n\n      <Box\n        {...getStyles('root', { className: RemoveScroll.classNames.fullWidth })}\n        data-position=\"top-right\"\n        {...others}\n      >\n        <TransitionGroup>{groupedComponents['top-right']}</TransitionGroup>\n      </Box>\n\n      <Box\n        {...getStyles('root', { className: RemoveScroll.classNames.fullWidth })}\n        data-position=\"bottom-right\"\n        {...others}\n      >\n        <TransitionGroup>{groupedComponents['bottom-right']}</TransitionGroup>\n      </Box>\n\n      <Box {...getStyles('root')} data-position=\"bottom-left\" {...others}>\n        <TransitionGroup>{groupedComponents['bottom-left']}</TransitionGroup>\n      </Box>\n\n      <Box {...getStyles('root')} data-position=\"bottom-center\" {...others}>\n        <TransitionGroup>{groupedComponents['bottom-center']}</TransitionGroup>\n      </Box>\n    </OptionalPortal>\n  );\n});\n\nNotifications.classes = classes;\nNotifications.displayName = '@mantine/notifications/Notifications';\nNotifications.show = notifications.show;\nNotifications.hide = notifications.hide;\nNotifications.update = notifications.update;\nNotifications.clean = notifications.clean;\nNotifications.cleanQueue = notifications.cleanQueue;\nNotifications.updateState = notifications.updateState;\n","/* eslint-disable max-classes-per-file */\n\ninterface AnimationFrameStrategy {\n  cancelAnimationFrame(id: number): void;\n  requestAnimationFrame(callback: (time: number) => void): number;\n}\n\nclass WebAnimationFrameStrategy implements AnimationFrameStrategy {\n  public requestAnimationFrame(callback: (time: number) => void): number {\n    return requestAnimationFrame(callback);\n  }\n\n  public cancelAnimationFrame(id: number): void {\n    cancelAnimationFrame(id);\n  }\n}\n\nclass NodeAnimationFrameStrategy implements AnimationFrameStrategy {\n  private _lastHandleId: number = 0;\n\n  private _lastImmediate: NodeJS.Immediate | null = null;\n\n  public requestAnimationFrame(callback: (time: number) => void): number {\n    if (this._lastHandleId >= Number.MAX_SAFE_INTEGER) {\n      this._lastHandleId = 0;\n    }\n\n    this._lastHandleId += 1;\n\n    this._lastImmediate = setImmediate(() => {\n      callback(Date.now());\n    });\n\n    return this._lastHandleId;\n  }\n\n  public cancelAnimationFrame(_id: number): void {\n    if (this._lastImmediate) {\n      clearImmediate(this._lastImmediate);\n    }\n  }\n}\n\nexport class AnimationFrameManager {\n  private readonly _strategy: AnimationFrameStrategy;\n\n  public constructor() {\n    this._strategy =\n      typeof requestAnimationFrame === 'function' ? new WebAnimationFrameStrategy() : new NodeAnimationFrameStrategy();\n  }\n\n  public requestAnimationFrame(callback: (time: number) => void): number {\n    return this._strategy.requestAnimationFrame(callback);\n  }\n\n  public cancelAnimationFrame(id: number): void {\n    this._strategy.cancelAnimationFrame(id);\n  }\n}\n","export const IS_BROWSER = typeof window !== 'undefined' && typeof window.document !== 'undefined';\nexport const MS_TO_SEC_FACTOR = 1000;\nexport const DEFAULT_BG_COLOR = '#00000000';\nexport const ZIP_SIGNATURE = new Uint8Array([0x50, 0x4b, 0x03, 0x04]);\nexport const LOTTIE_JSON_MANDATORY_FIELDS = ['v', 'ip', 'op', 'layers', 'fr', 'w', 'h'];\n\n// These values are replace during the build process with the package version and name\nexport const PACKAGE_VERSION = '0.40.1';\nexport const PACKAGE_NAME = '@lottiefiles/dotlottie-web';\n\nexport const DEFAULT_DPR_FACTOR = 0.75;\n","var createDotLottiePlayerModule = (() => {\n  var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined;\n\n  return function (moduleArg = {}) {\n    var moduleRtn;\n\n    var k = moduleArg,\n      aa,\n      ba,\n      ea = new Promise((a, b) => {\n        aa = a;\n        ba = b;\n      }),\n      fa = Object.assign({}, k),\n      ha = './this.program',\n      p = '',\n      ia;\n    'undefined' != typeof document && document.currentScript && (p = document.currentScript.src);\n    _scriptName && (p = _scriptName);\n    p.startsWith('blob:') ? (p = '') : (p = p.substr(0, p.replace(/[?#].*/, '').lastIndexOf('/') + 1));\n    ia = (a) =>\n      fetch(a, { credentials: 'same-origin' }).then((b) =>\n        b.ok ? b.arrayBuffer() : Promise.reject(Error(b.status + ' : ' + b.url)),\n      );\n    var t = k.printErr || console.error.bind(console);\n    Object.assign(k, fa);\n    fa = null;\n    k.thisProgram && (ha = k.thisProgram);\n    var ja = k.wasmBinary,\n      ka,\n      la = !1,\n      ma,\n      w,\n      x,\n      y,\n      z,\n      C,\n      D,\n      na,\n      oa;\n    function pa() {\n      var a = ka.buffer;\n      k.HEAP8 = w = new Int8Array(a);\n      k.HEAP16 = y = new Int16Array(a);\n      k.HEAPU8 = x = new Uint8Array(a);\n      k.HEAPU16 = z = new Uint16Array(a);\n      k.HEAP32 = C = new Int32Array(a);\n      k.HEAPU32 = D = new Uint32Array(a);\n      k.HEAPF32 = na = new Float32Array(a);\n      k.HEAPF64 = oa = new Float64Array(a);\n    }\n    var qa = [],\n      ra = [],\n      sa = [];\n    function ta() {\n      var a = k.preRun.shift();\n      qa.unshift(a);\n    }\n    var F = 0,\n      ua = null,\n      G = null;\n    function va(a) {\n      k.onAbort?.(a);\n      a = 'Aborted(' + a + ')';\n      t(a);\n      la = !0;\n      a = new WebAssembly.RuntimeError(a + '. Build with -sASSERTIONS for more info.');\n      ba(a);\n      throw a;\n    }\n    var wa = (a) => a.startsWith('data:application/octet-stream;base64,'),\n      xa;\n    function ya(a) {\n      if (a == xa && ja) return new Uint8Array(ja);\n      throw 'both async and sync fetching of the wasm failed';\n    }\n    function za(a) {\n      return ja\n        ? Promise.resolve().then(() => ya(a))\n        : ia(a).then(\n            (b) => new Uint8Array(b),\n            () => ya(a),\n          );\n    }\n    function Aa(a, b, c) {\n      return za(a)\n        .then((d) => WebAssembly.instantiate(d, b))\n        .then(c, (d) => {\n          t(`failed to asynchronously prepare wasm: ${d}`);\n          va(d);\n        });\n    }\n    function Ba(a, b) {\n      var c = xa;\n      return ja || 'function' != typeof WebAssembly.instantiateStreaming || wa(c) || 'function' != typeof fetch\n        ? Aa(c, a, b)\n        : fetch(c, { credentials: 'same-origin' }).then((d) =>\n            WebAssembly.instantiateStreaming(d, a).then(b, function (e) {\n              t(`wasm streaming compile failed: ${e}`);\n              t('falling back to ArrayBuffer instantiation');\n              return Aa(c, a, b);\n            }),\n          );\n    }\n    class Ca {\n      name = 'ExitStatus';\n      constructor(a) {\n        this.message = `Program terminated with exit(${a})`;\n        this.status = a;\n      }\n    }\n    var Da = (a) => {\n        for (; 0 < a.length; ) a.shift()(k);\n      },\n      Ea = k.noExitRuntime || !0,\n      Fa = 'undefined' != typeof TextDecoder ? new TextDecoder() : void 0,\n      Ga = (a = 0, b = NaN) => {\n        var c = x,\n          d = a + b;\n        for (b = a; c[b] && !(b >= d); ) ++b;\n        if (16 < b - a && c.buffer && Fa) return Fa.decode(c.subarray(a, b));\n        for (d = ''; a < b; ) {\n          var e = c[a++];\n          if (e & 128) {\n            var f = c[a++] & 63;\n            if (192 == (e & 224)) d += String.fromCharCode(((e & 31) << 6) | f);\n            else {\n              var h = c[a++] & 63;\n              e =\n                224 == (e & 240)\n                  ? ((e & 15) << 12) | (f << 6) | h\n                  : ((e & 7) << 18) | (f << 12) | (h << 6) | (c[a++] & 63);\n              65536 > e\n                ? (d += String.fromCharCode(e))\n                : ((e -= 65536), (d += String.fromCharCode(55296 | (e >> 10), 56320 | (e & 1023))));\n            }\n          } else d += String.fromCharCode(e);\n        }\n        return d;\n      };\n    class Ha {\n      constructor(a) {\n        this.va = a - 24;\n      }\n    }\n    var Ia = 0,\n      Ja = 0,\n      H = (a, b, c) => {\n        var d = x;\n        if (0 < c) {\n          c = b + c - 1;\n          for (var e = 0; e < a.length; ++e) {\n            var f = a.charCodeAt(e);\n            if (55296 <= f && 57343 >= f) {\n              var h = a.charCodeAt(++e);\n              f = (65536 + ((f & 1023) << 10)) | (h & 1023);\n            }\n            if (127 >= f) {\n              if (b >= c) break;\n              d[b++] = f;\n            } else {\n              if (2047 >= f) {\n                if (b + 1 >= c) break;\n                d[b++] = 192 | (f >> 6);\n              } else {\n                if (65535 >= f) {\n                  if (b + 2 >= c) break;\n                  d[b++] = 224 | (f >> 12);\n                } else {\n                  if (b + 3 >= c) break;\n                  d[b++] = 240 | (f >> 18);\n                  d[b++] = 128 | ((f >> 12) & 63);\n                }\n                d[b++] = 128 | ((f >> 6) & 63);\n              }\n              d[b++] = 128 | (f & 63);\n            }\n          }\n          d[b] = 0;\n        }\n      },\n      Ka = {},\n      La = (a) => {\n        for (; a.length; ) {\n          var b = a.pop();\n          a.pop()(b);\n        }\n      };\n    function I(a) {\n      return this.fromWireType(D[a >> 2]);\n    }\n    var J = {},\n      K = {},\n      Ma = {},\n      L,\n      N = (a, b, c) => {\n        function d(g) {\n          g = c(g);\n          if (g.length !== a.length) throw new L('Mismatched type converter count');\n          for (var l = 0; l < a.length; ++l) M(a[l], g[l]);\n        }\n        a.forEach((g) => (Ma[g] = b));\n        var e = Array(b.length),\n          f = [],\n          h = 0;\n        b.forEach((g, l) => {\n          K.hasOwnProperty(g)\n            ? (e[l] = K[g])\n            : (f.push(g),\n              J.hasOwnProperty(g) || (J[g] = []),\n              J[g].push(() => {\n                e[l] = K[g];\n                ++h;\n                h === f.length && d(e);\n              }));\n        });\n        0 === f.length && d(e);\n      },\n      Na,\n      O = (a) => {\n        for (var b = ''; x[a]; ) b += Na[x[a++]];\n        return b;\n      },\n      P;\n    function Pa(a, b, c = {}) {\n      var d = b.name;\n      if (!a) throw new P(`type \"${d}\" must have a positive integer typeid pointer`);\n      if (K.hasOwnProperty(a)) {\n        if (c.$a) return;\n        throw new P(`Cannot register type '${d}' twice`);\n      }\n      K[a] = b;\n      delete Ma[a];\n      J.hasOwnProperty(a) && ((b = J[a]), delete J[a], b.forEach((e) => e()));\n    }\n    function M(a, b, c = {}) {\n      return Pa(a, b, c);\n    }\n    var Qa = (a) => {\n        throw new P(a.ta.wa.ua.name + ' instance already deleted');\n      },\n      Ra = !1,\n      Sa = () => {},\n      Ta = (a, b, c) => {\n        if (b === c) return a;\n        if (void 0 === c.za) return null;\n        a = Ta(a, b, c.za);\n        return null === a ? null : c.Ta(a);\n      },\n      Ua = {},\n      Va = {},\n      Wa = (a, b) => {\n        if (void 0 === b) throw new P('ptr should not be undefined');\n        for (; a.za; ) (b = a.Ja(b)), (a = a.za);\n        return Va[b];\n      },\n      Xa = (a, b) => {\n        if (!b.wa || !b.va) throw new L('makeClassHandle requires ptr and ptrType');\n        if (!!b.Aa !== !!b.ya) throw new L('Both smartPtrType and smartPtr must be specified');\n        b.count = { value: 1 };\n        return Q(Object.create(a, { ta: { value: b, writable: !0 } }));\n      },\n      Q = (a) => {\n        if ('undefined' === typeof FinalizationRegistry) return (Q = (b) => b), a;\n        Ra = new FinalizationRegistry((b) => {\n          b = b.ta;\n          --b.count.value;\n          0 === b.count.value && (b.ya ? b.Aa.Da(b.ya) : b.wa.ua.Da(b.va));\n        });\n        Q = (b) => {\n          var c = b.ta;\n          c.ya && Ra.register(b, { ta: c }, b);\n          return b;\n        };\n        Sa = (b) => {\n          Ra.unregister(b);\n        };\n        return Q(a);\n      },\n      Ya = [];\n    function Za() {}\n    var R = (a, b) => Object.defineProperty(b, 'name', { value: a }),\n      $a = (a, b, c) => {\n        if (void 0 === a[b].xa) {\n          var d = a[b];\n          a[b] = function (...e) {\n            if (!a[b].xa.hasOwnProperty(e.length))\n              throw new P(\n                `Function '${c}' called with an invalid number of arguments (${e.length}) - expects one of (${a[b].xa})!`,\n              );\n            return a[b].xa[e.length].apply(this, e);\n          };\n          a[b].xa = [];\n          a[b].xa[d.Ga] = d;\n        }\n      },\n      ab = (a, b, c) => {\n        if (k.hasOwnProperty(a)) {\n          if (void 0 === c || (void 0 !== k[a].xa && void 0 !== k[a].xa[c]))\n            throw new P(`Cannot register public name '${a}' twice`);\n          $a(k, a, a);\n          if (k[a].xa.hasOwnProperty(c))\n            throw new P(`Cannot register multiple overloads of a function with the same number of arguments (${c})!`);\n          k[a].xa[c] = b;\n        } else (k[a] = b), (k[a].Ga = c);\n      },\n      bb = (a) => {\n        a = a.replace(/[^a-zA-Z0-9_]/g, '$');\n        var b = a.charCodeAt(0);\n        return 48 <= b && 57 >= b ? `_${a}` : a;\n      };\n    function cb(a, b, c, d, e, f, h, g) {\n      this.name = a;\n      this.constructor = b;\n      this.Fa = c;\n      this.Da = d;\n      this.za = e;\n      this.Va = f;\n      this.Ja = h;\n      this.Ta = g;\n      this.bb = [];\n    }\n    var db = (a, b, c) => {\n      for (; b !== c; ) {\n        if (!b.Ja) throw new P(`Expected null or instance of ${c.name}, got an instance of ${b.name}`);\n        a = b.Ja(a);\n        b = b.za;\n      }\n      return a;\n    };\n    function eb(a, b) {\n      if (null === b) {\n        if (this.Ma) throw new P(`null is not a valid ${this.name}`);\n        return 0;\n      }\n      if (!b.ta) throw new P(`Cannot pass \"${fb(b)}\" as a ${this.name}`);\n      if (!b.ta.va) throw new P(`Cannot pass deleted object as a pointer of type ${this.name}`);\n      return db(b.ta.va, b.ta.wa.ua, this.ua);\n    }\n    function gb(a, b) {\n      if (null === b) {\n        if (this.Ma) throw new P(`null is not a valid ${this.name}`);\n        if (this.La) {\n          var c = this.Na();\n          null !== a && a.push(this.Da, c);\n          return c;\n        }\n        return 0;\n      }\n      if (!b || !b.ta) throw new P(`Cannot pass \"${fb(b)}\" as a ${this.name}`);\n      if (!b.ta.va) throw new P(`Cannot pass deleted object as a pointer of type ${this.name}`);\n      if (!this.Ka && b.ta.wa.Ka)\n        throw new P(\n          `Cannot convert argument of type ${b.ta.Aa ? b.ta.Aa.name : b.ta.wa.name} to parameter type ${this.name}`,\n        );\n      c = db(b.ta.va, b.ta.wa.ua, this.ua);\n      if (this.La) {\n        if (void 0 === b.ta.ya) throw new P('Passing raw pointer to smart pointer is illegal');\n        switch (this.hb) {\n          case 0:\n            if (b.ta.Aa === this) c = b.ta.ya;\n            else\n              throw new P(\n                `Cannot convert argument of type ${b.ta.Aa ? b.ta.Aa.name : b.ta.wa.name} to parameter type ${\n                  this.name\n                }`,\n              );\n            break;\n          case 1:\n            c = b.ta.ya;\n            break;\n          case 2:\n            if (b.ta.Aa === this) c = b.ta.ya;\n            else {\n              var d = b.clone();\n              c = this.cb(\n                c,\n                hb(() => d['delete']()),\n              );\n              null !== a && a.push(this.Da, c);\n            }\n            break;\n          default:\n            throw new P('Unsupporting sharing policy');\n        }\n      }\n      return c;\n    }\n    function ib(a, b) {\n      if (null === b) {\n        if (this.Ma) throw new P(`null is not a valid ${this.name}`);\n        return 0;\n      }\n      if (!b.ta) throw new P(`Cannot pass \"${fb(b)}\" as a ${this.name}`);\n      if (!b.ta.va) throw new P(`Cannot pass deleted object as a pointer of type ${this.name}`);\n      if (b.ta.wa.Ka) throw new P(`Cannot convert argument of type ${b.ta.wa.name} to parameter type ${this.name}`);\n      return db(b.ta.va, b.ta.wa.ua, this.ua);\n    }\n    function jb(a, b, c, d, e, f, h, g, l, m, n) {\n      this.name = a;\n      this.ua = b;\n      this.Ma = c;\n      this.Ka = d;\n      this.La = e;\n      this.ab = f;\n      this.hb = h;\n      this.Ra = g;\n      this.Na = l;\n      this.cb = m;\n      this.Da = n;\n      e || void 0 !== b.za ? (this.toWireType = gb) : ((this.toWireType = d ? eb : ib), (this.Ca = null));\n    }\n    var kb = (a, b, c) => {\n        if (!k.hasOwnProperty(a)) throw new L('Replacing nonexistent public symbol');\n        void 0 !== k[a].xa && void 0 !== c ? (k[a].xa[c] = b) : ((k[a] = b), (k[a].Ga = c));\n      },\n      S,\n      lb = (a, b, c = []) => {\n        a.includes('j') ? ((a = a.replace(/p/g, 'i')), (b = (0, k['dynCall_' + a])(b, ...c))) : (b = S.get(b)(...c));\n        return b;\n      },\n      mb =\n        (a, b) =>\n        (...c) =>\n          lb(a, b, c),\n      T = (a, b) => {\n        a = O(a);\n        var c = a.includes('j') ? mb(a, b) : S.get(b);\n        if ('function' != typeof c) throw new P(`unknown function pointer with signature ${a}: ${b}`);\n        return c;\n      },\n      nb,\n      pb = (a) => {\n        a = ob(a);\n        var b = O(a);\n        U(a);\n        return b;\n      },\n      qb = (a, b) => {\n        function c(f) {\n          e[f] || K[f] || (Ma[f] ? Ma[f].forEach(c) : (d.push(f), (e[f] = !0)));\n        }\n        var d = [],\n          e = {};\n        b.forEach(c);\n        throw new nb(`${a}: ` + d.map(pb).join([', ']));\n      },\n      rb = (a, b) => {\n        for (var c = [], d = 0; d < a; d++) c.push(D[(b + 4 * d) >> 2]);\n        return c;\n      };\n    function sb(a) {\n      for (var b = 1; b < a.length; ++b) if (null !== a[b] && void 0 === a[b].Ca) return !0;\n      return !1;\n    }\n    function tb(a, b, c, d, e) {\n      var f = b.length;\n      if (2 > f) throw new P(\"argTypes array size mismatch! Must at least get return value and 'this' types!\");\n      var h = null !== b[1] && null !== c,\n        g = sb(b),\n        l = 'void' !== b[0].name,\n        m = f - 2,\n        n = Array(m),\n        q = [],\n        r = [];\n      return R(a, function (...A) {\n        r.length = 0;\n        q.length = h ? 2 : 1;\n        q[0] = e;\n        if (h) {\n          var u = b[1].toWireType(r, this);\n          q[1] = u;\n        }\n        for (var v = 0; v < m; ++v) (n[v] = b[v + 2].toWireType(r, A[v])), q.push(n[v]);\n        A = d(...q);\n        if (g) La(r);\n        else\n          for (v = h ? 1 : 2; v < b.length; v++) {\n            var E = 1 === v ? u : n[v - 2];\n            null !== b[v].Ca && b[v].Ca(E);\n          }\n        u = l ? b[0].fromWireType(A) : void 0;\n        return u;\n      });\n    }\n    var ub = (a) => {\n        a = a.trim();\n        const b = a.indexOf('(');\n        return -1 !== b ? a.substr(0, b) : a;\n      },\n      vb = [],\n      V = [],\n      xb = (a) => {\n        9 < a && 0 === --V[a + 1] && ((V[a] = void 0), vb.push(a));\n      },\n      yb = (a) => {\n        if (!a) throw new P('Cannot use deleted val. handle = ' + a);\n        return V[a];\n      },\n      hb = (a) => {\n        switch (a) {\n          case void 0:\n            return 2;\n          case null:\n            return 4;\n          case !0:\n            return 6;\n          case !1:\n            return 8;\n          default:\n            const b = vb.pop() || V.length;\n            V[b] = a;\n            V[b + 1] = 1;\n            return b;\n        }\n      },\n      zb = {\n        name: 'emscripten::val',\n        fromWireType: (a) => {\n          var b = yb(a);\n          xb(a);\n          return b;\n        },\n        toWireType: (a, b) => hb(b),\n        Ba: 8,\n        readValueFromPointer: I,\n        Ca: null,\n      },\n      Ab = (a, b, c) => {\n        switch (b) {\n          case 1:\n            return c\n              ? function (d) {\n                  return this.fromWireType(w[d]);\n                }\n              : function (d) {\n                  return this.fromWireType(x[d]);\n                };\n          case 2:\n            return c\n              ? function (d) {\n                  return this.fromWireType(y[d >> 1]);\n                }\n              : function (d) {\n                  return this.fromWireType(z[d >> 1]);\n                };\n          case 4:\n            return c\n              ? function (d) {\n                  return this.fromWireType(C[d >> 2]);\n                }\n              : function (d) {\n                  return this.fromWireType(D[d >> 2]);\n                };\n          default:\n            throw new TypeError(`invalid integer width (${b}): ${a}`);\n        }\n      },\n      Bb = (a, b) => {\n        var c = K[a];\n        if (void 0 === c) throw ((a = `${b} has unknown type ${pb(a)}`), new P(a));\n        return c;\n      },\n      fb = (a) => {\n        if (null === a) return 'null';\n        var b = typeof a;\n        return 'object' === b || 'array' === b || 'function' === b ? a.toString() : '' + a;\n      },\n      Cb = (a, b) => {\n        switch (b) {\n          case 4:\n            return function (c) {\n              return this.fromWireType(na[c >> 2]);\n            };\n          case 8:\n            return function (c) {\n              return this.fromWireType(oa[c >> 3]);\n            };\n          default:\n            throw new TypeError(`invalid float width (${b}): ${a}`);\n        }\n      },\n      Db = (a, b, c) => {\n        switch (b) {\n          case 1:\n            return c ? (d) => w[d] : (d) => x[d];\n          case 2:\n            return c ? (d) => y[d >> 1] : (d) => z[d >> 1];\n          case 4:\n            return c ? (d) => C[d >> 2] : (d) => D[d >> 2];\n          default:\n            throw new TypeError(`invalid integer width (${b}): ${a}`);\n        }\n      },\n      Eb = Object.assign({ optional: !0 }, zb),\n      Fb = 'undefined' != typeof TextDecoder ? new TextDecoder('utf-16le') : void 0,\n      Gb = (a, b) => {\n        var c = a >> 1;\n        for (var d = c + b / 2; !(c >= d) && z[c]; ) ++c;\n        c <<= 1;\n        if (32 < c - a && Fb) return Fb.decode(x.subarray(a, c));\n        c = '';\n        for (d = 0; !(d >= b / 2); ++d) {\n          var e = y[(a + 2 * d) >> 1];\n          if (0 == e) break;\n          c += String.fromCharCode(e);\n        }\n        return c;\n      },\n      Hb = (a, b, c) => {\n        c ??= 2147483647;\n        if (2 > c) return 0;\n        c -= 2;\n        var d = b;\n        c = c < 2 * a.length ? c / 2 : a.length;\n        for (var e = 0; e < c; ++e) (y[b >> 1] = a.charCodeAt(e)), (b += 2);\n        y[b >> 1] = 0;\n        return b - d;\n      },\n      Ib = (a) => 2 * a.length,\n      Jb = (a, b) => {\n        for (var c = 0, d = ''; !(c >= b / 4); ) {\n          var e = C[(a + 4 * c) >> 2];\n          if (0 == e) break;\n          ++c;\n          65536 <= e\n            ? ((e -= 65536), (d += String.fromCharCode(55296 | (e >> 10), 56320 | (e & 1023))))\n            : (d += String.fromCharCode(e));\n        }\n        return d;\n      },\n      Kb = (a, b, c) => {\n        c ??= 2147483647;\n        if (4 > c) return 0;\n        var d = b;\n        c = d + c - 4;\n        for (var e = 0; e < a.length; ++e) {\n          var f = a.charCodeAt(e);\n          if (55296 <= f && 57343 >= f) {\n            var h = a.charCodeAt(++e);\n            f = (65536 + ((f & 1023) << 10)) | (h & 1023);\n          }\n          C[b >> 2] = f;\n          b += 4;\n          if (b + 4 > c) break;\n        }\n        C[b >> 2] = 0;\n        return b - d;\n      },\n      Lb = (a) => {\n        for (var b = 0, c = 0; c < a.length; ++c) {\n          var d = a.charCodeAt(c);\n          55296 <= d && 57343 >= d && ++c;\n          b += 4;\n        }\n        return b;\n      },\n      Mb = 0,\n      Nb = [],\n      Ob = (a) => {\n        var b = Nb.length;\n        Nb.push(a);\n        return b;\n      },\n      Pb = (a, b) => {\n        for (var c = Array(a), d = 0; d < a; ++d) c[d] = Bb(D[(b + 4 * d) >> 2], 'parameter ' + d);\n        return c;\n      },\n      Qb = Reflect.construct,\n      Rb = {},\n      Sb = (a) => {\n        if (!(a instanceof Ca || 'unwind' == a)) throw a;\n      },\n      Tb = (a) => {\n        ma = a;\n        Ea || 0 < Mb || (k.onExit?.(a), (la = !0));\n        throw new Ca(a);\n      },\n      Ub = (a) => {\n        if (!la)\n          try {\n            if ((a(), !(Ea || 0 < Mb)))\n              try {\n                (ma = a = ma), Tb(a);\n              } catch (b) {\n                Sb(b);\n              }\n          } catch (b) {\n            Sb(b);\n          }\n      },\n      Vb = {},\n      Xb = () => {\n        if (!Wb) {\n          var a = {\n              USER: 'web_user',\n              LOGNAME: 'web_user',\n              PATH: '/',\n              PWD: '/',\n              HOME: '/home/web_user',\n              LANG:\n                (('object' == typeof navigator && navigator.languages && navigator.languages[0]) || 'C').replace(\n                  '-',\n                  '_',\n                ) + '.UTF-8',\n              _: ha || './this.program',\n            },\n            b;\n          for (b in Vb) void 0 === Vb[b] ? delete a[b] : (a[b] = Vb[b]);\n          var c = [];\n          for (b in a) c.push(`${b}=${a[b]}`);\n          Wb = c;\n        }\n        return Wb;\n      },\n      Wb,\n      Yb = () => {\n        if ('object' == typeof crypto && 'function' == typeof crypto.getRandomValues)\n          return (a) => crypto.getRandomValues(a);\n        va('initRandomDevice');\n      },\n      Zb = (a) => (Zb = Yb())(a);\n    L = k.InternalError = class extends Error {\n      constructor(a) {\n        super(a);\n        this.name = 'InternalError';\n      }\n    };\n    for (var $b = Array(256), ac = 0; 256 > ac; ++ac) $b[ac] = String.fromCharCode(ac);\n    Na = $b;\n    P = k.BindingError = class extends Error {\n      constructor(a) {\n        super(a);\n        this.name = 'BindingError';\n      }\n    };\n    Object.assign(Za.prototype, {\n      isAliasOf: function (a) {\n        if (!(this instanceof Za && a instanceof Za)) return !1;\n        var b = this.ta.wa.ua,\n          c = this.ta.va;\n        a.ta = a.ta;\n        var d = a.ta.wa.ua;\n        for (a = a.ta.va; b.za; ) (c = b.Ja(c)), (b = b.za);\n        for (; d.za; ) (a = d.Ja(a)), (d = d.za);\n        return b === d && c === a;\n      },\n      clone: function () {\n        this.ta.va || Qa(this);\n        if (this.ta.Ia) return (this.ta.count.value += 1), this;\n        var a = Q,\n          b = Object,\n          c = b.create,\n          d = Object.getPrototypeOf(this),\n          e = this.ta;\n        a = a(\n          c.call(b, d, {\n            ta: { value: { count: e.count, Ha: e.Ha, Ia: e.Ia, va: e.va, wa: e.wa, ya: e.ya, Aa: e.Aa } },\n          }),\n        );\n        a.ta.count.value += 1;\n        a.ta.Ha = !1;\n        return a;\n      },\n      ['delete']() {\n        this.ta.va || Qa(this);\n        if (this.ta.Ha && !this.ta.Ia) throw new P('Object already scheduled for deletion');\n        Sa(this);\n        var a = this.ta;\n        --a.count.value;\n        0 === a.count.value && (a.ya ? a.Aa.Da(a.ya) : a.wa.ua.Da(a.va));\n        this.ta.Ia || ((this.ta.ya = void 0), (this.ta.va = void 0));\n      },\n      isDeleted: function () {\n        return !this.ta.va;\n      },\n      deleteLater: function () {\n        this.ta.va || Qa(this);\n        if (this.ta.Ha && !this.ta.Ia) throw new P('Object already scheduled for deletion');\n        Ya.push(this);\n        this.ta.Ha = !0;\n        return this;\n      },\n    });\n    Object.assign(jb.prototype, {\n      Wa(a) {\n        this.Ra && (a = this.Ra(a));\n        return a;\n      },\n      Pa(a) {\n        this.Da?.(a);\n      },\n      Ba: 8,\n      readValueFromPointer: I,\n      fromWireType: function (a) {\n        function b() {\n          return this.La\n            ? Xa(this.ua.Fa, { wa: this.ab, va: c, Aa: this, ya: a })\n            : Xa(this.ua.Fa, { wa: this, va: a });\n        }\n        var c = this.Wa(a);\n        if (!c) return this.Pa(a), null;\n        var d = Wa(this.ua, c);\n        if (void 0 !== d) {\n          if (0 === d.ta.count.value) return (d.ta.va = c), (d.ta.ya = a), d.clone();\n          d = d.clone();\n          this.Pa(a);\n          return d;\n        }\n        d = this.ua.Va(c);\n        d = Ua[d];\n        if (!d) return b.call(this);\n        d = this.Ka ? d.Sa : d.pointerType;\n        var e = Ta(c, this.ua, d.ua);\n        return null === e\n          ? b.call(this)\n          : this.La\n          ? Xa(d.ua.Fa, { wa: d, va: e, Aa: this, ya: a })\n          : Xa(d.ua.Fa, { wa: d, va: e });\n      },\n    });\n    nb = k.UnboundTypeError = ((a, b) => {\n      var c = R(b, function (d) {\n        this.name = b;\n        this.message = d;\n        d = Error(d).stack;\n        void 0 !== d && (this.stack = this.toString() + '\\n' + d.replace(/^Error(:[^\\n]*)?\\n/, ''));\n      });\n      c.prototype = Object.create(a.prototype);\n      c.prototype.constructor = c;\n      c.prototype.toString = function () {\n        return void 0 === this.message ? this.name : `${this.name}: ${this.message}`;\n      };\n      return c;\n    })(Error, 'UnboundTypeError');\n    V.push(0, 1, void 0, 1, null, 1, !0, 1, !1, 1);\n    k.count_emval_handles = () => V.length / 2 - 5 - vb.length;\n    var mc = {\n        c: (a, b, c, d) =>\n          va(\n            `Assertion failed: ${a ? Ga(a) : ''}, at: ` +\n              [b ? (b ? Ga(b) : '') : 'unknown filename', c, d ? (d ? Ga(d) : '') : 'unknown function'],\n          ),\n        m: (a, b, c) => {\n          var d = new Ha(a);\n          D[(d.va + 16) >> 2] = 0;\n          D[(d.va + 4) >> 2] = b;\n          D[(d.va + 8) >> 2] = c;\n          Ia = a;\n          Ja++;\n          throw Ia;\n        },\n        M: () => {},\n        J: () => {},\n        K: () => {},\n        O: function () {},\n        L: () => {},\n        Q: () => va(''),\n        v: (a) => {\n          var b = Ka[a];\n          delete Ka[a];\n          var c = b.Na,\n            d = b.Da,\n            e = b.Qa,\n            f = e.map((h) => h.Za).concat(e.map((h) => h.fb));\n          N([a], f, (h) => {\n            var g = {};\n            e.forEach((l, m) => {\n              var n = h[m],\n                q = l.Xa,\n                r = l.Ya,\n                A = h[m + e.length],\n                u = l.eb,\n                v = l.gb;\n              g[l.Ua] = {\n                read: (E) => n.fromWireType(q(r, E)),\n                write: (E, ca) => {\n                  var B = [];\n                  u(v, E, A.toWireType(B, ca));\n                  La(B);\n                },\n              };\n            });\n            return [\n              {\n                name: b.name,\n                fromWireType: (l) => {\n                  var m = {},\n                    n;\n                  for (n in g) m[n] = g[n].read(l);\n                  d(l);\n                  return m;\n                },\n                toWireType: (l, m) => {\n                  for (var n in g) if (!(n in m)) throw new TypeError(`Missing field: \"${n}\"`);\n                  var q = c();\n                  for (n in g) g[n].write(q, m[n]);\n                  null !== l && l.push(d, q);\n                  return q;\n                },\n                Ba: 8,\n                readValueFromPointer: I,\n                Ca: d,\n              },\n            ];\n          });\n        },\n        C: () => {},\n        V: (a, b, c, d) => {\n          b = O(b);\n          M(a, {\n            name: b,\n            fromWireType: function (e) {\n              return !!e;\n            },\n            toWireType: function (e, f) {\n              return f ? c : d;\n            },\n            Ba: 8,\n            readValueFromPointer: function (e) {\n              return this.fromWireType(x[e]);\n            },\n            Ca: null,\n          });\n        },\n        r: (a, b, c, d, e, f, h, g, l, m, n, q, r) => {\n          n = O(n);\n          f = T(e, f);\n          g &&= T(h, g);\n          m &&= T(l, m);\n          r = T(q, r);\n          var A = bb(n);\n          ab(A, function () {\n            qb(`Cannot construct ${n} due to unbound types`, [d]);\n          });\n          N([a, b, c], d ? [d] : [], (u) => {\n            u = u[0];\n            if (d) {\n              var v = u.ua;\n              var E = v.Fa;\n            } else E = Za.prototype;\n            u = R(n, function (...Oa) {\n              if (Object.getPrototypeOf(this) !== ca) throw new P(\"Use 'new' to construct \" + n);\n              if (void 0 === B.Ea) throw new P(n + ' has no accessible constructor');\n              var wb = B.Ea[Oa.length];\n              if (void 0 === wb)\n                throw new P(\n                  `Tried to invoke ctor of ${n} with invalid number of parameters (${\n                    Oa.length\n                  }) - expected (${Object.keys(B.Ea).toString()}) parameters instead!`,\n                );\n              return wb.apply(this, Oa);\n            });\n            var ca = Object.create(E, { constructor: { value: u } });\n            u.prototype = ca;\n            var B = new cb(n, u, ca, r, v, f, g, m);\n            if (B.za) {\n              var da;\n              (da = B.za).Oa ?? (da.Oa = []);\n              B.za.Oa.push(B);\n            }\n            v = new jb(n, B, !0, !1, !1);\n            da = new jb(n + '*', B, !1, !1, !1);\n            E = new jb(n + ' const*', B, !1, !0, !1);\n            Ua[a] = { pointerType: da, Sa: E };\n            kb(A, u);\n            return [v, da, E];\n          });\n        },\n        q: (a, b, c, d, e, f) => {\n          var h = rb(b, c);\n          e = T(d, e);\n          N([], [a], (g) => {\n            g = g[0];\n            var l = `constructor ${g.name}`;\n            void 0 === g.ua.Ea && (g.ua.Ea = []);\n            if (void 0 !== g.ua.Ea[b - 1])\n              throw new P(\n                `Cannot register multiple constructors with identical number of parameters (${b - 1}) for class '${\n                  g.name\n                }'! Overload resolution is currently only performed using the parameter count, not actual type info!`,\n              );\n            g.ua.Ea[b - 1] = () => {\n              qb(`Cannot construct ${g.name} due to unbound types`, h);\n            };\n            N([], h, (m) => {\n              m.splice(1, 0, null);\n              g.ua.Ea[b - 1] = tb(l, m, null, e, f);\n              return [];\n            });\n            return [];\n          });\n        },\n        f: (a, b, c, d, e, f, h, g) => {\n          var l = rb(c, d);\n          b = O(b);\n          b = ub(b);\n          f = T(e, f);\n          N([], [a], (m) => {\n            function n() {\n              qb(`Cannot call ${q} due to unbound types`, l);\n            }\n            m = m[0];\n            var q = `${m.name}.${b}`;\n            b.startsWith('@@') && (b = Symbol[b.substring(2)]);\n            g && m.ua.bb.push(b);\n            var r = m.ua.Fa,\n              A = r[b];\n            void 0 === A || (void 0 === A.xa && A.className !== m.name && A.Ga === c - 2)\n              ? ((n.Ga = c - 2), (n.className = m.name), (r[b] = n))\n              : ($a(r, b, q), (r[b].xa[c - 2] = n));\n            N([], l, (u) => {\n              u = tb(q, u, m, f, h);\n              void 0 === r[b].xa ? ((u.Ga = c - 2), (r[b] = u)) : (r[b].xa[c - 2] = u);\n              return [];\n            });\n            return [];\n          });\n        },\n        U: (a) => M(a, zb),\n        x: (a, b, c, d) => {\n          function e() {}\n          b = O(b);\n          e.values = {};\n          M(a, {\n            name: b,\n            constructor: e,\n            fromWireType: function (f) {\n              return this.constructor.values[f];\n            },\n            toWireType: (f, h) => h.value,\n            Ba: 8,\n            readValueFromPointer: Ab(b, c, d),\n            Ca: null,\n          });\n          ab(b, e);\n        },\n        k: (a, b, c) => {\n          var d = Bb(a, 'enum');\n          b = O(b);\n          a = d.constructor;\n          d = Object.create(d.constructor.prototype, {\n            value: { value: c },\n            constructor: { value: R(`${d.name}_${b}`, function () {}) },\n          });\n          a.values[c] = d;\n          a[b] = d;\n        },\n        z: (a, b, c) => {\n          b = O(b);\n          M(a, {\n            name: b,\n            fromWireType: (d) => d,\n            toWireType: (d, e) => e,\n            Ba: 8,\n            readValueFromPointer: Cb(b, c),\n            Ca: null,\n          });\n        },\n        u: (a, b, c, d, e, f) => {\n          var h = rb(b, c);\n          a = O(a);\n          a = ub(a);\n          e = T(d, e);\n          ab(\n            a,\n            function () {\n              qb(`Cannot call ${a} due to unbound types`, h);\n            },\n            b - 1,\n          );\n          N([], h, (g) => {\n            kb(a, tb(a, [g[0], null].concat(g.slice(1)), null, e, f), b - 1);\n            return [];\n          });\n        },\n        l: (a, b, c, d, e) => {\n          b = O(b);\n          -1 === e && (e = 4294967295);\n          e = (g) => g;\n          if (0 === d) {\n            var f = 32 - 8 * c;\n            e = (g) => (g << f) >>> f;\n          }\n          var h = b.includes('unsigned')\n            ? function (g, l) {\n                return l >>> 0;\n              }\n            : function (g, l) {\n                return l;\n              };\n          M(a, { name: b, fromWireType: e, toWireType: h, Ba: 8, readValueFromPointer: Db(b, c, 0 !== d), Ca: null });\n        },\n        h: (a, b, c) => {\n          function d(f) {\n            return new e(w.buffer, D[(f + 4) >> 2], D[f >> 2]);\n          }\n          var e = [Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array][\n            b\n          ];\n          c = O(c);\n          M(a, { name: c, fromWireType: d, Ba: 8, readValueFromPointer: d }, { $a: !0 });\n        },\n        t: (a) => {\n          M(a, Eb);\n        },\n        $: (a, b, c, d, e, f, h, g, l, m, n, q) => {\n          c = O(c);\n          f = T(e, f);\n          g = T(h, g);\n          m = T(l, m);\n          q = T(n, q);\n          N([a], [b], (r) => {\n            r = r[0];\n            return [new jb(c, r.ua, !1, !1, !0, r, d, f, g, m, q)];\n          });\n        },\n        A: (a, b) => {\n          b = O(b);\n          var c = 'std::string' === b;\n          M(a, {\n            name: b,\n            fromWireType: function (d) {\n              var e = D[d >> 2],\n                f = d + 4;\n              if (c)\n                for (var h = f, g = 0; g <= e; ++g) {\n                  var l = f + g;\n                  if (g == e || 0 == x[l]) {\n                    h = h ? Ga(h, l - h) : '';\n                    if (void 0 === m) var m = h;\n                    else (m += String.fromCharCode(0)), (m += h);\n                    h = l + 1;\n                  }\n                }\n              else {\n                m = Array(e);\n                for (g = 0; g < e; ++g) m[g] = String.fromCharCode(x[f + g]);\n                m = m.join('');\n              }\n              U(d);\n              return m;\n            },\n            toWireType: function (d, e) {\n              e instanceof ArrayBuffer && (e = new Uint8Array(e));\n              var f,\n                h = 'string' == typeof e;\n              if (!(h || e instanceof Uint8Array || e instanceof Uint8ClampedArray || e instanceof Int8Array))\n                throw new P('Cannot pass non-string to std::string');\n              if (c && h)\n                for (var g = (f = 0); g < e.length; ++g) {\n                  var l = e.charCodeAt(g);\n                  127 >= l ? f++ : 2047 >= l ? (f += 2) : 55296 <= l && 57343 >= l ? ((f += 4), ++g) : (f += 3);\n                }\n              else f = e.length;\n              g = bc(4 + f + 1);\n              l = g + 4;\n              D[g >> 2] = f;\n              if (c && h) H(e, l, f + 1);\n              else if (h)\n                for (h = 0; h < f; ++h) {\n                  var m = e.charCodeAt(h);\n                  if (255 < m) throw (U(l), new P('String has UTF-16 code units that do not fit in 8 bits'));\n                  x[l + h] = m;\n                }\n              else for (h = 0; h < f; ++h) x[l + h] = e[h];\n              null !== d && d.push(U, g);\n              return g;\n            },\n            Ba: 8,\n            readValueFromPointer: I,\n            Ca(d) {\n              U(d);\n            },\n          });\n        },\n        s: (a, b, c) => {\n          c = O(c);\n          if (2 === b) {\n            var d = Gb;\n            var e = Hb;\n            var f = Ib;\n            var h = (g) => z[g >> 1];\n          } else 4 === b && ((d = Jb), (e = Kb), (f = Lb), (h = (g) => D[g >> 2]));\n          M(a, {\n            name: c,\n            fromWireType: (g) => {\n              for (var l = D[g >> 2], m, n = g + 4, q = 0; q <= l; ++q) {\n                var r = g + 4 + q * b;\n                if (q == l || 0 == h(r))\n                  (n = d(n, r - n)), void 0 === m ? (m = n) : ((m += String.fromCharCode(0)), (m += n)), (n = r + b);\n              }\n              U(g);\n              return m;\n            },\n            toWireType: (g, l) => {\n              if ('string' != typeof l) throw new P(`Cannot pass non-string to C++ string type ${c}`);\n              var m = f(l),\n                n = bc(4 + m + b);\n              D[n >> 2] = m / b;\n              e(l, n + 4, m + b);\n              null !== g && g.push(U, n);\n              return n;\n            },\n            Ba: 8,\n            readValueFromPointer: I,\n            Ca(g) {\n              U(g);\n            },\n          });\n        },\n        w: (a, b, c, d, e, f) => {\n          Ka[a] = { name: O(b), Na: T(c, d), Da: T(e, f), Qa: [] };\n        },\n        j: (a, b, c, d, e, f, h, g, l, m) => {\n          Ka[a].Qa.push({ Ua: O(b), Za: c, Xa: T(d, e), Ya: f, fb: h, eb: T(g, l), gb: m });\n        },\n        W: (a, b) => {\n          b = O(b);\n          M(a, { ib: !0, name: b, Ba: 0, fromWireType: () => {}, toWireType: () => {} });\n        },\n        H: () => {\n          Ea = !1;\n          Mb = 0;\n        },\n        D: () => {\n          throw Infinity;\n        },\n        Z: (a, b, c, d) => {\n          a = Nb[a];\n          b = yb(b);\n          return a(null, b, c, d);\n        },\n        B: xb,\n        Y: (a, b, c) => {\n          var d = Pb(a, b),\n            e = d.shift();\n          a--;\n          var f = Array(a);\n          b = `methodCaller<(${d.map((h) => h.name).join(', ')}) => ${e.name}>`;\n          return Ob(\n            R(b, (h, g, l, m) => {\n              for (var n = 0, q = 0; q < a; ++q) (f[q] = d[q].readValueFromPointer(m + n)), (n += d[q].Ba);\n              g = 1 === c ? Qb(g, f) : g.apply(h, f);\n              h = [];\n              g = e.toWireType(h, g);\n              h.length && (D[l >> 2] = hb(h));\n              return g;\n            }),\n          );\n        },\n        _: (a) => {\n          9 < a && (V[a + 1] += 1);\n        },\n        X: (a) => {\n          var b = yb(a);\n          La(b);\n          xb(a);\n        },\n        o: (a, b) => {\n          a = Bb(a, '_emval_take_value');\n          a = a.readValueFromPointer(b);\n          return hb(a);\n        },\n        E: (a, b) => {\n          Rb[a] && (clearTimeout(Rb[a].id), delete Rb[a]);\n          if (!b) return 0;\n          var c = setTimeout(() => {\n            delete Rb[a];\n            Ub(() => cc(a, performance.now()));\n          }, b);\n          Rb[a] = { id: c, jb: b };\n          return 0;\n        },\n        F: (a, b, c, d) => {\n          var e = new Date().getFullYear(),\n            f = new Date(e, 0, 1).getTimezoneOffset();\n          e = new Date(e, 6, 1).getTimezoneOffset();\n          D[a >> 2] = 60 * Math.max(f, e);\n          C[b >> 2] = Number(f != e);\n          b = (h) => {\n            var g = Math.abs(h);\n            return `UTC${0 <= h ? '-' : '+'}${String(Math.floor(g / 60)).padStart(2, '0')}${String(g % 60).padStart(\n              2,\n              '0',\n            )}`;\n          };\n          a = b(f);\n          b = b(e);\n          e < f ? (H(a, c, 17), H(b, d, 17)) : (H(a, d, 17), H(b, c, 17));\n        },\n        aa: () => performance.now(),\n        G: (a) => {\n          var b = x.length;\n          a >>>= 0;\n          if (2147483648 < a) return !1;\n          for (var c = 1; 4 >= c; c *= 2) {\n            var d = b * (1 + 0.2 / c);\n            d = Math.min(d, a + 100663296);\n            a: {\n              d =\n                ((Math.min(2147483648, 65536 * Math.ceil(Math.max(a, d) / 65536)) - ka.buffer.byteLength + 65535) /\n                  65536) |\n                0;\n              try {\n                ka.grow(d);\n                pa();\n                var e = 1;\n                break a;\n              } catch (f) {}\n              e = void 0;\n            }\n            if (e) return !0;\n          }\n          return !1;\n        },\n        S: (a, b) => {\n          var c = 0;\n          Xb().forEach((d, e) => {\n            var f = b + c;\n            e = D[(a + 4 * e) >> 2] = f;\n            for (f = 0; f < d.length; ++f) w[e++] = d.charCodeAt(f);\n            w[e] = 0;\n            c += d.length + 1;\n          });\n          return 0;\n        },\n        T: (a, b) => {\n          var c = Xb();\n          D[a >> 2] = c.length;\n          var d = 0;\n          c.forEach((e) => (d += e.length + 1));\n          D[b >> 2] = d;\n          return 0;\n        },\n        P: () => 52,\n        N: () => 52,\n        i: dc,\n        d: ec,\n        e: fc,\n        p: gc,\n        y: hc,\n        b: ic,\n        a: jc,\n        g: kc,\n        n: lc,\n        R: Tb,\n        I: (a, b) => {\n          Zb(x.subarray(a, a + b));\n          return 0;\n        },\n      },\n      W = (function () {\n        function a(c) {\n          W = c.exports;\n          ka = W.ba;\n          pa();\n          S = W.fa;\n          ra.unshift(W.ca);\n          F--;\n          k.monitorRunDependencies?.(F);\n          0 == F && (null !== ua && (clearInterval(ua), (ua = null)), G && ((c = G), (G = null), c()));\n          return W;\n        }\n        F++;\n        k.monitorRunDependencies?.(F);\n        var b = { a: mc };\n        if (k.instantiateWasm)\n          try {\n            return k.instantiateWasm(b, a);\n          } catch (c) {\n            t(`Module.instantiateWasm callback failed with error: ${c}`), ba(c);\n          }\n        xa ??= wa('DotLottiePlayer.wasm')\n          ? 'DotLottiePlayer.wasm'\n          : k.locateFile\n          ? k.locateFile('DotLottiePlayer.wasm', p)\n          : p + 'DotLottiePlayer.wasm';\n        Ba(b, function (c) {\n          a(c.instance);\n        }).catch(ba);\n        return {};\n      })(),\n      bc = (a) => (bc = W.da)(a),\n      ob = (a) => (ob = W.ea)(a),\n      U = (a) => (U = W.ga)(a),\n      cc = (a, b) => (cc = W.ha)(a, b),\n      X = (a, b) => (X = W.ia)(a, b),\n      Y = (a) => (Y = W.ja)(a),\n      Z = () => (Z = W.ka)();\n    k.dynCall_iijj = (a, b, c, d, e, f) => (k.dynCall_iijj = W.la)(a, b, c, d, e, f);\n    k.dynCall_vijj = (a, b, c, d, e, f) => (k.dynCall_vijj = W.ma)(a, b, c, d, e, f);\n    k.dynCall_jiii = (a, b, c, d) => (k.dynCall_jiii = W.na)(a, b, c, d);\n    k.dynCall_jii = (a, b, c) => (k.dynCall_jii = W.oa)(a, b, c);\n    k.dynCall_viijii = (a, b, c, d, e, f, h) => (k.dynCall_viijii = W.pa)(a, b, c, d, e, f, h);\n    k.dynCall_iiiiij = (a, b, c, d, e, f, h) => (k.dynCall_iiiiij = W.qa)(a, b, c, d, e, f, h);\n    k.dynCall_iiiiijj = (a, b, c, d, e, f, h, g, l) => (k.dynCall_iiiiijj = W.ra)(a, b, c, d, e, f, h, g, l);\n    k.dynCall_iiiiiijj = (a, b, c, d, e, f, h, g, l, m) => (k.dynCall_iiiiiijj = W.sa)(a, b, c, d, e, f, h, g, l, m);\n    function jc(a, b, c) {\n      var d = Z();\n      try {\n        S.get(a)(b, c);\n      } catch (e) {\n        Y(d);\n        if (e !== e + 0) throw e;\n        X(1, 0);\n      }\n    }\n    function ic(a, b) {\n      var c = Z();\n      try {\n        S.get(a)(b);\n      } catch (d) {\n        Y(c);\n        if (d !== d + 0) throw d;\n        X(1, 0);\n      }\n    }\n    function fc(a, b, c, d) {\n      var e = Z();\n      try {\n        return S.get(a)(b, c, d);\n      } catch (f) {\n        Y(e);\n        if (f !== f + 0) throw f;\n        X(1, 0);\n      }\n    }\n    function ec(a, b, c) {\n      var d = Z();\n      try {\n        return S.get(a)(b, c);\n      } catch (e) {\n        Y(d);\n        if (e !== e + 0) throw e;\n        X(1, 0);\n      }\n    }\n    function dc(a, b) {\n      var c = Z();\n      try {\n        return S.get(a)(b);\n      } catch (d) {\n        Y(c);\n        if (d !== d + 0) throw d;\n        X(1, 0);\n      }\n    }\n    function gc(a, b, c, d, e, f) {\n      var h = Z();\n      try {\n        return S.get(a)(b, c, d, e, f);\n      } catch (g) {\n        Y(h);\n        if (g !== g + 0) throw g;\n        X(1, 0);\n      }\n    }\n    function lc(a, b, c, d, e) {\n      var f = Z();\n      try {\n        S.get(a)(b, c, d, e);\n      } catch (h) {\n        Y(f);\n        if (h !== h + 0) throw h;\n        X(1, 0);\n      }\n    }\n    function kc(a, b, c, d) {\n      var e = Z();\n      try {\n        S.get(a)(b, c, d);\n      } catch (f) {\n        Y(e);\n        if (f !== f + 0) throw f;\n        X(1, 0);\n      }\n    }\n    function hc(a) {\n      var b = Z();\n      try {\n        S.get(a)();\n      } catch (c) {\n        Y(b);\n        if (c !== c + 0) throw c;\n        X(1, 0);\n      }\n    }\n    var nc;\n    G = function oc() {\n      nc || pc();\n      nc || (G = oc);\n    };\n    function pc() {\n      function a() {\n        if (!nc && ((nc = !0), (k.calledRun = !0), !la)) {\n          Da(ra);\n          aa(k);\n          k.onRuntimeInitialized?.();\n          if (k.postRun)\n            for ('function' == typeof k.postRun && (k.postRun = [k.postRun]); k.postRun.length; ) {\n              var b = k.postRun.shift();\n              sa.unshift(b);\n            }\n          Da(sa);\n        }\n      }\n      if (!(0 < F)) {\n        if (k.preRun) for ('function' == typeof k.preRun && (k.preRun = [k.preRun]); k.preRun.length; ) ta();\n        Da(qa);\n        0 < F ||\n          (k.setStatus\n            ? (k.setStatus('Running...'),\n              setTimeout(() => {\n                setTimeout(() => k.setStatus(''), 1);\n                a();\n              }, 1))\n            : a());\n      }\n    }\n    if (k.preInit)\n      for ('function' == typeof k.preInit && (k.preInit = [k.preInit]); 0 < k.preInit.length; ) k.preInit.pop()();\n    pc();\n    moduleRtn = ea;\n\n    return moduleRtn;\n  };\n})();\nexport default createDotLottiePlayerModule;\n","import { PACKAGE_NAME, PACKAGE_VERSION } from '../constants';\n\nimport createDotLottiePlayerModule from './dotlottie-player';\nimport type { MainModule } from './dotlottie-player.types';\n\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nexport class DotLottieWasmLoader {\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  private static _ModulePromise: Promise<MainModule> | null = null;\n\n  // URL for the WASM file, constructed using package information\n  private static _wasmURL = `https://cdn.jsdelivr.net/npm/${PACKAGE_NAME}@${PACKAGE_VERSION}/dist/dotlottie-player.wasm`;\n\n  private constructor() {\n    throw new Error('RendererLoader is a static class and cannot be instantiated.');\n  }\n\n  private static async _tryLoad(url: string): Promise<MainModule> {\n    const module = await createDotLottiePlayerModule({ locateFile: () => url });\n\n    return module;\n  }\n\n  /**\n   * Tries to load the WASM module from the primary URL, falling back to a backup URL if necessary.\n   * Throws an error if both URLs fail to load the module.\n   * @returns Promise<Module> - A promise that resolves to the loaded module.\n   */\n  private static async _loadWithBackup(): Promise<MainModule> {\n    if (!this._ModulePromise) {\n      this._ModulePromise = this._tryLoad(this._wasmURL).catch(async (initialError): Promise<MainModule> => {\n        const backupUrl = `https://unpkg.com/${PACKAGE_NAME}@${PACKAGE_VERSION}/dist/dotlottie-player.wasm`;\n\n        console.warn(`Primary WASM load failed from ${this._wasmURL}. Error: ${(initialError as Error).message}`);\n        console.warn(`Attempting to load WASM from backup URL: ${backupUrl}`);\n\n        try {\n          return await this._tryLoad(backupUrl);\n        } catch (backupError) {\n          console.error(`Primary WASM URL failed: ${(initialError as Error).message}`);\n          console.error(`Backup WASM URL failed: ${(backupError as Error).message}`);\n          throw new Error('WASM loading failed from all sources.');\n        }\n      });\n    }\n\n    return this._ModulePromise;\n  }\n\n  /**\n   * Public method to load the WebAssembly module.\n   * Utilizes a primary and backup URL for robustness.\n   * @returns Promise<Module> - A promise that resolves to the loaded module.\n   */\n  public static async load(): Promise<MainModule> {\n    return this._loadWithBackup();\n  }\n\n  /**\n   * Sets a new URL for the WASM file and invalidates the current module promise.\n   *\n   * @param string -  The new URL for the WASM file.\n   */\n  public static setWasmUrl(url: string): void {\n    if (url === this._wasmURL) return;\n\n    this._wasmURL = url;\n    // Invalidate current module promise\n    this._ModulePromise = null;\n  }\n}\n","/**\n * Represents the different types of events that can be dispatched.\n */\nexport type EventType =\n  | 'complete'\n  | 'frame'\n  | 'load'\n  | 'loadError'\n  | 'loop'\n  | 'pause'\n  | 'play'\n  | 'stop'\n  | 'destroy'\n  | 'freeze'\n  | 'unfreeze'\n  | 'render'\n  | 'ready';\n\n/**\n * Maps an event type string to its respective event interface.\n */\ntype EventByType<T> = T extends 'complete'\n  ? CompleteEvent\n  : T extends 'frame'\n  ? FrameEvent\n  : T extends 'load'\n  ? LoadEvent\n  : T extends 'loadError'\n  ? LoadErrorEvent\n  : T extends 'loop'\n  ? LoopEvent\n  : T extends 'pause'\n  ? PauseEvent\n  : T extends 'play'\n  ? PlayEvent\n  : T extends 'stop'\n  ? StopEvent\n  : T extends 'destroy'\n  ? DestroyEvent\n  : T extends 'freeze'\n  ? FreezeEvent\n  : T extends 'unfreeze'\n  ? UnfreezeEvent\n  : T extends 'render'\n  ? RenderEvent\n  : T extends 'ready'\n  ? ReadyEvent\n  : never;\n\n/**\n * Base interface for all events.\n */\nexport interface BaseEvent {\n  type: EventType;\n}\n\nexport interface RenderEvent extends BaseEvent {\n  currentFrame: number;\n  type: 'render';\n}\n\nexport interface FreezeEvent extends BaseEvent {\n  type: 'freeze';\n}\n\nexport interface UnfreezeEvent extends BaseEvent {\n  type: 'unfreeze';\n}\n\n/*\n * Event fired when a destroy action occurs.\n */\nexport interface DestroyEvent extends BaseEvent {\n  type: 'destroy';\n}\n\n/**\n * Event fired when a loop action occurs.\n */\nexport interface LoopEvent extends BaseEvent {\n  loopCount: number;\n  type: 'loop';\n}\n\n/**\n * Event fired during frame changes.\n */\nexport interface FrameEvent extends BaseEvent {\n  currentFrame: number;\n  type: 'frame';\n}\n\n/**\n * Event fired when a load action occurs.\n */\nexport interface LoadEvent extends BaseEvent {\n  type: 'load';\n}\n\n/**\n * Event fired when a loading error occurs.\n */\nexport interface LoadErrorEvent extends BaseEvent {\n  error: Error;\n  type: 'loadError';\n}\n\n/**\n * Event fired when a completion action occurs.\n */\nexport interface CompleteEvent extends BaseEvent {\n  type: 'complete';\n}\n\n/**\n * Event fired when a pause action occurs.\n */\nexport interface PauseEvent extends BaseEvent {\n  type: 'pause';\n}\n\n/**\n * Event fired when a play action occurs.\n */\nexport interface PlayEvent extends BaseEvent {\n  type: 'play';\n}\n\n/**\n * Event fired when a stop action occurs.\n */\nexport interface StopEvent extends BaseEvent {\n  type: 'stop';\n}\n\n/**\n * Event fired when a WASM module is initialized and ready.\n */\nexport interface ReadyEvent extends BaseEvent {\n  type: 'ready';\n}\n\n/**\n * Type representing all possible event types.\n */\nexport type Event =\n  | LoopEvent\n  | FrameEvent\n  | LoadEvent\n  | LoadErrorEvent\n  | CompleteEvent\n  | PauseEvent\n  | PlayEvent\n  | StopEvent\n  | DestroyEvent\n  | FreezeEvent\n  | UnfreezeEvent\n  | RenderEvent\n  | ReadyEvent;\n\nexport interface EventListener<T extends EventType> {\n  (event: EventByType<T>): void;\n}\n\n/**\n * Manages registration and dispatching of event listeners.\n */\nexport class EventManager {\n  private readonly _eventListeners: Map<EventType, Set<EventListener<EventType>>> = new Map();\n\n  public addEventListener<T extends EventType>(type: T, listener: EventListener<T>): void {\n    let listeners = this._eventListeners.get(type);\n\n    if (!listeners) {\n      listeners = new Set<EventListener<T>>();\n      this._eventListeners.set(type, listeners);\n    }\n\n    listeners.add(listener);\n  }\n\n  public removeEventListener<T extends EventType>(type: T, listener?: EventListener<T>): void {\n    const listeners = this._eventListeners.get(type);\n\n    if (!listeners) return;\n\n    if (listener) {\n      listeners.delete(listener);\n\n      if (listeners.size === 0) {\n        this._eventListeners.delete(type);\n      }\n    } else {\n      this._eventListeners.delete(type);\n    }\n  }\n\n  public dispatch<T extends EventType>(event: EventByType<T>): void {\n    const listeners = this._eventListeners.get(event.type);\n\n    listeners?.forEach((listener) => listener(event));\n  }\n\n  public removeAllEventListeners(): void {\n    this._eventListeners.clear();\n  }\n}\n","import type { DotLottie } from './dotlottie';\nimport type { DotLottieWorker } from './worker/dotlottie';\n\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nexport class OffscreenObserver {\n  private static _observer: IntersectionObserver | null = null;\n\n  private static readonly _observedCanvases = new Map<HTMLCanvasElement, DotLottie | DotLottieWorker>();\n\n  private static _initializeObserver(): void {\n    if (this._observer) return;\n\n    const intersectionObserverCallback = (entries: IntersectionObserverEntry[]): void => {\n      entries.forEach((entry) => {\n        const instance = this._observedCanvases.get(entry.target as HTMLCanvasElement);\n\n        if (instance) {\n          if (entry.isIntersecting) {\n            instance.unfreeze();\n          } else {\n            instance.freeze();\n          }\n        }\n      });\n    };\n\n    this._observer = new IntersectionObserver(intersectionObserverCallback, {\n      threshold: 0,\n    });\n  }\n\n  public static observe(canvas: HTMLCanvasElement, dotLottieInstance: DotLottie | DotLottieWorker): void {\n    this._initializeObserver();\n\n    if (this._observedCanvases.has(canvas)) return;\n\n    this._observedCanvases.set(canvas, dotLottieInstance);\n    this._observer?.observe(canvas);\n  }\n\n  public static unobserve(canvas: HTMLCanvasElement): void {\n    this._observer?.unobserve(canvas);\n    this._observedCanvases.delete(canvas);\n\n    if (this._observedCanvases.size === 0) {\n      this._observer?.disconnect();\n      this._observer = null;\n    }\n  }\n}\n","import type { DotLottie } from './dotlottie';\nimport type { DotLottieWorker } from './worker/dotlottie';\n\nexport const RESIZE_DEBOUNCE_TIME = 100;\n\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nexport class CanvasResizeObserver {\n  private static _observer: ResizeObserver | null = null;\n\n  private static readonly _observedCanvases = new Map<HTMLCanvasElement, [DotLottie | DotLottieWorker, number]>();\n\n  private static _initializeObserver(): void {\n    if (this._observer) return;\n\n    const resizeHandler = (entries: ResizeObserverEntry[]): void => {\n      entries.forEach((entry) => {\n        const element = this._observedCanvases.get(entry.target as HTMLCanvasElement);\n\n        if (!element) return;\n\n        const [dotLottieInstance, timeout] = element;\n\n        clearTimeout(timeout);\n\n        const newTimeout = setTimeout(() => {\n          dotLottieInstance.resize();\n        }, RESIZE_DEBOUNCE_TIME) as unknown as number;\n\n        this._observedCanvases.set(entry.target as HTMLCanvasElement, [dotLottieInstance, newTimeout]);\n      });\n    };\n\n    this._observer = new ResizeObserver(resizeHandler);\n  }\n\n  public static observe(canvas: HTMLCanvasElement, dotLottieInstance: DotLottie | DotLottieWorker): void {\n    this._initializeObserver();\n\n    if (this._observedCanvases.has(canvas)) return;\n\n    this._observedCanvases.set(canvas, [dotLottieInstance, 0]);\n    this._observer?.observe(canvas);\n  }\n\n  public static unobserve(canvas: HTMLCanvasElement): void {\n    this._observer?.unobserve(canvas);\n    this._observedCanvases.delete(canvas);\n\n    if (this._observedCanvases.size === 0) {\n      this._observer?.disconnect();\n      this._observer = null;\n    }\n  }\n}\n","import { DEFAULT_DPR_FACTOR, IS_BROWSER, LOTTIE_JSON_MANDATORY_FIELDS, ZIP_SIGNATURE } from './constants';\n\nexport function isHexColor(color: string): boolean {\n  return /^#([\\da-f]{6}|[\\da-f]{8})$/iu.test(color);\n}\n\nexport function hexStringToRGBAInt(colorHex: string): number {\n  if (!isHexColor(colorHex)) {\n    return 0;\n  }\n\n  let hex = colorHex.replace('#', '');\n\n  // Add alpha if it's not included\n  hex = hex.length === 6 ? `${hex}ff` : hex;\n\n  return parseInt(hex, 16);\n}\n\nexport function isDotLottie(fileData: ArrayBuffer): boolean {\n  if (fileData.byteLength < 4) {\n    return false;\n  }\n\n  const fileSignature = new Uint8Array(fileData.slice(0, ZIP_SIGNATURE.byteLength));\n\n  for (let i = 0; i < ZIP_SIGNATURE.length; i += 1) {\n    if (ZIP_SIGNATURE[i] !== fileSignature[i]) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\n/**\n * Returns whether the given object looks like a valid Lottie JSON structure.\n */\nexport function isLottieJSON(json: Record<string, unknown>): boolean {\n  return LOTTIE_JSON_MANDATORY_FIELDS.every((field) => Object.prototype.hasOwnProperty.call(json, field));\n}\n\nexport function isLottie(fileData: string | Record<string, unknown>): boolean {\n  if (typeof fileData === 'string') {\n    try {\n      return isLottieJSON(JSON.parse(fileData));\n    } catch (_e) {\n      return false;\n    }\n  } else {\n    return isLottieJSON(fileData);\n  }\n}\n\nexport function getDefaultDPR(): number {\n  const dpr = IS_BROWSER ? window.devicePixelRatio : 1;\n\n  return 1 + (dpr - 1) * DEFAULT_DPR_FACTOR;\n}\n\nexport function isElementInViewport(element: HTMLElement): boolean {\n  const rect = element.getBoundingClientRect();\n\n  return (\n    rect.top >= 0 &&\n    rect.left >= 0 &&\n    rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\n    rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n  );\n}\n","import { AnimationFrameManager } from './animation-frame-manager';\nimport { IS_BROWSER } from './constants';\nimport type { DotLottiePlayer, MainModule, Mode as CoreMode, VectorFloat, Marker, Fit as CoreFit } from './core';\nimport { DotLottieWasmLoader } from './core';\nimport type { EventListener, EventType } from './event-manager';\nimport { EventManager } from './event-manager';\nimport { OffscreenObserver } from './offscreen-observer';\nimport { CanvasResizeObserver } from './resize-observer';\nimport type { Mode, Fit, Config, Layout, Manifest, RenderConfig, Data } from './types';\nimport { getDefaultDPR, hexStringToRGBAInt, isDotLottie, isElementInViewport, isLottie } from './utils';\n\nconst createCoreMode = (mode: Mode, module: MainModule): CoreMode => {\n  if (mode === 'reverse') {\n    return module.Mode.Reverse;\n  } else if (mode === 'bounce') {\n    return module.Mode.Bounce;\n  } else if (mode === 'reverse-bounce') {\n    return module.Mode.ReverseBounce;\n  } else {\n    return module.Mode.Forward;\n  }\n};\n\nconst createCoreFit = (fit: Fit, module: MainModule): CoreFit => {\n  if (fit === 'contain') {\n    return module.Fit.Contain;\n  } else if (fit === 'cover') {\n    return module.Fit.Cover;\n  } else if (fit === 'fill') {\n    return module.Fit.Fill;\n  } else if (fit === 'fit-height') {\n    return module.Fit.FitHeight;\n  } else if (fit === 'fit-width') {\n    return module.Fit.FitWidth;\n  } else {\n    return module.Fit.None;\n  }\n};\n\nconst createCoreAlign = (align: [number, number], module: MainModule): VectorFloat => {\n  const coreAlign = new module.VectorFloat();\n\n  coreAlign.push_back(align[0]);\n  coreAlign.push_back(align[1]);\n\n  return coreAlign;\n};\n\nconst createCoreSegment = (segment: number[], module: MainModule): VectorFloat => {\n  const coresegment = new module.VectorFloat();\n\n  if (segment.length !== 2) return coresegment;\n\n  coresegment.push_back(segment[0] as number);\n  coresegment.push_back(segment[1] as number);\n\n  return coresegment;\n};\n\nexport class DotLottie {\n  private readonly _canvas: HTMLCanvasElement | OffscreenCanvas;\n\n  private _context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null = null;\n\n  private readonly _eventManager: EventManager;\n\n  private _animationFrameId: number | null = null;\n\n  private readonly _frameManager: AnimationFrameManager;\n\n  private _dotLottieCore: DotLottiePlayer | null = null;\n\n  private static _wasmModule: MainModule | null = null;\n\n  private _renderConfig: RenderConfig = {};\n\n  private _isFrozen: boolean = false;\n\n  private _backgroundColor: string | null = null;\n\n  private readonly _pointerUpMethod: (event: PointerEvent) => void;\n\n  private readonly _pointerDownMethod: (event: PointerEvent) => void;\n\n  private readonly _pointerMoveMethod: (event: PointerEvent) => void;\n\n  private readonly _pointerEnterMethod: (event: PointerEvent) => void;\n\n  private readonly _pointerExitMethod: (event: PointerEvent) => void;\n\n  public constructor(config: Config) {\n    this._canvas = config.canvas;\n    this._context = this._canvas.getContext('2d');\n\n    this._eventManager = new EventManager();\n    this._frameManager = new AnimationFrameManager();\n    this._renderConfig = {\n      ...config.renderConfig,\n      devicePixelRatio: config.renderConfig?.devicePixelRatio || getDefaultDPR(),\n      // freezeOnOffscreen is true by default to prevent unnecessary rendering when the canvas is offscreen\n      freezeOnOffscreen: config.renderConfig?.freezeOnOffscreen ?? true,\n    };\n\n    DotLottieWasmLoader.load()\n      .then((module) => {\n        DotLottie._wasmModule = module;\n\n        this._dotLottieCore = new module.DotLottiePlayer({\n          themeId: config.themeId ?? '',\n          autoplay: config.autoplay ?? false,\n          backgroundColor: 0,\n          loopAnimation: config.loop ?? false,\n          mode: createCoreMode(config.mode ?? 'forward', module),\n          segment: createCoreSegment(config.segment ?? [], module),\n          speed: config.speed ?? 1,\n          useFrameInterpolation: config.useFrameInterpolation ?? true,\n          marker: config.marker ?? '',\n          layout: config.layout\n            ? {\n                align: createCoreAlign(config.layout.align, module),\n                fit: createCoreFit(config.layout.fit, module),\n              }\n            : module.createDefaultLayout(),\n        });\n\n        this._eventManager.dispatch({ type: 'ready' });\n\n        if (config.data) {\n          this._loadFromData(config.data);\n        } else if (config.src) {\n          this._loadFromSrc(config.src);\n        }\n\n        if (config.backgroundColor) {\n          this.setBackgroundColor(config.backgroundColor);\n        }\n      })\n      .catch((error) => {\n        this._eventManager.dispatch({\n          type: 'loadError',\n          error: new Error(`Failed to load wasm module: ${error}`),\n        });\n      });\n\n    this._pointerUpMethod = this._onPointerUp.bind(this);\n\n    this._pointerDownMethod = this._onPointerDown.bind(this);\n\n    this._pointerMoveMethod = this._onPointerMove.bind(this);\n\n    this._pointerEnterMethod = this._onPointerEnter.bind(this);\n\n    this._pointerExitMethod = this._onPointerLeave.bind(this);\n  }\n\n  private _dispatchError(message: string): void {\n    console.error(message);\n    this._eventManager.dispatch({ type: 'loadError', error: new Error(message) });\n  }\n\n  private async _fetchData(src: string): Promise<string | ArrayBuffer> {\n    const response = await fetch(src);\n\n    if (!response.ok) {\n      throw new Error(`Failed to fetch animation data from URL: ${src}. ${response.status}: ${response.statusText}`);\n    }\n\n    const data = await response.arrayBuffer();\n\n    if (isDotLottie(data)) {\n      return data;\n    }\n\n    // eslint-disable-next-line node/no-unsupported-features/node-builtins\n    return new TextDecoder().decode(data);\n  }\n\n  private _loadFromData(data: Data): void {\n    if (this._dotLottieCore === null) return;\n\n    const width = this._canvas.width;\n    const height = this._canvas.height;\n\n    let loaded = false;\n\n    if (typeof data === 'string') {\n      if (!isLottie(data)) {\n        this._dispatchError(\n          'Invalid Lottie JSON string: The provided string does not conform to the Lottie JSON format.',\n        );\n\n        return;\n      }\n      loaded = this._dotLottieCore.loadAnimationData(data, width, height);\n    } else if (data instanceof ArrayBuffer) {\n      if (!isDotLottie(data)) {\n        this._dispatchError(\n          'Invalid dotLottie ArrayBuffer: The provided ArrayBuffer does not conform to the dotLottie format.',\n        );\n\n        return;\n      }\n      loaded = this._dotLottieCore.loadDotLottieData(data, width, height);\n    } else if (typeof data === 'object') {\n      if (!isLottie(data as Record<string, unknown>)) {\n        this._dispatchError(\n          'Invalid Lottie JSON object: The provided object does not conform to the Lottie JSON format.',\n        );\n\n        return;\n      }\n      loaded = this._dotLottieCore.loadAnimationData(JSON.stringify(data), width, height);\n    } else {\n      this._dispatchError(\n        `Unsupported data type for animation data. Expected: \n          - string (Lottie JSON),\n          - ArrayBuffer (dotLottie),\n          - object (Lottie JSON). \n          Received: ${typeof data}`,\n      );\n\n      return;\n    }\n\n    if (loaded) {\n      this._eventManager.dispatch({ type: 'load' });\n\n      if (IS_BROWSER) {\n        this.resize();\n      }\n\n      this._eventManager.dispatch({\n        type: 'frame',\n        currentFrame: this.currentFrame,\n      });\n\n      this._render();\n\n      if (this._dotLottieCore.config().autoplay) {\n        this._dotLottieCore.play();\n        if (this._dotLottieCore.isPlaying()) {\n          this._eventManager.dispatch({ type: 'play' });\n          this._animationFrameId = this._frameManager.requestAnimationFrame(this._draw.bind(this));\n        } else {\n          console.error('something went wrong, the animation was suppose to autoplay');\n        }\n      }\n\n      if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n        if (this._renderConfig.freezeOnOffscreen) {\n          OffscreenObserver.observe(this._canvas, this);\n        }\n\n        if (this._renderConfig.autoResize) {\n          CanvasResizeObserver.observe(this._canvas, this);\n        }\n      }\n    } else {\n      this._dispatchError('Failed to load animation data');\n    }\n  }\n\n  private _loadFromSrc(src: string): void {\n    this._fetchData(src)\n      .then((data) => this._loadFromData(data))\n      .catch((error) => this._dispatchError(`Failed to load animation data from URL: ${src}. ${error}`));\n  }\n\n  public get activeAnimationId(): string | undefined {\n    return this._dotLottieCore?.activeAnimationId();\n  }\n\n  public get activeThemeId(): string | undefined {\n    return this._dotLottieCore?.activeThemeId();\n  }\n\n  public get layout(): Layout | undefined {\n    const layout = this._dotLottieCore?.config().layout;\n\n    if (layout) {\n      return {\n        align: [layout.align.get(0) as number, layout.align.get(1) as number],\n        fit: ((): Fit => {\n          switch (layout.fit) {\n            case DotLottie._wasmModule?.Fit.Contain:\n              return 'contain';\n\n            case DotLottie._wasmModule?.Fit.Cover:\n              return 'cover';\n\n            case DotLottie._wasmModule?.Fit.Fill:\n              return 'fill';\n\n            case DotLottie._wasmModule?.Fit.FitHeight:\n              return 'fit-height';\n\n            case DotLottie._wasmModule?.Fit.FitWidth:\n              return 'fit-width';\n\n            case DotLottie._wasmModule?.Fit.None:\n              return 'none';\n\n            default:\n              return 'contain';\n          }\n        })(),\n      };\n    }\n\n    return undefined;\n  }\n\n  public get marker(): string | undefined {\n    const marker = this._dotLottieCore?.config().marker as string | undefined;\n\n    return marker;\n  }\n\n  public get manifest(): Manifest | null {\n    try {\n      const manifest = this._dotLottieCore?.manifestString();\n\n      if (this._dotLottieCore === null || !manifest) return null;\n\n      const manifestJson = JSON.parse(manifest);\n\n      if (Object.keys(manifestJson).length === 0) return null;\n\n      return manifestJson as Manifest;\n    } catch (_err) {\n      return null;\n    }\n  }\n\n  public get renderConfig(): RenderConfig {\n    return this._renderConfig;\n  }\n\n  public get segment(): [number, number] | undefined {\n    const segment = this._dotLottieCore?.config().segment;\n\n    if (segment && segment.size() === 2) {\n      return [segment.get(0) as number, segment.get(1) as number];\n    }\n\n    return undefined;\n  }\n\n  public get loop(): boolean {\n    return this._dotLottieCore?.config().loopAnimation ?? false;\n  }\n\n  public get mode(): Mode {\n    const mode = this._dotLottieCore?.config().mode;\n\n    if (mode === DotLottie._wasmModule?.Mode.Reverse) {\n      return 'reverse';\n    } else if (mode === DotLottie._wasmModule?.Mode.Bounce) {\n      return 'bounce';\n    } else if (mode === DotLottie._wasmModule?.Mode.ReverseBounce) {\n      return 'reverse-bounce';\n    } else {\n      return 'forward';\n    }\n  }\n\n  public get isFrozen(): boolean {\n    return this._isFrozen;\n  }\n\n  public get backgroundColor(): string {\n    return this._backgroundColor ?? '';\n  }\n\n  public get autoplay(): boolean {\n    return this._dotLottieCore?.config().autoplay ?? false;\n  }\n\n  public get useFrameInterpolation(): boolean {\n    return this._dotLottieCore?.config().useFrameInterpolation ?? false;\n  }\n\n  public get speed(): number {\n    return this._dotLottieCore?.config().speed ?? 0;\n  }\n\n  public get isReady(): boolean {\n    return this._dotLottieCore !== null;\n  }\n\n  public get isLoaded(): boolean {\n    return this._dotLottieCore?.isLoaded() ?? false;\n  }\n\n  public get isPlaying(): boolean {\n    return this._dotLottieCore?.isPlaying() ?? false;\n  }\n\n  public get isPaused(): boolean {\n    return this._dotLottieCore?.isPaused() ?? false;\n  }\n\n  public get isStopped(): boolean {\n    return this._dotLottieCore?.isStopped() ?? false;\n  }\n\n  public get currentFrame(): number {\n    if (!this._dotLottieCore) return 0;\n\n    return Math.round(this._dotLottieCore.currentFrame() * 100) / 100;\n  }\n\n  public get loopCount(): number {\n    return this._dotLottieCore?.loopCount() ?? 0;\n  }\n\n  public get totalFrames(): number {\n    return this._dotLottieCore?.totalFrames() ?? 0;\n  }\n\n  public get duration(): number {\n    return this._dotLottieCore?.duration() ?? 0;\n  }\n\n  public get segmentDuration(): number {\n    return this._dotLottieCore?.segmentDuration() ?? 0;\n  }\n\n  public get canvas(): HTMLCanvasElement | OffscreenCanvas {\n    return this._canvas;\n  }\n\n  public load(config: Omit<Config, 'canvas'>): void {\n    if (this._dotLottieCore === null || DotLottie._wasmModule === null) return;\n\n    if (this._animationFrameId !== null) {\n      this._frameManager.cancelAnimationFrame(this._animationFrameId);\n      this._animationFrameId = null;\n    }\n\n    this._dotLottieCore.setConfig({\n      themeId: config.themeId ?? '',\n      autoplay: config.autoplay ?? false,\n      backgroundColor: 0,\n      loopAnimation: config.loop ?? false,\n      mode: createCoreMode(config.mode ?? 'forward', DotLottie._wasmModule),\n      segment: createCoreSegment(config.segment ?? [], DotLottie._wasmModule),\n      speed: config.speed ?? 1,\n      useFrameInterpolation: config.useFrameInterpolation ?? true,\n      marker: config.marker ?? '',\n      layout: config.layout\n        ? {\n            align: createCoreAlign(config.layout.align, DotLottie._wasmModule),\n            fit: createCoreFit(config.layout.fit, DotLottie._wasmModule),\n          }\n        : DotLottie._wasmModule.createDefaultLayout(),\n    });\n\n    if (config.data) {\n      this._loadFromData(config.data);\n    } else if (config.src) {\n      this._loadFromSrc(config.src);\n    }\n\n    this.setBackgroundColor(config.backgroundColor ?? '');\n  }\n\n  private _render(): boolean {\n    if (this._dotLottieCore === null || this._context === null) return false;\n\n    const rendered = this._dotLottieCore.render();\n\n    if (rendered) {\n      const buffer = this._dotLottieCore.buffer() as Uint8Array;\n      const clampedBuffer = new Uint8ClampedArray(buffer, 0, this._canvas.width * this._canvas.height * 4);\n\n      let imageData = null;\n\n      /* \n        In Node.js, the ImageData constructor is not available. \n        You can use createImageData function in the canvas context to create ImageData object.\n      */\n      if (typeof ImageData === 'undefined') {\n        imageData = this._context.createImageData(this._canvas.width, this._canvas.height);\n        imageData.data.set(clampedBuffer);\n      } else {\n        imageData = new ImageData(clampedBuffer, this._canvas.width, this._canvas.height);\n      }\n\n      this._context.putImageData(imageData, 0, 0);\n\n      this._eventManager.dispatch({\n        type: 'render',\n        currentFrame: this.currentFrame,\n      });\n\n      return true;\n    }\n\n    return false;\n  }\n\n  private _draw(): void {\n    if (this._dotLottieCore === null || this._context === null || !this._dotLottieCore.isPlaying()) return;\n\n    const nextFrame = Math.round(this._dotLottieCore.requestFrame() * 100) / 100;\n\n    const updated = this._dotLottieCore.setFrame(nextFrame);\n\n    if (updated) {\n      this._eventManager.dispatch({\n        type: 'frame',\n        currentFrame: this.currentFrame,\n      });\n\n      const rendered = this._render();\n\n      if (rendered) {\n        // handle loop or complete\n        if (this._dotLottieCore.isComplete()) {\n          if (this._dotLottieCore.config().loopAnimation) {\n            this._eventManager.dispatch({\n              type: 'loop',\n              loopCount: this._dotLottieCore.loopCount(),\n            });\n          } else {\n            this._eventManager.dispatch({ type: 'complete' });\n          }\n        }\n      }\n    }\n\n    this._animationFrameId = this._frameManager.requestAnimationFrame(this._draw.bind(this));\n  }\n\n  public play(): void {\n    if (this._dotLottieCore === null) return;\n\n    const ok = this._dotLottieCore.play();\n\n    if (ok || this._dotLottieCore.isPlaying()) {\n      this._isFrozen = false;\n      this._eventManager.dispatch({ type: 'play' });\n      this._animationFrameId = this._frameManager.requestAnimationFrame(this._draw.bind(this));\n    }\n\n    /* \n      Check if the canvas is offscreen and freezing is enabled\n      If freezeOnOffscreen is true and the canvas is currently outside the viewport,\n      we immediately freeze the animation to avoid unnecessary rendering and performance overhead.\n    */\n    if (\n      IS_BROWSER &&\n      this._canvas instanceof HTMLCanvasElement &&\n      this._renderConfig.freezeOnOffscreen &&\n      !isElementInViewport(this._canvas)\n    ) {\n      this.freeze();\n    }\n  }\n\n  public pause(): void {\n    if (this._dotLottieCore === null) return;\n\n    const ok = this._dotLottieCore.pause();\n\n    if (ok || this._dotLottieCore.isPaused()) {\n      this._eventManager.dispatch({ type: 'pause' });\n    }\n  }\n\n  public stop(): void {\n    if (this._dotLottieCore === null) return;\n\n    const ok = this._dotLottieCore.stop();\n\n    if (ok) {\n      this._eventManager.dispatch({ type: 'frame', currentFrame: this.currentFrame });\n\n      this._render();\n\n      this._eventManager.dispatch({ type: 'stop' });\n    }\n  }\n\n  public setFrame(frame: number): void {\n    if (this._dotLottieCore === null) return;\n\n    if (frame < 0 || frame > this._dotLottieCore.totalFrames()) return;\n\n    const ok = this._dotLottieCore.seek(frame);\n\n    if (ok) {\n      this._eventManager.dispatch({ type: 'frame', currentFrame: this.currentFrame });\n\n      this._render();\n    }\n  }\n\n  public setSpeed(speed: number): void {\n    if (this._dotLottieCore === null) return;\n\n    this._dotLottieCore.setConfig({\n      ...this._dotLottieCore.config(),\n      speed,\n    });\n  }\n\n  public setBackgroundColor(color: string): void {\n    if (this._dotLottieCore === null) return;\n\n    if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n      this._canvas.style.backgroundColor = color;\n    } else {\n      this._dotLottieCore.setConfig({\n        ...this._dotLottieCore.config(),\n        backgroundColor: hexStringToRGBAInt(color),\n      });\n    }\n\n    this._backgroundColor = color;\n  }\n\n  public setLoop(loop: boolean): void {\n    if (this._dotLottieCore === null) return;\n\n    this._dotLottieCore.setConfig({\n      ...this._dotLottieCore.config(),\n      loopAnimation: loop,\n    });\n  }\n\n  public setUseFrameInterpolation(useFrameInterpolation: boolean): void {\n    if (this._dotLottieCore === null) return;\n\n    this._dotLottieCore.setConfig({\n      ...this._dotLottieCore.config(),\n      useFrameInterpolation,\n    });\n  }\n\n  public addEventListener<T extends EventType>(type: T, listener: EventListener<T>): void {\n    this._eventManager.addEventListener(type, listener);\n  }\n\n  public removeEventListener<T extends EventType>(type: T, listener?: EventListener<T>): void {\n    this._eventManager.removeEventListener(type, listener);\n  }\n\n  public destroy(): void {\n    if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n      OffscreenObserver.unobserve(this._canvas);\n      CanvasResizeObserver.unobserve(this._canvas);\n    }\n\n    this._dotLottieCore?.delete();\n    this._dotLottieCore = null;\n    this._context = null;\n\n    this._eventManager.dispatch({\n      type: 'destroy',\n    });\n\n    this._eventManager.removeAllEventListeners();\n    this._cleanupStateMachineListeners();\n  }\n\n  public freeze(): void {\n    if (this._animationFrameId === null) return;\n\n    this._frameManager.cancelAnimationFrame(this._animationFrameId);\n    this._animationFrameId = null;\n\n    this._isFrozen = true;\n\n    this._eventManager.dispatch({ type: 'freeze' });\n  }\n\n  public unfreeze(): void {\n    if (this._animationFrameId !== null) return;\n\n    this._animationFrameId = this._frameManager.requestAnimationFrame(this._draw.bind(this));\n\n    this._isFrozen = false;\n\n    this._eventManager.dispatch({ type: 'unfreeze' });\n  }\n\n  public resize(): void {\n    if (!this._dotLottieCore || !this.isLoaded) return;\n\n    if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n      const dpr = this._renderConfig.devicePixelRatio || window.devicePixelRatio || 1;\n\n      const { height: clientHeight, width: clientWidth } = this._canvas.getBoundingClientRect();\n\n      if (clientHeight !== 0 && clientWidth !== 0) {\n        this._canvas.width = clientWidth * dpr;\n        this._canvas.height = clientHeight * dpr;\n      }\n    }\n\n    const ok = this._dotLottieCore.resize(this._canvas.width, this._canvas.height);\n\n    if (ok) {\n      this._render();\n    }\n  }\n\n  public setSegment(startFrame: number, endFrame: number): void {\n    if (this._dotLottieCore === null || DotLottie._wasmModule === null) return;\n\n    this._dotLottieCore.setConfig({\n      ...this._dotLottieCore.config(),\n      segment: createCoreSegment([startFrame, endFrame], DotLottie._wasmModule),\n    });\n  }\n\n  public setMode(mode: Mode): void {\n    if (this._dotLottieCore === null || DotLottie._wasmModule === null) return;\n\n    this._dotLottieCore.setConfig({\n      ...this._dotLottieCore.config(),\n      mode: createCoreMode(mode, DotLottie._wasmModule),\n    });\n  }\n\n  public setRenderConfig(config: RenderConfig): void {\n    const { devicePixelRatio, freezeOnOffscreen, ...restConfig } = config;\n\n    this._renderConfig = {\n      ...this._renderConfig,\n      ...restConfig,\n      // devicePixelRatio is a special case, it should be set to the default value if it's not provided\n      devicePixelRatio: devicePixelRatio || getDefaultDPR(),\n      freezeOnOffscreen: freezeOnOffscreen ?? true,\n    };\n\n    if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n      if (this._renderConfig.autoResize) {\n        CanvasResizeObserver.observe(this._canvas, this);\n      } else {\n        CanvasResizeObserver.unobserve(this._canvas);\n      }\n\n      if (this._renderConfig.freezeOnOffscreen) {\n        OffscreenObserver.observe(this._canvas, this);\n      } else {\n        OffscreenObserver.unobserve(this._canvas);\n        // If the animation was previously frozen, we need to unfreeze it now\n        // to ensure it resumes rendering when the canvas is back onscreen.\n        if (this._isFrozen) {\n          this.unfreeze();\n        }\n      }\n    }\n  }\n\n  public loadAnimation(animationId: string): void {\n    if (this._dotLottieCore === null || this._dotLottieCore.activeAnimationId() === animationId) return;\n\n    const loaded = this._dotLottieCore.loadAnimation(animationId, this._canvas.width, this._canvas.height);\n\n    if (loaded) {\n      this._eventManager.dispatch({ type: 'load' });\n      this.resize();\n    } else {\n      this._eventManager.dispatch({\n        type: 'loadError',\n        error: new Error(`Failed to animation :${animationId}`),\n      });\n    }\n  }\n\n  public setMarker(marker: string): void {\n    if (this._dotLottieCore === null) return;\n\n    this._dotLottieCore.setConfig({\n      ...this._dotLottieCore.config(),\n      marker,\n    });\n  }\n\n  public markers(): Marker[] {\n    const markers = this._dotLottieCore?.markers();\n\n    if (markers) {\n      const result: Marker[] = [];\n\n      for (let i = 0; i < markers.size(); i += 1) {\n        const marker = markers.get(i) as Marker;\n\n        result.push({\n          name: marker.name,\n          time: marker.time,\n          duration: marker.duration,\n        });\n      }\n\n      return result;\n    }\n\n    return [];\n  }\n\n  public setTheme(themeId: string): boolean {\n    if (this._dotLottieCore === null) return false;\n\n    const loaded = this._dotLottieCore.setTheme(themeId);\n\n    this._render();\n\n    return loaded;\n  }\n\n  public resetTheme(): boolean {\n    if (this._dotLottieCore === null) return false;\n\n    return this._dotLottieCore.resetTheme();\n  }\n\n  public setThemeData(themeData: string): boolean {\n    if (this._dotLottieCore === null) return false;\n\n    const loaded = this._dotLottieCore.setThemeData(themeData);\n\n    this._render();\n\n    return loaded;\n  }\n\n  public setSlots(slots: string): void {\n    if (this._dotLottieCore === null) return;\n\n    this._dotLottieCore.setSlots(slots);\n  }\n\n  public setLayout(layout: Layout): void {\n    if (this._dotLottieCore === null || DotLottie._wasmModule === null) return;\n\n    this._dotLottieCore.setConfig({\n      ...this._dotLottieCore.config(),\n      layout: {\n        align: createCoreAlign(layout.align, DotLottie._wasmModule),\n        fit: createCoreFit(layout.fit, DotLottie._wasmModule),\n      },\n    });\n  }\n\n  public setViewport(x: number, y: number, width: number, height: number): boolean {\n    if (this._dotLottieCore === null) return false;\n\n    return this._dotLottieCore.setViewport(x, y, width, height);\n  }\n\n  public static setWasmUrl(url: string): void {\n    DotLottieWasmLoader.setWasmUrl(url);\n  }\n\n  public loadStateMachine(stateMachineId: string): boolean {\n    return this._dotLottieCore?.loadStateMachine(stateMachineId) ?? false;\n  }\n\n  public startStateMachine(): boolean {\n    const started = this._dotLottieCore?.startStateMachine() ?? false;\n\n    if (started) {\n      this._setupStateMachineListeners();\n    }\n\n    return started;\n  }\n\n  public stopStateMachine(): boolean {\n    const stopped = this._dotLottieCore?.stopStateMachine() ?? false;\n\n    if (stopped) {\n      this._cleanupStateMachineListeners();\n    }\n\n    return stopped;\n  }\n\n  private _getPointerPosition(event: PointerEvent): { x: number; y: number } {\n    const rect = (this._canvas as HTMLCanvasElement).getBoundingClientRect();\n    const scaleX = this._canvas.width / rect.width;\n    const scaleY = this._canvas.height / rect.height;\n\n    const devicePixelRatio = this._renderConfig.devicePixelRatio || window.devicePixelRatio || 1;\n    const x = ((event.clientX - rect.left) * scaleX) / devicePixelRatio;\n    const y = ((event.clientY - rect.top) * scaleY) / devicePixelRatio;\n\n    return {\n      x,\n      y,\n    };\n  }\n\n  private _onPointerUp(event: PointerEvent): void {\n    const { x, y } = this._getPointerPosition(event);\n\n    this.postPointerUpEvent(x, y);\n  }\n\n  private _onPointerDown(event: PointerEvent): void {\n    const { x, y } = this._getPointerPosition(event);\n\n    this.postPointerDownEvent(x, y);\n  }\n\n  private _onPointerMove(event: PointerEvent): void {\n    const { x, y } = this._getPointerPosition(event);\n\n    this.postPointerMoveEvent(x, y);\n  }\n\n  private _onPointerEnter(event: PointerEvent): void {\n    const { x, y } = this._getPointerPosition(event);\n\n    this.postPointerEnterEvent(x, y);\n  }\n\n  private _onPointerLeave(event: PointerEvent): void {\n    const { x, y } = this._getPointerPosition(event);\n\n    this.postPointerExitEvent(x, y);\n  }\n\n  public postPointerUpEvent(x: number, y: number): number | undefined {\n    return this._dotLottieCore?.postPointerUpEvent(x, y);\n  }\n\n  public postPointerDownEvent(x: number, y: number): number | undefined {\n    return this._dotLottieCore?.postPointerDownEvent(x, y);\n  }\n\n  public postPointerMoveEvent(x: number, y: number): number | undefined {\n    return this._dotLottieCore?.postPointerMoveEvent(x, y);\n  }\n\n  public postPointerEnterEvent(x: number, y: number): number | undefined {\n    return this._dotLottieCore?.postPointerEnterEvent(x, y);\n  }\n\n  public postPointerExitEvent(x: number, y: number): number | undefined {\n    return this._dotLottieCore?.postPointerExitEvent(x, y);\n  }\n\n  public getStateMachineListeners(): string[] {\n    if (!this._dotLottieCore) return [];\n\n    const listenersVector = this._dotLottieCore.stateMachineFrameworkSetup();\n\n    const listeners = [];\n\n    for (let i = 0; i < listenersVector.size(); i += 1) {\n      listeners.push(listenersVector.get(i) as string);\n    }\n\n    return listeners;\n  }\n\n  private _setupStateMachineListeners(): void {\n    if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement && this._dotLottieCore !== null && this.isLoaded) {\n      const listeners = this.getStateMachineListeners();\n\n      if (listeners.includes('PointerUp')) {\n        this._canvas.addEventListener('pointerup', this._pointerUpMethod);\n      }\n\n      if (listeners.includes('PointerDown')) {\n        this._canvas.addEventListener('pointerdown', this._pointerDownMethod);\n      }\n\n      if (listeners.includes('PointerMove')) {\n        this._canvas.addEventListener('pointermove', this._pointerMoveMethod);\n      }\n\n      if (listeners.includes('PointerEnter')) {\n        this._canvas.addEventListener('pointerenter', this._pointerEnterMethod);\n      }\n\n      if (listeners.includes('PointerExit')) {\n        this._canvas.addEventListener('pointerleave', this._pointerExitMethod);\n      }\n    }\n  }\n\n  private _cleanupStateMachineListeners(): void {\n    if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n      this._canvas.removeEventListener('pointerup', this._pointerUpMethod);\n      this._canvas.removeEventListener('pointerdown', this._pointerDownMethod);\n      this._canvas.removeEventListener('pointermove', this._pointerMoveMethod);\n      this._canvas.removeEventListener('pointerenter', this._pointerEnterMethod);\n      this._canvas.removeEventListener('pointerleave', this._pointerExitMethod);\n    }\n  }\n\n  public loadStateMachineData(stateMachineData: string): boolean {\n    return this._dotLottieCore?.loadStateMachineData(stateMachineData) ?? false;\n  }\n\n  public animationSize(): { height: number; width: number } {\n    const width = this._dotLottieCore?.animationSize().get(0) ?? 0;\n    const height = this._dotLottieCore?.animationSize().get(1) ?? 0;\n\n    return {\n      width,\n      height,\n    };\n  }\n\n  public setStateMachineBooleanContext(name: string, value: boolean): boolean {\n    return this._dotLottieCore?.setStateMachineBooleanContext(name, value) ?? false;\n  }\n\n  public setStateMachineNumericContext(name: string, value: number): boolean {\n    return this._dotLottieCore?.setStateMachineNumericContext(name, value) ?? false;\n  }\n\n  public setStateMachineStringContext(name: string, value: string): boolean {\n    return this._dotLottieCore?.setStateMachineStringContext(name, value) ?? false;\n  }\n\n  /**\n   * Get the bounds of a layer by its name\n   * @param layerName - The name of the layer\n   * @returns The bounds of the layer\n   *\n   * @example\n   * ```typescript\n   * // Draw a rectangle around the layer 'Layer 1'\n   * dotLottie.addEventListener('render', () => {\n   *   const boundingBox = dotLottie.getLayerBoundingBox('Layer 1');\n   *\n   *   if (boundingBox) {\n   *     const { x, y, width, height } = boundingBox;\n   *     context.strokeRect(x, y, width, height);\n   *   }\n   * });\n   * ```\n   */\n  public getLayerBoundingBox(layerName: string):\n    | {\n        height: number;\n        width: number;\n        x: number;\n        y: number;\n      }\n    | undefined {\n    const bounds = this._dotLottieCore?.getLayerBounds(layerName);\n\n    if (!bounds) return undefined;\n\n    if (bounds.size() !== 4) return undefined;\n\n    const x = bounds.get(0) as number;\n    const y = bounds.get(1) as number;\n    const width = bounds.get(2) as number;\n    const height = bounds.get(3) as number;\n\n    return {\n      x,\n      y,\n      width,\n      height,\n    };\n  }\n\n  public static transformThemeToLottieSlots(theme: string, slots: string): string {\n    return DotLottie._wasmModule?.transformThemeToLottieSlots(theme, slots) ?? '';\n  }\n}\n","\n            \"use client\";\n            class InlineWorker {\n              constructor() {\n                if (typeof Worker === 'undefined') {\n                  throw new Error('Worker is not supported in this environment.');\n                }\n                const blob = new Blob([new Uint8Array([34,117,115,101,32,115,116,114,105,99,116,34,59,10,40,40,41,32,61,62,32,123,10,32,32,118,97,114,32,95,95,100,101,102,80,114,111,112,32,61,32,79,98,106,101,99,116,46,100,101,102,105,110,101,80,114,111,112,101,114,116,121,59,10,32,32,118,97,114,32,95,95,100,101,102,80,114,111,112,115,32,61,32,79,98,106,101,99,116,46,100,101,102,105,110,101,80,114,111,112,101,114,116,105,101,115,59,10,32,32,118,97,114,32,95,95,103,101,116,79,119,110,80,114,111,112,68,101,115,99,115,32,61,32,79,98,106,101,99,116,46,103,101,116,79,119,110,80,114,111,112,101,114,116,121,68,101,115,99,114,105,112,116,111,114,115,59,10,32,32,118,97,114,32,95,95,103,101,116,79,119,110,80,114,111,112,83,121,109,98,111,108,115,32,61,32,79,98,106,101,99,116,46,103,101,116,79,119,110,80,114,111,112,101,114,116,121,83,121,109,98,111,108,115,59,10,32,32,118,97,114,32,95,95,104,97,115,79,119,110,80,114,111,112,32,61,32,79,98,106,101,99,116,46,112,114,111,116,111,116,121,112,101,46,104,97,115,79,119,110,80,114,111,112,101,114,116,121,59,10,32,32,118,97,114,32,95,95,112,114,111,112,73,115,69,110,117,109,32,61,32,79,98,106,101,99,116,46,112,114,111,116,111,116,121,112,101,46,112,114,111,112,101,114,116,121,73,115,69,110,117,109,101,114,97,98,108,101,59,10,32,32,118,97,114,32,95,95,100,101,102,78,111,114,109,97,108,80,114,111,112,32,61,32,40,111,98,106,44,32,107,101,121,44,32,118,97,108,117,101,41,32,61,62,32,107,101,121,32,105,110,32,111,98,106,32,63,32,95,95,100,101,102,80,114,111,112,40,111,98,106,44,32,107,101,121,44,32,123,32,101,110,117,109,101,114,97,98,108,101,58,32,116,114,117,101,44,32,99,111,110,102,105,103,117,114,97,98,108,101,58,32,116,114,117,101,44,32,119,114,105,116,97,98,108,101,58,32,116,114,117,101,44,32,118,97,108,117,101,32,125,41,32,58,32,111,98,106,91,107,101,121,93,32,61,32,118,97,108,117,101,59,10,32,32,118,97,114,32,95,95,115,112,114,101,97,100,86,97,108,117,101,115,32,61,32,40,97,44,32,98,41,32,61,62,32,123,10,32,32,32,32,102,111,114,32,40,118,97,114,32,112,114,111,112,32,105,110,32,98,32,124,124,32,40,98,32,61,32,123,125,41,41,10,32,32,32,32,32,32,105,102,32,40,95,95,104,97,115,79,119,110,80,114,111,112,46,99,97,108,108,40,98,44,32,112,114,111,112,41,41,10,32,32,32,32,32,32,32,32,95,95,100,101,102,78,111,114,109,97,108,80,114,111,112,40,97,44,32,112,114,111,112,44,32,98,91,112,114,111,112,93,41,59,10,32,32,32,32,105,102,32,40,95,95,103,101,116,79,119,110,80,114,111,112,83,121,109,98,111,108,115,41,10,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,112,114,111,112,32,111,102,32,95,95,103,101,116,79,119,110,80,114,111,112,83,121,109,98,111,108,115,40,98,41,41,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,95,95,112,114,111,112,73,115,69,110,117,109,46,99,97,108,108,40,98,44,32,112,114,111,112,41,41,10,32,32,32,32,32,32,32,32,32,32,95,95,100,101,102,78,111,114,109,97,108,80,114,111,112,40,97,44,32,112,114,111,112,44,32,98,91,112,114,111,112,93,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,114,101,116,117,114,110,32,97,59,10,32,32,125,59,10,32,32,118,97,114,32,95,95,115,112,114,101,97,100,80,114,111,112,115,32,61,32,40,97,44,32,98,41,32,61,62,32,95,95,100,101,102,80,114,111,112,115,40,97,44,32,95,95,103,101,116,79,119,110,80,114,111,112,68,101,115,99,115,40,98,41,41,59,10,32,32,118,97,114,32,95,95,111,98,106,82,101,115,116,32,61,32,40,115,111,117,114,99,101,44,32,101,120,99,108,117,100,101,41,32,61,62,32,123,10,32,32,32,32,118,97,114,32,116,97,114,103,101,116,32,61,32,123,125,59,10,32,32,32,32,102,111,114,32,40,118,97,114,32,112,114,111,112,32,105,110,32,115,111,117,114,99,101,41,10,32,32,32,32,32,32,105,102,32,40,95,95,104,97,115,79,119,110,80,114,111,112,46,99,97,108,108,40,115,111,117,114,99,101,44,32,112,114,111,112,41,32,38,38,32,101,120,99,108,117,100,101,46,105,110,100,101,120,79,102,40,112,114,111,112,41,32,60,32,48,41,10,32,32,32,32,32,32,32,32,116,97,114,103,101,116,91,112,114,111,112,93,32,61,32,115,111,117,114,99,101,91,112,114,111,112,93,59,10,32,32,32,32,105,102,32,40,115,111,117,114,99,101,32,33,61,32,110,117,108,108,32,38,38,32,95,95,103,101,116,79,119,110,80,114,111,112,83,121,109,98,111,108,115,41,10,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,112,114,111,112,32,111,102,32,95,95,103,101,116,79,119,110,80,114,111,112,83,121,109,98,111,108,115,40,115,111,117,114,99,101,41,41,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,101,120,99,108,117,100,101,46,105,110,100,101,120,79,102,40,112,114,111,112,41,32,60,32,48,32,38,38,32,95,95,112,114,111,112,73,115,69,110,117,109,46,99,97,108,108,40,115,111,117,114,99,101,44,32,112,114,111,112,41,41,10,32,32,32,32,32,32,32,32,32,32,116,97,114,103,101,116,91,112,114,111,112,93,32,61,32,115,111,117,114,99,101,91,112,114,111,112,93,59,10,32,32,32,32,32,32,125,10,32,32,32,32,114,101,116,117,114,110,32,116,97,114,103,101,116,59,10,32,32,125,59,10,32,32,118,97,114,32,95,95,112,117,98,108,105,99,70,105,101,108,100,32,61,32,40,111,98,106,44,32,107,101,121,44,32,118,97,108,117,101,41,32,61,62,32,95,95,100,101,102,78,111,114,109,97,108,80,114,111,112,40,111,98,106,44,32,116,121,112,101,111,102,32,107,101,121,32,33,61,61,32,34,115,121,109,98,111,108,34,32,63,32,107,101,121,32,43,32,34,34,32,58,32,107,101,121,44,32,118,97,108,117,101,41,59,10,32,32,118,97,114,32,95,95,97,115,121,110,99,32,61,32,40,95,95,116,104,105,115,44,32,95,95,97,114,103,117,109,101,110,116,115,44,32,103,101,110,101,114,97,116,111,114,41,32,61,62,32,123,10,32,32,32,32,114,101,116,117,114,110,32,110,101,119,32,80,114,111,109,105,115,101,40,40,114,101,115,111,108,118,101,44,32,114,101,106,101,99,116,41,32,61,62,32,123,10,32,32,32,32,32,32,118,97,114,32,102,117,108,102,105,108,108,101,100,32,61,32,40,118,97,108,117,101,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,116,114,121,32,123,10,32,32,32,32,32,32,32,32,32,32,115,116,101,112,40,103,101,110,101,114,97,116,111,114,46,110,101,120,116,40,118,97,108,117,101,41,41,59,10,32,32,32,32,32,32,32,32,125,32,99,97,116,99,104,32,40,101,41,32,123,10,32,32,32,32,32,32,32,32,32,32,114,101,106,101,99,116,40,101,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,118,97,114,32,114,101,106,101,99,116,101,100,32,61,32,40,118,97,108,117,101,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,116,114,121,32,123,10,32,32,32,32,32,32,32,32,32,32,115,116,101,112,40,103,101,110,101,114,97,116,111,114,46,116,104,114,111,119,40,118,97,108,117,101,41,41,59,10,32,32,32,32,32,32,32,32,125,32,99,97,116,99,104,32,40,101,41,32,123,10,32,32,32,32,32,32,32,32,32,32,114,101,106,101,99,116,40,101,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,118,97,114,32,115,116,101,112,32,61,32,40,120,41,32,61,62,32,120,46,100,111,110,101,32,63,32,114,101,115,111,108,118,101,40,120,46,118,97,108,117,101,41,32,58,32,80,114,111,109,105,115,101,46,114,101,115,111,108,118,101,40,120,46,118,97,108,117,101,41,46,116,104,101,110,40,102,117,108,102,105,108,108,101,100,44,32,114,101,106,101,99,116,101,100,41,59,10,32,32,32,32,32,32,115,116,101,112,40,40,103,101,110,101,114,97,116,111,114,32,61,32,103,101,110,101,114,97,116,111,114,46,97,112,112,108,121,40,95,95,116,104,105,115,44,32,95,95,97,114,103,117,109,101,110,116,115,41,41,46,110,101,120,116,40,41,41,59,10,32,32,32,32,125,41,59,10,32,32,125,59,10,10,32,32,47,47,32,115,114,99,47,97,110,105,109,97,116,105,111,110,45,102,114,97,109,101,45,109,97,110,97,103,101,114,46,116,115,10,32,32,118,97,114,32,87,101,98,65,110,105,109,97,116,105,111,110,70,114,97,109,101,83,116,114,97,116,101,103,121,32,61,32,99,108,97,115,115,32,123,10,32,32,32,32,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,40,99,97,108,108,98,97,99,107,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,40,99,97,108,108,98,97,99,107,41,59,10,32,32,32,32,125,10,32,32,32,32,99,97,110,99,101,108,65,110,105,109,97,116,105,111,110,70,114,97,109,101,40,105,100,41,32,123,10,32,32,32,32,32,32,99,97,110,99,101,108,65,110,105,109,97,116,105,111,110,70,114,97,109,101,40,105,100,41,59,10,32,32,32,32,125,10,32,32,125,59,10,32,32,118,97,114,32,78,111,100,101,65,110,105,109,97,116,105,111,110,70,114,97,109,101,83,116,114,97,116,101,103,121,32,61,32,99,108,97,115,115,32,123,10,32,32,32,32,99,111,110,115,116,114,117,99,116,111,114,40,41,32,123,10,32,32,32,32,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,116,104,105,115,44,32,34,95,108,97,115,116,72,97,110,100,108,101,73,100,34,44,32,48,41,59,10,32,32,32,32,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,116,104,105,115,44,32,34,95,108,97,115,116,73,109,109,101,100,105,97,116,101,34,44,32,110,117,108,108,41,59,10,32,32,32,32,125,10,32,32,32,32,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,40,99,97,108,108,98,97,99,107,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,108,97,115,116,72,97,110,100,108,101,73,100,32,62,61,32,78,117,109,98,101,114,46,77,65,88,95,83,65,70,69,95,73,78,84,69,71,69,82,41,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,108,97,115,116,72,97,110,100,108,101,73,100,32,61,32,48,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,116,104,105,115,46,95,108,97,115,116,72,97,110,100,108,101,73,100,32,43,61,32,49,59,10,32,32,32,32,32,32,116,104,105,115,46,95,108,97,115,116,73,109,109,101,100,105,97,116,101,32,61,32,115,101,116,73,109,109,101,100,105,97,116,101,40,40,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,99,97,108,108,98,97,99,107,40,68,97,116,101,46,110,111,119,40,41,41,59,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,116,104,105,115,46,95,108,97,115,116,72,97,110,100,108,101,73,100,59,10,32,32,32,32,125,10,32,32,32,32,99,97,110,99,101,108,65,110,105,109,97,116,105,111,110,70,114,97,109,101,40,95,105,100,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,108,97,115,116,73,109,109,101,100,105,97,116,101,41,32,123,10,32,32,32,32,32,32,32,32,99,108,101,97,114,73,109,109,101,100,105,97,116,101,40,116,104,105,115,46,95,108,97,115,116,73,109,109,101,100,105,97,116,101,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,125,59,10,32,32,118,97,114,32,65,110,105,109,97,116,105,111,110,70,114,97,109,101,77,97,110,97,103,101,114,32,61,32,99,108,97,115,115,32,123,10,32,32,32,32,99,111,110,115,116,114,117,99,116,111,114,40,41,32,123,10,32,32,32,32,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,116,104,105,115,44,32,34,95,115,116,114,97,116,101,103,121,34,41,59,10,32,32,32,32,32,32,116,104,105,115,46,95,115,116,114,97,116,101,103,121,32,61,32,116,121,112,101,111,102,32,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,32,61,61,61,32,34,102,117,110,99,116,105,111,110,34,32,63,32,110,101,119,32,87,101,98,65,110,105,109,97,116,105,111,110,70,114,97,109,101,83,116,114,97,116,101,103,121,40,41,32,58,32,110,101,119,32,78,111,100,101,65,110,105,109,97,116,105,111,110,70,114,97,109,101,83,116,114,97,116,101,103,121,40,41,59,10,32,32,32,32,125,10,32,32,32,32,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,40,99,97,108,108,98,97,99,107,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,116,104,105,115,46,95,115,116,114,97,116,101,103,121,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,40,99,97,108,108,98,97,99,107,41,59,10,32,32,32,32,125,10,32,32,32,32,99,97,110,99,101,108,65,110,105,109,97,116,105,111,110,70,114,97,109,101,40,105,100,41,32,123,10,32,32,32,32,32,32,116,104,105,115,46,95,115,116,114,97,116,101,103,121,46,99,97,110,99,101,108,65,110,105,109,97,116,105,111,110,70,114,97,109,101,40,105,100,41,59,10,32,32,32,32,125,10,32,32,125,59,10,10,32,32,47,47,32,115,114,99,47,99,111,110,115,116,97,110,116,115,46,116,115,10,32,32,118,97,114,32,73,83,95,66,82,79,87,83,69,82,32,61,32,116,121,112,101,111,102,32,119,105,110,100,111,119,32,33,61,61,32,34,117,110,100,101,102,105,110,101,100,34,32,38,38,32,116,121,112,101,111,102,32,119,105,110,100,111,119,46,100,111,99,117,109,101,110,116,32,33,61,61,32,34,117,110,100,101,102,105,110,101,100,34,59,10,32,32,118,97,114,32,90,73,80,95,83,73,71,78,65,84,85,82,69,32,61,32,110,101,119,32,85,105,110,116,56,65,114,114,97,121,40,91,56,48,44,32,55,53,44,32,51,44,32,52,93,41,59,10,32,32,118,97,114,32,76,79,84,84,73,69,95,74,83,79,78,95,77,65,78,68,65,84,79,82,89,95,70,73,69,76,68,83,32,61,32,91,34,118,34,44,32,34,105,112,34,44,32,34,111,112,34,44,32,34,108,97,121,101,114,115,34,44,32,34,102,114,34,44,32,34,119,34,44,32,34,104,34,93,59,10,32,32,118,97,114,32,80,65,67,75,65,71,69,95,86,69,82,83,73,79,78,32,61,32,34,48,46,52,48,46,49,34,59,10,32,32,118,97,114,32,80,65,67,75,65,71,69,95,78,65,77,69,32,61,32,34,64,108,111,116,116,105,101,102,105,108,101,115,47,100,111,116,108,111,116,116,105,101,45,119,101,98,34,59,10,32,32,118,97,114,32,68,69,70,65,85,76,84,95,68,80,82,95,70,65,67,84,79,82,32,61,32,48,46,55,53,59,10,10,32,32,47,47,32,115,114,99,47,99,111,114,101,47,100,111,116,108,111,116,116,105,101,45,112,108,97,121,101,114,46,106,115,10,32,32,118,97,114,32,99,114,101,97,116,101,68,111,116,76,111,116,116,105,101,80,108,97,121,101,114,77,111,100,117,108,101,32,61,32,40,40,41,32,61,62,32,123,10,32,32,32,32,118,97,114,32,95,97,59,10,32,32,32,32,118,97,114,32,95,115,99,114,105,112,116,78,97,109,101,32,61,32,116,121,112,101,111,102,32,100,111,99,117,109,101,110,116,32,33,61,32,34,117,110,100,101,102,105,110,101,100,34,32,63,32,40,95,97,32,61,32,100,111,99,117,109,101,110,116,46,99,117,114,114,101,110,116,83,99,114,105,112,116,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,115,114,99,32,58,32,118,111,105,100,32,48,59,10,32,32,32,32,114,101,116,117,114,110,32,102,117,110,99,116,105,111,110,40,109,111,100,117,108,101,65,114,103,32,61,32,123,125,41,32,123,10,32,32,32,32,32,32,118,97,114,32,109,111,100,117,108,101,82,116,110,59,10,32,32,32,32,32,32,118,97,114,32,107,32,61,32,109,111,100,117,108,101,65,114,103,44,32,97,97,44,32,98,97,44,32,101,97,32,61,32,110,101,119,32,80,114,111,109,105,115,101,40,40,97,44,32,98,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,97,97,32,61,32,97,59,10,32,32,32,32,32,32,32,32,98,97,32,61,32,98,59,10,32,32,32,32,32,32,125,41,44,32,102,97,32,61,32,79,98,106,101,99,116,46,97,115,115,105,103,110,40,123,125,44,32,107,41,44,32,104,97,32,61,32,34,46,47,116,104,105,115,46,112,114,111,103,114,97,109,34,44,32,112,32,61,32,34,34,44,32,105,97,59,10,32,32,32,32,32,32,34,117,110,100,101,102,105,110,101,100,34,32,33,61,32,116,121,112,101,111,102,32,100,111,99,117,109,101,110,116,32,38,38,32,100,111,99,117,109,101,110,116,46,99,117,114,114,101,110,116,83,99,114,105,112,116,32,38,38,32,40,112,32,61,32,100,111,99,117,109,101,110,116,46,99,117,114,114,101,110,116,83,99,114,105,112,116,46,115,114,99,41,59,10,32,32,32,32,32,32,95,115,99,114,105,112,116,78,97,109,101,32,38,38,32,40,112,32,61,32,95,115,99,114,105,112,116,78,97,109,101,41,59,10,32,32,32,32,32,32,112,46,115,116,97,114,116,115,87,105,116,104,40,34,98,108,111,98,58,34,41,32,63,32,112,32,61,32,34,34,32,58,32,112,32,61,32,112,46,115,117,98,115,116,114,40,48,44,32,112,46,114,101,112,108,97,99,101,40,47,91,63,35,93,46,42,47,44,32,34,34,41,46,108,97,115,116,73,110,100,101,120,79,102,40,34,47,34,41,32,43,32,49,41,59,10,32,32,32,32,32,32,105,97,32,61,32,40,97,41,32,61,62,32,102,101,116,99,104,40,97,44,32,123,32,99,114,101,100,101,110,116,105,97,108,115,58,32,34,115,97,109,101,45,111,114,105,103,105,110,34,32,125,41,46,116,104,101,110,40,10,32,32,32,32,32,32,32,32,40,98,41,32,61,62,32,98,46,111,107,32,63,32,98,46,97,114,114,97,121,66,117,102,102,101,114,40,41,32,58,32,80,114,111,109,105,115,101,46,114,101,106,101,99,116,40,69,114,114,111,114,40,98,46,115,116,97,116,117,115,32,43,32,34,32,58,32,34,32,43,32,98,46,117,114,108,41,41,10,32,32,32,32,32,32,41,59,10,32,32,32,32,32,32,118,97,114,32,116,32,61,32,107,46,112,114,105,110,116,69,114,114,32,124,124,32,99,111,110,115,111,108,101,46,101,114,114,111,114,46,98,105,110,100,40,99,111,110,115,111,108,101,41,59,10,32,32,32,32,32,32,79,98,106,101,99,116,46,97,115,115,105,103,110,40,107,44,32,102,97,41,59,10,32,32,32,32,32,32,102,97,32,61,32,110,117,108,108,59,10,32,32,32,32,32,32,107,46,116,104,105,115,80,114,111,103,114,97,109,32,38,38,32,40,104,97,32,61,32,107,46,116,104,105,115,80,114,111,103,114,97,109,41,59,10,32,32,32,32,32,32,118,97,114,32,106,97,32,61,32,107,46,119,97,115,109,66,105,110,97,114,121,44,32,107,97,44,32,108,97,32,61,32,102,97,108,115,101,44,32,109,97,44,32,119,44,32,120,44,32,121,44,32,122,44,32,67,44,32,68,44,32,110,97,44,32,111,97,59,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,112,97,40,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,97,32,61,32,107,97,46,98,117,102,102,101,114,59,10,32,32,32,32,32,32,32,32,107,46,72,69,65,80,56,32,61,32,119,32,61,32,110,101,119,32,73,110,116,56,65,114,114,97,121,40,97,41,59,10,32,32,32,32,32,32,32,32,107,46,72,69,65,80,49,54,32,61,32,121,32,61,32,110,101,119,32,73,110,116,49,54,65,114,114,97,121,40,97,41,59,10,32,32,32,32,32,32,32,32,107,46,72,69,65,80,85,56,32,61,32,120,32,61,32,110,101,119,32,85,105,110,116,56,65,114,114,97,121,40,97,41,59,10,32,32,32,32,32,32,32,32,107,46,72,69,65,80,85,49,54,32,61,32,122,32,61,32,110,101,119,32,85,105,110,116,49,54,65,114,114,97,121,40,97,41,59,10,32,32,32,32,32,32,32,32,107,46,72,69,65,80,51,50,32,61,32,67,32,61,32,110,101,119,32,73,110,116,51,50,65,114,114,97,121,40,97,41,59,10,32,32,32,32,32,32,32,32,107,46,72,69,65,80,85,51,50,32,61,32,68,32,61,32,110,101,119,32,85,105,110,116,51,50,65,114,114,97,121,40,97,41,59,10,32,32,32,32,32,32,32,32,107,46,72,69,65,80,70,51,50,32,61,32,110,97,32,61,32,110,101,119,32,70,108,111,97,116,51,50,65,114,114,97,121,40,97,41,59,10,32,32,32,32,32,32,32,32,107,46,72,69,65,80,70,54,52,32,61,32,111,97,32,61,32,110,101,119,32,70,108,111,97,116,54,52,65,114,114,97,121,40,97,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,118,97,114,32,113,97,32,61,32,91,93,44,32,114,97,32,61,32,91,93,44,32,115,97,32,61,32,91,93,59,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,116,97,40,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,97,32,61,32,107,46,112,114,101,82,117,110,46,115,104,105,102,116,40,41,59,10,32,32,32,32,32,32,32,32,113,97,46,117,110,115,104,105,102,116,40,97,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,118,97,114,32,70,32,61,32,48,44,32,117,97,32,61,32,110,117,108,108,44,32,71,32,61,32,110,117,108,108,59,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,118,97,40,97,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,95,97,50,59,10,32,32,32,32,32,32,32,32,40,95,97,50,32,61,32,107,46,111,110,65,98,111,114,116,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,50,46,99,97,108,108,40,107,44,32,97,41,59,10,32,32,32,32,32,32,32,32,97,32,61,32,34,65,98,111,114,116,101,100,40,34,32,43,32,97,32,43,32,34,41,34,59,10,32,32,32,32,32,32,32,32,116,40,97,41,59,10,32,32,32,32,32,32,32,32,108,97,32,61,32,116,114,117,101,59,10,32,32,32,32,32,32,32,32,97,32,61,32,110,101,119,32,87,101,98,65,115,115,101,109,98,108,121,46,82,117,110,116,105,109,101,69,114,114,111,114,40,97,32,43,32,34,46,32,66,117,105,108,100,32,119,105,116,104,32,45,115,65,83,83,69,82,84,73,79,78,83,32,102,111,114,32,109,111,114,101,32,105,110,102,111,46,34,41,59,10,32,32,32,32,32,32,32,32,98,97,40,97,41,59,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,97,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,118,97,114,32,119,97,32,61,32,40,97,41,32,61,62,32,97,46,115,116,97,114,116,115,87,105,116,104,40,34,100,97,116,97,58,97,112,112,108,105,99,97,116,105,111,110,47,111,99,116,101,116,45,115,116,114,101,97,109,59,98,97,115,101,54,52,44,34,41,44,32,120,97,59,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,121,97,40,97,41,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,97,32,61,61,32,120,97,32,38,38,32,106,97,41,32,114,101,116,117,114,110,32,110,101,119,32,85,105,110,116,56,65,114,114,97,121,40,106,97,41,59,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,34,98,111,116,104,32,97,115,121,110,99,32,97,110,100,32,115,121,110,99,32,102,101,116,99,104,105,110,103,32,111,102,32,116,104,101,32,119,97,115,109,32,102,97,105,108,101,100,34,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,122,97,40,97,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,106,97,32,63,32,80,114,111,109,105,115,101,46,114,101,115,111,108,118,101,40,41,46,116,104,101,110,40,40,41,32,61,62,32,121,97,40,97,41,41,32,58,32,105,97,40,97,41,46,116,104,101,110,40,10,32,32,32,32,32,32,32,32,32,32,40,98,41,32,61,62,32,110,101,119,32,85,105,110,116,56,65,114,114,97,121,40,98,41,44,10,32,32,32,32,32,32,32,32,32,32,40,41,32,61,62,32,121,97,40,97,41,10,32,32,32,32,32,32,32,32,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,65,97,40,97,44,32,98,44,32,99,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,122,97,40,97,41,46,116,104,101,110,40,40,100,41,32,61,62,32,87,101,98,65,115,115,101,109,98,108,121,46,105,110,115,116,97,110,116,105,97,116,101,40,100,44,32,98,41,41,46,116,104,101,110,40,99,44,32,40,100,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,116,40,96,102,97,105,108,101,100,32,116,111,32,97,115,121,110,99,104,114,111,110,111,117,115,108,121,32,112,114,101,112,97,114,101,32,119,97,115,109,58,32,36,123,100,125,96,41,59,10,32,32,32,32,32,32,32,32,32,32,118,97,40,100,41,59,10,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,66,97,40,97,44,32,98,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,99,32,61,32,120,97,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,106,97,32,124,124,32,34,102,117,110,99,116,105,111,110,34,32,33,61,32,116,121,112,101,111,102,32,87,101,98,65,115,115,101,109,98,108,121,46,105,110,115,116,97,110,116,105,97,116,101,83,116,114,101,97,109,105,110,103,32,124,124,32,119,97,40,99,41,32,124,124,32,34,102,117,110,99,116,105,111,110,34,32,33,61,32,116,121,112,101,111,102,32,102,101,116,99,104,32,63,32,65,97,40,99,44,32,97,44,32,98,41,32,58,32,102,101,116,99,104,40,99,44,32,123,32,99,114,101,100,101,110,116,105,97,108,115,58,32,34,115,97,109,101,45,111,114,105,103,105,110,34,32,125,41,46,116,104,101,110,40,10,32,32,32,32,32,32,32,32,32,32,40,100,41,32,61,62,32,87,101,98,65,115,115,101,109,98,108,121,46,105,110,115,116,97,110,116,105,97,116,101,83,116,114,101,97,109,105,110,103,40,100,44,32,97,41,46,116,104,101,110,40,98,44,32,102,117,110,99,116,105,111,110,40,101,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,116,40,96,119,97,115,109,32,115,116,114,101,97,109,105,110,103,32,99,111,109,112,105,108,101,32,102,97,105,108,101,100,58,32,36,123,101,125,96,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,116,40,34,102,97,108,108,105,110,103,32,98,97,99,107,32,116,111,32,65,114,114,97,121,66,117,102,102,101,114,32,105,110,115,116,97,110,116,105,97,116,105,111,110,34,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,65,97,40,99,44,32,97,44,32,98,41,59,10,32,32,32,32,32,32,32,32,32,32,125,41,10,32,32,32,32,32,32,32,32,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,99,108,97,115,115,32,67,97,32,123,10,32,32,32,32,32,32,32,32,99,111,110,115,116,114,117,99,116,111,114,40,97,41,32,123,10,32,32,32,32,32,32,32,32,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,116,104,105,115,44,32,34,110,97,109,101,34,44,32,34,69,120,105,116,83,116,97,116,117,115,34,41,59,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,109,101,115,115,97,103,101,32,61,32,96,80,114,111,103,114,97,109,32,116,101,114,109,105,110,97,116,101,100,32,119,105,116,104,32,101,120,105,116,40,36,123,97,125,41,96,59,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,115,116,97,116,117,115,32,61,32,97,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,118,97,114,32,68,97,32,61,32,40,97,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,102,111,114,32,40,59,32,48,32,60,32,97,46,108,101,110,103,116,104,59,32,41,32,97,46,115,104,105,102,116,40,41,40,107,41,59,10,32,32,32,32,32,32,125,44,32,69,97,32,61,32,107,46,110,111,69,120,105,116,82,117,110,116,105,109,101,32,124,124,32,116,114,117,101,44,32,70,97,32,61,32,34,117,110,100,101,102,105,110,101,100,34,32,33,61,32,116,121,112,101,111,102,32,84,101,120,116,68,101,99,111,100,101,114,32,63,32,110,101,119,32,84,101,120,116,68,101,99,111,100,101,114,40,41,32,58,32,118,111,105,100,32,48,44,32,71,97,32,61,32,40,97,32,61,32,48,44,32,98,32,61,32,78,97,78,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,99,32,61,32,120,44,32,100,32,61,32,97,32,43,32,98,59,10,32,32,32,32,32,32,32,32,102,111,114,32,40,98,32,61,32,97,59,32,99,91,98,93,32,38,38,32,33,40,98,32,62,61,32,100,41,59,32,41,32,43,43,98,59,10,32,32,32,32,32,32,32,32,105,102,32,40,49,54,32,60,32,98,32,45,32,97,32,38,38,32,99,46,98,117,102,102,101,114,32,38,38,32,70,97,41,32,114,101,116,117,114,110,32,70,97,46,100,101,99,111,100,101,40,99,46,115,117,98,97,114,114,97,121,40,97,44,32,98,41,41,59,10,32,32,32,32,32,32,32,32,102,111,114,32,40,100,32,61,32,34,34,59,32,97,32,60,32,98,59,32,41,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,101,32,61,32,99,91,97,43,43,93,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,101,32,38,32,49,50,56,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,102,32,61,32,99,91,97,43,43,93,32,38,32,54,51,59,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,49,57,50,32,61,61,32,40,101,32,38,32,50,50,52,41,41,32,100,32,43,61,32,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,40,101,32,38,32,51,49,41,32,60,60,32,54,32,124,32,102,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,104,32,61,32,99,91,97,43,43,93,32,38,32,54,51,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,32,61,32,50,50,52,32,61,61,32,40,101,32,38,32,50,52,48,41,32,63,32,40,101,32,38,32,49,53,41,32,60,60,32,49,50,32,124,32,102,32,60,60,32,54,32,124,32,104,32,58,32,40,101,32,38,32,55,41,32,60,60,32,49,56,32,124,32,102,32,60,60,32,49,50,32,124,32,104,32,60,60,32,54,32,124,32,99,91,97,43,43,93,32,38,32,54,51,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,54,53,53,51,54,32,62,32,101,32,63,32,100,32,43,61,32,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,41,32,58,32,40,101,32,45,61,32,54,53,53,51,54,44,32,100,32,43,61,32,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,53,53,50,57,54,32,124,32,101,32,62,62,32,49,48,44,32,53,54,51,50,48,32,124,32,101,32,38,32,49,48,50,51,41,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,125,32,101,108,115,101,32,100,32,43,61,32,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,100,59,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,99,108,97,115,115,32,72,97,32,123,10,32,32,32,32,32,32,32,32,99,111,110,115,116,114,117,99,116,111,114,40,97,41,32,123,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,118,97,32,61,32,97,32,45,32,50,52,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,118,97,114,32,73,97,32,61,32,48,44,32,74,97,32,61,32,48,44,32,72,32,61,32,40,97,44,32,98,44,32,99,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,100,32,61,32,120,59,10,32,32,32,32,32,32,32,32,105,102,32,40,48,32,60,32,99,41,32,123,10,32,32,32,32,32,32,32,32,32,32,99,32,61,32,98,32,43,32,99,32,45,32,49,59,10,32,32,32,32,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,101,32,61,32,48,59,32,101,32,60,32,97,46,108,101,110,103,116,104,59,32,43,43,101,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,102,32,61,32,97,46,99,104,97,114,67,111,100,101,65,116,40,101,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,53,53,50,57,54,32,60,61,32,102,32,38,38,32,53,55,51,52,51,32,62,61,32,102,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,104,32,61,32,97,46,99,104,97,114,67,111,100,101,65,116,40,43,43,101,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,102,32,61,32,54,53,53,51,54,32,43,32,40,40,102,32,38,32,49,48,50,51,41,32,60,60,32,49,48,41,32,124,32,104,32,38,32,49,48,50,51,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,49,50,55,32,62,61,32,102,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,98,32,62,61,32,99,41,32,98,114,101,97,107,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,100,91,98,43,43,93,32,61,32,102,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,50,48,52,55,32,62,61,32,102,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,98,32,43,32,49,32,62,61,32,99,41,32,98,114,101,97,107,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,100,91,98,43,43,93,32,61,32,49,57,50,32,124,32,102,32,62,62,32,54,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,54,53,53,51,53,32,62,61,32,102,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,98,32,43,32,50,32,62,61,32,99,41,32,98,114,101,97,107,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,100,91,98,43,43,93,32,61,32,50,50,52,32,124,32,102,32,62,62,32,49,50,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,98,32,43,32,51,32,62,61,32,99,41,32,98,114,101,97,107,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,100,91,98,43,43,93,32,61,32,50,52,48,32,124,32,102,32,62,62,32,49,56,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,100,91,98,43,43,93,32,61,32,49,50,56,32,124,32,102,32,62,62,32,49,50,32,38,32,54,51,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,100,91,98,43,43,93,32,61,32,49,50,56,32,124,32,102,32,62,62,32,54,32,38,32,54,51,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,100,91,98,43,43,93,32,61,32,49,50,56,32,124,32,102,32,38,32,54,51,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,100,91,98,93,32,61,32,48,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,44,32,75,97,32,61,32,123,125,44,32,76,97,32,61,32,40,97,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,102,111,114,32,40,59,32,97,46,108,101,110,103,116,104,59,32,41,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,98,32,61,32,97,46,112,111,112,40,41,59,10,32,32,32,32,32,32,32,32,32,32,97,46,112,111,112,40,41,40,98,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,73,40,97,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,116,104,105,115,46,102,114,111,109,87,105,114,101,84,121,112,101,40,68,91,97,32,62,62,32,50,93,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,118,97,114,32,74,32,61,32,123,125,44,32,75,32,61,32,123,125,44,32,77,97,32,61,32,123,125,44,32,76,44,32,78,32,61,32,40,97,44,32,98,44,32,99,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,100,40,103,41,32,123,10,32,32,32,32,32,32,32,32,32,32,103,32,61,32,99,40,103,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,103,46,108,101,110,103,116,104,32,33,61,61,32,97,46,108,101,110,103,116,104,41,32,116,104,114,111,119,32,110,101,119,32,76,40,34,77,105,115,109,97,116,99,104,101,100,32,116,121,112,101,32,99,111,110,118,101,114,116,101,114,32,99,111,117,110,116,34,41,59,10,32,32,32,32,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,108,32,61,32,48,59,32,108,32,60,32,97,46,108,101,110,103,116,104,59,32,43,43,108,41,32,77,40,97,91,108,93,44,32,103,91,108,93,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,97,46,102,111,114,69,97,99,104,40,40,103,41,32,61,62,32,77,97,91,103,93,32,61,32,98,41,59,10,32,32,32,32,32,32,32,32,118,97,114,32,101,32,61,32,65,114,114,97,121,40,98,46,108,101,110,103,116,104,41,44,32,102,32,61,32,91,93,44,32,104,32,61,32,48,59,10,32,32,32,32,32,32,32,32,98,46,102,111,114,69,97,99,104,40,40,103,44,32,108,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,75,46,104,97,115,79,119,110,80,114,111,112,101,114,116,121,40,103,41,32,63,32,101,91,108,93,32,61,32,75,91,103,93,32,58,32,40,102,46,112,117,115,104,40,103,41,44,32,74,46,104,97,115,79,119,110,80,114,111,112,101,114,116,121,40,103,41,32,124,124,32,40,74,91,103,93,32,61,32,91,93,41,44,32,74,91,103,93,46,112,117,115,104,40,40,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,101,91,108,93,32,61,32,75,91,103,93,59,10,32,32,32,32,32,32,32,32,32,32,32,32,43,43,104,59,10,32,32,32,32,32,32,32,32,32,32,32,32,104,32,61,61,61,32,102,46,108,101,110,103,116,104,32,38,38,32,100,40,101,41,59,10,32,32,32,32,32,32,32,32,32,32,125,41,41,59,10,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,48,32,61,61,61,32,102,46,108,101,110,103,116,104,32,38,38,32,100,40,101,41,59,10,32,32,32,32,32,32,125,44,32,78,97,44,32,79,32,61,32,40,97,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,98,32,61,32,34,34,59,32,120,91,97,93,59,32,41,32,98,32,43,61,32,78,97,91,120,91,97,43,43,93,93,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,98,59,10,32,32,32,32,32,32,125,44,32,80,59,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,80,97,40,97,44,32,98,44,32,99,32,61,32,123,125,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,100,32,61,32,98,46,110,97,109,101,59,10,32,32,32,32,32,32,32,32,105,102,32,40,33,97,41,32,116,104,114,111,119,32,110,101,119,32,80,40,96,116,121,112,101,32,34,36,123,100,125,34,32,109,117,115,116,32,104,97,118,101,32,97,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,32,116,121,112,101,105,100,32,112,111,105,110,116,101,114,96,41,59,10,32,32,32,32,32,32,32,32,105,102,32,40,75,46,104,97,115,79,119,110,80,114,111,112,101,114,116,121,40,97,41,41,32,123,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,99,46,36,97,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,80,40,96,67,97,110,110,111,116,32,114,101,103,105,115,116,101,114,32,116,121,112,101,32,39,36,123,100,125,39,32,116,119,105,99,101,96,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,75,91,97,93,32,61,32,98,59,10,32,32,32,32,32,32,32,32,100,101,108,101,116,101,32,77,97,91,97,93,59,10,32,32,32,32,32,32,32,32,74,46,104,97,115,79,119,110,80,114,111,112,101,114,116,121,40,97,41,32,38,38,32,40,98,32,61,32,74,91,97,93,44,32,100,101,108,101,116,101,32,74,91,97,93,44,32,98,46,102,111,114,69,97,99,104,40,40,101,41,32,61,62,32,101,40,41,41,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,77,40,97,44,32,98,44,32,99,32,61,32,123,125,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,80,97,40,97,44,32,98,44,32,99,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,118,97,114,32,81,97,32,61,32,40,97,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,80,40,97,46,116,97,46,119,97,46,117,97,46,110,97,109,101,32,43,32,34,32,105,110,115,116,97,110,99,101,32,97,108,114,101,97,100,121,32,100,101,108,101,116,101,100,34,41,59,10,32,32,32,32,32,32,125,44,32,82,97,32,61,32,102,97,108,115,101,44,32,83,97,32,61,32,40,41,32,61,62,32,123,10,32,32,32,32,32,32,125,44,32,84,97,32,61,32,40,97,44,32,98,44,32,99,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,98,32,61,61,61,32,99,41,32,114,101,116,117,114,110,32,97,59,10,32,32,32,32,32,32,32,32,105,102,32,40,118,111,105,100,32,48,32,61,61,61,32,99,46,122,97,41,32,114,101,116,117,114,110,32,110,117,108,108,59,10,32,32,32,32,32,32,32,32,97,32,61,32,84,97,40,97,44,32,98,44,32,99,46,122,97,41,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,117,108,108,32,61,61,61,32,97,32,63,32,110,117,108,108,32,58,32,99,46,84,97,40,97,41,59,10,32,32,32,32,32,32,125,44,32,85,97,32,61,32,123,125,44,32,86,97,32,61,32,123,125,44,32,87,97,32,61,32,40,97,44,32,98,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,118,111,105,100,32,48,32,61,61,61,32,98,41,32,116,104,114,111,119,32,110,101,119,32,80,40,34,112,116,114,32,115,104,111,117,108,100,32,110,111,116,32,98,101,32,117,110,100,101,102,105,110,101,100,34,41,59,10,32,32,32,32,32,32,32,32,102,111,114,32,40,59,32,97,46,122,97,59,32,41,32,98,32,61,32,97,46,74,97,40,98,41,44,32,97,32,61,32,97,46,122,97,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,86,97,91,98,93,59,10,32,32,32,32,32,32,125,44,32,88,97,32,61,32,40,97,44,32,98,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,33,98,46,119,97,32,124,124,32,33,98,46,118,97,41,32,116,104,114,111,119,32,110,101,119,32,76,40,34,109,97,107,101,67,108,97,115,115,72,97,110,100,108,101,32,114,101,113,117,105,114,101,115,32,112,116,114,32,97,110,100,32,112,116,114,84,121,112,101,34,41,59,10,32,32,32,32,32,32,32,32,105,102,32,40,33,33,98,46,65,97,32,33,61,61,32,33,33,98,46,121,97,41,32,116,104,114,111,119,32,110,101,119,32,76,40,34,66,111,116,104,32,115,109,97,114,116,80,116,114,84,121,112,101,32,97,110,100,32,115,109,97,114,116,80,116,114,32,109,117,115,116,32,98,101,32,115,112,101,99,105,102,105,101,100,34,41,59,10,32,32,32,32,32,32,32,32,98,46,99,111,117,110,116,32,61,32,123,32,118,97,108,117,101,58,32,49,32,125,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,81,40,79,98,106,101,99,116,46,99,114,101,97,116,101,40,97,44,32,123,32,116,97,58,32,123,32,118,97,108,117,101,58,32,98,44,32,119,114,105,116,97,98,108,101,58,32,116,114,117,101,32,125,32,125,41,41,59,10,32,32,32,32,32,32,125,44,32,81,32,61,32,40,97,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,34,117,110,100,101,102,105,110,101,100,34,32,61,61,61,32,116,121,112,101,111,102,32,70,105,110,97,108,105,122,97,116,105,111,110,82,101,103,105,115,116,114,121,41,32,114,101,116,117,114,110,32,81,32,61,32,40,98,41,32,61,62,32,98,44,32,97,59,10,32,32,32,32,32,32,32,32,82,97,32,61,32,110,101,119,32,70,105,110,97,108,105,122,97,116,105,111,110,82,101,103,105,115,116,114,121,40,40,98,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,98,32,61,32,98,46,116,97,59,10,32,32,32,32,32,32,32,32,32,32,45,45,98,46,99,111,117,110,116,46,118,97,108,117,101,59,10,32,32,32,32,32,32,32,32,32,32,48,32,61,61,61,32,98,46,99,111,117,110,116,46,118,97,108,117,101,32,38,38,32,40,98,46,121,97,32,63,32,98,46,65,97,46,68,97,40,98,46,121,97,41,32,58,32,98,46,119,97,46,117,97,46,68,97,40,98,46,118,97,41,41,59,10,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,81,32,61,32,40,98,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,99,32,61,32,98,46,116,97,59,10,32,32,32,32,32,32,32,32,32,32,99,46,121,97,32,38,38,32,82,97,46,114,101,103,105,115,116,101,114,40,98,44,32,123,32,116,97,58,32,99,32,125,44,32,98,41,59,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,98,59,10,32,32,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,32,32,83,97,32,61,32,40,98,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,82,97,46,117,110,114,101,103,105,115,116,101,114,40,98,41,59,10,32,32,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,81,40,97,41,59,10,32,32,32,32,32,32,125,44,32,89,97,32,61,32,91,93,59,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,90,97,40,41,32,123,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,118,97,114,32,82,32,61,32,40,97,44,32,98,41,32,61,62,32,79,98,106,101,99,116,46,100,101,102,105,110,101,80,114,111,112,101,114,116,121,40,98,44,32,34,110,97,109,101,34,44,32,123,32,118,97,108,117,101,58,32,97,32,125,41,44,32,36,97,32,61,32,40,97,44,32,98,44,32,99,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,118,111,105,100,32,48,32,61,61,61,32,97,91,98,93,46,120,97,41,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,100,32,61,32,97,91,98,93,59,10,32,32,32,32,32,32,32,32,32,32,97,91,98,93,32,61,32,102,117,110,99,116,105,111,110,40,46,46,46,101,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,33,97,91,98,93,46,120,97,46,104,97,115,79,119,110,80,114,111,112,101,114,116,121,40,101,46,108,101,110,103,116,104,41,41,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,80,40,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,96,70,117,110,99,116,105,111,110,32,39,36,123,99,125,39,32,99,97,108,108,101,100,32,119,105,116,104,32,97,110,32,105,110,118,97,108,105,100,32,110,117,109,98,101,114,32,111,102,32,97,114,103,117,109,101,110,116,115,32,40,36,123,101,46,108,101,110,103,116,104,125,41,32,45,32,101,120,112,101,99,116,115,32,111,110,101,32,111,102,32,40,36,123,97,91,98,93,46,120,97,125,41,33,96,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,97,91,98,93,46,120,97,91,101,46,108,101,110,103,116,104,93,46,97,112,112,108,121,40,116,104,105,115,44,32,101,41,59,10,32,32,32,32,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,32,32,32,32,97,91,98,93,46,120,97,32,61,32,91,93,59,10,32,32,32,32,32,32,32,32,32,32,97,91,98,93,46,120,97,91,100,46,71,97,93,32,61,32,100,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,44,32,97,98,32,61,32,40,97,44,32,98,44,32,99,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,107,46,104,97,115,79,119,110,80,114,111,112,101,114,116,121,40,97,41,41,32,123,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,118,111,105,100,32,48,32,61,61,61,32,99,32,124,124,32,118,111,105,100,32,48,32,33,61,61,32,107,91,97,93,46,120,97,32,38,38,32,118,111,105,100,32,48,32,33,61,61,32,107,91,97,93,46,120,97,91,99,93,41,10,32,32,32,32,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,80,40,96,67,97,110,110,111,116,32,114,101,103,105,115,116,101,114,32,112,117,98,108,105,99,32,110,97,109,101,32,39,36,123,97,125,39,32,116,119,105,99,101,96,41,59,10,32,32,32,32,32,32,32,32,32,32,36,97,40,107,44,32,97,44,32,97,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,107,91,97,93,46,120,97,46,104,97,115,79,119,110,80,114,111,112,101,114,116,121,40,99,41,41,10,32,32,32,32,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,80,40,96,67,97,110,110,111,116,32,114,101,103,105,115,116,101,114,32,109,117,108,116,105,112,108,101,32,111,118,101,114,108,111,97,100,115,32,111,102,32,97,32,102,117,110,99,116,105,111,110,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,117,109,98,101,114,32,111,102,32,97,114,103,117,109,101,110,116,115,32,40,36,123,99,125,41,33,96,41,59,10,32,32,32,32,32,32,32,32,32,32,107,91,97,93,46,120,97,91,99,93,32,61,32,98,59,10,32,32,32,32,32,32,32,32,125,32,101,108,115,101,32,107,91,97,93,32,61,32,98,44,32,107,91,97,93,46,71,97,32,61,32,99,59,10,32,32,32,32,32,32,125,44,32,98,98,32,61,32,40,97,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,97,32,61,32,97,46,114,101,112,108,97,99,101,40,47,91,94,97,45,122,65,45,90,48,45,57,95,93,47,103,44,32,34,36,34,41,59,10,32,32,32,32,32,32,32,32,118,97,114,32,98,32,61,32,97,46,99,104,97,114,67,111,100,101,65,116,40,48,41,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,52,56,32,60,61,32,98,32,38,38,32,53,55,32,62,61,32,98,32,63,32,96,95,36,123,97,125,96,32,58,32,97,59,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,99,98,40,97,44,32,98,44,32,99,44,32,100,44,32,101,44,32,102,44,32,104,44,32,103,41,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,110,97,109,101,32,61,32,97,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,99,111,110,115,116,114,117,99,116,111,114,32,61,32,98,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,70,97,32,61,32,99,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,68,97,32,61,32,100,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,122,97,32,61,32,101,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,86,97,32,61,32,102,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,74,97,32,61,32,104,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,84,97,32,61,32,103,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,98,98,32,61,32,91,93,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,118,97,114,32,100,98,32,61,32,40,97,44,32,98,44,32,99,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,102,111,114,32,40,59,32,98,32,33,61,61,32,99,59,32,41,32,123,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,33,98,46,74,97,41,32,116,104,114,111,119,32,110,101,119,32,80,40,96,69,120,112,101,99,116,101,100,32,110,117,108,108,32,111,114,32,105,110,115,116,97,110,99,101,32,111,102,32,36,123,99,46,110,97,109,101,125,44,32,103,111,116,32,97,110,32,105,110,115,116,97,110,99,101,32,111,102,32,36,123,98,46,110,97,109,101,125,96,41,59,10,32,32,32,32,32,32,32,32,32,32,97,32,61,32,98,46,74,97,40,97,41,59,10,32,32,32,32,32,32,32,32,32,32,98,32,61,32,98,46,122,97,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,97,59,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,101,98,40,97,44,32,98,41,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,110,117,108,108,32,61,61,61,32,98,41,32,123,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,77,97,41,32,116,104,114,111,119,32,110,101,119,32,80,40,96,110,117,108,108,32,105,115,32,110,111,116,32,97,32,118,97,108,105,100,32,36,123,116,104,105,115,46,110,97,109,101,125,96,41,59,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,48,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,105,102,32,40,33,98,46,116,97,41,32,116,104,114,111,119,32,110,101,119,32,80,40,96,67,97,110,110,111,116,32,112,97,115,115,32,34,36,123,102,98,40,98,41,125,34,32,97,115,32,97,32,36,123,116,104,105,115,46,110,97,109,101,125,96,41,59,10,32,32,32,32,32,32,32,32,105,102,32,40,33,98,46,116,97,46,118,97,41,32,116,104,114,111,119,32,110,101,119,32,80,40,96,67,97,110,110,111,116,32,112,97,115,115,32,100,101,108,101,116,101,100,32,111,98,106,101,99,116,32,97,115,32,97,32,112,111,105,110,116,101,114,32,111,102,32,116,121,112,101,32,36,123,116,104,105,115,46,110,97,109,101,125,96,41,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,100,98,40,98,46,116,97,46,118,97,44,32,98,46,116,97,46,119,97,46,117,97,44,32,116,104,105,115,46,117,97,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,103,98,40,97,44,32,98,41,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,110,117,108,108,32,61,61,61,32,98,41,32,123,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,77,97,41,32,116,104,114,111,119,32,110,101,119,32,80,40,96,110,117,108,108,32,105,115,32,110,111,116,32,97,32,118,97,108,105,100,32,36,123,116,104,105,115,46,110,97,109,101,125,96,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,76,97,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,99,32,61,32,116,104,105,115,46,78,97,40,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,110,117,108,108,32,33,61,61,32,97,32,38,38,32,97,46,112,117,115,104,40,116,104,105,115,46,68,97,44,32,99,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,99,59,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,48,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,105,102,32,40,33,98,32,124,124,32,33,98,46,116,97,41,32,116,104,114,111,119,32,110,101,119,32,80,40,96,67,97,110,110,111,116,32,112,97,115,115,32,34,36,123,102,98,40,98,41,125,34,32,97,115,32,97,32,36,123,116,104,105,115,46,110,97,109,101,125,96,41,59,10,32,32,32,32,32,32,32,32,105,102,32,40,33,98,46,116,97,46,118,97,41,32,116,104,114,111,119,32,110,101,119,32,80,40,96,67,97,110,110,111,116,32,112,97,115,115,32,100,101,108,101,116,101,100,32,111,98,106,101,99,116,32,97,115,32,97,32,112,111,105,110,116,101,114,32,111,102,32,116,121,112,101,32,36,123,116,104,105,115,46,110,97,109,101,125,96,41,59,10,32,32,32,32,32,32,32,32,105,102,32,40,33,116,104,105,115,46,75,97,32,38,38,32,98,46,116,97,46,119,97,46,75,97,41,10,32,32,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,80,40,10,32,32,32,32,32,32,32,32,32,32,32,32,96,67,97,110,110,111,116,32,99,111,110,118,101,114,116,32,97,114,103,117,109,101,110,116,32,111,102,32,116,121,112,101,32,36,123,98,46,116,97,46,65,97,32,63,32,98,46,116,97,46,65,97,46,110,97,109,101,32,58,32,98,46,116,97,46,119,97,46,110,97,109,101,125,32,116,111,32,112,97,114,97,109,101,116,101,114,32,116,121,112,101,32,36,123,116,104,105,115,46,110,97,109,101,125,96,10,32,32,32,32,32,32,32,32,32,32,41,59,10,32,32,32,32,32,32,32,32,99,32,61,32,100,98,40,98,46,116,97,46,118,97,44,32,98,46,116,97,46,119,97,46,117,97,44,32,116,104,105,115,46,117,97,41,59,10,32,32,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,76,97,41,32,123,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,118,111,105,100,32,48,32,61,61,61,32,98,46,116,97,46,121,97,41,32,116,104,114,111,119,32,110,101,119,32,80,40,34,80,97,115,115,105,110,103,32,114,97,119,32,112,111,105,110,116,101,114,32,116,111,32,115,109,97,114,116,32,112,111,105,110,116,101,114,32,105,115,32,105,108,108,101,103,97,108,34,41,59,10,32,32,32,32,32,32,32,32,32,32,115,119,105,116,99,104,32,40,116,104,105,115,46,104,98,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,48,58,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,98,46,116,97,46,65,97,32,61,61,61,32,116,104,105,115,41,32,99,32,61,32,98,46,116,97,46,121,97,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,80,40,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,96,67,97,110,110,111,116,32,99,111,110,118,101,114,116,32,97,114,103,117,109,101,110,116,32,111,102,32,116,121,112,101,32,36,123,98,46,116,97,46,65,97,32,63,32,98,46,116,97,46,65,97,46,110,97,109,101,32,58,32,98,46,116,97,46,119,97,46,110,97,109,101,125,32,116,111,32,112,97,114,97,109,101,116,101,114,32,116,121,112,101,32,36,123,116,104,105,115,46,110,97,109,101,125,96,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,98,114,101,97,107,59,10,32,32,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,49,58,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,99,32,61,32,98,46,116,97,46,121,97,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,98,114,101,97,107,59,10,32,32,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,50,58,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,98,46,116,97,46,65,97,32,61,61,61,32,116,104,105,115,41,32,99,32,61,32,98,46,116,97,46,121,97,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,100,32,61,32,98,46,99,108,111,110,101,40,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,99,32,61,32,116,104,105,115,46,99,98,40,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,99,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,104,98,40,40,41,32,61,62,32,100,91,34,100,101,108,101,116,101,34,93,40,41,41,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,110,117,108,108,32,33,61,61,32,97,32,38,38,32,97,46,112,117,115,104,40,116,104,105,115,46,68,97,44,32,99,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,98,114,101,97,107,59,10,32,32,32,32,32,32,32,32,32,32,32,32,100,101,102,97,117,108,116,58,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,80,40,34,85,110,115,117,112,112,111,114,116,105,110,103,32,115,104,97,114,105,110,103,32,112,111,108,105,99,121,34,41,59,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,99,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,105,98,40,97,44,32,98,41,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,110,117,108,108,32,61,61,61,32,98,41,32,123,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,77,97,41,32,116,104,114,111,119,32,110,101,119,32,80,40,96,110,117,108,108,32,105,115,32,110,111,116,32,97,32,118,97,108,105,100,32,36,123,116,104,105,115,46,110,97,109,101,125,96,41,59,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,48,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,105,102,32,40,33,98,46,116,97,41,32,116,104,114,111,119,32,110,101,119,32,80,40,96,67,97,110,110,111,116,32,112,97,115,115,32,34,36,123,102,98,40,98,41,125,34,32,97,115,32,97,32,36,123,116,104,105,115,46,110,97,109,101,125,96,41,59,10,32,32,32,32,32,32,32,32,105,102,32,40,33,98,46,116,97,46,118,97,41,32,116,104,114,111,119,32,110,101,119,32,80,40,96,67,97,110,110,111,116,32,112,97,115,115,32,100,101,108,101,116,101,100,32,111,98,106,101,99,116,32,97,115,32,97,32,112,111,105,110,116,101,114,32,111,102,32,116,121,112,101,32,36,123,116,104,105,115,46,110,97,109,101,125,96,41,59,10,32,32,32,32,32,32,32,32,105,102,32,40,98,46,116,97,46,119,97,46,75,97,41,32,116,104,114,111,119,32,110,101,119,32,80,40,96,67,97,110,110,111,116,32,99,111,110,118,101,114,116,32,97,114,103,117,109,101,110,116,32,111,102,32,116,121,112,101,32,36,123,98,46,116,97,46,119,97,46,110,97,109,101,125,32,116,111,32,112,97,114,97,109,101,116,101,114,32,116,121,112,101,32,36,123,116,104,105,115,46,110,97,109,101,125,96,41,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,100,98,40,98,46,116,97,46,118,97,44,32,98,46,116,97,46,119,97,46,117,97,44,32,116,104,105,115,46,117,97,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,106,98,40,97,44,32,98,44,32,99,44,32,100,44,32,101,44,32,102,44,32,104,44,32,103,44,32,108,44,32,109,44,32,110,41,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,110,97,109,101,32,61,32,97,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,117,97,32,61,32,98,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,77,97,32,61,32,99,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,75,97,32,61,32,100,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,76,97,32,61,32,101,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,97,98,32,61,32,102,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,104,98,32,61,32,104,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,82,97,32,61,32,103,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,78,97,32,61,32,108,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,99,98,32,61,32,109,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,68,97,32,61,32,110,59,10,32,32,32,32,32,32,32,32,101,32,124,124,32,118,111,105,100,32,48,32,33,61,61,32,98,46,122,97,32,63,32,116,104,105,115,46,116,111,87,105,114,101,84,121,112,101,32,61,32,103,98,32,58,32,40,116,104,105,115,46,116,111,87,105,114,101,84,121,112,101,32,61,32,100,32,63,32,101,98,32,58,32,105,98,44,32,116,104,105,115,46,67,97,32,61,32,110,117,108,108,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,118,97,114,32,107,98,32,61,32,40,97,44,32,98,44,32,99,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,33,107,46,104,97,115,79,119,110,80,114,111,112,101,114,116,121,40,97,41,41,32,116,104,114,111,119,32,110,101,119,32,76,40,34,82,101,112,108,97,99,105,110,103,32,110,111,110,101,120,105,115,116,101,110,116,32,112,117,98,108,105,99,32,115,121,109,98,111,108,34,41,59,10,32,32,32,32,32,32,32,32,118,111,105,100,32,48,32,33,61,61,32,107,91,97,93,46,120,97,32,38,38,32,118,111,105,100,32,48,32,33,61,61,32,99,32,63,32,107,91,97,93,46,120,97,91,99,93,32,61,32,98,32,58,32,40,107,91,97,93,32,61,32,98,44,32,107,91,97,93,46,71,97,32,61,32,99,41,59,10,32,32,32,32,32,32,125,44,32,83,44,32,108,98,32,61,32,40,97,44,32,98,44,32,99,32,61,32,91,93,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,97,46,105,110,99,108,117,100,101,115,40,34,106,34,41,32,63,32,40,97,32,61,32,97,46,114,101,112,108,97,99,101,40,47,112,47,103,44,32,34,105,34,41,44,32,98,32,61,32,40,48,44,32,107,91,34,100,121,110,67,97,108,108,95,34,32,43,32,97,93,41,40,98,44,32,46,46,46,99,41,41,32,58,32,98,32,61,32,83,46,103,101,116,40,98,41,40,46,46,46,99,41,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,98,59,10,32,32,32,32,32,32,125,44,32,109,98,32,61,32,40,97,44,32,98,41,32,61,62,32,40,46,46,46,99,41,32,61,62,32,108,98,40,97,44,32,98,44,32,99,41,44,32,84,32,61,32,40,97,44,32,98,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,97,32,61,32,79,40,97,41,59,10,32,32,32,32,32,32,32,32,118,97,114,32,99,32,61,32,97,46,105,110,99,108,117,100,101,115,40,34,106,34,41,32,63,32,109,98,40,97,44,32,98,41,32,58,32,83,46,103,101,116,40,98,41,59,10,32,32,32,32,32,32,32,32,105,102,32,40,34,102,117,110,99,116,105,111,110,34,32,33,61,32,116,121,112,101,111,102,32,99,41,32,116,104,114,111,119,32,110,101,119,32,80,40,96,117,110,107,110,111,119,110,32,102,117,110,99,116,105,111,110,32,112,111,105,110,116,101,114,32,119,105,116,104,32,115,105,103,110,97,116,117,114,101,32,36,123,97,125,58,32,36,123,98,125,96,41,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,99,59,10,32,32,32,32,32,32,125,44,32,110,98,44,32,112,98,32,61,32,40,97,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,97,32,61,32,111,98,40,97,41,59,10,32,32,32,32,32,32,32,32,118,97,114,32,98,32,61,32,79,40,97,41,59,10,32,32,32,32,32,32,32,32,85,40,97,41,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,98,59,10,32,32,32,32,32,32,125,44,32,113,98,32,61,32,40,97,44,32,98,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,99,40,102,41,32,123,10,32,32,32,32,32,32,32,32,32,32,101,91,102,93,32,124,124,32,75,91,102,93,32,124,124,32,40,77,97,91,102,93,32,63,32,77,97,91,102,93,46,102,111,114,69,97,99,104,40,99,41,32,58,32,40,100,46,112,117,115,104,40,102,41,44,32,101,91,102,93,32,61,32,116,114,117,101,41,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,118,97,114,32,100,32,61,32,91,93,44,32,101,32,61,32,123,125,59,10,32,32,32,32,32,32,32,32,98,46,102,111,114,69,97,99,104,40,99,41,59,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,110,98,40,96,36,123,97,125,58,32,96,32,43,32,100,46,109,97,112,40,112,98,41,46,106,111,105,110,40,91,34,44,32,34,93,41,41,59,10,32,32,32,32,32,32,125,44,32,114,98,32,61,32,40,97,44,32,98,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,99,32,61,32,91,93,44,32,100,32,61,32,48,59,32,100,32,60,32,97,59,32,100,43,43,41,32,99,46,112,117,115,104,40,68,91,98,32,43,32,52,32,42,32,100,32,62,62,32,50,93,41,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,99,59,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,115,98,40,97,41,32,123,10,32,32,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,98,32,61,32,49,59,32,98,32,60,32,97,46,108,101,110,103,116,104,59,32,43,43,98,41,32,105,102,32,40,110,117,108,108,32,33,61,61,32,97,91,98,93,32,38,38,32,118,111,105,100,32,48,32,61,61,61,32,97,91,98,93,46,67,97,41,32,114,101,116,117,114,110,32,116,114,117,101,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,102,97,108,115,101,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,116,98,40,97,44,32,98,44,32,99,44,32,100,44,32,101,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,102,32,61,32,98,46,108,101,110,103,116,104,59,10,32,32,32,32,32,32,32,32,105,102,32,40,50,32,62,32,102,41,32,116,104,114,111,119,32,110,101,119,32,80,40,34,97,114,103,84,121,112,101,115,32,97,114,114,97,121,32,115,105,122,101,32,109,105,115,109,97,116,99,104,33,32,77,117,115,116,32,97,116,32,108,101,97,115,116,32,103,101,116,32,114,101,116,117,114,110,32,118,97,108,117,101,32,97,110,100,32,39,116,104,105,115,39,32,116,121,112,101,115,33,34,41,59,10,32,32,32,32,32,32,32,32,118,97,114,32,104,32,61,32,110,117,108,108,32,33,61,61,32,98,91,49,93,32,38,38,32,110,117,108,108,32,33,61,61,32,99,44,32,103,32,61,32,115,98,40,98,41,44,32,108,32,61,32,34,118,111,105,100,34,32,33,61,61,32,98,91,48,93,46,110,97,109,101,44,32,109,32,61,32,102,32,45,32,50,44,32,110,32,61,32,65,114,114,97,121,40,109,41,44,32,113,32,61,32,91,93,44,32,114,32,61,32,91,93,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,82,40,97,44,32,102,117,110,99,116,105,111,110,40,46,46,46,65,41,32,123,10,32,32,32,32,32,32,32,32,32,32,114,46,108,101,110,103,116,104,32,61,32,48,59,10,32,32,32,32,32,32,32,32,32,32,113,46,108,101,110,103,116,104,32,61,32,104,32,63,32,50,32,58,32,49,59,10,32,32,32,32,32,32,32,32,32,32,113,91,48,93,32,61,32,101,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,104,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,117,32,61,32,98,91,49,93,46,116,111,87,105,114,101,84,121,112,101,40,114,44,32,116,104,105,115,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,113,91,49,93,32,61,32,117,59,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,118,32,61,32,48,59,32,118,32,60,32,109,59,32,43,43,118,41,32,110,91,118,93,32,61,32,98,91,118,32,43,32,50,93,46,116,111,87,105,114,101,84,121,112,101,40,114,44,32,65,91,118,93,41,44,32,113,46,112,117,115,104,40,110,91,118,93,41,59,10,32,32,32,32,32,32,32,32,32,32,65,32,61,32,100,40,46,46,46,113,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,103,41,32,76,97,40,114,41,59,10,32,32,32,32,32,32,32,32,32,32,101,108,115,101,10,32,32,32,32,32,32,32,32,32,32,32,32,102,111,114,32,40,118,32,61,32,104,32,63,32,49,32,58,32,50,59,32,118,32,60,32,98,46,108,101,110,103,116,104,59,32,118,43,43,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,69,32,61,32,49,32,61,61,61,32,118,32,63,32,117,32,58,32,110,91,118,32,45,32,50,93,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,110,117,108,108,32,33,61,61,32,98,91,118,93,46,67,97,32,38,38,32,98,91,118,93,46,67,97,40,69,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,117,32,61,32,108,32,63,32,98,91,48,93,46,102,114,111,109,87,105,114,101,84,121,112,101,40,65,41,32,58,32,118,111,105,100,32,48,59,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,117,59,10,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,118,97,114,32,117,98,32,61,32,40,97,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,97,32,61,32,97,46,116,114,105,109,40,41,59,10,32,32,32,32,32,32,32,32,99,111,110,115,116,32,98,32,61,32,97,46,105,110,100,101,120,79,102,40,34,40,34,41,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,45,49,32,33,61,61,32,98,32,63,32,97,46,115,117,98,115,116,114,40,48,44,32,98,41,32,58,32,97,59,10,32,32,32,32,32,32,125,44,32,118,98,32,61,32,91,93,44,32,86,32,61,32,91,93,44,32,120,98,32,61,32,40,97,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,57,32,60,32,97,32,38,38,32,48,32,61,61,61,32,45,45,86,91,97,32,43,32,49,93,32,38,38,32,40,86,91,97,93,32,61,32,118,111,105,100,32,48,44,32,118,98,46,112,117,115,104,40,97,41,41,59,10,32,32,32,32,32,32,125,44,32,121,98,32,61,32,40,97,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,33,97,41,32,116,104,114,111,119,32,110,101,119,32,80,40,34,67,97,110,110,111,116,32,117,115,101,32,100,101,108,101,116,101,100,32,118,97,108,46,32,104,97,110,100,108,101,32,61,32,34,32,43,32,97,41,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,86,91,97,93,59,10,32,32,32,32,32,32,125,44,32,104,98,32,61,32,40,97,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,115,119,105,116,99,104,32,40,97,41,32,123,10,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,118,111,105,100,32,48,58,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,50,59,10,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,110,117,108,108,58,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,52,59,10,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,116,114,117,101,58,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,54,59,10,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,102,97,108,115,101,58,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,56,59,10,32,32,32,32,32,32,32,32,32,32,100,101,102,97,117,108,116,58,10,32,32,32,32,32,32,32,32,32,32,32,32,99,111,110,115,116,32,98,32,61,32,118,98,46,112,111,112,40,41,32,124,124,32,86,46,108,101,110,103,116,104,59,10,32,32,32,32,32,32,32,32,32,32,32,32,86,91,98,93,32,61,32,97,59,10,32,32,32,32,32,32,32,32,32,32,32,32,86,91,98,32,43,32,49,93,32,61,32,49,59,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,98,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,44,32,122,98,32,61,32,123,10,32,32,32,32,32,32,32,32,110,97,109,101,58,32,34,101,109,115,99,114,105,112,116,101,110,58,58,118,97,108,34,44,10,32,32,32,32,32,32,32,32,102,114,111,109,87,105,114,101,84,121,112,101,58,32,40,97,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,98,32,61,32,121,98,40,97,41,59,10,32,32,32,32,32,32,32,32,32,32,120,98,40,97,41,59,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,98,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,116,111,87,105,114,101,84,121,112,101,58,32,40,97,44,32,98,41,32,61,62,32,104,98,40,98,41,44,10,32,32,32,32,32,32,32,32,66,97,58,32,56,44,10,32,32,32,32,32,32,32,32,114,101,97,100,86,97,108,117,101,70,114,111,109,80,111,105,110,116,101,114,58,32,73,44,10,32,32,32,32,32,32,32,32,67,97,58,32,110,117,108,108,10,32,32,32,32,32,32,125,44,32,65,98,32,61,32,40,97,44,32,98,44,32,99,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,115,119,105,116,99,104,32,40,98,41,32,123,10,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,49,58,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,99,32,63,32,102,117,110,99,116,105,111,110,40,100,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,116,104,105,115,46,102,114,111,109,87,105,114,101,84,121,112,101,40,119,91,100,93,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,32,58,32,102,117,110,99,116,105,111,110,40,100,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,116,104,105,115,46,102,114,111,109,87,105,114,101,84,121,112,101,40,120,91,100,93,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,50,58,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,99,32,63,32,102,117,110,99,116,105,111,110,40,100,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,116,104,105,115,46,102,114,111,109,87,105,114,101,84,121,112,101,40,121,91,100,32,62,62,32,49,93,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,32,58,32,102,117,110,99,116,105,111,110,40,100,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,116,104,105,115,46,102,114,111,109,87,105,114,101,84,121,112,101,40,122,91,100,32,62,62,32,49,93,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,52,58,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,99,32,63,32,102,117,110,99,116,105,111,110,40,100,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,116,104,105,115,46,102,114,111,109,87,105,114,101,84,121,112,101,40,67,91,100,32,62,62,32,50,93,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,32,58,32,102,117,110,99,116,105,111,110,40,100,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,116,104,105,115,46,102,114,111,109,87,105,114,101,84,121,112,101,40,68,91,100,32,62,62,32,50,93,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,32,32,32,32,100,101,102,97,117,108,116,58,10,32,32,32,32,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,96,105,110,118,97,108,105,100,32,105,110,116,101,103,101,114,32,119,105,100,116,104,32,40,36,123,98,125,41,58,32,36,123,97,125,96,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,44,32,66,98,32,61,32,40,97,44,32,98,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,99,32,61,32,75,91,97,93,59,10,32,32,32,32,32,32,32,32,105,102,32,40,118,111,105,100,32,48,32,61,61,61,32,99,41,32,116,104,114,111,119,32,97,32,61,32,96,36,123,98,125,32,104,97,115,32,117,110,107,110,111,119,110,32,116,121,112,101,32,36,123,112,98,40,97,41,125,96,44,32,110,101,119,32,80,40,97,41,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,99,59,10,32,32,32,32,32,32,125,44,32,102,98,32,61,32,40,97,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,110,117,108,108,32,61,61,61,32,97,41,32,114,101,116,117,114,110,32,34,110,117,108,108,34,59,10,32,32,32,32,32,32,32,32,118,97,114,32,98,32,61,32,116,121,112,101,111,102,32,97,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,34,111,98,106,101,99,116,34,32,61,61,61,32,98,32,124,124,32,34,97,114,114,97,121,34,32,61,61,61,32,98,32,124,124,32,34,102,117,110,99,116,105,111,110,34,32,61,61,61,32,98,32,63,32,97,46,116,111,83,116,114,105,110,103,40,41,32,58,32,34,34,32,43,32,97,59,10,32,32,32,32,32,32,125,44,32,67,98,32,61,32,40,97,44,32,98,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,115,119,105,116,99,104,32,40,98,41,32,123,10,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,52,58,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,102,117,110,99,116,105,111,110,40,99,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,116,104,105,115,46,102,114,111,109,87,105,114,101,84,121,112,101,40,110,97,91,99,32,62,62,32,50,93,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,56,58,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,102,117,110,99,116,105,111,110,40,99,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,116,104,105,115,46,102,114,111,109,87,105,114,101,84,121,112,101,40,111,97,91,99,32,62,62,32,51,93,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,32,32,32,32,100,101,102,97,117,108,116,58,10,32,32,32,32,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,96,105,110,118,97,108,105,100,32,102,108,111,97,116,32,119,105,100,116,104,32,40,36,123,98,125,41,58,32,36,123,97,125,96,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,44,32,68,98,32,61,32,40,97,44,32,98,44,32,99,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,115,119,105,116,99,104,32,40,98,41,32,123,10,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,49,58,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,99,32,63,32,40,100,41,32,61,62,32,119,91,100,93,32,58,32,40,100,41,32,61,62,32,120,91,100,93,59,10,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,50,58,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,99,32,63,32,40,100,41,32,61,62,32,121,91,100,32,62,62,32,49,93,32,58,32,40,100,41,32,61,62,32,122,91,100,32,62,62,32,49,93,59,10,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,52,58,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,99,32,63,32,40,100,41,32,61,62,32,67,91,100,32,62,62,32,50,93,32,58,32,40,100,41,32,61,62,32,68,91,100,32,62,62,32,50,93,59,10,32,32,32,32,32,32,32,32,32,32,100,101,102,97,117,108,116,58,10,32,32,32,32,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,96,105,110,118,97,108,105,100,32,105,110,116,101,103,101,114,32,119,105,100,116,104,32,40,36,123,98,125,41,58,32,36,123,97,125,96,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,44,32,69,98,32,61,32,79,98,106,101,99,116,46,97,115,115,105,103,110,40,123,32,111,112,116,105,111,110,97,108,58,32,116,114,117,101,32,125,44,32,122,98,41,44,32,70,98,32,61,32,34,117,110,100,101,102,105,110,101,100,34,32,33,61,32,116,121,112,101,111,102,32,84,101,120,116,68,101,99,111,100,101,114,32,63,32,110,101,119,32,84,101,120,116,68,101,99,111,100,101,114,40,34,117,116,102,45,49,54,108,101,34,41,32,58,32,118,111,105,100,32,48,44,32,71,98,32,61,32,40,97,44,32,98,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,99,32,61,32,97,32,62,62,32,49,59,10,32,32,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,100,32,61,32,99,32,43,32,98,32,47,32,50,59,32,33,40,99,32,62,61,32,100,41,32,38,38,32,122,91,99,93,59,32,41,32,43,43,99,59,10,32,32,32,32,32,32,32,32,99,32,60,60,61,32,49,59,10,32,32,32,32,32,32,32,32,105,102,32,40,51,50,32,60,32,99,32,45,32,97,32,38,38,32,70,98,41,32,114,101,116,117,114,110,32,70,98,46,100,101,99,111,100,101,40,120,46,115,117,98,97,114,114,97,121,40,97,44,32,99,41,41,59,10,32,32,32,32,32,32,32,32,99,32,61,32,34,34,59,10,32,32,32,32,32,32,32,32,102,111,114,32,40,100,32,61,32,48,59,32,33,40,100,32,62,61,32,98,32,47,32,50,41,59,32,43,43,100,41,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,101,32,61,32,121,91,97,32,43,32,50,32,42,32,100,32,62,62,32,49,93,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,48,32,61,61,32,101,41,32,98,114,101,97,107,59,10,32,32,32,32,32,32,32,32,32,32,99,32,43,61,32,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,99,59,10,32,32,32,32,32,32,125,44,32,72,98,32,61,32,40,97,44,32,98,44,32,99,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,99,32,33,61,32,110,117,108,108,32,63,32,99,32,58,32,99,32,61,32,50,49,52,55,52,56,51,54,52,55,59,10,32,32,32,32,32,32,32,32,105,102,32,40,50,32,62,32,99,41,32,114,101,116,117,114,110,32,48,59,10,32,32,32,32,32,32,32,32,99,32,45,61,32,50,59,10,32,32,32,32,32,32,32,32,118,97,114,32,100,32,61,32,98,59,10,32,32,32,32,32,32,32,32,99,32,61,32,99,32,60,32,50,32,42,32,97,46,108,101,110,103,116,104,32,63,32,99,32,47,32,50,32,58,32,97,46,108,101,110,103,116,104,59,10,32,32,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,101,32,61,32,48,59,32,101,32,60,32,99,59,32,43,43,101,41,32,121,91,98,32,62,62,32,49,93,32,61,32,97,46,99,104,97,114,67,111,100,101,65,116,40,101,41,44,32,98,32,43,61,32,50,59,10,32,32,32,32,32,32,32,32,121,91,98,32,62,62,32,49,93,32,61,32,48,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,98,32,45,32,100,59,10,32,32,32,32,32,32,125,44,32,73,98,32,61,32,40,97,41,32,61,62,32,50,32,42,32,97,46,108,101,110,103,116,104,44,32,74,98,32,61,32,40,97,44,32,98,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,99,32,61,32,48,44,32,100,32,61,32,34,34,59,32,33,40,99,32,62,61,32,98,32,47,32,52,41,59,32,41,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,101,32,61,32,67,91,97,32,43,32,52,32,42,32,99,32,62,62,32,50,93,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,48,32,61,61,32,101,41,32,98,114,101,97,107,59,10,32,32,32,32,32,32,32,32,32,32,43,43,99,59,10,32,32,32,32,32,32,32,32,32,32,54,53,53,51,54,32,60,61,32,101,32,63,32,40,101,32,45,61,32,54,53,53,51,54,44,32,100,32,43,61,32,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,53,53,50,57,54,32,124,32,101,32,62,62,32,49,48,44,32,53,54,51,50,48,32,124,32,101,32,38,32,49,48,50,51,41,41,32,58,32,100,32,43,61,32,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,100,59,10,32,32,32,32,32,32,125,44,32,75,98,32,61,32,40,97,44,32,98,44,32,99,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,99,32,33,61,32,110,117,108,108,32,63,32,99,32,58,32,99,32,61,32,50,49,52,55,52,56,51,54,52,55,59,10,32,32,32,32,32,32,32,32,105,102,32,40,52,32,62,32,99,41,32,114,101,116,117,114,110,32,48,59,10,32,32,32,32,32,32,32,32,118,97,114,32,100,32,61,32,98,59,10,32,32,32,32,32,32,32,32,99,32,61,32,100,32,43,32,99,32,45,32,52,59,10,32,32,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,101,32,61,32,48,59,32,101,32,60,32,97,46,108,101,110,103,116,104,59,32,43,43,101,41,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,102,32,61,32,97,46,99,104,97,114,67,111,100,101,65,116,40,101,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,53,53,50,57,54,32,60,61,32,102,32,38,38,32,53,55,51,52,51,32,62,61,32,102,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,104,32,61,32,97,46,99,104,97,114,67,111,100,101,65,116,40,43,43,101,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,102,32,61,32,54,53,53,51,54,32,43,32,40,40,102,32,38,32,49,48,50,51,41,32,60,60,32,49,48,41,32,124,32,104,32,38,32,49,48,50,51,59,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,67,91,98,32,62,62,32,50,93,32,61,32,102,59,10,32,32,32,32,32,32,32,32,32,32,98,32,43,61,32,52,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,98,32,43,32,52,32,62,32,99,41,32,98,114,101,97,107,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,67,91,98,32,62,62,32,50,93,32,61,32,48,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,98,32,45,32,100,59,10,32,32,32,32,32,32,125,44,32,76,98,32,61,32,40,97,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,98,32,61,32,48,44,32,99,32,61,32,48,59,32,99,32,60,32,97,46,108,101,110,103,116,104,59,32,43,43,99,41,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,100,32,61,32,97,46,99,104,97,114,67,111,100,101,65,116,40,99,41,59,10,32,32,32,32,32,32,32,32,32,32,53,53,50,57,54,32,60,61,32,100,32,38,38,32,53,55,51,52,51,32,62,61,32,100,32,38,38,32,43,43,99,59,10,32,32,32,32,32,32,32,32,32,32,98,32,43,61,32,52,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,98,59,10,32,32,32,32,32,32,125,44,32,77,98,32,61,32,48,44,32,78,98,32,61,32,91,93,44,32,79,98,32,61,32,40,97,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,98,32,61,32,78,98,46,108,101,110,103,116,104,59,10,32,32,32,32,32,32,32,32,78,98,46,112,117,115,104,40,97,41,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,98,59,10,32,32,32,32,32,32,125,44,32,80,98,32,61,32,40,97,44,32,98,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,99,32,61,32,65,114,114,97,121,40,97,41,44,32,100,32,61,32,48,59,32,100,32,60,32,97,59,32,43,43,100,41,32,99,91,100,93,32,61,32,66,98,40,68,91,98,32,43,32,52,32,42,32,100,32,62,62,32,50,93,44,32,34,112,97,114,97,109,101,116,101,114,32,34,32,43,32,100,41,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,99,59,10,32,32,32,32,32,32,125,44,32,81,98,32,61,32,82,101,102,108,101,99,116,46,99,111,110,115,116,114,117,99,116,44,32,82,98,32,61,32,123,125,44,32,83,98,32,61,32,40,97,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,33,40,97,32,105,110,115,116,97,110,99,101,111,102,32,67,97,32,124,124,32,34,117,110,119,105,110,100,34,32,61,61,32,97,41,41,32,116,104,114,111,119,32,97,59,10,32,32,32,32,32,32,125,44,32,84,98,32,61,32,40,97,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,95,97,50,59,10,32,32,32,32,32,32,32,32,109,97,32,61,32,97,59,10,32,32,32,32,32,32,32,32,69,97,32,124,124,32,48,32,60,32,77,98,32,124,124,32,40,40,95,97,50,32,61,32,107,46,111,110,69,120,105,116,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,50,46,99,97,108,108,40,107,44,32,97,41,44,32,108,97,32,61,32,116,114,117,101,41,59,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,67,97,40,97,41,59,10,32,32,32,32,32,32,125,44,32,85,98,32,61,32,40,97,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,33,108,97,41,10,32,32,32,32,32,32,32,32,32,32,116,114,121,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,97,40,41,44,32,33,40,69,97,32,124,124,32,48,32,60,32,77,98,41,41,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,114,121,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,109,97,32,61,32,97,32,61,32,109,97,44,32,84,98,40,97,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,32,99,97,116,99,104,32,40,98,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,83,98,40,98,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,125,32,99,97,116,99,104,32,40,98,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,83,98,40,98,41,59,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,44,32,86,98,32,61,32,123,125,44,32,88,98,32,61,32,40,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,33,87,98,41,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,97,32,61,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,85,83,69,82,58,32,34,119,101,98,95,117,115,101,114,34,44,10,32,32,32,32,32,32,32,32,32,32,32,32,76,79,71,78,65,77,69,58,32,34,119,101,98,95,117,115,101,114,34,44,10,32,32,32,32,32,32,32,32,32,32,32,32,80,65,84,72,58,32,34,47,34,44,10,32,32,32,32,32,32,32,32,32,32,32,32,80,87,68,58,32,34,47,34,44,10,32,32,32,32,32,32,32,32,32,32,32,32,72,79,77,69,58,32,34,47,104,111,109,101,47,119,101,98,95,117,115,101,114,34,44,10,32,32,32,32,32,32,32,32,32,32,32,32,76,65,78,71,58,32,40,34,111,98,106,101,99,116,34,32,61,61,32,116,121,112,101,111,102,32,110,97,118,105,103,97,116,111,114,32,38,38,32,110,97,118,105,103,97,116,111,114,46,108,97,110,103,117,97,103,101,115,32,38,38,32,110,97,118,105,103,97,116,111,114,46,108,97,110,103,117,97,103,101,115,91,48,93,32,124,124,32,34,67,34,41,46,114,101,112,108,97,99,101,40,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,34,45,34,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,34,95,34,10,32,32,32,32,32,32,32,32,32,32,32,32,41,32,43,32,34,46,85,84,70,45,56,34,44,10,32,32,32,32,32,32,32,32,32,32,32,32,95,58,32,104,97,32,124,124,32,34,46,47,116,104,105,115,46,112,114,111,103,114,97,109,34,10,32,32,32,32,32,32,32,32,32,32,125,44,32,98,59,10,32,32,32,32,32,32,32,32,32,32,102,111,114,32,40,98,32,105,110,32,86,98,41,32,118,111,105,100,32,48,32,61,61,61,32,86,98,91,98,93,32,63,32,100,101,108,101,116,101,32,97,91,98,93,32,58,32,97,91,98,93,32,61,32,86,98,91,98,93,59,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,99,32,61,32,91,93,59,10,32,32,32,32,32,32,32,32,32,32,102,111,114,32,40,98,32,105,110,32,97,41,32,99,46,112,117,115,104,40,96,36,123,98,125,61,36,123,97,91,98,93,125,96,41,59,10,32,32,32,32,32,32,32,32,32,32,87,98,32,61,32,99,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,87,98,59,10,32,32,32,32,32,32,125,44,32,87,98,44,32,89,98,32,61,32,40,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,34,111,98,106,101,99,116,34,32,61,61,32,116,121,112,101,111,102,32,99,114,121,112,116,111,32,38,38,32,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,99,114,121,112,116,111,46,103,101,116,82,97,110,100,111,109,86,97,108,117,101,115,41,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,40,97,41,32,61,62,32,99,114,121,112,116,111,46,103,101,116,82,97,110,100,111,109,86,97,108,117,101,115,40,97,41,59,10,32,32,32,32,32,32,32,32,118,97,40,34,105,110,105,116,82,97,110,100,111,109,68,101,118,105,99,101,34,41,59,10,32,32,32,32,32,32,125,44,32,90,98,32,61,32,40,97,41,32,61,62,32,40,90,98,32,61,32,89,98,40,41,41,40,97,41,59,10,32,32,32,32,32,32,76,32,61,32,107,46,73,110,116,101,114,110,97,108,69,114,114,111,114,32,61,32,99,108,97,115,115,32,101,120,116,101,110,100,115,32,69,114,114,111,114,32,123,10,32,32,32,32,32,32,32,32,99,111,110,115,116,114,117,99,116,111,114,40,97,41,32,123,10,32,32,32,32,32,32,32,32,32,32,115,117,112,101,114,40,97,41,59,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,110,97,109,101,32,61,32,34,73,110,116,101,114,110,97,108,69,114,114,111,114,34,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,36,98,32,61,32,65,114,114,97,121,40,50,53,54,41,44,32,97,99,32,61,32,48,59,32,50,53,54,32,62,32,97,99,59,32,43,43,97,99,41,32,36,98,91,97,99,93,32,61,32,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,97,99,41,59,10,32,32,32,32,32,32,78,97,32,61,32,36,98,59,10,32,32,32,32,32,32,80,32,61,32,107,46,66,105,110,100,105,110,103,69,114,114,111,114,32,61,32,99,108,97,115,115,32,101,120,116,101,110,100,115,32,69,114,114,111,114,32,123,10,32,32,32,32,32,32,32,32,99,111,110,115,116,114,117,99,116,111,114,40,97,41,32,123,10,32,32,32,32,32,32,32,32,32,32,115,117,112,101,114,40,97,41,59,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,110,97,109,101,32,61,32,34,66,105,110,100,105,110,103,69,114,114,111,114,34,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,79,98,106,101,99,116,46,97,115,115,105,103,110,40,90,97,46,112,114,111,116,111,116,121,112,101,44,32,123,10,32,32,32,32,32,32,32,32,105,115,65,108,105,97,115,79,102,58,32,102,117,110,99,116,105,111,110,40,97,41,32,123,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,33,40,116,104,105,115,32,105,110,115,116,97,110,99,101,111,102,32,90,97,32,38,38,32,97,32,105,110,115,116,97,110,99,101,111,102,32,90,97,41,41,32,114,101,116,117,114,110,32,102,97,108,115,101,59,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,98,32,61,32,116,104,105,115,46,116,97,46,119,97,46,117,97,44,32,99,32,61,32,116,104,105,115,46,116,97,46,118,97,59,10,32,32,32,32,32,32,32,32,32,32,97,46,116,97,32,61,32,97,46,116,97,59,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,100,32,61,32,97,46,116,97,46,119,97,46,117,97,59,10,32,32,32,32,32,32,32,32,32,32,102,111,114,32,40,97,32,61,32,97,46,116,97,46,118,97,59,32,98,46,122,97,59,32,41,32,99,32,61,32,98,46,74,97,40,99,41,44,32,98,32,61,32,98,46,122,97,59,10,32,32,32,32,32,32,32,32,32,32,102,111,114,32,40,59,32,100,46,122,97,59,32,41,32,97,32,61,32,100,46,74,97,40,97,41,44,32,100,32,61,32,100,46,122,97,59,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,98,32,61,61,61,32,100,32,38,38,32,99,32,61,61,61,32,97,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,99,108,111,110,101,58,32,102,117,110,99,116,105,111,110,40,41,32,123,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,116,97,46,118,97,32,124,124,32,81,97,40,116,104,105,115,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,116,97,46,73,97,41,32,114,101,116,117,114,110,32,116,104,105,115,46,116,97,46,99,111,117,110,116,46,118,97,108,117,101,32,43,61,32,49,44,32,116,104,105,115,59,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,97,32,61,32,81,44,32,98,32,61,32,79,98,106,101,99,116,44,32,99,32,61,32,98,46,99,114,101,97,116,101,44,32,100,32,61,32,79,98,106,101,99,116,46,103,101,116,80,114,111,116,111,116,121,112,101,79,102,40,116,104,105,115,41,44,32,101,32,61,32,116,104,105,115,46,116,97,59,10,32,32,32,32,32,32,32,32,32,32,97,32,61,32,97,40,10,32,32,32,32,32,32,32,32,32,32,32,32,99,46,99,97,108,108,40,98,44,32,100,44,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,97,58,32,123,32,118,97,108,117,101,58,32,123,32,99,111,117,110,116,58,32,101,46,99,111,117,110,116,44,32,72,97,58,32,101,46,72,97,44,32,73,97,58,32,101,46,73,97,44,32,118,97,58,32,101,46,118,97,44,32,119,97,58,32,101,46,119,97,44,32,121,97,58,32,101,46,121,97,44,32,65,97,58,32,101,46,65,97,32,125,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,125,41,10,32,32,32,32,32,32,32,32,32,32,41,59,10,32,32,32,32,32,32,32,32,32,32,97,46,116,97,46,99,111,117,110,116,46,118,97,108,117,101,32,43,61,32,49,59,10,32,32,32,32,32,32,32,32,32,32,97,46,116,97,46,72,97,32,61,32,102,97,108,115,101,59,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,97,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,91,34,100,101,108,101,116,101,34,93,40,41,32,123,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,116,97,46,118,97,32,124,124,32,81,97,40,116,104,105,115,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,116,97,46,72,97,32,38,38,32,33,116,104,105,115,46,116,97,46,73,97,41,32,116,104,114,111,119,32,110,101,119,32,80,40,34,79,98,106,101,99,116,32,97,108,114,101,97,100,121,32,115,99,104,101,100,117,108,101,100,32,102,111,114,32,100,101,108,101,116,105,111,110,34,41,59,10,32,32,32,32,32,32,32,32,32,32,83,97,40,116,104,105,115,41,59,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,97,32,61,32,116,104,105,115,46,116,97,59,10,32,32,32,32,32,32,32,32,32,32,45,45,97,46,99,111,117,110,116,46,118,97,108,117,101,59,10,32,32,32,32,32,32,32,32,32,32,48,32,61,61,61,32,97,46,99,111,117,110,116,46,118,97,108,117,101,32,38,38,32,40,97,46,121,97,32,63,32,97,46,65,97,46,68,97,40,97,46,121,97,41,32,58,32,97,46,119,97,46,117,97,46,68,97,40,97,46,118,97,41,41,59,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,116,97,46,73,97,32,124,124,32,40,116,104,105,115,46,116,97,46,121,97,32,61,32,118,111,105,100,32,48,44,32,116,104,105,115,46,116,97,46,118,97,32,61,32,118,111,105,100,32,48,41,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,105,115,68,101,108,101,116,101,100,58,32,102,117,110,99,116,105,111,110,40,41,32,123,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,33,116,104,105,115,46,116,97,46,118,97,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,100,101,108,101,116,101,76,97,116,101,114,58,32,102,117,110,99,116,105,111,110,40,41,32,123,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,116,97,46,118,97,32,124,124,32,81,97,40,116,104,105,115,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,116,97,46,72,97,32,38,38,32,33,116,104,105,115,46,116,97,46,73,97,41,32,116,104,114,111,119,32,110,101,119,32,80,40,34,79,98,106,101,99,116,32,97,108,114,101,97,100,121,32,115,99,104,101,100,117,108,101,100,32,102,111,114,32,100,101,108,101,116,105,111,110,34,41,59,10,32,32,32,32,32,32,32,32,32,32,89,97,46,112,117,115,104,40,116,104,105,115,41,59,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,116,97,46,72,97,32,61,32,116,114,117,101,59,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,116,104,105,115,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,79,98,106,101,99,116,46,97,115,115,105,103,110,40,106,98,46,112,114,111,116,111,116,121,112,101,44,32,123,10,32,32,32,32,32,32,32,32,87,97,40,97,41,32,123,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,82,97,32,38,38,32,40,97,32,61,32,116,104,105,115,46,82,97,40,97,41,41,59,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,97,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,80,97,40,97,41,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,95,97,50,59,10,32,32,32,32,32,32,32,32,32,32,40,95,97,50,32,61,32,116,104,105,115,46,68,97,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,50,46,99,97,108,108,40,116,104,105,115,44,32,97,41,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,66,97,58,32,56,44,10,32,32,32,32,32,32,32,32,114,101,97,100,86,97,108,117,101,70,114,111,109,80,111,105,110,116,101,114,58,32,73,44,10,32,32,32,32,32,32,32,32,102,114,111,109,87,105,114,101,84,121,112,101,58,32,102,117,110,99,116,105,111,110,40,97,41,32,123,10,32,32,32,32,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,98,40,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,116,104,105,115,46,76,97,32,63,32,88,97,40,116,104,105,115,46,117,97,46,70,97,44,32,123,32,119,97,58,32,116,104,105,115,46,97,98,44,32,118,97,58,32,99,44,32,65,97,58,32,116,104,105,115,44,32,121,97,58,32,97,32,125,41,32,58,32,88,97,40,116,104,105,115,46,117,97,46,70,97,44,32,123,32,119,97,58,32,116,104,105,115,44,32,118,97,58,32,97,32,125,41,59,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,99,32,61,32,116,104,105,115,46,87,97,40,97,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,33,99,41,32,114,101,116,117,114,110,32,116,104,105,115,46,80,97,40,97,41,44,32,110,117,108,108,59,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,100,32,61,32,87,97,40,116,104,105,115,46,117,97,44,32,99,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,118,111,105,100,32,48,32,33,61,61,32,100,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,48,32,61,61,61,32,100,46,116,97,46,99,111,117,110,116,46,118,97,108,117,101,41,32,114,101,116,117,114,110,32,100,46,116,97,46,118,97,32,61,32,99,44,32,100,46,116,97,46,121,97,32,61,32,97,44,32,100,46,99,108,111,110,101,40,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,100,32,61,32,100,46,99,108,111,110,101,40,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,80,97,40,97,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,100,59,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,100,32,61,32,116,104,105,115,46,117,97,46,86,97,40,99,41,59,10,32,32,32,32,32,32,32,32,32,32,100,32,61,32,85,97,91,100,93,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,33,100,41,32,114,101,116,117,114,110,32,98,46,99,97,108,108,40,116,104,105,115,41,59,10,32,32,32,32,32,32,32,32,32,32,100,32,61,32,116,104,105,115,46,75,97,32,63,32,100,46,83,97,32,58,32,100,46,112,111,105,110,116,101,114,84,121,112,101,59,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,101,32,61,32,84,97,40,99,44,32,116,104,105,115,46,117,97,44,32,100,46,117,97,41,59,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,117,108,108,32,61,61,61,32,101,32,63,32,98,46,99,97,108,108,40,116,104,105,115,41,32,58,32,116,104,105,115,46,76,97,32,63,32,88,97,40,100,46,117,97,46,70,97,44,32,123,32,119,97,58,32,100,44,32,118,97,58,32,101,44,32,65,97,58,32,116,104,105,115,44,32,121,97,58,32,97,32,125,41,32,58,32,88,97,40,100,46,117,97,46,70,97,44,32,123,32,119,97,58,32,100,44,32,118,97,58,32,101,32,125,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,110,98,32,61,32,107,46,85,110,98,111,117,110,100,84,121,112,101,69,114,114,111,114,32,61,32,40,40,97,44,32,98,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,99,32,61,32,82,40,98,44,32,102,117,110,99,116,105,111,110,40,100,41,32,123,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,110,97,109,101,32,61,32,98,59,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,109,101,115,115,97,103,101,32,61,32,100,59,10,32,32,32,32,32,32,32,32,32,32,100,32,61,32,69,114,114,111,114,40,100,41,46,115,116,97,99,107,59,10,32,32,32,32,32,32,32,32,32,32,118,111,105,100,32,48,32,33,61,61,32,100,32,38,38,32,40,116,104,105,115,46,115,116,97,99,107,32,61,32,116,104,105,115,46,116,111,83,116,114,105,110,103,40,41,32,43,32,34,92,110,34,32,43,32,100,46,114,101,112,108,97,99,101,40,47,94,69,114,114,111,114,40,58,91,94,92,110,93,42,41,63,92,110,47,44,32,34,34,41,41,59,10,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,99,46,112,114,111,116,111,116,121,112,101,32,61,32,79,98,106,101,99,116,46,99,114,101,97,116,101,40,97,46,112,114,111,116,111,116,121,112,101,41,59,10,32,32,32,32,32,32,32,32,99,46,112,114,111,116,111,116,121,112,101,46,99,111,110,115,116,114,117,99,116,111,114,32,61,32,99,59,10,32,32,32,32,32,32,32,32,99,46,112,114,111,116,111,116,121,112,101,46,116,111,83,116,114,105,110,103,32,61,32,102,117,110,99,116,105,111,110,40,41,32,123,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,118,111,105,100,32,48,32,61,61,61,32,116,104,105,115,46,109,101,115,115,97,103,101,32,63,32,116,104,105,115,46,110,97,109,101,32,58,32,96,36,123,116,104,105,115,46,110,97,109,101,125,58,32,36,123,116,104,105,115,46,109,101,115,115,97,103,101,125,96,59,10,32,32,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,99,59,10,32,32,32,32,32,32,125,41,40,69,114,114,111,114,44,32,34,85,110,98,111,117,110,100,84,121,112,101,69,114,114,111,114,34,41,59,10,32,32,32,32,32,32,86,46,112,117,115,104,40,48,44,32,49,44,32,118,111,105,100,32,48,44,32,49,44,32,110,117,108,108,44,32,49,44,32,116,114,117,101,44,32,49,44,32,102,97,108,115,101,44,32,49,41,59,10,32,32,32,32,32,32,107,46,99,111,117,110,116,95,101,109,118,97,108,95,104,97,110,100,108,101,115,32,61,32,40,41,32,61,62,32,86,46,108,101,110,103,116,104,32,47,32,50,32,45,32,53,32,45,32,118,98,46,108,101,110,103,116,104,59,10,32,32,32,32,32,32,118,97,114,32,109,99,32,61,32,123,10,32,32,32,32,32,32,32,32,99,58,32,40,97,44,32,98,44,32,99,44,32,100,41,32,61,62,32,118,97,40,10,32,32,32,32,32,32,32,32,32,32,96,65,115,115,101,114,116,105,111,110,32,102,97,105,108,101,100,58,32,36,123,97,32,63,32,71,97,40,97,41,32,58,32,34,34,125,44,32,97,116,58,32,96,32,43,32,91,98,32,63,32,98,32,63,32,71,97,40,98,41,32,58,32,34,34,32,58,32,34,117,110,107,110,111,119,110,32,102,105,108,101,110,97,109,101,34,44,32,99,44,32,100,32,63,32,100,32,63,32,71,97,40,100,41,32,58,32,34,34,32,58,32,34,117,110,107,110,111,119,110,32,102,117,110,99,116,105,111,110,34,93,10,32,32,32,32,32,32,32,32,41,44,10,32,32,32,32,32,32,32,32,109,58,32,40,97,44,32,98,44,32,99,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,100,32,61,32,110,101,119,32,72,97,40,97,41,59,10,32,32,32,32,32,32,32,32,32,32,68,91,100,46,118,97,32,43,32,49,54,32,62,62,32,50,93,32,61,32,48,59,10,32,32,32,32,32,32,32,32,32,32,68,91,100,46,118,97,32,43,32,52,32,62,62,32,50,93,32,61,32,98,59,10,32,32,32,32,32,32,32,32,32,32,68,91,100,46,118,97,32,43,32,56,32,62,62,32,50,93,32,61,32,99,59,10,32,32,32,32,32,32,32,32,32,32,73,97,32,61,32,97,59,10,32,32,32,32,32,32,32,32,32,32,74,97,43,43,59,10,32,32,32,32,32,32,32,32,32,32,116,104,114,111,119,32,73,97,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,77,58,32,40,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,74,58,32,40,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,75,58,32,40,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,79,58,32,102,117,110,99,116,105,111,110,40,41,32,123,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,76,58,32,40,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,81,58,32,40,41,32,61,62,32,118,97,40,34,34,41,44,10,32,32,32,32,32,32,32,32,118,58,32,40,97,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,98,32,61,32,75,97,91,97,93,59,10,32,32,32,32,32,32,32,32,32,32,100,101,108,101,116,101,32,75,97,91,97,93,59,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,99,32,61,32,98,46,78,97,44,32,100,32,61,32,98,46,68,97,44,32,101,32,61,32,98,46,81,97,44,32,102,32,61,32,101,46,109,97,112,40,40,104,41,32,61,62,32,104,46,90,97,41,46,99,111,110,99,97,116,40,101,46,109,97,112,40,40,104,41,32,61,62,32,104,46,102,98,41,41,59,10,32,32,32,32,32,32,32,32,32,32,78,40,91,97,93,44,32,102,44,32,40,104,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,103,32,61,32,123,125,59,10,32,32,32,32,32,32,32,32,32,32,32,32,101,46,102,111,114,69,97,99,104,40,40,108,44,32,109,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,110,32,61,32,104,91,109,93,44,32,113,32,61,32,108,46,88,97,44,32,114,32,61,32,108,46,89,97,44,32,65,32,61,32,104,91,109,32,43,32,101,46,108,101,110,103,116,104,93,44,32,117,32,61,32,108,46,101,98,44,32,118,32,61,32,108,46,103,98,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,91,108,46,85,97,93,32,61,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,97,100,58,32,40,69,41,32,61,62,32,110,46,102,114,111,109,87,105,114,101,84,121,112,101,40,113,40,114,44,32,69,41,41,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,119,114,105,116,101,58,32,40,69,44,32,99,97,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,66,32,61,32,91,93,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,117,40,118,44,32,69,44,32,65,46,116,111,87,105,114,101,84,121,112,101,40,66,44,32,99,97,41,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,76,97,40,66,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,91,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,110,97,109,101,58,32,98,46,110,97,109,101,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,102,114,111,109,87,105,114,101,84,121,112,101,58,32,40,108,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,109,32,61,32,123,125,44,32,110,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,102,111,114,32,40,110,32,105,110,32,103,41,32,109,91,110,93,32,61,32,103,91,110,93,46,114,101,97,100,40,108,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,100,40,108,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,109,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,111,87,105,114,101,84,121,112,101,58,32,40,108,44,32,109,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,110,32,105,110,32,103,41,32,105,102,32,40,33,40,110,32,105,110,32,109,41,41,32,116,104,114,111,119,32,110,101,119,32,84,121,112,101,69,114,114,111,114,40,96,77,105,115,115,105,110,103,32,102,105,101,108,100,58,32,34,36,123,110,125,34,96,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,113,32,61,32,99,40,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,102,111,114,32,40,110,32,105,110,32,103,41,32,103,91,110,93,46,119,114,105,116,101,40,113,44,32,109,91,110,93,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,110,117,108,108,32,33,61,61,32,108,32,38,38,32,108,46,112,117,115,104,40,100,44,32,113,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,113,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,66,97,58,32,56,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,97,100,86,97,108,117,101,70,114,111,109,80,111,105,110,116,101,114,58,32,73,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,67,97,58,32,100,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,93,59,10,32,32,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,67,58,32,40,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,86,58,32,40,97,44,32,98,44,32,99,44,32,100,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,98,32,61,32,79,40,98,41,59,10,32,32,32,32,32,32,32,32,32,32,77,40,97,44,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,110,97,109,101,58,32,98,44,10,32,32,32,32,32,32,32,32,32,32,32,32,102,114,111,109,87,105,114,101,84,121,112,101,58,32,102,117,110,99,116,105,111,110,40,101,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,33,33,101,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,116,111,87,105,114,101,84,121,112,101,58,32,102,117,110,99,116,105,111,110,40,101,44,32,102,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,102,32,63,32,99,32,58,32,100,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,66,97,58,32,56,44,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,97,100,86,97,108,117,101,70,114,111,109,80,111,105,110,116,101,114,58,32,102,117,110,99,116,105,111,110,40,101,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,116,104,105,115,46,102,114,111,109,87,105,114,101,84,121,112,101,40,120,91,101,93,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,67,97,58,32,110,117,108,108,10,32,32,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,114,58,32,40,97,44,32,98,44,32,99,44,32,100,44,32,101,44,32,102,44,32,104,44,32,103,44,32,108,44,32,109,44,32,110,44,32,113,44,32,114,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,110,32,61,32,79,40,110,41,59,10,32,32,32,32,32,32,32,32,32,32,102,32,61,32,84,40,101,44,32,102,41,59,10,32,32,32,32,32,32,32,32,32,32,103,32,38,38,32,40,103,32,61,32,84,40,104,44,32,103,41,41,59,10,32,32,32,32,32,32,32,32,32,32,109,32,38,38,32,40,109,32,61,32,84,40,108,44,32,109,41,41,59,10,32,32,32,32,32,32,32,32,32,32,114,32,61,32,84,40,113,44,32,114,41,59,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,65,32,61,32,98,98,40,110,41,59,10,32,32,32,32,32,32,32,32,32,32,97,98,40,65,44,32,102,117,110,99,116,105,111,110,40,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,113,98,40,96,67,97,110,110,111,116,32,99,111,110,115,116,114,117,99,116,32,36,123,110,125,32,100,117,101,32,116,111,32,117,110,98,111,117,110,100,32,116,121,112,101,115,96,44,32,91,100,93,41,59,10,32,32,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,32,32,78,40,91,97,44,32,98,44,32,99,93,44,32,100,32,63,32,91,100,93,32,58,32,91,93,44,32,40,117,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,95,97,50,59,10,32,32,32,32,32,32,32,32,32,32,32,32,117,32,61,32,117,91,48,93,59,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,100,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,118,32,61,32,117,46,117,97,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,69,32,61,32,118,46,70,97,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,32,101,108,115,101,32,69,32,61,32,90,97,46,112,114,111,116,111,116,121,112,101,59,10,32,32,32,32,32,32,32,32,32,32,32,32,117,32,61,32,82,40,110,44,32,102,117,110,99,116,105,111,110,40,46,46,46,79,97,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,79,98,106,101,99,116,46,103,101,116,80,114,111,116,111,116,121,112,101,79,102,40,116,104,105,115,41,32,33,61,61,32,99,97,41,32,116,104,114,111,119,32,110,101,119,32,80,40,34,85,115,101,32,39,110,101,119,39,32,116,111,32,99,111,110,115,116,114,117,99,116,32,34,32,43,32,110,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,118,111,105,100,32,48,32,61,61,61,32,66,46,69,97,41,32,116,104,114,111,119,32,110,101,119,32,80,40,110,32,43,32,34,32,104,97,115,32,110,111,32,97,99,99,101,115,115,105,98,108,101,32,99,111,110,115,116,114,117,99,116,111,114,34,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,119,98,32,61,32,66,46,69,97,91,79,97,46,108,101,110,103,116,104,93,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,118,111,105,100,32,48,32,61,61,61,32,119,98,41,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,80,40,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,96,84,114,105,101,100,32,116,111,32,105,110,118,111,107,101,32,99,116,111,114,32,111,102,32,36,123,110,125,32,119,105,116,104,32,105,110,118,97,108,105,100,32,110,117,109,98,101,114,32,111,102,32,112,97,114,97,109,101,116,101,114,115,32,40,36,123,79,97,46,108,101,110,103,116,104,125,41,32,45,32,101,120,112,101,99,116,101,100,32,40,36,123,79,98,106,101,99,116,46,107,101,121,115,40,66,46,69,97,41,46,116,111,83,116,114,105,110,103,40,41,125,41,32,112,97,114,97,109,101,116,101,114,115,32,105,110,115,116,101,97,100,33,96,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,119,98,46,97,112,112,108,121,40,116,104,105,115,44,32,79,97,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,99,97,32,61,32,79,98,106,101,99,116,46,99,114,101,97,116,101,40,69,44,32,123,32,99,111,110,115,116,114,117,99,116,111,114,58,32,123,32,118,97,108,117,101,58,32,117,32,125,32,125,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,117,46,112,114,111,116,111,116,121,112,101,32,61,32,99,97,59,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,66,32,61,32,110,101,119,32,99,98,40,110,44,32,117,44,32,99,97,44,32,114,44,32,118,44,32,102,44,32,103,44,32,109,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,66,46,122,97,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,100,97,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,40,95,97,50,32,61,32,40,100,97,32,61,32,66,46,122,97,41,46,79,97,41,32,33,61,32,110,117,108,108,32,63,32,95,97,50,32,58,32,100,97,46,79,97,32,61,32,91,93,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,66,46,122,97,46,79,97,46,112,117,115,104,40,66,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,118,32,61,32,110,101,119,32,106,98,40,110,44,32,66,44,32,116,114,117,101,44,32,102,97,108,115,101,44,32,102,97,108,115,101,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,100,97,32,61,32,110,101,119,32,106,98,40,110,32,43,32,34,42,34,44,32,66,44,32,102,97,108,115,101,44,32,102,97,108,115,101,44,32,102,97,108,115,101,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,69,32,61,32,110,101,119,32,106,98,40,110,32,43,32,34,32,99,111,110,115,116,42,34,44,32,66,44,32,102,97,108,115,101,44,32,116,114,117,101,44,32,102,97,108,115,101,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,85,97,91,97,93,32,61,32,123,32,112,111,105,110,116,101,114,84,121,112,101,58,32,100,97,44,32,83,97,58,32,69,32,125,59,10,32,32,32,32,32,32,32,32,32,32,32,32,107,98,40,65,44,32,117,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,91,118,44,32,100,97,44,32,69,93,59,10,32,32,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,113,58,32,40,97,44,32,98,44,32,99,44,32,100,44,32,101,44,32,102,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,104,32,61,32,114,98,40,98,44,32,99,41,59,10,32,32,32,32,32,32,32,32,32,32,101,32,61,32,84,40,100,44,32,101,41,59,10,32,32,32,32,32,32,32,32,32,32,78,40,91,93,44,32,91,97,93,44,32,40,103,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,103,32,61,32,103,91,48,93,59,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,108,32,61,32,96,99,111,110,115,116,114,117,99,116,111,114,32,36,123,103,46,110,97,109,101,125,96,59,10,32,32,32,32,32,32,32,32,32,32,32,32,118,111,105,100,32,48,32,61,61,61,32,103,46,117,97,46,69,97,32,38,38,32,40,103,46,117,97,46,69,97,32,61,32,91,93,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,118,111,105,100,32,48,32,33,61,61,32,103,46,117,97,46,69,97,91,98,32,45,32,49,93,41,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,80,40,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,96,67,97,110,110,111,116,32,114,101,103,105,115,116,101,114,32,109,117,108,116,105,112,108,101,32,99,111,110,115,116,114,117,99,116,111,114,115,32,119,105,116,104,32,105,100,101,110,116,105,99,97,108,32,110,117,109,98,101,114,32,111,102,32,112,97,114,97,109,101,116,101,114,115,32,40,36,123,98,32,45,32,49,125,41,32,102,111,114,32,99,108,97,115,115,32,39,36,123,103,46,110,97,109,101,125,39,33,32,79,118,101,114,108,111,97,100,32,114,101,115,111,108,117,116,105,111,110,32,105,115,32,99,117,114,114,101,110,116,108,121,32,111,110,108,121,32,112,101,114,102,111,114,109,101,100,32,117,115,105,110,103,32,116,104,101,32,112,97,114,97,109,101,116,101,114,32,99,111,117,110,116,44,32,110,111,116,32,97,99,116,117,97,108,32,116,121,112,101,32,105,110,102,111,33,96,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,103,46,117,97,46,69,97,91,98,32,45,32,49,93,32,61,32,40,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,113,98,40,96,67,97,110,110,111,116,32,99,111,110,115,116,114,117,99,116,32,36,123,103,46,110,97,109,101,125,32,100,117,101,32,116,111,32,117,110,98,111,117,110,100,32,116,121,112,101,115,96,44,32,104,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,32,32,32,32,32,32,78,40,91,93,44,32,104,44,32,40,109,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,109,46,115,112,108,105,99,101,40,49,44,32,48,44,32,110,117,108,108,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,46,117,97,46,69,97,91,98,32,45,32,49,93,32,61,32,116,98,40,108,44,32,109,44,32,110,117,108,108,44,32,101,44,32,102,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,91,93,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,91,93,59,10,32,32,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,102,58,32,40,97,44,32,98,44,32,99,44,32,100,44,32,101,44,32,102,44,32,104,44,32,103,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,108,32,61,32,114,98,40,99,44,32,100,41,59,10,32,32,32,32,32,32,32,32,32,32,98,32,61,32,79,40,98,41,59,10,32,32,32,32,32,32,32,32,32,32,98,32,61,32,117,98,40,98,41,59,10,32,32,32,32,32,32,32,32,32,32,102,32,61,32,84,40,101,44,32,102,41,59,10,32,32,32,32,32,32,32,32,32,32,78,40,91,93,44,32,91,97,93,44,32,40,109,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,110,40,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,113,98,40,96,67,97,110,110,111,116,32,99,97,108,108,32,36,123,113,125,32,100,117,101,32,116,111,32,117,110,98,111,117,110,100,32,116,121,112,101,115,96,44,32,108,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,109,32,61,32,109,91,48,93,59,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,113,32,61,32,96,36,123,109,46,110,97,109,101,125,46,36,123,98,125,96,59,10,32,32,32,32,32,32,32,32,32,32,32,32,98,46,115,116,97,114,116,115,87,105,116,104,40,34,64,64,34,41,32,38,38,32,40,98,32,61,32,83,121,109,98,111,108,91,98,46,115,117,98,115,116,114,105,110,103,40,50,41,93,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,103,32,38,38,32,109,46,117,97,46,98,98,46,112,117,115,104,40,98,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,114,32,61,32,109,46,117,97,46,70,97,44,32,65,32,61,32,114,91,98,93,59,10,32,32,32,32,32,32,32,32,32,32,32,32,118,111,105,100,32,48,32,61,61,61,32,65,32,124,124,32,118,111,105,100,32,48,32,61,61,61,32,65,46,120,97,32,38,38,32,65,46,99,108,97,115,115,78,97,109,101,32,33,61,61,32,109,46,110,97,109,101,32,38,38,32,65,46,71,97,32,61,61,61,32,99,32,45,32,50,32,63,32,40,110,46,71,97,32,61,32,99,32,45,32,50,44,32,110,46,99,108,97,115,115,78,97,109,101,32,61,32,109,46,110,97,109,101,44,32,114,91,98,93,32,61,32,110,41,32,58,32,40,36,97,40,114,44,32,98,44,32,113,41,44,32,114,91,98,93,46,120,97,91,99,32,45,32,50,93,32,61,32,110,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,78,40,91,93,44,32,108,44,32,40,117,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,117,32,61,32,116,98,40,113,44,32,117,44,32,109,44,32,102,44,32,104,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,118,111,105,100,32,48,32,61,61,61,32,114,91,98,93,46,120,97,32,63,32,40,117,46,71,97,32,61,32,99,32,45,32,50,44,32,114,91,98,93,32,61,32,117,41,32,58,32,114,91,98,93,46,120,97,91,99,32,45,32,50,93,32,61,32,117,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,91,93,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,91,93,59,10,32,32,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,85,58,32,40,97,41,32,61,62,32,77,40,97,44,32,122,98,41,44,10,32,32,32,32,32,32,32,32,120,58,32,40,97,44,32,98,44,32,99,44,32,100,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,101,40,41,32,123,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,98,32,61,32,79,40,98,41,59,10,32,32,32,32,32,32,32,32,32,32,101,46,118,97,108,117,101,115,32,61,32,123,125,59,10,32,32,32,32,32,32,32,32,32,32,77,40,97,44,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,110,97,109,101,58,32,98,44,10,32,32,32,32,32,32,32,32,32,32,32,32,99,111,110,115,116,114,117,99,116,111,114,58,32,101,44,10,32,32,32,32,32,32,32,32,32,32,32,32,102,114,111,109,87,105,114,101,84,121,112,101,58,32,102,117,110,99,116,105,111,110,40,102,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,116,104,105,115,46,99,111,110,115,116,114,117,99,116,111,114,46,118,97,108,117,101,115,91,102,93,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,116,111,87,105,114,101,84,121,112,101,58,32,40,102,44,32,104,41,32,61,62,32,104,46,118,97,108,117,101,44,10,32,32,32,32,32,32,32,32,32,32,32,32,66,97,58,32,56,44,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,97,100,86,97,108,117,101,70,114,111,109,80,111,105,110,116,101,114,58,32,65,98,40,98,44,32,99,44,32,100,41,44,10,32,32,32,32,32,32,32,32,32,32,32,32,67,97,58,32,110,117,108,108,10,32,32,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,32,32,97,98,40,98,44,32,101,41,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,107,58,32,40,97,44,32,98,44,32,99,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,100,32,61,32,66,98,40,97,44,32,34,101,110,117,109,34,41,59,10,32,32,32,32,32,32,32,32,32,32,98,32,61,32,79,40,98,41,59,10,32,32,32,32,32,32,32,32,32,32,97,32,61,32,100,46,99,111,110,115,116,114,117,99,116,111,114,59,10,32,32,32,32,32,32,32,32,32,32,100,32,61,32,79,98,106,101,99,116,46,99,114,101,97,116,101,40,100,46,99,111,110,115,116,114,117,99,116,111,114,46,112,114,111,116,111,116,121,112,101,44,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,108,117,101,58,32,123,32,118,97,108,117,101,58,32,99,32,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,99,111,110,115,116,114,117,99,116,111,114,58,32,123,32,118,97,108,117,101,58,32,82,40,96,36,123,100,46,110,97,109,101,125,95,36,123,98,125,96,44,32,102,117,110,99,116,105,111,110,40,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,125,41,32,125,10,32,32,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,32,32,97,46,118,97,108,117,101,115,91,99,93,32,61,32,100,59,10,32,32,32,32,32,32,32,32,32,32,97,91,98,93,32,61,32,100,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,122,58,32,40,97,44,32,98,44,32,99,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,98,32,61,32,79,40,98,41,59,10,32,32,32,32,32,32,32,32,32,32,77,40,97,44,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,110,97,109,101,58,32,98,44,10,32,32,32,32,32,32,32,32,32,32,32,32,102,114,111,109,87,105,114,101,84,121,112,101,58,32,40,100,41,32,61,62,32,100,44,10,32,32,32,32,32,32,32,32,32,32,32,32,116,111,87,105,114,101,84,121,112,101,58,32,40,100,44,32,101,41,32,61,62,32,101,44,10,32,32,32,32,32,32,32,32,32,32,32,32,66,97,58,32,56,44,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,97,100,86,97,108,117,101,70,114,111,109,80,111,105,110,116,101,114,58,32,67,98,40,98,44,32,99,41,44,10,32,32,32,32,32,32,32,32,32,32,32,32,67,97,58,32,110,117,108,108,10,32,32,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,117,58,32,40,97,44,32,98,44,32,99,44,32,100,44,32,101,44,32,102,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,104,32,61,32,114,98,40,98,44,32,99,41,59,10,32,32,32,32,32,32,32,32,32,32,97,32,61,32,79,40,97,41,59,10,32,32,32,32,32,32,32,32,32,32,97,32,61,32,117,98,40,97,41,59,10,32,32,32,32,32,32,32,32,32,32,101,32,61,32,84,40,100,44,32,101,41,59,10,32,32,32,32,32,32,32,32,32,32,97,98,40,10,32,32,32,32,32,32,32,32,32,32,32,32,97,44,10,32,32,32,32,32,32,32,32,32,32,32,32,102,117,110,99,116,105,111,110,40,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,113,98,40,96,67,97,110,110,111,116,32,99,97,108,108,32,36,123,97,125,32,100,117,101,32,116,111,32,117,110,98,111,117,110,100,32,116,121,112,101,115,96,44,32,104,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,98,32,45,32,49,10,32,32,32,32,32,32,32,32,32,32,41,59,10,32,32,32,32,32,32,32,32,32,32,78,40,91,93,44,32,104,44,32,40,103,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,107,98,40,97,44,32,116,98,40,97,44,32,91,103,91,48,93,44,32,110,117,108,108,93,46,99,111,110,99,97,116,40,103,46,115,108,105,99,101,40,49,41,41,44,32,110,117,108,108,44,32,101,44,32,102,41,44,32,98,32,45,32,49,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,91,93,59,10,32,32,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,108,58,32,40,97,44,32,98,44,32,99,44,32,100,44,32,101,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,98,32,61,32,79,40,98,41,59,10,32,32,32,32,32,32,32,32,32,32,45,49,32,61,61,61,32,101,32,38,38,32,40,101,32,61,32,52,50,57,52,57,54,55,50,57,53,41,59,10,32,32,32,32,32,32,32,32,32,32,101,32,61,32,40,103,41,32,61,62,32,103,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,48,32,61,61,61,32,100,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,102,32,61,32,51,50,32,45,32,56,32,42,32,99,59,10,32,32,32,32,32,32,32,32,32,32,32,32,101,32,61,32,40,103,41,32,61,62,32,103,32,60,60,32,102,32,62,62,62,32,102,59,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,104,32,61,32,98,46,105,110,99,108,117,100,101,115,40,34,117,110,115,105,103,110,101,100,34,41,32,63,32,102,117,110,99,116,105,111,110,40,103,44,32,108,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,108,32,62,62,62,32,48,59,10,32,32,32,32,32,32,32,32,32,32,125,32,58,32,102,117,110,99,116,105,111,110,40,103,44,32,108,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,108,59,10,32,32,32,32,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,32,32,32,32,77,40,97,44,32,123,32,110,97,109,101,58,32,98,44,32,102,114,111,109,87,105,114,101,84,121,112,101,58,32,101,44,32,116,111,87,105,114,101,84,121,112,101,58,32,104,44,32,66,97,58,32,56,44,32,114,101,97,100,86,97,108,117,101,70,114,111,109,80,111,105,110,116,101,114,58,32,68,98,40,98,44,32,99,44,32,48,32,33,61,61,32,100,41,44,32,67,97,58,32,110,117,108,108,32,125,41,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,104,58,32,40,97,44,32,98,44,32,99,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,100,40,102,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,101,119,32,101,40,119,46,98,117,102,102,101,114,44,32,68,91,102,32,43,32,52,32,62,62,32,50,93,44,32,68,91,102,32,62,62,32,50,93,41,59,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,101,32,61,32,91,73,110,116,56,65,114,114,97,121,44,32,85,105,110,116,56,65,114,114,97,121,44,32,73,110,116,49,54,65,114,114,97,121,44,32,85,105,110,116,49,54,65,114,114,97,121,44,32,73,110,116,51,50,65,114,114,97,121,44,32,85,105,110,116,51,50,65,114,114,97,121,44,32,70,108,111,97,116,51,50,65,114,114,97,121,44,32,70,108,111,97,116,54,52,65,114,114,97,121,93,91,98,93,59,10,32,32,32,32,32,32,32,32,32,32,99,32,61,32,79,40,99,41,59,10,32,32,32,32,32,32,32,32,32,32,77,40,97,44,32,123,32,110,97,109,101,58,32,99,44,32,102,114,111,109,87,105,114,101,84,121,112,101,58,32,100,44,32,66,97,58,32,56,44,32,114,101,97,100,86,97,108,117,101,70,114,111,109,80,111,105,110,116,101,114,58,32,100,32,125,44,32,123,32,36,97,58,32,116,114,117,101,32,125,41,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,116,58,32,40,97,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,77,40,97,44,32,69,98,41,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,36,58,32,40,97,44,32,98,44,32,99,44,32,100,44,32,101,44,32,102,44,32,104,44,32,103,44,32,108,44,32,109,44,32,110,44,32,113,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,99,32,61,32,79,40,99,41,59,10,32,32,32,32,32,32,32,32,32,32,102,32,61,32,84,40,101,44,32,102,41,59,10,32,32,32,32,32,32,32,32,32,32,103,32,61,32,84,40,104,44,32,103,41,59,10,32,32,32,32,32,32,32,32,32,32,109,32,61,32,84,40,108,44,32,109,41,59,10,32,32,32,32,32,32,32,32,32,32,113,32,61,32,84,40,110,44,32,113,41,59,10,32,32,32,32,32,32,32,32,32,32,78,40,91,97,93,44,32,91,98,93,44,32,40,114,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,114,32,61,32,114,91,48,93,59,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,91,110,101,119,32,106,98,40,99,44,32,114,46,117,97,44,32,102,97,108,115,101,44,32,102,97,108,115,101,44,32,116,114,117,101,44,32,114,44,32,100,44,32,102,44,32,103,44,32,109,44,32,113,41,93,59,10,32,32,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,65,58,32,40,97,44,32,98,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,98,32,61,32,79,40,98,41,59,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,99,32,61,32,34,115,116,100,58,58,115,116,114,105,110,103,34,32,61,61,61,32,98,59,10,32,32,32,32,32,32,32,32,32,32,77,40,97,44,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,110,97,109,101,58,32,98,44,10,32,32,32,32,32,32,32,32,32,32,32,32,102,114,111,109,87,105,114,101,84,121,112,101,58,32,102,117,110,99,116,105,111,110,40,100,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,101,32,61,32,68,91,100,32,62,62,32,50,93,44,32,102,32,61,32,100,32,43,32,52,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,99,41,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,104,32,61,32,102,44,32,103,32,61,32,48,59,32,103,32,60,61,32,101,59,32,43,43,103,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,108,32,61,32,102,32,43,32,103,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,103,32,61,61,32,101,32,124,124,32,48,32,61,61,32,120,91,108,93,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,104,32,61,32,104,32,63,32,71,97,40,104,44,32,108,32,45,32,104,41,32,58,32,34,34,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,118,111,105,100,32,48,32,61,61,61,32,109,41,32,118,97,114,32,109,32,61,32,104,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,32,109,32,43,61,32,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,48,41,44,32,109,32,43,61,32,104,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,104,32,61,32,108,32,43,32,49,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,109,32,61,32,65,114,114,97,121,40,101,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,102,111,114,32,40,103,32,61,32,48,59,32,103,32,60,32,101,59,32,43,43,103,41,32,109,91,103,93,32,61,32,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,120,91,102,32,43,32,103,93,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,109,32,61,32,109,46,106,111,105,110,40,34,34,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,85,40,100,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,109,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,116,111,87,105,114,101,84,121,112,101,58,32,102,117,110,99,116,105,111,110,40,100,44,32,101,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,32,105,110,115,116,97,110,99,101,111,102,32,65,114,114,97,121,66,117,102,102,101,114,32,38,38,32,40,101,32,61,32,110,101,119,32,85,105,110,116,56,65,114,114,97,121,40,101,41,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,102,44,32,104,32,61,32,34,115,116,114,105,110,103,34,32,61,61,32,116,121,112,101,111,102,32,101,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,33,40,104,32,124,124,32,101,32,105,110,115,116,97,110,99,101,111,102,32,85,105,110,116,56,65,114,114,97,121,32,124,124,32,101,32,105,110,115,116,97,110,99,101,111,102,32,85,105,110,116,56,67,108,97,109,112,101,100,65,114,114,97,121,32,124,124,32,101,32,105,110,115,116,97,110,99,101,111,102,32,73,110,116,56,65,114,114,97,121,41,41,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,80,40,34,67,97,110,110,111,116,32,112,97,115,115,32,110,111,110,45,115,116,114,105,110,103,32,116,111,32,115,116,100,58,58,115,116,114,105,110,103,34,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,99,32,38,38,32,104,41,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,103,32,61,32,102,32,61,32,48,59,32,103,32,60,32,101,46,108,101,110,103,116,104,59,32,43,43,103,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,108,32,61,32,101,46,99,104,97,114,67,111,100,101,65,116,40,103,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,49,50,55,32,62,61,32,108,32,63,32,102,43,43,32,58,32,50,48,52,55,32,62,61,32,108,32,63,32,102,32,43,61,32,50,32,58,32,53,53,50,57,54,32,60,61,32,108,32,38,38,32,53,55,51,52,51,32,62,61,32,108,32,63,32,40,102,32,43,61,32,52,44,32,43,43,103,41,32,58,32,102,32,43,61,32,51,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,32,102,32,61,32,101,46,108,101,110,103,116,104,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,32,61,32,98,99,40,52,32,43,32,102,32,43,32,49,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,108,32,61,32,103,32,43,32,52,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,68,91,103,32,62,62,32,50,93,32,61,32,102,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,99,32,38,38,32,104,41,32,72,40,101,44,32,108,44,32,102,32,43,32,49,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,32,105,102,32,40,104,41,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,102,111,114,32,40,104,32,61,32,48,59,32,104,32,60,32,102,59,32,43,43,104,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,109,32,61,32,101,46,99,104,97,114,67,111,100,101,65,116,40,104,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,50,53,53,32,60,32,109,41,32,116,104,114,111,119,32,85,40,108,41,44,32,110,101,119,32,80,40,34,83,116,114,105,110,103,32,104,97,115,32,85,84,70,45,49,54,32,99,111,100,101,32,117,110,105,116,115,32,116,104,97,116,32,100,111,32,110,111,116,32,102,105,116,32,105,110,32,56,32,98,105,116,115,34,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,120,91,108,32,43,32,104,93,32,61,32,109,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,32,102,111,114,32,40,104,32,61,32,48,59,32,104,32,60,32,102,59,32,43,43,104,41,32,120,91,108,32,43,32,104,93,32,61,32,101,91,104,93,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,110,117,108,108,32,33,61,61,32,100,32,38,38,32,100,46,112,117,115,104,40,85,44,32,103,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,103,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,66,97,58,32,56,44,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,97,100,86,97,108,117,101,70,114,111,109,80,111,105,110,116,101,114,58,32,73,44,10,32,32,32,32,32,32,32,32,32,32,32,32,67,97,40,100,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,85,40,100,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,115,58,32,40,97,44,32,98,44,32,99,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,99,32,61,32,79,40,99,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,50,32,61,61,61,32,98,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,100,32,61,32,71,98,59,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,101,32,61,32,72,98,59,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,102,32,61,32,73,98,59,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,104,32,61,32,40,103,41,32,61,62,32,122,91,103,32,62,62,32,49,93,59,10,32,32,32,32,32,32,32,32,32,32,125,32,101,108,115,101,32,52,32,61,61,61,32,98,32,38,38,32,40,100,32,61,32,74,98,44,32,101,32,61,32,75,98,44,32,102,32,61,32,76,98,44,32,104,32,61,32,40,103,41,32,61,62,32,68,91,103,32,62,62,32,50,93,41,59,10,32,32,32,32,32,32,32,32,32,32,77,40,97,44,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,110,97,109,101,58,32,99,44,10,32,32,32,32,32,32,32,32,32,32,32,32,102,114,111,109,87,105,114,101,84,121,112,101,58,32,40,103,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,108,32,61,32,68,91,103,32,62,62,32,50,93,44,32,109,44,32,110,32,61,32,103,32,43,32,52,44,32,113,32,61,32,48,59,32,113,32,60,61,32,108,59,32,43,43,113,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,114,32,61,32,103,32,43,32,52,32,43,32,113,32,42,32,98,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,113,32,61,61,32,108,32,124,124,32,48,32,61,61,32,104,40,114,41,41,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,110,32,61,32,100,40,110,44,32,114,32,45,32,110,41,44,32,118,111,105,100,32,48,32,61,61,61,32,109,32,63,32,109,32,61,32,110,32,58,32,40,109,32,43,61,32,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,48,41,44,32,109,32,43,61,32,110,41,44,32,110,32,61,32,114,32,43,32,98,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,85,40,103,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,109,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,116,111,87,105,114,101,84,121,112,101,58,32,40,103,44,32,108,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,34,115,116,114,105,110,103,34,32,33,61,32,116,121,112,101,111,102,32,108,41,32,116,104,114,111,119,32,110,101,119,32,80,40,96,67,97,110,110,111,116,32,112,97,115,115,32,110,111,110,45,115,116,114,105,110,103,32,116,111,32,67,43,43,32,115,116,114,105,110,103,32,116,121,112,101,32,36,123,99,125,96,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,109,32,61,32,102,40,108,41,44,32,110,32,61,32,98,99,40,52,32,43,32,109,32,43,32,98,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,68,91,110,32,62,62,32,50,93,32,61,32,109,32,47,32,98,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,40,108,44,32,110,32,43,32,52,44,32,109,32,43,32,98,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,110,117,108,108,32,33,61,61,32,103,32,38,38,32,103,46,112,117,115,104,40,85,44,32,110,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,66,97,58,32,56,44,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,97,100,86,97,108,117,101,70,114,111,109,80,111,105,110,116,101,114,58,32,73,44,10,32,32,32,32,32,32,32,32,32,32,32,32,67,97,40,103,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,85,40,103,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,119,58,32,40,97,44,32,98,44,32,99,44,32,100,44,32,101,44,32,102,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,75,97,91,97,93,32,61,32,123,32,110,97,109,101,58,32,79,40,98,41,44,32,78,97,58,32,84,40,99,44,32,100,41,44,32,68,97,58,32,84,40,101,44,32,102,41,44,32,81,97,58,32,91,93,32,125,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,106,58,32,40,97,44,32,98,44,32,99,44,32,100,44,32,101,44,32,102,44,32,104,44,32,103,44,32,108,44,32,109,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,75,97,91,97,93,46,81,97,46,112,117,115,104,40,123,32,85,97,58,32,79,40,98,41,44,32,90,97,58,32,99,44,32,88,97,58,32,84,40,100,44,32,101,41,44,32,89,97,58,32,102,44,32,102,98,58,32,104,44,32,101,98,58,32,84,40,103,44,32,108,41,44,32,103,98,58,32,109,32,125,41,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,87,58,32,40,97,44,32,98,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,98,32,61,32,79,40,98,41,59,10,32,32,32,32,32,32,32,32,32,32,77,40,97,44,32,123,32,105,98,58,32,116,114,117,101,44,32,110,97,109,101,58,32,98,44,32,66,97,58,32,48,44,32,102,114,111,109,87,105,114,101,84,121,112,101,58,32,40,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,125,44,32,116,111,87,105,114,101,84,121,112,101,58,32,40,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,125,32,125,41,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,72,58,32,40,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,69,97,32,61,32,102,97,108,115,101,59,10,32,32,32,32,32,32,32,32,32,32,77,98,32,61,32,48,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,68,58,32,40,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,116,104,114,111,119,32,73,110,102,105,110,105,116,121,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,90,58,32,40,97,44,32,98,44,32,99,44,32,100,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,97,32,61,32,78,98,91,97,93,59,10,32,32,32,32,32,32,32,32,32,32,98,32,61,32,121,98,40,98,41,59,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,97,40,110,117,108,108,44,32,98,44,32,99,44,32,100,41,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,66,58,32,120,98,44,10,32,32,32,32,32,32,32,32,89,58,32,40,97,44,32,98,44,32,99,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,100,32,61,32,80,98,40,97,44,32,98,41,44,32,101,32,61,32,100,46,115,104,105,102,116,40,41,59,10,32,32,32,32,32,32,32,32,32,32,97,45,45,59,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,102,32,61,32,65,114,114,97,121,40,97,41,59,10,32,32,32,32,32,32,32,32,32,32,98,32,61,32,96,109,101,116,104,111,100,67,97,108,108,101,114,60,40,36,123,100,46,109,97,112,40,40,104,41,32,61,62,32,104,46,110,97,109,101,41,46,106,111,105,110,40,34,44,32,34,41,125,41,32,61,62,32,36,123,101,46,110,97,109,101,125,62,96,59,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,79,98,40,10,32,32,32,32,32,32,32,32,32,32,32,32,82,40,98,44,32,40,104,44,32,103,44,32,108,44,32,109,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,110,32,61,32,48,44,32,113,32,61,32,48,59,32,113,32,60,32,97,59,32,43,43,113,41,32,102,91,113,93,32,61,32,100,91,113,93,46,114,101,97,100,86,97,108,117,101,70,114,111,109,80,111,105,110,116,101,114,40,109,32,43,32,110,41,44,32,110,32,43,61,32,100,91,113,93,46,66,97,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,32,61,32,49,32,61,61,61,32,99,32,63,32,81,98,40,103,44,32,102,41,32,58,32,103,46,97,112,112,108,121,40,104,44,32,102,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,104,32,61,32,91,93,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,32,61,32,101,46,116,111,87,105,114,101,84,121,112,101,40,104,44,32,103,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,104,46,108,101,110,103,116,104,32,38,38,32,40,68,91,108,32,62,62,32,50,93,32,61,32,104,98,40,104,41,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,103,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,41,10,32,32,32,32,32,32,32,32,32,32,41,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,95,58,32,40,97,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,57,32,60,32,97,32,38,38,32,40,86,91,97,32,43,32,49,93,32,43,61,32,49,41,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,88,58,32,40,97,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,98,32,61,32,121,98,40,97,41,59,10,32,32,32,32,32,32,32,32,32,32,76,97,40,98,41,59,10,32,32,32,32,32,32,32,32,32,32,120,98,40,97,41,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,111,58,32,40,97,44,32,98,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,97,32,61,32,66,98,40,97,44,32,34,95,101,109,118,97,108,95,116,97,107,101,95,118,97,108,117,101,34,41,59,10,32,32,32,32,32,32,32,32,32,32,97,32,61,32,97,46,114,101,97,100,86,97,108,117,101,70,114,111,109,80,111,105,110,116,101,114,40,98,41,59,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,104,98,40,97,41,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,69,58,32,40,97,44,32,98,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,82,98,91,97,93,32,38,38,32,40,99,108,101,97,114,84,105,109,101,111,117,116,40,82,98,91,97,93,46,105,100,41,44,32,100,101,108,101,116,101,32,82,98,91,97,93,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,33,98,41,32,114,101,116,117,114,110,32,48,59,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,99,32,61,32,115,101,116,84,105,109,101,111,117,116,40,40,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,100,101,108,101,116,101,32,82,98,91,97,93,59,10,32,32,32,32,32,32,32,32,32,32,32,32,85,98,40,40,41,32,61,62,32,99,99,40,97,44,32,112,101,114,102,111,114,109,97,110,99,101,46,110,111,119,40,41,41,41,59,10,32,32,32,32,32,32,32,32,32,32,125,44,32,98,41,59,10,32,32,32,32,32,32,32,32,32,32,82,98,91,97,93,32,61,32,123,32,105,100,58,32,99,44,32,106,98,58,32,98,32,125,59,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,48,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,70,58,32,40,97,44,32,98,44,32,99,44,32,100,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,101,32,61,32,40,47,42,32,64,95,95,80,85,82,69,95,95,32,42,47,32,110,101,119,32,68,97,116,101,40,41,41,46,103,101,116,70,117,108,108,89,101,97,114,40,41,44,32,102,32,61,32,110,101,119,32,68,97,116,101,40,101,44,32,48,44,32,49,41,46,103,101,116,84,105,109,101,122,111,110,101,79,102,102,115,101,116,40,41,59,10,32,32,32,32,32,32,32,32,32,32,101,32,61,32,110,101,119,32,68,97,116,101,40,101,44,32,54,44,32,49,41,46,103,101,116,84,105,109,101,122,111,110,101,79,102,102,115,101,116,40,41,59,10,32,32,32,32,32,32,32,32,32,32,68,91,97,32,62,62,32,50,93,32,61,32,54,48,32,42,32,77,97,116,104,46,109,97,120,40,102,44,32,101,41,59,10,32,32,32,32,32,32,32,32,32,32,67,91,98,32,62,62,32,50,93,32,61,32,78,117,109,98,101,114,40,102,32,33,61,32,101,41,59,10,32,32,32,32,32,32,32,32,32,32,98,32,61,32,40,104,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,103,32,61,32,77,97,116,104,46,97,98,115,40,104,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,96,85,84,67,36,123,48,32,60,61,32,104,32,63,32,34,45,34,32,58,32,34,43,34,125,36,123,83,116,114,105,110,103,40,77,97,116,104,46,102,108,111,111,114,40,103,32,47,32,54,48,41,41,46,112,97,100,83,116,97,114,116,40,50,44,32,34,48,34,41,125,36,123,83,116,114,105,110,103,40,103,32,37,32,54,48,41,46,112,97,100,83,116,97,114,116,40,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,50,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,34,48,34,10,32,32,32,32,32,32,32,32,32,32,32,32,41,125,96,59,10,32,32,32,32,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,32,32,32,32,97,32,61,32,98,40,102,41,59,10,32,32,32,32,32,32,32,32,32,32,98,32,61,32,98,40,101,41,59,10,32,32,32,32,32,32,32,32,32,32,101,32,60,32,102,32,63,32,40,72,40,97,44,32,99,44,32,49,55,41,44,32,72,40,98,44,32,100,44,32,49,55,41,41,32,58,32,40,72,40,97,44,32,100,44,32,49,55,41,44,32,72,40,98,44,32,99,44,32,49,55,41,41,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,97,97,58,32,40,41,32,61,62,32,112,101,114,102,111,114,109,97,110,99,101,46,110,111,119,40,41,44,10,32,32,32,32,32,32,32,32,71,58,32,40,97,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,98,32,61,32,120,46,108,101,110,103,116,104,59,10,32,32,32,32,32,32,32,32,32,32,97,32,62,62,62,61,32,48,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,50,49,52,55,52,56,51,54,52,56,32,60,32,97,41,32,114,101,116,117,114,110,32,102,97,108,115,101,59,10,32,32,32,32,32,32,32,32,32,32,102,111,114,32,40,118,97,114,32,99,32,61,32,49,59,32,52,32,62,61,32,99,59,32,99,32,42,61,32,50,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,100,32,61,32,98,32,42,32,40,49,32,43,32,48,46,50,32,47,32,99,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,100,32,61,32,77,97,116,104,46,109,105,110,40,100,44,32,97,32,43,32,49,48,48,54,54,51,50,57,54,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,97,58,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,100,32,61,32,40,77,97,116,104,46,109,105,110,40,50,49,52,55,52,56,51,54,52,56,44,32,54,53,53,51,54,32,42,32,77,97,116,104,46,99,101,105,108,40,77,97,116,104,46,109,97,120,40,97,44,32,100,41,32,47,32,54,53,53,51,54,41,41,32,45,32,107,97,46,98,117,102,102,101,114,46,98,121,116,101,76,101,110,103,116,104,32,43,32,54,53,53,51,53,41,32,47,32,54,53,53,51,54,32,124,32,48,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,114,121,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,107,97,46,103,114,111,119,40,100,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,97,40,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,101,32,61,32,49,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,98,114,101,97,107,32,97,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,32,99,97,116,99,104,32,40,102,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,32,61,32,118,111,105,100,32,48,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,101,41,32,114,101,116,117,114,110,32,116,114,117,101,59,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,102,97,108,115,101,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,83,58,32,40,97,44,32,98,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,99,32,61,32,48,59,10,32,32,32,32,32,32,32,32,32,32,88,98,40,41,46,102,111,114,69,97,99,104,40,40,100,44,32,101,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,102,32,61,32,98,32,43,32,99,59,10,32,32,32,32,32,32,32,32,32,32,32,32,101,32,61,32,68,91,97,32,43,32,52,32,42,32,101,32,62,62,32,50,93,32,61,32,102,59,10,32,32,32,32,32,32,32,32,32,32,32,32,102,111,114,32,40,102,32,61,32,48,59,32,102,32,60,32,100,46,108,101,110,103,116,104,59,32,43,43,102,41,32,119,91,101,43,43,93,32,61,32,100,46,99,104,97,114,67,111,100,101,65,116,40,102,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,119,91,101,93,32,61,32,48,59,10,32,32,32,32,32,32,32,32,32,32,32,32,99,32,43,61,32,100,46,108,101,110,103,116,104,32,43,32,49,59,10,32,32,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,48,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,84,58,32,40,97,44,32,98,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,99,32,61,32,88,98,40,41,59,10,32,32,32,32,32,32,32,32,32,32,68,91,97,32,62,62,32,50,93,32,61,32,99,46,108,101,110,103,116,104,59,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,100,32,61,32,48,59,10,32,32,32,32,32,32,32,32,32,32,99,46,102,111,114,69,97,99,104,40,40,101,41,32,61,62,32,100,32,43,61,32,101,46,108,101,110,103,116,104,32,43,32,49,41,59,10,32,32,32,32,32,32,32,32,32,32,68,91,98,32,62,62,32,50,93,32,61,32,100,59,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,48,59,10,32,32,32,32,32,32,32,32,125,44,10,32,32,32,32,32,32,32,32,80,58,32,40,41,32,61,62,32,53,50,44,10,32,32,32,32,32,32,32,32,78,58,32,40,41,32,61,62,32,53,50,44,10,32,32,32,32,32,32,32,32,105,58,32,100,99,44,10,32,32,32,32,32,32,32,32,100,58,32,101,99,44,10,32,32,32,32,32,32,32,32,101,58,32,102,99,44,10,32,32,32,32,32,32,32,32,112,58,32,103,99,44,10,32,32,32,32,32,32,32,32,121,58,32,104,99,44,10,32,32,32,32,32,32,32,32,98,58,32,105,99,44,10,32,32,32,32,32,32,32,32,97,58,32,106,99,44,10,32,32,32,32,32,32,32,32,103,58,32,107,99,44,10,32,32,32,32,32,32,32,32,110,58,32,108,99,44,10,32,32,32,32,32,32,32,32,82,58,32,84,98,44,10,32,32,32,32,32,32,32,32,73,58,32,40,97,44,32,98,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,90,98,40,120,46,115,117,98,97,114,114,97,121,40,97,44,32,97,32,43,32,98,41,41,59,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,48,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,44,32,87,32,61,32,102,117,110,99,116,105,111,110,40,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,95,97,50,59,10,32,32,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,97,40,99,41,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,95,97,51,59,10,32,32,32,32,32,32,32,32,32,32,87,32,61,32,99,46,101,120,112,111,114,116,115,59,10,32,32,32,32,32,32,32,32,32,32,107,97,32,61,32,87,46,98,97,59,10,32,32,32,32,32,32,32,32,32,32,112,97,40,41,59,10,32,32,32,32,32,32,32,32,32,32,83,32,61,32,87,46,102,97,59,10,32,32,32,32,32,32,32,32,32,32,114,97,46,117,110,115,104,105,102,116,40,87,46,99,97,41,59,10,32,32,32,32,32,32,32,32,32,32,70,45,45,59,10,32,32,32,32,32,32,32,32,32,32,40,95,97,51,32,61,32,107,46,109,111,110,105,116,111,114,82,117,110,68,101,112,101,110,100,101,110,99,105,101,115,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,51,46,99,97,108,108,40,107,44,32,70,41,59,10,32,32,32,32,32,32,32,32,32,32,48,32,61,61,32,70,32,38,38,32,40,110,117,108,108,32,33,61,61,32,117,97,32,38,38,32,40,99,108,101,97,114,73,110,116,101,114,118,97,108,40,117,97,41,44,32,117,97,32,61,32,110,117,108,108,41,44,32,71,32,38,38,32,40,99,32,61,32,71,44,32,71,32,61,32,110,117,108,108,44,32,99,40,41,41,41,59,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,87,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,70,43,43,59,10,32,32,32,32,32,32,32,32,40,95,97,50,32,61,32,107,46,109,111,110,105,116,111,114,82,117,110,68,101,112,101,110,100,101,110,99,105,101,115,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,50,46,99,97,108,108,40,107,44,32,70,41,59,10,32,32,32,32,32,32,32,32,118,97,114,32,98,32,61,32,123,32,97,58,32,109,99,32,125,59,10,32,32,32,32,32,32,32,32,105,102,32,40,107,46,105,110,115,116,97,110,116,105,97,116,101,87,97,115,109,41,10,32,32,32,32,32,32,32,32,32,32,116,114,121,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,107,46,105,110,115,116,97,110,116,105,97,116,101,87,97,115,109,40,98,44,32,97,41,59,10,32,32,32,32,32,32,32,32,32,32,125,32,99,97,116,99,104,32,40,99,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,116,40,96,77,111,100,117,108,101,46,105,110,115,116,97,110,116,105,97,116,101,87,97,115,109,32,99,97,108,108,98,97,99,107,32,102,97,105,108,101,100,32,119,105,116,104,32,101,114,114,111,114,58,32,36,123,99,125,96,41,44,32,98,97,40,99,41,59,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,120,97,32,33,61,32,110,117,108,108,32,63,32,120,97,32,58,32,120,97,32,61,32,119,97,40,34,68,111,116,76,111,116,116,105,101,80,108,97,121,101,114,46,119,97,115,109,34,41,32,63,32,34,68,111,116,76,111,116,116,105,101,80,108,97,121,101,114,46,119,97,115,109,34,32,58,32,107,46,108,111,99,97,116,101,70,105,108,101,32,63,32,107,46,108,111,99,97,116,101,70,105,108,101,40,34,68,111,116,76,111,116,116,105,101,80,108,97,121,101,114,46,119,97,115,109,34,44,32,112,41,32,58,32,112,32,43,32,34,68,111,116,76,111,116,116,105,101,80,108,97,121,101,114,46,119,97,115,109,34,59,10,32,32,32,32,32,32,32,32,66,97,40,98,44,32,102,117,110,99,116,105,111,110,40,99,41,32,123,10,32,32,32,32,32,32,32,32,32,32,97,40,99,46,105,110,115,116,97,110,99,101,41,59,10,32,32,32,32,32,32,32,32,125,41,46,99,97,116,99,104,40,98,97,41,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,123,125,59,10,32,32,32,32,32,32,125,40,41,44,32,98,99,32,61,32,40,97,41,32,61,62,32,40,98,99,32,61,32,87,46,100,97,41,40,97,41,44,32,111,98,32,61,32,40,97,41,32,61,62,32,40,111,98,32,61,32,87,46,101,97,41,40,97,41,44,32,85,32,61,32,40,97,41,32,61,62,32,40,85,32,61,32,87,46,103,97,41,40,97,41,44,32,99,99,32,61,32,40,97,44,32,98,41,32,61,62,32,40,99,99,32,61,32,87,46,104,97,41,40,97,44,32,98,41,44,32,88,32,61,32,40,97,44,32,98,41,32,61,62,32,40,88,32,61,32,87,46,105,97,41,40,97,44,32,98,41,44,32,89,32,61,32,40,97,41,32,61,62,32,40,89,32,61,32,87,46,106,97,41,40,97,41,44,32,90,32,61,32,40,41,32,61,62,32,40,90,32,61,32,87,46,107,97,41,40,41,59,10,32,32,32,32,32,32,107,46,100,121,110,67,97,108,108,95,105,105,106,106,32,61,32,40,97,44,32,98,44,32,99,44,32,100,44,32,101,44,32,102,41,32,61,62,32,40,107,46,100,121,110,67,97,108,108,95,105,105,106,106,32,61,32,87,46,108,97,41,40,97,44,32,98,44,32,99,44,32,100,44,32,101,44,32,102,41,59,10,32,32,32,32,32,32,107,46,100,121,110,67,97,108,108,95,118,105,106,106,32,61,32,40,97,44,32,98,44,32,99,44,32,100,44,32,101,44,32,102,41,32,61,62,32,40,107,46,100,121,110,67,97,108,108,95,118,105,106,106,32,61,32,87,46,109,97,41,40,97,44,32,98,44,32,99,44,32,100,44,32,101,44,32,102,41,59,10,32,32,32,32,32,32,107,46,100,121,110,67,97,108,108,95,106,105,105,105,32,61,32,40,97,44,32,98,44,32,99,44,32,100,41,32,61,62,32,40,107,46,100,121,110,67,97,108,108,95,106,105,105,105,32,61,32,87,46,110,97,41,40,97,44,32,98,44,32,99,44,32,100,41,59,10,32,32,32,32,32,32,107,46,100,121,110,67,97,108,108,95,106,105,105,32,61,32,40,97,44,32,98,44,32,99,41,32,61,62,32,40,107,46,100,121,110,67,97,108,108,95,106,105,105,32,61,32,87,46,111,97,41,40,97,44,32,98,44,32,99,41,59,10,32,32,32,32,32,32,107,46,100,121,110,67,97,108,108,95,118,105,105,106,105,105,32,61,32,40,97,44,32,98,44,32,99,44,32,100,44,32,101,44,32,102,44,32,104,41,32,61,62,32,40,107,46,100,121,110,67,97,108,108,95,118,105,105,106,105,105,32,61,32,87,46,112,97,41,40,97,44,32,98,44,32,99,44,32,100,44,32,101,44,32,102,44,32,104,41,59,10,32,32,32,32,32,32,107,46,100,121,110,67,97,108,108,95,105,105,105,105,105,106,32,61,32,40,97,44,32,98,44,32,99,44,32,100,44,32,101,44,32,102,44,32,104,41,32,61,62,32,40,107,46,100,121,110,67,97,108,108,95,105,105,105,105,105,106,32,61,32,87,46,113,97,41,40,97,44,32,98,44,32,99,44,32,100,44,32,101,44,32,102,44,32,104,41,59,10,32,32,32,32,32,32,107,46,100,121,110,67,97,108,108,95,105,105,105,105,105,106,106,32,61,32,40,97,44,32,98,44,32,99,44,32,100,44,32,101,44,32,102,44,32,104,44,32,103,44,32,108,41,32,61,62,32,40,107,46,100,121,110,67,97,108,108,95,105,105,105,105,105,106,106,32,61,32,87,46,114,97,41,40,97,44,32,98,44,32,99,44,32,100,44,32,101,44,32,102,44,32,104,44,32,103,44,32,108,41,59,10,32,32,32,32,32,32,107,46,100,121,110,67,97,108,108,95,105,105,105,105,105,105,106,106,32,61,32,40,97,44,32,98,44,32,99,44,32,100,44,32,101,44,32,102,44,32,104,44,32,103,44,32,108,44,32,109,41,32,61,62,32,40,107,46,100,121,110,67,97,108,108,95,105,105,105,105,105,105,106,106,32,61,32,87,46,115,97,41,40,97,44,32,98,44,32,99,44,32,100,44,32,101,44,32,102,44,32,104,44,32,103,44,32,108,44,32,109,41,59,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,106,99,40,97,44,32,98,44,32,99,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,100,32,61,32,90,40,41,59,10,32,32,32,32,32,32,32,32,116,114,121,32,123,10,32,32,32,32,32,32,32,32,32,32,83,46,103,101,116,40,97,41,40,98,44,32,99,41,59,10,32,32,32,32,32,32,32,32,125,32,99,97,116,99,104,32,40,101,41,32,123,10,32,32,32,32,32,32,32,32,32,32,89,40,100,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,101,32,33,61,61,32,101,32,43,32,48,41,32,116,104,114,111,119,32,101,59,10,32,32,32,32,32,32,32,32,32,32,88,40,49,44,32,48,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,105,99,40,97,44,32,98,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,99,32,61,32,90,40,41,59,10,32,32,32,32,32,32,32,32,116,114,121,32,123,10,32,32,32,32,32,32,32,32,32,32,83,46,103,101,116,40,97,41,40,98,41,59,10,32,32,32,32,32,32,32,32,125,32,99,97,116,99,104,32,40,100,41,32,123,10,32,32,32,32,32,32,32,32,32,32,89,40,99,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,100,32,33,61,61,32,100,32,43,32,48,41,32,116,104,114,111,119,32,100,59,10,32,32,32,32,32,32,32,32,32,32,88,40,49,44,32,48,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,102,99,40,97,44,32,98,44,32,99,44,32,100,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,101,32,61,32,90,40,41,59,10,32,32,32,32,32,32,32,32,116,114,121,32,123,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,46,103,101,116,40,97,41,40,98,44,32,99,44,32,100,41,59,10,32,32,32,32,32,32,32,32,125,32,99,97,116,99,104,32,40,102,41,32,123,10,32,32,32,32,32,32,32,32,32,32,89,40,101,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,102,32,33,61,61,32,102,32,43,32,48,41,32,116,104,114,111,119,32,102,59,10,32,32,32,32,32,32,32,32,32,32,88,40,49,44,32,48,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,101,99,40,97,44,32,98,44,32,99,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,100,32,61,32,90,40,41,59,10,32,32,32,32,32,32,32,32,116,114,121,32,123,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,46,103,101,116,40,97,41,40,98,44,32,99,41,59,10,32,32,32,32,32,32,32,32,125,32,99,97,116,99,104,32,40,101,41,32,123,10,32,32,32,32,32,32,32,32,32,32,89,40,100,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,101,32,33,61,61,32,101,32,43,32,48,41,32,116,104,114,111,119,32,101,59,10,32,32,32,32,32,32,32,32,32,32,88,40,49,44,32,48,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,100,99,40,97,44,32,98,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,99,32,61,32,90,40,41,59,10,32,32,32,32,32,32,32,32,116,114,121,32,123,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,46,103,101,116,40,97,41,40,98,41,59,10,32,32,32,32,32,32,32,32,125,32,99,97,116,99,104,32,40,100,41,32,123,10,32,32,32,32,32,32,32,32,32,32,89,40,99,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,100,32,33,61,61,32,100,32,43,32,48,41,32,116,104,114,111,119,32,100,59,10,32,32,32,32,32,32,32,32,32,32,88,40,49,44,32,48,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,103,99,40,97,44,32,98,44,32,99,44,32,100,44,32,101,44,32,102,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,104,32,61,32,90,40,41,59,10,32,32,32,32,32,32,32,32,116,114,121,32,123,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,46,103,101,116,40,97,41,40,98,44,32,99,44,32,100,44,32,101,44,32,102,41,59,10,32,32,32,32,32,32,32,32,125,32,99,97,116,99,104,32,40,103,41,32,123,10,32,32,32,32,32,32,32,32,32,32,89,40,104,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,103,32,33,61,61,32,103,32,43,32,48,41,32,116,104,114,111,119,32,103,59,10,32,32,32,32,32,32,32,32,32,32,88,40,49,44,32,48,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,108,99,40,97,44,32,98,44,32,99,44,32,100,44,32,101,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,102,32,61,32,90,40,41,59,10,32,32,32,32,32,32,32,32,116,114,121,32,123,10,32,32,32,32,32,32,32,32,32,32,83,46,103,101,116,40,97,41,40,98,44,32,99,44,32,100,44,32,101,41,59,10,32,32,32,32,32,32,32,32,125,32,99,97,116,99,104,32,40,104,41,32,123,10,32,32,32,32,32,32,32,32,32,32,89,40,102,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,104,32,33,61,61,32,104,32,43,32,48,41,32,116,104,114,111,119,32,104,59,10,32,32,32,32,32,32,32,32,32,32,88,40,49,44,32,48,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,107,99,40,97,44,32,98,44,32,99,44,32,100,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,101,32,61,32,90,40,41,59,10,32,32,32,32,32,32,32,32,116,114,121,32,123,10,32,32,32,32,32,32,32,32,32,32,83,46,103,101,116,40,97,41,40,98,44,32,99,44,32,100,41,59,10,32,32,32,32,32,32,32,32,125,32,99,97,116,99,104,32,40,102,41,32,123,10,32,32,32,32,32,32,32,32,32,32,89,40,101,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,102,32,33,61,61,32,102,32,43,32,48,41,32,116,104,114,111,119,32,102,59,10,32,32,32,32,32,32,32,32,32,32,88,40,49,44,32,48,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,104,99,40,97,41,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,98,32,61,32,90,40,41,59,10,32,32,32,32,32,32,32,32,116,114,121,32,123,10,32,32,32,32,32,32,32,32,32,32,83,46,103,101,116,40,97,41,40,41,59,10,32,32,32,32,32,32,32,32,125,32,99,97,116,99,104,32,40,99,41,32,123,10,32,32,32,32,32,32,32,32,32,32,89,40,98,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,99,32,33,61,61,32,99,32,43,32,48,41,32,116,104,114,111,119,32,99,59,10,32,32,32,32,32,32,32,32,32,32,88,40,49,44,32,48,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,118,97,114,32,110,99,59,10,32,32,32,32,32,32,71,32,61,32,102,117,110,99,116,105,111,110,32,111,99,40,41,32,123,10,32,32,32,32,32,32,32,32,110,99,32,124,124,32,112,99,40,41,59,10,32,32,32,32,32,32,32,32,110,99,32,124,124,32,40,71,32,61,32,111,99,41,59,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,112,99,40,41,32,123,10,32,32,32,32,32,32,32,32,102,117,110,99,116,105,111,110,32,97,40,41,32,123,10,32,32,32,32,32,32,32,32,32,32,118,97,114,32,95,97,50,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,33,110,99,32,38,38,32,40,110,99,32,61,32,116,114,117,101,44,32,107,46,99,97,108,108,101,100,82,117,110,32,61,32,116,114,117,101,44,32,33,108,97,41,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,68,97,40,114,97,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,97,97,40,107,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,40,95,97,50,32,61,32,107,46,111,110,82,117,110,116,105,109,101,73,110,105,116,105,97,108,105,122,101,100,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,50,46,99,97,108,108,40,107,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,107,46,112,111,115,116,82,117,110,41,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,102,111,114,32,40,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,107,46,112,111,115,116,82,117,110,32,38,38,32,40,107,46,112,111,115,116,82,117,110,32,61,32,91,107,46,112,111,115,116,82,117,110,93,41,59,32,107,46,112,111,115,116,82,117,110,46,108,101,110,103,116,104,59,32,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,98,32,61,32,107,46,112,111,115,116,82,117,110,46,115,104,105,102,116,40,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,115,97,46,117,110,115,104,105,102,116,40,98,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,32,32,68,97,40,115,97,41,59,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,105,102,32,40,33,40,48,32,60,32,70,41,41,32,123,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,107,46,112,114,101,82,117,110,41,32,102,111,114,32,40,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,107,46,112,114,101,82,117,110,32,38,38,32,40,107,46,112,114,101,82,117,110,32,61,32,91,107,46,112,114,101,82,117,110,93,41,59,32,107,46,112,114,101,82,117,110,46,108,101,110,103,116,104,59,32,41,32,116,97,40,41,59,10,32,32,32,32,32,32,32,32,32,32,68,97,40,113,97,41,59,10,32,32,32,32,32,32,32,32,32,32,48,32,60,32,70,32,124,124,32,40,107,46,115,101,116,83,116,97,116,117,115,32,63,32,40,107,46,115,101,116,83,116,97,116,117,115,40,34,82,117,110,110,105,110,103,46,46,46,34,41,44,32,115,101,116,84,105,109,101,111,117,116,40,40,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,115,101,116,84,105,109,101,111,117,116,40,40,41,32,61,62,32,107,46,115,101,116,83,116,97,116,117,115,40,34,34,41,44,32,49,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,97,40,41,59,10,32,32,32,32,32,32,32,32,32,32,125,44,32,49,41,41,32,58,32,97,40,41,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,105,102,32,40,107,46,112,114,101,73,110,105,116,41,10,32,32,32,32,32,32,32,32,102,111,114,32,40,34,102,117,110,99,116,105,111,110,34,32,61,61,32,116,121,112,101,111,102,32,107,46,112,114,101,73,110,105,116,32,38,38,32,40,107,46,112,114,101,73,110,105,116,32,61,32,91,107,46,112,114,101,73,110,105,116,93,41,59,32,48,32,60,32,107,46,112,114,101,73,110,105,116,46,108,101,110,103,116,104,59,32,41,32,107,46,112,114,101,73,110,105,116,46,112,111,112,40,41,40,41,59,10,32,32,32,32,32,32,112,99,40,41,59,10,32,32,32,32,32,32,109,111,100,117,108,101,82,116,110,32,61,32,101,97,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,109,111,100,117,108,101,82,116,110,59,10,32,32,32,32,125,59,10,32,32,125,41,40,41,59,10,32,32,118,97,114,32,100,111,116,108,111,116,116,105,101,95,112,108,97,121,101,114,95,100,101,102,97,117,108,116,32,61,32,99,114,101,97,116,101,68,111,116,76,111,116,116,105,101,80,108,97,121,101,114,77,111,100,117,108,101,59,10,10,32,32,47,47,32,115,114,99,47,99,111,114,101,47,100,111,116,108,111,116,116,105,101,45,119,97,115,109,45,108,111,97,100,101,114,46,116,115,10,32,32,118,97,114,32,68,111,116,76,111,116,116,105,101,87,97,115,109,76,111,97,100,101,114,32,61,32,99,108,97,115,115,32,123,10,32,32,32,32,99,111,110,115,116,114,117,99,116,111,114,40,41,32,123,10,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,34,82,101,110,100,101,114,101,114,76,111,97,100,101,114,32,105,115,32,97,32,115,116,97,116,105,99,32,99,108,97,115,115,32,97,110,100,32,99,97,110,110,111,116,32,98,101,32,105,110,115,116,97,110,116,105,97,116,101,100,46,34,41,59,10,32,32,32,32,125,10,32,32,32,32,115,116,97,116,105,99,32,95,116,114,121,76,111,97,100,40,117,114,108,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,95,95,97,115,121,110,99,40,116,104,105,115,44,32,110,117,108,108,44,32,102,117,110,99,116,105,111,110,42,32,40,41,32,123,10,32,32,32,32,32,32,32,32,99,111,110,115,116,32,109,111,100,117,108,101,32,61,32,121,105,101,108,100,32,100,111,116,108,111,116,116,105,101,95,112,108,97,121,101,114,95,100,101,102,97,117,108,116,40,123,32,108,111,99,97,116,101,70,105,108,101,58,32,40,41,32,61,62,32,117,114,108,32,125,41,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,109,111,100,117,108,101,59,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,125,10,32,32,32,32,47,42,42,10,32,32,32,32,32,42,32,84,114,105,101,115,32,116,111,32,108,111,97,100,32,116,104,101,32,87,65,83,77,32,109,111,100,117,108,101,32,102,114,111,109,32,116,104,101,32,112,114,105,109,97,114,121,32,85,82,76,44,32,102,97,108,108,105,110,103,32,98,97,99,107,32,116,111,32,97,32,98,97,99,107,117,112,32,85,82,76,32,105,102,32,110,101,99,101,115,115,97,114,121,46,10,32,32,32,32,32,42,32,84,104,114,111,119,115,32,97,110,32,101,114,114,111,114,32,105,102,32,98,111,116,104,32,85,82,76,115,32,102,97,105,108,32,116,111,32,108,111,97,100,32,116,104,101,32,109,111,100,117,108,101,46,10,32,32,32,32,32,42,32,64,114,101,116,117,114,110,115,32,80,114,111,109,105,115,101,60,77,111,100,117,108,101,62,32,45,32,65,32,112,114,111,109,105,115,101,32,116,104,97,116,32,114,101,115,111,108,118,101,115,32,116,111,32,116,104,101,32,108,111,97,100,101,100,32,109,111,100,117,108,101,46,10,32,32,32,32,32,42,47,10,32,32,32,32,115,116,97,116,105,99,32,95,108,111,97,100,87,105,116,104,66,97,99,107,117,112,40,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,95,95,97,115,121,110,99,40,116,104,105,115,44,32,110,117,108,108,44,32,102,117,110,99,116,105,111,110,42,32,40,41,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,33,116,104,105,115,46,95,77,111,100,117,108,101,80,114,111,109,105,115,101,41,32,123,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,95,77,111,100,117,108,101,80,114,111,109,105,115,101,32,61,32,116,104,105,115,46,95,116,114,121,76,111,97,100,40,116,104,105,115,46,95,119,97,115,109,85,82,76,41,46,99,97,116,99,104,40,40,105,110,105,116,105,97,108,69,114,114,111,114,41,32,61,62,32,95,95,97,115,121,110,99,40,116,104,105,115,44,32,110,117,108,108,44,32,102,117,110,99,116,105,111,110,42,32,40,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,99,111,110,115,116,32,98,97,99,107,117,112,85,114,108,32,61,32,96,104,116,116,112,115,58,47,47,117,110,112,107,103,46,99,111,109,47,36,123,80,65,67,75,65,71,69,95,78,65,77,69,125,64,36,123,80,65,67,75,65,71,69,95,86,69,82,83,73,79,78,125,47,100,105,115,116,47,100,111,116,108,111,116,116,105,101,45,112,108,97,121,101,114,46,119,97,115,109,96,59,10,32,32,32,32,32,32,32,32,32,32,32,32,99,111,110,115,111,108,101,46,119,97,114,110,40,96,80,114,105,109,97,114,121,32,87,65,83,77,32,108,111,97,100,32,102,97,105,108,101,100,32,102,114,111,109,32,36,123,116,104,105,115,46,95,119,97,115,109,85,82,76,125,46,32,69,114,114,111,114,58,32,36,123,105,110,105,116,105,97,108,69,114,114,111,114,46,109,101,115,115,97,103,101,125,96,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,99,111,110,115,111,108,101,46,119,97,114,110,40,96,65,116,116,101,109,112,116,105,110,103,32,116,111,32,108,111,97,100,32,87,65,83,77,32,102,114,111,109,32,98,97,99,107,117,112,32,85,82,76,58,32,36,123,98,97,99,107,117,112,85,114,108,125,96,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,116,114,121,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,121,105,101,108,100,32,116,104,105,115,46,95,116,114,121,76,111,97,100,40,98,97,99,107,117,112,85,114,108,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,32,99,97,116,99,104,32,40,98,97,99,107,117,112,69,114,114,111,114,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,99,111,110,115,111,108,101,46,101,114,114,111,114,40,96,80,114,105,109,97,114,121,32,87,65,83,77,32,85,82,76,32,102,97,105,108,101,100,58,32,36,123,105,110,105,116,105,97,108,69,114,114,111,114,46,109,101,115,115,97,103,101,125,96,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,99,111,110,115,111,108,101,46,101,114,114,111,114,40,96,66,97,99,107,117,112,32,87,65,83,77,32,85,82,76,32,102,97,105,108,101,100,58,32,36,123,98,97,99,107,117,112,69,114,114,111,114,46,109,101,115,115,97,103,101,125,96,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,34,87,65,83,77,32,108,111,97,100,105,110,103,32,102,97,105,108,101,100,32,102,114,111,109,32,97,108,108,32,115,111,117,114,99,101,115,46,34,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,125,41,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,116,104,105,115,46,95,77,111,100,117,108,101,80,114,111,109,105,115,101,59,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,125,10,32,32,32,32,47,42,42,10,32,32,32,32,32,42,32,80,117,98,108,105,99,32,109,101,116,104,111,100,32,116,111,32,108,111,97,100,32,116,104,101,32,87,101,98,65,115,115,101,109,98,108,121,32,109,111,100,117,108,101,46,10,32,32,32,32,32,42,32,85,116,105,108,105,122,101,115,32,97,32,112,114,105,109,97,114,121,32,97,110,100,32,98,97,99,107,117,112,32,85,82,76,32,102,111,114,32,114,111,98,117,115,116,110,101,115,115,46,10,32,32,32,32,32,42,32,64,114,101,116,117,114,110,115,32,80,114,111,109,105,115,101,60,77,111,100,117,108,101,62,32,45,32,65,32,112,114,111,109,105,115,101,32,116,104,97,116,32,114,101,115,111,108,118,101,115,32,116,111,32,116,104,101,32,108,111,97,100,101,100,32,109,111,100,117,108,101,46,10,32,32,32,32,32,42,47,10,32,32,32,32,115,116,97,116,105,99,32,108,111,97,100,40,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,95,95,97,115,121,110,99,40,116,104,105,115,44,32,110,117,108,108,44,32,102,117,110,99,116,105,111,110,42,32,40,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,116,104,105,115,46,95,108,111,97,100,87,105,116,104,66,97,99,107,117,112,40,41,59,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,125,10,32,32,32,32,47,42,42,10,32,32,32,32,32,42,32,83,101,116,115,32,97,32,110,101,119,32,85,82,76,32,102,111,114,32,116,104,101,32,87,65,83,77,32,102,105,108,101,32,97,110,100,32,105,110,118,97,108,105,100,97,116,101,115,32,116,104,101,32,99,117,114,114,101,110,116,32,109,111,100,117,108,101,32,112,114,111,109,105,115,101,46,10,32,32,32,32,32,42,10,32,32,32,32,32,42,32,64,112,97,114,97,109,32,115,116,114,105,110,103,32,45,32,32,84,104,101,32,110,101,119,32,85,82,76,32,102,111,114,32,116,104,101,32,87,65,83,77,32,102,105,108,101,46,10,32,32,32,32,32,42,47,10,32,32,32,32,115,116,97,116,105,99,32,115,101,116,87,97,115,109,85,114,108,40,117,114,108,41,32,123,10,32,32,32,32,32,32,105,102,32,40,117,114,108,32,61,61,61,32,116,104,105,115,46,95,119,97,115,109,85,82,76,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,116,104,105,115,46,95,119,97,115,109,85,82,76,32,61,32,117,114,108,59,10,32,32,32,32,32,32,116,104,105,115,46,95,77,111,100,117,108,101,80,114,111,109,105,115,101,32,61,32,110,117,108,108,59,10,32,32,32,32,125,10,32,32,125,59,10,32,32,47,47,32,101,115,108,105,110,116,45,100,105,115,97,98,108,101,45,110,101,120,116,45,108,105,110,101,32,64,116,121,112,101,115,99,114,105,112,116,45,101,115,108,105,110,116,47,110,97,109,105,110,103,45,99,111,110,118,101,110,116,105,111,110,10,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,68,111,116,76,111,116,116,105,101,87,97,115,109,76,111,97,100,101,114,44,32,34,95,77,111,100,117,108,101,80,114,111,109,105,115,101,34,44,32,110,117,108,108,41,59,10,32,32,47,47,32,85,82,76,32,102,111,114,32,116,104,101,32,87,65,83,77,32,102,105,108,101,44,32,99,111,110,115,116,114,117,99,116,101,100,32,117,115,105,110,103,32,112,97,99,107,97,103,101,32,105,110,102,111,114,109,97,116,105,111,110,10,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,68,111,116,76,111,116,116,105,101,87,97,115,109,76,111,97,100,101,114,44,32,34,95,119,97,115,109,85,82,76,34,44,32,96,104,116,116,112,115,58,47,47,99,100,110,46,106,115,100,101,108,105,118,114,46,110,101,116,47,110,112,109,47,36,123,80,65,67,75,65,71,69,95,78,65,77,69,125,64,36,123,80,65,67,75,65,71,69,95,86,69,82,83,73,79,78,125,47,100,105,115,116,47,100,111,116,108,111,116,116,105,101,45,112,108,97,121,101,114,46,119,97,115,109,96,41,59,10,10,32,32,47,47,32,115,114,99,47,101,118,101,110,116,45,109,97,110,97,103,101,114,46,116,115,10,32,32,118,97,114,32,69,118,101,110,116,77,97,110,97,103,101,114,32,61,32,99,108,97,115,115,32,123,10,32,32,32,32,99,111,110,115,116,114,117,99,116,111,114,40,41,32,123,10,32,32,32,32,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,116,104,105,115,44,32,34,95,101,118,101,110,116,76,105,115,116,101,110,101,114,115,34,44,32,47,42,32,64,95,95,80,85,82,69,95,95,32,42,47,32,110,101,119,32,77,97,112,40,41,41,59,10,32,32,32,32,125,10,32,32,32,32,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,40,116,121,112,101,44,32,108,105,115,116,101,110,101,114,41,32,123,10,32,32,32,32,32,32,108,101,116,32,108,105,115,116,101,110,101,114,115,32,61,32,116,104,105,115,46,95,101,118,101,110,116,76,105,115,116,101,110,101,114,115,46,103,101,116,40,116,121,112,101,41,59,10,32,32,32,32,32,32,105,102,32,40,33,108,105,115,116,101,110,101,114,115,41,32,123,10,32,32,32,32,32,32,32,32,108,105,115,116,101,110,101,114,115,32,61,32,47,42,32,64,95,95,80,85,82,69,95,95,32,42,47,32,110,101,119,32,83,101,116,40,41,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,76,105,115,116,101,110,101,114,115,46,115,101,116,40,116,121,112,101,44,32,108,105,115,116,101,110,101,114,115,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,108,105,115,116,101,110,101,114,115,46,97,100,100,40,108,105,115,116,101,110,101,114,41,59,10,32,32,32,32,125,10,32,32,32,32,114,101,109,111,118,101,69,118,101,110,116,76,105,115,116,101,110,101,114,40,116,121,112,101,44,32,108,105,115,116,101,110,101,114,41,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,108,105,115,116,101,110,101,114,115,32,61,32,116,104,105,115,46,95,101,118,101,110,116,76,105,115,116,101,110,101,114,115,46,103,101,116,40,116,121,112,101,41,59,10,32,32,32,32,32,32,105,102,32,40,33,108,105,115,116,101,110,101,114,115,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,105,102,32,40,108,105,115,116,101,110,101,114,41,32,123,10,32,32,32,32,32,32,32,32,108,105,115,116,101,110,101,114,115,46,100,101,108,101,116,101,40,108,105,115,116,101,110,101,114,41,59,10,32,32,32,32,32,32,32,32,105,102,32,40,108,105,115,116,101,110,101,114,115,46,115,105,122,101,32,61,61,61,32,48,41,32,123,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,76,105,115,116,101,110,101,114,115,46,100,101,108,101,116,101,40,116,121,112,101,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,76,105,115,116,101,110,101,114,115,46,100,101,108,101,116,101,40,116,121,112,101,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,32,32,100,105,115,112,97,116,99,104,40,101,118,101,110,116,41,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,108,105,115,116,101,110,101,114,115,32,61,32,116,104,105,115,46,95,101,118,101,110,116,76,105,115,116,101,110,101,114,115,46,103,101,116,40,101,118,101,110,116,46,116,121,112,101,41,59,10,32,32,32,32,32,32,108,105,115,116,101,110,101,114,115,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,108,105,115,116,101,110,101,114,115,46,102,111,114,69,97,99,104,40,40,108,105,115,116,101,110,101,114,41,32,61,62,32,108,105,115,116,101,110,101,114,40,101,118,101,110,116,41,41,59,10,32,32,32,32,125,10,32,32,32,32,114,101,109,111,118,101,65,108,108,69,118,101,110,116,76,105,115,116,101,110,101,114,115,40,41,32,123,10,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,76,105,115,116,101,110,101,114,115,46,99,108,101,97,114,40,41,59,10,32,32,32,32,125,10,32,32,125,59,10,10,32,32,47,47,32,115,114,99,47,111,102,102,115,99,114,101,101,110,45,111,98,115,101,114,118,101,114,46,116,115,10,32,32,118,97,114,32,79,102,102,115,99,114,101,101,110,79,98,115,101,114,118,101,114,32,61,32,99,108,97,115,115,32,123,10,32,32,32,32,115,116,97,116,105,99,32,95,105,110,105,116,105,97,108,105,122,101,79,98,115,101,114,118,101,114,40,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,111,98,115,101,114,118,101,114,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,116,101,114,115,101,99,116,105,111,110,79,98,115,101,114,118,101,114,67,97,108,108,98,97,99,107,32,61,32,40,101,110,116,114,105,101,115,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,101,110,116,114,105,101,115,46,102,111,114,69,97,99,104,40,40,101,110,116,114,121,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,116,104,105,115,46,95,111,98,115,101,114,118,101,100,67,97,110,118,97,115,101,115,46,103,101,116,40,101,110,116,114,121,46,116,97,114,103,101,116,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,101,110,116,114,121,46,105,115,73,110,116,101,114,115,101,99,116,105,110,103,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,110,115,116,97,110,99,101,46,117,110,102,114,101,101,122,101,40,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,110,115,116,97,110,99,101,46,102,114,101,101,122,101,40,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,116,104,105,115,46,95,111,98,115,101,114,118,101,114,32,61,32,110,101,119,32,73,110,116,101,114,115,101,99,116,105,111,110,79,98,115,101,114,118,101,114,40,105,110,116,101,114,115,101,99,116,105,111,110,79,98,115,101,114,118,101,114,67,97,108,108,98,97,99,107,44,32,123,10,32,32,32,32,32,32,32,32,116,104,114,101,115,104,111,108,100,58,32,48,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,125,10,32,32,32,32,115,116,97,116,105,99,32,111,98,115,101,114,118,101,40,99,97,110,118,97,115,44,32,100,111,116,76,111,116,116,105,101,73,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,59,10,32,32,32,32,32,32,116,104,105,115,46,95,105,110,105,116,105,97,108,105,122,101,79,98,115,101,114,118,101,114,40,41,59,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,111,98,115,101,114,118,101,100,67,97,110,118,97,115,101,115,46,104,97,115,40,99,97,110,118,97,115,41,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,116,104,105,115,46,95,111,98,115,101,114,118,101,100,67,97,110,118,97,115,101,115,46,115,101,116,40,99,97,110,118,97,115,44,32,100,111,116,76,111,116,116,105,101,73,110,115,116,97,110,99,101,41,59,10,32,32,32,32,32,32,40,95,97,32,61,32,116,104,105,115,46,95,111,98,115,101,114,118,101,114,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,111,98,115,101,114,118,101,40,99,97,110,118,97,115,41,59,10,32,32,32,32,125,10,32,32,32,32,115,116,97,116,105,99,32,117,110,111,98,115,101,114,118,101,40,99,97,110,118,97,115,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,59,10,32,32,32,32,32,32,40,95,97,32,61,32,116,104,105,115,46,95,111,98,115,101,114,118,101,114,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,117,110,111,98,115,101,114,118,101,40,99,97,110,118,97,115,41,59,10,32,32,32,32,32,32,116,104,105,115,46,95,111,98,115,101,114,118,101,100,67,97,110,118,97,115,101,115,46,100,101,108,101,116,101,40,99,97,110,118,97,115,41,59,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,111,98,115,101,114,118,101,100,67,97,110,118,97,115,101,115,46,115,105,122,101,32,61,61,61,32,48,41,32,123,10,32,32,32,32,32,32,32,32,40,95,98,32,61,32,116,104,105,115,46,95,111,98,115,101,114,118,101,114,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,98,46,100,105,115,99,111,110,110,101,99,116,40,41,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,111,98,115,101,114,118,101,114,32,61,32,110,117,108,108,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,125,59,10,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,79,102,102,115,99,114,101,101,110,79,98,115,101,114,118,101,114,44,32,34,95,111,98,115,101,114,118,101,114,34,44,32,110,117,108,108,41,59,10,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,79,102,102,115,99,114,101,101,110,79,98,115,101,114,118,101,114,44,32,34,95,111,98,115,101,114,118,101,100,67,97,110,118,97,115,101,115,34,44,32,47,42,32,64,95,95,80,85,82,69,95,95,32,42,47,32,110,101,119,32,77,97,112,40,41,41,59,10,10,32,32,47,47,32,115,114,99,47,114,101,115,105,122,101,45,111,98,115,101,114,118,101,114,46,116,115,10,32,32,118,97,114,32,82,69,83,73,90,69,95,68,69,66,79,85,78,67,69,95,84,73,77,69,32,61,32,49,48,48,59,10,32,32,118,97,114,32,67,97,110,118,97,115,82,101,115,105,122,101,79,98,115,101,114,118,101,114,32,61,32,99,108,97,115,115,32,123,10,32,32,32,32,115,116,97,116,105,99,32,95,105,110,105,116,105,97,108,105,122,101,79,98,115,101,114,118,101,114,40,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,111,98,115,101,114,118,101,114,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,99,111,110,115,116,32,114,101,115,105,122,101,72,97,110,100,108,101,114,32,61,32,40,101,110,116,114,105,101,115,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,101,110,116,114,105,101,115,46,102,111,114,69,97,99,104,40,40,101,110,116,114,121,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,99,111,110,115,116,32,101,108,101,109,101,110,116,32,61,32,116,104,105,115,46,95,111,98,115,101,114,118,101,100,67,97,110,118,97,115,101,115,46,103,101,116,40,101,110,116,114,121,46,116,97,114,103,101,116,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,33,101,108,101,109,101,110,116,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,32,32,32,32,99,111,110,115,116,32,91,100,111,116,76,111,116,116,105,101,73,110,115,116,97,110,99,101,44,32,116,105,109,101,111,117,116,93,32,61,32,101,108,101,109,101,110,116,59,10,32,32,32,32,32,32,32,32,32,32,99,108,101,97,114,84,105,109,101,111,117,116,40,116,105,109,101,111,117,116,41,59,10,32,32,32,32,32,32,32,32,32,32,99,111,110,115,116,32,110,101,119,84,105,109,101,111,117,116,32,61,32,115,101,116,84,105,109,101,111,117,116,40,40,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,100,111,116,76,111,116,116,105,101,73,110,115,116,97,110,99,101,46,114,101,115,105,122,101,40,41,59,10,32,32,32,32,32,32,32,32,32,32,125,44,32,82,69,83,73,90,69,95,68,69,66,79,85,78,67,69,95,84,73,77,69,41,59,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,95,111,98,115,101,114,118,101,100,67,97,110,118,97,115,101,115,46,115,101,116,40,101,110,116,114,121,46,116,97,114,103,101,116,44,32,91,100,111,116,76,111,116,116,105,101,73,110,115,116,97,110,99,101,44,32,110,101,119,84,105,109,101,111,117,116,93,41,59,10,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,116,104,105,115,46,95,111,98,115,101,114,118,101,114,32,61,32,110,101,119,32,82,101,115,105,122,101,79,98,115,101,114,118,101,114,40,114,101,115,105,122,101,72,97,110,100,108,101,114,41,59,10,32,32,32,32,125,10,32,32,32,32,115,116,97,116,105,99,32,111,98,115,101,114,118,101,40,99,97,110,118,97,115,44,32,100,111,116,76,111,116,116,105,101,73,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,59,10,32,32,32,32,32,32,116,104,105,115,46,95,105,110,105,116,105,97,108,105,122,101,79,98,115,101,114,118,101,114,40,41,59,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,111,98,115,101,114,118,101,100,67,97,110,118,97,115,101,115,46,104,97,115,40,99,97,110,118,97,115,41,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,116,104,105,115,46,95,111,98,115,101,114,118,101,100,67,97,110,118,97,115,101,115,46,115,101,116,40,99,97,110,118,97,115,44,32,91,100,111,116,76,111,116,116,105,101,73,110,115,116,97,110,99,101,44,32,48,93,41,59,10,32,32,32,32,32,32,40,95,97,32,61,32,116,104,105,115,46,95,111,98,115,101,114,118,101,114,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,111,98,115,101,114,118,101,40,99,97,110,118,97,115,41,59,10,32,32,32,32,125,10,32,32,32,32,115,116,97,116,105,99,32,117,110,111,98,115,101,114,118,101,40,99,97,110,118,97,115,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,59,10,32,32,32,32,32,32,40,95,97,32,61,32,116,104,105,115,46,95,111,98,115,101,114,118,101,114,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,117,110,111,98,115,101,114,118,101,40,99,97,110,118,97,115,41,59,10,32,32,32,32,32,32,116,104,105,115,46,95,111,98,115,101,114,118,101,100,67,97,110,118,97,115,101,115,46,100,101,108,101,116,101,40,99,97,110,118,97,115,41,59,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,111,98,115,101,114,118,101,100,67,97,110,118,97,115,101,115,46,115,105,122,101,32,61,61,61,32,48,41,32,123,10,32,32,32,32,32,32,32,32,40,95,98,32,61,32,116,104,105,115,46,95,111,98,115,101,114,118,101,114,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,98,46,100,105,115,99,111,110,110,101,99,116,40,41,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,111,98,115,101,114,118,101,114,32,61,32,110,117,108,108,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,125,59,10,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,67,97,110,118,97,115,82,101,115,105,122,101,79,98,115,101,114,118,101,114,44,32,34,95,111,98,115,101,114,118,101,114,34,44,32,110,117,108,108,41,59,10,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,67,97,110,118,97,115,82,101,115,105,122,101,79,98,115,101,114,118,101,114,44,32,34,95,111,98,115,101,114,118,101,100,67,97,110,118,97,115,101,115,34,44,32,47,42,32,64,95,95,80,85,82,69,95,95,32,42,47,32,110,101,119,32,77,97,112,40,41,41,59,10,10,32,32,47,47,32,115,114,99,47,117,116,105,108,115,46,116,115,10,32,32,102,117,110,99,116,105,111,110,32,105,115,72,101,120,67,111,108,111,114,40,99,111,108,111,114,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,47,94,35,40,91,92,100,97,45,102,93,123,54,125,124,91,92,100,97,45,102,93,123,56,125,41,36,47,105,117,46,116,101,115,116,40,99,111,108,111,114,41,59,10,32,32,125,10,32,32,102,117,110,99,116,105,111,110,32,104,101,120,83,116,114,105,110,103,84,111,82,71,66,65,73,110,116,40,99,111,108,111,114,72,101,120,41,32,123,10,32,32,32,32,105,102,32,40,33,105,115,72,101,120,67,111,108,111,114,40,99,111,108,111,114,72,101,120,41,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,48,59,10,32,32,32,32,125,10,32,32,32,32,108,101,116,32,104,101,120,32,61,32,99,111,108,111,114,72,101,120,46,114,101,112,108,97,99,101,40,34,35,34,44,32,34,34,41,59,10,32,32,32,32,104,101,120,32,61,32,104,101,120,46,108,101,110,103,116,104,32,61,61,61,32,54,32,63,32,96,36,123,104,101,120,125,102,102,96,32,58,32,104,101,120,59,10,32,32,32,32,114,101,116,117,114,110,32,112,97,114,115,101,73,110,116,40,104,101,120,44,32,49,54,41,59,10,32,32,125,10,32,32,102,117,110,99,116,105,111,110,32,105,115,68,111,116,76,111,116,116,105,101,40,102,105,108,101,68,97,116,97,41,32,123,10,32,32,32,32,105,102,32,40,102,105,108,101,68,97,116,97,46,98,121,116,101,76,101,110,103,116,104,32,60,32,52,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,102,97,108,115,101,59,10,32,32,32,32,125,10,32,32,32,32,99,111,110,115,116,32,102,105,108,101,83,105,103,110,97,116,117,114,101,32,61,32,110,101,119,32,85,105,110,116,56,65,114,114,97,121,40,102,105,108,101,68,97,116,97,46,115,108,105,99,101,40,48,44,32,90,73,80,95,83,73,71,78,65,84,85,82,69,46,98,121,116,101,76,101,110,103,116,104,41,41,59,10,32,32,32,32,102,111,114,32,40,108,101,116,32,105,32,61,32,48,59,32,105,32,60,32,90,73,80,95,83,73,71,78,65,84,85,82,69,46,108,101,110,103,116,104,59,32,105,32,43,61,32,49,41,32,123,10,32,32,32,32,32,32,105,102,32,40,90,73,80,95,83,73,71,78,65,84,85,82,69,91,105,93,32,33,61,61,32,102,105,108,101,83,105,103,110,97,116,117,114,101,91,105,93,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,102,97,108,115,101,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,32,32,114,101,116,117,114,110,32,116,114,117,101,59,10,32,32,125,10,32,32,102,117,110,99,116,105,111,110,32,105,115,76,111,116,116,105,101,74,83,79,78,40,106,115,111,110,41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,76,79,84,84,73,69,95,74,83,79,78,95,77,65,78,68,65,84,79,82,89,95,70,73,69,76,68,83,46,101,118,101,114,121,40,40,102,105,101,108,100,41,32,61,62,32,79,98,106,101,99,116,46,112,114,111,116,111,116,121,112,101,46,104,97,115,79,119,110,80,114,111,112,101,114,116,121,46,99,97,108,108,40,106,115,111,110,44,32,102,105,101,108,100,41,41,59,10,32,32,125,10,32,32,102,117,110,99,116,105,111,110,32,105,115,76,111,116,116,105,101,40,102,105,108,101,68,97,116,97,41,32,123,10,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,102,105,108,101,68,97,116,97,32,61,61,61,32,34,115,116,114,105,110,103,34,41,32,123,10,32,32,32,32,32,32,116,114,121,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,105,115,76,111,116,116,105,101,74,83,79,78,40,74,83,79,78,46,112,97,114,115,101,40,102,105,108,101,68,97,116,97,41,41,59,10,32,32,32,32,32,32,125,32,99,97,116,99,104,32,40,95,101,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,102,97,108,115,101,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,105,115,76,111,116,116,105,101,74,83,79,78,40,102,105,108,101,68,97,116,97,41,59,10,32,32,32,32,125,10,32,32,125,10,32,32,102,117,110,99,116,105,111,110,32,103,101,116,68,101,102,97,117,108,116,68,80,82,40,41,32,123,10,32,32,32,32,99,111,110,115,116,32,100,112,114,32,61,32,73,83,95,66,82,79,87,83,69,82,32,63,32,119,105,110,100,111,119,46,100,101,118,105,99,101,80,105,120,101,108,82,97,116,105,111,32,58,32,49,59,10,32,32,32,32,114,101,116,117,114,110,32,49,32,43,32,40,100,112,114,32,45,32,49,41,32,42,32,68,69,70,65,85,76,84,95,68,80,82,95,70,65,67,84,79,82,59,10,32,32,125,10,32,32,102,117,110,99,116,105,111,110,32,105,115,69,108,101,109,101,110,116,73,110,86,105,101,119,112,111,114,116,40,101,108,101,109,101,110,116,41,32,123,10,32,32,32,32,99,111,110,115,116,32,114,101,99,116,32,61,32,101,108,101,109,101,110,116,46,103,101,116,66,111,117,110,100,105,110,103,67,108,105,101,110,116,82,101,99,116,40,41,59,10,32,32,32,32,114,101,116,117,114,110,32,114,101,99,116,46,116,111,112,32,62,61,32,48,32,38,38,32,114,101,99,116,46,108,101,102,116,32,62,61,32,48,32,38,38,32,114,101,99,116,46,98,111,116,116,111,109,32,60,61,32,40,119,105,110,100,111,119,46,105,110,110,101,114,72,101,105,103,104,116,32,124,124,32,100,111,99,117,109,101,110,116,46,100,111,99,117,109,101,110,116,69,108,101,109,101,110,116,46,99,108,105,101,110,116,72,101,105,103,104,116,41,32,38,38,32,114,101,99,116,46,114,105,103,104,116,32,60,61,32,40,119,105,110,100,111,119,46,105,110,110,101,114,87,105,100,116,104,32,124,124,32,100,111,99,117,109,101,110,116,46,100,111,99,117,109,101,110,116,69,108,101,109,101,110,116,46,99,108,105,101,110,116,87,105,100,116,104,41,59,10,32,32,125,10,10,32,32,47,47,32,115,114,99,47,100,111,116,108,111,116,116,105,101,46,116,115,10,32,32,118,97,114,32,99,114,101,97,116,101,67,111,114,101,77,111,100,101,32,61,32,40,109,111,100,101,44,32,109,111,100,117,108,101,41,32,61,62,32,123,10,32,32,32,32,105,102,32,40,109,111,100,101,32,61,61,61,32,34,114,101,118,101,114,115,101,34,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,109,111,100,117,108,101,46,77,111,100,101,46,82,101,118,101,114,115,101,59,10,32,32,32,32,125,32,101,108,115,101,32,105,102,32,40,109,111,100,101,32,61,61,61,32,34,98,111,117,110,99,101,34,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,109,111,100,117,108,101,46,77,111,100,101,46,66,111,117,110,99,101,59,10,32,32,32,32,125,32,101,108,115,101,32,105,102,32,40,109,111,100,101,32,61,61,61,32,34,114,101,118,101,114,115,101,45,98,111,117,110,99,101,34,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,109,111,100,117,108,101,46,77,111,100,101,46,82,101,118,101,114,115,101,66,111,117,110,99,101,59,10,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,109,111,100,117,108,101,46,77,111,100,101,46,70,111,114,119,97,114,100,59,10,32,32,32,32,125,10,32,32,125,59,10,32,32,118,97,114,32,99,114,101,97,116,101,67,111,114,101,70,105,116,32,61,32,40,102,105,116,44,32,109,111,100,117,108,101,41,32,61,62,32,123,10,32,32,32,32,105,102,32,40,102,105,116,32,61,61,61,32,34,99,111,110,116,97,105,110,34,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,109,111,100,117,108,101,46,70,105,116,46,67,111,110,116,97,105,110,59,10,32,32,32,32,125,32,101,108,115,101,32,105,102,32,40,102,105,116,32,61,61,61,32,34,99,111,118,101,114,34,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,109,111,100,117,108,101,46,70,105,116,46,67,111,118,101,114,59,10,32,32,32,32,125,32,101,108,115,101,32,105,102,32,40,102,105,116,32,61,61,61,32,34,102,105,108,108,34,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,109,111,100,117,108,101,46,70,105,116,46,70,105,108,108,59,10,32,32,32,32,125,32,101,108,115,101,32,105,102,32,40,102,105,116,32,61,61,61,32,34,102,105,116,45,104,101,105,103,104,116,34,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,109,111,100,117,108,101,46,70,105,116,46,70,105,116,72,101,105,103,104,116,59,10,32,32,32,32,125,32,101,108,115,101,32,105,102,32,40,102,105,116,32,61,61,61,32,34,102,105,116,45,119,105,100,116,104,34,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,109,111,100,117,108,101,46,70,105,116,46,70,105,116,87,105,100,116,104,59,10,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,109,111,100,117,108,101,46,70,105,116,46,78,111,110,101,59,10,32,32,32,32,125,10,32,32,125,59,10,32,32,118,97,114,32,99,114,101,97,116,101,67,111,114,101,65,108,105,103,110,32,61,32,40,97,108,105,103,110,44,32,109,111,100,117,108,101,41,32,61,62,32,123,10,32,32,32,32,99,111,110,115,116,32,99,111,114,101,65,108,105,103,110,32,61,32,110,101,119,32,109,111,100,117,108,101,46,86,101,99,116,111,114,70,108,111,97,116,40,41,59,10,32,32,32,32,99,111,114,101,65,108,105,103,110,46,112,117,115,104,95,98,97,99,107,40,97,108,105,103,110,91,48,93,41,59,10,32,32,32,32,99,111,114,101,65,108,105,103,110,46,112,117,115,104,95,98,97,99,107,40,97,108,105,103,110,91,49,93,41,59,10,32,32,32,32,114,101,116,117,114,110,32,99,111,114,101,65,108,105,103,110,59,10,32,32,125,59,10,32,32,118,97,114,32,99,114,101,97,116,101,67,111,114,101,83,101,103,109,101,110,116,32,61,32,40,115,101,103,109,101,110,116,44,32,109,111,100,117,108,101,41,32,61,62,32,123,10,32,32,32,32,99,111,110,115,116,32,99,111,114,101,115,101,103,109,101,110,116,32,61,32,110,101,119,32,109,111,100,117,108,101,46,86,101,99,116,111,114,70,108,111,97,116,40,41,59,10,32,32,32,32,105,102,32,40,115,101,103,109,101,110,116,46,108,101,110,103,116,104,32,33,61,61,32,50,41,32,114,101,116,117,114,110,32,99,111,114,101,115,101,103,109,101,110,116,59,10,32,32,32,32,99,111,114,101,115,101,103,109,101,110,116,46,112,117,115,104,95,98,97,99,107,40,115,101,103,109,101,110,116,91,48,93,41,59,10,32,32,32,32,99,111,114,101,115,101,103,109,101,110,116,46,112,117,115,104,95,98,97,99,107,40,115,101,103,109,101,110,116,91,49,93,41,59,10,32,32,32,32,114,101,116,117,114,110,32,99,111,114,101,115,101,103,109,101,110,116,59,10,32,32,125,59,10,32,32,118,97,114,32,95,68,111,116,76,111,116,116,105,101,32,61,32,99,108,97,115,115,32,95,68,111,116,76,111,116,116,105,101,32,123,10,32,32,32,32,99,111,110,115,116,114,117,99,116,111,114,40,99,111,110,102,105,103,41,32,123,10,32,32,32,32,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,116,104,105,115,44,32,34,95,99,97,110,118,97,115,34,41,59,10,32,32,32,32,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,116,104,105,115,44,32,34,95,99,111,110,116,101,120,116,34,44,32,110,117,108,108,41,59,10,32,32,32,32,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,116,104,105,115,44,32,34,95,101,118,101,110,116,77,97,110,97,103,101,114,34,41,59,10,32,32,32,32,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,116,104,105,115,44,32,34,95,97,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,34,44,32,110,117,108,108,41,59,10,32,32,32,32,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,116,104,105,115,44,32,34,95,102,114,97,109,101,77,97,110,97,103,101,114,34,41,59,10,32,32,32,32,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,116,104,105,115,44,32,34,95,100,111,116,76,111,116,116,105,101,67,111,114,101,34,44,32,110,117,108,108,41,59,10,32,32,32,32,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,116,104,105,115,44,32,34,95,114,101,110,100,101,114,67,111,110,102,105,103,34,44,32,123,125,41,59,10,32,32,32,32,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,116,104,105,115,44,32,34,95,105,115,70,114,111,122,101,110,34,44,32,102,97,108,115,101,41,59,10,32,32,32,32,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,116,104,105,115,44,32,34,95,98,97,99,107,103,114,111,117,110,100,67,111,108,111,114,34,44,32,110,117,108,108,41,59,10,32,32,32,32,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,116,104,105,115,44,32,34,95,112,111,105,110,116,101,114,85,112,77,101,116,104,111,100,34,41,59,10,32,32,32,32,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,116,104,105,115,44,32,34,95,112,111,105,110,116,101,114,68,111,119,110,77,101,116,104,111,100,34,41,59,10,32,32,32,32,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,116,104,105,115,44,32,34,95,112,111,105,110,116,101,114,77,111,118,101,77,101,116,104,111,100,34,41,59,10,32,32,32,32,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,116,104,105,115,44,32,34,95,112,111,105,110,116,101,114,69,110,116,101,114,77,101,116,104,111,100,34,41,59,10,32,32,32,32,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,116,104,105,115,44,32,34,95,112,111,105,110,116,101,114,69,120,105,116,77,101,116,104,111,100,34,41,59,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,44,32,95,99,59,10,32,32,32,32,32,32,116,104,105,115,46,95,99,97,110,118,97,115,32,61,32,99,111,110,102,105,103,46,99,97,110,118,97,115,59,10,32,32,32,32,32,32,116,104,105,115,46,95,99,111,110,116,101,120,116,32,61,32,116,104,105,115,46,95,99,97,110,118,97,115,46,103,101,116,67,111,110,116,101,120,116,40,34,50,100,34,41,59,10,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,77,97,110,97,103,101,114,32,61,32,110,101,119,32,69,118,101,110,116,77,97,110,97,103,101,114,40,41,59,10,32,32,32,32,32,32,116,104,105,115,46,95,102,114,97,109,101,77,97,110,97,103,101,114,32,61,32,110,101,119,32,65,110,105,109,97,116,105,111,110,70,114,97,109,101,77,97,110,97,103,101,114,40,41,59,10,32,32,32,32,32,32,116,104,105,115,46,95,114,101,110,100,101,114,67,111,110,102,105,103,32,61,32,95,95,115,112,114,101,97,100,80,114,111,112,115,40,95,95,115,112,114,101,97,100,86,97,108,117,101,115,40,123,125,44,32,99,111,110,102,105,103,46,114,101,110,100,101,114,67,111,110,102,105,103,41,44,32,123,10,32,32,32,32,32,32,32,32,100,101,118,105,99,101,80,105,120,101,108,82,97,116,105,111,58,32,40,40,95,97,32,61,32,99,111,110,102,105,103,46,114,101,110,100,101,114,67,111,110,102,105,103,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,100,101,118,105,99,101,80,105,120,101,108,82,97,116,105,111,41,32,124,124,32,103,101,116,68,101,102,97,117,108,116,68,80,82,40,41,44,10,32,32,32,32,32,32,32,32,47,47,32,102,114,101,101,122,101,79,110,79,102,102,115,99,114,101,101,110,32,105,115,32,116,114,117,101,32,98,121,32,100,101,102,97,117,108,116,32,116,111,32,112,114,101,118,101,110,116,32,117,110,110,101,99,101,115,115,97,114,121,32,114,101,110,100,101,114,105,110,103,32,119,104,101,110,32,116,104,101,32,99,97,110,118,97,115,32,105,115,32,111,102,102,115,99,114,101,101,110,10,32,32,32,32,32,32,32,32,102,114,101,101,122,101,79,110,79,102,102,115,99,114,101,101,110,58,32,40,95,99,32,61,32,40,95,98,32,61,32,99,111,110,102,105,103,46,114,101,110,100,101,114,67,111,110,102,105,103,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,98,46,102,114,101,101,122,101,79,110,79,102,102,115,99,114,101,101,110,41,32,33,61,32,110,117,108,108,32,63,32,95,99,32,58,32,116,114,117,101,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,68,111,116,76,111,116,116,105,101,87,97,115,109,76,111,97,100,101,114,46,108,111,97,100,40,41,46,116,104,101,110,40,40,109,111,100,117,108,101,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,118,97,114,32,95,97,50,44,32,95,98,50,44,32,95,99,50,44,32,95,100,44,32,95,101,44,32,95,102,44,32,95,103,44,32,95,104,59,10,32,32,32,32,32,32,32,32,95,68,111,116,76,111,116,116,105,101,46,95,119,97,115,109,77,111,100,117,108,101,32,61,32,109,111,100,117,108,101,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,61,32,110,101,119,32,109,111,100,117,108,101,46,68,111,116,76,111,116,116,105,101,80,108,97,121,101,114,40,123,10,32,32,32,32,32,32,32,32,32,32,116,104,101,109,101,73,100,58,32,40,95,97,50,32,61,32,99,111,110,102,105,103,46,116,104,101,109,101,73,100,41,32,33,61,32,110,117,108,108,32,63,32,95,97,50,32,58,32,34,34,44,10,32,32,32,32,32,32,32,32,32,32,97,117,116,111,112,108,97,121,58,32,40,95,98,50,32,61,32,99,111,110,102,105,103,46,97,117,116,111,112,108,97,121,41,32,33,61,32,110,117,108,108,32,63,32,95,98,50,32,58,32,102,97,108,115,101,44,10,32,32,32,32,32,32,32,32,32,32,98,97,99,107,103,114,111,117,110,100,67,111,108,111,114,58,32,48,44,10,32,32,32,32,32,32,32,32,32,32,108,111,111,112,65,110,105,109,97,116,105,111,110,58,32,40,95,99,50,32,61,32,99,111,110,102,105,103,46,108,111,111,112,41,32,33,61,32,110,117,108,108,32,63,32,95,99,50,32,58,32,102,97,108,115,101,44,10,32,32,32,32,32,32,32,32,32,32,109,111,100,101,58,32,99,114,101,97,116,101,67,111,114,101,77,111,100,101,40,40,95,100,32,61,32,99,111,110,102,105,103,46,109,111,100,101,41,32,33,61,32,110,117,108,108,32,63,32,95,100,32,58,32,34,102,111,114,119,97,114,100,34,44,32,109,111,100,117,108,101,41,44,10,32,32,32,32,32,32,32,32,32,32,115,101,103,109,101,110,116,58,32,99,114,101,97,116,101,67,111,114,101,83,101,103,109,101,110,116,40,40,95,101,32,61,32,99,111,110,102,105,103,46,115,101,103,109,101,110,116,41,32,33,61,32,110,117,108,108,32,63,32,95,101,32,58,32,91,93,44,32,109,111,100,117,108,101,41,44,10,32,32,32,32,32,32,32,32,32,32,115,112,101,101,100,58,32,40,95,102,32,61,32,99,111,110,102,105,103,46,115,112,101,101,100,41,32,33,61,32,110,117,108,108,32,63,32,95,102,32,58,32,49,44,10,32,32,32,32,32,32,32,32,32,32,117,115,101,70,114,97,109,101,73,110,116,101,114,112,111,108,97,116,105,111,110,58,32,40,95,103,32,61,32,99,111,110,102,105,103,46,117,115,101,70,114,97,109,101,73,110,116,101,114,112,111,108,97,116,105,111,110,41,32,33,61,32,110,117,108,108,32,63,32,95,103,32,58,32,116,114,117,101,44,10,32,32,32,32,32,32,32,32,32,32,109,97,114,107,101,114,58,32,40,95,104,32,61,32,99,111,110,102,105,103,46,109,97,114,107,101,114,41,32,33,61,32,110,117,108,108,32,63,32,95,104,32,58,32,34,34,44,10,32,32,32,32,32,32,32,32,32,32,108,97,121,111,117,116,58,32,99,111,110,102,105,103,46,108,97,121,111,117,116,32,63,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,97,108,105,103,110,58,32,99,114,101,97,116,101,67,111,114,101,65,108,105,103,110,40,99,111,110,102,105,103,46,108,97,121,111,117,116,46,97,108,105,103,110,44,32,109,111,100,117,108,101,41,44,10,32,32,32,32,32,32,32,32,32,32,32,32,102,105,116,58,32,99,114,101,97,116,101,67,111,114,101,70,105,116,40,99,111,110,102,105,103,46,108,97,121,111,117,116,46,102,105,116,44,32,109,111,100,117,108,101,41,10,32,32,32,32,32,32,32,32,32,32,125,32,58,32,109,111,100,117,108,101,46,99,114,101,97,116,101,68,101,102,97,117,108,116,76,97,121,111,117,116,40,41,10,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,77,97,110,97,103,101,114,46,100,105,115,112,97,116,99,104,40,123,32,116,121,112,101,58,32,34,114,101,97,100,121,34,32,125,41,59,10,32,32,32,32,32,32,32,32,105,102,32,40,99,111,110,102,105,103,46,100,97,116,97,41,32,123,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,95,108,111,97,100,70,114,111,109,68,97,116,97,40,99,111,110,102,105,103,46,100,97,116,97,41,59,10,32,32,32,32,32,32,32,32,125,32,101,108,115,101,32,105,102,32,40,99,111,110,102,105,103,46,115,114,99,41,32,123,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,95,108,111,97,100,70,114,111,109,83,114,99,40,99,111,110,102,105,103,46,115,114,99,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,105,102,32,40,99,111,110,102,105,103,46,98,97,99,107,103,114,111,117,110,100,67,111,108,111,114,41,32,123,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,115,101,116,66,97,99,107,103,114,111,117,110,100,67,111,108,111,114,40,99,111,110,102,105,103,46,98,97,99,107,103,114,111,117,110,100,67,111,108,111,114,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,41,46,99,97,116,99,104,40,40,101,114,114,111,114,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,77,97,110,97,103,101,114,46,100,105,115,112,97,116,99,104,40,123,10,32,32,32,32,32,32,32,32,32,32,116,121,112,101,58,32,34,108,111,97,100,69,114,114,111,114,34,44,10,32,32,32,32,32,32,32,32,32,32,101,114,114,111,114,58,32,110,101,119,32,69,114,114,111,114,40,96,70,97,105,108,101,100,32,116,111,32,108,111,97,100,32,119,97,115,109,32,109,111,100,117,108,101,58,32,36,123,101,114,114,111,114,125,96,41,10,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,116,104,105,115,46,95,112,111,105,110,116,101,114,85,112,77,101,116,104,111,100,32,61,32,116,104,105,115,46,95,111,110,80,111,105,110,116,101,114,85,112,46,98,105,110,100,40,116,104,105,115,41,59,10,32,32,32,32,32,32,116,104,105,115,46,95,112,111,105,110,116,101,114,68,111,119,110,77,101,116,104,111,100,32,61,32,116,104,105,115,46,95,111,110,80,111,105,110,116,101,114,68,111,119,110,46,98,105,110,100,40,116,104,105,115,41,59,10,32,32,32,32,32,32,116,104,105,115,46,95,112,111,105,110,116,101,114,77,111,118,101,77,101,116,104,111,100,32,61,32,116,104,105,115,46,95,111,110,80,111,105,110,116,101,114,77,111,118,101,46,98,105,110,100,40,116,104,105,115,41,59,10,32,32,32,32,32,32,116,104,105,115,46,95,112,111,105,110,116,101,114,69,110,116,101,114,77,101,116,104,111,100,32,61,32,116,104,105,115,46,95,111,110,80,111,105,110,116,101,114,69,110,116,101,114,46,98,105,110,100,40,116,104,105,115,41,59,10,32,32,32,32,32,32,116,104,105,115,46,95,112,111,105,110,116,101,114,69,120,105,116,77,101,116,104,111,100,32,61,32,116,104,105,115,46,95,111,110,80,111,105,110,116,101,114,76,101,97,118,101,46,98,105,110,100,40,116,104,105,115,41,59,10,32,32,32,32,125,10,32,32,32,32,95,100,105,115,112,97,116,99,104,69,114,114,111,114,40,109,101,115,115,97,103,101,41,32,123,10,32,32,32,32,32,32,99,111,110,115,111,108,101,46,101,114,114,111,114,40,109,101,115,115,97,103,101,41,59,10,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,77,97,110,97,103,101,114,46,100,105,115,112,97,116,99,104,40,123,32,116,121,112,101,58,32,34,108,111,97,100,69,114,114,111,114,34,44,32,101,114,114,111,114,58,32,110,101,119,32,69,114,114,111,114,40,109,101,115,115,97,103,101,41,32,125,41,59,10,32,32,32,32,125,10,32,32,32,32,95,102,101,116,99,104,68,97,116,97,40,115,114,99,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,95,95,97,115,121,110,99,40,116,104,105,115,44,32,110,117,108,108,44,32,102,117,110,99,116,105,111,110,42,32,40,41,32,123,10,32,32,32,32,32,32,32,32,99,111,110,115,116,32,114,101,115,112,111,110,115,101,32,61,32,121,105,101,108,100,32,102,101,116,99,104,40,115,114,99,41,59,10,32,32,32,32,32,32,32,32,105,102,32,40,33,114,101,115,112,111,110,115,101,46,111,107,41,32,123,10,32,32,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,70,97,105,108,101,100,32,116,111,32,102,101,116,99,104,32,97,110,105,109,97,116,105,111,110,32,100,97,116,97,32,102,114,111,109,32,85,82,76,58,32,36,123,115,114,99,125,46,32,36,123,114,101,115,112,111,110,115,101,46,115,116,97,116,117,115,125,58,32,36,123,114,101,115,112,111,110,115,101,46,115,116,97,116,117,115,84,101,120,116,125,96,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,99,111,110,115,116,32,100,97,116,97,32,61,32,121,105,101,108,100,32,114,101,115,112,111,110,115,101,46,97,114,114,97,121,66,117,102,102,101,114,40,41,59,10,32,32,32,32,32,32,32,32,105,102,32,40,105,115,68,111,116,76,111,116,116,105,101,40,100,97,116,97,41,41,32,123,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,100,97,116,97,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,101,119,32,84,101,120,116,68,101,99,111,100,101,114,40,41,46,100,101,99,111,100,101,40,100,97,116,97,41,59,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,125,10,32,32,32,32,95,108,111,97,100,70,114,111,109,68,97,116,97,40,100,97,116,97,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,99,111,110,115,116,32,119,105,100,116,104,32,61,32,116,104,105,115,46,95,99,97,110,118,97,115,46,119,105,100,116,104,59,10,32,32,32,32,32,32,99,111,110,115,116,32,104,101,105,103,104,116,32,61,32,116,104,105,115,46,95,99,97,110,118,97,115,46,104,101,105,103,104,116,59,10,32,32,32,32,32,32,108,101,116,32,108,111,97,100,101,100,32,61,32,102,97,108,115,101,59,10,32,32,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,100,97,116,97,32,61,61,61,32,34,115,116,114,105,110,103,34,41,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,33,105,115,76,111,116,116,105,101,40,100,97,116,97,41,41,32,123,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,95,100,105,115,112,97,116,99,104,69,114,114,111,114,40,10,32,32,32,32,32,32,32,32,32,32,32,32,34,73,110,118,97,108,105,100,32,76,111,116,116,105,101,32,74,83,79,78,32,115,116,114,105,110,103,58,32,84,104,101,32,112,114,111,118,105,100,101,100,32,115,116,114,105,110,103,32,100,111,101,115,32,110,111,116,32,99,111,110,102,111,114,109,32,116,111,32,116,104,101,32,76,111,116,116,105,101,32,74,83,79,78,32,102,111,114,109,97,116,46,34,10,32,32,32,32,32,32,32,32,32,32,41,59,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,108,111,97,100,101,100,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,108,111,97,100,65,110,105,109,97,116,105,111,110,68,97,116,97,40,100,97,116,97,44,32,119,105,100,116,104,44,32,104,101,105,103,104,116,41,59,10,32,32,32,32,32,32,125,32,101,108,115,101,32,105,102,32,40,100,97,116,97,32,105,110,115,116,97,110,99,101,111,102,32,65,114,114,97,121,66,117,102,102,101,114,41,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,33,105,115,68,111,116,76,111,116,116,105,101,40,100,97,116,97,41,41,32,123,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,95,100,105,115,112,97,116,99,104,69,114,114,111,114,40,10,32,32,32,32,32,32,32,32,32,32,32,32,34,73,110,118,97,108,105,100,32,100,111,116,76,111,116,116,105,101,32,65,114,114,97,121,66,117,102,102,101,114,58,32,84,104,101,32,112,114,111,118,105,100,101,100,32,65,114,114,97,121,66,117,102,102,101,114,32,100,111,101,115,32,110,111,116,32,99,111,110,102,111,114,109,32,116,111,32,116,104,101,32,100,111,116,76,111,116,116,105,101,32,102,111,114,109,97,116,46,34,10,32,32,32,32,32,32,32,32,32,32,41,59,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,108,111,97,100,101,100,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,108,111,97,100,68,111,116,76,111,116,116,105,101,68,97,116,97,40,100,97,116,97,44,32,119,105,100,116,104,44,32,104,101,105,103,104,116,41,59,10,32,32,32,32,32,32,125,32,101,108,115,101,32,105,102,32,40,116,121,112,101,111,102,32,100,97,116,97,32,61,61,61,32,34,111,98,106,101,99,116,34,41,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,33,105,115,76,111,116,116,105,101,40,100,97,116,97,41,41,32,123,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,95,100,105,115,112,97,116,99,104,69,114,114,111,114,40,10,32,32,32,32,32,32,32,32,32,32,32,32,34,73,110,118,97,108,105,100,32,76,111,116,116,105,101,32,74,83,79,78,32,111,98,106,101,99,116,58,32,84,104,101,32,112,114,111,118,105,100,101,100,32,111,98,106,101,99,116,32,100,111,101,115,32,110,111,116,32,99,111,110,102,111,114,109,32,116,111,32,116,104,101,32,76,111,116,116,105,101,32,74,83,79,78,32,102,111,114,109,97,116,46,34,10,32,32,32,32,32,32,32,32,32,32,41,59,10,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,108,111,97,100,101,100,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,108,111,97,100,65,110,105,109,97,116,105,111,110,68,97,116,97,40,74,83,79,78,46,115,116,114,105,110,103,105,102,121,40,100,97,116,97,41,44,32,119,105,100,116,104,44,32,104,101,105,103,104,116,41,59,10,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,100,105,115,112,97,116,99,104,69,114,114,111,114,40,10,32,32,32,32,32,32,32,32,32,32,96,85,110,115,117,112,112,111,114,116,101,100,32,100,97,116,97,32,116,121,112,101,32,102,111,114,32,97,110,105,109,97,116,105,111,110,32,100,97,116,97,46,32,69,120,112,101,99,116,101,100,58,32,10,32,32,32,32,32,32,32,32,32,32,45,32,115,116,114,105,110,103,32,40,76,111,116,116,105,101,32,74,83,79,78,41,44,10,32,32,32,32,32,32,32,32,32,32,45,32,65,114,114,97,121,66,117,102,102,101,114,32,40,100,111,116,76,111,116,116,105,101,41,44,10,32,32,32,32,32,32,32,32,32,32,45,32,111,98,106,101,99,116,32,40,76,111,116,116,105,101,32,74,83,79,78,41,46,32,10,32,32,32,32,32,32,32,32,32,32,82,101,99,101,105,118,101,100,58,32,36,123,116,121,112,101,111,102,32,100,97,116,97,125,96,10,32,32,32,32,32,32,32,32,41,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,105,102,32,40,108,111,97,100,101,100,41,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,77,97,110,97,103,101,114,46,100,105,115,112,97,116,99,104,40,123,32,116,121,112,101,58,32,34,108,111,97,100,34,32,125,41,59,10,32,32,32,32,32,32,32,32,105,102,32,40,73,83,95,66,82,79,87,83,69,82,41,32,123,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,114,101,115,105,122,101,40,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,77,97,110,97,103,101,114,46,100,105,115,112,97,116,99,104,40,123,10,32,32,32,32,32,32,32,32,32,32,116,121,112,101,58,32,34,102,114,97,109,101,34,44,10,32,32,32,32,32,32,32,32,32,32,99,117,114,114,101,110,116,70,114,97,109,101,58,32,116,104,105,115,46,99,117,114,114,101,110,116,70,114,97,109,101,10,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,114,101,110,100,101,114,40,41,59,10,32,32,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,99,111,110,102,105,103,40,41,46,97,117,116,111,112,108,97,121,41,32,123,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,112,108,97,121,40,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,105,115,80,108,97,121,105,110,103,40,41,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,77,97,110,97,103,101,114,46,100,105,115,112,97,116,99,104,40,123,32,116,121,112,101,58,32,34,112,108,97,121,34,32,125,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,95,97,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,32,61,32,116,104,105,115,46,95,102,114,97,109,101,77,97,110,97,103,101,114,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,40,116,104,105,115,46,95,100,114,97,119,46,98,105,110,100,40,116,104,105,115,41,41,59,10,32,32,32,32,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,99,111,110,115,111,108,101,46,101,114,114,111,114,40,34,115,111,109,101,116,104,105,110,103,32,119,101,110,116,32,119,114,111,110,103,44,32,116,104,101,32,97,110,105,109,97,116,105,111,110,32,119,97,115,32,115,117,112,112,111,115,101,32,116,111,32,97,117,116,111,112,108,97,121,34,41,59,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,105,102,32,40,73,83,95,66,82,79,87,83,69,82,32,38,38,32,116,104,105,115,46,95,99,97,110,118,97,115,32,105,110,115,116,97,110,99,101,111,102,32,72,84,77,76,67,97,110,118,97,115,69,108,101,109,101,110,116,41,32,123,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,114,101,110,100,101,114,67,111,110,102,105,103,46,102,114,101,101,122,101,79,110,79,102,102,115,99,114,101,101,110,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,79,102,102,115,99,114,101,101,110,79,98,115,101,114,118,101,114,46,111,98,115,101,114,118,101,40,116,104,105,115,46,95,99,97,110,118,97,115,44,32,116,104,105,115,41,59,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,114,101,110,100,101,114,67,111,110,102,105,103,46,97,117,116,111,82,101,115,105,122,101,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,67,97,110,118,97,115,82,101,115,105,122,101,79,98,115,101,114,118,101,114,46,111,98,115,101,114,118,101,40,116,104,105,115,46,95,99,97,110,118,97,115,44,32,116,104,105,115,41,59,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,100,105,115,112,97,116,99,104,69,114,114,111,114,40,34,70,97,105,108,101,100,32,116,111,32,108,111,97,100,32,97,110,105,109,97,116,105,111,110,32,100,97,116,97,34,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,32,32,95,108,111,97,100,70,114,111,109,83,114,99,40,115,114,99,41,32,123,10,32,32,32,32,32,32,116,104,105,115,46,95,102,101,116,99,104,68,97,116,97,40,115,114,99,41,46,116,104,101,110,40,40,100,97,116,97,41,32,61,62,32,116,104,105,115,46,95,108,111,97,100,70,114,111,109,68,97,116,97,40,100,97,116,97,41,41,46,99,97,116,99,104,40,40,101,114,114,111,114,41,32,61,62,32,116,104,105,115,46,95,100,105,115,112,97,116,99,104,69,114,114,111,114,40,96,70,97,105,108,101,100,32,116,111,32,108,111,97,100,32,97,110,105,109,97,116,105,111,110,32,100,97,116,97,32,102,114,111,109,32,85,82,76,58,32,36,123,115,114,99,125,46,32,36,123,101,114,114,111,114,125,96,41,41,59,10,32,32,32,32,125,10,32,32,32,32,103,101,116,32,97,99,116,105,118,101,65,110,105,109,97,116,105,111,110,73,100,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,97,99,116,105,118,101,65,110,105,109,97,116,105,111,110,73,100,40,41,59,10,32,32,32,32,125,10,32,32,32,32,103,101,116,32,97,99,116,105,118,101,84,104,101,109,101,73,100,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,97,99,116,105,118,101,84,104,101,109,101,73,100,40,41,59,10,32,32,32,32,125,10,32,32,32,32,103,101,116,32,108,97,121,111,117,116,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,59,10,32,32,32,32,32,32,99,111,110,115,116,32,108,97,121,111,117,116,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,99,111,110,102,105,103,40,41,46,108,97,121,111,117,116,59,10,32,32,32,32,32,32,105,102,32,40,108,97,121,111,117,116,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,123,10,32,32,32,32,32,32,32,32,32,32,97,108,105,103,110,58,32,91,108,97,121,111,117,116,46,97,108,105,103,110,46,103,101,116,40,48,41,44,32,108,97,121,111,117,116,46,97,108,105,103,110,46,103,101,116,40,49,41,93,44,10,32,32,32,32,32,32,32,32,32,32,102,105,116,58,32,40,40,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,118,97,114,32,95,97,50,44,32,95,98,44,32,95,99,44,32,95,100,44,32,95,101,44,32,95,102,59,10,32,32,32,32,32,32,32,32,32,32,32,32,115,119,105,116,99,104,32,40,108,97,121,111,117,116,46,102,105,116,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,40,40,95,97,50,32,61,32,95,68,111,116,76,111,116,116,105,101,46,95,119,97,115,109,77,111,100,117,108,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,50,46,70,105,116,46,67,111,110,116,97,105,110,41,58,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,34,99,111,110,116,97,105,110,34,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,40,40,95,98,32,61,32,95,68,111,116,76,111,116,116,105,101,46,95,119,97,115,109,77,111,100,117,108,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,98,46,70,105,116,46,67,111,118,101,114,41,58,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,34,99,111,118,101,114,34,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,40,40,95,99,32,61,32,95,68,111,116,76,111,116,116,105,101,46,95,119,97,115,109,77,111,100,117,108,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,99,46,70,105,116,46,70,105,108,108,41,58,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,34,102,105,108,108,34,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,40,40,95,100,32,61,32,95,68,111,116,76,111,116,116,105,101,46,95,119,97,115,109,77,111,100,117,108,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,100,46,70,105,116,46,70,105,116,72,101,105,103,104,116,41,58,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,34,102,105,116,45,104,101,105,103,104,116,34,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,40,40,95,101,32,61,32,95,68,111,116,76,111,116,116,105,101,46,95,119,97,115,109,77,111,100,117,108,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,101,46,70,105,116,46,70,105,116,87,105,100,116,104,41,58,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,34,102,105,116,45,119,105,100,116,104,34,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,99,97,115,101,32,40,40,95,102,32,61,32,95,68,111,116,76,111,116,116,105,101,46,95,119,97,115,109,77,111,100,117,108,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,102,46,70,105,116,46,78,111,110,101,41,58,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,34,110,111,110,101,34,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,100,101,102,97,117,108,116,58,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,34,99,111,110,116,97,105,110,34,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,125,41,40,41,10,32,32,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,118,111,105,100,32,48,59,10,32,32,32,32,125,10,32,32,32,32,103,101,116,32,109,97,114,107,101,114,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,59,10,32,32,32,32,32,32,99,111,110,115,116,32,109,97,114,107,101,114,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,99,111,110,102,105,103,40,41,46,109,97,114,107,101,114,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,109,97,114,107,101,114,59,10,32,32,32,32,125,10,32,32,32,32,103,101,116,32,109,97,110,105,102,101,115,116,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,59,10,32,32,32,32,32,32,116,114,121,32,123,10,32,32,32,32,32,32,32,32,99,111,110,115,116,32,109,97,110,105,102,101,115,116,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,109,97,110,105,102,101,115,116,83,116,114,105,110,103,40,41,59,10,32,32,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,61,61,61,32,110,117,108,108,32,124,124,32,33,109,97,110,105,102,101,115,116,41,32,114,101,116,117,114,110,32,110,117,108,108,59,10,32,32,32,32,32,32,32,32,99,111,110,115,116,32,109,97,110,105,102,101,115,116,74,115,111,110,32,61,32,74,83,79,78,46,112,97,114,115,101,40,109,97,110,105,102,101,115,116,41,59,10,32,32,32,32,32,32,32,32,105,102,32,40,79,98,106,101,99,116,46,107,101,121,115,40,109,97,110,105,102,101,115,116,74,115,111,110,41,46,108,101,110,103,116,104,32,61,61,61,32,48,41,32,114,101,116,117,114,110,32,110,117,108,108,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,109,97,110,105,102,101,115,116,74,115,111,110,59,10,32,32,32,32,32,32,125,32,99,97,116,99,104,32,40,95,101,114,114,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,117,108,108,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,32,32,103,101,116,32,114,101,110,100,101,114,67,111,110,102,105,103,40,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,116,104,105,115,46,95,114,101,110,100,101,114,67,111,110,102,105,103,59,10,32,32,32,32,125,10,32,32,32,32,103,101,116,32,115,101,103,109,101,110,116,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,59,10,32,32,32,32,32,32,99,111,110,115,116,32,115,101,103,109,101,110,116,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,99,111,110,102,105,103,40,41,46,115,101,103,109,101,110,116,59,10,32,32,32,32,32,32,105,102,32,40,115,101,103,109,101,110,116,32,38,38,32,115,101,103,109,101,110,116,46,115,105,122,101,40,41,32,61,61,61,32,50,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,91,115,101,103,109,101,110,116,46,103,101,116,40,48,41,44,32,115,101,103,109,101,110,116,46,103,101,116,40,49,41,93,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,118,111,105,100,32,48,59,10,32,32,32,32,125,10,32,32,32,32,103,101,116,32,108,111,111,112,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,98,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,99,111,110,102,105,103,40,41,46,108,111,111,112,65,110,105,109,97,116,105,111,110,41,32,33,61,32,110,117,108,108,32,63,32,95,98,32,58,32,102,97,108,115,101,59,10,32,32,32,32,125,10,32,32,32,32,103,101,116,32,109,111,100,101,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,44,32,95,99,44,32,95,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,109,111,100,101,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,99,111,110,102,105,103,40,41,46,109,111,100,101,59,10,32,32,32,32,32,32,105,102,32,40,109,111,100,101,32,61,61,61,32,40,40,95,98,32,61,32,95,68,111,116,76,111,116,116,105,101,46,95,119,97,115,109,77,111,100,117,108,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,98,46,77,111,100,101,46,82,101,118,101,114,115,101,41,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,34,114,101,118,101,114,115,101,34,59,10,32,32,32,32,32,32,125,32,101,108,115,101,32,105,102,32,40,109,111,100,101,32,61,61,61,32,40,40,95,99,32,61,32,95,68,111,116,76,111,116,116,105,101,46,95,119,97,115,109,77,111,100,117,108,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,99,46,77,111,100,101,46,66,111,117,110,99,101,41,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,34,98,111,117,110,99,101,34,59,10,32,32,32,32,32,32,125,32,101,108,115,101,32,105,102,32,40,109,111,100,101,32,61,61,61,32,40,40,95,100,32,61,32,95,68,111,116,76,111,116,116,105,101,46,95,119,97,115,109,77,111,100,117,108,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,100,46,77,111,100,101,46,82,101,118,101,114,115,101,66,111,117,110,99,101,41,41,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,34,114,101,118,101,114,115,101,45,98,111,117,110,99,101,34,59,10,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,34,102,111,114,119,97,114,100,34,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,32,32,103,101,116,32,105,115,70,114,111,122,101,110,40,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,116,104,105,115,46,95,105,115,70,114,111,122,101,110,59,10,32,32,32,32,125,10,32,32,32,32,103,101,116,32,98,97,99,107,103,114,111,117,110,100,67,111,108,111,114,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,97,32,61,32,116,104,105,115,46,95,98,97,99,107,103,114,111,117,110,100,67,111,108,111,114,41,32,33,61,32,110,117,108,108,32,63,32,95,97,32,58,32,34,34,59,10,32,32,32,32,125,10,32,32,32,32,103,101,116,32,97,117,116,111,112,108,97,121,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,98,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,99,111,110,102,105,103,40,41,46,97,117,116,111,112,108,97,121,41,32,33,61,32,110,117,108,108,32,63,32,95,98,32,58,32,102,97,108,115,101,59,10,32,32,32,32,125,10,32,32,32,32,103,101,116,32,117,115,101,70,114,97,109,101,73,110,116,101,114,112,111,108,97,116,105,111,110,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,98,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,99,111,110,102,105,103,40,41,46,117,115,101,70,114,97,109,101,73,110,116,101,114,112,111,108,97,116,105,111,110,41,32,33,61,32,110,117,108,108,32,63,32,95,98,32,58,32,102,97,108,115,101,59,10,32,32,32,32,125,10,32,32,32,32,103,101,116,32,115,112,101,101,100,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,98,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,99,111,110,102,105,103,40,41,46,115,112,101,101,100,41,32,33,61,32,110,117,108,108,32,63,32,95,98,32,58,32,48,59,10,32,32,32,32,125,10,32,32,32,32,103,101,116,32,105,115,82,101,97,100,121,40,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,33,61,61,32,110,117,108,108,59,10,32,32,32,32,125,10,32,32,32,32,103,101,116,32,105,115,76,111,97,100,101,100,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,98,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,105,115,76,111,97,100,101,100,40,41,41,32,33,61,32,110,117,108,108,32,63,32,95,98,32,58,32,102,97,108,115,101,59,10,32,32,32,32,125,10,32,32,32,32,103,101,116,32,105,115,80,108,97,121,105,110,103,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,98,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,105,115,80,108,97,121,105,110,103,40,41,41,32,33,61,32,110,117,108,108,32,63,32,95,98,32,58,32,102,97,108,115,101,59,10,32,32,32,32,125,10,32,32,32,32,103,101,116,32,105,115,80,97,117,115,101,100,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,98,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,105,115,80,97,117,115,101,100,40,41,41,32,33,61,32,110,117,108,108,32,63,32,95,98,32,58,32,102,97,108,115,101,59,10,32,32,32,32,125,10,32,32,32,32,103,101,116,32,105,115,83,116,111,112,112,101,100,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,98,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,105,115,83,116,111,112,112,101,100,40,41,41,32,33,61,32,110,117,108,108,32,63,32,95,98,32,58,32,102,97,108,115,101,59,10,32,32,32,32,125,10,32,32,32,32,103,101,116,32,99,117,114,114,101,110,116,70,114,97,109,101,40,41,32,123,10,32,32,32,32,32,32,105,102,32,40,33,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,114,101,116,117,114,110,32,48,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,77,97,116,104,46,114,111,117,110,100,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,99,117,114,114,101,110,116,70,114,97,109,101,40,41,32,42,32,49,48,48,41,32,47,32,49,48,48,59,10,32,32,32,32,125,10,32,32,32,32,103,101,116,32,108,111,111,112,67,111,117,110,116,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,98,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,108,111,111,112,67,111,117,110,116,40,41,41,32,33,61,32,110,117,108,108,32,63,32,95,98,32,58,32,48,59,10,32,32,32,32,125,10,32,32,32,32,103,101,116,32,116,111,116,97,108,70,114,97,109,101,115,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,98,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,116,111,116,97,108,70,114,97,109,101,115,40,41,41,32,33,61,32,110,117,108,108,32,63,32,95,98,32,58,32,48,59,10,32,32,32,32,125,10,32,32,32,32,103,101,116,32,100,117,114,97,116,105,111,110,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,98,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,100,117,114,97,116,105,111,110,40,41,41,32,33,61,32,110,117,108,108,32,63,32,95,98,32,58,32,48,59,10,32,32,32,32,125,10,32,32,32,32,103,101,116,32,115,101,103,109,101,110,116,68,117,114,97,116,105,111,110,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,98,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,115,101,103,109,101,110,116,68,117,114,97,116,105,111,110,40,41,41,32,33,61,32,110,117,108,108,32,63,32,95,98,32,58,32,48,59,10,32,32,32,32,125,10,32,32,32,32,103,101,116,32,99,97,110,118,97,115,40,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,116,104,105,115,46,95,99,97,110,118,97,115,59,10,32,32,32,32,125,10,32,32,32,32,108,111,97,100,40,99,111,110,102,105,103,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,44,32,95,99,44,32,95,100,44,32,95,101,44,32,95,102,44,32,95,103,44,32,95,104,44,32,95,105,59,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,61,61,61,32,110,117,108,108,32,124,124,32,95,68,111,116,76,111,116,116,105,101,46,95,119,97,115,109,77,111,100,117,108,101,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,97,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,32,33,61,61,32,110,117,108,108,41,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,102,114,97,109,101,77,97,110,97,103,101,114,46,99,97,110,99,101,108,65,110,105,109,97,116,105,111,110,70,114,97,109,101,40,116,104,105,115,46,95,97,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,41,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,97,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,32,61,32,110,117,108,108,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,115,101,116,67,111,110,102,105,103,40,123,10,32,32,32,32,32,32,32,32,116,104,101,109,101,73,100,58,32,40,95,97,32,61,32,99,111,110,102,105,103,46,116,104,101,109,101,73,100,41,32,33,61,32,110,117,108,108,32,63,32,95,97,32,58,32,34,34,44,10,32,32,32,32,32,32,32,32,97,117,116,111,112,108,97,121,58,32,40,95,98,32,61,32,99,111,110,102,105,103,46,97,117,116,111,112,108,97,121,41,32,33,61,32,110,117,108,108,32,63,32,95,98,32,58,32,102,97,108,115,101,44,10,32,32,32,32,32,32,32,32,98,97,99,107,103,114,111,117,110,100,67,111,108,111,114,58,32,48,44,10,32,32,32,32,32,32,32,32,108,111,111,112,65,110,105,109,97,116,105,111,110,58,32,40,95,99,32,61,32,99,111,110,102,105,103,46,108,111,111,112,41,32,33,61,32,110,117,108,108,32,63,32,95,99,32,58,32,102,97,108,115,101,44,10,32,32,32,32,32,32,32,32,109,111,100,101,58,32,99,114,101,97,116,101,67,111,114,101,77,111,100,101,40,40,95,100,32,61,32,99,111,110,102,105,103,46,109,111,100,101,41,32,33,61,32,110,117,108,108,32,63,32,95,100,32,58,32,34,102,111,114,119,97,114,100,34,44,32,95,68,111,116,76,111,116,116,105,101,46,95,119,97,115,109,77,111,100,117,108,101,41,44,10,32,32,32,32,32,32,32,32,115,101,103,109,101,110,116,58,32,99,114,101,97,116,101,67,111,114,101,83,101,103,109,101,110,116,40,40,95,101,32,61,32,99,111,110,102,105,103,46,115,101,103,109,101,110,116,41,32,33,61,32,110,117,108,108,32,63,32,95,101,32,58,32,91,93,44,32,95,68,111,116,76,111,116,116,105,101,46,95,119,97,115,109,77,111,100,117,108,101,41,44,10,32,32,32,32,32,32,32,32,115,112,101,101,100,58,32,40,95,102,32,61,32,99,111,110,102,105,103,46,115,112,101,101,100,41,32,33,61,32,110,117,108,108,32,63,32,95,102,32,58,32,49,44,10,32,32,32,32,32,32,32,32,117,115,101,70,114,97,109,101,73,110,116,101,114,112,111,108,97,116,105,111,110,58,32,40,95,103,32,61,32,99,111,110,102,105,103,46,117,115,101,70,114,97,109,101,73,110,116,101,114,112,111,108,97,116,105,111,110,41,32,33,61,32,110,117,108,108,32,63,32,95,103,32,58,32,116,114,117,101,44,10,32,32,32,32,32,32,32,32,109,97,114,107,101,114,58,32,40,95,104,32,61,32,99,111,110,102,105,103,46,109,97,114,107,101,114,41,32,33,61,32,110,117,108,108,32,63,32,95,104,32,58,32,34,34,44,10,32,32,32,32,32,32,32,32,108,97,121,111,117,116,58,32,99,111,110,102,105,103,46,108,97,121,111,117,116,32,63,32,123,10,32,32,32,32,32,32,32,32,32,32,97,108,105,103,110,58,32,99,114,101,97,116,101,67,111,114,101,65,108,105,103,110,40,99,111,110,102,105,103,46,108,97,121,111,117,116,46,97,108,105,103,110,44,32,95,68,111,116,76,111,116,116,105,101,46,95,119,97,115,109,77,111,100,117,108,101,41,44,10,32,32,32,32,32,32,32,32,32,32,102,105,116,58,32,99,114,101,97,116,101,67,111,114,101,70,105,116,40,99,111,110,102,105,103,46,108,97,121,111,117,116,46,102,105,116,44,32,95,68,111,116,76,111,116,116,105,101,46,95,119,97,115,109,77,111,100,117,108,101,41,10,32,32,32,32,32,32,32,32,125,32,58,32,95,68,111,116,76,111,116,116,105,101,46,95,119,97,115,109,77,111,100,117,108,101,46,99,114,101,97,116,101,68,101,102,97,117,108,116,76,97,121,111,117,116,40,41,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,105,102,32,40,99,111,110,102,105,103,46,100,97,116,97,41,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,108,111,97,100,70,114,111,109,68,97,116,97,40,99,111,110,102,105,103,46,100,97,116,97,41,59,10,32,32,32,32,32,32,125,32,101,108,115,101,32,105,102,32,40,99,111,110,102,105,103,46,115,114,99,41,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,108,111,97,100,70,114,111,109,83,114,99,40,99,111,110,102,105,103,46,115,114,99,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,116,104,105,115,46,115,101,116,66,97,99,107,103,114,111,117,110,100,67,111,108,111,114,40,40,95,105,32,61,32,99,111,110,102,105,103,46,98,97,99,107,103,114,111,117,110,100,67,111,108,111,114,41,32,33,61,32,110,117,108,108,32,63,32,95,105,32,58,32,34,34,41,59,10,32,32,32,32,125,10,32,32,32,32,95,114,101,110,100,101,114,40,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,61,61,61,32,110,117,108,108,32,124,124,32,116,104,105,115,46,95,99,111,110,116,101,120,116,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,32,102,97,108,115,101,59,10,32,32,32,32,32,32,99,111,110,115,116,32,114,101,110,100,101,114,101,100,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,114,101,110,100,101,114,40,41,59,10,32,32,32,32,32,32,105,102,32,40,114,101,110,100,101,114,101,100,41,32,123,10,32,32,32,32,32,32,32,32,99,111,110,115,116,32,98,117,102,102,101,114,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,98,117,102,102,101,114,40,41,59,10,32,32,32,32,32,32,32,32,99,111,110,115,116,32,99,108,97,109,112,101,100,66,117,102,102,101,114,32,61,32,110,101,119,32,85,105,110,116,56,67,108,97,109,112,101,100,65,114,114,97,121,40,98,117,102,102,101,114,44,32,48,44,32,116,104,105,115,46,95,99,97,110,118,97,115,46,119,105,100,116,104,32,42,32,116,104,105,115,46,95,99,97,110,118,97,115,46,104,101,105,103,104,116,32,42,32,52,41,59,10,32,32,32,32,32,32,32,32,108,101,116,32,105,109,97,103,101,68,97,116,97,32,61,32,110,117,108,108,59,10,32,32,32,32,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,73,109,97,103,101,68,97,116,97,32,61,61,61,32,34,117,110,100,101,102,105,110,101,100,34,41,32,123,10,32,32,32,32,32,32,32,32,32,32,105,109,97,103,101,68,97,116,97,32,61,32,116,104,105,115,46,95,99,111,110,116,101,120,116,46,99,114,101,97,116,101,73,109,97,103,101,68,97,116,97,40,116,104,105,115,46,95,99,97,110,118,97,115,46,119,105,100,116,104,44,32,116,104,105,115,46,95,99,97,110,118,97,115,46,104,101,105,103,104,116,41,59,10,32,32,32,32,32,32,32,32,32,32,105,109,97,103,101,68,97,116,97,46,100,97,116,97,46,115,101,116,40,99,108,97,109,112,101,100,66,117,102,102,101,114,41,59,10,32,32,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,32,32,105,109,97,103,101,68,97,116,97,32,61,32,110,101,119,32,73,109,97,103,101,68,97,116,97,40,99,108,97,109,112,101,100,66,117,102,102,101,114,44,32,116,104,105,115,46,95,99,97,110,118,97,115,46,119,105,100,116,104,44,32,116,104,105,115,46,95,99,97,110,118,97,115,46,104,101,105,103,104,116,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,99,111,110,116,101,120,116,46,112,117,116,73,109,97,103,101,68,97,116,97,40,105,109,97,103,101,68,97,116,97,44,32,48,44,32,48,41,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,77,97,110,97,103,101,114,46,100,105,115,112,97,116,99,104,40,123,10,32,32,32,32,32,32,32,32,32,32,116,121,112,101,58,32,34,114,101,110,100,101,114,34,44,10,32,32,32,32,32,32,32,32,32,32,99,117,114,114,101,110,116,70,114,97,109,101,58,32,116,104,105,115,46,99,117,114,114,101,110,116,70,114,97,109,101,10,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,116,114,117,101,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,102,97,108,115,101,59,10,32,32,32,32,125,10,32,32,32,32,95,100,114,97,119,40,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,61,61,61,32,110,117,108,108,32,124,124,32,116,104,105,115,46,95,99,111,110,116,101,120,116,32,61,61,61,32,110,117,108,108,32,124,124,32,33,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,105,115,80,108,97,121,105,110,103,40,41,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,99,111,110,115,116,32,110,101,120,116,70,114,97,109,101,32,61,32,77,97,116,104,46,114,111,117,110,100,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,114,101,113,117,101,115,116,70,114,97,109,101,40,41,32,42,32,49,48,48,41,32,47,32,49,48,48,59,10,32,32,32,32,32,32,99,111,110,115,116,32,117,112,100,97,116,101,100,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,115,101,116,70,114,97,109,101,40,110,101,120,116,70,114,97,109,101,41,59,10,32,32,32,32,32,32,105,102,32,40,117,112,100,97,116,101,100,41,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,77,97,110,97,103,101,114,46,100,105,115,112,97,116,99,104,40,123,10,32,32,32,32,32,32,32,32,32,32,116,121,112,101,58,32,34,102,114,97,109,101,34,44,10,32,32,32,32,32,32,32,32,32,32,99,117,114,114,101,110,116,70,114,97,109,101,58,32,116,104,105,115,46,99,117,114,114,101,110,116,70,114,97,109,101,10,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,99,111,110,115,116,32,114,101,110,100,101,114,101,100,32,61,32,116,104,105,115,46,95,114,101,110,100,101,114,40,41,59,10,32,32,32,32,32,32,32,32,105,102,32,40,114,101,110,100,101,114,101,100,41,32,123,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,105,115,67,111,109,112,108,101,116,101,40,41,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,99,111,110,102,105,103,40,41,46,108,111,111,112,65,110,105,109,97,116,105,111,110,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,77,97,110,97,103,101,114,46,100,105,115,112,97,116,99,104,40,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,121,112,101,58,32,34,108,111,111,112,34,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,108,111,111,112,67,111,117,110,116,58,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,108,111,111,112,67,111,117,110,116,40,41,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,77,97,110,97,103,101,114,46,100,105,115,112,97,116,99,104,40,123,32,116,121,112,101,58,32,34,99,111,109,112,108,101,116,101,34,32,125,41,59,10,32,32,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,116,104,105,115,46,95,97,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,32,61,32,116,104,105,115,46,95,102,114,97,109,101,77,97,110,97,103,101,114,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,40,116,104,105,115,46,95,100,114,97,119,46,98,105,110,100,40,116,104,105,115,41,41,59,10,32,32,32,32,125,10,32,32,32,32,112,108,97,121,40,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,99,111,110,115,116,32,111,107,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,112,108,97,121,40,41,59,10,32,32,32,32,32,32,105,102,32,40,111,107,32,124,124,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,105,115,80,108,97,121,105,110,103,40,41,41,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,105,115,70,114,111,122,101,110,32,61,32,102,97,108,115,101,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,77,97,110,97,103,101,114,46,100,105,115,112,97,116,99,104,40,123,32,116,121,112,101,58,32,34,112,108,97,121,34,32,125,41,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,97,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,32,61,32,116,104,105,115,46,95,102,114,97,109,101,77,97,110,97,103,101,114,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,40,116,104,105,115,46,95,100,114,97,119,46,98,105,110,100,40,116,104,105,115,41,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,105,102,32,40,73,83,95,66,82,79,87,83,69,82,32,38,38,32,116,104,105,115,46,95,99,97,110,118,97,115,32,105,110,115,116,97,110,99,101,111,102,32,72,84,77,76,67,97,110,118,97,115,69,108,101,109,101,110,116,32,38,38,32,116,104,105,115,46,95,114,101,110,100,101,114,67,111,110,102,105,103,46,102,114,101,101,122,101,79,110,79,102,102,115,99,114,101,101,110,32,38,38,32,33,105,115,69,108,101,109,101,110,116,73,110,86,105,101,119,112,111,114,116,40,116,104,105,115,46,95,99,97,110,118,97,115,41,41,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,102,114,101,101,122,101,40,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,32,32,112,97,117,115,101,40,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,99,111,110,115,116,32,111,107,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,112,97,117,115,101,40,41,59,10,32,32,32,32,32,32,105,102,32,40,111,107,32,124,124,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,105,115,80,97,117,115,101,100,40,41,41,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,77,97,110,97,103,101,114,46,100,105,115,112,97,116,99,104,40,123,32,116,121,112,101,58,32,34,112,97,117,115,101,34,32,125,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,32,32,115,116,111,112,40,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,99,111,110,115,116,32,111,107,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,115,116,111,112,40,41,59,10,32,32,32,32,32,32,105,102,32,40,111,107,41,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,77,97,110,97,103,101,114,46,100,105,115,112,97,116,99,104,40,123,32,116,121,112,101,58,32,34,102,114,97,109,101,34,44,32,99,117,114,114,101,110,116,70,114,97,109,101,58,32,116,104,105,115,46,99,117,114,114,101,110,116,70,114,97,109,101,32,125,41,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,114,101,110,100,101,114,40,41,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,77,97,110,97,103,101,114,46,100,105,115,112,97,116,99,104,40,123,32,116,121,112,101,58,32,34,115,116,111,112,34,32,125,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,32,32,115,101,116,70,114,97,109,101,40,102,114,97,109,101,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,105,102,32,40,102,114,97,109,101,32,60,32,48,32,124,124,32,102,114,97,109,101,32,62,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,116,111,116,97,108,70,114,97,109,101,115,40,41,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,99,111,110,115,116,32,111,107,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,115,101,101,107,40,102,114,97,109,101,41,59,10,32,32,32,32,32,32,105,102,32,40,111,107,41,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,77,97,110,97,103,101,114,46,100,105,115,112,97,116,99,104,40,123,32,116,121,112,101,58,32,34,102,114,97,109,101,34,44,32,99,117,114,114,101,110,116,70,114,97,109,101,58,32,116,104,105,115,46,99,117,114,114,101,110,116,70,114,97,109,101,32,125,41,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,114,101,110,100,101,114,40,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,32,32,115,101,116,83,112,101,101,100,40,115,112,101,101,100,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,115,101,116,67,111,110,102,105,103,40,95,95,115,112,114,101,97,100,80,114,111,112,115,40,95,95,115,112,114,101,97,100,86,97,108,117,101,115,40,123,125,44,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,99,111,110,102,105,103,40,41,41,44,32,123,10,32,32,32,32,32,32,32,32,115,112,101,101,100,10,32,32,32,32,32,32,125,41,41,59,10,32,32,32,32,125,10,32,32,32,32,115,101,116,66,97,99,107,103,114,111,117,110,100,67,111,108,111,114,40,99,111,108,111,114,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,105,102,32,40,73,83,95,66,82,79,87,83,69,82,32,38,38,32,116,104,105,115,46,95,99,97,110,118,97,115,32,105,110,115,116,97,110,99,101,111,102,32,72,84,77,76,67,97,110,118,97,115,69,108,101,109,101,110,116,41,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,99,97,110,118,97,115,46,115,116,121,108,101,46,98,97,99,107,103,114,111,117,110,100,67,111,108,111,114,32,61,32,99,111,108,111,114,59,10,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,115,101,116,67,111,110,102,105,103,40,95,95,115,112,114,101,97,100,80,114,111,112,115,40,95,95,115,112,114,101,97,100,86,97,108,117,101,115,40,123,125,44,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,99,111,110,102,105,103,40,41,41,44,32,123,10,32,32,32,32,32,32,32,32,32,32,98,97,99,107,103,114,111,117,110,100,67,111,108,111,114,58,32,104,101,120,83,116,114,105,110,103,84,111,82,71,66,65,73,110,116,40,99,111,108,111,114,41,10,32,32,32,32,32,32,32,32,125,41,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,116,104,105,115,46,95,98,97,99,107,103,114,111,117,110,100,67,111,108,111,114,32,61,32,99,111,108,111,114,59,10,32,32,32,32,125,10,32,32,32,32,115,101,116,76,111,111,112,40,108,111,111,112,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,115,101,116,67,111,110,102,105,103,40,95,95,115,112,114,101,97,100,80,114,111,112,115,40,95,95,115,112,114,101,97,100,86,97,108,117,101,115,40,123,125,44,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,99,111,110,102,105,103,40,41,41,44,32,123,10,32,32,32,32,32,32,32,32,108,111,111,112,65,110,105,109,97,116,105,111,110,58,32,108,111,111,112,10,32,32,32,32,32,32,125,41,41,59,10,32,32,32,32,125,10,32,32,32,32,115,101,116,85,115,101,70,114,97,109,101,73,110,116,101,114,112,111,108,97,116,105,111,110,40,117,115,101,70,114,97,109,101,73,110,116,101,114,112,111,108,97,116,105,111,110,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,115,101,116,67,111,110,102,105,103,40,95,95,115,112,114,101,97,100,80,114,111,112,115,40,95,95,115,112,114,101,97,100,86,97,108,117,101,115,40,123,125,44,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,99,111,110,102,105,103,40,41,41,44,32,123,10,32,32,32,32,32,32,32,32,117,115,101,70,114,97,109,101,73,110,116,101,114,112,111,108,97,116,105,111,110,10,32,32,32,32,32,32,125,41,41,59,10,32,32,32,32,125,10,32,32,32,32,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,40,116,121,112,101,44,32,108,105,115,116,101,110,101,114,41,32,123,10,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,77,97,110,97,103,101,114,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,40,116,121,112,101,44,32,108,105,115,116,101,110,101,114,41,59,10,32,32,32,32,125,10,32,32,32,32,114,101,109,111,118,101,69,118,101,110,116,76,105,115,116,101,110,101,114,40,116,121,112,101,44,32,108,105,115,116,101,110,101,114,41,32,123,10,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,77,97,110,97,103,101,114,46,114,101,109,111,118,101,69,118,101,110,116,76,105,115,116,101,110,101,114,40,116,121,112,101,44,32,108,105,115,116,101,110,101,114,41,59,10,32,32,32,32,125,10,32,32,32,32,100,101,115,116,114,111,121,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,59,10,32,32,32,32,32,32,105,102,32,40,73,83,95,66,82,79,87,83,69,82,32,38,38,32,116,104,105,115,46,95,99,97,110,118,97,115,32,105,110,115,116,97,110,99,101,111,102,32,72,84,77,76,67,97,110,118,97,115,69,108,101,109,101,110,116,41,32,123,10,32,32,32,32,32,32,32,32,79,102,102,115,99,114,101,101,110,79,98,115,101,114,118,101,114,46,117,110,111,98,115,101,114,118,101,40,116,104,105,115,46,95,99,97,110,118,97,115,41,59,10,32,32,32,32,32,32,32,32,67,97,110,118,97,115,82,101,115,105,122,101,79,98,115,101,114,118,101,114,46,117,110,111,98,115,101,114,118,101,40,116,104,105,115,46,95,99,97,110,118,97,115,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,100,101,108,101,116,101,40,41,59,10,32,32,32,32,32,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,61,32,110,117,108,108,59,10,32,32,32,32,32,32,116,104,105,115,46,95,99,111,110,116,101,120,116,32,61,32,110,117,108,108,59,10,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,77,97,110,97,103,101,114,46,100,105,115,112,97,116,99,104,40,123,10,32,32,32,32,32,32,32,32,116,121,112,101,58,32,34,100,101,115,116,114,111,121,34,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,77,97,110,97,103,101,114,46,114,101,109,111,118,101,65,108,108,69,118,101,110,116,76,105,115,116,101,110,101,114,115,40,41,59,10,32,32,32,32,32,32,116,104,105,115,46,95,99,108,101,97,110,117,112,83,116,97,116,101,77,97,99,104,105,110,101,76,105,115,116,101,110,101,114,115,40,41,59,10,32,32,32,32,125,10,32,32,32,32,102,114,101,101,122,101,40,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,97,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,116,104,105,115,46,95,102,114,97,109,101,77,97,110,97,103,101,114,46,99,97,110,99,101,108,65,110,105,109,97,116,105,111,110,70,114,97,109,101,40,116,104,105,115,46,95,97,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,41,59,10,32,32,32,32,32,32,116,104,105,115,46,95,97,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,32,61,32,110,117,108,108,59,10,32,32,32,32,32,32,116,104,105,115,46,95,105,115,70,114,111,122,101,110,32,61,32,116,114,117,101,59,10,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,77,97,110,97,103,101,114,46,100,105,115,112,97,116,99,104,40,123,32,116,121,112,101,58,32,34,102,114,101,101,122,101,34,32,125,41,59,10,32,32,32,32,125,10,32,32,32,32,117,110,102,114,101,101,122,101,40,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,97,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,32,33,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,116,104,105,115,46,95,97,110,105,109,97,116,105,111,110,70,114,97,109,101,73,100,32,61,32,116,104,105,115,46,95,102,114,97,109,101,77,97,110,97,103,101,114,46,114,101,113,117,101,115,116,65,110,105,109,97,116,105,111,110,70,114,97,109,101,40,116,104,105,115,46,95,100,114,97,119,46,98,105,110,100,40,116,104,105,115,41,41,59,10,32,32,32,32,32,32,116,104,105,115,46,95,105,115,70,114,111,122,101,110,32,61,32,102,97,108,115,101,59,10,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,77,97,110,97,103,101,114,46,100,105,115,112,97,116,99,104,40,123,32,116,121,112,101,58,32,34,117,110,102,114,101,101,122,101,34,32,125,41,59,10,32,32,32,32,125,10,32,32,32,32,114,101,115,105,122,101,40,41,32,123,10,32,32,32,32,32,32,105,102,32,40,33,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,124,124,32,33,116,104,105,115,46,105,115,76,111,97,100,101,100,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,105,102,32,40,73,83,95,66,82,79,87,83,69,82,32,38,38,32,116,104,105,115,46,95,99,97,110,118,97,115,32,105,110,115,116,97,110,99,101,111,102,32,72,84,77,76,67,97,110,118,97,115,69,108,101,109,101,110,116,41,32,123,10,32,32,32,32,32,32,32,32,99,111,110,115,116,32,100,112,114,32,61,32,116,104,105,115,46,95,114,101,110,100,101,114,67,111,110,102,105,103,46,100,101,118,105,99,101,80,105,120,101,108,82,97,116,105,111,32,124,124,32,119,105,110,100,111,119,46,100,101,118,105,99,101,80,105,120,101,108,82,97,116,105,111,32,124,124,32,49,59,10,32,32,32,32,32,32,32,32,99,111,110,115,116,32,123,32,104,101,105,103,104,116,58,32,99,108,105,101,110,116,72,101,105,103,104,116,44,32,119,105,100,116,104,58,32,99,108,105,101,110,116,87,105,100,116,104,32,125,32,61,32,116,104,105,115,46,95,99,97,110,118,97,115,46,103,101,116,66,111,117,110,100,105,110,103,67,108,105,101,110,116,82,101,99,116,40,41,59,10,32,32,32,32,32,32,32,32,105,102,32,40,99,108,105,101,110,116,72,101,105,103,104,116,32,33,61,61,32,48,32,38,38,32,99,108,105,101,110,116,87,105,100,116,104,32,33,61,61,32,48,41,32,123,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,95,99,97,110,118,97,115,46,119,105,100,116,104,32,61,32,99,108,105,101,110,116,87,105,100,116,104,32,42,32,100,112,114,59,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,95,99,97,110,118,97,115,46,104,101,105,103,104,116,32,61,32,99,108,105,101,110,116,72,101,105,103,104,116,32,42,32,100,112,114,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,99,111,110,115,116,32,111,107,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,114,101,115,105,122,101,40,116,104,105,115,46,95,99,97,110,118,97,115,46,119,105,100,116,104,44,32,116,104,105,115,46,95,99,97,110,118,97,115,46,104,101,105,103,104,116,41,59,10,32,32,32,32,32,32,105,102,32,40,111,107,41,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,114,101,110,100,101,114,40,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,32,32,115,101,116,83,101,103,109,101,110,116,40,115,116,97,114,116,70,114,97,109,101,44,32,101,110,100,70,114,97,109,101,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,61,61,61,32,110,117,108,108,32,124,124,32,95,68,111,116,76,111,116,116,105,101,46,95,119,97,115,109,77,111,100,117,108,101,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,115,101,116,67,111,110,102,105,103,40,95,95,115,112,114,101,97,100,80,114,111,112,115,40,95,95,115,112,114,101,97,100,86,97,108,117,101,115,40,123,125,44,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,99,111,110,102,105,103,40,41,41,44,32,123,10,32,32,32,32,32,32,32,32,115,101,103,109,101,110,116,58,32,99,114,101,97,116,101,67,111,114,101,83,101,103,109,101,110,116,40,91,115,116,97,114,116,70,114,97,109,101,44,32,101,110,100,70,114,97,109,101,93,44,32,95,68,111,116,76,111,116,116,105,101,46,95,119,97,115,109,77,111,100,117,108,101,41,10,32,32,32,32,32,32,125,41,41,59,10,32,32,32,32,125,10,32,32,32,32,115,101,116,77,111,100,101,40,109,111,100,101,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,61,61,61,32,110,117,108,108,32,124,124,32,95,68,111,116,76,111,116,116,105,101,46,95,119,97,115,109,77,111,100,117,108,101,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,115,101,116,67,111,110,102,105,103,40,95,95,115,112,114,101,97,100,80,114,111,112,115,40,95,95,115,112,114,101,97,100,86,97,108,117,101,115,40,123,125,44,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,99,111,110,102,105,103,40,41,41,44,32,123,10,32,32,32,32,32,32,32,32,109,111,100,101,58,32,99,114,101,97,116,101,67,111,114,101,77,111,100,101,40,109,111,100,101,44,32,95,68,111,116,76,111,116,116,105,101,46,95,119,97,115,109,77,111,100,117,108,101,41,10,32,32,32,32,32,32,125,41,41,59,10,32,32,32,32,125,10,32,32,32,32,115,101,116,82,101,110,100,101,114,67,111,110,102,105,103,40,99,111,110,102,105,103,41,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,95,97,32,61,32,99,111,110,102,105,103,44,32,123,32,100,101,118,105,99,101,80,105,120,101,108,82,97,116,105,111,44,32,102,114,101,101,122,101,79,110,79,102,102,115,99,114,101,101,110,32,125,32,61,32,95,97,44,32,114,101,115,116,67,111,110,102,105,103,32,61,32,95,95,111,98,106,82,101,115,116,40,95,97,44,32,91,34,100,101,118,105,99,101,80,105,120,101,108,82,97,116,105,111,34,44,32,34,102,114,101,101,122,101,79,110,79,102,102,115,99,114,101,101,110,34,93,41,59,10,32,32,32,32,32,32,116,104,105,115,46,95,114,101,110,100,101,114,67,111,110,102,105,103,32,61,32,95,95,115,112,114,101,97,100,80,114,111,112,115,40,95,95,115,112,114,101,97,100,86,97,108,117,101,115,40,95,95,115,112,114,101,97,100,86,97,108,117,101,115,40,123,125,44,32,116,104,105,115,46,95,114,101,110,100,101,114,67,111,110,102,105,103,41,44,32,114,101,115,116,67,111,110,102,105,103,41,44,32,123,10,32,32,32,32,32,32,32,32,47,47,32,100,101,118,105,99,101,80,105,120,101,108,82,97,116,105,111,32,105,115,32,97,32,115,112,101,99,105,97,108,32,99,97,115,101,44,32,105,116,32,115,104,111,117,108,100,32,98,101,32,115,101,116,32,116,111,32,116,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,105,102,32,105,116,39,115,32,110,111,116,32,112,114,111,118,105,100,101,100,10,32,32,32,32,32,32,32,32,100,101,118,105,99,101,80,105,120,101,108,82,97,116,105,111,58,32,100,101,118,105,99,101,80,105,120,101,108,82,97,116,105,111,32,124,124,32,103,101,116,68,101,102,97,117,108,116,68,80,82,40,41,44,10,32,32,32,32,32,32,32,32,102,114,101,101,122,101,79,110,79,102,102,115,99,114,101,101,110,58,32,102,114,101,101,122,101,79,110,79,102,102,115,99,114,101,101,110,32,33,61,32,110,117,108,108,32,63,32,102,114,101,101,122,101,79,110,79,102,102,115,99,114,101,101,110,32,58,32,116,114,117,101,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,105,102,32,40,73,83,95,66,82,79,87,83,69,82,32,38,38,32,116,104,105,115,46,95,99,97,110,118,97,115,32,105,110,115,116,97,110,99,101,111,102,32,72,84,77,76,67,97,110,118,97,115,69,108,101,109,101,110,116,41,32,123,10,32,32,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,114,101,110,100,101,114,67,111,110,102,105,103,46,97,117,116,111,82,101,115,105,122,101,41,32,123,10,32,32,32,32,32,32,32,32,32,32,67,97,110,118,97,115,82,101,115,105,122,101,79,98,115,101,114,118,101,114,46,111,98,115,101,114,118,101,40,116,104,105,115,46,95,99,97,110,118,97,115,44,32,116,104,105,115,41,59,10,32,32,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,32,32,67,97,110,118,97,115,82,101,115,105,122,101,79,98,115,101,114,118,101,114,46,117,110,111,98,115,101,114,118,101,40,116,104,105,115,46,95,99,97,110,118,97,115,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,114,101,110,100,101,114,67,111,110,102,105,103,46,102,114,101,101,122,101,79,110,79,102,102,115,99,114,101,101,110,41,32,123,10,32,32,32,32,32,32,32,32,32,32,79,102,102,115,99,114,101,101,110,79,98,115,101,114,118,101,114,46,111,98,115,101,114,118,101,40,116,104,105,115,46,95,99,97,110,118,97,115,44,32,116,104,105,115,41,59,10,32,32,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,32,32,79,102,102,115,99,114,101,101,110,79,98,115,101,114,118,101,114,46,117,110,111,98,115,101,114,118,101,40,116,104,105,115,46,95,99,97,110,118,97,115,41,59,10,32,32,32,32,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,105,115,70,114,111,122,101,110,41,32,123,10,32,32,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,117,110,102,114,101,101,122,101,40,41,59,10,32,32,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,32,32,108,111,97,100,65,110,105,109,97,116,105,111,110,40,97,110,105,109,97,116,105,111,110,73,100,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,61,61,61,32,110,117,108,108,32,124,124,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,97,99,116,105,118,101,65,110,105,109,97,116,105,111,110,73,100,40,41,32,61,61,61,32,97,110,105,109,97,116,105,111,110,73,100,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,99,111,110,115,116,32,108,111,97,100,101,100,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,108,111,97,100,65,110,105,109,97,116,105,111,110,40,97,110,105,109,97,116,105,111,110,73,100,44,32,116,104,105,115,46,95,99,97,110,118,97,115,46,119,105,100,116,104,44,32,116,104,105,115,46,95,99,97,110,118,97,115,46,104,101,105,103,104,116,41,59,10,32,32,32,32,32,32,105,102,32,40,108,111,97,100,101,100,41,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,77,97,110,97,103,101,114,46,100,105,115,112,97,116,99,104,40,123,32,116,121,112,101,58,32,34,108,111,97,100,34,32,125,41,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,114,101,115,105,122,101,40,41,59,10,32,32,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,101,118,101,110,116,77,97,110,97,103,101,114,46,100,105,115,112,97,116,99,104,40,123,10,32,32,32,32,32,32,32,32,32,32,116,121,112,101,58,32,34,108,111,97,100,69,114,114,111,114,34,44,10,32,32,32,32,32,32,32,32,32,32,101,114,114,111,114,58,32,110,101,119,32,69,114,114,111,114,40,96,70,97,105,108,101,100,32,116,111,32,97,110,105,109,97,116,105,111,110,32,58,36,123,97,110,105,109,97,116,105,111,110,73,100,125,96,41,10,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,32,32,115,101,116,77,97,114,107,101,114,40,109,97,114,107,101,114,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,115,101,116,67,111,110,102,105,103,40,95,95,115,112,114,101,97,100,80,114,111,112,115,40,95,95,115,112,114,101,97,100,86,97,108,117,101,115,40,123,125,44,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,99,111,110,102,105,103,40,41,41,44,32,123,10,32,32,32,32,32,32,32,32,109,97,114,107,101,114,10,32,32,32,32,32,32,125,41,41,59,10,32,32,32,32,125,10,32,32,32,32,109,97,114,107,101,114,115,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,59,10,32,32,32,32,32,32,99,111,110,115,116,32,109,97,114,107,101,114,115,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,109,97,114,107,101,114,115,40,41,59,10,32,32,32,32,32,32,105,102,32,40,109,97,114,107,101,114,115,41,32,123,10,32,32,32,32,32,32,32,32,99,111,110,115,116,32,114,101,115,117,108,116,32,61,32,91,93,59,10,32,32,32,32,32,32,32,32,102,111,114,32,40,108,101,116,32,105,32,61,32,48,59,32,105,32,60,32,109,97,114,107,101,114,115,46,115,105,122,101,40,41,59,32,105,32,43,61,32,49,41,32,123,10,32,32,32,32,32,32,32,32,32,32,99,111,110,115,116,32,109,97,114,107,101,114,32,61,32,109,97,114,107,101,114,115,46,103,101,116,40,105,41,59,10,32,32,32,32,32,32,32,32,32,32,114,101,115,117,108,116,46,112,117,115,104,40,123,10,32,32,32,32,32,32,32,32,32,32,32,32,110,97,109,101,58,32,109,97,114,107,101,114,46,110,97,109,101,44,10,32,32,32,32,32,32,32,32,32,32,32,32,116,105,109,101,58,32,109,97,114,107,101,114,46,116,105,109,101,44,10,32,32,32,32,32,32,32,32,32,32,32,32,100,117,114,97,116,105,111,110,58,32,109,97,114,107,101,114,46,100,117,114,97,116,105,111,110,10,32,32,32,32,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,114,101,115,117,108,116,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,91,93,59,10,32,32,32,32,125,10,32,32,32,32,115,101,116,84,104,101,109,101,40,116,104,101,109,101,73,100,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,32,102,97,108,115,101,59,10,32,32,32,32,32,32,99,111,110,115,116,32,108,111,97,100,101,100,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,115,101,116,84,104,101,109,101,40,116,104,101,109,101,73,100,41,59,10,32,32,32,32,32,32,116,104,105,115,46,95,114,101,110,100,101,114,40,41,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,108,111,97,100,101,100,59,10,32,32,32,32,125,10,32,32,32,32,114,101,115,101,116,84,104,101,109,101,40,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,32,102,97,108,115,101,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,114,101,115,101,116,84,104,101,109,101,40,41,59,10,32,32,32,32,125,10,32,32,32,32,115,101,116,84,104,101,109,101,68,97,116,97,40,116,104,101,109,101,68,97,116,97,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,32,102,97,108,115,101,59,10,32,32,32,32,32,32,99,111,110,115,116,32,108,111,97,100,101,100,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,115,101,116,84,104,101,109,101,68,97,116,97,40,116,104,101,109,101,68,97,116,97,41,59,10,32,32,32,32,32,32,116,104,105,115,46,95,114,101,110,100,101,114,40,41,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,108,111,97,100,101,100,59,10,32,32,32,32,125,10,32,32,32,32,115,101,116,83,108,111,116,115,40,115,108,111,116,115,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,115,101,116,83,108,111,116,115,40,115,108,111,116,115,41,59,10,32,32,32,32,125,10,32,32,32,32,115,101,116,76,97,121,111,117,116,40,108,97,121,111,117,116,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,61,61,61,32,110,117,108,108,32,124,124,32,95,68,111,116,76,111,116,116,105,101,46,95,119,97,115,109,77,111,100,117,108,101,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,115,101,116,67,111,110,102,105,103,40,95,95,115,112,114,101,97,100,80,114,111,112,115,40,95,95,115,112,114,101,97,100,86,97,108,117,101,115,40,123,125,44,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,99,111,110,102,105,103,40,41,41,44,32,123,10,32,32,32,32,32,32,32,32,108,97,121,111,117,116,58,32,123,10,32,32,32,32,32,32,32,32,32,32,97,108,105,103,110,58,32,99,114,101,97,116,101,67,111,114,101,65,108,105,103,110,40,108,97,121,111,117,116,46,97,108,105,103,110,44,32,95,68,111,116,76,111,116,116,105,101,46,95,119,97,115,109,77,111,100,117,108,101,41,44,10,32,32,32,32,32,32,32,32,32,32,102,105,116,58,32,99,114,101,97,116,101,67,111,114,101,70,105,116,40,108,97,121,111,117,116,46,102,105,116,44,32,95,68,111,116,76,111,116,116,105,101,46,95,119,97,115,109,77,111,100,117,108,101,41,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,41,41,59,10,32,32,32,32,125,10,32,32,32,32,115,101,116,86,105,101,119,112,111,114,116,40,120,44,32,121,44,32,119,105,100,116,104,44,32,104,101,105,103,104,116,41,32,123,10,32,32,32,32,32,32,105,102,32,40,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,61,61,61,32,110,117,108,108,41,32,114,101,116,117,114,110,32,102,97,108,115,101,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,115,101,116,86,105,101,119,112,111,114,116,40,120,44,32,121,44,32,119,105,100,116,104,44,32,104,101,105,103,104,116,41,59,10,32,32,32,32,125,10,32,32,32,32,115,116,97,116,105,99,32,115,101,116,87,97,115,109,85,114,108,40,117,114,108,41,32,123,10,32,32,32,32,32,32,68,111,116,76,111,116,116,105,101,87,97,115,109,76,111,97,100,101,114,46,115,101,116,87,97,115,109,85,114,108,40,117,114,108,41,59,10,32,32,32,32,125,10,32,32,32,32,108,111,97,100,83,116,97,116,101,77,97,99,104,105,110,101,40,115,116,97,116,101,77,97,99,104,105,110,101,73,100,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,98,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,108,111,97,100,83,116,97,116,101,77,97,99,104,105,110,101,40,115,116,97,116,101,77,97,99,104,105,110,101,73,100,41,41,32,33,61,32,110,117,108,108,32,63,32,95,98,32,58,32,102,97,108,115,101,59,10,32,32,32,32,125,10,32,32,32,32,115,116,97,114,116,83,116,97,116,101,77,97,99,104,105,110,101,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,59,10,32,32,32,32,32,32,99,111,110,115,116,32,115,116,97,114,116,101,100,32,61,32,40,95,98,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,115,116,97,114,116,83,116,97,116,101,77,97,99,104,105,110,101,40,41,41,32,33,61,32,110,117,108,108,32,63,32,95,98,32,58,32,102,97,108,115,101,59,10,32,32,32,32,32,32,105,102,32,40,115,116,97,114,116,101,100,41,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,115,101,116,117,112,83,116,97,116,101,77,97,99,104,105,110,101,76,105,115,116,101,110,101,114,115,40,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,115,116,97,114,116,101,100,59,10,32,32,32,32,125,10,32,32,32,32,115,116,111,112,83,116,97,116,101,77,97,99,104,105,110,101,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,59,10,32,32,32,32,32,32,99,111,110,115,116,32,115,116,111,112,112,101,100,32,61,32,40,95,98,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,115,116,111,112,83,116,97,116,101,77,97,99,104,105,110,101,40,41,41,32,33,61,32,110,117,108,108,32,63,32,95,98,32,58,32,102,97,108,115,101,59,10,32,32,32,32,32,32,105,102,32,40,115,116,111,112,112,101,100,41,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,99,108,101,97,110,117,112,83,116,97,116,101,77,97,99,104,105,110,101,76,105,115,116,101,110,101,114,115,40,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,115,116,111,112,112,101,100,59,10,32,32,32,32,125,10,32,32,32,32,95,103,101,116,80,111,105,110,116,101,114,80,111,115,105,116,105,111,110,40,101,118,101,110,116,41,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,114,101,99,116,32,61,32,116,104,105,115,46,95,99,97,110,118,97,115,46,103,101,116,66,111,117,110,100,105,110,103,67,108,105,101,110,116,82,101,99,116,40,41,59,10,32,32,32,32,32,32,99,111,110,115,116,32,115,99,97,108,101,88,32,61,32,116,104,105,115,46,95,99,97,110,118,97,115,46,119,105,100,116,104,32,47,32,114,101,99,116,46,119,105,100,116,104,59,10,32,32,32,32,32,32,99,111,110,115,116,32,115,99,97,108,101,89,32,61,32,116,104,105,115,46,95,99,97,110,118,97,115,46,104,101,105,103,104,116,32,47,32,114,101,99,116,46,104,101,105,103,104,116,59,10,32,32,32,32,32,32,99,111,110,115,116,32,100,101,118,105,99,101,80,105,120,101,108,82,97,116,105,111,32,61,32,116,104,105,115,46,95,114,101,110,100,101,114,67,111,110,102,105,103,46,100,101,118,105,99,101,80,105,120,101,108,82,97,116,105,111,32,124,124,32,119,105,110,100,111,119,46,100,101,118,105,99,101,80,105,120,101,108,82,97,116,105,111,32,124,124,32,49,59,10,32,32,32,32,32,32,99,111,110,115,116,32,120,32,61,32,40,101,118,101,110,116,46,99,108,105,101,110,116,88,32,45,32,114,101,99,116,46,108,101,102,116,41,32,42,32,115,99,97,108,101,88,32,47,32,100,101,118,105,99,101,80,105,120,101,108,82,97,116,105,111,59,10,32,32,32,32,32,32,99,111,110,115,116,32,121,32,61,32,40,101,118,101,110,116,46,99,108,105,101,110,116,89,32,45,32,114,101,99,116,46,116,111,112,41,32,42,32,115,99,97,108,101,89,32,47,32,100,101,118,105,99,101,80,105,120,101,108,82,97,116,105,111,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,123,10,32,32,32,32,32,32,32,32,120,44,10,32,32,32,32,32,32,32,32,121,10,32,32,32,32,32,32,125,59,10,32,32,32,32,125,10,32,32,32,32,95,111,110,80,111,105,110,116,101,114,85,112,40,101,118,101,110,116,41,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,123,32,120,44,32,121,32,125,32,61,32,116,104,105,115,46,95,103,101,116,80,111,105,110,116,101,114,80,111,115,105,116,105,111,110,40,101,118,101,110,116,41,59,10,32,32,32,32,32,32,116,104,105,115,46,112,111,115,116,80,111,105,110,116,101,114,85,112,69,118,101,110,116,40,120,44,32,121,41,59,10,32,32,32,32,125,10,32,32,32,32,95,111,110,80,111,105,110,116,101,114,68,111,119,110,40,101,118,101,110,116,41,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,123,32,120,44,32,121,32,125,32,61,32,116,104,105,115,46,95,103,101,116,80,111,105,110,116,101,114,80,111,115,105,116,105,111,110,40,101,118,101,110,116,41,59,10,32,32,32,32,32,32,116,104,105,115,46,112,111,115,116,80,111,105,110,116,101,114,68,111,119,110,69,118,101,110,116,40,120,44,32,121,41,59,10,32,32,32,32,125,10,32,32,32,32,95,111,110,80,111,105,110,116,101,114,77,111,118,101,40,101,118,101,110,116,41,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,123,32,120,44,32,121,32,125,32,61,32,116,104,105,115,46,95,103,101,116,80,111,105,110,116,101,114,80,111,115,105,116,105,111,110,40,101,118,101,110,116,41,59,10,32,32,32,32,32,32,116,104,105,115,46,112,111,115,116,80,111,105,110,116,101,114,77,111,118,101,69,118,101,110,116,40,120,44,32,121,41,59,10,32,32,32,32,125,10,32,32,32,32,95,111,110,80,111,105,110,116,101,114,69,110,116,101,114,40,101,118,101,110,116,41,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,123,32,120,44,32,121,32,125,32,61,32,116,104,105,115,46,95,103,101,116,80,111,105,110,116,101,114,80,111,115,105,116,105,111,110,40,101,118,101,110,116,41,59,10,32,32,32,32,32,32,116,104,105,115,46,112,111,115,116,80,111,105,110,116,101,114,69,110,116,101,114,69,118,101,110,116,40,120,44,32,121,41,59,10,32,32,32,32,125,10,32,32,32,32,95,111,110,80,111,105,110,116,101,114,76,101,97,118,101,40,101,118,101,110,116,41,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,123,32,120,44,32,121,32,125,32,61,32,116,104,105,115,46,95,103,101,116,80,111,105,110,116,101,114,80,111,115,105,116,105,111,110,40,101,118,101,110,116,41,59,10,32,32,32,32,32,32,116,104,105,115,46,112,111,115,116,80,111,105,110,116,101,114,69,120,105,116,69,118,101,110,116,40,120,44,32,121,41,59,10,32,32,32,32,125,10,32,32,32,32,112,111,115,116,80,111,105,110,116,101,114,85,112,69,118,101,110,116,40,120,44,32,121,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,112,111,115,116,80,111,105,110,116,101,114,85,112,69,118,101,110,116,40,120,44,32,121,41,59,10,32,32,32,32,125,10,32,32,32,32,112,111,115,116,80,111,105,110,116,101,114,68,111,119,110,69,118,101,110,116,40,120,44,32,121,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,112,111,115,116,80,111,105,110,116,101,114,68,111,119,110,69,118,101,110,116,40,120,44,32,121,41,59,10,32,32,32,32,125,10,32,32,32,32,112,111,115,116,80,111,105,110,116,101,114,77,111,118,101,69,118,101,110,116,40,120,44,32,121,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,112,111,115,116,80,111,105,110,116,101,114,77,111,118,101,69,118,101,110,116,40,120,44,32,121,41,59,10,32,32,32,32,125,10,32,32,32,32,112,111,115,116,80,111,105,110,116,101,114,69,110,116,101,114,69,118,101,110,116,40,120,44,32,121,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,112,111,115,116,80,111,105,110,116,101,114,69,110,116,101,114,69,118,101,110,116,40,120,44,32,121,41,59,10,32,32,32,32,125,10,32,32,32,32,112,111,115,116,80,111,105,110,116,101,114,69,120,105,116,69,118,101,110,116,40,120,44,32,121,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,112,111,115,116,80,111,105,110,116,101,114,69,120,105,116,69,118,101,110,116,40,120,44,32,121,41,59,10,32,32,32,32,125,10,32,32,32,32,103,101,116,83,116,97,116,101,77,97,99,104,105,110,101,76,105,115,116,101,110,101,114,115,40,41,32,123,10,32,32,32,32,32,32,105,102,32,40,33,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,114,101,116,117,114,110,32,91,93,59,10,32,32,32,32,32,32,99,111,110,115,116,32,108,105,115,116,101,110,101,114,115,86,101,99,116,111,114,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,46,115,116,97,116,101,77,97,99,104,105,110,101,70,114,97,109,101,119,111,114,107,83,101,116,117,112,40,41,59,10,32,32,32,32,32,32,99,111,110,115,116,32,108,105,115,116,101,110,101,114,115,32,61,32,91,93,59,10,32,32,32,32,32,32,102,111,114,32,40,108,101,116,32,105,32,61,32,48,59,32,105,32,60,32,108,105,115,116,101,110,101,114,115,86,101,99,116,111,114,46,115,105,122,101,40,41,59,32,105,32,43,61,32,49,41,32,123,10,32,32,32,32,32,32,32,32,108,105,115,116,101,110,101,114,115,46,112,117,115,104,40,108,105,115,116,101,110,101,114,115,86,101,99,116,111,114,46,103,101,116,40,105,41,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,108,105,115,116,101,110,101,114,115,59,10,32,32,32,32,125,10,32,32,32,32,95,115,101,116,117,112,83,116,97,116,101,77,97,99,104,105,110,101,76,105,115,116,101,110,101,114,115,40,41,32,123,10,32,32,32,32,32,32,105,102,32,40,73,83,95,66,82,79,87,83,69,82,32,38,38,32,116,104,105,115,46,95,99,97,110,118,97,115,32,105,110,115,116,97,110,99,101,111,102,32,72,84,77,76,67,97,110,118,97,115,69,108,101,109,101,110,116,32,38,38,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,32,33,61,61,32,110,117,108,108,32,38,38,32,116,104,105,115,46,105,115,76,111,97,100,101,100,41,32,123,10,32,32,32,32,32,32,32,32,99,111,110,115,116,32,108,105,115,116,101,110,101,114,115,32,61,32,116,104,105,115,46,103,101,116,83,116,97,116,101,77,97,99,104,105,110,101,76,105,115,116,101,110,101,114,115,40,41,59,10,32,32,32,32,32,32,32,32,105,102,32,40,108,105,115,116,101,110,101,114,115,46,105,110,99,108,117,100,101,115,40,34,80,111,105,110,116,101,114,85,112,34,41,41,32,123,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,95,99,97,110,118,97,115,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,40,34,112,111,105,110,116,101,114,117,112,34,44,32,116,104,105,115,46,95,112,111,105,110,116,101,114,85,112,77,101,116,104,111,100,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,105,102,32,40,108,105,115,116,101,110,101,114,115,46,105,110,99,108,117,100,101,115,40,34,80,111,105,110,116,101,114,68,111,119,110,34,41,41,32,123,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,95,99,97,110,118,97,115,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,40,34,112,111,105,110,116,101,114,100,111,119,110,34,44,32,116,104,105,115,46,95,112,111,105,110,116,101,114,68,111,119,110,77,101,116,104,111,100,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,105,102,32,40,108,105,115,116,101,110,101,114,115,46,105,110,99,108,117,100,101,115,40,34,80,111,105,110,116,101,114,77,111,118,101,34,41,41,32,123,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,95,99,97,110,118,97,115,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,40,34,112,111,105,110,116,101,114,109,111,118,101,34,44,32,116,104,105,115,46,95,112,111,105,110,116,101,114,77,111,118,101,77,101,116,104,111,100,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,105,102,32,40,108,105,115,116,101,110,101,114,115,46,105,110,99,108,117,100,101,115,40,34,80,111,105,110,116,101,114,69,110,116,101,114,34,41,41,32,123,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,95,99,97,110,118,97,115,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,40,34,112,111,105,110,116,101,114,101,110,116,101,114,34,44,32,116,104,105,115,46,95,112,111,105,110,116,101,114,69,110,116,101,114,77,101,116,104,111,100,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,32,32,105,102,32,40,108,105,115,116,101,110,101,114,115,46,105,110,99,108,117,100,101,115,40,34,80,111,105,110,116,101,114,69,120,105,116,34,41,41,32,123,10,32,32,32,32,32,32,32,32,32,32,116,104,105,115,46,95,99,97,110,118,97,115,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,40,34,112,111,105,110,116,101,114,108,101,97,118,101,34,44,32,116,104,105,115,46,95,112,111,105,110,116,101,114,69,120,105,116,77,101,116,104,111,100,41,59,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,32,32,95,99,108,101,97,110,117,112,83,116,97,116,101,77,97,99,104,105,110,101,76,105,115,116,101,110,101,114,115,40,41,32,123,10,32,32,32,32,32,32,105,102,32,40,73,83,95,66,82,79,87,83,69,82,32,38,38,32,116,104,105,115,46,95,99,97,110,118,97,115,32,105,110,115,116,97,110,99,101,111,102,32,72,84,77,76,67,97,110,118,97,115,69,108,101,109,101,110,116,41,32,123,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,99,97,110,118,97,115,46,114,101,109,111,118,101,69,118,101,110,116,76,105,115,116,101,110,101,114,40,34,112,111,105,110,116,101,114,117,112,34,44,32,116,104,105,115,46,95,112,111,105,110,116,101,114,85,112,77,101,116,104,111,100,41,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,99,97,110,118,97,115,46,114,101,109,111,118,101,69,118,101,110,116,76,105,115,116,101,110,101,114,40,34,112,111,105,110,116,101,114,100,111,119,110,34,44,32,116,104,105,115,46,95,112,111,105,110,116,101,114,68,111,119,110,77,101,116,104,111,100,41,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,99,97,110,118,97,115,46,114,101,109,111,118,101,69,118,101,110,116,76,105,115,116,101,110,101,114,40,34,112,111,105,110,116,101,114,109,111,118,101,34,44,32,116,104,105,115,46,95,112,111,105,110,116,101,114,77,111,118,101,77,101,116,104,111,100,41,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,99,97,110,118,97,115,46,114,101,109,111,118,101,69,118,101,110,116,76,105,115,116,101,110,101,114,40,34,112,111,105,110,116,101,114,101,110,116,101,114,34,44,32,116,104,105,115,46,95,112,111,105,110,116,101,114,69,110,116,101,114,77,101,116,104,111,100,41,59,10,32,32,32,32,32,32,32,32,116,104,105,115,46,95,99,97,110,118,97,115,46,114,101,109,111,118,101,69,118,101,110,116,76,105,115,116,101,110,101,114,40,34,112,111,105,110,116,101,114,108,101,97,118,101,34,44,32,116,104,105,115,46,95,112,111,105,110,116,101,114,69,120,105,116,77,101,116,104,111,100,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,125,10,32,32,32,32,108,111,97,100,83,116,97,116,101,77,97,99,104,105,110,101,68,97,116,97,40,115,116,97,116,101,77,97,99,104,105,110,101,68,97,116,97,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,98,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,108,111,97,100,83,116,97,116,101,77,97,99,104,105,110,101,68,97,116,97,40,115,116,97,116,101,77,97,99,104,105,110,101,68,97,116,97,41,41,32,33,61,32,110,117,108,108,32,63,32,95,98,32,58,32,102,97,108,115,101,59,10,32,32,32,32,125,10,32,32,32,32,97,110,105,109,97,116,105,111,110,83,105,122,101,40,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,44,32,95,99,44,32,95,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,119,105,100,116,104,32,61,32,40,95,98,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,97,110,105,109,97,116,105,111,110,83,105,122,101,40,41,46,103,101,116,40,48,41,41,32,33,61,32,110,117,108,108,32,63,32,95,98,32,58,32,48,59,10,32,32,32,32,32,32,99,111,110,115,116,32,104,101,105,103,104,116,32,61,32,40,95,100,32,61,32,40,95,99,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,99,46,97,110,105,109,97,116,105,111,110,83,105,122,101,40,41,46,103,101,116,40,49,41,41,32,33,61,32,110,117,108,108,32,63,32,95,100,32,58,32,48,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,123,10,32,32,32,32,32,32,32,32,119,105,100,116,104,44,10,32,32,32,32,32,32,32,32,104,101,105,103,104,116,10,32,32,32,32,32,32,125,59,10,32,32,32,32,125,10,32,32,32,32,115,101,116,83,116,97,116,101,77,97,99,104,105,110,101,66,111,111,108,101,97,110,67,111,110,116,101,120,116,40,110,97,109,101,44,32,118,97,108,117,101,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,98,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,115,101,116,83,116,97,116,101,77,97,99,104,105,110,101,66,111,111,108,101,97,110,67,111,110,116,101,120,116,40,110,97,109,101,44,32,118,97,108,117,101,41,41,32,33,61,32,110,117,108,108,32,63,32,95,98,32,58,32,102,97,108,115,101,59,10,32,32,32,32,125,10,32,32,32,32,115,101,116,83,116,97,116,101,77,97,99,104,105,110,101,78,117,109,101,114,105,99,67,111,110,116,101,120,116,40,110,97,109,101,44,32,118,97,108,117,101,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,98,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,115,101,116,83,116,97,116,101,77,97,99,104,105,110,101,78,117,109,101,114,105,99,67,111,110,116,101,120,116,40,110,97,109,101,44,32,118,97,108,117,101,41,41,32,33,61,32,110,117,108,108,32,63,32,95,98,32,58,32,102,97,108,115,101,59,10,32,32,32,32,125,10,32,32,32,32,115,101,116,83,116,97,116,101,77,97,99,104,105,110,101,83,116,114,105,110,103,67,111,110,116,101,120,116,40,110,97,109,101,44,32,118,97,108,117,101,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,98,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,115,101,116,83,116,97,116,101,77,97,99,104,105,110,101,83,116,114,105,110,103,67,111,110,116,101,120,116,40,110,97,109,101,44,32,118,97,108,117,101,41,41,32,33,61,32,110,117,108,108,32,63,32,95,98,32,58,32,102,97,108,115,101,59,10,32,32,32,32,125,10,32,32,32,32,47,42,42,10,32,32,32,32,32,42,32,71,101,116,32,116,104,101,32,98,111,117,110,100,115,32,111,102,32,97,32,108,97,121,101,114,32,98,121,32,105,116,115,32,110,97,109,101,10,32,32,32,32,32,42,32,64,112,97,114,97,109,32,108,97,121,101,114,78,97,109,101,32,45,32,84,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,108,97,121,101,114,10,32,32,32,32,32,42,32,64,114,101,116,117,114,110,115,32,84,104,101,32,98,111,117,110,100,115,32,111,102,32,116,104,101,32,108,97,121,101,114,10,32,32,32,32,32,42,10,32,32,32,32,32,42,32,64,101,120,97,109,112,108,101,10,32,32,32,32,32,42,32,96,96,96,116,121,112,101,115,99,114,105,112,116,10,32,32,32,32,32,42,32,47,47,32,68,114,97,119,32,97,32,114,101,99,116,97,110,103,108,101,32,97,114,111,117,110,100,32,116,104,101,32,108,97,121,101,114,32,39,76,97,121,101,114,32,49,39,10,32,32,32,32,32,42,32,100,111,116,76,111,116,116,105,101,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,40,39,114,101,110,100,101,114,39,44,32,40,41,32,61,62,32,123,10,32,32,32,32,32,42,32,32,32,99,111,110,115,116,32,98,111,117,110,100,105,110,103,66,111,120,32,61,32,100,111,116,76,111,116,116,105,101,46,103,101,116,76,97,121,101,114,66,111,117,110,100,105,110,103,66,111,120,40,39,76,97,121,101,114,32,49,39,41,59,10,32,32,32,32,32,42,10,32,32,32,32,32,42,32,32,32,105,102,32,40,98,111,117,110,100,105,110,103,66,111,120,41,32,123,10,32,32,32,32,32,42,32,32,32,32,32,99,111,110,115,116,32,123,32,120,44,32,121,44,32,119,105,100,116,104,44,32,104,101,105,103,104,116,32,125,32,61,32,98,111,117,110,100,105,110,103,66,111,120,59,10,32,32,32,32,32,42,32,32,32,32,32,99,111,110,116,101,120,116,46,115,116,114,111,107,101,82,101,99,116,40,120,44,32,121,44,32,119,105,100,116,104,44,32,104,101,105,103,104,116,41,59,10,32,32,32,32,32,42,32,32,32,125,10,32,32,32,32,32,42,32,125,41,59,10,32,32,32,32,32,42,32,96,96,96,10,32,32,32,32,32,42,47,10,32,32,32,32,103,101,116,76,97,121,101,114,66,111,117,110,100,105,110,103,66,111,120,40,108,97,121,101,114,78,97,109,101,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,59,10,32,32,32,32,32,32,99,111,110,115,116,32,98,111,117,110,100,115,32,61,32,40,95,97,32,61,32,116,104,105,115,46,95,100,111,116,76,111,116,116,105,101,67,111,114,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,103,101,116,76,97,121,101,114,66,111,117,110,100,115,40,108,97,121,101,114,78,97,109,101,41,59,10,32,32,32,32,32,32,105,102,32,40,33,98,111,117,110,100,115,41,32,114,101,116,117,114,110,32,118,111,105,100,32,48,59,10,32,32,32,32,32,32,105,102,32,40,98,111,117,110,100,115,46,115,105,122,101,40,41,32,33,61,61,32,52,41,32,114,101,116,117,114,110,32,118,111,105,100,32,48,59,10,32,32,32,32,32,32,99,111,110,115,116,32,120,32,61,32,98,111,117,110,100,115,46,103,101,116,40,48,41,59,10,32,32,32,32,32,32,99,111,110,115,116,32,121,32,61,32,98,111,117,110,100,115,46,103,101,116,40,49,41,59,10,32,32,32,32,32,32,99,111,110,115,116,32,119,105,100,116,104,32,61,32,98,111,117,110,100,115,46,103,101,116,40,50,41,59,10,32,32,32,32,32,32,99,111,110,115,116,32,104,101,105,103,104,116,32,61,32,98,111,117,110,100,115,46,103,101,116,40,51,41,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,123,10,32,32,32,32,32,32,32,32,120,44,10,32,32,32,32,32,32,32,32,121,44,10,32,32,32,32,32,32,32,32,119,105,100,116,104,44,10,32,32,32,32,32,32,32,32,104,101,105,103,104,116,10,32,32,32,32,32,32,125,59,10,32,32,32,32,125,10,32,32,32,32,115,116,97,116,105,99,32,116,114,97,110,115,102,111,114,109,84,104,101,109,101,84,111,76,111,116,116,105,101,83,108,111,116,115,40,116,104,101,109,101,44,32,115,108,111,116,115,41,32,123,10,32,32,32,32,32,32,118,97,114,32,95,97,44,32,95,98,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,40,95,98,32,61,32,40,95,97,32,61,32,95,68,111,116,76,111,116,116,105,101,46,95,119,97,115,109,77,111,100,117,108,101,41,32,61,61,32,110,117,108,108,32,63,32,118,111,105,100,32,48,32,58,32,95,97,46,116,114,97,110,115,102,111,114,109,84,104,101,109,101,84,111,76,111,116,116,105,101,83,108,111,116,115,40,116,104,101,109,101,44,32,115,108,111,116,115,41,41,32,33,61,32,110,117,108,108,32,63,32,95,98,32,58,32,34,34,59,10,32,32,32,32,125,10,32,32,125,59,10,32,32,95,95,112,117,98,108,105,99,70,105,101,108,100,40,95,68,111,116,76,111,116,116,105,101,44,32,34,95,119,97,115,109,77,111,100,117,108,101,34,44,32,110,117,108,108,41,59,10,32,32,118,97,114,32,68,111,116,76,111,116,116,105,101,32,61,32,95,68,111,116,76,111,116,116,105,101,59,10,10,32,32,47,47,32,115,114,99,47,119,111,114,107,101,114,47,100,111,116,108,111,116,116,105,101,46,119,111,114,107,101,114,46,116,115,10,32,32,118,97,114,32,105,110,115,116,97,110,99,101,115,77,97,112,32,61,32,47,42,32,64,95,95,80,85,82,69,95,95,32,42,47,32,110,101,119,32,77,97,112,40,41,59,10,32,32,118,97,114,32,101,118,101,110,116,72,97,110,100,108,101,114,77,97,112,32,61,32,123,10,32,32,32,32,114,101,97,100,121,58,32,40,105,110,115,116,97,110,99,101,73,100,41,32,61,62,32,40,101,118,101,110,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,114,101,115,112,111,110,115,101,32,61,32,123,10,32,32,32,32,32,32,32,32,105,100,58,32,34,34,44,10,32,32,32,32,32,32,32,32,109,101,116,104,111,100,58,32,34,111,110,82,101,97,100,121,34,44,10,32,32,32,32,32,32,32,32,114,101,115,117,108,116,58,32,123,10,32,32,32,32,32,32,32,32,32,32,105,110,115,116,97,110,99,101,73,100,44,10,32,32,32,32,32,32,32,32,32,32,101,118,101,110,116,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,115,101,108,102,46,112,111,115,116,77,101,115,115,97,103,101,40,114,101,115,112,111,110,115,101,41,59,10,32,32,32,32,125,44,10,32,32,32,32,99,111,109,112,108,101,116,101,58,32,40,105,110,115,116,97,110,99,101,73,100,41,32,61,62,32,40,101,118,101,110,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,114,101,115,112,111,110,115,101,32,61,32,123,10,32,32,32,32,32,32,32,32,105,100,58,32,34,34,44,10,32,32,32,32,32,32,32,32,109,101,116,104,111,100,58,32,34,111,110,67,111,109,112,108,101,116,101,34,44,10,32,32,32,32,32,32,32,32,114,101,115,117,108,116,58,32,123,10,32,32,32,32,32,32,32,32,32,32,105,110,115,116,97,110,99,101,73,100,44,10,32,32,32,32,32,32,32,32,32,32,101,118,101,110,116,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,115,101,108,102,46,112,111,115,116,77,101,115,115,97,103,101,40,114,101,115,112,111,110,115,101,41,59,10,32,32,32,32,125,44,10,32,32,32,32,108,111,97,100,58,32,40,105,110,115,116,97,110,99,101,73,100,41,32,61,62,32,40,101,118,101,110,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,108,111,97,100,69,118,101,110,116,32,61,32,101,118,101,110,116,59,10,32,32,32,32,32,32,99,111,110,115,116,32,114,101,115,112,111,110,115,101,32,61,32,123,10,32,32,32,32,32,32,32,32,105,100,58,32,34,34,44,10,32,32,32,32,32,32,32,32,109,101,116,104,111,100,58,32,34,111,110,76,111,97,100,34,44,10,32,32,32,32,32,32,32,32,114,101,115,117,108,116,58,32,123,10,32,32,32,32,32,32,32,32,32,32,105,110,115,116,97,110,99,101,73,100,44,10,32,32,32,32,32,32,32,32,32,32,101,118,101,110,116,58,32,108,111,97,100,69,118,101,110,116,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,115,101,108,102,46,112,111,115,116,77,101,115,115,97,103,101,40,114,101,115,112,111,110,115,101,41,59,10,32,32,32,32,125,44,10,32,32,32,32,108,111,97,100,69,114,114,111,114,58,32,40,105,110,115,116,97,110,99,101,73,100,41,32,61,62,32,40,101,118,101,110,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,108,111,97,100,69,114,114,111,114,69,118,101,110,116,32,61,32,101,118,101,110,116,59,10,32,32,32,32,32,32,99,111,110,115,116,32,114,101,115,112,111,110,115,101,32,61,32,123,10,32,32,32,32,32,32,32,32,105,100,58,32,34,34,44,10,32,32,32,32,32,32,32,32,109,101,116,104,111,100,58,32,34,111,110,76,111,97,100,69,114,114,111,114,34,44,10,32,32,32,32,32,32,32,32,114,101,115,117,108,116,58,32,123,10,32,32,32,32,32,32,32,32,32,32,105,110,115,116,97,110,99,101,73,100,44,10,32,32,32,32,32,32,32,32,32,32,101,118,101,110,116,58,32,108,111,97,100,69,114,114,111,114,69,118,101,110,116,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,115,101,108,102,46,112,111,115,116,77,101,115,115,97,103,101,40,114,101,115,112,111,110,115,101,41,59,10,32,32,32,32,125,44,10,32,32,32,32,108,111,111,112,58,32,40,105,110,115,116,97,110,99,101,73,100,41,32,61,62,32,40,101,118,101,110,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,108,111,111,112,69,118,101,110,116,32,61,32,101,118,101,110,116,59,10,32,32,32,32,32,32,99,111,110,115,116,32,114,101,115,112,111,110,115,101,32,61,32,123,10,32,32,32,32,32,32,32,32,105,100,58,32,34,34,44,10,32,32,32,32,32,32,32,32,109,101,116,104,111,100,58,32,34,111,110,76,111,111,112,34,44,10,32,32,32,32,32,32,32,32,114,101,115,117,108,116,58,32,123,10,32,32,32,32,32,32,32,32,32,32,105,110,115,116,97,110,99,101,73,100,44,10,32,32,32,32,32,32,32,32,32,32,101,118,101,110,116,58,32,108,111,111,112,69,118,101,110,116,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,115,101,108,102,46,112,111,115,116,77,101,115,115,97,103,101,40,114,101,115,112,111,110,115,101,41,59,10,32,32,32,32,125,44,10,32,32,32,32,112,108,97,121,58,32,40,105,110,115,116,97,110,99,101,73,100,41,32,61,62,32,40,101,118,101,110,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,112,108,97,121,69,118,101,110,116,32,61,32,101,118,101,110,116,59,10,32,32,32,32,32,32,99,111,110,115,116,32,114,101,115,112,111,110,115,101,32,61,32,123,10,32,32,32,32,32,32,32,32,105,100,58,32,34,34,44,10,32,32,32,32,32,32,32,32,109,101,116,104,111,100,58,32,34,111,110,80,108,97,121,34,44,10,32,32,32,32,32,32,32,32,114,101,115,117,108,116,58,32,123,10,32,32,32,32,32,32,32,32,32,32,105,110,115,116,97,110,99,101,73,100,44,10,32,32,32,32,32,32,32,32,32,32,101,118,101,110,116,58,32,112,108,97,121,69,118,101,110,116,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,115,101,108,102,46,112,111,115,116,77,101,115,115,97,103,101,40,114,101,115,112,111,110,115,101,41,59,10,32,32,32,32,125,44,10,32,32,32,32,112,97,117,115,101,58,32,40,105,110,115,116,97,110,99,101,73,100,41,32,61,62,32,40,101,118,101,110,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,112,97,117,115,101,69,118,101,110,116,32,61,32,101,118,101,110,116,59,10,32,32,32,32,32,32,99,111,110,115,116,32,114,101,115,112,111,110,115,101,32,61,32,123,10,32,32,32,32,32,32,32,32,105,100,58,32,34,34,44,10,32,32,32,32,32,32,32,32,109,101,116,104,111,100,58,32,34,111,110,80,97,117,115,101,34,44,10,32,32,32,32,32,32,32,32,114,101,115,117,108,116,58,32,123,10,32,32,32,32,32,32,32,32,32,32,105,110,115,116,97,110,99,101,73,100,44,10,32,32,32,32,32,32,32,32,32,32,101,118,101,110,116,58,32,112,97,117,115,101,69,118,101,110,116,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,115,101,108,102,46,112,111,115,116,77,101,115,115,97,103,101,40,114,101,115,112,111,110,115,101,41,59,10,32,32,32,32,125,44,10,32,32,32,32,115,116,111,112,58,32,40,105,110,115,116,97,110,99,101,73,100,41,32,61,62,32,40,101,118,101,110,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,115,116,111,112,69,118,101,110,116,32,61,32,101,118,101,110,116,59,10,32,32,32,32,32,32,99,111,110,115,116,32,114,101,115,112,111,110,115,101,32,61,32,123,10,32,32,32,32,32,32,32,32,105,100,58,32,34,34,44,10,32,32,32,32,32,32,32,32,109,101,116,104,111,100,58,32,34,111,110,83,116,111,112,34,44,10,32,32,32,32,32,32,32,32,114,101,115,117,108,116,58,32,123,10,32,32,32,32,32,32,32,32,32,32,105,110,115,116,97,110,99,101,73,100,44,10,32,32,32,32,32,32,32,32,32,32,101,118,101,110,116,58,32,115,116,111,112,69,118,101,110,116,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,115,101,108,102,46,112,111,115,116,77,101,115,115,97,103,101,40,114,101,115,112,111,110,115,101,41,59,10,32,32,32,32,125,44,10,32,32,32,32,102,114,97,109,101,58,32,40,105,110,115,116,97,110,99,101,73,100,41,32,61,62,32,40,101,118,101,110,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,102,114,97,109,101,69,118,101,110,116,32,61,32,101,118,101,110,116,59,10,32,32,32,32,32,32,99,111,110,115,116,32,114,101,115,112,111,110,115,101,32,61,32,123,10,32,32,32,32,32,32,32,32,105,100,58,32,34,34,44,10,32,32,32,32,32,32,32,32,109,101,116,104,111,100,58,32,34,111,110,70,114,97,109,101,34,44,10,32,32,32,32,32,32,32,32,114,101,115,117,108,116,58,32,123,10,32,32,32,32,32,32,32,32,32,32,105,110,115,116,97,110,99,101,73,100,44,10,32,32,32,32,32,32,32,32,32,32,101,118,101,110,116,58,32,102,114,97,109,101,69,118,101,110,116,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,115,101,108,102,46,112,111,115,116,77,101,115,115,97,103,101,40,114,101,115,112,111,110,115,101,41,59,10,32,32,32,32,125,44,10,32,32,32,32,114,101,110,100,101,114,58,32,40,105,110,115,116,97,110,99,101,73,100,41,32,61,62,32,40,101,118,101,110,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,114,101,110,100,101,114,69,118,101,110,116,32,61,32,101,118,101,110,116,59,10,32,32,32,32,32,32,99,111,110,115,116,32,114,101,115,112,111,110,115,101,32,61,32,123,10,32,32,32,32,32,32,32,32,105,100,58,32,34,34,44,10,32,32,32,32,32,32,32,32,109,101,116,104,111,100,58,32,34,111,110,82,101,110,100,101,114,34,44,10,32,32,32,32,32,32,32,32,114,101,115,117,108,116,58,32,123,10,32,32,32,32,32,32,32,32,32,32,105,110,115,116,97,110,99,101,73,100,44,10,32,32,32,32,32,32,32,32,32,32,101,118,101,110,116,58,32,114,101,110,100,101,114,69,118,101,110,116,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,115,101,108,102,46,112,111,115,116,77,101,115,115,97,103,101,40,114,101,115,112,111,110,115,101,41,59,10,32,32,32,32,125,44,10,32,32,32,32,102,114,101,101,122,101,58,32,40,105,110,115,116,97,110,99,101,73,100,41,32,61,62,32,40,101,118,101,110,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,102,114,101,101,122,101,69,118,101,110,116,32,61,32,101,118,101,110,116,59,10,32,32,32,32,32,32,99,111,110,115,116,32,114,101,115,112,111,110,115,101,32,61,32,123,10,32,32,32,32,32,32,32,32,105,100,58,32,34,34,44,10,32,32,32,32,32,32,32,32,109,101,116,104,111,100,58,32,34,111,110,70,114,101,101,122,101,34,44,10,32,32,32,32,32,32,32,32,114,101,115,117,108,116,58,32,123,10,32,32,32,32,32,32,32,32,32,32,105,110,115,116,97,110,99,101,73,100,44,10,32,32,32,32,32,32,32,32,32,32,101,118,101,110,116,58,32,102,114,101,101,122,101,69,118,101,110,116,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,115,101,108,102,46,112,111,115,116,77,101,115,115,97,103,101,40,114,101,115,112,111,110,115,101,41,59,10,32,32,32,32,125,44,10,32,32,32,32,117,110,102,114,101,101,122,101,58,32,40,105,110,115,116,97,110,99,101,73,100,41,32,61,62,32,40,101,118,101,110,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,117,110,102,114,101,101,122,101,69,118,101,110,116,32,61,32,101,118,101,110,116,59,10,32,32,32,32,32,32,99,111,110,115,116,32,114,101,115,112,111,110,115,101,32,61,32,123,10,32,32,32,32,32,32,32,32,105,100,58,32,34,34,44,10,32,32,32,32,32,32,32,32,109,101,116,104,111,100,58,32,34,111,110,85,110,102,114,101,101,122,101,34,44,10,32,32,32,32,32,32,32,32,114,101,115,117,108,116,58,32,123,10,32,32,32,32,32,32,32,32,32,32,105,110,115,116,97,110,99,101,73,100,44,10,32,32,32,32,32,32,32,32,32,32,101,118,101,110,116,58,32,117,110,102,114,101,101,122,101,69,118,101,110,116,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,115,101,108,102,46,112,111,115,116,77,101,115,115,97,103,101,40,114,101,115,112,111,110,115,101,41,59,10,32,32,32,32,125,44,10,32,32,32,32,100,101,115,116,114,111,121,58,32,40,105,110,115,116,97,110,99,101,73,100,41,32,61,62,32,40,101,118,101,110,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,100,101,115,116,114,111,121,69,118,101,110,116,32,61,32,101,118,101,110,116,59,10,32,32,32,32,32,32,99,111,110,115,116,32,114,101,115,112,111,110,115,101,32,61,32,123,10,32,32,32,32,32,32,32,32,105,100,58,32,34,34,44,10,32,32,32,32,32,32,32,32,109,101,116,104,111,100,58,32,34,111,110,68,101,115,116,114,111,121,34,44,10,32,32,32,32,32,32,32,32,114,101,115,117,108,116,58,32,123,10,32,32,32,32,32,32,32,32,32,32,105,110,115,116,97,110,99,101,73,100,44,10,32,32,32,32,32,32,32,32,32,32,101,118,101,110,116,58,32,100,101,115,116,114,111,121,69,118,101,110,116,10,32,32,32,32,32,32,32,32,125,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,115,101,108,102,46,112,111,115,116,77,101,115,115,97,103,101,40,114,101,115,112,111,110,115,101,41,59,10,32,32,32,32,125,10,32,32,125,59,10,32,32,118,97,114,32,99,111,109,109,97,110,100,115,32,61,32,123,10,32,32,32,32,103,101,116,68,111,116,76,111,116,116,105,101,73,110,115,116,97,110,99,101,83,116,97,116,101,40,114,101,113,117,101,115,116,41,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,99,111,110,115,116,32,115,116,97,116,101,32,61,32,123,10,32,32,32,32,32,32,32,32,105,115,76,111,97,100,101,100,58,32,105,110,115,116,97,110,99,101,46,105,115,76,111,97,100,101,100,44,10,32,32,32,32,32,32,32,32,105,115,80,97,117,115,101,100,58,32,105,110,115,116,97,110,99,101,46,105,115,80,97,117,115,101,100,44,10,32,32,32,32,32,32,32,32,105,115,80,108,97,121,105,110,103,58,32,105,110,115,116,97,110,99,101,46,105,115,80,108,97,121,105,110,103,44,10,32,32,32,32,32,32,32,32,105,115,83,116,111,112,112,101,100,58,32,105,110,115,116,97,110,99,101,46,105,115,83,116,111,112,112,101,100,44,10,32,32,32,32,32,32,32,32,105,115,70,114,111,122,101,110,58,32,105,110,115,116,97,110,99,101,46,105,115,70,114,111,122,101,110,44,10,32,32,32,32,32,32,32,32,108,111,111,112,58,32,105,110,115,116,97,110,99,101,46,108,111,111,112,44,10,32,32,32,32,32,32,32,32,109,111,100,101,58,32,105,110,115,116,97,110,99,101,46,109,111,100,101,44,10,32,32,32,32,32,32,32,32,115,112,101,101,100,58,32,105,110,115,116,97,110,99,101,46,115,112,101,101,100,44,10,32,32,32,32,32,32,32,32,99,117,114,114,101,110,116,70,114,97,109,101,58,32,105,110,115,116,97,110,99,101,46,99,117,114,114,101,110,116,70,114,97,109,101,44,10,32,32,32,32,32,32,32,32,116,111,116,97,108,70,114,97,109,101,115,58,32,105,110,115,116,97,110,99,101,46,116,111,116,97,108,70,114,97,109,101,115,44,10,32,32,32,32,32,32,32,32,100,117,114,97,116,105,111,110,58,32,105,110,115,116,97,110,99,101,46,100,117,114,97,116,105,111,110,44,10,32,32,32,32,32,32,32,32,117,115,101,70,114,97,109,101,73,110,116,101,114,112,111,108,97,116,105,111,110,58,32,105,110,115,116,97,110,99,101,46,117,115,101,70,114,97,109,101,73,110,116,101,114,112,111,108,97,116,105,111,110,44,10,32,32,32,32,32,32,32,32,114,101,110,100,101,114,67,111,110,102,105,103,58,32,105,110,115,116,97,110,99,101,46,114,101,110,100,101,114,67,111,110,102,105,103,44,10,32,32,32,32,32,32,32,32,109,97,114,107,101,114,58,32,105,110,115,116,97,110,99,101,46,109,97,114,107,101,114,44,10,32,32,32,32,32,32,32,32,98,97,99,107,103,114,111,117,110,100,67,111,108,111,114,58,32,105,110,115,116,97,110,99,101,46,98,97,99,107,103,114,111,117,110,100,67,111,108,111,114,44,10,32,32,32,32,32,32,32,32,109,97,114,107,101,114,115,58,32,105,110,115,116,97,110,99,101,46,109,97,114,107,101,114,115,40,41,44,10,32,32,32,32,32,32,32,32,97,99,116,105,118,101,65,110,105,109,97,116,105,111,110,73,100,58,32,105,110,115,116,97,110,99,101,46,97,99,116,105,118,101,65,110,105,109,97,116,105,111,110,73,100,44,10,32,32,32,32,32,32,32,32,97,99,116,105,118,101,84,104,101,109,101,73,100,58,32,105,110,115,116,97,110,99,101,46,97,99,116,105,118,101,84,104,101,109,101,73,100,44,10,32,32,32,32,32,32,32,32,97,117,116,111,112,108,97,121,58,32,105,110,115,116,97,110,99,101,46,97,117,116,111,112,108,97,121,44,10,32,32,32,32,32,32,32,32,115,101,103,109,101,110,116,58,32,105,110,115,116,97,110,99,101,46,115,101,103,109,101,110,116,44,10,32,32,32,32,32,32,32,32,108,97,121,111,117,116,58,32,105,110,115,116,97,110,99,101,46,108,97,121,111,117,116,44,10,32,32,32,32,32,32,32,32,115,101,103,109,101,110,116,68,117,114,97,116,105,111,110,58,32,105,110,115,116,97,110,99,101,46,115,101,103,109,101,110,116,68,117,114,97,116,105,111,110,44,10,32,32,32,32,32,32,32,32,105,115,82,101,97,100,121,58,32,105,110,115,116,97,110,99,101,46,105,115,82,101,97,100,121,44,10,32,32,32,32,32,32,32,32,109,97,110,105,102,101,115,116,58,32,105,110,115,116,97,110,99,101,46,109,97,110,105,102,101,115,116,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,123,10,32,32,32,32,32,32,32,32,115,116,97,116,101,10,32,32,32,32,32,32,125,59,10,32,32,32,32,125,44,10,32,32,32,32,115,101,116,76,97,121,111,117,116,40,114,101,113,117,101,115,116,41,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,108,97,121,111,117,116,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,108,97,121,111,117,116,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,105,110,115,116,97,110,99,101,46,115,101,116,76,97,121,111,117,116,40,108,97,121,111,117,116,41,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,123,10,32,32,32,32,32,32,32,32,115,117,99,99,101,115,115,58,32,116,114,117,101,10,32,32,32,32,32,32,125,59,10,32,32,32,32,125,44,10,32,32,32,32,103,101,116,83,116,97,116,101,77,97,99,104,105,110,101,76,105,115,116,101,110,101,114,115,40,114,101,113,117,101,115,116,41,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,105,110,115,116,97,110,99,101,46,103,101,116,83,116,97,116,101,77,97,99,104,105,110,101,76,105,115,116,101,110,101,114,115,40,41,59,10,32,32,32,32,125,44,10,32,32,32,32,112,111,115,116,80,111,105,110,116,101,114,68,111,119,110,69,118,101,110,116,40,114,101,113,117,101,115,116,41,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,120,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,120,59,10,32,32,32,32,32,32,99,111,110,115,116,32,121,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,121,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,105,110,115,116,97,110,99,101,46,112,111,115,116,80,111,105,110,116,101,114,68,111,119,110,69,118,101,110,116,40,120,44,32,121,41,59,10,32,32,32,32,125,44,10,32,32,32,32,112,111,115,116,80,111,105,110,116,101,114,69,110,116,101,114,69,118,101,110,116,40,114,101,113,117,101,115,116,41,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,120,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,120,59,10,32,32,32,32,32,32,99,111,110,115,116,32,121,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,121,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,105,110,115,116,97,110,99,101,46,112,111,115,116,80,111,105,110,116,101,114,69,110,116,101,114,69,118,101,110,116,40,120,44,32,121,41,59,10,32,32,32,32,125,44,10,32,32,32,32,112,111,115,116,80,111,105,110,116,101,114,69,120,105,116,69,118,101,110,116,40,114,101,113,117,101,115,116,41,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,120,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,120,59,10,32,32,32,32,32,32,99,111,110,115,116,32,121,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,121,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,105,110,115,116,97,110,99,101,46,112,111,115,116,80,111,105,110,116,101,114,69,120,105,116,69,118,101,110,116,40,120,44,32,121,41,59,10,32,32,32,32,125,44,10,32,32,32,32,112,111,115,116,80,111,105,110,116,101,114,77,111,118,101,69,118,101,110,116,40,114,101,113,117,101,115,116,41,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,120,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,120,59,10,32,32,32,32,32,32,99,111,110,115,116,32,121,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,121,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,105,110,115,116,97,110,99,101,46,112,111,115,116,80,111,105,110,116,101,114,77,111,118,101,69,118,101,110,116,40,120,44,32,121,41,59,10,32,32,32,32,125,44,10,32,32,32,32,112,111,115,116,80,111,105,110,116,101,114,85,112,69,118,101,110,116,40,114,101,113,117,101,115,116,41,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,120,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,120,59,10,32,32,32,32,32,32,99,111,110,115,116,32,121,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,121,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,105,110,115,116,97,110,99,101,46,112,111,115,116,80,111,105,110,116,101,114,85,112,69,118,101,110,116,40,120,44,32,121,41,59,10,32,32,32,32,125,44,10,32,32,32,32,115,116,97,114,116,83,116,97,116,101,77,97,99,104,105,110,101,40,114,101,113,117,101,115,116,41,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,105,110,115,116,97,110,99,101,46,115,116,97,114,116,83,116,97,116,101,77,97,99,104,105,110,101,40,41,59,10,32,32,32,32,125,44,10,32,32,32,32,115,116,111,112,83,116,97,116,101,77,97,99,104,105,110,101,40,114,101,113,117,101,115,116,41,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,105,110,115,116,97,110,99,101,46,115,116,111,112,83,116,97,116,101,77,97,99,104,105,110,101,40,41,59,10,32,32,32,32,125,44,10,32,32,32,32,108,111,97,100,83,116,97,116,101,77,97,99,104,105,110,101,40,114,101,113,117,101,115,116,41,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,115,116,97,116,101,77,97,99,104,105,110,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,115,116,97,116,101,77,97,99,104,105,110,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,105,110,115,116,97,110,99,101,46,108,111,97,100,83,116,97,116,101,77,97,99,104,105,110,101,40,115,116,97,116,101,77,97,99,104,105,110,101,73,100,41,59,10,32,32,32,32,125,44,10,32,32,32,32,108,111,97,100,83,116,97,116,101,77,97,99,104,105,110,101,68,97,116,97,40,114,101,113,117,101,115,116,41,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,115,116,97,116,101,77,97,99,104,105,110,101,68,97,116,97,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,115,116,97,116,101,77,97,99,104,105,110,101,68,97,116,97,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,105,110,115,116,97,110,99,101,46,108,111,97,100,83,116,97,116,101,77,97,99,104,105,110,101,68,97,116,97,40,115,116,97,116,101,77,97,99,104,105,110,101,68,97,116,97,41,59,10,32,32,32,32,125,44,10,32,32,32,32,99,114,101,97,116,101,58,32,40,114,101,113,117,101,115,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,99,111,110,102,105,103,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,99,111,110,102,105,103,59,10,32,32,32,32,32,32,99,111,110,115,116,32,119,105,100,116,104,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,119,105,100,116,104,59,10,32,32,32,32,32,32,99,111,110,115,116,32,104,101,105,103,104,116,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,104,101,105,103,104,116,59,10,32,32,32,32,32,32,105,102,32,40,105,110,115,116,97,110,99,101,115,77,97,112,46,104,97,115,40,105,110,115,116,97,110,99,101,73,100,41,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,97,108,114,101,97,100,121,32,101,120,105,115,116,115,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,110,101,119,32,68,111,116,76,111,116,116,105,101,40,99,111,110,102,105,103,41,59,10,32,32,32,32,32,32,105,110,115,116,97,110,99,101,46,99,97,110,118,97,115,46,104,101,105,103,104,116,32,61,32,104,101,105,103,104,116,59,10,32,32,32,32,32,32,105,110,115,116,97,110,99,101,46,99,97,110,118,97,115,46,119,105,100,116,104,32,61,32,119,105,100,116,104,59,10,32,32,32,32,32,32,105,110,115,116,97,110,99,101,115,77,97,112,46,115,101,116,40,105,110,115,116,97,110,99,101,73,100,44,32,105,110,115,116,97,110,99,101,41,59,10,32,32,32,32,32,32,99,111,110,115,116,32,101,118,101,110,116,115,32,61,32,91,10,32,32,32,32,32,32,32,32,34,99,111,109,112,108,101,116,101,34,44,10,32,32,32,32,32,32,32,32,34,102,114,97,109,101,34,44,10,32,32,32,32,32,32,32,32,34,108,111,97,100,34,44,10,32,32,32,32,32,32,32,32,34,108,111,97,100,69,114,114,111,114,34,44,10,32,32,32,32,32,32,32,32,34,108,111,111,112,34,44,10,32,32,32,32,32,32,32,32,34,112,97,117,115,101,34,44,10,32,32,32,32,32,32,32,32,34,112,108,97,121,34,44,10,32,32,32,32,32,32,32,32,34,115,116,111,112,34,44,10,32,32,32,32,32,32,32,32,34,100,101,115,116,114,111,121,34,44,10,32,32,32,32,32,32,32,32,34,102,114,101,101,122,101,34,44,10,32,32,32,32,32,32,32,32,34,117,110,102,114,101,101,122,101,34,44,10,32,32,32,32,32,32,32,32,34,114,101,110,100,101,114,34,44,10,32,32,32,32,32,32,32,32,34,114,101,97,100,121,34,10,32,32,32,32,32,32,93,59,10,32,32,32,32,32,32,101,118,101,110,116,115,46,102,111,114,69,97,99,104,40,40,101,118,101,110,116,41,32,61,62,32,123,10,32,32,32,32,32,32,32,32,105,110,115,116,97,110,99,101,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,40,101,118,101,110,116,44,32,101,118,101,110,116,72,97,110,100,108,101,114,77,97,112,91,101,118,101,110,116,93,40,105,110,115,116,97,110,99,101,73,100,41,41,59,10,32,32,32,32,32,32,125,41,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,123,10,32,32,32,32,32,32,32,32,105,110,115,116,97,110,99,101,73,100,10,32,32,32,32,32,32,125,59,10,32,32,32,32,125,44,10,32,32,32,32,100,101,115,116,114,111,121,58,32,40,114,101,113,117,101,115,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,114,101,116,117,114,110,59,10,32,32,32,32,32,32,105,110,115,116,97,110,99,101,46,100,101,115,116,114,111,121,40,41,59,10,32,32,32,32,32,32,105,110,115,116,97,110,99,101,115,77,97,112,46,100,101,108,101,116,101,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,125,44,10,32,32,32,32,102,114,101,101,122,101,58,32,40,114,101,113,117,101,115,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,105,110,115,116,97,110,99,101,46,102,114,101,101,122,101,40,41,59,10,32,32,32,32,125,44,10,32,32,32,32,108,111,97,100,58,32,40,114,101,113,117,101,115,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,99,111,110,102,105,103,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,99,111,110,102,105,103,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,105,110,115,116,97,110,99,101,46,108,111,97,100,40,99,111,110,102,105,103,41,59,10,32,32,32,32,125,44,10,32,32,32,32,108,111,97,100,65,110,105,109,97,116,105,111,110,58,32,40,114,101,113,117,101,115,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,97,110,105,109,97,116,105,111,110,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,97,110,105,109,97,116,105,111,110,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,105,110,115,116,97,110,99,101,46,108,111,97,100,65,110,105,109,97,116,105,111,110,40,97,110,105,109,97,116,105,111,110,73,100,41,59,10,32,32,32,32,125,44,10,32,32,32,32,115,101,116,84,104,101,109,101,58,32,40,114,101,113,117,101,115,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,116,104,101,109,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,116,104,101,109,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,105,110,115,116,97,110,99,101,46,115,101,116,84,104,101,109,101,40,116,104,101,109,101,73,100,41,59,10,32,32,32,32,125,44,10,32,32,32,32,115,101,116,84,104,101,109,101,68,97,116,97,58,32,40,114,101,113,117,101,115,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,116,104,101,109,101,68,97,116,97,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,116,104,101,109,101,68,97,116,97,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,105,110,115,116,97,110,99,101,46,115,101,116,84,104,101,109,101,68,97,116,97,40,116,104,101,109,101,68,97,116,97,41,59,10,32,32,32,32,125,44,10,32,32,32,32,112,97,117,115,101,58,32,40,114,101,113,117,101,115,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,105,110,115,116,97,110,99,101,46,112,97,117,115,101,40,41,59,10,32,32,32,32,125,44,10,32,32,32,32,112,108,97,121,58,32,40,114,101,113,117,101,115,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,105,110,115,116,97,110,99,101,46,112,108,97,121,40,41,59,10,32,32,32,32,125,44,10,32,32,32,32,114,101,115,105,122,101,58,32,40,114,101,113,117,101,115,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,119,105,100,116,104,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,119,105,100,116,104,59,10,32,32,32,32,32,32,99,111,110,115,116,32,104,101,105,103,104,116,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,104,101,105,103,104,116,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,105,110,115,116,97,110,99,101,46,99,97,110,118,97,115,46,104,101,105,103,104,116,32,61,32,104,101,105,103,104,116,59,10,32,32,32,32,32,32,105,110,115,116,97,110,99,101,46,99,97,110,118,97,115,46,119,105,100,116,104,32,61,32,119,105,100,116,104,59,10,32,32,32,32,32,32,105,110,115,116,97,110,99,101,46,114,101,115,105,122,101,40,41,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,123,10,32,32,32,32,32,32,32,32,115,117,99,99,101,115,115,58,32,116,114,117,101,10,32,32,32,32,32,32,125,59,10,32,32,32,32,125,44,10,32,32,32,32,115,101,116,66,97,99,107,103,114,111,117,110,100,67,111,108,111,114,58,32,40,114,101,113,117,101,115,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,98,97,99,107,103,114,111,117,110,100,67,111,108,111,114,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,98,97,99,107,103,114,111,117,110,100,67,111,108,111,114,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,105,110,115,116,97,110,99,101,46,115,101,116,66,97,99,107,103,114,111,117,110,100,67,111,108,111,114,40,98,97,99,107,103,114,111,117,110,100,67,111,108,111,114,41,59,10,32,32,32,32,125,44,10,32,32,32,32,115,101,116,70,114,97,109,101,58,32,40,114,101,113,117,101,115,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,102,114,97,109,101,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,102,114,97,109,101,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,105,110,115,116,97,110,99,101,46,115,101,116,70,114,97,109,101,40,102,114,97,109,101,41,59,10,32,32,32,32,125,44,10,32,32,32,32,115,101,116,77,111,100,101,58,32,40,114,101,113,117,101,115,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,109,111,100,101,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,109,111,100,101,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,105,110,115,116,97,110,99,101,46,115,101,116,77,111,100,101,40,109,111,100,101,41,59,10,32,32,32,32,125,44,10,32,32,32,32,115,101,116,82,101,110,100,101,114,67,111,110,102,105,103,58,32,40,114,101,113,117,101,115,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,114,101,110,100,101,114,67,111,110,102,105,103,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,114,101,110,100,101,114,67,111,110,102,105,103,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,105,110,115,116,97,110,99,101,46,115,101,116,82,101,110,100,101,114,67,111,110,102,105,103,40,114,101,110,100,101,114,67,111,110,102,105,103,41,59,10,32,32,32,32,125,44,10,32,32,32,32,115,101,116,83,101,103,109,101,110,116,58,32,40,114,101,113,117,101,115,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,115,101,103,109,101,110,116,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,115,101,103,109,101,110,116,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,105,110,115,116,97,110,99,101,46,115,101,116,83,101,103,109,101,110,116,40,115,101,103,109,101,110,116,91,48,93,44,32,115,101,103,109,101,110,116,91,49,93,41,59,10,32,32,32,32,125,44,10,32,32,32,32,115,101,116,83,112,101,101,100,58,32,40,114,101,113,117,101,115,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,115,112,101,101,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,115,112,101,101,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,105,110,115,116,97,110,99,101,46,115,101,116,83,112,101,101,100,40,115,112,101,101,100,41,59,10,32,32,32,32,125,44,10,32,32,32,32,115,101,116,85,115,101,70,114,97,109,101,73,110,116,101,114,112,111,108,97,116,105,111,110,58,32,40,114,101,113,117,101,115,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,117,115,101,70,114,97,109,101,73,110,116,101,114,112,111,108,97,116,105,111,110,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,117,115,101,70,114,97,109,101,73,110,116,101,114,112,111,108,97,116,105,111,110,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,105,110,115,116,97,110,99,101,46,115,101,116,85,115,101,70,114,97,109,101,73,110,116,101,114,112,111,108,97,116,105,111,110,40,117,115,101,70,114,97,109,101,73,110,116,101,114,112,111,108,97,116,105,111,110,41,59,10,32,32,32,32,125,44,10,32,32,32,32,115,101,116,87,97,115,109,85,114,108,58,32,40,114,101,113,117,101,115,116,41,32,61,62,32,123,10,32,32,32,32,32,32,68,111,116,76,111,116,116,105,101,46,115,101,116,87,97,115,109,85,114,108,40,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,117,114,108,41,59,10,32,32,32,32,125,44,10,32,32,32,32,115,116,111,112,58,32,40,114,101,113,117,101,115,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,105,110,115,116,97,110,99,101,46,115,116,111,112,40,41,59,10,32,32,32,32,125,44,10,32,32,32,32,117,110,102,114,101,101,122,101,58,32,40,114,101,113,117,101,115,116,41,32,61,62,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,105,110,115,116,97,110,99,101,46,117,110,102,114,101,101,122,101,40,41,59,10,32,32,32,32,125,44,10,32,32,32,32,115,101,116,86,105,101,119,112,111,114,116,40,114,101,113,117,101,115,116,41,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,120,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,120,59,10,32,32,32,32,32,32,99,111,110,115,116,32,121,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,121,59,10,32,32,32,32,32,32,99,111,110,115,116,32,119,105,100,116,104,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,119,105,100,116,104,59,10,32,32,32,32,32,32,99,111,110,115,116,32,104,101,105,103,104,116,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,104,101,105,103,104,116,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,114,101,116,117,114,110,32,105,110,115,116,97,110,99,101,46,115,101,116,86,105,101,119,112,111,114,116,40,120,44,32,121,44,32,119,105,100,116,104,44,32,104,101,105,103,104,116,41,59,10,32,32,32,32,125,44,10,32,32,32,32,115,101,116,77,97,114,107,101,114,40,114,101,113,117,101,115,116,41,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,109,97,114,107,101,114,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,109,97,114,107,101,114,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,105,110,115,116,97,110,99,101,46,115,101,116,77,97,114,107,101,114,40,109,97,114,107,101,114,41,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,123,10,32,32,32,32,32,32,32,32,115,117,99,99,101,115,115,58,32,116,114,117,101,10,32,32,32,32,32,32,125,59,10,32,32,32,32,125,44,10,32,32,32,32,115,101,116,76,111,111,112,40,114,101,113,117,101,115,116,41,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,73,100,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,105,110,115,116,97,110,99,101,73,100,59,10,32,32,32,32,32,32,99,111,110,115,116,32,108,111,111,112,32,61,32,114,101,113,117,101,115,116,46,112,97,114,97,109,115,46,108,111,111,112,59,10,32,32,32,32,32,32,99,111,110,115,116,32,105,110,115,116,97,110,99,101,32,61,32,105,110,115,116,97,110,99,101,115,77,97,112,46,103,101,116,40,105,110,115,116,97,110,99,101,73,100,41,59,10,32,32,32,32,32,32,105,102,32,40,33,105,110,115,116,97,110,99,101,41,32,123,10,32,32,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,73,110,115,116,97,110,99,101,32,119,105,116,104,32,105,100,32,36,123,105,110,115,116,97,110,99,101,73,100,125,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,96,41,59,10,32,32,32,32,32,32,125,10,32,32,32,32,32,32,105,110,115,116,97,110,99,101,46,115,101,116,76,111,111,112,40,108,111,111,112,41,59,10,32,32,32,32,32,32,114,101,116,117,114,110,32,123,10,32,32,32,32,32,32,32,32,115,117,99,99,101,115,115,58,32,116,114,117,101,10,32,32,32,32,32,32,125,59,10,32,32,32,32,125,10,32,32,125,59,10,32,32,102,117,110,99,116,105,111,110,32,101,120,101,99,117,116,101,67,111,109,109,97,110,100,40,114,112,99,82,101,113,117,101,115,116,41,32,123,10,32,32,32,32,99,111,110,115,116,32,109,101,116,104,111,100,32,61,32,114,112,99,82,101,113,117,101,115,116,46,109,101,116,104,111,100,59,10,32,32,32,32,105,102,32,40,116,121,112,101,111,102,32,99,111,109,109,97,110,100,115,91,109,101,116,104,111,100,93,32,61,61,61,32,34,102,117,110,99,116,105,111,110,34,41,32,123,10,32,32,32,32,32,32,114,101,116,117,114,110,32,99,111,109,109,97,110,100,115,91,109,101,116,104,111,100,93,40,114,112,99,82,101,113,117,101,115,116,41,59,10,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,77,101,116,104,111,100,32,36,123,109,101,116,104,111,100,125,32,105,115,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,32,105,110,32,99,111,109,109,97,110,100,115,46,96,41,59,10,32,32,32,32,125,10,32,32,125,10,32,32,115,101,108,102,46,111,110,109,101,115,115,97,103,101,32,61,32,40,101,118,101,110,116,41,32,61,62,32,123,10,32,32,32,32,116,114,121,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,114,101,115,117,108,116,32,61,32,101,120,101,99,117,116,101,67,111,109,109,97,110,100,40,101,118,101,110,116,46,100,97,116,97,41,59,10,32,32,32,32,32,32,99,111,110,115,116,32,114,101,115,112,111,110,115,101,32,61,32,123,10,32,32,32,32,32,32,32,32,105,100,58,32,101,118,101,110,116,46,100,97,116,97,46,105,100,44,10,32,32,32,32,32,32,32,32,109,101,116,104,111,100,58,32,101,118,101,110,116,46,100,97,116,97,46,109,101,116,104,111,100,44,10,32,32,32,32,32,32,32,32,114,101,115,117,108,116,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,115,101,108,102,46,112,111,115,116,77,101,115,115,97,103,101,40,114,101,115,112,111,110,115,101,41,59,10,32,32,32,32,125,32,99,97,116,99,104,32,40,101,114,114,111,114,41,32,123,10,32,32,32,32,32,32,99,111,110,115,116,32,101,114,114,111,114,82,101,115,112,111,110,115,101,32,61,32,123,10,32,32,32,32,32,32,32,32,105,100,58,32,101,118,101,110,116,46,100,97,116,97,46,105,100,44,10,32,32,32,32,32,32,32,32,109,101,116,104,111,100,58,32,101,118,101,110,116,46,100,97,116,97,46,109,101,116,104,111,100,44,10,32,32,32,32,32,32,32,32,101,114,114,111,114,58,32,101,114,114,111,114,46,109,101,115,115,97,103,101,10,32,32,32,32,32,32,125,59,10,32,32,32,32,32,32,115,101,108,102,46,112,111,115,116,77,101,115,115,97,103,101,40,101,114,114,111,114,82,101,115,112,111,110,115,101,41,59,10,32,32,32,32,125,10,32,32,125,59,10,32,32,118,97,114,32,100,117,109,109,121,32,61,32,34,34,59,10,32,32,118,97,114,32,100,111,116,108,111,116,116,105,101,95,119,111,114,107,101,114,95,100,101,102,97,117,108,116,32,61,32,100,117,109,109,121,59,10,125,41,40,41,59,10])], { type: 'application/javascript' });\n                const url = URL.createObjectURL(blob);\n                const worker = new Worker(url);\n                URL.revokeObjectURL(url);\n                return worker;\n              }\n            }\n            export default InlineWorker;\n          ","import { IS_BROWSER } from '../constants';\nimport type { Marker } from '../core';\nimport type { EventType, EventListener, FrameEvent } from '../event-manager';\nimport { EventManager } from '../event-manager';\nimport { OffscreenObserver } from '../offscreen-observer';\nimport { CanvasResizeObserver } from '../resize-observer';\nimport type { Config, Layout, Manifest, Mode, RenderConfig } from '../types';\nimport { getDefaultDPR, isElementInViewport } from '../utils';\n\nimport type { MethodParamsMap, MethodResultMap, RpcRequest, RpcResponse } from './types';\nimport { WorkerManager } from './worker-manager';\n\nfunction getCanvasSize(\n  canvas: HTMLCanvasElement | OffscreenCanvas,\n  devicePixelRatio: number,\n): { height: number; width: number } {\n  if (canvas instanceof HTMLCanvasElement) {\n    const { height: clientHeight, width: clientWidth } = canvas.getBoundingClientRect();\n\n    if (clientHeight !== 0 && clientWidth !== 0) {\n      return { width: clientWidth * devicePixelRatio, height: clientHeight * devicePixelRatio };\n    }\n  }\n\n  return { width: canvas.width, height: canvas.height };\n}\n\nfunction generateUniqueId(): string {\n  return Date.now().toString(36) + Math.random().toString(36).substr(2, 9);\n}\n\nexport interface DotLottieInstanceState {\n  activeAnimationId: string | undefined;\n  activeThemeId: string | undefined;\n  autoplay: boolean;\n  backgroundColor: string;\n  currentFrame: number;\n  duration: number;\n  isFrozen: boolean;\n  isLoaded: boolean;\n  isPaused: boolean;\n  isPlaying: boolean;\n  isReady: boolean;\n  isStopped: boolean;\n  layout: Layout | undefined;\n  loop: boolean;\n  manifest: Manifest | null;\n  marker: string | undefined;\n  markers: Marker[];\n  mode: Mode;\n  renderConfig: RenderConfig;\n  segment: [number, number] | undefined;\n  segmentDuration: number;\n  speed: number;\n  totalFrames: number;\n  useFrameInterpolation: boolean;\n}\n\nexport class DotLottieWorker {\n  private static readonly _workerManager = new WorkerManager();\n\n  private readonly _eventManager = new EventManager();\n\n  private readonly _id: string;\n\n  private readonly _worker: Worker;\n\n  private readonly _canvas: HTMLCanvasElement;\n\n  private _dotLottieInstanceState: DotLottieInstanceState = {\n    markers: [],\n    autoplay: false,\n    backgroundColor: '',\n    currentFrame: 0,\n    duration: 0,\n    loop: false,\n    mode: 'forward',\n    segment: [0, 0],\n    segmentDuration: 0,\n    speed: 1,\n    totalFrames: 0,\n    isLoaded: false,\n    isPlaying: false,\n    isPaused: false,\n    isStopped: true,\n    isFrozen: false,\n    useFrameInterpolation: false,\n    renderConfig: {\n      devicePixelRatio: getDefaultDPR(),\n    },\n    activeAnimationId: '',\n    activeThemeId: '',\n    layout: undefined,\n    marker: undefined,\n    isReady: false,\n    manifest: null,\n  };\n\n  private static _wasmUrl: string = '';\n\n  private _created: boolean = false;\n\n  private readonly _pointerUpMethod: (event: PointerEvent) => void;\n\n  private readonly _pointerDownMethod: (event: PointerEvent) => void;\n\n  private readonly _pointerMoveMethod: (event: PointerEvent) => void;\n\n  private readonly _pointerEnterMethod: (event: PointerEvent) => void;\n\n  private readonly _pointerExitMethod: (event: PointerEvent) => void;\n\n  public constructor(config: Config & { workerId?: string }) {\n    this._canvas = config.canvas;\n\n    this._id = `dotlottie-${generateUniqueId()}`;\n    const workerId = config.workerId || 'defaultWorker';\n\n    // creates or gets the worker\n    this._worker = DotLottieWorker._workerManager.getWorker(workerId);\n\n    DotLottieWorker._workerManager.assignAnimationToWorker(this._id, workerId);\n\n    if (DotLottieWorker._wasmUrl) {\n      this._sendMessage('setWasmUrl', { url: DotLottieWorker._wasmUrl });\n    }\n\n    this._create({\n      ...config,\n      renderConfig: {\n        ...config.renderConfig,\n        devicePixelRatio: config.renderConfig?.devicePixelRatio || getDefaultDPR(),\n        // freezeOnOffscreen is true by default to prevent unnecessary rendering when the canvas is offscreen\n        freezeOnOffscreen: config.renderConfig?.freezeOnOffscreen ?? true,\n      },\n    });\n\n    // eslint-disable-next-line @typescript-eslint/no-misused-promises\n    this._worker.addEventListener('message', this._handleWorkerEvent.bind(this));\n\n    this._pointerUpMethod = this._onPointerUp.bind(this);\n\n    this._pointerDownMethod = this._onPointerDown.bind(this);\n\n    this._pointerMoveMethod = this._onPointerMove.bind(this);\n\n    this._pointerEnterMethod = this._onPointerEnter.bind(this);\n\n    this._pointerExitMethod = this._onPointerLeave.bind(this);\n  }\n\n  private async _handleWorkerEvent(event: MessageEvent): Promise<void> {\n    const rpcResponse: RpcResponse<\n      | 'onComplete'\n      | 'onLoad'\n      | 'onDestroy'\n      | 'onUnfreeze'\n      | 'onFrame'\n      | 'onRender'\n      | 'onFreeze'\n      | 'onPause'\n      | 'onPlay'\n      | 'onStop'\n      | 'onLoadError'\n      | 'onReady'\n    > = event.data;\n\n    if (!rpcResponse.id) {\n      if (rpcResponse.method === 'onLoad' && rpcResponse.result.instanceId === this._id) {\n        await this._updateDotLottieInstanceState();\n        this._eventManager.dispatch(rpcResponse.result.event);\n\n        if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n          if (this._dotLottieInstanceState.renderConfig.freezeOnOffscreen) {\n            OffscreenObserver.observe(this._canvas, this);\n          }\n\n          if (this._dotLottieInstanceState.renderConfig.autoResize) {\n            CanvasResizeObserver.observe(this._canvas, this);\n          }\n        }\n      }\n\n      if (rpcResponse.method === 'onComplete' && rpcResponse.result.instanceId === this._id) {\n        await this._updateDotLottieInstanceState();\n        this._eventManager.dispatch(rpcResponse.result.event);\n      }\n\n      if (rpcResponse.method === 'onDestroy' && rpcResponse.result.instanceId === this._id) {\n        this._eventManager.dispatch(rpcResponse.result.event);\n      }\n\n      if (rpcResponse.method === 'onUnfreeze' && rpcResponse.result.instanceId === this._id) {\n        await this._updateDotLottieInstanceState();\n        this._dotLottieInstanceState.isFrozen = false;\n        this._eventManager.dispatch(rpcResponse.result.event);\n      }\n\n      if (rpcResponse.method === 'onFrame' && rpcResponse.result.instanceId === this._id) {\n        this._dotLottieInstanceState.currentFrame = (rpcResponse.result.event as FrameEvent).currentFrame;\n        this._eventManager.dispatch(rpcResponse.result.event);\n      }\n\n      if (rpcResponse.method === 'onRender' && rpcResponse.result.instanceId === this._id) {\n        this._eventManager.dispatch(rpcResponse.result.event);\n      }\n\n      if (rpcResponse.method === 'onFreeze' && rpcResponse.result.instanceId === this._id) {\n        await this._updateDotLottieInstanceState();\n        this._eventManager.dispatch(rpcResponse.result.event);\n      }\n\n      if (rpcResponse.method === 'onPause' && rpcResponse.result.instanceId === this._id) {\n        await this._updateDotLottieInstanceState();\n        this._eventManager.dispatch(rpcResponse.result.event);\n      }\n\n      if (rpcResponse.method === 'onPlay' && rpcResponse.result.instanceId === this._id) {\n        await this._updateDotLottieInstanceState();\n        this._eventManager.dispatch(rpcResponse.result.event);\n      }\n\n      if (rpcResponse.method === 'onStop' && rpcResponse.result.instanceId === this._id) {\n        await this._updateDotLottieInstanceState();\n        this._eventManager.dispatch(rpcResponse.result.event);\n      }\n\n      if (rpcResponse.method === 'onLoadError' && rpcResponse.result.instanceId === this._id) {\n        await this._updateDotLottieInstanceState();\n        this._eventManager.dispatch(rpcResponse.result.event);\n      }\n\n      if (rpcResponse.method === 'onReady' && rpcResponse.result.instanceId === this._id) {\n        await this._updateDotLottieInstanceState();\n        this._eventManager.dispatch(rpcResponse.result.event);\n      }\n    }\n  }\n\n  private async _create(config: Config): Promise<void> {\n    let offscreen: OffscreenCanvas;\n\n    if (this._canvas instanceof HTMLCanvasElement) {\n      offscreen = this._canvas.transferControlToOffscreen();\n    } else {\n      offscreen = this._canvas;\n    }\n\n    const { instanceId } = await this._sendMessage(\n      'create',\n      {\n        instanceId: this._id,\n        config: {\n          ...config,\n          // @ts-ignore\n          canvas: offscreen,\n        },\n        ...getCanvasSize(this._canvas, config.renderConfig?.devicePixelRatio || getDefaultDPR()),\n      },\n      [offscreen],\n    );\n\n    if (instanceId !== this._id) {\n      throw new Error('Instance ID mismatch');\n    }\n\n    this._created = true;\n\n    await this._updateDotLottieInstanceState();\n  }\n\n  public get isLoaded(): boolean {\n    return this._dotLottieInstanceState.isLoaded;\n  }\n\n  public get isPlaying(): boolean {\n    return this._dotLottieInstanceState.isPlaying;\n  }\n\n  public get isPaused(): boolean {\n    return this._dotLottieInstanceState.isPaused;\n  }\n\n  public get isStopped(): boolean {\n    return this._dotLottieInstanceState.isStopped;\n  }\n\n  public get currentFrame(): number {\n    return this._dotLottieInstanceState.currentFrame;\n  }\n\n  public get isFrozen(): boolean {\n    return this._dotLottieInstanceState.isFrozen;\n  }\n\n  public get segmentDuration(): number {\n    return this._dotLottieInstanceState.segmentDuration;\n  }\n\n  public get totalFrames(): number {\n    return this._dotLottieInstanceState.totalFrames;\n  }\n\n  public get segment(): [number, number] | undefined {\n    return this._dotLottieInstanceState.segment;\n  }\n\n  public get speed(): number {\n    return this._dotLottieInstanceState.speed;\n  }\n\n  public get duration(): number {\n    return this._dotLottieInstanceState.duration;\n  }\n\n  public get isReady(): boolean {\n    return this._dotLottieInstanceState.isReady;\n  }\n\n  public get mode(): Mode {\n    return this._dotLottieInstanceState.mode;\n  }\n\n  public get canvas(): HTMLCanvasElement | null {\n    return this._canvas;\n  }\n\n  public get autoplay(): boolean {\n    return this._dotLottieInstanceState.autoplay;\n  }\n\n  public get backgroundColor(): string {\n    return this._dotLottieInstanceState.backgroundColor;\n  }\n\n  public get loop(): boolean {\n    return this._dotLottieInstanceState.loop;\n  }\n\n  public get useFrameInterpolation(): boolean {\n    return this._dotLottieInstanceState.useFrameInterpolation;\n  }\n\n  public get renderConfig(): RenderConfig {\n    return this._dotLottieInstanceState.renderConfig;\n  }\n\n  public get manifest(): Manifest | null {\n    return this._dotLottieInstanceState.manifest;\n  }\n\n  public get activeAnimationId(): string | undefined {\n    return this._dotLottieInstanceState.activeAnimationId;\n  }\n\n  public get marker(): string | undefined {\n    return this._dotLottieInstanceState.marker;\n  }\n\n  public get activeThemeId(): string | undefined {\n    return this._dotLottieInstanceState.activeThemeId;\n  }\n\n  public get layout(): Layout | undefined {\n    return this._dotLottieInstanceState.layout;\n  }\n\n  public async play(): Promise<void> {\n    if (!this._created) return;\n\n    await this._sendMessage('play', { instanceId: this._id });\n    await this._updateDotLottieInstanceState();\n\n    /* \n      Check if the canvas is offscreen and freezing is enabled\n      If freezeOnOffscreen is true and the canvas is currently outside the viewport,\n      we immediately freeze the animation to avoid unnecessary rendering and performance overhead.\n    */\n    if (\n      IS_BROWSER &&\n      this._canvas instanceof HTMLCanvasElement &&\n      this._dotLottieInstanceState.renderConfig.freezeOnOffscreen &&\n      !isElementInViewport(this._canvas)\n    ) {\n      await this.freeze();\n    }\n  }\n\n  public async pause(): Promise<void> {\n    if (!this._created) return;\n\n    await this._sendMessage('pause', { instanceId: this._id });\n    await this._updateDotLottieInstanceState();\n  }\n\n  public async stop(): Promise<void> {\n    if (!this._created) return;\n\n    await this._sendMessage('stop', { instanceId: this._id });\n    await this._updateDotLottieInstanceState();\n  }\n\n  public async setSpeed(speed: number): Promise<void> {\n    if (!this._created) return;\n\n    await this._sendMessage('setSpeed', { instanceId: this._id, speed });\n    await this._updateDotLottieInstanceState();\n  }\n\n  public async setMode(mode: Mode): Promise<void> {\n    if (!this._created) return;\n\n    await this._sendMessage('setMode', { instanceId: this._id, mode });\n    await this._updateDotLottieInstanceState();\n  }\n\n  public async setFrame(frame: number): Promise<void> {\n    if (!this._created) return;\n\n    await this._sendMessage('setFrame', { frame, instanceId: this._id });\n    await this._updateDotLottieInstanceState();\n  }\n\n  public async setSegment(start: number, end: number): Promise<void> {\n    if (!this._created) return;\n\n    await this._sendMessage('setSegment', { instanceId: this._id, segment: [start, end] });\n    await this._updateDotLottieInstanceState();\n  }\n\n  public async setRenderConfig(renderConfig: RenderConfig): Promise<void> {\n    if (!this._created) return;\n\n    const { devicePixelRatio, freezeOnOffscreen, ...restConfig } = renderConfig;\n\n    await this._sendMessage('setRenderConfig', {\n      instanceId: this._id,\n      renderConfig: {\n        ...this._dotLottieInstanceState.renderConfig,\n        ...restConfig,\n        // devicePixelRatio is a special case, it should be set to the default value if it's not provided\n        devicePixelRatio: devicePixelRatio || getDefaultDPR(),\n        freezeOnOffscreen: freezeOnOffscreen ?? true,\n      },\n    });\n\n    await this._updateDotLottieInstanceState();\n\n    if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n      if (this._dotLottieInstanceState.renderConfig.autoResize) {\n        CanvasResizeObserver.observe(this._canvas, this);\n      } else {\n        CanvasResizeObserver.unobserve(this._canvas);\n      }\n\n      if (this._dotLottieInstanceState.renderConfig.freezeOnOffscreen) {\n        OffscreenObserver.observe(this._canvas, this);\n      } else {\n        OffscreenObserver.unobserve(this._canvas);\n        // If the animation was previously frozen, we need to unfreeze it now\n        // to ensure it resumes rendering when the canvas is back onscreen.\n        if (this._dotLottieInstanceState.isFrozen) {\n          await this.unfreeze();\n        }\n      }\n    }\n  }\n\n  public async setUseFrameInterpolation(useFrameInterpolation: boolean): Promise<void> {\n    if (!this._created) return;\n\n    await this._sendMessage('setUseFrameInterpolation', { instanceId: this._id, useFrameInterpolation });\n    await this._updateDotLottieInstanceState();\n  }\n\n  public async setTheme(themeId: string): Promise<boolean> {\n    if (!this._created) return false;\n\n    const result = this._sendMessage('setTheme', { instanceId: this._id, themeId });\n\n    await this._updateDotLottieInstanceState();\n\n    return result;\n  }\n\n  public async load(config: Omit<Config, 'canvas'>): Promise<void> {\n    if (!this._created) return;\n\n    await this._sendMessage('load', { config, instanceId: this._id });\n    await this._updateDotLottieInstanceState();\n  }\n\n  public async setLoop(loop: boolean): Promise<void> {\n    if (!this._created) return;\n\n    await this._sendMessage('setLoop', { instanceId: this._id, loop });\n    await this._updateDotLottieInstanceState();\n  }\n\n  public async resize(): Promise<void> {\n    if (!this._created) return;\n\n    const { height, width } = getCanvasSize(\n      this._canvas,\n      this._dotLottieInstanceState.renderConfig.devicePixelRatio || getDefaultDPR(),\n    );\n\n    await this._sendMessage('resize', { height, instanceId: this._id, width });\n    await this._updateDotLottieInstanceState();\n  }\n\n  public async destroy(): Promise<void> {\n    if (!this._created) return;\n\n    this._created = false;\n\n    await this._sendMessage('destroy', { instanceId: this._id });\n\n    this._cleanupStateMachineListeners();\n\n    DotLottieWorker._workerManager.unassignAnimationFromWorker(this._id);\n    this._eventManager.removeAllEventListeners();\n\n    if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n      OffscreenObserver.unobserve(this._canvas);\n      CanvasResizeObserver.unobserve(this._canvas);\n    }\n  }\n\n  public async freeze(): Promise<void> {\n    if (!this._created) return;\n\n    await this._sendMessage('freeze', { instanceId: this._id });\n    await this._updateDotLottieInstanceState();\n  }\n\n  public async unfreeze(): Promise<void> {\n    if (!this._created) return;\n\n    await this._sendMessage('unfreeze', { instanceId: this._id });\n    await this._updateDotLottieInstanceState();\n  }\n\n  public async setBackgroundColor(backgroundColor: string): Promise<void> {\n    if (!this._created) return;\n\n    await this._sendMessage('setBackgroundColor', { instanceId: this._id, backgroundColor });\n    await this._updateDotLottieInstanceState();\n  }\n\n  public async loadAnimation(animationId: string): Promise<void> {\n    if (!this._created) return;\n\n    await this._sendMessage('loadAnimation', { animationId, instanceId: this._id });\n    await this._updateDotLottieInstanceState();\n  }\n\n  public async setLayout(layout: Layout): Promise<void> {\n    if (!this._created) return;\n\n    await this._sendMessage('setLayout', { instanceId: this._id, layout });\n    await this._updateDotLottieInstanceState();\n  }\n\n  private async _updateDotLottieInstanceState(): Promise<void> {\n    if (!this._created) return;\n\n    const result = await this._sendMessage('getDotLottieInstanceState', { instanceId: this._id });\n\n    this._dotLottieInstanceState = result.state;\n  }\n\n  public markers(): Marker[] {\n    return this._dotLottieInstanceState.markers;\n  }\n\n  public async setMarker(marker: string): Promise<void> {\n    if (!this._created) return;\n\n    await this._sendMessage('setMarker', { instanceId: this._id, marker });\n    await this._updateDotLottieInstanceState();\n  }\n\n  public async setThemeData(themeData: string): Promise<boolean> {\n    if (!this._created) return false;\n\n    const loaded = await this._sendMessage('setThemeData', { instanceId: this._id, themeData });\n\n    await this._updateDotLottieInstanceState();\n\n    return loaded;\n  }\n\n  public async setViewport(x: number, y: number, width: number, height: number): Promise<boolean> {\n    if (!this._created) return false;\n\n    return this._sendMessage('setViewport', { x, y, width, height, instanceId: this._id });\n  }\n\n  private async _sendMessage<T extends keyof MethodParamsMap>(\n    method: T,\n    params: MethodParamsMap[T],\n    transfer?: Transferable[],\n  ): Promise<MethodResultMap[T]> {\n    const rpcRequest: RpcRequest<T> = {\n      id: `dotlottie-request-${generateUniqueId()}`,\n      method,\n      params,\n    };\n\n    this._worker.postMessage(rpcRequest, transfer || []);\n\n    return new Promise((resolve, reject) => {\n      const onMessage = (event: MessageEvent): void => {\n        const rpcResponse: RpcResponse<T> = event.data;\n\n        // Check if the response corresponds to the request\n        if (rpcResponse.id === rpcRequest.id) {\n          this._worker.removeEventListener('message', onMessage);\n\n          if (rpcResponse.error) {\n            reject(new Error(`Failed to execute method ${method}: ${rpcResponse.error}`));\n          } else {\n            resolve(rpcResponse.result);\n          }\n        }\n      };\n\n      this._worker.addEventListener('message', onMessage);\n    });\n  }\n\n  public addEventListener<T extends EventType>(type: T, listener: EventListener<T>): void {\n    this._eventManager.addEventListener(type, listener);\n  }\n\n  public removeEventListener<T extends EventType>(type: T, listener?: EventListener<T>): void {\n    this._eventManager.removeEventListener(type, listener);\n  }\n\n  public static setWasmUrl(url: string): void {\n    DotLottieWorker._wasmUrl = url;\n  }\n\n  public async loadStateMachine(stateMachineId: string): Promise<boolean> {\n    if (!this._created) return false;\n\n    const result = await this._sendMessage('loadStateMachine', { instanceId: this._id, stateMachineId });\n\n    await this._updateDotLottieInstanceState();\n\n    return result;\n  }\n\n  public async loadStateMachineData(stateMachineData: string): Promise<boolean> {\n    if (!this._created) return false;\n\n    const result = await this._sendMessage('loadStateMachineData', { instanceId: this._id, stateMachineData });\n\n    await this._updateDotLottieInstanceState();\n\n    return result;\n  }\n\n  public async startStateMachine(): Promise<boolean> {\n    if (!this._created) return false;\n\n    this._setupStateMachineListeners();\n\n    const result = await this._sendMessage('startStateMachine', { instanceId: this._id });\n\n    await this._updateDotLottieInstanceState();\n\n    return result;\n  }\n\n  public async stopStateMachine(): Promise<boolean> {\n    if (!this._created) return false;\n\n    this._cleanupStateMachineListeners();\n\n    return this._sendMessage('stopStateMachine', { instanceId: this._id });\n  }\n\n  public async getStateMachineListeners(): Promise<string[]> {\n    if (!this._created) return [];\n\n    return this._sendMessage('getStateMachineListeners', { instanceId: this._id });\n  }\n\n  private _getPointerPosition(event: PointerEvent): { x: number; y: number } {\n    const rect = (this._canvas as HTMLCanvasElement).getBoundingClientRect();\n    const scaleX = this._canvas.width / rect.width;\n    const scaleY = this._canvas.height / rect.height;\n\n    const devicePixelRatio = this._dotLottieInstanceState.renderConfig.devicePixelRatio || window.devicePixelRatio || 1;\n    const x = ((event.clientX - rect.left) * scaleX) / devicePixelRatio;\n    const y = ((event.clientY - rect.top) * scaleY) / devicePixelRatio;\n\n    return {\n      x,\n      y,\n    };\n  }\n\n  private _onPointerUp(event: PointerEvent): void {\n    const { x, y } = this._getPointerPosition(event);\n\n    this._sendMessage('postPointerUpEvent', { instanceId: this._id, x, y });\n  }\n\n  private _onPointerDown(event: PointerEvent): void {\n    const { x, y } = this._getPointerPosition(event);\n\n    this._sendMessage('postPointerDownEvent', { instanceId: this._id, x, y });\n  }\n\n  private _onPointerMove(event: PointerEvent): void {\n    const { x, y } = this._getPointerPosition(event);\n\n    this._sendMessage('postPointerMoveEvent', { instanceId: this._id, x, y });\n  }\n\n  private _onPointerEnter(event: PointerEvent): void {\n    const { x, y } = this._getPointerPosition(event);\n\n    this._sendMessage('postPointerEnterEvent', { instanceId: this._id, x, y });\n  }\n\n  private _onPointerLeave(event: PointerEvent): void {\n    const { x, y } = this._getPointerPosition(event);\n\n    this._sendMessage('postPointerExitEvent', { instanceId: this._id, x, y });\n  }\n\n  private async _setupStateMachineListeners(): Promise<void> {\n    if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement && this.isLoaded) {\n      const listeners = await this._sendMessage('getStateMachineListeners', { instanceId: this._id });\n\n      if (listeners.includes('PointerUp')) {\n        this._canvas.addEventListener('pointerup', this._pointerUpMethod);\n      }\n\n      if (listeners.includes('PointerDown')) {\n        this._canvas.addEventListener('pointerdown', this._pointerDownMethod);\n      }\n\n      if (listeners.includes('PointerMove')) {\n        this._canvas.addEventListener('pointermove', this._pointerMoveMethod);\n      }\n\n      if (listeners.includes('PointerEnter')) {\n        this._canvas.addEventListener('pointerenter', this._pointerEnterMethod);\n      }\n\n      if (listeners.includes('PointerExit')) {\n        this._canvas.addEventListener('pointerleave', this._pointerExitMethod);\n      }\n    }\n  }\n\n  private _cleanupStateMachineListeners(): void {\n    if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n      this._canvas.removeEventListener('pointerup', this._pointerUpMethod);\n      this._canvas.removeEventListener('pointerdown', this._pointerDownMethod);\n      this._canvas.removeEventListener('pointermove', this._pointerMoveMethod);\n      this._canvas.removeEventListener('pointerenter', this._pointerEnterMethod);\n      this._canvas.removeEventListener('pointerleave', this._pointerExitMethod);\n    }\n  }\n}\n","// resolved to a Worker constructor by plugin-inline-worker\nimport DotLottieWebWorker from './dotlottie.worker?worker&inline';\nimport type { MethodParamsMap, RpcRequest } from './types';\n\nexport class WorkerManager {\n  private readonly _workers = new Map<string, Worker>();\n\n  private readonly _animationWorkerMap = new Map<string, string>();\n\n  public getWorker(workerId: string): Worker {\n    if (!this._workers.has(workerId)) {\n      this._workers.set(workerId, new DotLottieWebWorker());\n    }\n\n    return this._workers.get(workerId) as Worker;\n  }\n\n  public assignAnimationToWorker(animationId: string, workerId: string): void {\n    this._animationWorkerMap.set(animationId, workerId);\n  }\n\n  public unassignAnimationFromWorker(animationId: string): void {\n    this._animationWorkerMap.delete(animationId);\n  }\n\n  public sendMessage(workerId: string, message: RpcRequest<keyof MethodParamsMap>, transfer?: Transferable[]): void {\n    this.getWorker(workerId).postMessage(message, transfer || []);\n  }\n\n  public terminateWorker(workerId: string): void {\n    const worker = this._workers.get(workerId);\n\n    if (worker) {\n      worker.terminate();\n      this._workers.delete(workerId);\n    }\n  }\n}\n","/* eslint-disable no-warning-comments */\n'use client';\n\nimport type { Config, DotLottie, DotLottieWorker } from '@lottiefiles/dotlottie-web';\nimport { useState, useEffect, useCallback, useRef, type ComponentProps, type RefCallback } from 'react';\nimport type { JSX } from 'react';\n\nexport type BaseDotLottieProps<T extends DotLottie | DotLottieWorker> = Omit<Config, 'canvas'> &\n  ComponentProps<'canvas'> & {\n    animationId?: string;\n    /**\n     * A function that creates a `DotLottie` or `DotLottieWorker` instance.\n     */\n    createDotLottie: (config: T extends DotLottieWorker ? Config & { workerId?: string } : Config) => T;\n    /**\n     * A callback function that receives the `DotLottie` or `DotLottieWorker` instance.\n     *\n     * @example\n     * ```tsx\n     * const [dotLottie, setDotLottie] = useState<DotLottie | null>(null);\n     *\n     * <DotLottieReact\n     *   dotLottieRefCallback={setDotLottie}\n     * />\n     * ```\n     */\n    dotLottieRefCallback?: RefCallback<T | null>;\n    /**\n     * @deprecated The `playOnHover` property is deprecated.\n     * Instead, use the `onMouseEnter` and `onMouseLeave` events to control animation playback.\n     * Utilize the `dotLottieRefCallback` to access the `DotLottie` instance and invoke the `play` and `pause` methods.\n     *\n     * Example usage:\n     * ```tsx\n     * const [dotLottie, setDotLottie] = useState<DotLottie | null>(null);\n     *\n     * <DotLottieReact\n     *   dotLottieRefCallback={setDotLottie}\n     *   onMouseEnter={() => dotLottie?.play()}\n     *   onMouseLeave={() => dotLottie?.pause()}\n     * />\n     * ```\n     */\n    playOnHover?: boolean;\n    themeData?: string;\n    workerId?: T extends DotLottieWorker ? string : undefined;\n  };\n\nexport const BaseDotLottieReact = <T extends DotLottie | DotLottieWorker>({\n  animationId,\n  autoplay,\n  backgroundColor,\n  className,\n  createDotLottie,\n  data,\n  dotLottieRefCallback,\n  layout,\n  loop,\n  mode,\n  playOnHover,\n  renderConfig,\n  segment,\n  speed,\n  src,\n  style,\n  themeData,\n  themeId,\n  useFrameInterpolation,\n  workerId,\n  ...props\n}: BaseDotLottieProps<T> & {\n  createDotLottie: (config: T extends DotLottieWorker ? Config & { workerId?: string } : Config) => T;\n}): JSX.Element => {\n  const [dotLottie, setDotLottie] = useState<T | null>(null);\n  const canvasRef = useRef<HTMLCanvasElement | null>(null);\n  const dotLottieRef = useRef<T | null>(null);\n  const dotLottieRefCallbackRef = useRef<RefCallback<T | null> | undefined>(dotLottieRefCallback);\n\n  const config: Omit<Config, 'canvas'> & {\n    workerId?: T extends DotLottieWorker ? string : undefined;\n  } = {\n    speed,\n    mode,\n    loop,\n    useFrameInterpolation,\n    segment,\n    backgroundColor,\n    autoplay,\n    themeId,\n    workerId,\n    src,\n    data,\n    layout,\n    renderConfig,\n  };\n\n  const configRef = useRef<Omit<BaseDotLottieProps<T>, 'createDotLottie' | 'dotLottieRefCallback'> | undefined>(config);\n\n  dotLottieRefCallbackRef.current = dotLottieRefCallback;\n  dotLottieRef.current = dotLottie;\n  configRef.current = config;\n\n  useEffect(() => {\n    if (typeof dotLottieRefCallbackRef.current === 'function' && dotLottie) {\n      dotLottieRefCallbackRef.current(dotLottie);\n    }\n  }, [dotLottie]);\n\n  const setCanvasRef = useCallback((canvas: HTMLCanvasElement | null) => {\n    canvasRef.current = canvas;\n\n    if (canvas) {\n      const dotLottieInstance = createDotLottie({\n        ...configRef.current,\n        canvas,\n      });\n\n      setDotLottie(dotLottieInstance as T);\n    } else {\n      dotLottie?.destroy();\n      setDotLottie(null);\n    }\n  }, []);\n\n  useEffect(() => {\n    const handlePlayOnHover = (event: MouseEvent): void => {\n      if (!playOnHover) return;\n\n      if (event.type === 'mouseenter') {\n        dotLottieRef.current?.play();\n      }\n\n      if (event.type === 'mouseleave') {\n        dotLottieRef.current?.pause();\n      }\n    };\n\n    canvasRef.current?.addEventListener('mouseenter', handlePlayOnHover);\n    canvasRef.current?.addEventListener('mouseleave', handlePlayOnHover);\n\n    return () => {\n      canvasRef.current?.removeEventListener('mouseenter', handlePlayOnHover);\n      canvasRef.current?.removeEventListener('mouseleave', handlePlayOnHover);\n    };\n  }, [playOnHover]);\n\n  useEffect(() => {\n    return () => {\n      if (dotLottie) {\n        dotLottie.destroy();\n        setDotLottie(null);\n      }\n    };\n  }, [dotLottie]);\n\n  useEffect(() => {\n    dotLottieRef.current?.setSpeed(speed ?? 1);\n  }, [speed]);\n\n  useEffect(() => {\n    dotLottieRef.current?.setMode(mode ?? 'forward');\n  }, [mode]);\n\n  useEffect(() => {\n    dotLottieRef.current?.setLoop(loop ?? false);\n  }, [loop]);\n\n  useEffect(() => {\n    dotLottieRef.current?.setUseFrameInterpolation(useFrameInterpolation ?? true);\n  }, [useFrameInterpolation]);\n\n  useEffect(() => {\n    if (typeof segment?.[0] === 'number' && typeof segment[1] === 'number') {\n      dotLottieRef.current?.setSegment(segment[0], segment[1]);\n    } else {\n      // TODO: implement it for worker\n      // dotLottieRef.current?.resetSegment();\n    }\n  }, [segment]);\n\n  useEffect(() => {\n    dotLottieRef.current?.setBackgroundColor(backgroundColor ?? '');\n  }, [backgroundColor]);\n\n  useEffect(() => {\n    dotLottieRef.current?.setRenderConfig(renderConfig ?? {});\n  }, [JSON.stringify(renderConfig)]);\n\n  useEffect(() => {\n    if (typeof data !== 'string' && typeof data !== 'object') return;\n\n    dotLottieRef.current?.load({\n      data,\n      ...configRef.current,\n    });\n  }, [data]);\n\n  useEffect(() => {\n    if (typeof src !== 'string') return;\n\n    dotLottieRef.current?.load({\n      src,\n      ...configRef.current,\n    });\n  }, [src]);\n\n  useEffect(() => {\n    dotLottieRef.current?.setMarker(props.marker ?? '');\n  }, [props.marker]);\n\n  useEffect(() => {\n    dotLottieRef.current?.loadAnimation(animationId ?? '');\n  }, [animationId]);\n\n  useEffect(() => {\n    if (typeof themeId === 'string') {\n      dotLottieRef.current?.setTheme(themeId);\n    } else {\n      // TODO: implement it for worker\n      // dotLottieRef.current?.resetTheme();\n    }\n  }, [themeId]);\n\n  useEffect(() => {\n    dotLottieRef.current?.setThemeData(themeData ?? '');\n  }, [themeData]);\n\n  useEffect(() => {\n    dotLottieRef.current?.setLayout({\n      align: layout?.align ?? [0.5, 0.5],\n      fit: layout?.fit ?? 'contain',\n    });\n  }, [layout?.align[0], layout?.align[1], layout?.fit]);\n\n  return (\n    <div\n      className={className}\n      {...(!className && {\n        style: {\n          width: '100%',\n          height: '100%',\n          lineHeight: 0,\n          ...style,\n        },\n      })}\n    >\n      <canvas\n        ref={setCanvasRef}\n        style={{\n          width: '100%',\n          height: '100%',\n        }}\n        {...props}\n      />\n    </div>\n  );\n};\n","'use client';\n\nimport type { Config } from '@lottiefiles/dotlottie-web';\nimport { DotLottie } from '@lottiefiles/dotlottie-web';\nimport type { JSX } from 'react';\n\nimport type { BaseDotLottieProps } from './base-dotlottie-react';\nimport { BaseDotLottieReact } from './base-dotlottie-react';\n\nexport type DotLottieReactProps = Omit<BaseDotLottieProps<DotLottie>, 'createDotLottie'>;\n\nconst createDotLottie = (config: Config): DotLottie => new DotLottie(config);\n\nexport const DotLottieReact = (props: DotLottieReactProps): JSX.Element => {\n  return <BaseDotLottieReact {...props} createDotLottie={createDotLottie} />;\n};\n","import React, { useState, useEffect } from \"react\";\nimport { Modal, Button, Text } from \"@mantine/core\";\nimport { notifications, Notifications } from \"@mantine/notifications\";\nimport { DotLottieReact } from \"@lottiefiles/dotlottie-react\";\n\nconst WelcomeModal = () => {\n  // State to control the modal visibility\n  const [opened, setOpened] = useState(true);\n\n  useEffect(() => {\n    setOpened(true);\n  }, []);\n\n  const handleContinue = () => {\n    setOpened(false)\n    // Show notification\n    notifications.show({\n      title: \"Scroll to see more!\",\n      message: \"Scroll up to view pins and development models\",\n      position: \"bottom-center\",\n      autoClose: 20000,\n      radius: \"md\",\n      color: \"rgba(255, 255, 255, 0)\",\n      icon: (\n        <DotLottieReact\n          src=\"https://lottie.host/2977ffe4-2c2f-4d6e-8bc1-54ba419a2a1d/HXGL0g7tFO.lottie\"\n          loop\n          autoplay\n          style={{\n            transform: \"rotate(180deg)\",\n            width: \"60px\",\n            height: \"80px\",\n          }}\n        />\n      ),\n    });\n  };\n\n  return (\n    <div>\n      <Notifications limit={1} />\n      {/* Modal Component */}\n      <Modal\n        opened={opened}\n        onClose={() => setOpened(false)}\n        title=\"Welcome\"\n        size=\"lg\"\n        overlayProps={{\n          color: \"rgba(216, 235, 227, 0.6)\",\n          opacity: 2,\n          blur: 3,\n        }}\n        centered\n      >\n        <Text size=\"md\">\n          This 3D map displays development permits lodged within our Local\n          Government Area. Information is sourced from Council’s planning system\n          to visualise the location and cumulative impact of submitted and\n          approved permits.\n        </Text>\n        <Text size=\"md\" style={{ marginTop: 10 }}>\n          Currently the map only represents residential developments. Our team\n          is working to update the map with applications and models for mixed-use\n          and commercial developments.\n        </Text>\n        <Text size=\"md\" style={{ marginTop: 10 }}>\n          All 3D Building models in the map are simplified interpretations of\n          existing buildings and residential developments. This data should not\n          be used for planning purposes.\n        </Text>\n        <Text size=\"md\" style={{ marginTop: 10 }}>\n          This tool displays limited information about planning permit\n          applications, for complete information please go to{\" \"}\n          <a href=\"https://www.portphillip.vic.gov.au/\" target=\"_blank\" rel=\"noopener noreferrer\">\n            MyPortPhillip\n          </a>\n        </Text>\n        <div\n          style={{ display: \"flex\", justifyContent: \"flex-end\", marginTop: 20 }}\n        >\n          <Button onClick={handleContinue} variant=\"default\">\n            Continue\n          </Button>\n        </div>\n      </Modal>\n    </div>\n  );\n};\n\nexport default WelcomeModal;\n","import { createSafeContext, GetStylesApi } from '../../core';\nimport type { TableFactory } from './Table';\n\nexport interface TableContextValue {\n  getStyles: GetStylesApi<TableFactory>;\n  stickyHeader: boolean | undefined;\n  striped: 'odd' | 'even' | undefined;\n  highlightOnHover: boolean | undefined;\n  withColumnBorders: boolean | undefined;\n  withRowBorders: boolean | undefined;\n  captionSide: 'top' | 'bottom';\n}\n\nexport const [TableProvider, useTableContext] = createSafeContext<TableContextValue>(\n  'Table component was not found in the tree'\n);\n","import {\n  Box,\n  BoxProps,\n  CompoundStylesApiProps,\n  ElementProps,\n  factory,\n  Factory,\n  FactoryPayload,\n  useProps,\n} from '../../core';\nimport type { TableFactory } from './Table';\nimport { TableContextValue, useTableContext } from './Table.context';\nimport classes from './Table.module.css';\n\nexport interface TableElementProps<Selector extends string>\n  extends BoxProps,\n    CompoundStylesApiProps<Omit<TableFactory, 'stylesNames'> & { stylesNames: Selector }> {}\n\nexport interface TableThProps extends TableElementProps<'th'>, ElementProps<'th'> {}\nexport interface TableTdProps extends TableElementProps<'td'>, ElementProps<'td'> {}\nexport interface TableTrProps extends TableElementProps<'tr'>, ElementProps<'tr'> {}\nexport interface TableTheadProps extends TableElementProps<'thead'>, ElementProps<'thead'> {}\nexport interface TableTbodyProps extends TableElementProps<'tbody'>, ElementProps<'tbody'> {}\nexport interface TableTfootProps extends TableElementProps<'tfoot'>, ElementProps<'tfoot'> {}\nexport interface TableCaptionProps extends TableElementProps<'caption'>, ElementProps<'caption'> {}\n\nexport type TableThFactory = Factory<{\n  props: TableThProps;\n  ref: HTMLTableCellElement;\n  stylesNames: 'th';\n  compound: true;\n}>;\n\nexport type TableTdFactory = Factory<{\n  props: TableTdProps;\n  ref: HTMLTableCellElement;\n  stylesNames: 'td';\n  compound: true;\n}>;\n\nexport type TableTrFactory = Factory<{\n  props: TableTrProps;\n  ref: HTMLTableRowElement;\n  stylesNames: 'tr';\n  compound: true;\n}>;\n\nexport type TableTheadFactory = Factory<{\n  props: TableTheadProps;\n  ref: HTMLTableSectionElement;\n  stylesNames: 'thead';\n  compound: true;\n}>;\n\nexport type TableTbodyFactory = Factory<{\n  props: TableTbodyProps;\n  ref: HTMLTableSectionElement;\n  stylesNames: 'tbody';\n  compound: true;\n}>;\n\nexport type TableTfootFactory = Factory<{\n  props: TableTfootProps;\n  ref: HTMLTableSectionElement;\n  stylesNames: 'tfoot';\n  compound: true;\n}>;\n\nexport type TableCaptionFactory = Factory<{\n  props: TableCaptionProps;\n  ref: HTMLTableCaptionElement;\n  stylesNames: 'caption';\n  compound: true;\n}>;\n\ninterface TableElementOptions {\n  columnBorder?: true;\n  rowBorder?: true;\n  striped?: true;\n  highlightOnHover?: true;\n  captionSide?: true;\n  stickyHeader?: true;\n}\n\nfunction getDataAttributes(ctx: TableContextValue, options?: TableElementOptions) {\n  if (!options) {\n    return undefined;\n  }\n\n  const data: Record<string, boolean | string> = {};\n\n  if (options.columnBorder && ctx.withColumnBorders) {\n    data['data-with-column-border'] = true;\n  }\n\n  if (options.rowBorder && ctx.withRowBorders) {\n    data['data-with-row-border'] = true;\n  }\n\n  if (options.striped && ctx.striped) {\n    data['data-striped'] = ctx.striped;\n  }\n\n  if (options.highlightOnHover && ctx.highlightOnHover) {\n    data['data-hover'] = true;\n  }\n\n  if (options.captionSide && ctx.captionSide) {\n    data['data-side'] = ctx.captionSide;\n  }\n\n  if (options.stickyHeader && ctx.stickyHeader) {\n    data['data-sticky'] = true;\n  }\n\n  return data;\n}\n\nexport function tableElement<Factory extends FactoryPayload>(\n  element: 'th' | 'td' | 'tr' | 'thead' | 'tbody' | 'tfoot' | 'caption',\n  options?: TableElementOptions\n) {\n  const name = `Table${element.charAt(0).toUpperCase()}${element.slice(1)}`;\n  const Component = factory<Factory>((_props, ref) => {\n    const props = useProps(name, {}, _props);\n    const { classNames, className, style, styles, ...others } = props;\n\n    const ctx = useTableContext();\n\n    return (\n      <Box\n        component={element}\n        ref={ref}\n        {...getDataAttributes(ctx, options)}\n        {...ctx.getStyles(element, { className, classNames, style, styles, props })}\n        {...others}\n      />\n    );\n  });\n\n  Component.displayName = `@mantine/core/${name}`;\n  Component.classes = classes;\n  return Component;\n}\n\nexport const TableTh = tableElement<TableThFactory>('th', { columnBorder: true });\nexport const TableTd = tableElement<TableTdFactory>('td', { columnBorder: true });\nexport const TableTr = tableElement<TableTrFactory>('tr', {\n  rowBorder: true,\n  striped: true,\n  highlightOnHover: true,\n});\nexport const TableThead = tableElement<TableTheadFactory>('thead', { stickyHeader: true });\nexport const TableTbody = tableElement<TableTbodyFactory>('tbody');\nexport const TableTfoot = tableElement<TableTfootFactory>('tfoot');\nexport const TableCaption = tableElement<TableCaptionFactory>('caption', { captionSide: true });\n","import type { TableData } from './Table';\nimport {\n  TableCaption,\n  TableTbody,\n  TableTd,\n  TableTfoot,\n  TableTh,\n  TableThead,\n  TableTr,\n} from './Table.components';\n\nexport interface TableDataRendererProps {\n  data: TableData;\n}\n\nexport function TableDataRenderer({ data }: TableDataRendererProps) {\n  return (\n    <>\n      {data.caption && <TableCaption>{data.caption}</TableCaption>}\n\n      {data.head && (\n        <TableThead>\n          <TableTr>\n            {data.head.map((item, index) => (\n              <TableTh key={index}>{item}</TableTh>\n            ))}\n          </TableTr>\n        </TableThead>\n      )}\n\n      {data.body && (\n        <TableTbody>\n          {data.body.map((row, rowIndex) => (\n            <TableTr key={rowIndex}>\n              {row.map((item, index) => (\n                <TableTd key={index}>{item}</TableTd>\n              ))}\n            </TableTr>\n          ))}\n        </TableTbody>\n      )}\n\n      {data.foot && (\n        <TableTfoot>\n          <TableTr>\n            {data.foot.map((item, index) => (\n              <TableTh key={index}>{item}</TableTh>\n            ))}\n          </TableTr>\n        </TableTfoot>\n      )}\n    </>\n  );\n}\n\nTableDataRenderer.displayName = '@mantine/core/TableDataRenderer';\n","import { createSafeContext } from '../../core';\n\nexport interface ScrollAreaContextValue {\n  type: 'auto' | 'always' | 'scroll' | 'hover' | 'never';\n  scrollHideDelay: number;\n  scrollArea: HTMLDivElement | null;\n  viewport: HTMLDivElement | null;\n  onViewportChange: (viewport: HTMLDivElement | null) => void;\n  content: HTMLDivElement | null;\n  onContentChange: (content: HTMLDivElement) => void;\n  scrollbarX: HTMLDivElement | null;\n  onScrollbarXChange: (scrollbar: HTMLDivElement | null) => void;\n  scrollbarXEnabled: boolean;\n  onScrollbarXEnabledChange: (rendered: boolean) => void;\n  scrollbarY: HTMLDivElement | null;\n  onScrollbarYChange: (scrollbar: HTMLDivElement | null) => void;\n  scrollbarYEnabled: boolean;\n  onScrollbarYEnabledChange: (rendered: boolean) => void;\n  onCornerWidthChange: (width: number) => void;\n  onCornerHeightChange: (height: number) => void;\n}\n\nexport const [ScrollAreaProvider, useScrollAreaContext] = createSafeContext<ScrollAreaContextValue>(\n  'ScrollArea.Root component was not found in tree'\n);\n","import { useEffect, useMemo, useRef } from 'react';\n\nexport function useCallbackRef<T extends (...args: any[]) => any>(callback: T | undefined): T {\n  const callbackRef = useRef(callback);\n\n  useEffect(() => {\n    callbackRef.current = callback;\n  });\n\n  return useMemo(() => ((...args) => callbackRef.current?.(...args)) as T, []);\n}\n","import { useCallbackRef, useIsomorphicEffect } from '@mantine/hooks';\n\nexport function useResizeObserver(element: HTMLElement | null, onResize: () => void) {\n  const handleResize = useCallbackRef(onResize);\n\n  useIsomorphicEffect(() => {\n    let rAF = 0;\n    if (element) {\n      const resizeObserver = new ResizeObserver(() => {\n        cancelAnimationFrame(rAF);\n        rAF = window.requestAnimationFrame(handleResize);\n      });\n\n      resizeObserver.observe(element);\n\n      return () => {\n        window.cancelAnimationFrame(rAF);\n        resizeObserver.unobserve(element);\n      };\n    }\n\n    return undefined;\n  }, [element, handleResize]);\n}\n","import { forwardRef, useState } from 'react';\nimport { useScrollAreaContext } from '../ScrollArea.context';\nimport { useResizeObserver } from '../use-resize-observer';\n\ninterface ScrollAreaCornerProps extends React.ComponentPropsWithoutRef<'div'> {}\n\nexport const Corner = forwardRef<HTMLDivElement, ScrollAreaCornerProps>((props, ref) => {\n  const { style, ...others } = props;\n  const ctx = useScrollAreaContext();\n  const [width, setWidth] = useState(0);\n  const [height, setHeight] = useState(0);\n  const hasSize = Boolean(width && height);\n\n  useResizeObserver(ctx.scrollbarX, () => {\n    const h = ctx.scrollbarX?.offsetHeight || 0;\n    ctx.onCornerHeightChange(h);\n    setHeight(h);\n  });\n\n  useResizeObserver(ctx.scrollbarY, () => {\n    const w = ctx.scrollbarY?.offsetWidth || 0;\n    ctx.onCornerWidthChange(w);\n    setWidth(w);\n  });\n\n  return hasSize ? <div {...others} ref={ref} style={{ ...style, width, height }} /> : null;\n});\n\nexport const ScrollAreaCorner = forwardRef<HTMLDivElement, ScrollAreaCornerProps>((props, ref) => {\n  const ctx = useScrollAreaContext();\n  const hasBothScrollbarsVisible = Boolean(ctx.scrollbarX && ctx.scrollbarY);\n  const hasCorner = ctx.type !== 'scroll' && hasBothScrollbarsVisible;\n  return hasCorner ? <Corner {...props} ref={ref} /> : null;\n});\n","import { forwardRef, useState } from 'react';\nimport { useMergedRef } from '@mantine/hooks';\nimport { Box, BoxProps, ElementProps, Factory, useProps } from '../../../core';\nimport { ScrollAreaProvider } from '../ScrollArea.context';\n\nexport type ScrollAreaRootStylesNames =\n  | 'root'\n  | 'viewport'\n  | 'viewportInner'\n  | 'scrollbar'\n  | 'thumb'\n  | 'corner';\n\nexport type ScrollAreaRootCssVariables = {\n  root: '--sa-corner-width' | '--sa-corner-height';\n};\n\nexport interface ScrollAreaRootStylesCtx {\n  cornerWidth: number;\n  cornerHeight: number;\n}\n\nexport interface ScrollAreaRootProps extends BoxProps, ElementProps<'div'> {\n  /**\n   * Defines scrollbars behavior, `hover` by default\n   * - `hover` – scrollbars are visible when mouse is over the scroll area\n   * - `scroll` – scrollbars are visible when the scroll area is scrolled\n   * - `always` – scrollbars are always visible\n   * - `never` – scrollbars are always hidden\n   * - `auto` – similar to `overflow: auto` – scrollbars are always visible when the content is overflowing\n   * */\n  type?: 'auto' | 'always' | 'scroll' | 'hover' | 'never';\n\n  /** Axis at which scrollbars must be rendered, `'xy'` by default */\n  scrollbars?: 'x' | 'y' | 'xy' | false;\n\n  /** Scroll hide delay in ms, applicable only when type is set to `hover` or `scroll`, `1000` by default */\n  scrollHideDelay?: number;\n}\n\nexport type ScrollAreaRootFactory = Factory<{\n  props: ScrollAreaRootProps;\n  ref: HTMLDivElement;\n  stylesNames: ScrollAreaRootStylesNames;\n}>;\n\nconst defaultProps: Partial<ScrollAreaRootProps> = {\n  scrollHideDelay: 1000,\n  type: 'hover',\n};\n\nexport const ScrollAreaRoot = forwardRef<HTMLDivElement, ScrollAreaRootProps>((_props, ref) => {\n  const props = useProps('ScrollAreaRoot', defaultProps, _props);\n  const { type, scrollHideDelay, scrollbars, ...others } = props;\n\n  const [scrollArea, setScrollArea] = useState<HTMLDivElement | null>(null);\n  const [viewport, setViewport] = useState<HTMLDivElement | null>(null);\n  const [content, setContent] = useState<HTMLDivElement | null>(null);\n  const [scrollbarX, setScrollbarX] = useState<HTMLDivElement | null>(null);\n  const [scrollbarY, setScrollbarY] = useState<HTMLDivElement | null>(null);\n  const [cornerWidth, setCornerWidth] = useState(0);\n  const [cornerHeight, setCornerHeight] = useState(0);\n  const [scrollbarXEnabled, setScrollbarXEnabled] = useState(false);\n  const [scrollbarYEnabled, setScrollbarYEnabled] = useState(false);\n  const rootRef = useMergedRef(ref, (node) => setScrollArea(node));\n\n  return (\n    <ScrollAreaProvider\n      value={{\n        type: type!,\n        scrollHideDelay: scrollHideDelay!,\n        scrollArea,\n        viewport,\n        onViewportChange: setViewport,\n        content,\n        onContentChange: setContent,\n        scrollbarX,\n        onScrollbarXChange: setScrollbarX,\n        scrollbarXEnabled,\n        onScrollbarXEnabledChange: setScrollbarXEnabled,\n        scrollbarY,\n        onScrollbarYChange: setScrollbarY,\n        scrollbarYEnabled,\n        onScrollbarYEnabledChange: setScrollbarYEnabled,\n        onCornerWidthChange: setCornerWidth,\n        onCornerHeightChange: setCornerHeight,\n      }}\n    >\n      <Box\n        {...others}\n        ref={rootRef}\n        __vars={{\n          '--sa-corner-width': scrollbars !== 'xy' ? '0px' : `${cornerWidth}px`,\n          '--sa-corner-height': scrollbars !== 'xy' ? '0px' : `${cornerHeight}px`,\n        }}\n      />\n    </ScrollAreaProvider>\n  );\n});\n\nScrollAreaRoot.displayName = '@mantine/core/ScrollAreaRoot';\n","import { useCallback, useEffect, useRef } from 'react';\nimport { useCallbackRef } from '../use-callback-ref/use-callback-ref';\n\nconst noop = () => {};\n\nexport function useDebouncedCallback<T extends (...args: any[]) => any>(\n  callback: T,\n  options: number | { delay: number; flushOnUnmount?: boolean }\n) {\n  const delay = typeof options === 'number' ? options : options.delay;\n  const flushOnUnmount = typeof options === 'number' ? false : options.flushOnUnmount;\n  const handleCallback = useCallbackRef(callback);\n  const debounceTimerRef = useRef(0);\n\n  const lastCallback = Object.assign(\n    useCallback(\n      (...args: Parameters<T>) => {\n        window.clearTimeout(debounceTimerRef.current);\n        const flush = () => {\n          if (debounceTimerRef.current !== 0) {\n            debounceTimerRef.current = 0;\n            handleCallback(...args);\n          }\n        };\n        lastCallback.flush = flush;\n        debounceTimerRef.current = window.setTimeout(flush, delay);\n      },\n      [handleCallback, delay]\n    ),\n    { flush: noop }\n  );\n\n  useEffect(\n    () => () => {\n      window.clearTimeout(debounceTimerRef.current);\n      if (flushOnUnmount) {\n        lastCallback.flush();\n      }\n    },\n    [lastCallback, flushOnUnmount]\n  );\n\n  return lastCallback;\n}\n","export function getThumbRatio(viewportSize: number, contentSize: number) {\n  const ratio = viewportSize / contentSize;\n  return Number.isNaN(ratio) ? 0 : ratio;\n}\n","import type { Sizes } from '../ScrollArea.types';\nimport { getThumbRatio } from './get-thumb-ratio';\n\nexport function getThumbSize(sizes: Sizes) {\n  const ratio = getThumbRatio(sizes.viewport, sizes.content);\n  const scrollbarPadding = sizes.scrollbar.paddingStart + sizes.scrollbar.paddingEnd;\n  const thumbSize = (sizes.scrollbar.size - scrollbarPadding) * ratio;\n  return Math.max(thumbSize, 18);\n}\n","export function linearScale(input: readonly [number, number], output: readonly [number, number]) {\n  return (value: number) => {\n    if (input[0] === input[1] || output[0] === output[1]) {\n      return output[0];\n    }\n    const ratio = (output[1] - output[0]) / (input[1] - input[0]);\n    return output[0] + ratio * (value - input[0]);\n  };\n}\n","import type { Sizes } from '../ScrollArea.types';\nimport { getThumbSize } from './get-thumb-size';\nimport { linearScale } from './linear-scale';\n\nfunction clamp(value: number, [min, max]: [number, number]): number {\n  return Math.min(max, Math.max(min, value));\n}\n\nexport function getThumbOffsetFromScroll(\n  scrollPos: number,\n  sizes: Sizes,\n  dir: 'rtl' | 'ltr' = 'ltr'\n) {\n  const thumbSizePx = getThumbSize(sizes);\n  const scrollbarPadding = sizes.scrollbar.paddingStart + sizes.scrollbar.paddingEnd;\n  const scrollbar = sizes.scrollbar.size - scrollbarPadding;\n  const maxScrollPos = sizes.content - sizes.viewport;\n  const maxThumbPos = scrollbar - thumbSizePx;\n  const scrollClampRange = dir === 'ltr' ? [0, maxScrollPos] : [maxScrollPos * -1, 0];\n  const scrollWithoutMomentum = clamp(scrollPos, scrollClampRange as [number, number]);\n  const interpolate = linearScale([0, maxScrollPos], [0, maxThumbPos]);\n  return interpolate(scrollWithoutMomentum);\n}\n","export function isScrollingWithinScrollbarBounds(scrollPos: number, maxScrollPos: number) {\n  return scrollPos > 0 && scrollPos < maxScrollPos;\n}\n","export function toInt(value?: string) {\n  return value ? parseInt(value, 10) : 0;\n}\n","export function composeEventHandlers<E>(\n  originalEventHandler?: (event: E) => void,\n  ourEventHandler?: (event: E) => void,\n  { checkForDefaultPrevented = true } = {}\n) {\n  return (event: E) => {\n    originalEventHandler?.(event);\n\n    if (checkForDefaultPrevented === false || !(event as unknown as Event).defaultPrevented) {\n      ourEventHandler?.(event);\n    }\n  };\n}\n","import { createSafeContext } from '../../../core';\n\nexport interface ScrollbarContextValue {\n  hasThumb: boolean;\n  scrollbar: HTMLDivElement | null;\n  onThumbChange: (thumb: HTMLDivElement | null) => void;\n  onThumbPointerUp: () => void;\n  onThumbPointerDown: (pointerPos: { x: number; y: number }) => void;\n  onThumbPositionChange: () => void;\n}\n\nexport const [ScrollbarProvider, useScrollbarContext] = createSafeContext<ScrollbarContextValue>(\n  'ScrollAreaScrollbar was not found in tree'\n);\n","import { forwardRef, useEffect, useRef, useState } from 'react';\nimport { useCallbackRef, useDebouncedCallback, useMergedRef } from '@mantine/hooks';\nimport { useScrollAreaContext } from '../ScrollArea.context';\nimport { Sizes } from '../ScrollArea.types';\nimport { useResizeObserver } from '../use-resize-observer';\nimport { composeEventHandlers } from '../utils';\nimport { ScrollbarContextValue, ScrollbarProvider } from './Scrollbar.context';\n\nexport interface ScrollbarPrivateProps {\n  sizes: Sizes;\n  hasThumb: boolean;\n  onThumbChange: ScrollbarContextValue['onThumbChange'];\n  onThumbPointerUp: ScrollbarContextValue['onThumbPointerUp'];\n  onThumbPointerDown: ScrollbarContextValue['onThumbPointerDown'];\n  onThumbPositionChange: ScrollbarContextValue['onThumbPositionChange'];\n  onWheelScroll: (event: WheelEvent, maxScrollPos: number) => void;\n  onDragScroll: (pointerPos: { x: number; y: number }) => void;\n  onResize: () => void;\n}\n\ninterface ScrollbarProps\n  extends ScrollbarPrivateProps,\n    Omit<React.ComponentPropsWithoutRef<'div'>, 'onResize'> {}\n\nexport const Scrollbar = forwardRef<HTMLDivElement, ScrollbarProps>((props, forwardedRef) => {\n  const {\n    sizes,\n    hasThumb,\n    onThumbChange,\n    onThumbPointerUp,\n    onThumbPointerDown,\n    onThumbPositionChange,\n    onDragScroll,\n    onWheelScroll,\n    onResize,\n    ...scrollbarProps\n  } = props;\n  const context = useScrollAreaContext();\n  const [scrollbar, setScrollbar] = useState<HTMLDivElement | null>(null);\n  const composeRefs = useMergedRef(forwardedRef, (node) => setScrollbar(node));\n  const rectRef = useRef<DOMRect | null>(null);\n  const prevWebkitUserSelectRef = useRef<string>('');\n  const { viewport } = context;\n  const maxScrollPos = sizes.content - sizes.viewport;\n  const handleWheelScroll = useCallbackRef(onWheelScroll);\n  const handleThumbPositionChange = useCallbackRef(onThumbPositionChange);\n  const handleResize = useDebouncedCallback(onResize, 10);\n\n  const handleDragScroll = (event: React.PointerEvent<HTMLElement>) => {\n    if (rectRef.current) {\n      const x = event.clientX - rectRef.current.left;\n      const y = event.clientY - rectRef.current.top;\n      onDragScroll({ x, y });\n    }\n  };\n\n  useEffect(() => {\n    const handleWheel = (event: WheelEvent) => {\n      const element = event.target as HTMLElement;\n      const isScrollbarWheel = scrollbar?.contains(element);\n      if (isScrollbarWheel) {\n        handleWheelScroll(event, maxScrollPos);\n      }\n    };\n    document.addEventListener('wheel', handleWheel, { passive: false });\n    return () => document.removeEventListener('wheel', handleWheel, { passive: false } as any);\n  }, [viewport, scrollbar, maxScrollPos, handleWheelScroll]);\n\n  useEffect(handleThumbPositionChange, [sizes, handleThumbPositionChange]);\n\n  useResizeObserver(scrollbar, handleResize);\n  useResizeObserver(context.content, handleResize);\n\n  return (\n    <ScrollbarProvider\n      value={{\n        scrollbar,\n        hasThumb,\n        onThumbChange: useCallbackRef(onThumbChange),\n        onThumbPointerUp: useCallbackRef(onThumbPointerUp),\n        onThumbPositionChange: handleThumbPositionChange,\n        onThumbPointerDown: useCallbackRef(onThumbPointerDown),\n      }}\n    >\n      <div\n        {...scrollbarProps}\n        ref={composeRefs}\n        data-mantine-scrollbar\n        style={{ position: 'absolute', ...scrollbarProps.style }}\n        onPointerDown={composeEventHandlers(props.onPointerDown, (event) => {\n          event.preventDefault();\n\n          const mainPointer = 0;\n          if (event.button === mainPointer) {\n            const element = event.target as HTMLElement;\n            element.setPointerCapture(event.pointerId);\n            rectRef.current = scrollbar!.getBoundingClientRect();\n            prevWebkitUserSelectRef.current = document.body.style.webkitUserSelect;\n            document.body.style.webkitUserSelect = 'none';\n            handleDragScroll(event);\n          }\n        })}\n        onPointerMove={composeEventHandlers(props.onPointerMove, handleDragScroll)}\n        onPointerUp={composeEventHandlers(props.onPointerUp, (event) => {\n          const element = event.target as HTMLElement;\n          if (element.hasPointerCapture(event.pointerId)) {\n            event.preventDefault();\n            element.releasePointerCapture(event.pointerId);\n          }\n        })}\n        onLostPointerCapture={() => {\n          document.body.style.webkitUserSelect = prevWebkitUserSelectRef.current;\n          rectRef.current = null;\n        }}\n      />\n    </ScrollbarProvider>\n  );\n});\n","import { forwardRef, useEffect, useRef, useState } from 'react';\nimport { useMergedRef } from '@mantine/hooks';\nimport { useScrollAreaContext } from '../ScrollArea.context';\nimport { ScrollAreaScrollbarAxisProps } from '../ScrollArea.types';\nimport { getThumbSize, isScrollingWithinScrollbarBounds, toInt } from '../utils';\nimport { Scrollbar } from './Scrollbar';\n\nexport const ScrollAreaScrollbarX = forwardRef<HTMLDivElement, ScrollAreaScrollbarAxisProps>(\n  (props, forwardedRef) => {\n    const { sizes, onSizesChange, style, ...others } = props;\n    const ctx = useScrollAreaContext();\n    const [computedStyle, setComputedStyle] = useState<CSSStyleDeclaration>();\n    const ref = useRef<HTMLDivElement>(null);\n    const composeRefs = useMergedRef(forwardedRef, ref, ctx.onScrollbarXChange);\n\n    useEffect(() => {\n      if (ref.current) {\n        setComputedStyle(getComputedStyle(ref.current));\n      }\n    }, [ref]);\n\n    return (\n      <Scrollbar\n        data-orientation=\"horizontal\"\n        {...others}\n        ref={composeRefs}\n        sizes={sizes}\n        style={{\n          ...style,\n          ['--sa-thumb-width' as any]: `${getThumbSize(sizes)}px`,\n        }}\n        onThumbPointerDown={(pointerPos) => props.onThumbPointerDown(pointerPos.x)}\n        onDragScroll={(pointerPos) => props.onDragScroll(pointerPos.x)}\n        onWheelScroll={(event, maxScrollPos) => {\n          if (ctx.viewport) {\n            const scrollPos = ctx.viewport.scrollLeft + event.deltaX;\n            props.onWheelScroll(scrollPos);\n            if (isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos)) {\n              event.preventDefault();\n            }\n          }\n        }}\n        onResize={() => {\n          if (ref.current && ctx.viewport && computedStyle) {\n            onSizesChange({\n              content: ctx.viewport.scrollWidth,\n              viewport: ctx.viewport.offsetWidth,\n              scrollbar: {\n                size: ref.current.clientWidth,\n                paddingStart: toInt(computedStyle.paddingLeft),\n                paddingEnd: toInt(computedStyle.paddingRight),\n              },\n            });\n          }\n        }}\n      />\n    );\n  }\n);\n\nScrollAreaScrollbarX.displayName = '@mantine/core/ScrollAreaScrollbarX';\n","import { forwardRef, useEffect, useRef, useState } from 'react';\nimport { useMergedRef } from '@mantine/hooks';\nimport { useScrollAreaContext } from '../ScrollArea.context';\nimport { ScrollAreaScrollbarAxisProps } from '../ScrollArea.types';\nimport { getThumbSize, isScrollingWithinScrollbarBounds, toInt } from '../utils';\nimport { Scrollbar } from './Scrollbar';\n\nexport const ScrollAreaScrollbarY = forwardRef<HTMLDivElement, ScrollAreaScrollbarAxisProps>(\n  (props, forwardedRef) => {\n    const { sizes, onSizesChange, style, ...others } = props;\n    const context = useScrollAreaContext();\n    const [computedStyle, setComputedStyle] = useState<CSSStyleDeclaration>();\n    const ref = useRef<HTMLDivElement>(null);\n    const composeRefs = useMergedRef(forwardedRef, ref, context.onScrollbarYChange);\n\n    useEffect(() => {\n      if (ref.current) {\n        setComputedStyle(window.getComputedStyle(ref.current));\n      }\n    }, []);\n\n    return (\n      <Scrollbar\n        {...others}\n        data-orientation=\"vertical\"\n        ref={composeRefs}\n        sizes={sizes}\n        style={{\n          ['--sa-thumb-height' as any]: `${getThumbSize(sizes)}px`,\n          ...style,\n        }}\n        onThumbPointerDown={(pointerPos) => props.onThumbPointerDown(pointerPos.y)}\n        onDragScroll={(pointerPos) => props.onDragScroll(pointerPos.y)}\n        onWheelScroll={(event, maxScrollPos) => {\n          if (context.viewport) {\n            const scrollPos = context.viewport.scrollTop + event.deltaY;\n            props.onWheelScroll(scrollPos);\n            if (isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos)) {\n              event.preventDefault();\n            }\n          }\n        }}\n        onResize={() => {\n          if (ref.current && context.viewport && computedStyle) {\n            onSizesChange({\n              content: context.viewport.scrollHeight,\n              viewport: context.viewport.offsetHeight,\n              scrollbar: {\n                size: ref.current.clientHeight,\n                paddingStart: toInt(computedStyle.paddingTop),\n                paddingEnd: toInt(computedStyle.paddingBottom),\n              },\n            });\n          }\n        }}\n      />\n    );\n  }\n);\n\nScrollAreaScrollbarY.displayName = '@mantine/core/ScrollAreaScrollbarY';\n","import { forwardRef, useRef, useState } from 'react';\nimport { useDirection } from '../../../core';\nimport { useScrollAreaContext } from '../ScrollArea.context';\nimport {\n  ScrollAreaScrollbarAxisPrivateProps,\n  ScrollAreaScrollbarAxisProps,\n  Sizes,\n} from '../ScrollArea.types';\nimport { getScrollPositionFromPointer, getThumbOffsetFromScroll, getThumbRatio } from '../utils';\nimport { ScrollAreaScrollbarX } from './ScrollbarX';\nimport { ScrollAreaScrollbarY } from './ScrollbarY';\n\nexport interface ScrollAreaScrollbarVisibleProps\n  extends Omit<ScrollAreaScrollbarAxisProps, keyof ScrollAreaScrollbarAxisPrivateProps> {\n  orientation?: 'horizontal' | 'vertical';\n}\n\nexport const ScrollAreaScrollbarVisible = forwardRef<\n  HTMLDivElement,\n  ScrollAreaScrollbarVisibleProps\n>((props, forwardedRef) => {\n  const { orientation = 'vertical', ...scrollbarProps } = props;\n  const { dir } = useDirection();\n  const context = useScrollAreaContext();\n  const thumbRef = useRef<HTMLDivElement | null>(null);\n  const pointerOffsetRef = useRef(0);\n  const [sizes, setSizes] = useState<Sizes>({\n    content: 0,\n    viewport: 0,\n    scrollbar: { size: 0, paddingStart: 0, paddingEnd: 0 },\n  });\n\n  const thumbRatio = getThumbRatio(sizes.viewport, sizes.content);\n\n  const commonProps: Omit<\n    ScrollAreaScrollbarAxisPrivateProps,\n    'onThumbPositionChange' | 'onDragScroll' | 'onWheelScroll'\n  > = {\n    ...scrollbarProps,\n    sizes,\n    onSizesChange: setSizes,\n    hasThumb: Boolean(thumbRatio > 0 && thumbRatio < 1),\n    onThumbChange: (thumb) => {\n      thumbRef.current = thumb;\n    },\n    onThumbPointerUp: () => {\n      pointerOffsetRef.current = 0;\n    },\n    onThumbPointerDown: (pointerPos) => {\n      pointerOffsetRef.current = pointerPos;\n    },\n  };\n\n  const getScrollPosition = (pointerPos: number, direction?: 'ltr' | 'rtl') =>\n    getScrollPositionFromPointer(pointerPos, pointerOffsetRef.current, sizes, direction);\n\n  if (orientation === 'horizontal') {\n    return (\n      <ScrollAreaScrollbarX\n        {...commonProps}\n        ref={forwardedRef}\n        onThumbPositionChange={() => {\n          if (context.viewport && thumbRef.current) {\n            const scrollPos = context.viewport.scrollLeft;\n            const offset = getThumbOffsetFromScroll(scrollPos, sizes, dir);\n            thumbRef.current.style.transform = `translate3d(${offset}px, 0, 0)`;\n          }\n        }}\n        onWheelScroll={(scrollPos) => {\n          if (context.viewport) {\n            context.viewport.scrollLeft = scrollPos;\n          }\n        }}\n        onDragScroll={(pointerPos) => {\n          if (context.viewport) {\n            context.viewport.scrollLeft = getScrollPosition(pointerPos, dir);\n          }\n        }}\n      />\n    );\n  }\n\n  if (orientation === 'vertical') {\n    return (\n      <ScrollAreaScrollbarY\n        {...commonProps}\n        ref={forwardedRef}\n        onThumbPositionChange={() => {\n          if (context.viewport && thumbRef.current) {\n            const scrollPos = context.viewport.scrollTop;\n            const offset = getThumbOffsetFromScroll(scrollPos, sizes);\n            if (sizes.scrollbar.size === 0) {\n              thumbRef.current.style.setProperty('--thumb-opacity', '0');\n            } else {\n              thumbRef.current.style.setProperty('--thumb-opacity', '1');\n            }\n            thumbRef.current.style.transform = `translate3d(0, ${offset}px, 0)`;\n          }\n        }}\n        onWheelScroll={(scrollPos) => {\n          if (context.viewport) {\n            context.viewport.scrollTop = scrollPos;\n          }\n        }}\n        onDragScroll={(pointerPos) => {\n          if (context.viewport) {\n            context.viewport.scrollTop = getScrollPosition(pointerPos);\n          }\n        }}\n      />\n    );\n  }\n\n  return null;\n});\n\nScrollAreaScrollbarVisible.displayName = '@mantine/core/ScrollAreaScrollbarVisible';\n","import type { Sizes } from '../ScrollArea.types';\nimport { getThumbSize } from './get-thumb-size';\nimport { linearScale } from './linear-scale';\n\nexport function getScrollPositionFromPointer(\n  pointerPos: number,\n  pointerOffset: number,\n  sizes: Sizes,\n  dir: 'ltr' | 'rtl' = 'ltr'\n) {\n  const thumbSizePx = getThumbSize(sizes);\n  const thumbCenter = thumbSizePx / 2;\n  const offset = pointerOffset || thumbCenter;\n  const thumbOffsetFromEnd = thumbSizePx - offset;\n  const minPointerPos = sizes.scrollbar.paddingStart + offset;\n  const maxPointerPos = sizes.scrollbar.size - sizes.scrollbar.paddingEnd - thumbOffsetFromEnd;\n  const maxScrollPos = sizes.content - sizes.viewport;\n  const scrollRange = dir === 'ltr' ? [0, maxScrollPos] : [maxScrollPos * -1, 0];\n  const interpolate = linearScale([minPointerPos, maxPointerPos], scrollRange as [number, number]);\n  return interpolate(pointerPos);\n}\n","import { forwardRef, useState } from 'react';\nimport { useDebouncedCallback } from '@mantine/hooks';\nimport { useScrollAreaContext } from '../ScrollArea.context';\nimport { useResizeObserver } from '../use-resize-observer';\nimport {\n  ScrollAreaScrollbarVisible,\n  ScrollAreaScrollbarVisibleProps,\n} from './ScrollAreaScrollbarVisible';\n\nexport interface ScrollAreaScrollbarAutoProps extends ScrollAreaScrollbarVisibleProps {\n  forceMount?: true;\n}\n\nexport const ScrollAreaScrollbarAuto = forwardRef<HTMLDivElement, ScrollAreaScrollbarAutoProps>(\n  (props, ref) => {\n    const context = useScrollAreaContext();\n    const { forceMount, ...scrollbarProps } = props;\n    const [visible, setVisible] = useState(false);\n    const isHorizontal = props.orientation === 'horizontal';\n\n    const handleResize = useDebouncedCallback(() => {\n      if (context.viewport) {\n        const isOverflowX = context.viewport.offsetWidth < context.viewport.scrollWidth;\n        const isOverflowY = context.viewport.offsetHeight < context.viewport.scrollHeight;\n        setVisible(isHorizontal ? isOverflowX : isOverflowY);\n      }\n    }, 10);\n\n    useResizeObserver(context.viewport, handleResize);\n    useResizeObserver(context.content, handleResize);\n\n    if (forceMount || visible) {\n      return (\n        <ScrollAreaScrollbarVisible\n          data-state={visible ? 'visible' : 'hidden'}\n          {...scrollbarProps}\n          ref={ref}\n        />\n      );\n    }\n\n    return null;\n  }\n);\n\nScrollAreaScrollbarAuto.displayName = '@mantine/core/ScrollAreaScrollbarAuto';\n","import { forwardRef, useEffect, useState } from 'react';\nimport { useScrollAreaContext } from '../ScrollArea.context';\nimport { ScrollAreaScrollbarAuto, ScrollAreaScrollbarAutoProps } from './ScrollAreaScrollbarAuto';\n\ninterface ScrollAreaScrollbarHoverProps extends ScrollAreaScrollbarAutoProps {\n  forceMount?: true;\n}\n\nexport const ScrollAreaScrollbarHover = forwardRef<HTMLDivElement, ScrollAreaScrollbarHoverProps>(\n  (props, ref) => {\n    const { forceMount, ...scrollbarProps } = props;\n    const context = useScrollAreaContext();\n    const [visible, setVisible] = useState(false);\n\n    useEffect(() => {\n      const { scrollArea } = context;\n      let hideTimer = 0;\n      if (scrollArea) {\n        const handlePointerEnter = () => {\n          window.clearTimeout(hideTimer);\n          setVisible(true);\n        };\n        const handlePointerLeave = () => {\n          hideTimer = window.setTimeout(() => setVisible(false), context.scrollHideDelay);\n        };\n        scrollArea.addEventListener('pointerenter', handlePointerEnter);\n        scrollArea.addEventListener('pointerleave', handlePointerLeave);\n\n        return () => {\n          window.clearTimeout(hideTimer);\n          scrollArea.removeEventListener('pointerenter', handlePointerEnter);\n          scrollArea.removeEventListener('pointerleave', handlePointerLeave);\n        };\n      }\n\n      return undefined;\n    }, [context.scrollArea, context.scrollHideDelay]);\n\n    if (forceMount || visible) {\n      return (\n        <ScrollAreaScrollbarAuto\n          data-state={visible ? 'visible' : 'hidden'}\n          {...scrollbarProps}\n          ref={ref}\n        />\n      );\n    }\n\n    return null;\n  }\n);\n\nScrollAreaScrollbarHover.displayName = '@mantine/core/ScrollAreaScrollbarHover';\n","import { forwardRef, useEffect, useState } from 'react';\nimport { useDebouncedCallback } from '@mantine/hooks';\nimport { useScrollAreaContext } from '../ScrollArea.context';\nimport { composeEventHandlers } from '../utils';\nimport {\n  ScrollAreaScrollbarVisible,\n  ScrollAreaScrollbarVisibleProps,\n} from './ScrollAreaScrollbarVisible';\n\ninterface ScrollAreaScrollbarScrollProps extends ScrollAreaScrollbarVisibleProps {\n  forceMount?: true;\n}\n\nexport const ScrollAreaScrollbarScroll = forwardRef<HTMLDivElement, ScrollAreaScrollbarScrollProps>(\n  (props, red) => {\n    const { forceMount, ...scrollbarProps } = props;\n    const context = useScrollAreaContext();\n    const isHorizontal = props.orientation === 'horizontal';\n    const [state, setState] = useState<'hidden' | 'idle' | 'interacting' | 'scrolling'>('hidden');\n    const debounceScrollEnd = useDebouncedCallback(() => setState('idle'), 100);\n\n    useEffect(() => {\n      if (state === 'idle') {\n        const hideTimer = window.setTimeout(() => setState('hidden'), context.scrollHideDelay);\n        return () => window.clearTimeout(hideTimer);\n      }\n\n      return undefined;\n    }, [state, context.scrollHideDelay]);\n\n    useEffect(() => {\n      const { viewport } = context;\n      const scrollDirection = isHorizontal ? 'scrollLeft' : 'scrollTop';\n\n      if (viewport) {\n        let prevScrollPos = viewport[scrollDirection];\n        const handleScroll = () => {\n          const scrollPos = viewport[scrollDirection];\n          const hasScrollInDirectionChanged = prevScrollPos !== scrollPos;\n          if (hasScrollInDirectionChanged) {\n            setState('scrolling');\n            debounceScrollEnd();\n          }\n          prevScrollPos = scrollPos;\n        };\n        viewport.addEventListener('scroll', handleScroll);\n        return () => viewport.removeEventListener('scroll', handleScroll);\n      }\n\n      return undefined;\n    }, [context.viewport, isHorizontal, debounceScrollEnd]);\n\n    if (forceMount || state !== 'hidden') {\n      return (\n        <ScrollAreaScrollbarVisible\n          data-state={state === 'hidden' ? 'hidden' : 'visible'}\n          {...scrollbarProps}\n          ref={red}\n          onPointerEnter={composeEventHandlers(props.onPointerEnter, () => setState('interacting'))}\n          onPointerLeave={composeEventHandlers(props.onPointerLeave, () => setState('idle'))}\n        />\n      );\n    }\n\n    return null;\n  }\n);\n","import { forwardRef, useEffect } from 'react';\nimport { useScrollAreaContext } from '../ScrollArea.context';\nimport { ScrollAreaScrollbarAuto } from './ScrollAreaScrollbarAuto';\nimport { ScrollAreaScrollbarHover } from './ScrollAreaScrollbarHover';\nimport { ScrollAreaScrollbarScroll } from './ScrollAreaScrollbarScroll';\nimport {\n  ScrollAreaScrollbarVisible,\n  ScrollAreaScrollbarVisibleProps,\n} from './ScrollAreaScrollbarVisible';\n\ninterface ScrollAreaScrollbarProps extends ScrollAreaScrollbarVisibleProps {\n  forceMount?: true;\n}\n\nexport const ScrollAreaScrollbar = forwardRef<HTMLDivElement, ScrollAreaScrollbarProps>(\n  (props, forwardedRef) => {\n    const { forceMount, ...scrollbarProps } = props;\n    const context = useScrollAreaContext();\n    const { onScrollbarXEnabledChange, onScrollbarYEnabledChange } = context;\n    const isHorizontal = props.orientation === 'horizontal';\n\n    useEffect(() => {\n      isHorizontal ? onScrollbarXEnabledChange(true) : onScrollbarYEnabledChange(true);\n      return () => {\n        isHorizontal ? onScrollbarXEnabledChange(false) : onScrollbarYEnabledChange(false);\n      };\n    }, [isHorizontal, onScrollbarXEnabledChange, onScrollbarYEnabledChange]);\n\n    return context.type === 'hover' ? (\n      <ScrollAreaScrollbarHover {...scrollbarProps} ref={forwardedRef} forceMount={forceMount} />\n    ) : context.type === 'scroll' ? (\n      <ScrollAreaScrollbarScroll {...scrollbarProps} ref={forwardedRef} forceMount={forceMount} />\n    ) : context.type === 'auto' ? (\n      <ScrollAreaScrollbarAuto {...scrollbarProps} ref={forwardedRef} forceMount={forceMount} />\n    ) : context.type === 'always' ? (\n      <ScrollAreaScrollbarVisible {...scrollbarProps} ref={forwardedRef} />\n    ) : null;\n  }\n);\n\nScrollAreaScrollbar.displayName = '@mantine/core/ScrollAreaScrollbar';\n","import { forwardRef, useEffect, useRef } from 'react';\nimport { useDebouncedCallback, useMergedRef } from '@mantine/hooks';\nimport { useScrollAreaContext } from '../ScrollArea.context';\nimport { useScrollbarContext } from '../ScrollAreaScrollbar/Scrollbar.context';\nimport { addUnlinkedScrollListener, composeEventHandlers } from '../utils';\n\ninterface ThumbProps extends React.ComponentPropsWithoutRef<'div'> {}\n\nexport const Thumb = forwardRef<HTMLDivElement, ThumbProps>((props, forwardedRef) => {\n  const { style, ...others } = props;\n  const scrollAreaContext = useScrollAreaContext();\n  const scrollbarContext = useScrollbarContext();\n  const { onThumbPositionChange } = scrollbarContext;\n  const composedRef = useMergedRef(forwardedRef, (node) => scrollbarContext.onThumbChange(node));\n  const removeUnlinkedScrollListenerRef = useRef<(() => void) | undefined>(undefined);\n  const debounceScrollEnd = useDebouncedCallback(() => {\n    if (removeUnlinkedScrollListenerRef.current) {\n      removeUnlinkedScrollListenerRef.current();\n      removeUnlinkedScrollListenerRef.current = undefined;\n    }\n  }, 100);\n\n  useEffect(() => {\n    const { viewport } = scrollAreaContext;\n    if (viewport) {\n      const handleScroll = () => {\n        debounceScrollEnd();\n        if (!removeUnlinkedScrollListenerRef.current) {\n          const listener = addUnlinkedScrollListener(viewport, onThumbPositionChange);\n          removeUnlinkedScrollListenerRef.current = listener;\n          onThumbPositionChange();\n        }\n      };\n      onThumbPositionChange();\n      viewport.addEventListener('scroll', handleScroll);\n      return () => viewport.removeEventListener('scroll', handleScroll);\n    }\n\n    return undefined;\n  }, [scrollAreaContext.viewport, debounceScrollEnd, onThumbPositionChange]);\n\n  return (\n    <div\n      data-state={scrollbarContext.hasThumb ? 'visible' : 'hidden'}\n      {...others}\n      ref={composedRef}\n      style={{\n        width: 'var(--sa-thumb-width)',\n        height: 'var(--sa-thumb-height)',\n        ...style,\n      }}\n      onPointerDownCapture={composeEventHandlers(props.onPointerDownCapture, (event) => {\n        const thumb = event.target as HTMLElement;\n        const thumbRect = thumb.getBoundingClientRect();\n        const x = event.clientX - thumbRect.left;\n        const y = event.clientY - thumbRect.top;\n        scrollbarContext.onThumbPointerDown({ x, y });\n      })}\n      onPointerUp={composeEventHandlers(props.onPointerUp, scrollbarContext.onThumbPointerUp)}\n    />\n  );\n});\n\nThumb.displayName = '@mantine/core/ScrollAreaThumb';\n\ninterface ScrollAreaThumbProps extends ThumbProps {\n  forceMount?: true;\n}\n\nexport const ScrollAreaThumb = forwardRef<HTMLDivElement, ScrollAreaThumbProps>(\n  (props, forwardedRef) => {\n    const { forceMount, ...thumbProps } = props;\n    const scrollbarContext = useScrollbarContext();\n\n    if (forceMount || scrollbarContext.hasThumb) {\n      return <Thumb ref={forwardedRef} {...thumbProps} />;\n    }\n\n    return null;\n  }\n);\n\nScrollAreaThumb.displayName = '@mantine/core/ScrollAreaThumb';\n","export function addUnlinkedScrollListener(node: HTMLElement, handler = () => {}) {\n  let prevPosition = { left: node.scrollLeft, top: node.scrollTop };\n  let rAF = 0;\n  (function loop() {\n    const position = { left: node.scrollLeft, top: node.scrollTop };\n    const isHorizontalScroll = prevPosition.left !== position.left;\n    const isVerticalScroll = prevPosition.top !== position.top;\n    if (isHorizontalScroll || isVerticalScroll) {\n      handler();\n    }\n    prevPosition = position;\n    rAF = window.requestAnimationFrame(loop);\n  })();\n  return () => window.cancelAnimationFrame(rAF);\n}\n","import { forwardRef } from 'react';\nimport { useMergedRef } from '@mantine/hooks';\nimport { Box, BoxProps, ElementProps } from '../../../core';\nimport { useScrollAreaContext } from '../ScrollArea.context';\n\nexport interface ScrollAreaViewportProps extends BoxProps, ElementProps<'div'> {}\n\nexport const ScrollAreaViewport = forwardRef<HTMLDivElement, ScrollAreaViewportProps>(\n  ({ children, style, ...others }, ref) => {\n    const ctx = useScrollAreaContext();\n    const rootRef = useMergedRef(ref, ctx.onViewportChange);\n\n    return (\n      <Box\n        {...others}\n        ref={rootRef}\n        style={{\n          overflowX: ctx.scrollbarXEnabled ? 'scroll' : 'hidden',\n          overflowY: ctx.scrollbarYEnabled ? 'scroll' : 'hidden',\n          ...style,\n        }}\n      >\n        <div style={{ minWidth: '100%', display: 'table' }} ref={ctx.onContentChange}>\n          {children}\n        </div>\n      </Box>\n    );\n  }\n);\n\nScrollAreaViewport.displayName = '@mantine/core/ScrollAreaViewport';\n","import { useEffect, useRef, useState } from 'react';\nimport { useMergeRefs } from '@floating-ui/react';\nimport {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  factory,\n  Factory,\n  rem,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../core';\nimport { ScrollAreaCorner } from './ScrollAreaCorner/ScrollAreaCorner';\nimport { ScrollAreaRoot } from './ScrollAreaRoot/ScrollAreaRoot';\nimport { ScrollAreaScrollbar } from './ScrollAreaScrollbar/ScrollAreaScrollbar';\nimport { ScrollAreaThumb } from './ScrollAreaThumb/ScrollAreaThumb';\nimport { ScrollAreaViewport } from './ScrollAreaViewport/ScrollAreaViewport';\nimport classes from './ScrollArea.module.css';\n\nexport type ScrollAreaStylesNames = 'root' | 'viewport' | 'scrollbar' | 'thumb' | 'corner';\nexport type ScrollAreaCssVariables = {\n  root: '--scrollarea-scrollbar-size';\n};\n\nexport interface ScrollAreaProps\n  extends BoxProps,\n    StylesApiProps<ScrollAreaFactory>,\n    ElementProps<'div'> {\n  /** Scrollbar size, any valid CSS value for width/height, numbers are converted to rem, default value is 0.75rem */\n  scrollbarSize?: number | string;\n\n  /**\n   * Defines scrollbars behavior, `hover` by default\n   * - `hover` – scrollbars are visible when mouse is over the scroll area\n   * - `scroll` – scrollbars are visible when the scroll area is scrolled\n   * - `always` – scrollbars are always visible\n   * - `never` – scrollbars are always hidden\n   * - `auto` – similar to `overflow: auto` – scrollbars are always visible when the content is overflowing\n   * */\n  type?: 'auto' | 'always' | 'scroll' | 'hover' | 'never';\n\n  /** Scroll hide delay in ms, applicable only when type is set to `hover` or `scroll`, `1000` by default */\n  scrollHideDelay?: number;\n\n  /** Axis at which scrollbars must be rendered, `'xy'` by default */\n  scrollbars?: 'x' | 'y' | 'xy' | false;\n\n  /** Determines whether scrollbars should be offset with padding on given axis, `false` by default */\n  offsetScrollbars?: boolean | 'x' | 'y' | 'present';\n\n  /** Assigns viewport element (scrollable container) ref */\n  viewportRef?: React.ForwardedRef<HTMLDivElement>;\n\n  /** Props passed down to the viewport element */\n  viewportProps?: React.ComponentPropsWithRef<'div'>;\n\n  /** Called with current position (`x` and `y` coordinates) when viewport is scrolled */\n  onScrollPositionChange?: (position: { x: number; y: number }) => void;\n\n  /** Called when scrollarea is scrolled all the way to the bottom */\n  onBottomReached?: () => void;\n\n  /** Called when scrollarea is scrolled all the way to the top */\n  onTopReached?: () => void;\n\n  /** Defines `overscroll-behavior` of the viewport */\n  overscrollBehavior?: React.CSSProperties['overscrollBehavior'];\n}\n\nexport interface ScrollAreaAutosizeProps extends ScrollAreaProps {}\n\nexport type ScrollAreaFactory = Factory<{\n  props: ScrollAreaProps;\n  ref: HTMLDivElement;\n  stylesNames: ScrollAreaStylesNames;\n  vars: ScrollAreaCssVariables;\n  staticComponents: {\n    Autosize: typeof ScrollAreaAutosize;\n  };\n}>;\n\nconst defaultProps: Partial<ScrollAreaProps> = {\n  scrollHideDelay: 1000,\n  type: 'hover',\n  scrollbars: 'xy',\n};\n\nconst varsResolver = createVarsResolver<ScrollAreaFactory>(\n  (_, { scrollbarSize, overscrollBehavior }) => ({\n    root: {\n      '--scrollarea-scrollbar-size': rem(scrollbarSize),\n      '--scrollarea-over-scroll-behavior': overscrollBehavior,\n    },\n  })\n);\n\nexport const ScrollArea = factory<ScrollAreaFactory>((_props, ref) => {\n  const props = useProps('ScrollArea', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    scrollbarSize,\n    vars,\n    type,\n    scrollHideDelay,\n    viewportProps,\n    viewportRef,\n    onScrollPositionChange,\n    children,\n    offsetScrollbars,\n    scrollbars,\n    onBottomReached,\n    onTopReached,\n    overscrollBehavior,\n    ...others\n  } = props;\n\n  const [scrollbarHovered, setScrollbarHovered] = useState(false);\n  const [verticalThumbVisible, setVerticalThumbVisible] = useState(false);\n  const [horizontalThumbVisible, setHorizontalThumbVisible] = useState(false);\n\n  const getStyles = useStyles<ScrollAreaFactory>({\n    name: 'ScrollArea',\n    props,\n    classes,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n  });\n\n  const localViewportRef = useRef<HTMLDivElement>(null);\n  const combinedViewportRef = useMergeRefs([viewportRef, localViewportRef]);\n\n  useEffect(() => {\n    if (!localViewportRef.current) {\n      return;\n    }\n\n    if (offsetScrollbars !== 'present') {\n      return;\n    }\n\n    const element = localViewportRef.current;\n\n    const observer = new ResizeObserver(() => {\n      const { scrollHeight, clientHeight, scrollWidth, clientWidth } = element;\n      setVerticalThumbVisible(scrollHeight > clientHeight);\n      setHorizontalThumbVisible(scrollWidth > clientWidth);\n    });\n\n    observer.observe(element);\n\n    return () => observer.disconnect();\n  }, [localViewportRef, offsetScrollbars]);\n\n  return (\n    <ScrollAreaRoot\n      type={type === 'never' ? 'always' : type}\n      scrollHideDelay={scrollHideDelay}\n      ref={ref}\n      scrollbars={scrollbars}\n      {...getStyles('root')}\n      {...others}\n    >\n      <ScrollAreaViewport\n        {...viewportProps}\n        {...getStyles('viewport', { style: viewportProps?.style })}\n        ref={combinedViewportRef}\n        data-offset-scrollbars={offsetScrollbars === true ? 'xy' : offsetScrollbars || undefined}\n        data-scrollbars={scrollbars || undefined}\n        data-horizontal-hidden={\n          offsetScrollbars === 'present' && !horizontalThumbVisible ? 'true' : undefined\n        }\n        data-vertical-hidden={\n          offsetScrollbars === 'present' && !verticalThumbVisible ? 'true' : undefined\n        }\n        onScroll={(e) => {\n          viewportProps?.onScroll?.(e);\n          onScrollPositionChange?.({ x: e.currentTarget.scrollLeft, y: e.currentTarget.scrollTop });\n          const { scrollTop, scrollHeight, clientHeight } = e.currentTarget;\n          if (scrollTop - (scrollHeight - clientHeight) >= 0) {\n            onBottomReached?.();\n          }\n          if (scrollTop === 0) {\n            onTopReached?.();\n          }\n        }}\n      >\n        {children}\n      </ScrollAreaViewport>\n\n      {(scrollbars === 'xy' || scrollbars === 'x') && (\n        <ScrollAreaScrollbar\n          {...getStyles('scrollbar')}\n          orientation=\"horizontal\"\n          data-hidden={type === 'never' || !horizontalThumbVisible || undefined}\n          forceMount\n          onMouseEnter={() => setScrollbarHovered(true)}\n          onMouseLeave={() => setScrollbarHovered(false)}\n        >\n          <ScrollAreaThumb {...getStyles('thumb')} />\n        </ScrollAreaScrollbar>\n      )}\n\n      {(scrollbars === 'xy' || scrollbars === 'y') && (\n        <ScrollAreaScrollbar\n          {...getStyles('scrollbar')}\n          orientation=\"vertical\"\n          data-hidden={type === 'never' || !verticalThumbVisible || undefined}\n          forceMount\n          onMouseEnter={() => setScrollbarHovered(true)}\n          onMouseLeave={() => setScrollbarHovered(false)}\n        >\n          <ScrollAreaThumb {...getStyles('thumb')} />\n        </ScrollAreaScrollbar>\n      )}\n\n      <ScrollAreaCorner\n        {...getStyles('corner')}\n        data-hovered={scrollbarHovered || undefined}\n        data-hidden={type === 'never' || undefined}\n      />\n    </ScrollAreaRoot>\n  );\n});\n\nScrollArea.displayName = '@mantine/core/ScrollArea';\n\nexport const ScrollAreaAutosize = factory<ScrollAreaFactory>((props, ref) => {\n  const {\n    children,\n    classNames,\n    styles,\n    scrollbarSize,\n    scrollHideDelay,\n    type,\n    dir,\n    offsetScrollbars,\n    viewportRef,\n    onScrollPositionChange,\n    unstyled,\n    variant,\n    viewportProps,\n    scrollbars,\n    style,\n    vars,\n    onBottomReached,\n    onTopReached,\n    ...others\n  } = useProps('ScrollAreaAutosize', defaultProps, props);\n\n  return (\n    <Box {...others} ref={ref} style={[{ display: 'flex', overflow: 'auto' }, style]}>\n      <Box style={{ display: 'flex', flexDirection: 'column', flex: 1 }}>\n        <ScrollArea\n          classNames={classNames}\n          styles={styles}\n          scrollHideDelay={scrollHideDelay}\n          scrollbarSize={scrollbarSize}\n          type={type}\n          dir={dir}\n          offsetScrollbars={offsetScrollbars}\n          viewportRef={viewportRef}\n          onScrollPositionChange={onScrollPositionChange}\n          unstyled={unstyled}\n          variant={variant}\n          viewportProps={viewportProps}\n          vars={vars}\n          scrollbars={scrollbars}\n          onBottomReached={onBottomReached}\n          onTopReached={onTopReached}\n        >\n          {children}\n        </ScrollArea>\n      </Box>\n    </Box>\n  );\n});\n\nScrollArea.classes = classes;\nScrollAreaAutosize.displayName = '@mantine/core/ScrollAreaAutosize';\nScrollAreaAutosize.classes = classes;\nScrollArea.Autosize = ScrollAreaAutosize;\n","import {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  factory,\n  Factory,\n  rem,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../core';\nimport { ScrollArea } from '../ScrollArea';\nimport classes from './Table.module.css';\n\nexport type TableScrollContainerStylesNames = 'scrollContainer' | 'scrollContainerInner';\nexport type TableScrollContainerCssVariables = {\n  scrollContainer: '--table-min-width' | '--table-overflow';\n};\n\nexport interface TableScrollContainerProps\n  extends BoxProps,\n    StylesApiProps<TableScrollContainerFactory>,\n    ElementProps<'div'> {\n  /** `min-width` of the `Table` at which it should become scrollable */\n  minWidth: React.CSSProperties['minWidth'];\n\n  /** Type of the scroll container, `native` to use native scrollbars, `scrollarea` to use `ScrollArea` component, `scrollarea` by default */\n  type?: 'native' | 'scrollarea';\n}\n\nexport type TableScrollContainerFactory = Factory<{\n  props: TableScrollContainerProps;\n  ref: HTMLDivElement;\n  stylesNames: TableScrollContainerStylesNames;\n  vars: TableScrollContainerCssVariables;\n}>;\n\nconst defaultProps: Partial<TableScrollContainerProps> = {\n  type: 'scrollarea',\n};\n\nconst varsResolver = createVarsResolver<TableScrollContainerFactory>((_, { minWidth, type }) => ({\n  scrollContainer: {\n    '--table-min-width': rem(minWidth),\n    '--table-overflow': type === 'native' ? 'auto' : undefined,\n  },\n}));\n\nexport const TableScrollContainer = factory<TableScrollContainerFactory>((_props, ref) => {\n  const props = useProps('TableScrollContainer', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    children,\n    minWidth,\n    type,\n    ...others\n  } = props;\n\n  const getStyles = useStyles<TableScrollContainerFactory>({\n    name: 'TableScrollContainer',\n    classes,\n    props,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n    rootSelector: 'scrollContainer',\n  });\n\n  return (\n    <Box<any>\n      component={type === 'scrollarea' ? ScrollArea : 'div'}\n      {...(type === 'scrollarea' ? { offsetScrollbars: 'x' } : {})}\n      ref={ref}\n      {...getStyles('scrollContainer')}\n      {...others}\n    >\n      <div {...getStyles('scrollContainerInner')}>{children}</div>\n    </Box>\n  );\n});\n\nTableScrollContainer.classes = classes;\nTableScrollContainer.displayName = '@mantine/core/TableScrollContainer';\n","import {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  factory,\n  Factory,\n  getSpacing,\n  getThemeColor,\n  MantineColor,\n  MantineSpacing,\n  rem,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../core';\nimport {\n  TableCaption,\n  TableTbody,\n  TableTd,\n  TableTfoot,\n  TableTh,\n  TableThead,\n  TableTr,\n} from './Table.components';\nimport { TableProvider } from './Table.context';\nimport { TableDataRenderer } from './TableDataRenderer';\nimport { TableScrollContainer } from './TableScrollContainer';\nimport classes from './Table.module.css';\n\nexport type TableVariant = 'default' | 'vertical';\n\nexport type TableStylesNames =\n  | 'table'\n  | 'thead'\n  | 'tbody'\n  | 'tfoot'\n  | 'tr'\n  | 'th'\n  | 'td'\n  | 'caption';\n\nexport type TableCssVariables = {\n  table:\n    | '--table-layout'\n    | '--table-border-color'\n    | '--table-caption-side'\n    | '--table-horizontal-spacing'\n    | '--table-vertical-spacing'\n    | '--table-striped-color'\n    | '--table-highlight-on-hover-color'\n    | '--table-sticky-header-offset';\n};\n\nexport interface TableData {\n  head?: React.ReactNode[];\n  body?: React.ReactNode[][];\n  foot?: React.ReactNode[];\n  caption?: string;\n}\n\nexport interface TableProps extends BoxProps, StylesApiProps<TableFactory>, ElementProps<'table'> {\n  /** Value of `table-layout` style, `auto` by default */\n  layout?: React.CSSProperties['tableLayout'];\n\n  /** Determines on which side `Table.Caption` is displayed, `bottom` by default */\n  captionSide?: 'top' | 'bottom';\n\n  /** Color of table borders, key of `theme.colors` or any valid CSS color */\n  borderColor?: MantineColor;\n\n  /** Determines whether the table should have outer border, `false` by default */\n  withTableBorder?: boolean;\n\n  /** Determines whether the table should have borders between columns, `false` by default */\n  withColumnBorders?: boolean;\n\n  /** Determines whether the table should have borders between rows, `true` by default */\n  withRowBorders?: boolean;\n\n  /** Horizontal cells spacing, key of `theme.spacing` or any valid CSS value for padding, numbers are converted to rem, default value is `xs` */\n  horizontalSpacing?: MantineSpacing;\n\n  /** Vertical cells spacing, key of `theme.spacing` or any valid CSS value for padding, numbers are converted to rem, default value is `xs` */\n  verticalSpacing?: MantineSpacing;\n\n  /** Determines whether every odd/even row background should be changed to `strippedColor`, if set to `true`, then `odd` value will be used, `false` by default  */\n  striped?: boolean | 'odd' | 'even';\n\n  /** Background color of striped rows, key of `theme.colors` or any valid CSS color */\n  stripedColor?: MantineColor;\n\n  /** Determines whether table rows background should change to `highlightOnHoverColor` when hovered, `false` by default */\n  highlightOnHover?: boolean;\n\n  /** Background color of table rows when hovered, key of `theme.colors` or any valid CSS color */\n  highlightOnHoverColor?: MantineColor;\n\n  /** Data that should be used to generate table, ignored if `children` prop is set */\n  data?: TableData;\n\n  /** Determines whether `Table.Thead` should be sticky, `false` by default */\n  stickyHeader?: boolean;\n\n  /** Offset from top at which `Table.Thead` should become sticky, `0` by default */\n  stickyHeaderOffset?: number | string;\n\n  /** Determines whether `font-variant-numeric: tabular-nums` style should be set, `false` by default */\n  tabularNums?: boolean;\n}\n\nexport type TableFactory = Factory<{\n  props: TableProps;\n  ref: HTMLTableElement;\n  stylesNames: TableStylesNames;\n  vars: TableCssVariables;\n  variant: TableVariant;\n  staticComponents: {\n    Thead: typeof TableThead;\n    Tbody: typeof TableTbody;\n    Tfoot: typeof TableTfoot;\n    Td: typeof TableTd;\n    Th: typeof TableTh;\n    Tr: typeof TableTr;\n    Caption: typeof TableCaption;\n    ScrollContainer: typeof TableScrollContainer;\n    DataRenderer: typeof TableDataRenderer;\n  };\n}>;\n\nconst defaultProps: Partial<TableProps> = {\n  withRowBorders: true,\n  verticalSpacing: 7,\n};\n\nconst varsResolver = createVarsResolver<TableFactory>(\n  (\n    theme,\n    {\n      layout,\n      captionSide,\n      horizontalSpacing,\n      verticalSpacing,\n      borderColor,\n      stripedColor,\n      highlightOnHoverColor,\n      striped,\n      highlightOnHover,\n      stickyHeaderOffset,\n      stickyHeader,\n    }\n  ) => ({\n    table: {\n      '--table-layout': layout,\n      '--table-caption-side': captionSide,\n      '--table-horizontal-spacing': getSpacing(horizontalSpacing),\n      '--table-vertical-spacing': getSpacing(verticalSpacing),\n      '--table-border-color': borderColor ? getThemeColor(borderColor, theme) : undefined,\n      '--table-striped-color':\n        striped && stripedColor ? getThemeColor(stripedColor, theme) : undefined,\n      '--table-highlight-on-hover-color':\n        highlightOnHover && highlightOnHoverColor\n          ? getThemeColor(highlightOnHoverColor, theme)\n          : undefined,\n      '--table-sticky-header-offset': stickyHeader ? rem(stickyHeaderOffset) : undefined,\n    },\n  })\n);\n\nexport const Table = factory<TableFactory>((_props, ref) => {\n  const props = useProps('Table', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    horizontalSpacing,\n    verticalSpacing,\n    captionSide,\n    stripedColor,\n    highlightOnHoverColor,\n    striped,\n    highlightOnHover,\n    withColumnBorders,\n    withRowBorders,\n    withTableBorder,\n    borderColor,\n    layout,\n    variant,\n    data,\n    children,\n    stickyHeader,\n    stickyHeaderOffset,\n    mod,\n    tabularNums,\n    ...others\n  } = props;\n\n  const getStyles = useStyles<TableFactory>({\n    name: 'Table',\n    props,\n    className,\n    style,\n    classes,\n    classNames,\n    styles,\n    unstyled,\n    rootSelector: 'table',\n    vars,\n    varsResolver,\n  });\n\n  return (\n    <TableProvider\n      value={{\n        getStyles,\n        stickyHeader,\n        striped: striped === true ? 'odd' : striped || undefined,\n        highlightOnHover,\n        withColumnBorders,\n        withRowBorders,\n        captionSide: captionSide || 'bottom',\n      }}\n    >\n      <Box\n        component=\"table\"\n        variant={variant}\n        ref={ref}\n        mod={[{ 'data-with-table-border': withTableBorder, 'data-tabular-nums': tabularNums }, mod]}\n        {...getStyles('table')}\n        {...others}\n      >\n        {children || (!!data && <TableDataRenderer data={data} />)}\n      </Box>\n    </TableProvider>\n  );\n});\n\nTable.classes = classes;\nTable.displayName = '@mantine/core/Table';\nTable.Td = TableTd;\nTable.Th = TableTh;\nTable.Tr = TableTr;\nTable.Thead = TableThead;\nTable.Tbody = TableTbody;\nTable.Tfoot = TableTfoot;\nTable.Caption = TableCaption;\nTable.ScrollContainer = TableScrollContainer;\nTable.DataRenderer = TableDataRenderer;\n","import { Table } from \"@mantine/core\";\nconst modalContentData = {\n  about: (\n    <>\n      <p>\n        This map has limited functionality and not for planning purposes. The 3D\n        map contains information relating applications sourced from My Port\n        Phillip.\n        <br /> <br />\n        The applications that are represented have been provided with care, to\n        ensure that data is accurate and current. However, some variations from\n        records do exist, and complete accuracy cannot be guaranteed.\n        Information, data and advice on this website is provided on the basis\n        that site users undertake responsibility for assessing the relevance and\n        accuracy of its content.\n        <br /> <br /> The City of Port Phillip employees disclaim all liability\n        for any error, loss or consequences which may arise from you relying on\n        any information contained in this material.\n        <br />\n        <ul>\n          <li>Information shown is indicative only</li>\n          <li>Information last updated in September 2024</li>\n        </ul>\n<hr /> <br />\n        The 3D map contains information on residential development applications\n        lodged with the City of Port Phillip. The map only shows two application\n        stages.\n        <br />\n        <br />\n        <span style={{ textDecoration: \"underline\" }}>\n          Applied For Permit is <span style={{ color: \"#c85e19\" }}>Orange</span>{\" \"}\n          and Permit Approved is <span style={{ color: \"#1a9798\" }}>Teal</span>\n        </span>\n        <br />\n        <br />\n        We do not sponsor or endorse any material on websites linked from or to\n        this website, including any social media websites that may be linked in\n        any way to this website.\n      </p>\n      <br />\n      <Table className=\"about-table\">\n        <thead>\n          <tr>\n            <th>Content</th>\n            <th>Source</th>\n            <th>Currency</th>\n          </tr>\n        </thead>\n        <tbody>\n          <tr>\n            <td colSpan={3} style={{ fontWeight: \"bold\" }}>\n              Model Information\n            </td>\n          </tr>\n          <tr>\n            <td>\n              <span style={{ textDecoration: \"underline\", color: \"#c85e19\" }}>\n                Application Applied (Orange)\n              </span>\n            </td>\n            <td>\n              City of Port Phillip planning permits application repository, City\n              of Port Phillip Development Activity Model\n            </td>\n            <td>Maximum of three months old</td>\n          </tr>\n          <tr>\n            <td>\n              <span style={{ textDecoration: \"underline\", color: \"#1a9798\" }}>\n                Permit Approved (Teal)\n              </span>\n            </td>\n            <td>\n              City of Port Phillip planning permits application repository, City\n              of Port Phillip Development Activity Model\n            </td>\n            <td>Maximum of three months old</td>\n          </tr>\n          <tr>\n            <td colSpan={3} style={{ fontWeight: \"bold\" }}>\n              Map\n            </td>\n          </tr>\n          <tr>\n            <td>Base map</td>\n            <td>\n              Open street map data represented through&nbsp;\n              <a\n                href=\"https://www.mapbox.com\"\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n              >\n                Mapbox\n              </a>\n              &nbsp;platform\n            </td>\n            <td>Updated by third party</td>\n          </tr>\n          <tr>\n            <td>3D Models</td>\n            <td>\n              2023 capture of entire Local Government Area (LGA), Level of\n              Detail (LOD) 0.3.\n            </td>\n            <td>September 2023</td>\n          </tr>\n        </tbody>\n      </Table>\n    </>\n  ),\n  needHelp: (\n    <div>\n      <p>\n        To use the City of Port Phillip Development Activity Model website start\n        with these steps. <br />\n        <b>Step 1 - Search</b>\n        <br />\n        Type in your address within the “search” tool. Only properties within\n        City of Port Phillip will be displayed. Once the property is selected\n        your property will appear in the centre of your screen.\n      </p>\n      <img\n        src=\"/images/need-help/need-help-1.png\"\n        alt=\"Description of Image\"\n        style={{ width: \"100%\", height: \"auto\" }}\n      />\n      <br />\n      <br />\n      <p>\n        <b>Step 2 – Visualise Development Activity Information </b>\n        <br />\n        To find out what major development permits and their status are near\n        your house, click on the coloured 3D Building Model (Teal or Orange\n        colour). A pop up panel to you left is displayed with key information\n        about the Permit and a brief description on what the application is for.\n      </p>\n      <img\n        src=\"/images/need-help/need-help-2.png\"\n        alt=\"Description of Image\"\n        style={{ width: \"100%\", height: \"auto\" }}\n      />\n      <br />\n      <br />\n      <p>\n        <b>Step 3 - Linking to OneCouncil Services </b>\n        <br />\n        To find out more about the application visit the OneCouncil Services\n        link which stores the major planning descriptions and status updates or\n        notes.\n      </p>\n      <img\n        src=\"/images/need-help/need-help-3.png\"\n        alt=\"Description of Image\"\n        style={{ width: \"100%\", height: \"auto\" }}\n      />\n      <img\n        src=\"/images/need-help/need-help-4.png\"\n        alt=\"Description of Image\"\n        style={{ width: \"100%\", height: \"auto\" }}\n      />\n      <br />\n      <br />\n      <p>\n        <b>Step 4 – Filtering Permit Visualisation </b>\n        <br />\n        The Permit application status is displayed on the right hand side. By\n        default both approved or submitted applications will be displayed. If\n        you wish to Untick either the Permit Submitted or the Permit Approved\n        this will filter out your options\n      </p>\n      <img\n        src=\"/images/need-help/need-help-5.png\"\n        alt=\"Description of Image\"\n        style={{ width: \"100%\", height: \"auto\" }}\n      />\n    </div>\n  ),\n  contact: (\n    <div>\n      <p>\n        For further assistance, visit{\" \"}\n        <a\n          href=\"https://copp.t1cloud.com/T1Default/CiAnywhere/Web/COPP/RequestManagement/RequestEntryWizard?f=GP.REQUESTS&suite=PR&MasterSystem=CNCL&Requstsystem=CNCL&Requesttype=FEEDBACK&q1key=STQuestion258&q1value=FEEDBACK&G=7337bfad-5607-4662-96d5-6b4dafcdcd36\"\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n        >\n          My Port Phillip\n        </a>\n        .\n      </p>\n    </div>\n  ),\n};\n\nexport default modalContentData;\n","import React, { useState, useEffect } from \"react\";\nimport { Modal, Button, Text, Group } from \"@mantine/core\";\nimport modalContentData from \"../../data/modalContentData\";\n\nconst InformationModal = () => {\n  const [opened, setOpened] = useState(false);\n  const [modalContent, setModalContent] = useState<any>(null);\n  const [modalTitle, setModalTitle] = useState('About');\n  const [activeButton, setActiveButton] = useState<string | null>(null);\n\n  const openModal = (content: any, buttonType: any) => {\n    setModalContent(content);\n    setActiveButton(buttonType);\n    switch (buttonType) {\n      case 'about':\n        setModalTitle('About');\n        break;\n      case 'needHelp':\n        setModalTitle('Need Help?');\n        break;\n      case 'contact':\n        setModalTitle('Contact Us');\n        break;\n      default:\n        setModalTitle('About');\n    }\n\n    setOpened(true);\n  };\n\n  const closeModal = () => {\n    setOpened(false);\n    setActiveButton(null); \n  };\n\n  return (\n    <div className=\"information-modal\">\n      {/* Group for Buttons */}\n      <Group style={{ marginBottom: \"0.7rem\", marginTop: \"0.7rem\" }}>\n        <Button\n          style={{\n            width: \"7.5rem\",\n            height: \"2.5rem\",\n            color: \"white\",\n            backgroundColor:\n              activeButton === \"about\" ? \"#d3d3d3\" : \"#4a525e\",\n          }}\n          onClick={() => openModal(modalContentData.about, \"about\")}\n        >\n          About\n        </Button>\n        <Button\n          style={{\n            width: \"7.5rem\",\n            height: \"2.5rem\",\n            color: \"white\",\n            backgroundColor:\n              activeButton === \"needHelp\" ? \"#d3d3d3\" : \"#4a525e\",\n          }}\n          onClick={() => openModal(modalContentData.needHelp, \"needHelp\")}\n        >\n          Need Help?\n        </Button>\n        <Button\n          style={{\n            width: \"7.5rem\",\n            height: \"2.5rem\",\n            color: \"white\",\n            backgroundColor:\n            activeButton === \"contact\" ? \"#d3d3d3\" : \"#4a525e\",\n          }}\n          onClick={() => openModal(modalContentData.contact, \"contact\")}\n        >\n          Contact Us\n        </Button>\n      </Group>\n\n\n      <Modal\n        opened={opened}\n        onClose={closeModal}\n        title={modalTitle}\n        size=\"xl\"\n        overlayProps={{\n          color: \"rgba(216, 235, 227, 0.6)\",\n          opacity: 2,\n          blur: 3,\n        }}\n        centered\n        styles={{\n          content: {\n            display: 'flex',\n            flexDirection: 'column',\n            height: '100%',\n          },\n          body: {\n            overflowY: 'auto',\n            flex: 1, // Makes the body take up the available space\n            paddingBottom: 0, // Remove padding so that footer aligns with the bottom\n          },\n        }}\n      >\n        <Text size=\"md\" style={{ flex: 1, overflowY: 'auto', paddingBottom: 100 }}>{modalContent}</Text>\n\n        <Group\n          style={{\n            position: \"absolute\",\n            bottom: 20,\n            right: 20,\n            left: 20,\n            display: \"flex\",\n            justifyContent: \"flex-end\",\n          }}\n        >\n        <Button\n          style={{\n            width: \"7.5rem\",\n            color: \"white\",\n            backgroundColor:\n              activeButton === \"about\" ? \"#d3d3d3\" : \"#4a525e\",\n          }}\n          onClick={() => openModal(modalContentData.about, \"about\")}\n        >\n          About\n        </Button>\n        <Button\n          style={{\n            width: \"7.5rem\",\n            color: \"white\",\n            backgroundColor:\n              activeButton === \"needHelp\" ? \"#d3d3d3\" : \"#4a525e\",\n          }}\n          onClick={() => openModal(modalContentData.needHelp, \"needHelp\")}\n        >\n          Need Help?\n        </Button>\n        <Button\n          style={{\n            width: \"7.5rem\",\n            color: \"white\",\n            backgroundColor:\n            activeButton === \"contact\" ? \"#d3d3d3\" : \"#4a525e\",\n          }}\n          onClick={() => openModal(modalContentData.contact, \"contact\")}\n        >\n          Contact Us\n        </Button>\n        </Group>\n      </Modal>\n    </div>\n  );\n};\n\nexport default InformationModal;\n","import { FeatureCollection, Point } from \"geojson\";\n\nclass WardLabels {\n  static getData(): FeatureCollection<Point> {\n    return {\n      type: \"FeatureCollection\",\n      features: [\n        {\n          type: \"Feature\",\n          properties: { name: \"Albert Park Ward\" },\n          geometry: { type: \"Point\", coordinates: [144.962776, -37.851720] },\n        },\n        {\n          type: \"Feature\",\n          properties: { name: \"Alma Ward\" },\n          geometry: { type: \"Point\", coordinates: [144.999196, -37.862076] },\n        },\n        {\n          type: \"Feature\",\n          properties: { name: \"Balaclava Ward\" },\n          geometry: { type: \"Point\", coordinates: [144.992219, -37.872431] },\n        },\n        {\n          type: \"Feature\",\n          properties: { name: \"Elwood Ward\" },\n          geometry: { type: \"Point\", coordinates: [144.984126, -37.882013] },\n        },\n        {\n          type: \"Feature\",\n          properties: { name: \"Lakeside Ward\" },\n          geometry: { type: \"Point\", coordinates: [144.973939, -37.847974] },\n        },\n        {\n          type: \"Feature\",\n          properties: { name: \"Montague Ward\" },\n          geometry: { type: \"Point\", coordinates: [144.939334, -37.832326] },\n        },\n        {\n          type: \"Feature\",\n          properties: { name: \"Port Melbourne Ward\" },\n          geometry: { type: \"Point\", coordinates: [144.926915, -37.839159] },\n        },\n        {\n          type: \"Feature\",\n          properties: { name: \"South Melbourne Ward\" },\n          geometry: { type: \"Point\", coordinates: [144.961381, -37.834861] },\n        },\n        {\n          type: \"Feature\",\n          properties: { name: \"St Kilda Ward\" },\n          geometry: { type: \"Point\", coordinates: [144.979521, -37.866923] },\n        },\n      ],\n    };\n  }\n}\n\nexport default WardLabels;\n","import React, { useEffect } from \"react\";\nimport { Source, Layer, MapboxGeoJSONFeature } from \"react-map-gl\";\n\ninterface ClusterLayerProps {\n  data: GeoJSON.FeatureCollection; // GeoJSON data\n  clusterMaxZoom?: number; // Optional: max zoom for clustering\n  clusterRadius?: number; // Optional: radius of clustering\n}\n\nconst ClusterLayer: React.FC<ClusterLayerProps> = ({\n  data,\n  clusterMaxZoom = 14,\n  clusterRadius = 99,\n}) => {\n  return (\n    <>\n      {/* GeoJSON Source with clustering enabled */}\n      <Source\n        id=\"clusters\"\n        type=\"geojson\"\n        data={data}\n        cluster={true}\n        clusterMaxZoom={clusterMaxZoom}\n        clusterRadius={clusterRadius}\n      >\n        <Layer\n          id=\"clusters-layer\"\n          type=\"circle\"\n          filter={['has', 'point_count']}\n          paint={{\n            'circle-color': [\n              'step',\n              ['get', 'point_count'],\n              '#51bbd6',\n              10,\n              '#f1f075',\n              20,\n              '#f28cb1',\n            ],\n            'circle-radius': ['step', ['get', 'point_count'], 20, 10, 30, 20, 40]\n          }}\n        />\n        <Layer\n          id=\"cluster-count-layer\"\n          type=\"symbol\"\n          filter={['has', 'point_count']}\n          layout={{\n            'text-field': '{point_count_abbreviated}',\n            'text-font': ['DIN Offc Pro Medium', 'Arial Unicode MS Bold'],\n            'text-size': 20,\n          }}\n        />\n        {/* Unclustered points layer */}\n        <Layer\n          id=\"unclustered-layer\"\n          type=\"circle\"\n          filter={['!', ['has', 'point_count']]}\n          paint={{\n            'circle-color': '#11b4da',\n            'circle-radius': 10,\n            'circle-stroke-width': 1,\n            'circle-stroke-color': '#fff',\n          }}\n        />\n      </Source>\n    </>\n  );\n};\n\nexport default ClusterLayer;\n\n// import React from \"react\";\n// import { Source, Layer, Marker } from \"react-map-gl\";\n\n// interface ClusterLayerProps {\n//   data: GeoJSON.FeatureCollection; // GeoJSON data\n//   clusterMaxZoom?: number; // Optional: max zoom for clustering\n//   clusterRadius?: number; // Optional: radius of clustering\n// }\n\n// const ClusterLayer: React.FC<ClusterLayerProps> = ({\n//   data,\n//   clusterMaxZoom = 14,\n//   clusterRadius = 99,\n// }) => {\n//   // Helper function to classify counts\n//   const classifyApplications = (features: GeoJSON.Feature[]) => {\n//     const submittedStages = new Set([\n//       \"INITASSESS\",\n//       \"PAYMENTRECEIVED\",\n//       \"PUBNOTIFY\",\n//       \"INFREQUEST\",\n//       \"ATPRPTNG\",\n//       \"S5057ALODG\",\n//       \"REFERRED\",\n//       \"UNDERASSES\",\n//       \"CON1PLAN\",\n//       \"COND1RECVD\",\n//       \"COORDREVIEW\",\n//       \"ADVTPREP\",\n//     ]);\n//     const approvedStages = new Set([\"APPROVED\", \"PMTISSUED\", \"ISSUED\"]);\n\n//     let applicationSubmitted = 100;\n//     let applicationApproved = 50;\n\n//     for (const feature of features) {\n//       const stage = feature?.properties?.ApplicationStage;\n\n//       if (submittedStages.has(stage)) {\n//         applicationSubmitted += 1;\n//       } else if (approvedStages.has(stage)) {\n//         applicationApproved += 1;\n//       }\n//     }\n\n//     console.log(\"the amount of appliction\", features);\n//     return { applicationSubmitted, applicationApproved };\n//   };\n\n//   const renderDonutChart = (features: GeoJSON.Feature[]) => {\n//     const { applicationSubmitted, applicationApproved } =\n//       classifyApplications(features);\n\n//     const total = applicationSubmitted + applicationApproved;\n//     if (total === 0) return null;\n\n//     const submittedPercent = applicationSubmitted / total;\n//     const approvedPercent = applicationApproved / total;\n\n//     const r = 30; // radius of the donut chart\n//     const r0 = r * 0.6; // inner radius\n\n//     const segment = (start: number, end: number, color: string) => {\n//       const largeArc = end - start > 0.5 ? 1 : 0;\n//       const x0 = r + r * Math.cos(2 * Math.PI * start);\n//       const y0 = r + r * Math.sin(2 * Math.PI * start);\n//       const x1 = r + r * Math.cos(2 * Math.PI * end);\n//       const y1 = r + r * Math.sin(2 * Math.PI * end);\n\n//       return (\n//         <path\n//           d={`M ${x0} ${y0} A ${r} ${r} 0 ${largeArc} 1 ${x1} ${y1} L ${\n//             r + r0 * Math.cos(2 * Math.PI * end)\n//           } ${\n//             r + r0 * Math.sin(2 * Math.PI * end)\n//           } A ${r0} ${r0} 0 ${largeArc} 0 ${\n//             r + r0 * Math.cos(2 * Math.PI * start)\n//           } ${r + r0 * Math.sin(2 * Math.PI * start)} Z`}\n//           fill={color}\n//         />\n//       );\n//     };\n\n//     return (\n//       <svg width={2 * r} height={2 * r} viewBox={`0 0 ${2 * r} ${2 * r}`}>\n//         {segment(0, submittedPercent, \"#51bbd6\")}\n//         {segment(submittedPercent, 1, \"#f1f075\")}\n//         <circle cx={r} cy={r} r={r0} fill=\"white\" />\n//         <text x={r} y={r} textAnchor=\"middle\" dominantBaseline=\"central\">\n//           {total}\n//         </text>\n//       </svg>\n//     );\n//   };\n\n//   return (\n//     <>\n//       <Source\n//         id=\"clusters\"\n//         type=\"geojson\"\n//         data={data}\n//         cluster={true}\n//         clusterMaxZoom={clusterMaxZoom}\n//         clusterRadius={clusterRadius}\n//       >\n//         {data?.features.map((feature, index) => {\n//           if (feature.geometry.type === \"Point\") {\n//             const [longitude, latitude] = feature.geometry.coordinates as [\n//               number,\n//               number\n//             ];\n//             return (\n//               <Marker key={index} longitude={longitude} latitude={latitude}>\n//                 {renderDonutChart([feature])}\n//               </Marker>\n//             );\n//           }\n//           return null;\n//         })}\n//       </Source>\n//     </>\n//   );\n// };\n\n// export default ClusterLayer;\n","import React, {\n  useRef,\n  useEffect,\n  useContext,\n  useState,\n  useCallback,\n} from \"react\";\nimport Map, {\n  Layer,\n  MapProvider,\n  Source,\n  NavigationControl,\n  FullscreenControl,\n  ScaleControl,\n  MapLayerMouseEvent,\n  MapboxGeoJSONFeature,\n  LngLatLike,\n} from \"react-map-gl\";\nimport mapboxgl from \"mapbox-gl\";\nimport { SnackbarProvider } from \"notistack\";\nimport AppContext from \"../Context/AppContext\";\nimport GeocoderControl from \"./GeocoderControl\";\nimport {\n  permitSubmittedLayer,\n  permitApprovedLayer,\n  baseLayer,\n} from \"./MapLayers\";\nimport FilterPanel from \"./FilterPanel\";\nimport CustomisedCard from \"../CustomisedCard\";\nimport type { MapRef } from \"react-map-gl\";\nimport { Anchor, Button, Group } from \"@mantine/core\";\nimport { Banner } from \"../Banner\";\nimport { ActionIcon, Tooltip } from \"@mantine/core\";\nimport {\n  IconHome,\n  IconPin,\n  IconPinnedOff,\n  IconPolygonOff,\n  IconPolygon,\n} from \"@tabler/icons-react\";\nimport WelcomeModal from \"../WelcomeModal\";\nimport modalContentData from \"../../data/modalContentData\";\nimport InformationModal from \"../InformationModal\";\nimport { groupFeaturesByFID } from \"./mapboxHelper\"; // Import the JS function\nimport WardLabels from \"../../data/wardLabels\";\nimport ClusteredLayer from \"../../layers/ClusterLayers\";\n\nconst MAPBOX_TOKEN: string = process.env.REACT_APP_MAPBOX_ACCESS_TOKEN || \"\";\nconst MAPBOX_STYLE: string = process.env.REACT_APP_MAPBOX_STYLE || \"\";\nconst MODEL_GEOJSON_URL: string = process.env.REACT_APP_MODEL_GEOJSON_URL || \"\";\nconst WARD_GEOJSON_URL: string = process.env.REACT_APP_WARD_GEOJSON_URL || \"\";\n\nconst DEFAULT_VIEW: {\n  latitude: number;\n  longitude: number;\n  zoom: number;\n  bearing: number;\n  pitch: number;\n  antialias: boolean;\n  centre: LngLatLike;\n} = {\n  latitude: -37.86155175787079,\n  longitude: 144.97159524645164,\n  zoom: 13,\n  bearing: 0,\n  pitch: 50,\n  antialias: true,\n  centre: [144.97159524645164, -37.86155175787079],\n};\n\nconst bounds: [LngLatLike, LngLatLike] = [\n  [144.91033993341807, -37.89729001675099], // Southwest coordinates\n  [145.0134423283179, -37.8156692328041], // Northeast coordinates\n];\n\nconst Mapbox: React.FC = () => {\n  const mapRef = useRef<MapRef>(null);\n\n  const [selectedFeature, setSelectedFeature] =\n    useState<MapboxGeoJSONFeature | null>(null);\n  const [showSideBar, setShowSideBar] = useState<Boolean>(false);\n\n  const [geojsonData, setGeojsonData] = useState<any>(null);\n  const [POIData, setPOIData] = useState<any>(null);\n  const [POILineData, setPOILineData] = useState<any>(null);\n  const [boundaryData, setBoundaryData] = useState<any>(null);\n  const [isPinned, setIsPinned] = useState(true);\n  const [isWardLabel, setIsWardLabel] = useState(false);\n  const [zoomLevel, setZoomLevel] = useState<any>(DEFAULT_VIEW.zoom);\n\n  const wardLabels = WardLabels.getData();\n\n  const [layersVisibility, setLayersVisibility] = React.useReducer(\n    (state: any, updates: any) => ({ ...state, ...updates }),\n    {}\n  );\n\n  const handleMapClick = useCallback((event: MapLayerMouseEvent) => {\n    // debugger\n    const feature = event.features?.[0];\n    if (feature) {\n      setShowSideBar(true);\n      setSelectedFeature(feature);\n    } else {\n      setShowSideBar(false);\n    }\n  }, []);\n\n  const pinButtonHandle = () => {\n    setIsPinned((prev) => !prev); // Toggle the pinned state\n  };\n\n  const wardLabelButtonHandle = () => {\n    setIsWardLabel((prev) => !prev); // Toggle the pinned state\n  };\n\n  const handleMouseMove = useCallback((event: MapLayerMouseEvent) => {\n    const map = mapRef.current?.getMap();\n    if (!map) {\n      return;\n    }\n\n    const features = map.queryRenderedFeatures(event.point, {\n      layers: [\"permitSubmitted\", \"permitApproved\"],\n    });\n\n    if (features.length > 0) {\n      // Set cursor style to pointer\n      map.getCanvas().style.cursor = \"pointer\";\n    }\n  }, []);\n\n  useEffect(() => {\n    const map = mapRef.current?.getMap();\n\n    const loadImageWithRetry = (map:any, name:any, url:any, retries = 3) => {\n      return new Promise((resolve, reject) => {\n        const attemptLoad = (retryCount:any) => {\n          if (map.hasImage(name)) return\n          map.loadImage(url, (error:any, image:any) => {\n            if (error) {\n              if (retryCount > 0) {\n                console.warn(`Retrying to load image '${name}'...`);\n                setTimeout(() => attemptLoad(retryCount - 1), 500); // Retry after 500ms\n              } else {\n                console.error(`Failed to load image '${name}':`, error);\n                reject(error);\n              }\n              return;\n            }\n            if (!map.hasImage(name)) {\n              map.addImage(name, image!);\n            }\n            resolve(true);\n          });\n        };\n        attemptLoad(retries);\n      });\n    };\n  \n    // Preload all images\n    const preloadImages = async () => {\n      try {\n        await loadImageWithRetry(\n          map,\n          \"approved-marker\",\n          \"/images/pins/approved-marker.png\"\n        );\n        await loadImageWithRetry(\n          map,\n          \"submitted-marker\",\n          \"/images/pins/submitted-marker.png\"\n        );\n      } catch (error) {\n        console.error(\"Error loading one or more images:\", error);\n      }\n    };\n\n    map?.on(\"zoom\", preloadImages);\n\n    return () => {\n      map?.off(\"zoom\", preloadImages);\n    };\n  }, [zoomLevel]);\n\n  const handleMouseLeave = useCallback(() => {\n    const map = mapRef.current?.getMap();\n    if (!map) return;\n\n    // Reset cursor style\n    map.getCanvas().style.cursor = \"\";\n  }, []);\n\n  const flyToHome = useCallback(() => {\n    const map = mapRef.current?.getMap();\n    if (map) {\n      map.flyTo({\n        center: DEFAULT_VIEW.centre,\n        zoom: DEFAULT_VIEW.zoom,\n        pitch: DEFAULT_VIEW.pitch,\n        bearing: DEFAULT_VIEW.bearing,\n        essential: true, // this animation is considered essential with respect to prefers-reduced-motion\n      });\n    }\n  }, []);\n\n  // Define types for GeoJSON Features and API Responses\n  interface GeoJsonFeature {\n    type: string;\n    properties: { [key: string]: any };\n    geometry: { [key: string]: any };\n    id?: string;\n  }\n\n  interface GeoJson {\n    type: string;\n    features: GeoJsonFeature[];\n  }\n\n  interface MatchingApiFeature {\n    id: string;\n    properties: {\n      Primary_Pr: string; // Assuming FID is stored in this field\n      [key: string]: any; // Other properties\n    };\n  }\n\n  interface MatchingApiResponse {\n    type: string;\n    features: MatchingApiFeature[];\n  }\n\n  const mapTech1ToMapboxProperties = (\n    tech1Feature: any,\n    mapboxFeature: any\n  ) => {\n    return {\n      PropertyId: tech1Feature.PropertyId,\n      ApplicationStage: tech1Feature.ApplicationStage,\n      ApplicationStatus: tech1Feature.ApplicationStatus,\n      LodgedDate: tech1Feature.LodgedDate,\n      Category: tech1Feature.Category,\n      Compliance: tech1Feature.Compliance,\n      Status: tech1Feature.Status,\n      Description: tech1Feature.Description,\n      SiteName: tech1Feature.SiteName,\n      Decision: tech1Feature.Decision,\n      ApplicationUrl: tech1Feature.Applicat_3,\n      BuildingHeight: mapboxFeature\n        ? Number(mapboxFeature.EAVE_Elev)\n        : Number(tech1Feature.BuildingHeight),\n      ApplicationId: tech1Feature.APPLN_ID,\n      ProjectId: tech1Feature.Project_ID,\n      POIGeometry: tech1Feature.POIGeometry,\n      PDDAM1: tech1Feature.PDDAM1,\n      PDDAM2: tech1Feature.PDDAM2,\n      ELECTORATE: tech1Feature.ELECTORATE,\n    };\n  };\n\n  const fetchDatasetsAndMatchProperties = async (): Promise<void> => {\n    // Define an array of URLs for multiple GeoJSON files\n    const urls: string[] = [\n      `https://coppumbracodevstorage.blob.core.windows.net/3dmaps/Albert Park Model Layer.geojson`,\n      `https://coppumbracodevstorage.blob.core.windows.net/3dmaps/Elwood Model Layer.geojson`,\n      `https://coppumbracodevstorage.blob.core.windows.net/3dmaps/Port Melbourne Industry Model Layer.geojson`,\n      `https://coppumbracodevstorage.blob.core.windows.net/3dmaps/Port Melbourne Model Layer.geojson`,\n      `https://coppumbracodevstorage.blob.core.windows.net/3dmaps/South Melbourne Model Layer.geojson`,\n      `https://coppumbracodevstorage.blob.core.windows.net/3dmaps/St Kilda - Central Model Layer.geojson`,\n      `https://coppumbracodevstorage.blob.core.windows.net/3dmaps/St Kilda - East Model Layer.geojson`,\n      `https://coppumbracodevstorage.blob.core.windows.net/3dmaps/St Kilda - West Model Layer.geojson`,\n    ];\n\n    try {\n      // Fetch all GeoJSON files in parallel\n      const geojsonResponses: Response[] = await Promise.all(\n        urls.map((url) => fetch(url))\n      );\n\n      // Check for any non-OK responses\n      const failedResponses = geojsonResponses.filter(\n        (response) => !response.ok\n      );\n      if (failedResponses.length > 0) {\n        throw new Error(`HTTP error! Some GeoJSON responses failed.`);\n      }\n\n      // Parse all GeoJSON responses to JSON\n      const datasets: GeoJson[] = await Promise.all(\n        geojsonResponses.map((response) => response.json())\n      );\n\n      let matchingData: MatchingApiResponse | null = null;\n\n      try {\n        // Fetch from Blob storage instead of the API\n        const response = await fetch(MODEL_GEOJSON_URL);\n\n        if (!response.ok) {\n          const text = await response.text(); // Log the actual response\n          console.error(\"Error response:\", text);\n          throw new Error(\n            `Failed to fetch GeoJSON data, status code: ${response.status}`\n          );\n        }\n\n        // Type assertion to inform TypeScript that this will be a MatchingApiResponse\n        matchingData = (await response.json()) as MatchingApiResponse;\n\n        // Fetch Admin Ward GeoJSON\n        const wardResponse = await fetch(WARD_GEOJSON_URL);\n\n        if (!wardResponse.ok) {\n          const wardText = await wardResponse.text();\n          console.error(\"Error response for Admin Ward:\", wardText);\n          throw new Error(\n            `Failed to fetch Admin Ward GeoJSON data, status code: ${wardResponse.status}`\n          );\n        }\n\n        const wardArrayData = await wardResponse.json();\n\n        const wardData = {\n          type: \"FeatureCollection\",\n          features: wardArrayData.map((item: any) => ({\n            type: \"Feature\",\n            geometry: item.json_geometry,\n            properties: {\n              WARD_NAME: item.WARD_NAME,\n              GISID: item.GISID,\n            },\n          })),\n        };\n        setBoundaryData(wardData);\n      } catch (error) {\n        console.error(\n          \"Error fetching matching API data from Blob storage:\",\n          error\n        );\n      }\n      const matchingDataLookup: { [key: string]: MatchingApiFeature } = {};\n      if (matchingData && matchingData.features) {\n        matchingData.features.forEach((feature: MatchingApiFeature) => {\n          const fid = feature.properties.PropertyId;\n          matchingDataLookup[fid] = feature;\n        });\n      }\n      const matchingDataShortlist: MatchingApiFeature[] = [];\n      const seenPropertyIds = new Set<string>(); // Track unique PropertyId values\n\n      const combinedGeojson: GeoJson = {\n        type: \"FeatureCollection\",\n        features: datasets.flatMap((dataset) => {\n          return dataset.features.map((feature: GeoJsonFeature) => {\n            const propertyId = feature.properties.PropertyId;\n\n            const matchingFeature = matchingDataLookup[propertyId];\n            if (matchingFeature) {\n\n              if (!seenPropertyIds.has(propertyId)) {\n                matchingDataShortlist.push(matchingFeature);\n                seenPropertyIds.add(propertyId); // Mark as seen\n              }\n\n              // Map the properties from Tech1 to Mapbox\n              const mappedProperties = mapTech1ToMapboxProperties(\n                matchingFeature.properties,\n                feature.properties\n              );\n\n              return {\n                ...feature,\n                properties: {\n                  ...mappedProperties, // Extend current properties with new ones\n                },\n              };\n            }\n            return feature; // Return the feature unchanged if no match is found or duplicate detected\n          });\n        }),\n      };\n\n      // Update the state with the combined and updated data\n      setGeojsonData(combinedGeojson);\n\n      const processedPOIData = {\n        type: \"FeatureCollection\",\n        features: matchingDataShortlist.map((feature) => ({\n          type: \"Feature\",\n          geometry: feature.properties.POIGeometry,\n          properties: {\n            FID: feature.properties.PropertyId,\n            ApplicationStage: feature.properties.ApplicationStage,\n            Status: feature.properties.Status,\n            Lodged_Dat: feature.properties.LodgedDate,\n            SiteName: feature.properties.SiteName,\n            Decision: feature.properties.Decision,\n            icon: feature.properties.Icon, // Assign marker icon\n          },\n        })),\n      };\n      setPOIData(processedPOIData);\n    } catch (error) {\n      console.error(\"Error fetching datasets or matching properties:\", error);\n    }\n  };\n\n  // Update zoom level whenever the map zoom changes\n  const handleZoomChange = useCallback(() => {\n    const map = mapRef.current?.getMap();\n    if (map) {\n      const zoomlv = map.getZoom();\n      setZoomLevel(zoomlv);\n    }\n  }, []);\n\n  const updateLineData = useCallback(() => {\n    if (!POIData || !mapRef.current || (zoomLevel < 14 && zoomLevel > 15))\n      return;\n\n    const map = mapRef.current.getMap();\n\n    // Determine the offset dynamically based on the zoom level\n    let verticalOffset: number;\n    if (zoomLevel < 15) {\n      verticalOffset = -65;\n    } else if (zoomLevel < 15) {\n      verticalOffset = -100;\n    } else if (zoomLevel < 17) {\n      verticalOffset = -90;\n    } else if (zoomLevel < 20) {\n      verticalOffset = -110;\n    } else if (zoomLevel < 24) {\n      verticalOffset = -170;\n    } else {\n      verticalOffset = -170; // Gradually increase the offset at higher zoom levels\n    }\n\n    const lineFeatures = POIData.features\n      .map((feature: any) => {\n        const [lon, lat] = feature.geometry.coordinates;\n        // Check if coordinates are valid numbers\n        if (\n          typeof lon !== \"number\" ||\n          typeof lat !== \"number\" ||\n          isNaN(lon) ||\n          isNaN(lat)\n        ) {\n          // console.error(\n          //   \"Invalid original coordinates:\",\n          //   feature.geometry.coordinates\n          // );\n          return null; // Skip this feature if coordinates are invalid\n        }\n\n        let pixelPoint;\n        try {\n          // Project the ground point to pixel coordinates\n          pixelPoint = map.project([lon, lat]);\n        } catch (error) {\n          // console.error(\"Error projecting point:\", error);\n          return null;\n        }\n\n        let floatingPixelPoint;\n        try {\n          // Adjust the y-coordinate for the vertical offset\n          floatingPixelPoint = pixelPoint.add(\n            new mapboxgl.Point(0, verticalOffset)\n          );\n        } catch (error) {\n          // console.error(\"Error adding offset to pixel point:\", error);\n          return null;\n        }\n\n        let floatingGeoPoint;\n        try {\n          // Unproject back to geographic coordinates\n          floatingGeoPoint = map.unproject(floatingPixelPoint);\n        } catch (error) {\n          // console.error(\"Error unprojecting pixel point:\", error);\n          return null;\n        }\n\n        // Validate the unprojected coordinates\n        if (isNaN(floatingGeoPoint.lng) || isNaN(floatingGeoPoint.lat)) {\n          // console.error(\"Invalid floating coordinates:\", floatingGeoPoint);\n          return null;\n        }\n\n        // Check if the line extends too far by measuring distance\n        const maxDistance = 0.01; // Adjust this threshold as necessary\n        const distance = Math.sqrt(\n          Math.pow(floatingGeoPoint.lng - lon, 2) +\n            Math.pow(floatingGeoPoint.lat - lat, 2)\n        );\n\n        if (distance > maxDistance) {\n          // console.warn(\"Skipping line due to excessive length:\", distance);\n          return null;\n        }\n\n        return {\n          type: \"Feature\",\n          geometry: {\n            type: \"LineString\",\n            coordinates: [\n              [lon, lat], // Ground level point\n              [floatingGeoPoint.lng, floatingGeoPoint.lat], // Translated point\n            ],\n          },\n          properties: {\n            ApplicationStage: feature.properties.ApplicationStage,\n          },\n        };\n      })\n      .filter((feature: any) => feature !== null); // Filter out null features\n\n    setPOILineData({\n      type: \"FeatureCollection\",\n      features: lineFeatures,\n    });\n  }, [POIData]);\n\n  useEffect(() => {\n    if (mapRef.current) {\n      const map = mapRef.current.getMap();\n\n      const hideLine = () => {\n        map.setPaintProperty(\"line-layer\", \"line-opacity\", 0);\n        map.setPaintProperty(\"line-layer-2\", \"line-opacity\", 0); // If you have multiple line layers\n      };\n\n      const showLine = () => {\n        map.setPaintProperty(\"line-layer\", \"line-opacity\", 0.6);\n        map.setPaintProperty(\"line-layer-2\", \"line-opacity\", 0.6); // Restore opacity for multiple line layers\n      };\n\n      const handleUpdateLineData = async () => {\n        // hideLine(); // Hide the lines before updating\n        handleZoomChange();\n        await updateLineData(); // Wait for the update to complete\n        // showLine(); // Show the lines after the update\n      };\n\n      // Initial line update\n      handleUpdateLineData();\n\n      // Add event listeners for zoom and move\n      map.on(\"zoom\", handleUpdateLineData);\n      map.on(\"move\", handleUpdateLineData);\n\n      // Cleanup event listeners\n      return () => {\n        map.off(\"zoom\", handleUpdateLineData);\n        map.off(\"move\", handleUpdateLineData);\n      };\n    }\n  }, [updateLineData]);\n\n  useEffect(() => {\n    fetchDatasetsAndMatchProperties();\n  }, []);\n\n  return (\n    <>\n      <SnackbarProvider\n        anchorOrigin={{ vertical: \"bottom\", horizontal: \"center\" }}\n        dense={true}\n        maxSnack={3}\n      >\n        <div className=\"map-and-banner-container\">\n          <Banner />\n          <WelcomeModal />\n          <MapProvider>\n            <Map\n              //   {...context.mapViewState}\n              ref={mapRef}\n              // onLoad={onLoad}\n              initialViewState={DEFAULT_VIEW}\n              mapboxAccessToken={MAPBOX_TOKEN}\n              mapStyle={MAPBOX_STYLE}\n              onClick={handleMapClick}\n              onMouseMove={handleMouseMove}\n              onMouseLeave={handleMouseLeave}\n              maxZoom={23}\n              interactiveLayerIds={[\n                \"custom-threebox-model-2\",\n                \"custom-threebox-model\",\n                \"permitSubmitted\",\n                // 'underAssessment',\n                \"permitApproved\",\n                // 'permitIssued',\n              ]}\n              maxBounds={bounds}\n            >\n              <GeocoderControl\n                mapboxAccessToken={MAPBOX_TOKEN}\n                position=\"top-left\"\n                bbox={[\n                  144.91033993341807, -37.89729001675099, 145.0034423283179,\n                  -37.82156692328041,\n                ]}\n                proximity={{\n                  longitude: 144.956891130868,\n                  latitude: -37.8594284700157,\n                }}\n              />\n              <InformationModal />\n              <FullscreenControl position=\"bottom-right\" />\n              <NavigationControl position=\"bottom-right\" />\n              <ScaleControl position=\"bottom-right\" />\n              <FilterPanel onChange={setLayersVisibility} />\n              <div className=\"action-button-group\">\n                <Tooltip\n                  label={\n                    isWardLabel ? \"Disable Ward\" : \"Enable Ward\"\n                  }\n                  position=\"top\"\n                  withArrow\n                >\n                  <ActionIcon\n                    variant=\"filled\"\n                    color=\"#4a525e\"\n                    aria-label=\"Pin\"\n                    className=\"ward-label-button\"\n                    size=\"md\"\n                    onClick={wardLabelButtonHandle}\n                  >\n                    {!isWardLabel ? (\n                      <IconPolygonOff stroke={1.5} />\n                    ) : (\n                      <IconPolygon stroke={1.5} />\n                    )}\n                  </ActionIcon>\n                </Tooltip>\n                <Tooltip\n                  label={\n                    zoomLevel > 15\n                      ? \"Button disabled: Zoom level too high\"\n                      : isPinned\n                      ? \"Disable Pins\"\n                      : \"Enable Pins\"\n                  }\n                  position=\"top\"\n                  withArrow\n                >\n                  <ActionIcon\n                    variant=\"filled\"\n                    color=\"#4a525e\"\n                    aria-label=\"Pin\"\n                    className=\"pin-button\"\n                    size=\"md\"\n                    onClick={pinButtonHandle}\n                    disabled={zoomLevel > 15}\n                  >\n                    {!isPinned ? (\n                      <IconPinnedOff stroke={1.5} />\n                    ) : (\n                      <IconPin stroke={1.5} />\n                    )}\n                  </ActionIcon>\n                </Tooltip>\n                <Tooltip label=\"Go to Home\" position=\"top\" withArrow>\n                  <ActionIcon\n                    variant=\"filled\"\n                    color=\"#4a525e\"\n                    aria-label=\"Home\"\n                    className=\"home-button\"\n                    size=\"md\"\n                    onClick={flyToHome}\n                  >\n                    <IconHome stroke={1.5} />\n                  </ActionIcon>\n                </Tooltip>\n              </div>\n\n              {showSideBar ? (\n                <aside className=\"sidebar\">\n                  <CustomisedCard\n                    stage={selectedFeature?.properties?.ApplicationStage}\n                    title={selectedFeature?.properties?.SiteName}\n                    status={selectedFeature?.properties?.ApplicationStatus}\n                    applicationURL={selectedFeature?.properties?.ApplicationUrl}\n                  >\n                    {\" \"}\n                    <p>\n                      <b>Stage details:</b>{\" \"}\n                      {selectedFeature?.properties?.ApplicationStatus}\n                    </p>\n                    <p>\n                      <b>Description:</b>{\" \"}\n                      {selectedFeature?.properties?.Description}\n                    </p>\n                    {/* <p>\n                      <b>Planning Permit Number:</b> {selectedFeature?.properties?.FormattedTitle}\n                    </p> */}\n                  </CustomisedCard>\n                </aside>\n              ) : null}\n              <Source\n                id=\"St_Kilda_Road\"\n                type=\"geojson\"\n                data={geojsonData}\n                // url=\"mapbox://coppcdam.cltoxkepc007d1vt1bslqhke0-6ncwq\"\n              >\n                <Layer\n                  {...permitSubmittedLayer}\n                  layout={{ visibility: layersVisibility[\"permitSubmitted\"] }}\n                />\n                <Layer {...baseLayer} />\n                <Layer\n                  {...permitApprovedLayer}\n                  layout={{ visibility: layersVisibility[\"permitApproved\"] }}\n                />\n              </Source>\n              {isPinned && zoomLevel <= 15 && zoomLevel >= 14 && (\n                <div>\n                  <Source id=\"poi-data\" type=\"geojson\" data={POIData}>\n                    <Layer\n                      id=\"poi-layer\"\n                      type=\"symbol\"\n                      layout={{\n                        \"icon-image\": [\"get\", \"icon\"], // Use the custom marker\n                        \"icon-size\": [\n                          \"interpolate\",\n                          [\"linear\"],\n                          [\"zoom\"],\n                          10,\n                          0.1, // Icon size at zoom level 10\n                          15,\n                          0.17, // Icon size at zoom level 15\n                          20,\n                          0.2, // Icon size at zoom level 20\n                          24,\n                          0.25, // Icon size at zoom level 24\n                        ],\n                        \"symbol-z-order\": \"viewport-y\",\n                        \"icon-allow-overlap\": true,\n                        visibility: layersVisibility[\"permitSubmitted\"],\n                      }}\n                      paint={{\n                        \"icon-opacity\": 1,\n                        \"icon-translate\": [\n                          \"interpolate\",\n                          [\"linear\"],\n                          [\"zoom\"],\n                          10,\n                          [0, -50], // At zoom level 10, translate by -30\n                          15,\n                          [0, -80], // At zoom level 15, translate by -60\n                          20,\n                          [0, -120], // At zoom level 20, translate by -120\n                          24,\n                          [0, -180], // At zoom level 24, translate by -180\n                        ],\n                        \"icon-translate-anchor\": \"viewport\", // Ensure the translation is relative to the viewport\n                      }}\n                      filter={[\n                        \"in\",\n                        \"ApplicationStage\",\n                        \"INITASSESS\",\n                        \"PAYMENTRECEIVED\",\n                        \"PUBNOTIFY\",\n                        \"INFREQUEST\",\n                        \"ATPRPTNG\",\n                        \"S5057ALODG\",\n                        \"REFERRED\",\n                        \"UNDERASSES\",\n                        \"CON1PLAN\",\n                        \"COND1RECVD\",\n                        \"COORDREVIEW\",\n                        \"ADVTPREP\",\n                      ]}\n                    />\n                    <Layer\n                      id=\"poi-layer-1\"\n                      type=\"symbol\"\n                      layout={{\n                        \"icon-image\": [\"get\", \"icon\"], // Use the custom marker\n                        \"icon-size\": [\n                          \"interpolate\",\n                          [\"linear\"],\n                          [\"zoom\"],\n                          10,\n                          0.1, // Icon size at zoom level 10\n                          15,\n                          0.17, // Icon size at zoom level 15\n                          20,\n                          0.2, // Icon size at zoom level 20\n                          24,\n                          0.25, // Icon size at zoom level 24\n                        ],\n                        \"symbol-z-order\": \"viewport-y\",\n                        \"icon-allow-overlap\": true,\n                        visibility: layersVisibility[\"permitApproved\"],\n                      }}\n                      paint={{\n                        \"icon-opacity\": 1,\n                        \"icon-translate\": [\n                          \"interpolate\",\n                          [\"linear\"],\n                          [\"zoom\"],\n                          10,\n                          [0, -50], // At zoom level 10, translate by -30\n                          15,\n                          [0, -80], // At zoom level 15, translate by -60\n                          20,\n                          [0, -120], // At zoom level 20, translate by -120\n                          24,\n                          [0, -180], // At zoom level 24, translate by -180\n                        ],\n                        \"icon-translate-anchor\": \"viewport\", // Ensure the translation is relative to the viewport\n                      }}\n                      filter={[\n                        \"in\",\n                        \"ApplicationStage\",\n                        \"APPROVED\",\n                        \"PMTISSUED\",\n                        \"ISSUED\",\n                      ]}\n                    />\n                  </Source>\n                  {POILineData && (\n                    <Source id=\"line-data\" type=\"geojson\" data={POILineData}>\n                      <Layer\n                        id=\"line-layer\"\n                        type=\"line\"\n                        layout={{\n                          \"line-join\": \"round\",\n                          \"line-cap\": \"round\",\n                          visibility: layersVisibility[\"permitSubmitted\"],\n                        }}\n                        paint={{\n                          \"line-color\": \"#898989\",\n                          \"line-width\": 2,\n                          \"line-opacity\": 0.6,\n                        }}\n                        // Insert this layer before the \"poi-layer\" and \"extrusion-layer\"\n                        beforeId=\"poi-layer\" // Replace with the ID of the layer you want it to render behind\n                        filter={[\n                          \"in\",\n                          \"ApplicationStage\",\n                          \"INITASSESS\",\n                          \"PAYMENTRECEIVED\",\n                          \"PUBNOTIFY\",\n                          \"INFREQUEST\",\n                          \"ATPRPTNG\",\n                          \"S5057ALODG\",\n                          \"REFERRED\",\n                          \"UNDERASSES\",\n                          \"CON1PLAN\",\n                          \"COND1RECVD\",\n                          \"COORDREVIEW\",\n                          \"ADVTPREP\",\n                        ]}\n                      />\n                      <Layer\n                        id=\"line-layer-2\"\n                        type=\"line\"\n                        layout={{\n                          \"line-join\": \"round\",\n                          \"line-cap\": \"round\",\n                          visibility: layersVisibility[\"permitApproved\"],\n                        }}\n                        paint={{\n                          \"line-color\": \"#898989\",\n                          \"line-width\": 2,\n                          \"line-opacity\": 0.6,\n                        }}\n                        beforeId=\"poi-layer\"\n                        filter={[\n                          \"in\",\n                          \"ApplicationStage\",\n                          \"APPROVED\",\n                          \"PMTISSUED\",\n                          \"ISSUED\",\n                        ]}\n                      />\n                    </Source>\n                  )}\n                </div>\n              )}\n\n              {isPinned && zoomLevel <= 14 && <ClusteredLayer data={POIData} />}\n\n              {isWardLabel && (\n                <>\n                  <Source id=\"ward-labels\" type=\"geojson\" data={wardLabels}>\n                    <Layer\n                      id=\"ward-label-layer\"\n                      type=\"symbol\"\n                      layout={{\n                        \"text-field\": [\"get\", \"name\"],\n                        \"text-size\": 14,\n                        \"text-font\": [\n                          \"Open Sans Bold\",\n                          \"Arial Unicode MS Bold\",\n                        ],\n                        \"text-offset\": [0, 1],\n                        \"text-anchor\": \"top\",\n                      }}\n                      paint={{\n                        \"text-color\": \"#333333\",\n                        \"text-halo-color\": \"#ffffff\",\n                        \"text-halo-width\": 1,\n                      }}\n                    />\n                  </Source>\n                  <Source\n                    id=\"local-gov-boundaries\"\n                    type=\"geojson\"\n                    data={boundaryData}\n                  >\n                    <Layer\n                      id=\"boundary-layer\"\n                      type=\"line\"\n                      paint={{\n                        \"line-color\": \"#6E6E6E\",\n                        \"line-width\": 2,\n                        \"line-opacity\": 1,\n                      }}\n                    />\n                  </Source>\n                </>\n              )}\n            </Map>\n          </MapProvider>\n        </div>\n      </SnackbarProvider>\n    </>\n  );\n};\n\nexport default Mapbox;\n","import Mapbox from \"../components/Mapbox/Mapbox\";\n\nexport function MapPage() {\n\n  return (\n    <>\n      <Mapbox />\n    </>\n  );\n}\n","import { createBrowserRouter, RouterProvider } from 'react-router-dom';\nimport { HomePage } from './pages/Home.page';\nimport { MapPage } from './pages/Map.page.';\n\nconst router = createBrowserRouter([\n  {\n    path: '/',\n    element: <MapPage />,\n  },\n  {\n    path: '/home',\n    element: <HomePage />,\n  },\n]);\n\nexport function Router() {\n  return <RouterProvider router={router} />;\n}\n","import { createTheme } from '@mantine/core';\n\nexport const theme = createTheme({\n  /** Override Mantine theme properties */\n  components: {\n    Tooltip: {\n      styles: (theme: any) => ({\n        tooltip: {\n          backgroundColor: theme.colors.gray[9], // Dark gray background\n          color: theme.white, // White text color\n          fontSize: \"12px\", // Text size\n          borderRadius: \"0px\", // Rounded corners\n          border: \"2px solid white\",\n          padding: \"4px 8px\", // Inner padding\n          boxShadow: theme.shadows.md, // Add shadow for better visibility\n        },\n        arrow: {\n          backgroundColor: theme.colors.gray[9], // Match arrow color to tooltip background\n        },\n      }),\n    },\n  },\n});\n","import '@mantine/core/styles.css';\nimport '@mantine/notifications/styles.css';\nimport { MantineProvider } from '@mantine/core';\nimport { Router } from './Router';\nimport { theme } from './theme';\nimport './App.css';\nimport \"mapbox-gl/dist/mapbox-gl.css\";\n\nexport default function App() {\n  return (\n    <div id=\"main-container\">\n      <MantineProvider theme={theme}>\n        <Router />\n      </MantineProvider>\n    </div>\n  );\n}\n","import { ReportHandler } from 'web-vitals';\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\n  if (onPerfEntry && onPerfEntry instanceof Function) {\n    import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n      getCLS(onPerfEntry);\n      getFID(onPerfEntry);\n      getFCP(onPerfEntry);\n      getLCP(onPerfEntry);\n      getTTFB(onPerfEntry);\n    });\n  }\n};\n\nexport default reportWebVitals;\n","import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport './index.css';\nimport App from './App';\nimport reportWebVitals from './reportWebVitals';\n\nconst root = ReactDOM.createRoot(\n  document.getElementById('root') as HTMLElement\n);\nroot.render(\n  <React.StrictMode>\n    <App />\n  </React.StrictMode>\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"names":["isPlainObject","require","xtend","DEFAULT_ERROR_PATH","NEWLINE_INDENT","v","createArrayValidator","validators","validatingTuple","Array","isArray","value","index","validationResult","validate","plainArray","length","i","concat","validator","hasOwnProperty","result","processMessage","message","options","len","path","slice","formatErrorMessage","nounPhrase","test","addArticle","prettifyResult","prettyResult","isArrayCulprit","join","assert","rootValidator","errorMessage","apiName","Error","shape","validatorObj","obj","Object","keys","map","key","plainObject","errorMessages","push","split","objectId","strictShape","shapeValidator","shapeResult","invalidKeys","reduce","memo","valueKey","undefined","arrayOf","tuple","arguments","prototype","call","required","requiredValidator","apply","this","__required","oneOfType","messages","filter","Boolean","every","list","orList","m","max","arr","equal","compareWith","JSON","stringify","oneOf","range","min","number","any","boolean","string","func","module","exports","toString","x","getPrototypeOf","nanoid","MapboxEventManager","origin","endpoint","access_token","accessToken","version","sessionID","generateSessionID","userAgent","getUserAgent","send","bind","countries","types","bbox","language","limit","locale","navigator","enableEventLogging","shouldEnableLogging","eventQueue","flushInterval","maxQueueSize","timer","setTimeout","flush","lastSentInput","lastSentIndex","select","selected","geocoder","resultIndex","getSelectedIndex","payload","getEventPayload","resultPlaceName","place_name","resultId","id","queryString","start","keyevent","keyEvent","metaKey","indexOf","keyCode","lastAction","callback","getRequestOptions","request","err","handleError","method","host","headers","body","event","proximity","longitude","latitude","zoom","_map","getZoom","created","Date","sessionIdentifier","country","autocomplete","fuzzyMatch","routing","worldview","mapZoom","keyboardLocale","inputString","_inputEl","opts","xhttp","XMLHttpRequest","header","onreadystatechange","readyState","status","statusText","open","headerValue","setRequestHeader","_typeahead","results","data","selectedID","feature","localGeocoder","clearTimeout","evt","forceFlush","remove","Geolocation","isSupport","window","geolocation","getCurrentPosition","positionOptions","enableHighAccuracy","Promise","resolve","reject","Typeahead","debounce","extend","EventEmitter","exceptions","MapboxClient","mbxGeocoder","localization","subtag","utils","GEOCODE_REQUEST_TYPE","MapboxGeocoder","_eventEmitter","fresh","lastSelected","flyTo","trackProximity","minLength","reverseGeocode","flipCoordinates","marker","mapboxgl","collapsed","clearAndBlurOnEsc","clearOnBlur","enableGeolocation","addressAccuracy","getItemValue","item","render","placeName","splice","addTo","container","addToExistingContainer","document","contains","el","onAdd","appendChild","_controlContainer","addControl","HTMLElement","parent","querySelectorAll","setLanguage","localGeocoderOnly","geocoderService","eventManager","_onChange","_onKeyDown","_onPaste","_onBlur","_showButton","_hideButton","_onQueryResult","clear","_updateProximity","_collapse","_unCollapse","_clear","_clearOnBlur","_geolocateUser","createElement","className","searchIcon","createIcon","type","setPlaceholder","addEventListener","e","actions","classList","add","_clearEl","setAttribute","buttonIcon","_loadingEl","_geolocateEl","geolocateIcon","_showGeolocateButton","typeahead","setRenderFunction","parentDraw","draw","footerNode","_footerNode","div","innerHTML","getFooterNode","selectingListItem","element","mapMarker","_handleMarker","on","_mapboxgl","console","error","_hideGeolocateButton","_showLoadingIcon","then","geolocationPosition","_hideLoadingIcon","geojson","geometry","coordinates","coords","_fly","_showClearButton","config","query","text","_setInputValue","emit","resp","features","locationText","transformFeatureToGeolocationText","user_coordinates","catch","code","_renderUserDeniedGeolocationError","_renderLocationError","_hideAttribution","name","icon","createElementNS","onRemove","parentNode","removeChild","off","_removeMarker","focus","scrollLeft","setSelectionRange","clipboardData","getData","_geocode","ESC_KEY_CODE","TAB_KEY_CODE","blur","target","shadowRoot","activeElement","_hideClearButton","style","display","_showAttribution","flyOptions","properties","short_code","fitBounds","defaultFlyOptions","center","_requestType","search","REVERSE_GEOCODE_COORD_RGX","_setupConfig","requestType","spacesOrCommaRgx","self","isCoordKey","lng","lat","c","parseFloat","reverse","forEach","trimmedSearch","trim","replace","searchInput","forwardGeocode","localGeocoderRes","externalGeocoderRes","geocoderError","response","res","statusCode","externalGeocoder","update","_renderNoResults","_renderError","ev","preventDefault","relatedTarget","getCenter","wrap","setProximity","_renderMessage","msg","renderError","_getPlaceholderText","placeholder","firstLanguage","localizedValue","setInput","showSuggestions","disableTrackProximity","getProximity","fn","getRenderFunction","browserLocale","userLanguage","browserLanguage","getLanguage","setZoom","getFlyTo","setFlyTo","getPlaceholder","getBbox","setBbox","getCountries","setCountries","getTypes","setTypes","getMinLength","setMinLength","getLimit","setLimit","getFilter","setFilter","setOrigin","getOrigin","setAccessToken","setAutocomplete","getAutocomplete","setFuzzyMatch","getFuzzyMatch","setRouting","getRouting","setWorldview","getWorldview","markerOptions","color","Marker","setLngLat","removeListener","getAddressInfo","houseNumber","address","street","addrInfo","context","layer","accuracy","accuracyIndex","acc","client","browser","MapiClient","BrowserClient","create","constructor","sendRequest","browserSend","abortRequest","browserAbort","MapiResponse","MapiError","constants","parseHeaders","requestsUnderway","normalizeBrowserProgressEvent","total","transferred","loaded","percent","sendRequestXhr","xhr","onprogress","emitter","EVENT_PROGRESS_DOWNLOAD","file","upload","EVENT_PROGRESS_UPLOAD","onerror","onabort","mapiError","ERROR_REQUEST_ABORTED","onload","getAllResponseHeaders","createResponse","createRequestXhr","url","abort","parseToken","MapiRequest","API_ORIGIN","createRequest","requestOptions","errorType","ERROR_HTTP","parse","urlUtils","requestId","defaultHeaders","headersWithDefaults","toLowerCase","_options","sent","aborted","params","encoding","sendFileAs","prependOrigin","appendQueryObject","routeParams","actualAccessToken","appendQueryParam","accessTokenOwnerId","user","ownerId","interpolateRouteParams","EVENT_RESPONSE","EVENT_ERROR","_nextPageRequest","eachPage","handleResponse","nextPageRequest","nextPage","getPage","clone","_extend","extendedOptions","parseLinkHeader","responseData","rawBody","parseError","links","link","hasNextPage","next","raw","rawHeader","parsed","boundary","substring","parseSingleHeader","linkHeader","parts","match","linkUrl","linkParams","rel","parsedLinkParams","param","parseParam","parseLink","encodeValue","encodeURIComponent","String","punctuation","queryObject","delimiter","route","_","paramId","has","prefix","Events","EE","once","addListener","TypeError","listener","_events","_eventsCount","clearEvent","__proto__","eventNames","events","names","getOwnPropertySymbols","listeners","handlers","l","ee","listenerCount","a1","a2","a3","a4","a5","args","j","removeAllListeners","prefixed","pick","stringifyBooleans","createServiceFactory","Geocoding","featureTypes","assertShape","mode","reverseMode","createClient","ServicePrototype","clientOrConfig","isPrototypeOf","service","cb","source","val","objectMap","global","Blob","ArrayBuffer","pipe","date","getTime","isNaN","base64","tokenCache","token","usage","rawPayload","parsedPayload","decode","parsePaylod","u","authorization","a","expires","exp","iat","scopes","lastLogin","ll","impersonator","iu","root","freeExports","freeGlobal","InvalidCharacterError","TABLE","REGEX_SPACE_CHARACTERS","input","b","buffer","padding","output","position","charCodeAt","charAt","bitStorage","bitCounter","fromCharCode","define","ReflectOwnKeys","R","Reflect","ReflectApply","receiver","Function","ownKeys","getOwnPropertyNames","NumberIsNaN","Number","init","errorListener","resolver","eventTargetAgnosticAddListener","handler","flags","addErrorHandlerIfEventEmitter","_maxListeners","defaultMaxListeners","checkListener","_getMaxListeners","that","_addListener","prepend","existing","warning","newListener","unshift","warned","w","count","warn","onceWrapper","fired","wrapFn","_onceWrap","state","wrapped","_listeners","unwrap","evlistener","ret","unwrapListeners","arrayClone","n","copy","wrapListener","arg","removeEventListener","defineProperty","enumerable","get","set","RangeError","setMaxListeners","getMaxListeners","doError","er","prependListener","prependOnceListener","originalListener","shift","pop","spliceOne","rawListeners","fuzzy","simpleFilter","pattern","array","str","ch","patternIdx","totalScore","currScore","pre","post","compareString","caseSensitive","idx","Infinity","rendered","score","prev","extract","original","sort","compare","NAN","symbolTag","reTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","parseInt","freeSelf","objectToString","nativeMax","Math","nativeMin","now","isObject","toNumber","isObjectLike","isSymbol","other","valueOf","isBinary","wait","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","invokeFunc","time","thisArg","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","remainingWait","debounced","isInvoking","leadingEdge","cancel","t","r","API_URL","API_URL_REGEX","process","RegExp","API_TILEJSON_REGEX","API_SPRITE_REGEX","API_FONTS_REGEX","API_STYLE_REGEX","API_CDN_URL_REGEX","EVENTS_URL","URL","hostname","SESSION_PATH","FEEDBACK_URL","TILE_URL_VERSION","RASTER_URL_PREFIX","RASTERARRAYS_URL_PREFIX","REQUIRE_ACCESS_TOKEN","ACCESS_TOKEN","DEFAULT_STYLE","MAX_PARALLEL_IMAGE_REQUESTS","DRACO_URL","MESHOPT_URL","MESHOPT_SIMD_URL","GLYPHS_URL","s","o","load","fullLoad","includes","h","__esModule","default","p","f","setMatrixArrayType","ARRAY_TYPE","toRadian","g","equals","abs","d","RANDOM","EPSILON","Float32Array","y","random","PI","hypot","sqrt","Symbol","iterator","identity","fromValues","transpose","invert","adjoint","determinant","multiply","rotate","sin","cos","scale","fromRotation","fromScaling","frob","LDU","subtract","M","exactEquals","multiplyScalar","multiplyScalarAndAdd","sub","mul","getOwnPropertyDescriptor","WeakMap","A","S","I","P","translate","fromTranslation","E","k","z","T","B","fromMat4","fromMat2d","fromQuat","normalFromMat4","projection","V","C","D","L","F","U","N","rotateX","rotateY","rotateZ","fromXRotation","fromYRotation","fromZRotation","fromRotationTranslation","fromQuat2","getTranslation","getScaling","q","getRotation","fromRotationTranslationScale","fromRotationTranslationScaleOrigin","frustum","perspectiveNO","$","perspectiveZO","tan","perspectiveFromFieldOfView","upDegrees","downDegrees","leftDegrees","rightDegrees","orthoNO","G","orthoZO","lookAt","targetTo","Q","ortho","perspective","O","Y","X","Z","H","K","J","tt","et","divide","rt","ceil","floor","round","scaleAndAdd","distance","nt","squaredDistance","it","squaredLength","st","negate","inverse","normalize","dot","at","cross","lerp","hermite","bezier","transformMat4","transformMat3","transformQuat","angle","acos","zero","sqrLen","sqrDist","dist","W","ot","lt","ut","ct","ft","ht","dt","mt","yt","gt","xt","bt","vt","pt","_t","wt","Et","setAxisAngle","zt","getAxisAngle","Mt","getAngle","Lt","Tt","calculateW","Bt","ln","Ct","pow","Dt","slerp","Rt","conjugate","fromMat3","Vt","fromEuler","setAxes","sqlerp","rotationTo","Pt","At","St","It","kt","atan2","log","Ft","Ot","Ut","Nt","jt","qt","$t","Gt","Qt","Yt","Xt","Zt","Kt","Wt","Ht","fromRotationTranslationValues","ne","Jt","te","ie","getDual","setDual","rotateByQuatAppend","rotateByQuatPrepend","rotateAroundAxis","se","ae","le","setReal","getReal","re","oe","ue","ce","fe","he","de","me","ye","ge","xe","be","ve","transformMat2","transformMat2d","pe","_e","we","aa","vec4","vec3","vec2","quat2","bl","quat","a9","mat4","mat3","mat2d","b7","mat2","glMatrix","Me","Re","Ae","Se","Ie","ke","Pe","Ee","ze","Te","Be","Ce","Ve","De","cx","bx","ax","cy","by","ay","p1x","p1y","p2x","p2y","sampleCurveX","sampleCurveY","sampleCurveDerivativeX","solveCurveX","solve","Le","Fe","Oe","_add","_sub","multByPoint","_multByPoint","divByPoint","_divByPoint","mult","_mult","_div","_rotate","rotateAround","_rotateAround","matMult","_matMult","unit","_unit","perp","_perp","_round","mag","distSqr","angleTo","angleWith","angleWithSep","convert","Ue","Ne","je","qe","$e","Ge","Qe","Ye","Xe","Ze","Ke","We","He","Je","_len","_key","tr","rr","nr","LN2","ir","sr","ar","or","lr","ur","cr","hr","pr","fr","dr","_ref","azimuthal","polar","mr","WorkerGlobalScope","yr","gr","xr","br","vr","_r","wr","Mr","Ar","setItem","removeItem","Sr","Ir","kr","Pr","Er","zr","OffscreenCanvas","getContext","createImageBitmap","Tr","performance","setNow","restoreNow","frame","requestAnimationFrame","cancelAnimationFrame","getImageData","width","height","willReadFrequently","clearRect","drawImage","resolveURL","href","devicePixelRatio","prefersReducedMotion","matchMedia","matches","hasCanvasFingerprintNoise","fillStyle","fillRect","Br","URLSearchParams","Cr","persistentParams","Rr","Lr","Fr","Vr","Dr","Or","caches","Ur","Nr","jr","supported","testSupport","Gr","$r","Qr","Xr","qr","Yr","createTexture","bindTexture","TEXTURE_2D","texImage2D","RGBA","UNSIGNED_BYTE","isContextLost","deleteTexture","src","Zr","Unknown","Style","Source","Tile","Glyphs","SpriteImage","SpriteJSON","Image","Model","freeze","Kr","super","Wr","worker","referrer","location","protocol","Hr","fetch","Request","AbortController","credentials","referrerPolicy","signal","validateOrFetch","ok","finishRequest","arrayBuffer","json","Headers","toUTCString","Response","ReadableStream","blob","put","delete","actor","responseType","withCredentials","getResponseHeader","Jr","tn","en","rn","nn","sn","accept","requestParameters","cancelled","advanceImageRequestQueue","Uint8Array","revokeObjectURL","byteLength","createObjectURL","an","un","authority","cn","hn","pn","decodeURIComponent","atob","anonId","eventData","queue","pendingRequest","getStorageKey","btoa","fetchEventData","localStorage","getItem","saveEventData","processRequests","postEvent","toISOString","queueRequest","dn","_customAccessToken","postTurnstileEvent","some","lastSuccess","tokenU","getDate","sdkIdentifier","sdkVersion","skuId","userId","mn","yn","success","skuToken","postMapLoadEvent","errorCb","timestamp","gn","xn","eventIdPerMapInstanceMap","Map","mapInstanceIdMap","getMapInstanceId","getEventId","postStyleLoadEvent","importedStyles","mapInstanceId","eventId","bn","vn","postPerformanceEvent","performanceData","getEntriesByType","startTime","responseEnd","transferSize","connection","mozConnection","webkitConnection","effectiveType","counters","metadata","attributes","addMetric","interactionRange","find","visibilityHidden","terrainEnabled","fogEnabled","screen","innerWidth","innerHeight","renderer","vendor","_n","wn","getSession","getSessionAPI","Mn","An","Set","Sn","In","kn","Pn","En","zn","murmur3","murmur2","Tn","Bn","Cn","Rn","Vn","Dn","_oneTimeListeners","fire","listens","_eventedParent","_eventedParentData","setEventedParent","Ln","transparent","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","Fn","On","Un","Nn","parseCSSColor","substr","jn","toArray","toArray01","toArray01Scaled","toArray01PremultipliedAlpha","toArray01Linear","qn","$n","Gn","Qn","_len2","_key2","Yn","Xn","bindings","Zn","kind","Kn","Wn","Hn","Jn","ti","ei","ri","ni","ii","si","itemType","ai","oi","li","ui","ci","hi","sensitivity","collator","Intl","Collator","resolvedLocale","resolvedOptions","pi","image","fontStack","textColor","fi","sections","fromString","isEmpty","namePrimary","factory","serialize","di","nameSecondary","available","mi","yi","gi","xi","bi","expectedType","evaluate","eachChild","outputDefined","vi","toJSON","_i","object","wi","Mi","font","content","Ai","inputPrimary","inputSecondary","availableImages","Si","Ii","ki","registry","literal","parseColor","Pi","Ei","globals","featureState","formattedSection","_parseColorCache","canonical","featureTileCoord","featureDistanceData","scope","geometryType","canonicalID","measureLight","brightness","distanceFromCenter","bearing","getConfig","zi","_evaluate","_overloadIndex","definitions","overloads","qs","_scope","checkSubtype","errors","_ref2","Ti","register","Bi","diacriticSensitive","Ci","Ri","Vi","Di","Li","Fi","Oi","Ui","Ni","ji","qi","$i","Gi","Qi","Yi","Xi","Zi","Ki","Wi","Hi","Ji","geometries","ts","kilometers","miles","nauticalmiles","meters","metres","yards","feet","inches","kx","ky","units","configurable","fromTile","atan","destination","offset","lineDistance","area","along","pointToSegmentDistance","pointOnLine","point","lineSlice","lineSliceAlong","bufferPoint","bufferBBox","insideBBox","defineProperties","es","rs","_down","_up","peek","ns","is","ss","as","os","ls","us","cs","hs","ps","fs","ds","NaN","ms","ys","gs","xs","bs","vs","_s","ws","Ms","As","Ss","Is","ks","Ps","range1","range2","Es","zs","Ts","Bs","Cs","Rs","Vs","Ds","Ls","values","minValue","maxValue","stepValue","Fs","Os","Us","Ns","js","boundExpression","_parse","typeAnnotation","$s","_len3","_key3","Gs","Qs","labels","outputs","Ys","Xs","Zs","Ks","Ws","Hs","Js","ta","ea","ra","na","ia","sa","alpha","oa","la","forward","interpolate","ua","ca","hcl","lab","ha","operator","interpolation","interpolationFactor","pa","base","controlPoints","fa","da","ma","ya","needle","haystack","ga","fromIndex","xa","inputType","cases","otherwise","MAX_SAFE_INTEGER","ba","branches","_ref3","va","beginIndex","endIndex","_a","wa","Ma","lhs","rhs","hasUntypedArgument","Aa","Sa","Ia","ka","Pa","Ea","za","currency","minFractionDigits","maxFractionDigits","NumberFormat","minimumFractionDigits","maximumFractionDigits","format","Ta","Ba","imul","Ca","case","coalesce","in","let","step","var","within","Ra","_ref4","Va","_ref5","Da","La","Fa","Oa","Ua","Na","parameters","ja","qa","expression","$a","Ga","interpolated","Qa","Ya","Xa","stops","property","colorSpace","Ha","Wa","Ka","Ja","interpolationType","zoomStops","_ref6","_ref7","Za","interp","_len4","_key4","_ref8","typeof","_ref9","_ref10","rgb","rgba","hsl","hsla","_ref11","_ref12","_ref13","_ref14","_ref15","pitch","_ref16","heatmapDensity","lineProgress","rasterValue","rasterParticleSpeed","skyRadialProgress","accumulated","_ref17","_ref18","_ref19","_ref20","ln2","_ref21","_ref22","log10","_ref23","LN10","_ref24","log2","_ref25","_ref26","_ref27","_ref28","asin","_ref29","_ref30","_ref31","_ref32","_ref33","_ref34","_ref35","_ref36","_ref37","_ref38","_ref39","_ref40","_ref41","_ref42","_ref43","_ref44","_ref45","_ref46","_ref47","_ref48","_ref49","_ref50","_ref51","all","_ref52","_ref53","_ref54","_ref55","isSupportedScript","upcase","_ref56","toUpperCase","downcase","_ref57","_ref58","to","_warningHistory","_evaluator","_defaultValue","_enumValues","evaluateWithoutErrorHandling","eo","ro","enum","formatted","resolvedImage","no","_styleExpression","isLightConstant","isStateDependent","isConfigDependent","io","so","relaxZoomRestriction","oo","ao","_parameters","_specification","deserialize","lo","co","uo","cells","Int32Array","subarray","bboxes","insert","_insertReadonly","extent","uid","_forEachCell","_insertCell","_queryCell","_convertToCellCoord","_convertFromCellCoord","toArrayBuffer","ho","po","fo","writeable","klass","omit","_classRegistryKey","mo","yo","ImageBitmap","go","isView","ImageData","$name","entries","xo","bo","Arabic","Khmer","Hiragana","Katakana","Bopomofo","Kanbun","vo","Mo","_o","wo","Ao","So","Io","ko","Po","Eo","zo","To","Bo","Co","Ro","Vo","Do","pluginStatus","pluginURL","Lo","Fo","Oo","applyArabicShaping","processBidirectionalText","processStyledBidirectionalText","isLoaded","isLoading","setState","isParsed","getPluginURL","Uo","fadeDuration","transition","No","specification","isDataDriven","possiblyEvaluate","jo","transitioned","$o","untransitioned","qo","_properties","_values","defaultTransitionablePropertyValues","getValue","setValue","setTransitionOrValue","setTransition","getTransition","Go","delay","duration","begin","end","prior","defaultTransitioningPropertyValues","Xo","hasTransition","Qo","defaultPropertyValues","Yo","isConstant","constantOr","defaultPossiblyEvaluatedValues","Zo","Ko","overrides","Wo","Ho","overridableProperties","overridable","Jo","tl","rl","nl","needGeometry","needFeature","cl","al","sl","il","filterFunc","dynamicFilterFunc","dynamicFilter","ul","ol","hl","dl","pl","fl","ml","yl","gl","xl","fqid","_featureFilter","_filterCompiled","minzoom","maxzoom","sourceLayer","slot","layout","_unevaluatedLayout","paint","_transitionablePaint","setPaintProperty","setLayoutProperty","_transitioningPaint","isDraped","getLayoutProperty","visibility","possiblyEvaluateVisibility","getPaintProperty","_handleSpecialPaintPropertyUpdate","_handleOverridablePaintPropertyUpdate","getProgramIds","getDefaultProgramParams","isHidden","updateTransitions","recalculate","is3D","isSky","isTileClipped","hasOffscreenPass","hasShadowPass","canCastShadows","hasLightBeamPass","cutoffRange","tileCoverLift","resize","compileFilter","invalidateCompiledFilter","dynamicFilterNeedsFeature","getLayerRenderingStats","_stats","resetLayerRenderingStats","renderPass","numRenderedVerticesInShadowPass","numRenderedVerticesInTransparentPass","queryRadius","queryIntersectsFeature","queryIntersectsMatchingFeature","vl","Int8","Int8Array","Uint8","Int16","Int16Array","Uint16","Uint16Array","Int32","Uint32","Uint32Array","Float32","_l","_structArray","_pos1","size","_pos2","_pos4","_pos8","wl","isTransferred","capacity","_trim","bytesPerElement","_refreshViews","reserve","uint8","emplace","emplaceBack","destroy","int8","int16","uint16","int32","uint32","float32","Ml","members","BYTES_PER_ELEMENT","Al","components","alignment","Sl","Il","kl","Pl","El","zl","Tl","Bl","Cl","Rl","Vl","Dl","Ll","Fl","Ol","Ul","Nl","jl","ql","$l","Gl","Ql","Yl","Xl","Zl","Kl","Wl","Hl","Jl","tu","eu","ru","projectedAnchorX","projectedAnchorY","projectedAnchorZ","tileAnchorX","tileAnchorY","x1","y1","x2","y2","featureIndex","sourceLayerIndex","bucketIndex","nu","glyphStartIndex","numGlyphs","vertexStartIndex","lineStartIndex","lineLength","segment","lowerSize","upperSize","lineOffsetX","lineOffsetY","writingMode","placedOrientation","hidden","crossTileID","associatedIconIndex","flipState","su","au","rightJustifiedTextSymbolIndex","centerJustifiedTextSymbolIndex","leftJustifiedTextSymbolIndex","verticalPlacedTextSymbolIndex","placedIconSymbolIndex","verticalPlacedIconSymbolIndex","textBoxStartIndex","textBoxEndIndex","verticalTextBoxStartIndex","verticalTextBoxEndIndex","iconBoxStartIndex","iconBoxEndIndex","verticalIconBoxStartIndex","verticalIconBoxEndIndex","numHorizontalGlyphVertices","numVerticalGlyphVertices","numIconVertices","numVerticalIconVertices","useRuntimeCollisionCircles","textOffset0","textOffset1","collisionCircleDiameter","zOffset","hasIconTextFit","ou","lu","getoffsetX","uu","getx","gety","cu","layoutVertexArrayOffset","hu","pu","geta_centroid_pos0","geta_centroid_pos1","fu","du","mu","segments","_prepareSegment","MAX_VERTEX_ARRAY_LENGTH","vertexLength","sortKey","vertexOffset","primitiveOffset","primitiveLength","prepareSegment","vaos","simpleSegment","yu","gu","xu","bu","ids","uniqueIds","positions","indexed","vu","eachPosition","Float64Array","_u","MIN_SAFE_INTEGER","wu","Mu","initialized","fetchUniformLocation","getUniformLocation","Au","current","uniform1i","Su","uniform1f","Iu","uniform2f","ku","uniform3f","Pu","uniform4f","Eu","zu","Tu","uniformMatrix4fv","Bu","Cu","Ru","uniformMatrix2fv","Vu","Du","uniformNames","setUniform","getBinding","Lu","pixelRatio","setConstantPatternPositions","Fu","paintVertexAttributes","paintVertexArray","populatePaintArray","_setPaintValue","updatePaintArray","paintVertexBuffer","updateData","createVertexBuffer","Ou","useIntegerZoom","Uu","layerId","_setPaintValues","patterns","Nu","binders","_buffers","$u","endsWith","Yu","cacheKey","getMaxValue","populatePaintArrays","updatePaintArrays","defines","getBinderAttributes","getBinderUniforms","getPaintVertexBuffers","getUniforms","binding","setUniforms","updatePaintBuffers","ju","programConfigurations","needsUpload","_featureMap","_featureMapWithoutIds","_bufferOffset","_idlessCounter","qu","Gu","composite","Qu","Xu","Zu","Ku","Wu","Hu","Ju","tc","ec","rc","nc","ic","sc","ac","distanceTo","toBounds","oc","toEcef","lon","setSouthWest","setNorthEast","_ne","_sw","getSouthWest","getNorthEast","getNorthWest","getWest","getNorth","getSouthEast","getEast","getSouth","lc","getURL","srs","getTileBBox","getMercCoords","uc","cc","fc","hc","pc","overscaledZ","scaledTo","calculateScaledKey","isChildOf","children","isLessThan","unwrapTo","overscaleFactor","toUnwrapped","dc","mc","yc","gc","xc","bc","vc","_c","wc","Mc","Ac","Sc","Ic","kc","Pc","Ec","fromLngLat","toLngLat","toAltitude","meterInMercatorCoordinateUnits","zc","Tc","Bc","Cc","Rc","Vc","Dc","Lc","loadGeometry","isReprojectedInTileSpace","project","Fc","Oc","Uc","Nc","overscaling","layers","layerIds","hasPattern","layoutVertexArray","indexArray","stateDependentLayerIds","populate","globeExtVertexArray","addFeature","stateDependentLayers","uploadPending","uploaded","layoutVertexBuffer","indexBuffer","createIndexBuffer","globeExtVertexBuffer","projectTilePoint","upVector","jc","Wc","Qc","qc","Xc","$c","Kc","Gc","Yc","Zc","Hc","Jc","th","eh","rh","nh","ih","sh","ah","layout_circle","oh","paint_circle","lh","pos","dir","intersectsPlane","closestPointOnSphere","uh","TL","TR","BR","BL","horizon","fromInvProjectionMatrix","hh","planes","ph","projections","points","axis","fh","dh","fill","bounds","mh","fromPoints","frustumEdges","intersectsPrecise","fromTileIdAndHeight","applyTransform","getCorners","projectAabbCorners","quadrant","distanceX","distanceY","distanceZ","intersects","intersectsAabb","intersectsFlat","intersectsPreciseFlat","intersectsAabbXY","encapsulate","encapsulatePoint","closestPoint","yh","gh","xh","bh","vh","_h","wh","_camera","worldSize","pixelMatrixInverse","globeMatrix","Mh","Ah","Sh","zh","Eh","Ih","kh","Ph","_tileCoverLift","MAX_VALUE","Oh","_ref59","_pixelsPerMercatorPixel","_ref60","Th","Bh","_ref61","Ch","Rh","Vh","Dh","Lh","Fh","Uh","_center","_pitch","cameraToCenterDistance","pixelsPerMeter","Nh","jh","qh","$h","Gh","Qh","Yh","queryGeometry","isAboveHorizon","pixelToTileUnitsFactor","tileID","upVectorScale","metersToTile","elevation","exaggeration","getElevationAt","Xh","tilespaceRays","Wh","screenGeometry","Zh","Kh","Hh","Jh","_ref62","Uint8ClampedArray","tp","ep","rp","np","ip","sp","layout_heatmap","ap","paint_heatmap","op","resolution","clips","renderPixel","evaluationKey","lp","layout_hillshade","up","paint_hillshade","cp","hp","pp","fp","dp","steiner","Sp","_p","wp","yp","Fp","Vp","Ep","Dp","mp","Pp","Ap","prevZ","nextZ","xp","gp","bp","vp","Ip","zp","Cp","kp","Rp","Mp","Bp","Tp","Lp","deviation","flatten","vertices","holes","dimensions","Op","Up","Np","jp","patternDependencies","qp","$p","patternFeatures","indexArray2","segments2","addFeatures","indexBuffer2","Gp","layout_fill","Qp","paint_fill","Yp","Xp","Zp","Kp","Wp","Hp","Jp","tf","ef","rf","_pbf","_geometry","_keys","readFields","nf","readVarint","sf","readSVarint","toGeoJSON","af","of","lf","_features","uf","readString","readFloat","readDouble","readVarint64","readBoolean","cf","hf","pf","VectorTile","ff","VectorTileFeature","df","mf","yf","gf","xf","bf","vf","indices","grid","_f","VectorTileLayer","wf","minimums","maximums","leaves","getElevation","toIdx","isLeaf","Mf","Af","Sf","If","kf","childOffsets","nodeCount","dem","_siblingOffset","dim","blockSamples","Ef","_addNode","_construct","raycastRoot","raycast","nodex","nodey","depth","Pf","zf","mapbox","terrarium","Tf","Bf","Cf","tree","_tree","_buildQuadTree","stride","pixels","floatView","borderReady","_modifiedForSources","_idx","_timestamp","getUnpackVector","pack","getPixels","backfillBorder","onDeserialize","Rf","_demTile","_dem","_scale","_offset","findDEMTileFor","tileCoordToPixel","getElevationAtPixel","getMeterToDEM","Vf","Df","Lf","Ff","Of","Uf","Nf","jf","qf","$f","Gf","vertexCount","indexOffset","indexCount","Qf","centroidXY","vertexArrayOffset","groundVertexArrayOffset","groundVertexCount","footprintSegIdx","footprintSegLen","polygonSegIdx","polygonSegLen","span","Yf","accCount","centroidDataIndex","startRing","appendEdge","borders","processBorderOverlap","checkBorderIntersection","addBorderIntersection","centroid","intersectsCount","Xf","Zf","Kf","Wf","vertexArray","_segments","hiddenByLandmarkVertexArray","_segmentToGroundQuads","_segmentToRegionTriCounts","regionSegments","getDefaultSegment","hasData","addData","rd","nd","region","prepareBorderSegments","addPaintPropertiesData","vertexBuffer","uploadPaintProperties","updateHiddenByLandmark","_needsHiddenByLandmarkUpdate","uploadHiddenByLandmark","hiddenByLandmarkVertexBuffer","Hf","edgeRadius","activeReplacements","replacementUpdateTime","centroidData","footprintIndices","footprintVertices","footprintSegments","centroidVertexArray","groundEffect","maxHeight","partLookup","triangleSubSegments","polygonSegments","featuresOnBorder","borderFeatureIndices","borderDoneWithNeighborZ","tileToMeter","sortBorders","splitToSubtiles","layoutVertexExtArray","layoutVertexExtBuffer","uploadCentroid","needsCentroidUpdate","centroidVertexBuffer","od","polygon","isDuplicate","triangleArrayOffset","triangleCount","triangleSegIdx","ringIndices","td","ed","Jf","sd","encodeCentroid","centroidIdx","subtile","polygonSegmentIdx","triangleSegmentIdx","getVisibleSegments","getMinMaxForTile","mix","encodeBorderCentroid","showCentroid","writeCentroidToBuffer","createCentroidsBuffer","updateReplacement","updateTime","getReplacementRegionsForTile","sourceId","footprintTileId","ld","footprint","footprintContainsPoint","getHeightAtTileCoord","NEGATIVE_INFINITY","ad","addResult","polygons","ud","cd","hd","pd","fd","isFinite","dd","top","md","yd","gd","xd","bd","vd","_d","nextRow","getDash","getKey","getDashRanges","left","right","isDash","zeroLength","addRoundDash","addRegularDash","addDash","wd","Md","Ad","Sd","lineClipsArray","gradients","layoutVertexArray2","patternVertexArray","maxLineLength","lineAtlas","addConstantDashes","addFeatureDashes","layoutVertexBuffer2","patternVertexBuffer","lineFeatureClips","mapbox_clip_start","mapbox_clip_end","lineClips","addLine","scaledDistance","totalDistance","lineSoFar","patternJoinNone","segmentStart","segmentPoints","updateScaledDistance","e1","e2","updateDistance","addCurrentVertex","addHalfVertex","_ref63","Id","layout_line","kd","paint_line","Pd","tileSize","Ed","tileZoom","zd","translatePosMatrix","projMatrix","Td","Bd","Cd","Rd","Vd","Dd","Ld","Fd","Od","Ud","Nd","jd","qd","$d","Gd","Qd","layoutSize","minZoom","maxZoom","minSize","maxSize","Yd","_ref64","_ref65","uSize","uSizeT","Xd","Zd","SIZE_PACK_FACTOR","evaluateSizeForFeature","evaluateSizeForZoom","getSizeData","Kd","toLocaleUpperCase","toLocaleLowerCase","Wd","Hd","Jd","tm","read","write","em","nm","rm","buf","Varint","Fixed64","Bytes","Fixed32","im","sm","am","TextDecoder","om","lm","um","realloc","cm","writeVarint","hm","writeSVarint","pm","writeFloat","fm","writeDouble","dm","writeBoolean","mm","writeFixed32","ym","writeSFixed32","gm","writeFixed64","xm","writeSFixed64","bm","vm","_m","skip","readMessage","readFixed32","readSFixed32","readFixed64","readSFixed64","readBytes","readPackedVarint","readPackedSVarint","readPackedBoolean","readPackedFloat","readPackedDouble","readPackedFixed32","readPackedSFixed32","readPackedFixed64","readPackedSFixed64","writeTag","finish","writeString","writeBytes","writeRawMessage","writeMessage","writePackedVarint","writePackedSVarint","writePackedBoolean","writePackedFloat","writePackedDouble","writePackedFixed32","writePackedSFixed32","writePackedFixed64","writePackedSFixed64","writeBytesField","writeFixed32Field","writeSFixed32Field","writeFixed64Field","writeSFixed64Field","writeVarintField","writeSVarintField","writeStringField","writeFloatField","writeDoubleField","writeBooleanField","wm","Mm","Am","glyphs","Sm","bitmap","advance","Im","metrics","ascender","descender","km","Pm","horizontal","vertical","horizontalOnly","Em","imageName","forText","forImage","zm","sectionIndex","imageSectionID","fromFeature","addImageSection","addTextSection","getSection","getSections","getSectionIndex","getCodePoint","codePointAt","verticalizePunctuation","Bm","getMaxScale","getNextImageSectionCharCode","fromCodePoint","Tm","Rm","Cm","Lm","Dm","Fm","positionedLines","bottom","iconsInText","verticalizable","hasBaseline","positionedGlyphs","lineOffset","paddedRect","displaySize","localGlyph","glyph","rect","Um","horizontalAlign","verticalAlign","Om","Vm","badness","priorBreak","Nm","imagePrimary","imageSecondary","jm","collisionPadding","qm","$m","angleDelta","Gm","Qm","Ym","Xm","Zm","Km","Wm","Hm","Jm","ty","_ref66","stretchX","stretchY","ey","haveRenderCallbacks","addImages","sdf","iconPositions","patternPositions","hasRenderCallback","patchUpdatedImages","hasImage","dispatchRenderCallbacks","getUpdatedImages","patchUpdatedImage","getImage","useMipmap","ry","ny","iy","sy","none","ideographs","oy","requestManager","localGlyphMode","localFontFamily","urls","localGlyphs","setURL","getGlyphs","stack","_ref67","requests","ranges","_tinySDF","loadGlyphRange","_doesCharSupportLocalGlyph","tinySDF","TinySDF","fontFamily","fontWeight","fontSize","radius","glyphWidth","glyphHeight","glyphLeft","glyphTop","glyphAdvance","transformRequest","normalizeGlyphsURL","cutoff","fontStyle","_createCanvas","ctx","textBaseline","textAlign","gridOuter","gridInner","actualBoundingBoxAscent","actualBoundingBoxDescent","actualBoundingBoxLeft","actualBoundingBoxRight","measureText","fillText","ly","uy","reduceRanges","makeBox","py","stretch","fy","fixed","texPrimary","texSecondary","glyphOffset","pixelOffsetTL","pixelOffsetBR","minFontScaleX","minFontScaleY","isSDF","hy","dy","my","yy","gy","SQRT2","xy","POSITIVE_INFINITY","vy","_ref68","_y","wy","textMaxSize","Iy","tilePixelRatio","hasAnyIconTextFit","allowVerticalPlacement","addSymbolAtAnchor","anchor","addToLineVertexArray","Py","iconSizeData","Ay","My","compositeIconSizes","addSymbols","placedSymbolArray","Sy","getCollisionCircleHeight","glyphOffsetArray","addToSortKeyRanges","symbolInstances","collisionBoxArray","Ey","textSizeData","compositeTextSizes","compareText","zy","fovAboveCenter","getMinElevationBelowMSL","_horizonShift","Ty","By","_ref69","Cy","Ry","spec","requiresDraping","supportsWorldCopies","supportsTerrain","supportsFog","supportsFreeCamera","zAxisUnit","unsupportedLayers","unproject","locationPoint","_coordinatePoint","locationCoordinate","pixelSpaceConversion","farthestPixelDistance","pointCoordinate","horizonLineFromTop","rayIntersectionCoordinate","pointRayIntersection","pointCoordinate3D","isPointAboveHorizon","createInversionMatrix","createTileMatrix","zoomScale","Vy","parallels","r0","sign","Dy","Ly","Fy","Oy","Uy","Ny","jy","qy","$y","Gy","southernCenter","Qy","Yy","Xy","Zy","Ky","Wy","cosPhi","Hy","getAtPointOrZero","_centerAltitude","pixelMatrix","from","Jy","tg","eg","rg","ng","ig","sg","ag","og","dynamicLayoutVertexArray","opacityVertexArray","iconTransitioningVertexArray","zOffsetVertexArray","dynamicLayoutVertexBuffer","opacityVertexBuffer","iconTransitioningVertexBuffer","zOffsetVertexBuffer","itemSize","lg","layoutAttributes","collisionVertexArray","collisionVertexArrayExt","collisionVertexBuffer","collisionVertexBufferExt","ug","hasRTLText","fullyClipped","sortKeyRanges","collisionCircleArray","placementInvProjMatrix","placementViewportMatrix","canOverlap","sortFeaturesByKey","sortFeaturesByY","writingModes","sourceID","hasAnyZOffset","zOffsetSortDirty","zOffsetBuffersNeedUpload","createArrays","lineVertexArray","calculateGlyphDependencies","iconDependencies","glyphDependencies","predicate","getValueAndResolveTokens","updateZOffset","addZOffsetTextVertex","addZOffsetIconVertex","hasDebugData","textCollisionBox","iconCollisionBox","destroyDebugData","getProjection","projectionInstance","_commitLayoutVertex","_addCollisionDebugVertices","_commitDebugCollisionVertexUpdate","_addTextDebugCollisionBoxes","getSymbolInstanceTextSize","_addIconDebugCollisionBoxes","getSymbolInstanceIconSize","generateCollisionDebugBuffers","_updateTextDebugCollisionBoxes","_updateIconDebugCollisionBoxes","updateCollisionDebugBuffers","hasTextCollisionBoxData","hasIconCollisionBoxData","_deserializeCollisionBoxesForSymbol","textBox","textFeatureIndex","verticalTextBox","verticalTextFeatureIndex","iconBox","iconFeatureIndex","verticalIconBox","verticalIconFeatureIndex","deserializeCollisionBoxes","collisionArrays","hasTextData","hasIconData","addIndicesForPlacedSymbol","getSortedSymbolIndexes","sortedAngle","symbolInstanceIndexes","getSortedIndexesByZOffset","symbolInstanceIndexesSortedZOffset","symbolInstanceEnd","symbolInstanceStart","sortFeatures","featureSortOrder","addDynamicAttributes","cg","layout_symbol","hg","paint_symbol","runtimeType","getOverride","hasOverride","pg","defaultValue","fg","_colorAdjustmentMatrix","_setPaintOverrides","getColorAdjustmentMatrix","_saturation","_contrast","_brightnessMin","_brightnessMax","createBucket","hasPaintOverride","_interpolationType","overrideFog","dg","layout_background","mg","paint_background","yg","layout_raster","gg","paint_raster","xg","bg","texture","pixelStoreUnpackFlipY","pixelStoreUnpack","pixelStoreUnpackPremultiplyAlpha","premultiply","HTMLImageElement","HTMLCanvasElement","HTMLVideoElement","texSubImage2D","R32F","RED","FLOAT","R8","DEPTH_COMPONENT","DEPTH_COMPONENT16","UNSIGNED_SHORT","generateMipmap","minFilter","texParameteri","TEXTURE_MAG_FILTER","TEXTURE_MIN_FILTER","NEAREST","NEAREST_MIPMAP_NEAREST","LINEAR_MIPMAP_LINEAR","wrapS","TEXTURE_WRAP_S","TEXTURE_WRAP_T","bindExtraParam","magFilter","wrapT","vg","_g","wg","Mg","Ag","dispatcher","tiles","_loaded","onNorthPole","onSouthPole","_dirty","dataType","_finishLoading","_imageRequest","_requestManager","updateImage","setTexture","handle","WebGLTexture","painter","setCoordinates","sourceDataType","boundsBuffer","elevatedGlobeVertexBuffer","elevatedGlobeIndexBuffer","_boundsArray","_unsupportedCoords","_prepareData","transform","perspectiveTransform","boundsSegments","elevatedGlobePerspectiveTransform","addVertex","maxLongitudeTriangleSize","processTriangle","elevatedGlobeTrianglesCenterLongitudes","elevatedGlobeSegments","elevatedGlobeGridMatrix","prepare","LINEAR","CLAMP_TO_EDGE","loadTile","buckets","getSegmentsForLongitude","addTriangleRange","Sg","Ig","updateColorRamp","_curRampRange","hasColorMap","_source","colorRamp","colorRampTexture","kg","Pg","Eg","_updateColorRamp","lastInvalidatedAt","tileFramebuffer","particleFramebuffer","_invalidateAnimationState","zg","implementation","renderingMode","prerender","renderToTile","shouldRedrape","shouldRerenderTiles","Tg","layout_sky","Bg","paint_sky","Cg","Rg","Vg","Lg","Fg","Ug","Dg","Og","Ng","jg","qg","lerpAxis","$g","Gg","Qg","Yg","Xg","Zg","Kg","Wg","Hg","identifier","__line__","line","Jg","tx","instancedDataOffset","instancedDataCount","rotation","translation","ex","instancedDataArray","instancesEvaluatedElevation","idToFeaturesIndex","rx","hasZoomDependentProperties","isZoomDependent","instancesPerModel","validForExaggeration","maxVerticalOffset","maxScale","lookupDim","instanceCount","terrainElevationMin","terrainElevationMax","validForDEMTile","modelUris","modelsRequested","lookup","updateZoomBasedPaintProperties","featureStates","instancedDataBuffer","modelManager","removeModel","getModelUris","nx","layout_model","ix","paint_model","sx","CoordinateSpaceTile","CoordinateSpaceYUp","HasMapboxMeshFeatures","HasMeshoptCompression","ox","orientation","corners","dotProductWithUp","aabb","lx","gfxTexture","sampler","ux","normalArray","normalBuffer","texcoordArray","texcoordBuffer","colorArray","colorBuffer","featureArray","pbrBuffer","material","pbrMetallicRoughness","baseColorTexture","metallicRoughnessTexture","normalTexture","occlusionTexture","emissionTexture","meshes","hx","px","fx","_callback","_triggered","MessageChannel","_channel","port2","onmessage","trigger","port1","postMessage","dx","tasks","taskQueue","invoker","nextId","_ref70","isSymbolTile","priority","mx","mapId","callbacks","cancelCallbacks","receive","scheduler","hasCallback","targetMapId","mustQueue","sourceMapId","processTask","getWorkerSource","yx","workerPool","actors","currentActor","acquire","Actor","ready","broadcast","getActor","release","gx","workerUrl","workerClass","workerParams","xx","Worker","vx","active","workers","workerCount","numActive","terminate","isPreloaded","_x","wx","Mx","Ax","Sx","Ix","Px","Ex","dracoUrl","zx","meshoptUrl","WebAssembly","Tx","Bx","Cx","SCALAR","VEC2","VEC3","VEC4","MAT2","MAT3","MAT4","Rx","bufferViews","buffers","bufferView","Vx","Dx","extensions","Decoder","qx","Mesh","DecodeArrayToMesh","accessors","componentType","_malloc","GetTrianglesUInt16Array","GetTrianglesUInt32Array","memory","_free","GetAttributeByUniqueId","GetAttributeDataArrayForAllPoints","Lx","Fx","byteOffset","byteStride","decodeGltfBuffer","Ox","Ux","Nx","jx","uri","$x","images","mimeType","Gx","extensionsUsed","copyWithin","grow","instantiateStreaming","instantiate","Rb","Qb","eb","jb","yb","zb","Ab","Bb","Db","Gb","instance","ptr","DT_INT8","DT_UINT8","DT_INT16","DT_UINT16","DT_UINT32","DT_FLOAT32","__wasm_call_ctors","NONE","OCTAHEDRAL","QUATERNION","EXPONENTIAL","ATTRIBUTES","TRIANGLES","INDICES","sbrk","primitives","Qx","xScale","yScale","cellsX","cellsY","Yx","cellIdx","triIdx","Xx","Zx","Kx","POSITION","COLOR_0","NORMAL","TEXCOORD_0","_FEATURE_ID_RGBA4444","featureData","_FEATURE_RGBA4444","emissiveFactor","alphaMode","alphaCutoff","emissiveTexture","doubleSided","baseColorFactor","metallicFactor","roughnessFactor","KHR_texture_transform","offsetScale","defined","materials","Wx","matrix","mesh","extras","lights","normal","nodes","Hx","Jx","ground","flatMap","tb","WebGL2RenderingContext","textures","REPEAT","assign","samplers","scenes","scene","rb","heightmap","nb","ib","_stringToNumber","_numberToString","encode","sb","ab","_vectorTileFeature","_z","ob","featureIndexArray","promoteId","is3DTile","loadVTLayers","vtLayers","rawTileData","sourceLayerCoder","vtFeatures","_this","tileResult","bufferedTilespaceBounds","bufferedTilespaceGeometry","ub","bucketLayerIDs","queryFeature","intersectionZ","appendToResult","loadMatchingFeature","tileTransform","pixelPosMatrix","getId","getState","lb","lookupSymbolFeatures","loadFeature","hasLayer","hb","pb","fb","db","mb","node","evaluatedRMEA","hiddenByReplacement","evaluatedScale","evaluatedColor","emissionHeightBasedParams","getLocalBounds","lightMeshIndex","modelTraits","terrainExaggeration","elevationReadFromZ","dirty","nodesInfo","getNodesInfo","updatePbrBuffer","needsReEvaluation","projectionOptions","getBrightness","gb","evaluateScale","hasTranslucentParts","part","bb","elevationUpdate","terrainTile","updateDEM","needsDEMTextureUpload","verticalScale","xb","vb","_b","circle","heatmap","heatmapFbo","hillshade","tilespaceGeometry","tile","getBucket","flat","setPoint","isPointQuery","screenBounds","gradientVersion","stepInterpolant","gradientExpression","widthExpression","symbol","background","raster","sky","_skyboxInvalidated","needsSkyboxCapture","skyboxTexture","skyboxGeometry","light","_lightPosition","markSkyboxValid","model","getModel","_isPropertyZoomDependent","calculatePosMatrix","expandedFarZProjMatrix","wb","_readField","header_length","Layer","PixelFormat","PIXEL_FORMAT_UNKNOWN","PIXEL_FORMAT_UINT32","PIXEL_FORMAT_UINT16","PIXEL_FORMAT_UINT8","Filter","delta_filter","zigzag_filter","bitshuffle_filter","byteshuffle_filter","Delta","Zigzag","BitShuffle","ByteShuffle","block_size","Codec","gzip_data","codec","jpeg_image","webp_image","png_image","GzipData","JpegImage","WebpImage","PngImage","DataIndexEntry","first_byte","last_byte","filters","bands","tilesize","pixel_format","data_index","Mb","uint32_values","fixed32_values","Uint32Values","Fixed32Values","readValuesInto","first","items","last","resetTtl","ttl","evict","expiresAt","expiry","Sb","Ib","kb","Pb","Eb","Tb","Cb","Vb","Lb","Fb","Ob","Ub","Nb","qb","$b","Yb","Xb","Zb","Kb","Wb","Hb","captureStackTrace","Jb","tv","stream","rv","nv","iv","sv","_cacheSize","getLayer","getHeaderLength","DataView","getUint32","parseHeader","av","cacheSize","createDecodingTask","layerName","dataIndex","firstByte","firstBlock","lastBlock","_blocksInProgress","lastByte","pixelFormat","blockIndex","blockShape","bandShape","ov","processDecodedData","_ref71","_decodedBlocks","getBlockForBand","bandIndex","blockBandIndex","getDataRange","hasBand","hasDataForBand","getBandView","bytes","_onCancel","_onComplete","_finalized","complete","performDecoding","globalThis","DecompressionStream","pipeThrough","lv","uv","numItems","nodeSize","ArrayType","IndexArrayType","_pos","_finished","cv","dv","hv","pv","fv","_ref72","_applyTransformations","computeBoundsAndApplyParent","computeModelMatrix","a$","a0","a6","a7","a8","aA","aB","aC","aD","aE","aF","aG","aH","aI","aJ","aK","aL","aM","aN","aO","aP","aQ","aR","aS","aT","aU","aV","aW","aX","aY","aZ","a_","aj","ak","deduped","vectorTile","rawData","cacheControl","aq","muted","onloadstart","crossOrigin","aw","az","b$","b0","b1","b2","b3","b4","b5","b6","b8","b9","bA","bB","bC","inverseAdjustmentMatrix","bD","bE","bF","bG","bH","bI","bJ","bK","bL","bM","bN","bO","bP","bQ","bR","bS","bT","bU","bV","bW","bX","bY","bZ","b_","bj","bk","bq","bv","bw","bz","c$","c0","c1","c2","c3","c4","c5","c6","c7","c8","c9","cA","u_matrix","u_pixels_to_tile_units","u_device_pixel_ratio","u_units_to_pixels","u_dash_image","u_gradient_image","u_image_height","u_texsize","u_tile_units_to_pixels","u_alpha_discard_threshold","u_trim_offset","u_emissive_strength","cB","u_image","cC","cD","cE","cF","cG","calculatePixelsToTileUnitsMatrix","pixelsToGLUnits","u_camera_to_center_distance","getCameraToCenterDistance","u_extrude_scale","u_inv_rot_matrix","u_merc_center","u_tile_id","u_zoom_transition","u_up_dir","cH","cI","imageAtlasTexture","cJ","lineAtlasTexture","cK","cL","cM","cN","cO","cP","cQ","cR","cS","cT","cU","cV","cW","cX","cY","cZ","c_","uniformMatrix3fv","_antialias","extStandardDerivativesForceOff","terrain","cj","ck","isDataAvailableAtPoint","isUsingMockSource","getSource","getAtPoint","getAtTileOffset","getAtTileOffsetFunc","getForTilePoints","visibleDemTiles","getMinMaxForVisibleTiles","MIN_VALUE","cq","cw","cz","d$","d0","d1","d2","d3","_updateTime","_sourceIds","_activeRegions","_prevRegions","hiddenByOverlap","tileId","setSources","_setSources","getSourceId","cache","getFootprints","getVisibleCoordinates","getTile","_addSource","_computeReplacement","d4","_createGrid","_createPoles","_poleIndexBuffer","_gridBuffer","_gridIndexBuffer","_poleNorthVertexBuffer","_poleSouthVertexBuffer","_poleSegments","_gridSegments","withSkirts","withoutSkirts","_fillGridMeshWithLods","prepareVertex","_texturedPoleNorthVertexBuffer","_texturedPoleSouthVertexBuffer","getGridBuffers","getPoleBuffers","d5","d6","d7","fullscreenElement","webkitFullscreenElement","d8","d9","dA","dB","dC","dD","dE","dF","dG","dH","dI","dJ","dK","dL","dM","dN","dO","dP","iconsNeedLinear","layoutTextSize","layoutIconSize","sdfIcons","dQ","dR","dS","dT","dU","dV","dW","dX","dY","dZ","d_","_ref73","safari","_transformRequestFn","_silenceAuthErrors","_createSkuToken","tokenExpiresAt","_skuToken","_skuTokenExpiresAt","_isSkuTokenExpired","normalizeStyleURL","_makeAPIURL","normalizeModelURL","normalizeSourceURL","normalizeSpriteURL","normalizeTileURL","canonicalizeTileURL","canonicalizeTileset","dj","dk","dq","dw","dz","e0","getEntriesByName","keyCache","_layers","_layerConfigs","familiesBySource","showCollisionBoxes","collectResourceTiming","extraShadowCaster","maybePrepare","glyphAtlasImage","imageAtlas","glyphMap","iconMap","glyphPositions","stacks","icons","layerIndex","loadVectorData","loading","isSpriteLoaded","parseTile","resourceTiming","reloadTile","done","reloadCallback","abortTile","removeTile","rawImageData","offscreenCanvas","offscreenCanvasContext","decodeRasterArray","_ref74","task","_feature","tags","_geojsonTileLayer","rawGeometry","keycache","valuecache","fromVectorTileJs","fromGeojsonVt","GeoJSONWrapper","minPoints","generateId","fround","trees","clusterProps","_createTree","timeEnd","_cluster","getClusters","_limitZoom","getChildren","_getOriginId","_getOriginZoom","getLeaves","_appendLeaves","_addTileFeatures","getClusterExpansionZoom","cluster_id","cluster","point_count","point_count_abbreviated","minX","minY","maxX","maxY","tolerance","lineMetrics","transformed","numPoints","numSimplified","numFeatures","debug","tileCoords","indexMaxZoom","indexMaxPoints","stats","splitTile","_geoJSONIndex","loadGeoJSON","loadData","dynamic","append","_ref75","superclusterOptions","clusterProperties","geojsonVtOptions","clusterId","getClusterChildren","getClusterLeaves","asset","MAPBOX_mesh_features","layerIndexes","defaultProjection","workerSourceTypes","vector","workerSources","demWorkerSources","registerWorkerSource","registerRTLTextPlugin","clearCaches","rasterArrayWorkerSource","checkIfReady","setReferrer","spriteLoaded","_ref76","setImages","_ref77","setProjection","setBrightness","setLayers","getLayerIndex","updateLayers","removedIds","loadDEMTile","getDEMWorkerSource","getRasterArrayWorkerSource","removeSource","loadWorkerSource","importScripts","syncRTLPluginState","setDracoUrl","getAvailableImages","enforceCacheSizeLimit","getWorkerPerformanceMetrics","failIfMajorPerformanceCaveat","webGLContextAttributes","createShader","VERTEX_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","documentMode","setAttributeNS","antialias","stencil","documentElement","userSelect","stopPropagation","getBoundingClientRect","InstallTrigger","button","ctrlKey","platform","offsetWidth","clientX","clientY","_changed","_updatedLayers","_removedLayers","_updatedSourceCaches","_updatedPaintProps","_updatedImages","isDirty","setDirty","getUpdatedSourceCaches","updateSourceCache","discardSourceCacheUpdate","updateLayer","removeLayer","getRemovedLayer","discardLayerRemoval","getLayerUpdatesByScope","updatedIds","getUpdatedPaintProperties","updatePaintProperties","resetUpdatedImages","reset","models","numModelsLoading","loadModel","allSettled","numReferences","hasModel","addModel","addModels","addModelsFromBucket","listModels","stateChanges","deletedStates","updateState","removeFeatureState","initializeTileState","setFeatureState","coalesceChanges","userImage","updatedImages","callbackDispatchedThisFrame","requestors","atlasImage","atlasTexture","createScope","setLoaded","_notify","addImage","_validate","_validateStretch","_validateContent","removeImage","listImages","getImages","getPixelSize","getPattern","bin","_updatePatternAtlas","beginFrame","valueSpec","objectElementValidators","styleSpec","objectKey","arrayElementValidator","minimum","maximum","function","$version","arrayIndex","expressionContext","propertyKey","propertyType","layerType","filter_operator","geometry_type","tokens","exec","imports","ref","sources","*","_ref78","source_geojson","source_video","source_image","fog","import","$root","intensity","_transitionable","setLight","_transitioning","getLight","sprite","drapeRenderMode","getExaggeration","mercatorFogMatrix","_fov","_transform","horizonBlend","getOpacity","getOpacityAtLatLng","getOpacityForTile","calculateFogTileMatrix","getOpacityForBounds","getFovAdjustedRange","isVisibleOnFrustum","updateConfig","shadowsEnabled","properties_light_ambient","direction","properties_light_directional","cameraPoint","_screenRaycastCache","_cameraRaycastCache","bufferedScreenGeometry","screenGeometryMercator","_bufferedScreenMercator","createFromScreenPoints","getCameraPoint","bufferedCameraGeometry","bufferedCameraGeometryGlobe","containsTile","queryPadding","_bufferedCameraMercator","unwrapped","getFreeCameraOptions","_projectAndResample","vector_layers","vectorLayers","vectorLayerIds","raster_layers","rasterLayers","rasterLayerIds","validateBounds","scheme","reparseOverscaled","_collectResourceTiming","_tileWorkers","_deduped","_language","_worldview","_tileJSONRequest","tileBounds","hasTile","reload","cancelTileJSONRequest","clearSource","setTiles","setUrl","isExtraShadowCaster","_refreshExpiredTiles","setExpiryData","unloadTile","afterUpdate","roundZoom","saveTileTexture","triggerRepaint","_terrain","getSourceCache","enabled","_clearRenderCacheForTile","requestParams","fetchHeader","flushQueues","_isHeaderLoaded","_mrt","textureDescriptor","fbo","neighboringTiles","prepareTile","fetchBand","getInitialBand","_ref79","fields","getTextureDescriptor","updateNeeded","uniqueIdxCounter","createBuffer","dynamicDraw","unbindVAO","bindElementBuffer","bufferData","ELEMENT_ARRAY_BUFFER","DYNAMIC_DRAW","STATIC_DRAW","bufferSubData","deleteBuffer","bindVertexBuffer","ARRAY_BUFFER","enableAttributes","enableVertexAttribArray","setVertexAttribPointers","vertexAttribPointer","setVertexAttribDivisor","vertexAttribDivisor","getDefault","setDefault","clearColor","clearDepth","clearStencil","colorMask","depthMask","stencilMask","ALWAYS","mask","stencilFunc","KEEP","stencilOp","enable","STENCIL_TEST","disable","depthRange","DEPTH_TEST","LESS","depthFunc","BLEND","ONE","ZERO","blendFuncSeparate","blendColor","FUNC_ADD","blendEquationSeparate","CULL_FACE","BACK","cullFace","CCW","frontFace","useProgram","TEXTURE0","activeTexture","drawingBufferWidth","drawingBufferHeight","viewport","bindFramebuffer","FRAMEBUFFER","bindRenderbuffer","RENDERBUFFER","bindBuffer","bindVertexArray","pixelStorei","UNPACK_ALIGNMENT","UNPACK_PREMULTIPLY_ALPHA_WEBGL","UNPACK_FLIP_Y_WEBGL","framebufferTexture2D","COLOR_ATTACHMENT0","attachment","DEPTH_ATTACHMENT","framebufferRenderbuffer","DEPTH_STENCIL_ATTACHMENT","framebuffer","createFramebuffer","colorAttachment","depthAttachmentType","depthAttachment","deleteRenderbuffer","deleteFramebuffer","ReadOnly","ReadWrite","disabled","fail","depthFail","pass","blendFunction","blendEquation","Replace","unblended","alphaBlended","backCCW","backCW","frontCW","frontCCW","stencilTest","depthTest","blend","blendFunc","cullFaceSide","program","bindVertexArrayOES","extTextureFilterAnisotropicForceOff","extTextureFilterAnisotropic","getExtension","extTextureFilterAnisotropicMax","getParameter","MAX_TEXTURE_MAX_ANISOTROPY_EXT","extDebugRendererInfo","UNMASKED_RENDERER_WEBGL","UNMASKED_VENDOR_WEBGL","extTextureFloatLinearForceOff","extTextureFloatLinear","extRenderToTextureHalfFloat","extTimerQuery","maxTextureSize","MAX_TEXTURE_SIZE","maxPointSize","ALIASED_POINT_SIZE_RANGE","createRenderbuffer","renderbufferStorage","_ref80","COLOR_BUFFER_BIT","DEPTH_BUFFER_BIT","STENCIL_BUFFER_BIT","setCullFace","setDepthMode","setStencilMode","setColorMode","targetColorTexture","backgroundColorTexture","setParticleTextureDimension","particleTextureDimension","particleTexture0","particleTexture1","particleIndexBuffer","particleSegment","uses","expirationTime","hasSymbolBuckets","dependencies","isRaster","_lastUpdatedBrightness","expiredRequestCount","registerFadeDuration","timeAdded","fadeEndTime","wasRequested","_tileTransform","unloadVectorData","latestFeatureIndex","latestRawTileData","justReloaded","getOwnLayer","glyphAtlasTexture","_tileBoundsBuffer","_tileBoundsIndexBuffer","_tileBoundsSegments","_tileDebugBuffer","_tileDebugSegments","_tileDebugIndexBuffer","_globeTileDebugBorderBuffer","_tileDebugTextBuffer","_tileDebugTextSegments","_tileDebugTextIndexBuffer","_globeTileDebugTextBuffer","updateBuckets","queryRenderedFeatures","querySourceFeatures","bucketsLoaded","patternsLoaded","getExpiryTimeout","getOwnSourceCache","holdingForFade","symbolFadeHoldUntil","symbolFadeFinished","clearFadeHold","setHoldDuration","getTileTexture","setDependencies","hasDependency","clearQueryDebugViz","_makeDebugTileBoundsBuffers","_makeTileBoundsBuffers","_makeGlobeTileDebugBuffers","freezeTileCoverage","_makeGlobeTileDebugBorderBuffer","_makeGlobeTileDebugTextBuffer","_globePoint","toIndex","hillshadeFBO","demTexture","rasterParticleState","needsHillshadePrepare","_getNeighboringTiles","coord","backfilled","_data","attribution","workerOptions","clusterMaxZoom","clusterMinPoints","clusterRadius","setData","_updateWorkerData","_pendingLoad","_coalesce","_metadataFired","video","loop","play","pause","seek","seekable","currentTime","getVideo","paused","videoWidth","videoHeight","getModels","usedInConflation","canvas","animate","getElementById","_hasInvalidDimensions","_playing","getCanvas","custom","_dataType","_dispatcher","_implementation","_update","clearTiles","_clearTiles","coveringTiles","_coveringTiles","loadTileData","calculateProjMatrix","tilesIn","wrappedTileID","queryResults","_state","getFeatureState","getRenderableIds","getTileByID","_workQueue","_fetchQueue","Range","entireBuffer","onDataDecoded","updateTextureDescriptor","img","onDataLoaded","band","timeout","order","_getAndRemoveByKey","getAndRemove","getByKey","setMaxSize","_onlySymbols","_sourceLoaded","_paused","_sourceErrored","_tiles","_cache","_unloadTile","_timers","_cacheTimers","_minTileCacheSize","minTileCacheSize","_maxTileCacheSize","maxTileCacheSize","_loadedParentTiles","castsShadows","_coveredTiles","_shadowCasterTiles","_isRaster","resume","_shouldReloadOnResume","_loadTile","_abortTile","imageManager","getIds","_isIdRenderable","hasRenderableParent","findLoadedParent","_reloadTile","_tileLoaded","usedForTerrain","getScaledDemTileSize","resetTileLookupCache","refreshedUponExpiration","_setTileReloadTimer","_backfillDEM","sourceCacheId","_retainLoadedChildren","_getLoadedTile","updateCacheSize","handleWrapJump","_prevLng","used","getVisibleUnwrappedCoordinates","isTerrainDEM","coveringZoomLevel","extendTileCoverForShadows","_updateRetainedTiles","maxOverzooming","_addTile","_fadeDuration","_removeTile","_updateLoadedParentTileCache","releaseSymbolFadeTiles","maxUnderzooming","getShadowCasterCoordinates","_getRenderableCoordinates","expandedProjMatrix","sortCoordinatesByDistance","reloadTilesForDependencies","_preloadTiles","waitUntilSourceLoaded","updateElevation","layersGotHidden","processLayersChanged","_mergedLayers","visible","visibilityChanged","getLayerSource","onNewFrame","currentBuildingBuckets","getLayerSourceCache","bucket","_getHeightAtTileOffset","_mapCoordToOverlappingTile","tileX","tileY","setStyle","addLayer","setSlot","addSource","setGeoJSONSourceData","setLayerZoomRange","setLayerProperty","setCenter","setBearing","setPitch","setSprite","setGlyphs","setTerrain","setFog","setCamera","setLights","addImport","removeImport","updateImport","command","_distances","paddedLength","boxCells","circleCells","xCellCount","yCellCount","circleKeys","boxKeys","circles","boxUid","circleUid","keysLength","_insertBoxCell","insertCircle","_insertCircleCell","_query","hitTest","seenUids","box","_queryCircle","_queryCellCircle","hitTestCircle","_circleAndRectCollide","_circlesCollide","_convertToXCellCoord","_convertToYCellCoord","unknown","flipRequired","flipNotRequired","labelPlaneMatrix","glCoordMatrix","useVertical","needsFlipping","notEnoughRoom","getTruncatedLineSegment","tilePath","ignoredGrid","pitchfactor","screenRightBoundary","screenBottomBoundary","gridRightBoundary","gridBottomBoundary","fogState","placeCollisionBox","projectAndGetPerspectiveRatio","perspectiveRatio","occluded","isInsideGrid","offscreen","isOffscreen","placeCollisionCircles","signedDistanceFromCamera","_ref81","collisionDetected","queryRenderedSymbols","bucketInstanceId","insertCollisionBox","collisionGroupID","insertCollisionCircles","getViewportMatrix","opacity","placed","clipped","skipFade","invProjMatrix","viewportMatrix","crossSourceCollisions","maxGroupID","collisionGroups","ID","collisionIndex","buildingIndex","placements","opacities","variableOffsets","stale","commitTime","retainedQueryData","collisionCircleArrays","prevPlacement","placedOrientations","getBucketParts","unwrappedTileID","posMatrix","textLabelPlaneMatrix","labelToScreenMatrix","clippingData","textPixelRatio","partiallyEvaluatedTextSize","partiallyEvaluatedIconSize","collisionGroup","attemptAnchorPlacement","textOffset","textScale","prevAnchor","markUsedJustification","markUsedOrientation","placedGlyphBoxes","placeLayerBucketPart","placeSymbol","calculateDistanceTileData","placeTextForPlacementModes","placeBoxForVariableAnchors","placeBox","commit","zoomAtLastRecencyCheck","prevZoomAdjustment","zoomAdjustment","symbolFadeChange","lastPlacementChangeTime","updateLayerOpacities","updateBucketOpacities","addOpacities","hasTransitions","stillRecent","setStale","_sortAcrossTiles","_currentTileIndex","_currentPartIndex","_seenCrossTileIDs","_bucketParts","continuePlacement","placement","_currentPlacementIndex","_forceFullPlacement","_showCollisionBoxes","_done","isDone","shouldPausePlacement","_inProgressLayer","crossTileIDs","findMatches","maxCrossTileID","generate","indexes","usedCrossTileIDs","addBucket","removeBucketCrossTileIDs","removeStaleBuckets","maxBucketInstanceId","bucketsInCurrentPlacement","pruneUnusedLayers","_position","_renderWorldCopies","lookAtPoint","_elevation","setPitchBearing","mercatorPosition","_orientation","getPitchBearing","getCameraToWorld","getWorldToCamera","getCameraToWorldMercator","getWorldToCameraPosition","getCameraToClipPerspective","getCameraToClipOrthographic","getDistanceToElevation","_minZoom","_maxZoom","_minPitch","_maxPitch","setMaxBounds","_nearZ","_farZ","_unmodified","_edgeInsets","_projMatrixCache","_alignedProjMatrixCache","_fogTileMatrixCache","_expandedProjMatrixCache","_distanceTileDataCache","_averageElevation","cameraElevationReference","globeRadius","globeCenterInViewSpace","_orthographicProjectionAtLowPitch","maxPitch","_centerAltitudeValidForExaggeration","mercatorFromTransition","_setZoom","_seaLevelZoom","_calcMatrices","frustumCorners","isOrthographic","_updateCameraOnTerrain","depthOcclusionForSymbolsAndCircles","_constrainCamera","setOrthographicProjectionAtLowPitch","setMercatorFromTransition","minPitch","renderWorldCopies","cameraWorldSizeForFog","_worldSizeFromZoom","_zoomFromMercatorZ","cameraWorldSize","cameraPixelsPerMeter","centerOffset","centerPoint","rotationMatrix","aspect","fov","fovX","fovY","averageElevation","_calcFogMatrices","_zoom","_updateSeaLevelZoom","_constrain","zoomFraction","sampleAverageElevation","_terrainEnabled","_updateZoomFromElevation","_mercatorZfromZoom","computeZoomRelativeTo","setFreeCameraOptions","_updateCameraState","_setCameraOrientation","_setCameraPosition","_updateStateFromCamera","recenterOnTerrain","isPaddingEqual","interpolatePadding","scaleZoom","isLODDisabled","minZ","maxZ","fullyVisible","shouldSplit","_mercatorScaleRatio","isPoleNeighbourAndGlobeProjection","distanceSq","fogCullDistSq","unmodified","pointMerc","pixelsPerMeterRatio","setLocationAtPoint","setLocation","coordinateLocation","locationPoint3D","pointLocation","pointLocation3D","p0","p1","screenPointToMercatorRay","isPointOnSurface","_getBoundsNonRectangular","processSegment","_getBoundsRectangular","slope","_getBoundsRectangularTerrain","getBounds","getMaxBounds","maxBounds","minLat","maxLat","minLng","maxLng","worldMinX","worldMaxX","worldMinY","worldMaxY","worldToFogMatrix","mercatorMatrix","alignedProjMatrix","_pixelsToTileUnitsCache","customLayerMatrix","globeToMercatorMatrix","_computeCameraPosition","_minimumHeightOverTerrain","_isCameraConstrained","_constraining","_minZoomForBounds","_maxCameraBoundsDistance","cameraFrustum","starsProjMatrix","skyboxMatrix","_translateCameraConstrained","zoomFromMercatorZAdjusted","anyCornerOffEdge","isHorizonVisible","zoomDeltaToMovement","_ref82","getWorldToCameraMatrix","getFrustum","BaseColor","MetallicRoughness","Normal","Occlusion","Emission","ShadowMap0","getCutoffParams","shouldRenderCutoff","uniformValues","u_cutoff_params","minCutoffZoom","cascadeCount","shadowMapResolution","lastCascade","receivers","computeRequiredCascades","_enabled","_shadowLayerCount","_numCascadesToRender","_cascades","_groundShadowTiles","_receivers","_depthMode","LEQUAL","_uniformValues","u_light_matrix_0","u_light_matrix_1","u_shadow_intensity","u_fade_range","u_shadow_normal_offset","u_shadow_texel_size","u_shadow_map_resolution","u_shadow_direction","u_shadow_bias","u_shadowmap_0","u_shadowmap_1","_forceDisable","useNormalOffset","registerParameter","label","registerBinding","readonly","updateShadowParameters","_shadowMapDebug","far","boundingSphereRadius","shadowDirection","addShadowReceiver","drawShadowPass","currentShadowCascade","renderLayer","drawGroundShadows","directionalLight","ambientLight","longestCutoffRange","depthRangeFor3D","isTileAffectedByFog","getOrCreateProgram","setupShadows","uploadCommonUniforms","u_ground_shadow_factor","tileExtentBuffer","quadTriangleIndexBuffer","tileExtentSegments","getShadowPassColorMode","getShadowPassDepthMode","getShadowCastingLayerCount","calculateShadowPassMatrixFromTile","calculateShadowPassMatrixFromMatrix","setShadowUniformValues","setupShadowsFromMatrix","getShadowUniformValues","getCurrentCascadeFrustum","computeSimplifiedTileShadowVolume","getMaxCascadeForTile","emitValidationErrors","globalId","fragments","importDepth","importsCache","resolvedImports","_buildingIndex","crossTileSymbolIndex","_mergedOrder","_drapedFirstOrder","_mergedSourceCaches","_mergedOtherSourceCaches","_mergedSymbolSourceCaches","_has3DLayers","_hasCircleLayers","_hasSymbolLayers","_changes","styleChanges","glyphManager","localIdeographFontFamily","_serializedLayers","_sourceCaches","_otherSourceCaches","_symbolSourceCaches","_precompileDone","_shouldPrecompile","_availableImages","_order","_markersNeedUpdate","configOptions","_configDependentLayers","configDependentLayers","_config","_initialConfig","initialConfig","_rtlTextPluginCallback","registerForPluginStateChange","getOwnSource","_validateLayer","loadURL","loadJSON","_getGlobalId","startsWith","_diffStyle","handleStyle","_load","_request","loadEmpty","_loadImports","_createFragmentStyle","mergeAll","_isInternalStyle","findIndex","_ref83","getImportGlobalIds","_reloadImports","_updateMapProjection","updateConfigDependencies","_triggerCameraUpdate","camera","_serializeLayers","isRootStyle","fragment","schema","stylesheet","isInitialLoad","_loadSprite","getOwnLayerSourceCache","disableElevatedTerrain","terrainSetForDrapingOnly","_createTerrain","_createFog","forEachFragmentStyle","_prioritizeTerrain","mergeSources","mergeLayers","mergeTerrain","mergeProjection","_this2","updateDrapeFirstLayers","getCamera","applyProjectionUpdate","getTerrain","setTerrainForDraping","_useExplicitProjection","_prioritizeAndUpdateProjection","_spriteRequest","_serializeImports","_serializeSources","hasLightTransitions","hasFogTransition","isLayerDraped","_checkLoaded","_checkLayer","_checkSource","calculateLightsBrightness","_brightness","_updateWorkerLayers","updateSourceCaches","_updateTilesForChangedImages","_fogVisible","overrideRtt","_updateMarkersOpacity","getFragmentStyle","lastIndexOf","_afterImageUpdated","isSourceLoaded","_isSourceCacheLoaded","getOwnSourceCaches","getOwnSources","areTilesLoaded","_getTransitionParameters","getLights","enable3dLights","_ref84","_ref85","getConfigProperty","setConfigProperty","setConfig","getSchema","setSchema","_updateLayer","_layerOrderChanged","moveLayer","hasLayerType","_flattenAndSortRenderedFeatures","serializedLayers","has3DLayers","_showQueryGeometry","addSourceType","getSourceType","setSourceType","workerSourceURL","getFlatLight","setFlatLight","_force3DLayerUpdate","_markers","_requestDomTask","_evaluateOpacity","getFog","_forceSymbolLayerUpdate","_remove","getSourceCaches","clearSources","reloadSource","reloadSources","getSources","updateSources","_generateCollisionBoxes","_updatePlacement","pauseablePlacement","_releaseSymbolFadeTiles","_ref86","_ref87","getImportIndex","setImportUrl","setImportConfig","setImportData","moveImport","_ref88","_ref89","getResource","hasSymbolLayers","hasCircleLayers","_clearWorkerCaches","backgroundPattern","clippingMask","heatmapTexture","collisionBox","collisionCircle","fillOutline","fillOutlinePattern","fillPattern","fillExtrusion","fillExtrusionDepth","fillExtrusionPattern","groundShadow","fillExtrusionGroundEffect","hillshadePrepare","linePattern","rasterParticle","rasterParticleDraw","rasterParticleTexture","rasterParticleUpdate","symbolIcon","symbolSDF","symbolTextAndIcon","terrainRaster","terrainDepth","skybox","skyboxGradient","skyboxCapture","globeRaster","globeAtmosphere","modelDepth","stars","fragmentSource","vertexSource","staticAttributes","usedDefines","vertexIncludes","fragmentIncludes","boundProgram","boundLayoutVertexBuffer","boundPaintVertexBuffers","boundIndexBuffer","boundVertexOffset","boundDynamicVertexBuffers","vao","freshBind","numAttributes","createVertexArray","currentNumAttributes","deleteVertexArray","prepareDrawTile","moving","u_latrange","u_light","u_shadow","u_highlight","u_accent","tileBoundsBuffer","tileBoundsIndexBuffer","tileBoundsSegments","getTileBoundsBuffers","TEXTURE1","getMercatorTileBoundsBuffers","linearFloatFilteringSupported","u_dimension","u_zoom","u_image0","u_skirt_height","terrainRasterUniformValues","globeRasterUniformValues","u_proj_matrix","u_globe_matrix","u_normalize_matrix","u_merc_matrix","u_frustum_tl","u_frustum_tr","u_frustum_br","u_frustum_bl","u_globe_pos","u_globe_radius","u_viewport","u_grid_matrix","u_far_z_cutoff","operations","newMorphing","queued","phase","getMorphValuesForProxy","_validOp","_nextOp","renderCache","renderCachePool","proxyCachedFBO","freeFBO","deallocRenderCache","proxyTileKey","_debugParams","sortTilesHiZFirst","disableRenderCache","_style","registerButton","invalidateRenderCache","terrainTileForTile","prevTerrainTileForTile","quad","gridBuffer","gridIndexBuffer","gridSegments","gridNoSkirtSegments","proxyCoords","proxiedCoords","_visibleDemTiles","_drapedRenderBatches","_sourceTilesOverlap","proxySourceCache","orthoMatrix","_overlapStencilMode","GEQUAL","REPLACE","_previousZoom","pool","_findCoveringTileCache","_tilesDirty","_useVertexMorphing","_exaggeration","_mockSourceCache","_pendingGroundEffectLayers","_onStyleDataEvent","_clearLineLayersFromRenderCache","_evaluationZoom","_previousUpdateTimestamp","_updateTimestamp","sourceCache","calculateExaggeration","_disable","_initializing","_emptyDEMTextureDirty","_previousCameraAltitude","_sharedDepthStencil","_emptyDEMTexture","_emptyDepthBufferTexture","_depthFBO","_depthTexture","framebufferCopyTexture","drapeBufferSize","useVertexMorphing","updateTileBinding","proxyToSource","_setupProxiedCoordsForOrtho","_assignTerrainTiles","_prepareDEMTextures","_setupDrapedRenderBatches","_initFBOPool","_setupRenderCache","renderingToTexture","_findTileCoveringTileID","_prepareDemTileUniforms","emptyDEMTexture","_updateEmptyDEMTexture","emptyDepthBufferTexture","_getLoadedAreaMinimum","TEXTURE2","setupElevationDraw","u_dem","u_dem_prev","u_dem_tl","u_dem_tl_prev","u_dem_scale","u_dem_scale_prev","u_dem_size","u_dem_lerp","u_depth","u_depth_size_inv","u_exaggeration","morphing","srcDemTile","dstDemTile","TEXTURE4","TEXTURE3","useDepthForOcclusion","useMeterToDem","u_meter_to_dem","labelPlaneMatrixInv","u_label_plane_matrix_inv","setTerrainUniformValues","globeUniformValues","useDenormalizedUpVectorScale","setGlobeUniformValues","u_tile_tl_up","u_tile_tr_up","u_tile_br_up","u_tile_bl_up","u_tile_up_scale","renderToBackBuffer","gpuTimingDeferredRenderStart","setShaderMode","colorModeForRenderPass","globeSharedBuffers","renderDefaultNorthPole","renderDefaultSouthPole","drawPole","shadowRenderer","gpuTimingDeferredRenderEnd","renderBatch","tex","renderedToTile","_setupStencil","postRender","isLayerOrderingCorrect","minx","miny","maxx","maxy","_createFBO","DEPTH_STENCIL","_stencilRef","texParameterf","TEXTURE_MAX_ANISOTROPY_EXT","_shouldDisableRenderCache","_clearRasterLayersFromRenderCache","_overlapStencilType","EQUAL","GREATER","_renderTileClippingMasks","clipOrMaskOverlapStencilType","stencilModeForRTTOverlap","_tileClippingMaskIDs","drawDepth","_setupProxiedCoordsForImageSource","_createProxiedId","tileOutsideImage","createProgram","configuration","fixedDefines","FRAGMENT_SHADER","failedToCreate","attachShader","bindAttribLocation","linkProgram","deleteShader","fixedUniforms","binderUniforms","terrainUniforms","globeUniforms","fogUniforms","u_fog_matrix","u_fog_range","u_fog_color","u_fog_horizon_blend","u_fog_vertical_limit","u_fog_temporal_offset","u_globe_transition","u_is_globe","cutoffUniforms","lightsUniforms","u_lighting_ambient_color","u_lighting_directional_dir","u_lighting_directional_color","u_ground_radiance","shadowUniforms","setFogUniformValues","setCutoffUniformValues","setLightsUniformValues","_drawDebugWireframe","wireframe","layers2D","layers3D","wireframeDebugCache","getLinesFromTrianglesBuffer","frameCounter","copyUniformValues","ONE_MINUS_SRC_ALPHA","drawElementsInstanced","LINES","drawElements","POINTS","LINE_STRIP","drawArrays","u_pixel_coord_upper","u_pixel_coord_lower","fillExtrusionUniformValues","u_lightpos","u_lightintensity","u_lightcolor","u_vertical_gradient","u_opacity","u_height_lift","u_ao","u_edge_radius","u_flood_light_color","u_vertical_scale","u_flood_light_intensity","fillExtrusionDepthUniformValues","fillExtrusionPatternUniformValues","u_height_factor","fillUniformValues","fillPatternUniformValues","fillOutlineUniformValues","u_world","fillOutlinePatternUniformValues","collisionUniformValues","u_color","u_overlay","u_overlay_scale","heatmapUniformValues","u_intensity","_ref90","_ref91","_ref92","rasterUniformValues","u_tl_parent","u_scale_parent","u_fade_t","u_image1","u_brightness_low","u_brightness_high","u_saturation_factor","u_contrast_factor","u_spin_weights","u_perspective_transform","u_raster_elevation","u_colorization_mix","u_colorization_offset","u_color_ramp","u_texture_offset","u_texture_res","rasterParticleUniformValues","rasterParticleDrawUniformValues","u_particle_texture","u_particle_texture_side_len","u_tile_offset","u_velocity","u_velocity_res","u_max_speed","u_uv_offset","u_data_scale","u_data_offset","u_particle_pos_scale","u_particle_pos_offset","rasterParticleUpdateUniformValues","u_speed_factor","u_reset_rate","u_rand_seed","symbolIconUniformValues","u_is_size_zoom_constant","u_is_size_feature_constant","u_size_t","u_size","u_rotate_symbol","u_aspect_ratio","u_fade_change","u_label_plane_matrix","u_coord_matrix","u_is_text","u_pitch_with_map","u_texture","u_camera_forward","u_ecef_origin","u_tile_matrix","u_up_vector","u_color_adj_mat","u_icon_transition","symbolSDFUniformValues","u_gamma_scale","u_is_halo","symbolTextAndIconUniformValues","u_texsize_icon","u_texture_icon","backgroundUniformValues","backgroundPatternUniformValues","u_pattern_tl","u_pattern_br","u_pattern_size","u_lighting_matrix","u_normal_matrix","u_node_matrix","u_camera_pos","u_baseTextureIsAlpha","u_alphaMask","u_alphaCutoff","u_baseColorFactor","u_emissiveFactor","u_metallicFactor","u_roughnessFactor","u_baseColorTexture","u_metallicRoughnessTexture","u_normalTexture","u_occlusionTexture","u_emissionTexture","u_color_mix","u_aoIntensity","u_occlusionTextureTransform","u_instance","u_ao_pass","u_meter_to_tile","u_attenuation","u_fb","u_fb_size","u_inv_matrix","u_viewport_size","u_sun_direction","u_cubemap","u_temporal_offset","u_center_direction","u_radius","u_matrix_3f","u_sun_intensity","u_color_tint_r","u_color_tint_m","u_luminance","u_horizon","u_transition","u_fadeout_range","u_high_color","u_space_color","u_horizon_angle","u_up","u_right","u_intensity_multiplier","circleArray","circleOffset","invTransform","_ref93","depthModeForSublayer","getIconState","terrainRenderModeElevated","rotating","zooming","atlasTextureIcon","atlasInterpolation","atlasInterpolationIcon","hasHalo","getTextState","onlyText","onlyIcons","uploadCommonLightUniforms","stencilModeForClipping","a_centroid_pos","vertexAttrib2f","renderGroundEffectTile","xjoin","yjoin","flatBase","colorModeForDrapableLayerRenderPass","textureOffset","scalarData","emptyTexture","debugBuffer","debugIndexBuffer","debugSegments","initDebugOverlayCanvas","debugOverlayCanvas","shadowColor","shadowBlur","lineWidth","strokeStyle","strokeText","debugOverlayTexture","SCISSOR_TEST","scissor","TEXTURE_CUBE_MAP_POSITIVE_X","starsCount","sizeMultiplier","sizeRange","intensityRange","colorModeAlphaBlendedWriteRGB","colorModeWriteAlpha","atmosphereBuffer","starsVx","starsIdx","starsSegments","drawAtmosphereGlow","drawStars","nodeModelMatrix","zScaleMatrix","negCameraPosMatrix","worldViewProjection","modelIndex","shadowUniformsInitialized","useSingleShadowCascade","tileMatrix","shadowTileMatrix","isInsideFirstShadowMapFrustum","_storage","lastUsedFrameIdx","getBufferParameter","BUFFER_SIZE","getBufferSubData","programConfiguration","RGBA16F","HALF_FLOAT","viewportBuffer","viewportSegments","gradient","INVERT","resetStencilClippingMasks","opaquePassEnabledForLayer","conflationActive","layerUsedInConflation","replacementSource","stencilModeFor3D","_showOverdrawInspector","MIN","DECR","ONE_MINUS_DST_ALPHA","DST_ALPHA","passDraped","MAX","copyTexImage2D","stencilConfigForOverlap","renderElevatedRasterBackface","_ref94","resampling","drawTiles","previousDrawTimestamp","isPatternMissing","getBackgroundTiles","_atmosphere","skyboxFbo","TEXTURE_CUBE_MAP","setCustomLayerDefaults","setBaseState","cleanup","currentLayer","firstLightBeamLayer","_tileTextures","frameCopies","loadTimeStamps","_timeStamp","_averageFPS","_fpsHistory","showTerrainProxyTiles","fpsWindow","continousRedraw","enabledLayers","view","setup","numSublayers","depthEpsilon","deferredRenderGpuTimeQueries","gpuTimers","_backgroundTiles","_cachedTileFogOpacities","_shadowRenderer","_wireframeDebugCache","updateTerrain","_updateFog","mercatorBoundsBuffer","mercatorBoundsSegments","identityMat","stencilClearMode","nextStencilID","currentStencilSource","NOTEQUAL","CONSTANT_COLOR","CONSTANT_ALPHA","opaquePassCutoff","updateAverageFPS","repaint","prepareLayer","showOverdrawInspector","showTileBoundaries","showQueryGeometry","showTileAABBs","showParseStatus","showPadding","tileLoaded","speedIndexTiming","saveCanvasCopy","gpuTimingStart","gpuTimingEnd","gpuTiming","calls","cpuTime","createQuery","beginQuery","TIME_ELAPSED_EXT","gpuTimingDeferredRender","endQuery","collectGpuTimers","collectDeferredRenderGpuQueries","queryGpuTimers","getQueryParameter","QUERY_RESULT","deleteQueryEXT","queryGpuTimeDeferredRender","currentGlobalDefines","setTileLoadedFlag","canvasCopy","getCanvasCopiesAndTimestamps","canvasCopies","timeStamps","averageElevationNeedsEasing","clearBackgroundTiles","later","_hashName","_updateHash","_updateHashUnthrottled","_onHashChange","getHashString","hash","_getCurrentHash","dragRotate","isEnabled","touchZoomRotate","getBearing","jumpTo","history","replaceState","getPitch","linearity","easing","deceleration","maxSpeed","_inertiaBuffer","record","_drainInertiaBuffer","settings","_onMoveEnd","_prefersReducedMotion","pan","pinchAround","around","zoomDelta","bearingDelta","pitchDelta","panDelta","amount","noMoveStart","_defaultPrevented","defaultPrevented","getCanvasContainer","lngLat","originalEvent","changedTouches","touches","lngLats","_clickTolerance","clickTolerance","_mousedownPos","wheel","_firePreventable","mousedown","mouseup","preclick","click","dblclick","mouseover","mouseout","touchstart","touchmove","touchend","touchcancel","isActive","_delayContextMenu","_contextMenuEvent","mousemove","contextmenu","_el","_container","getContainer","_active","shiftKey","_startPos","_lastPos","mousemoveWindow","_box","_fireEvent","mouseupWindow","cameraAnimation","fitScreenCoordinates","linear","keydown","numTouches","timeStamp","singleTap","numTaps","lastTime","lastTap","_zoomIn","_zoomOut","easeTo","_moved","_lastPoint","_eventButton","_correctButton","_move","buttons","_minTouches","_touches","_sum","_calculateTransform","_cooperativeGestures","isMoving","_showTouchPanBlockerAlert","_alertContainer","_alertTimer","cancelable","_addTouchPanBlocker","textContent","_getUIString","clientWidth","removeAttribute","_firstTwoTouches","_start","_aroundCenter","_distance","_startDistance","_minDiameter","_startVector","_vector","_isBelowThreshold","_valid","_firstMove","_lastPoints","gestureBeginsVertically","panStep","bearingStep","pitchStep","_panStep","_bearingStep","_pitchStep","_rotationDisabled","altKey","easeId","disableRotation","enableRotation","_handler","_delta","_lastDelta","_defaultZoomRate","_wheelZoomRate","setZoomRate","setWheelZoomRate","_finishTimeout","isZooming","_zooming","_addScrollZoomBlocker","_showBlockerAlert","deltaMode","WheelEvent","DOM_DELTA_LINE","deltaY","_lastWheelEventTime","_type","_lastValue","_timeout","_onTimeout","_lastWheelEvent","_frameId","_aroundPoint","_aroundCoord","_targetZoom","_triggerRenderFrame","renderFrame","_prevEase","_easing","startingZoom","_startZoom","_smoothOutEasing","noInertia","needsRenderFrame","aroundCoord","_clickZoom","_tapZoom","_tap","_swipePoint","_swipeTouch","_tapTime","_mousePan","_touchPan","_inertiaOptions","_pitchWithRotate","pitchWithRotate","_mouseRotate","_mousePitch","_touchZoom","_touchRotate","_tapDragZoom","drag","projectRay","_handlers","_handlersById","_inertia","_bearingSnap","bearingSnap","_previousActiveHandlers","_trackingEllipsoid","_dragOrigin","_eventsInProgress","_addDefaultHandlers","passive","capture","handleWindowEvent","handleEvent","boxZoom","doubleClickZoom","touchPitch","dragPan","scrollZoom","keyboard","interactive","handlerName","allowed","stop","_updatingCamera","_fireEvents","_originalZoom","isRotating","_isDragging","_blockedByActive","_getMapTouches","mergeHandlerResult","_stop","_applyChanges","_updateMapTransform","resetNorth","_requestFrame","_renderTaskQueue","_moving","_respectPrefersReducedMotion","respectPrefersReducedMotion","panBy","panTo","zoomTo","zoomIn","zoomOut","getPadding","setPadding","rotateTo","resetNorthPitch","snapToNorth","cameraForBounds","_cameraForBounds","_extendPadding","_extendCameraOptions","_minimumAABBFrustumDistance","_cameraForBoundsOnGlobe","_extendAABB","queryTerrainElevation","exaggerated","_fitInternal","preloadOnly","_normalizeBearing","_normalizeCenter","_rotating","_pitching","_fireMoveEvents","_emulate","pitching","_padding","_easeId","_prepareEase","_ease","_afterEase","speed","curve","screenSpeed","maxDuration","isEasing","_easeFrameId","_requestRenderFrame","_cancelRenderFrame","_onEaseFrame","_onEaseEnd","_easeStart","_easeOptions","_renderFrameCallback","essential","getDefaultPosition","compact","_compactButton","_toggleAttribution","_setElementTitle","_innerContainer","_updateAttributions","_updateEditLink","_updateData","_updateCompact","_attribHTML","firstElementChild","_editLink","querySelector","styleOwner","styleId","owner","customAttribution","_updateLogo","_logoRequired","mapbox_logo","_queue","_id","_cleared","_currentlyRunning","run","_anchor","_color","_draggable","draggable","_rotation","_rotationAlignment","rotationAlignment","_pitchAlignment","pitchAlignment","_updateMoving","_occludedOpacity","occludedOpacity","_element","_defaultMarker","viewBox","hasAttribute","_popup","_clearFadeTimer","_addMarker","setDraggable","_onMapClick","_addDragHandler","_onUp","_onMove","getLngLat","_lngLat","getElement","setPopup","_onKeyPress","_originalTabIndex","_marker","getAttribute","charCode","togglePopup","getPopup","isOpen","_behindTerrain","_showingGlobe","_queryFogOpacity","pointerEvents","_setOpacity","_fadeTimer","_updateDOM","_calculateXYTransform","_calculateZTransform","getPitchAlignment","getRotationAlignment","_updateFrameId","getOffset","setOffset","addClassName","removeClassName","toggleClassName","toggle","_pointerdownPos","_positionDelta","isDraggable","setRotation","setRotationAlignment","setPitchAlignment","setOccludedOpacity","getOccludedOpacity","closeButton","closeOnClick","focusAfterOpen","maxWidth","_startTime","_endTime","_end","refreshUI","cooperativeGestures","performanceMetricsCollection","attributionControl","preserveDrawingBuffer","trackResize","refreshExpiredTiles","testMode","showCompass","showZoom","visualizePitch","mouseRotate","mousePitch","down","move","offTemp","targetTouches","maximumAge","fitBoundsOptions","trackUserLocation","showAccuracyCircle","showUserLocation","showUserHeading","kilometer","meter","mile","foot","setRTLTextPlugin","getRTLTextPluginStatus","_repaint","_interactive","_failIfMajorPerformanceCaveat","_preserveDrawingBuffer","_trackResize","_isInitialLoad","_crossSourceCollisions","_parseLanguage","_domRenderTaskQueue","_controls","_popups","_mapId","_locale","_performanceMetricsCollection","_containerWidth","_containerHeight","_showParseStatus","_averageElevationLastSampledAt","_averageElevationExaggeration","_interactionRange","_visibilityHidden","_contextCreateOptions","contextCreateOptions","childNodes","_setupContainer","_tp","devtools","noSave","_setupPainter","_fullscreenchangeEvent","_onWindowOnline","_onWindowResize","_onVisibilityChange","_localFontFamily","_localIdeographFontFamily","_hash","_logoControl","logoPosition","_postStyleLoadEvent","_getMapId","_controlPositions","insertBefore","firstChild","removeControl","hasControl","_canvasContainer","_canvas","_updateContainerDimensions","_resizeCanvas","setMinZoom","getMinZoom","setMaxZoom","getMaxZoom","setMinPitch","getMinPitch","setMaxPitch","getMaxPitch","getRenderWorldCopies","setRenderWorldCopies","_forceMarkerAndPopupUpdate","_setLanguage","_lazyInitEmptyStyle","_updateProjectionTransition","_updateProjection","_createDelegatedListener","delegates","_isValidId","_delegatedListeners","areLayerArraysEqual","diff","_updateStyle","_updateTerrain","getStyle","isStyleLoaded","loadImage","getSlot","getComputedStyle","parentElement","_detectMissingCSS","_missingCSSCanary","getPropertyValue","_contextLost","_contextRestored","_onMapScroll","_addPopup","_removePopup","_frame","scrollTop","_styleDirty","_sourcesDirty","_render","_removed","_updateAverageElevation","_placementDirty","showTerrainWireframe","showLayers2DWireframe","showLayers3DWireframe","deleteQuery","gpuTime","layerTimes","_triggerFrame","_calculateSpeedIndex","speedIndex","_fullyLoaded","_authenticate","_trackPointer","readPixels","_canvasPixelComparison","loseContext","_renderNextFrame","visibilityState","_showTileBoundaries","_showTerrainWireframe","_showLayers2DWireframe","_showLayers3DWireframe","_speedIndexTiming","_showPadding","_vertices","_showTileAABBs","_setCacheLimits","NavigationControl","_zoomInButton","_createButton","_zoomOutButton","_compass","_compassIcon","_updateZoomButtons","_rotateCompassArrow","_setButtonTitle","GeolocateControl","_updateMarkerRotationThrottled","_updateMarkerRotation","_numberOfWatches","_checkGeolocationSupport","_setupUI","_geolocationWatchID","clearWatch","_userLocationDotMarker","_accuracyCircleMarker","_onZoom","_noTimeout","_this3","_supportsGeolocation","permissions","_isOutOfMapMaxBounds","_setErrorState","_watchState","_geolocateButton","_onSuccess","_updateMarker","_finish","_lastKnownPosition","_updateCamera","geolocateSource","_accuracy","_updateCircleRadius","_circleElement","_heading","_onError","_clearWatch","_timeoutId","_dotElement","_setup","_onDeviceOrientation","webkitCompassHeading","absolute","watchPosition","_addDeviceOrientationListener","DeviceMotionEvent","requestPermission","DeviceOrientationEvent","AttributionControl","ScaleControl","_isNumberFormatSupported","unitDisplay","_setScale","setUnit","FullscreenControl","_fullscreen","_fullscreenchange","_checkFullscreenSupport","_changeIcon","fullscreenEnabled","webkitFullscreenEnabled","_fullscreenButton","_updateTitle","_onClickFullscreen","_getTitle","_isFullscreen","exitFullscreen","webkitCancelFullScreen","requestFullscreen","webkitRequestFullscreen","Popup","_classList","_onClose","closeOnMove","_focusFirstElement","_onMouseEvent","_content","trackPointer","setText","setDOMContent","createTextNode","setHTML","createDocumentFragment","getMaxWidth","setMaxWidth","hasChildNodes","_closeButton","_updateClassList","_getAnchor","offsetHeight","_tip","LngLat","LngLatBounds","Point","MercatorCoordinate","FreeCameraOptions","Evented","prewarm","clearPrewarmedResources","baseApiUrl","maxParallelImageRequests","clearStorage","acceptsBooleans","attributeName","attributeNamespace","mustUseProperty","propertyName","sanitizeURL","removeEmptyString","xlinkHref","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","for","prepareStackTrace","construct","displayName","tag","$$typeof","_context","_payload","_init","nodeName","_valueTracker","stopTracking","checked","defaultChecked","_wrapperState","initialChecked","initialValue","controlled","ownerDocument","defaultSelected","dangerouslySetInnerHTML","namespaceURI","MSApp","execUnsafeLocalFunction","lastChild","nodeType","nodeValue","animationIterationCount","aspectRatio","borderImageOutset","borderImageSlice","borderImageWidth","boxFlex","boxFlexGroup","boxOrdinalGroup","columnCount","columns","flex","flexGrow","flexPositive","flexShrink","flexNegative","flexOrder","gridArea","gridRow","gridRowEnd","gridRowSpan","gridRowStart","gridColumn","gridColumnEnd","gridColumnSpan","gridColumnStart","lineClamp","lineHeight","orphans","tabSize","widows","zIndex","fillOpacity","floodOpacity","stopOpacity","strokeDasharray","strokeDashoffset","strokeMiterlimit","strokeOpacity","strokeWidth","setProperty","menuitem","col","embed","keygen","meta","track","wbr","srcElement","correspondingUseElement","stateNode","onError","alternate","return","memoizedState","dehydrated","child","sibling","unstable_scheduleCallback","unstable_cancelCallback","unstable_shouldYield","unstable_requestPaint","unstable_now","unstable_getCurrentPriorityLevel","unstable_ImmediatePriority","unstable_UserBlockingPriority","unstable_NormalPriority","unstable_LowPriority","unstable_IdlePriority","clz32","pendingLanes","suspendedLanes","pingedLanes","entangledLanes","entanglements","eventTimes","pointerId","nativeEvent","blockedOn","domEventName","eventSystemFlags","targetContainers","isDehydrated","containerInfo","dispatchEvent","ReactCurrentBatchConfig","_reactName","_targetInst","currentTarget","isDefaultPrevented","returnValue","isPropagationStopped","cancelBubble","persist","isPersistent","eventPhase","bubbles","isTrusted","detail","screenX","screenY","pageX","pageY","getModifierState","fromElement","toElement","movementX","movementY","dataTransfer","animationName","elapsedTime","pseudoElement","Esc","Spacebar","Left","Right","Down","Del","Win","Menu","Apps","Scroll","MozPrintableKey","Alt","Control","Meta","Shift","repeat","which","pressure","tangentialPressure","tiltX","tiltY","twist","pointerType","isPrimary","deltaX","wheelDeltaX","wheelDeltaY","wheelDelta","deltaZ","datetime","email","month","password","tel","week","oninput","detachEvent","attachEvent","nextSibling","compareDocumentPosition","HTMLIFrameElement","contentWindow","contentEditable","focusedElem","selectionRange","selectionStart","selectionEnd","defaultView","getSelection","rangeCount","anchorNode","anchorOffset","focusNode","focusOffset","createRange","setStart","removeAllRanges","addRange","setEnd","animationend","animationiteration","animationstart","transitionend","animation","parentWindow","char","__html","queueMicrotask","previousSibling","contextTypes","__reactInternalMemoizedUnmaskedChildContext","__reactInternalMemoizedMaskedChildContext","childContextTypes","getChildContext","__reactInternalMemoizedMergedChildContext","elementType","deletions","pendingProps","overflow","treeContext","retryLane","memoizedProps","_owner","_stringRef","refs","props","_currentValue","childLanes","firstContext","lanes","memoizedValue","interleaved","updateQueue","baseState","firstBaseUpdate","lastBaseUpdate","shared","pending","effects","eventTime","lane","tagName","revealOrder","_workInProgressVersionPrimary","ReactCurrentDispatcher","baseQueue","lastRenderedReducer","action","hasEagerState","eagerState","lastRenderedState","dispatch","getSnapshot","lastEffect","stores","deps","readContext","useCallback","useContext","useEffect","useImperativeHandle","useInsertionEffect","useLayoutEffect","useMemo","useReducer","useRef","useState","useDebugValue","useDeferredValue","useTransition","useMutableSource","useSyncExternalStore","useId","unstable_isNewReconciler","identifierPrefix","defaultProps","isMounted","_reactInternals","enqueueSetState","enqueueReplaceState","enqueueForceUpdate","shouldComponentUpdate","isPureReactComponent","contextType","updater","componentWillReceiveProps","UNSAFE_componentWillReceiveProps","getDerivedStateFromProps","getSnapshotBeforeUpdate","UNSAFE_componentWillMount","componentWillMount","componentDidMount","digest","getDerivedStateFromError","componentDidCatch","componentStack","pingCache","ReactCurrentOwner","baseLanes","cachePool","transitions","ej","fj","gj","hj","ij","UNSAFE_componentWillUpdate","componentWillUpdate","componentDidUpdate","jj","kj","pendingContext","lj","zj","Aj","Bj","Cj","mj","nj","oj","fallback","pj","qj","sj","dataset","dgst","tj","uj","_reactRetry","rj","subtreeFlags","vj","wj","isBackwards","rendering","renderingStartTime","tail","tailMode","xj","Dj","Ej","Fj","wasMultiple","multiple","suppressHydrationWarning","onClick","onclick","autoFocus","Gj","Hj","Ij","Jj","Kj","WeakSet","Lj","Mj","Nj","Pj","Qj","Rj","Sj","Tj","Uj","Vj","_reactRootContainer","Wj","Xj","Yj","Zj","onCommitFiberUnmount","componentWillUnmount","ek","fk","gk","hk","ik","jk","kk","__reactInternalSnapshotBeforeUpdate","Vk","lk","mk","nk","pk","qk","rk","sk","tk","uk","vk","wk","xk","yk","zk","Ak","Bk","Ck","Dk","callbackNode","expirationTimes","expiredLanes","callbackPriority","Ek","Fk","Gk","Hk","Ik","Jk","Kk","Lk","Mk","Nk","Ok","finishedWork","finishedLanes","Pk","timeoutHandle","Qk","Rk","Sk","Tk","Uk","mutableReadLanes","Oj","onCommitFiberRoot","onRecoverableError","Wk","onPostCommitFiberRoot","Xk","Yk","$k","isReactComponent","pendingChildren","mutableSourceEagerHydrationData","pendingSuspenseBoundaries","yj","Zk","reportError","_internalRoot","unmount","unstable_scheduleHydration","form","usingClientEntryPoint","findFiberByHostInstance","bundleType","rendererPackageName","rendererConfig","overrideHookState","overrideHookStateDeletePath","overrideHookStateRenamePath","overrideProps","overridePropsDeletePath","overridePropsRenamePath","setErrorHandler","setSuspenseHandler","scheduleUpdate","currentDispatcherRef","findHostInstanceByFiber","findHostInstancesForRefresh","scheduleRefresh","scheduleRoot","setRefreshHandler","getCurrentFiber","reconcilerVersion","__REACT_DEVTOOLS_GLOBAL_HOOK__","isDisabled","supportsFiber","inject","createPortal","createRoot","unstable_strictMode","findDOMNode","flushSync","hydrate","hydrateRoot","hydratedSources","_getVersion","unmountComponentAtNode","unstable_batchedUpdates","unstable_renderSubtreeIntoContainer","checkDCE","__self","__source","Fragment","jsx","jsxs","forceUpdate","escape","_status","_result","Children","only","Component","Profiler","PureComponent","StrictMode","Suspense","act","cloneElement","createContext","_currentValue2","_threadCount","Provider","Consumer","_globalName","createFactory","createRef","forwardRef","isValidElement","lazy","startTransition","unstable_act","sortIndex","setImmediate","priorityLevel","scheduling","isInputPending","unstable_Profiling","unstable_continueExecution","unstable_forceFrameRate","unstable_getFirstCallbackNode","unstable_next","unstable_pauseExecution","unstable_runWithPriority","unstable_wrapCallback","make","empty","api","extlang","script","expose","Suggestions","List","component","wrapper","show","hide","isVisible","drawItem","handleMouseUp","previous","drawError","hideOnBlur","handleKeyUp","handleKeyDown","handleFocus","handleBlur","handlePaste","handleInputChange","getCandidates","revisedData","candidate","createEvent","initEvent","fireEvent","sourceFormatting","boldString","indexString","indexOfQuery","endIndexOfQuery","crypto","getRandomValues","byte","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","leafPrototypes","getProto","def","definition","chunkId","promises","miniCssF","prop","inProgress","dataWebpackPrefix","needAttach","scripts","getElementsByTagName","charset","onScriptComplete","doneFns","head","toStringTag","nmd","paths","installedChunks","installedChunkData","promise","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","chunkLoadingGlobal","isMantineColorScheme","localStorageColorSchemeManager","handleStorageEvent","storedColorScheme","subscribe","onUpdate","storageArea","newValue","unsubscribe","MantineContext","useMantineContext","useMantineStyleNonce","getStyleNonce","useMantineEnv","env","transformedValue","_value$match","getTransformedScaledValue","scaleRem","remValue","createConverter","shouldScale","converter","replaced","rem","toRgba","hexString","shorthandHex","hexToRgba","rgbStringToRgba","hslaString","chroma","huePrime","hslStringToRgba","darken","dark","getPrimaryShade","theme","colorScheme","primaryShade","gammaCorrect","luminance","oklchColor","getLightnessFromOklch","sG","sB","isLightColor","luminanceThreshold","parseThemeColor","shade","isThemeColor","isLight","variable","colors","colorShade","colorValue","getThemeColor","primaryColor","getGradient","_gradient$deg","merged","defaultGradient","deg","fromColor","toColor","alpha2","mixPercentage","DEFAULT_FONT_FAMILY","DEFAULT_THEME","fontSmoothing","focusRing","grape","variantColorResolver","variant","autoContrast","_autoContrast","hover","border","parsedColor","fontFamilyMonospace","respectReducedMotion","cursorType","defaultRadius","activeClassName","focusClassName","headings","textWrap","sizes","h1","h2","h3","h4","h5","h6","fontSizes","lineHeights","spacing","breakpoints","shadows","deepMerge","INVALID_PRIMARY_COLOR_ERROR","INVALID_PRIMARY_SHADE_ERROR","isValidPrimaryShade","validateMantineTheme","MantineThemeContext","useSafeMantineTheme","useMantineTheme","MantineThemeProvider","inherit","parentTheme","mergedTheme","currentTheme","themeOverride","_themeOverride$headin","mergeMantineTheme","MantineClasses","nonce","classes","breakpoint","isPxBreakpoint","pxValue","maxWidthBreakpoint","minWidthBreakpoint","cssVariablesObjectToString","variables","wrapWithSelector","selectors","selector","getContrastColor","getPrimaryContrastColor","getCSSColorVariables","withColorValues","primaryShade2","dynamicVariables2","dynamicVariables","assignSizeVariables","defaultCssVariablesResolver","lightPrimaryShade","isVirtualColor","heading","defaultCssVariables","MantineCssVariables","cssVariablesSelector","deduplicateCssVariables","mergedVariables","generator","defaultResolver","providerGenerator","getMergedVariables","cssVariablesResolver","shouldCleanVariables","css","sharedVariables","darkForced","lightForced","convertCssVariables","cleaned","removeDefaultVariables","useIsomorphicEffect","setColorSchemeAttribute","getRootElement","_window$matchMedia","_getRootElement","hasDarkColorScheme","computedColorScheme","MantineProvider","withStaticClasses","withGlobalClasses","withCssVariables","classNamesPrefix","colorSchemeManager","defaultColorScheme","forceColorScheme","stylesTransform","setColorScheme","clearColorScheme","manager","media","colorSchemeValue","_media$current","_media$current2","useProviderColorScheme","useRespectReduceMotion","originalError","suppressNextjsWarning","Action","PopStateEventType","createBrowserHistory","getUrlBasedHistory","globalHistory","pathname","createLocation","usr","createPath","invariant","cond","getHistoryState","_extends","parsePath","parsedPath","hashIndex","searchIndex","getLocation","createHref","validateLocation","v5Compat","Pop","getIndex","handlePop","nextIndex","delta","createURL","listen","encodeLocation","Push","historyState","pushState","DOMException","ResultType","immutableRouteKeys","convertRoutesToDataRoutes","routes","mapRouteProperties","parentPath","manifest","treePath","isIndexRoute","indexRoute","pathOrLayoutRoute","matchRoutes","locationArg","basename","stripBasename","flattenRoutes","siblings","compareIndexes","routesMeta","childrenIndex","rankRouteBranches","decoded","decodePath","matchRouteBranch","parentsMeta","flattenRoute","relativePath","joinPaths","computeScore","_route$path","exploded","explodeOptionalSegments","rest","isOptional","restExploded","subpath","paramRe","dynamicSegmentValue","indexRouteValue","emptySegmentValue","staticSegmentValue","splatPenalty","isSplat","initialScore","branch","matchedParams","matchedPathname","remainingPathname","matchPath","pathnameBase","normalizePathname","matcher","compiledParams","regexpSource","paramName","compilePath","captureGroups","splatValue","startIndex","nextChar","getInvalidPathError","field","dest","getPathContributingMatches","getResolveToMatches","v7_relativeSplatPath","pathMatches","resolveTo","toArg","routePathnames","locationPathname","isPathRelative","isEmptyPath","toPathname","routePathnameIndex","toSegments","fromPathname","resolvePathname","normalizeSearch","normalizeHash","resolvePath","hasExplicitTrailingSlash","hasCurrentTrailingSlash","ErrorResponseImpl","internal","isRouteErrorResponse","validMutationMethodsArr","validMutationMethods","validRequestMethodsArr","validRequestMethods","redirectStatusCodes","redirectPreserveMethodStatusCodes","IDLE_NAVIGATION","formMethod","formAction","formEncType","formData","IDLE_FETCHER","IDLE_BLOCKER","proceed","ABSOLUTE_URL_REGEX","defaultMapRouteProperties","hasErrorBoundary","TRANSITIONS_STORAGE_KEY","createRouter","routerWindow","isBrowser","isServer","detectErrorBoundary","inFlightDataRoutes","dataRoutes","dataStrategyImpl","unstable_dataStrategy","defaultDataStrategy","future","v7_fetcherPersist","v7_normalizeFormMethod","v7_partialHydration","v7_prependBasename","unstable_skipActionErrorRevalidation","unlistenHistory","subscribers","savedScrollPositions","getScrollRestorationKey","getScrollPosition","initialScrollRestored","hydrationData","initialMatches","initialErrors","getInternalRouterError","getShortCircuitMatches","router","hasLazyRoutes","hasLoaders","loader","loaderData","isRouteInitialized","pendingNavigationController","historyAction","navigation","restoreScrollPosition","preventScrollReset","revalidation","actionData","fetchers","blockers","pendingAction","pendingPreventScrollReset","pendingViewTransitionEnabled","appliedViewTransitions","removePageHideEventListener","isUninterruptedRevalidation","isRevalidationRequired","cancelledDeferredRoutes","cancelledFetcherLoads","fetchControllers","incrementingLoadId","pendingNavigationLoadId","fetchReloadIds","fetchRedirectIds","fetchLoadMatches","activeFetchers","deletedFetchers","activeDeferreds","blockerFunctions","ignoreNextHistoryUpdate","newState","completedFetchers","deletedFetchersKeys","fetcher","subscriber","unstable_viewTransitionOpts","viewTransitionOpts","unstable_flushSync","deleteFetcher","completeNavigation","_temp","_location$state","_location$state2","isActionReload","isMutationMethod","_isRedirect","mergeLoaderData","priorPaths","currentLocation","nextLocation","toPaths","getSavedScrollPosition","async","startNavigation","startUninterruptedRevalidation","getScrollKey","saveScrollPosition","enableViewTransition","routesToUse","loadingNavigation","overrideNavigation","notFoundMatches","cancelActiveDeferreds","isHashChangeOnly","submission","pendingActionResult","createClientSideRequest","pendingError","findNearestBoundary","actionResult","interruptActiveLoads","getSubmittingNavigation","actionMatch","getTargetMatch","callDataStrategy","shortCircuited","routeId","isRedirectResult","normalizeRedirectLocation","startRedirectNavigation","isDeferredResult","isErrorResult","boundaryMatch","handleAction","getLoadingNavigation","fetcherSubmission","initialHydration","activeSubmission","getSubmissionFromNavigation","matchesToLoad","revalidatingFetchers","getMatchesToLoad","updatedFetchers","markFetchRedirectsDone","getActionDataForCommit","revalidatingFetcher","getLoadingFetcher","abortFetcher","controller","abortPendingFetchRevalidations","loaderResults","fetcherResults","callLoadersAndMaybeResolveData","redirect","findRedirect","fetcherKey","processLoaderData","deferredData","didAbortFetchLoads","abortStaleFetchLoads","shouldUpdateFetchers","handleLoaders","_temp2","redirectLocation","isDocumentReload","redirectHistoryAction","callDataStrategyImpl","isRedirectHandlerResult","normalizeRelativeRoutingRedirectResponse","convertHandlerResultToDataResult","currentMatches","fetchersToLoad","resolveDeferredResults","updateFetcherState","setFetcherError","getFetcher","markFetchersDone","doneFetcher","getDoneFetcher","doneKeys","landedId","yeetedKeys","deleteBlocker","updateBlocker","newBlocker","blocker","shouldBlockNavigation","blockerKey","blockerFunction","cancelledRouteIds","dfd","convertRouteMatchToUiMatch","initialize","_window","sessionPositions","sessionStorage","restoreAppliedTransitions","_saveAppliedTransitions","persistAppliedTransitions","enableScrollRestoration","getPosition","navigate","normalizedPath","normalizeTo","fromRouteId","relative","normalizeNavigateOptions","userReplace","unstable_viewTransition","requestMatches","existingFetcher","getSubmittingFetcher","abortController","fetchRequest","originatingLoadId","actionResults","revalidationRequest","loadId","loadFetcher","staleKey","handleFetcherAction","resolveDeferredData","handleFetcherLoader","revalidate","dispose","getBlocker","_internalFetchControllers","_internalActiveDeferreds","_internalSetRoutes","newRoutes","prependBasename","contextualMatches","activeRouteMatch","hasNakedIndexQuery","normalizeFormMethod","isFetcher","isSubmissionNavigation","isValidMethod","searchParams","getInvalidBodyError","rawFormMethod","stripHashFromPath","FormData","convertFormDataToSearchParams","convertSearchParamsToFormData","getLoaderMatchesUntilBoundary","boundaryId","boundaryMatches","skipActionErrorRevalidation","currentUrl","nextUrl","actionStatus","shouldSkipRevalidation","navigationMatches","currentLoaderData","currentMatch","isNew","isMissingData","isNewLoader","currentRouteMatch","nextRouteMatch","shouldRevalidateLoader","currentParams","nextParams","unstable_actionStatus","defaultShouldRevalidate","isNewRouteInstance","fetcherMatches","fetcherMatch","shouldRevalidate","currentPath","loaderMatch","routeChoice","loadLazyRouteModule","lazyRoute","routeToUpdate","routeUpdates","lazyRouteProperty","isPropertyStaticallyDefined","requestContext","routeIdsToLoad","loadedMatches","shouldLoad","handlerOverride","staticContext","onReject","runHandler","abortPromise","handlerPromise","actualHandler","race","handlerError","callLoaderOrAction","handlerResult","isResponse","contentType","deferred","resolveData","isDeferredData","_result$init","_result$init2","trimmedMatches","normalizedLocation","isSameBasename","processRouteLoaderData","skipLoaderErrorBubbling","foundError","loaderHeaders","newLoaderData","mergedLoaderData","eligibleMatches","_temp5","signals","isRevalidatingLoader","unwrappedData","getAll","DataRouterContext","React","DataRouterStateContext","NavigationContext","LocationContext","RouteContext","outlet","isDataRoute","RouteErrorContext","useInRouterContext","useLocation","UNSAFE_invariant","useIsomorphicLayoutEffect","static","useNavigate","useDataRouterContext","DataRouterHook","UseNavigateStable","useCurrentRouteId","DataRouterStateHook","activeRef","useNavigateStable","dataRouterContext","routePathnamesJson","UNSAFE_getResolveToMatches","useNavigateUnstable","useRoutesImpl","dataRouterState","parentMatches","routeMatch","parentParams","parentPathnameBase","locationFromContext","_parsedLocationArg$pa","parsedLocationArg","parentSegments","renderedMatches","_renderMatches","navigationType","DefaultErrorComponent","_state$errors","useDataRouterState","UseRouteError","useRouteError","preStyles","backgroundColor","defaultErrorElement","RenderErrorBoundary","errorInfo","routeContext","RenderedRoute","errorElement","ErrorBoundary","_deepestRenderedBoundaryId","_dataRouterState2","_dataRouterState","errorIndex","renderFallback","fallbackIndex","HydrateFallback","hydrateFallbackElement","needsToRunLoader","reduceRight","shouldRenderHydrateFallback","alreadyWarned","hookName","useRouteContext","thisRoute","Router","basenameProp","locationProp","staticProp","navigationContext","locationContext","trailingPathname","updates","__reactRouterVersion","parseHydrationData","__staticRouterHydrationData","deserializeErrors","serialized","__type","UNSAFE_ErrorResponseImpl","__subType","ErrorConstructor","ViewTransitionContext","isTransitioning","FetchersContext","startTransitionImpl","flushSyncImpl","ReactDOM","flushSyncSafe","Deferred","reason","RouterProvider","fallbackElement","setStateImpl","pendingState","setPendingState","vtContext","setVtContext","renderDfd","setRenderDfd","interruption","setInterruption","fetcherData","v7_startTransition","optInStartTransition","startTransitionSafe","isViewTransitionUnavailable","startViewTransition","skipTransition","finished","finally","renderPromise","UNSAFE_DataRouterContext","UNSAFE_DataRouterStateContext","DataRoutes","UNSAFE_useRoutesImpl","filterProps","useProps","_theme$components$com","contextPropsPayload","FOCUS_CLASS_NAMES","always","auto","never","EMPTY_CLASS_NAMES","resolveClassNames","classNames","stylesCtx","objects","mergeClassNames","getResolvedClassNames","getClassName","themeName","unstyled","rootSelector","headless","transformedStyles","focusable","getGlobalClassNames","_resolveClassNames","_theme$components$n","getThemeClassNames","getVariantClassName","getOptionsClassNames","getRootClassName","getSelectorClassName","withStaticClass","getStaticClassNames","resolveStyles","styles","getThemeStyles","resolveStyle","resolveVars","_mergeVars","vars","varsResolver","mergeVars","_theme$components","_theme$components$var","withStylesTransform","useStylesTransform","_useMantineStylesTran","_useMantineContext$st2","useMantineStylesTransform","getTransformedStyles","useStyles","cssObjectToString","rule","letter","stylesToString","baseStyles","mediaQueryStyles","containerStyles","InlineStyles","isNumberLike","cssUnitsRegex","transformModKey","getBoxMod","mod","mergeStyles","getBoxStyle","styleProps","extractStyleProps","others","fz","fw","lts","miw","maw","mih","mah","bgsz","bgp","bgr","bga","inset","hiddenFrom","visibleFrom","lightHidden","darkHidden","STYlE_PROPS_DATA","colorResolver","mono","monospace","resolvers","colorTuple","replaceMediaQuery","getBreakpointValue","parseStyleProps","sortedMedia","sortMediaQueries","styleProp","propertyData","baseValue","hasResponsiveStyles","inlineStyles","getBreakpointKeys","useRandomClassName","_Box","_useSxTransform","__vars","renderRoot","__size","Element","useSxTransform","_useMantineContext$st","useMantineSxTransform","transformedSx","responsiveClassName","parsedStyleProps","Box","withProps","fixedProps","Extended","sizeVariables","titleSize","getTitleSize","Title","_props","getStyles","getSize","convertToRem","getSpacing","getRadius","getFontSize","getLineHeight","getShadow","polymorphicFactory","getTextTruncate","truncate","Text","inline","__staticSelector","Bars","barsLoader","bar","Dots","dotsLoader","Oval","ovalLoader","defaultLoaders","bars","oval","dots","loaders","Loader","popIn","out","transitionProperty","fade","common","transformOrigin","transitionStatuses","entering","entered","exiting","exited","getTransitionStyles","timingFunction","WebkitBackfaceVisibility","willChange","transitionDuration","transitionTimingFunction","useMediaQuery","getInitialValueInEffect","setMatches","getInitialValue","queryRef","attachMediaListener","useReducedMotion","useDidUpdate","mounted","exitDuration","onEnter","onExit","onEntered","onExited","enterDelay","exitDelay","shouldReduceMotion","reduceMotion","setTransitionDuration","transitionStatus","setStatus","transitionTimeoutRef","delayTimeoutRef","rafRef","handleStateChange","shouldMount","preHandler","newTransitionDuration","Transition","keepMounted","UnstyledButton","borderWidth","group","ButtonGroup","role","groupSection","ButtonGroupSection","loaderTransition","justify","hoverColor","Button","leftSection","rightSection","fullWidth","loaderProps","dataDisabled","hasLeftSection","hasRightSection","block","transitionStyles","Group","GroupSection","Welcome","_jsxs","_Fragment","title","_jsx","noop","disableTransition","useMantineColorScheme","keepTransitions","clearStylesRef","timeoutRef","nonceValue","_clearStylesRef$curre","osColorScheme","useColorScheme","toggleColorScheme","_clearStylesRef$curre3","_clearStylesRef$curre2","preventGrowOverflow","gap","align","childWidth","filteredChildren","filterFalsyChildren","childrenCount","resolvedGap","ColorSchemeToggle","HomePage","MountedMapsContext","MapProvider","maps","setMaps","onMapMount","currMaps","onMapUnmount","nextMaps","deepEqual","aKeys","bKeys","syncProjection","srcProjection","transformToViewState","applyViewStateToTransform","viewState","changed","refProps","normalizeStyle","toJS","normalizedLayer","layerRef","propName","mouseenter","mouseleave","cameraEvents","movestart","moveend","dragstart","dragend","zoomstart","zoomend","rotatestart","rotateend","pitchstart","pitchend","otherEvents","boxzoomstart","boxzoomend","boxzoomcancel","idle","styledata","sourcedata","settingNames","handlerNames","Mapbox","MapClass","_internalUpdate","_inRender","_hoveredFeatures","_deferredEvents","_onEvent","_onPointerEvent","_updateHover","interactiveLayerIds","_queryRenderedFeatures","_onCameraEvent","_MapClass","_initialize","_renderTransform","setProps","oldProps","settingsChanged","_updateSettings","_createShadowTransform","sizeChanged","_updateSize","viewStateChanged","_updateViewState","_updateStyleComponents","_updateHandlers","redraw","reuse","savedMaps","oldContainer","resizeObserver","_resizeObserver","disconnect","observe","styleDiffing","initialViewState","mapStyle","mapOptions","mapboxAccessToken","getAccessTokenFromEnv","cursor","renderMap","runRenderTaskQueue","_onBeforeRepaint","_onAfterRepaint","eventName","recycle","renderTransform","newTransform","cloneTransform","nextProps","triggerEvents","deferredEvents","currProps","setter","onMouseMove","onMouseEnter","onMouseLeave","eventType","wasHovering","isHovering","baseFire","MapboxAccessToken","skipMethods","mapInstance","getMap","lnglat","proto","getMethodNames","globalSettings","MapContext","defaultLib","mountedMapsContext","setMapInstance","containerRef","contextValue","mapLib","RTLTextPlugin","setGlobals","reuseMaps","unitlessNumber","applyReactStyle","thisRef","hasChildren","onDragStart","onDrag","onDragEnd","popup","arePointsEqual","getClassList","onOpen","onClose","prevClassList","nextClassList","onCreate","arg1","arg2","arg3","ctrl","useControl","containerId","setupUI","onGeolocate","onOutOfMaxBounds","onTrackUserLocationStart","onTrackUserLocationEnd","propsRef","prevProps","condition","layerCounter","setStyleLoaded","beforeId","prevLayout","prevPaint","createLayer","sourceCounter","allLayers","changedKey","changedKeyCount","updateSource","createSource","_Map","_Marker","_FullscreenControl","_NavigationControl","_ScaleControl","_Layer","_Source","_goober","noOp","SnackbarContext","React__default","enqueueSnackbar","closeSnackbar","capitalise","originKeyExtractor","isDefined","UNMOUNTED","EXITED","ENTERING","ENTERED","EXITING","_React$Component","initialStatus","appear","appearStatus","unmountOnExit","mountOnEnter","nextCallback","prevState","updateStatus","nextStatus","cancelNextCallback","getTimeouts","enter","exit","mounting","performEnter","performExit","isAppearing","timeouts","safeSetState","onEntering","onTransitionEnd","onExiting","nextState","setNextCallback","_this4","doesNotHaveTimeoutOrListener","addEndListener","_this$props","_objectWithoutPropertiesLoose","_this$props$nodeRef","nodeRef","setRef","useForkRef","refA","refB","refValue","getTransitionProps","_props$style","transitionDelay","defaultEasing","reflow","formatMs","milliseconds","createTransition","_ref$duration","_ref$easing","_ref$delay","animatedProp","formattedDuration","formattedDelay","ownerWindow","doc","setTranslateValue","containerWindow","fakeTransform","computedStyle","offsetX","offsetY","transformValues","getTranslateValue","webkitTransform","Slide","_props$direction","inProp","_props$timeout","handleRefIntermediary","handleRef","updatePosition","handleResize","transitionProps","webkitTransition","childProps","SvgIcon","marginInlineEnd","CheckIcon","WarningIcon","ErrorIcon","InfoIcon","defaults","maxSnack","hideIconVariant","disableWindowBlurListener","autoHideDuration","iconVariant","info","anchorOrigin","TransitionComponent","merge","shouldObjectMerge","optionsDuration","propsDuration","isNumberOrNull","numberish","getAutoHideDuration","getTransitionDuration","makeStyles","_extends2","ComponentClasses","collapsedSize","Collapse","wrapperRef","getWrapperSize","clientHeight","wrapperSize","_getTransitionProps","_getTransitionProps2","clsx","minHeight","toSnackbarAnchorOrigin","noOp$1","createChainedFunction","funcs","snackbarId","argums","useEnhancedEffect","useEventCallback","Snackbar","_props$disableWindowB","SnackbarProps","_props$SnackbarProps","timerAutoHide","handleClose","setAutoHideTimer","autoHideDurationParam","handlePause","handleResume","classes$1","_root","flexWrap","minWidth","SnackbarContent","classes$2","letterSpacing","alignItems","borderRadius","boxShadow","lessPadding","paddingLeft","marginLeft","marginRight","ariaDescribedby","MaterialDesignContent","forwardedRef","componentOrFunctionAction","MaterialDesignContent$1","wrappedRoot","SnackbarItem","_useState","setCollapsed","snack","handleExitedScreen","allClasses","_props$Component","containerClasses","containerRoot","containerAnchorOriginTopCenter","containerAnchorOriginBottomCenter","containerAnchorOriginTopRight","containerAnchorOriginBottomRight","containerAnchorOriginTopLeft","containerAnchorOriginBottomLeft","keepSnackbarClassKeys","TransitionProps","componentOrFunctionContent","otherSnack","cbName","requestClose","indents","dense","collapseWrapper","styles$1","_root$1","boxSizing","rootDense","_rootDense","flexDirection","_left","xsWidthMargin","_right","SnackbarContainer","_props$classes","combinedClassname","SnackbarContainer$1","isOptions","messageOrOptions","SnackbarProvider","_Component","optsOrUndefined","preventDuplicate","hasSpecifiedKey","merger","compareFunction","inQueue","inView","snacks","handleDisplaySnack","handleDismissOldest","processQueue","popped","ignore","handleEnteredSnack","handleCloseSnack","shouldCloseAll","toBeClosed","handleExitedSnack","_assertThisInitialized","domRoot","_this$props$dense","Components","_this$props$Component","categ","category","existingOfCategory","snackbars","nomineeSnack","GeocoderControl","setMarker","onLoading","onResults","_result$geometry","onResult","markerProps","permitSubmittedLayer","baseLayer","permitApprovedLayer","randomId","__useId","staticId","reactId","useReactId","uuid","setUuid","getAutoContrastValue","createOptionalContext","Context","useOptionalContext","InputContext","useInputContext","CloseIcon","xmlns","fillRule","clipRule","iconSize","CloseButton","InputClearButton","resolvedClassNames","resolvedStyles","useResolvedStylesApi","InputWrapperProvider","useInputWrapperContext","offsetBottom","offsetTop","describedBy","inputId","labelId","description","InputDescription","__inheritStyles","_getStyles","InputError","labelElement","InputLabel","htmlFor","onMouseDown","InputPlaceholder","getInputOffsets","inputWrapperOrder","hasDescription","hasError","inputIndex","aboveInput","belowInput","inputContainer","InputWrapper","labelProps","descriptionProps","errorProps","withAsterisk","__stylesApiProps","sharedProps","idBase","isRequired","errorId","descriptionId","_describedBy","_label","_description","_input","_error","leftSectionPointerEvents","rightSectionPointerEvents","withAria","withErrorStyles","leftSectionWidth","rightSectionWidth","multiline","Input","wrapperProps","leftSectionProps","rightSectionProps","pointer","inputSize","__clearSection","__clearable","__defaultRightSection","ariaAttributes","_rightSection","Wrapper","Label","Description","Placeholder","ClearButton","InlineInputClasses","InlineInput","labelPosition","bodyElement","useUncontrolled","finalValue","onChange","uncontrolledValue","setUncontrolledValue","CheckboxGroupContext","CheckboxGroupProvider","useCheckboxGroupContext","CheckboxCardProvider","useCheckboxCardContext","withBorder","card","CheckboxCard","_checked","_value","InputsGroupFieldset","CheckboxGroup","readOnly","itemValue","CheckboxIcon","indeterminate","iconColor","outlineColor","indicator","CheckboxIndicator","Icon","Checkbox","rootRef","_size","contextProps","fallbackRef","Indicator","Card","CustomisedCheckbox","colourTheme","isChecked","onCheckboxChange","handleCheckboxChange","borderColor","createSafeContext","useSafeContext","GridProvider","useGridContext","getSortedBreakpoints","convertedBreakpoints","getBaseValue","getColumnFlexBasis","colSpan","getColumnMaxWidth","getColumnFlexGrow","getColumnOffset","GridColVariables","_getBaseValue","_breakpoints","baseSpan","queries","_order$breakpoint","GridCol","GridVariables","gutter","Grid","Col","filterTitle","permitSubmitted","permitApproved","StyleControls","setVisibility","permitIssued","fromEntries","onVisibilityChange","shadow","Paper","CardProvider","useCardContext","CardSection","inheritPadding","_children","Section","Badge","underline","Anchor","CustomisedCard","stage","applicationURL","statusMapping","statuses","getBadgeColor","statusColorMapping","getStatusTitle","textTransform","fit","fallbackSrc","setError","Banner","setVisible","backgroundImage","backgroundSize","backgroundPosition","alt","assignRef","useMergedRef","cleanupMap","mergeRefs","isElement","elevations","app","modal","popover","overlay","getDefaultZIndex","level","getRefProp","_element$props","DirectionContext","toggleDirection","setDirection","useDirection","getFloatingPosition","side","flippedPosition","horizontalSide","arrowY","arrowOffset","arrowPosition","verticalSide","arrowX","radiusByFloatingSide","getArrowPositionStyles","arrowSize","arrowRadius","arrowPlacement","borderLeftColor","borderBottomColor","clipPath","borderRightColor","borderTopColor","FloatingArrow","createPortalNode","Portal","reuseTargetNode","setMounted","existingNode","getTargetNode","OptionalPortal","withinPortal","defaultTransition","getStyleObject","hasWindow","getNodeName","isNode","getWindow","_node$ownerDocument","getDocumentElement","Node","isHTMLElement","isShadowRoot","ShadowRoot","isOverflowElement","overflowX","overflowY","isTableElement","isTopLayer","isContainingBlock","elementOrCss","webkit","isWebKit","containerType","backdropFilter","contain","CSS","supports","isLastTraversableNode","getNodeScroll","scrollX","scrollY","getParentNode","assignedSlot","getNearestOverflowAncestor","getOverflowAncestors","traverseIframes","_node$ownerDocument2","scrollableAncestor","isBody","win","frameElement","getFrameElement","visualViewport","_activeElement","rootNode","getRootNode","getPlatform","uaData","userAgentData","brands","brand","isVirtualPointerEvent","isAndroid","isMouseLikePointerType","strict","getDocument","isEventTargetWithin","composedPath","getTarget","TYPEABLE_SELECTOR","isTypeableElement","createCoords","oppositeSideMap","oppositeAlignmentMap","clamp","getSide","getAlignment","getOppositeAxis","getAxisLength","getSideAxis","getAlignmentAxis","getOppositeAlignmentPlacement","getOppositePlacement","getPaddingObject","expandPaddingObject","rectToClientRect","computeCoordsFromPlacement","rtl","reference","floating","sideAxis","alignmentAxis","alignLength","isVertical","commonX","commonY","commonAlign","detectOverflow","_await$platform$isEle","rects","elements","strategy","rootBoundary","elementContext","altBoundary","paddingObject","clippingClientRect","getClippingRect","contextElement","offsetParent","getOffsetParent","getScale","elementClientRect","convertOffsetParentRelativeRectToViewportRelativeRect","getBoundingRect","getCssDimensions","hasOffset","shouldFallback","unwrapElement","domElement","noOffsets","getVisualOffsets","offsetLeft","includeScale","isFixedStrategy","clientRect","visualOffsets","isFixed","floatingOffsetParent","shouldAddVisualOffsets","offsetWin","currentWin","currentIFrame","iframeScale","iframeRect","clientLeft","clientTop","paddingTop","getWindowScrollBarX","leftScroll","getHTMLOffset","scroll","ignoreScrollbarX","htmlRect","getClientRectFromClippingAncestor","clippingAncestor","html","visualViewportBased","getViewportRect","scrollWidth","scrollHeight","getDocumentRect","getInnerBoundingClientRect","hasFixedPositionAncestor","stopNode","getRectRelativeToOffsetParent","isOffsetParentAnElement","offsets","offsetRect","htmlOffset","isStaticPositioned","getTrueOffsetParent","polyfill","rawOffsetParent","svgOffsetParent","currentNode","getContainingBlock","topLayer","clippingAncestors","cachedResult","currentContainingBlockComputedStyle","elementIsFixed","currentNodeIsContaining","ancestor","getClippingElementAncestors","firstClippingAncestor","clippingRect","accRect","getElementRects","getOffsetParentFn","getDimensionsFn","getDimensions","floatingDimensions","getClientRects","isRTL","rectsAreEqual","autoUpdate","ancestorScroll","ancestorResize","elementResize","ResizeObserver","layoutShift","IntersectionObserver","animationFrame","referenceEl","ancestors","cleanupIo","onMove","timeoutId","_io","refresh","threshold","elementRectForRootMargin","rootMargin","isFirstUpdate","handleObserve","ratio","intersectionRatio","observeMove","frameId","reobserveFrame","firstEntry","unobserve","prevRefRect","frameLoop","nextRefRect","_resizeObserver2","_middlewareData$offse","_middlewareData$arrow","middlewareData","diffCoords","mainAxisMulti","crossAxisMulti","rawValue","mainAxis","crossAxis","convertValueToCoords","arrow","alignmentOffset","checkMainAxis","checkCrossAxis","limiter","detectOverflowOptions","mainAxisCoord","crossAxisCoord","maxSide","limitedCoords","flip","_middlewareData$flip","initialPlacement","fallbackPlacements","specifiedFallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","flipAlignment","initialSideAxis","isBasePlacement","oppositePlacement","getExpandedPlacements","hasFallbackAxisSideDirection","isStart","getSideList","getOppositeAxisPlacements","overflows","overflowsData","sides","mainAlignmentSide","getAlignmentSides","_middlewareData$flip2","_overflowsData$filter","nextPlacement","resetPlacement","_overflowsData$filter2","currentSideAxis","arrowDimensions","isYAxis","minProp","maxProp","clientProp","endDiff","startDiff","arrowOffsetParent","clientSize","centerToReference","largestPossiblePadding","minPadding","maxPadding","min$1","shouldAddOffset","nativeClientRects","clientRects","sortedRects","groups","prevRect","getRectsByLine","resetRects","firstRect","lastRect","isTop","isLeftSide","maxRight","minLeft","measureRects","computePosition","mergedOptions","platformWithCache","middleware","validMiddleware","statefulPlacement","resetCount","nextX","nextY","computePosition$1","getDPR","roundByDPR","dpr","useLatestRef","arrow$1","arrow$2","offset$1","shift$1","flip$1","inline$1","useMergeRefs","SafeReact","useSafeInsertionEffect","useEffectEvent","ARROW_UP","ARROW_DOWN","ARROW_LEFT","ARROW_RIGHT","horizontalKeys","verticalKeys","serverHandoffComplete","genId","setId","createPubSub","_map$get","_map$get2","FloatingNodeContext","FloatingTreeContext","useFloatingParentNodeId","_React$useContext","useFloatingTree","createAttribute","safePolygonIdentifier","getDelay","useHover","onOpenChange","dataRef","mouseOnly","restMs","parentId","handleCloseRef","delayRef","openRef","pointerTypeRef","handlerRef","restTimeoutRef","blockMouseMoveRef","performedPointerEventsMutationRef","unbindMouseMoveRef","restTimeoutPendingRef","isHoverOpen","_dataRef$current$open","openEvent","onLeave","closeWithDelay","runElseBranch","closeDelay","cleanupMouseMoveHandler","clearPointerEvents","isClickLikeOpenEvent","domReference","_elements$floating","onScrollMouseLeave","_elements$floating2","openDelay","floatingContext","_handleCloseRef$curre","__options","blockPointerEvents","floatingEl","_tree$nodesRef$curren","parentFloating","nodesRef","setPointerRef","onPointerDown","onPointerEnter","handleMouseMove","NOOP","FloatingDelayGroupContext","initialDelay","timeoutMs","currentId","setCurrentId","isInstantPhase","useDelayGroupContext","FloatingDelayGroup","initialCurrentIdRef","allChildren","_node$context","currentChildren","_currentChildren","_node$context2","FOCUSABLE_ATTRIBUTE","bubbleHandlerKeys","pointerdown","captureHandlerKeys","normalizeProp","normalizable","_normalizable$escapeK","_normalizable$outside","escapeKey","outsidePress","useDismiss","unstable_outsidePress","outsidePressEvent","referencePress","referencePressEvent","outsidePressFn","insideReactTreeRef","endedOrStartedInsideRef","escapeKeyBubbles","outsidePressBubbles","escapeKeyCapture","outsidePressCapture","isComposingRef","closeOnEscapeKeyDown","_dataRef$current$floa","nodeId","shouldDismiss","_child$context","__escapeKeyBubbles","isReactEvent","closeOnEscapeKeyDownCapture","_getTarget2","_getTarget","closeOnPressOutside","_dataRef$current$floa2","insideReactTree","endedOrStartedInside","inertSelector","markers","targetRootAncestor","nextParent","canScrollX","canScrollY","xCond","targetIsInsideChildren","_child$context2","__outsidePressBubbles","closeOnPressOutsideCapture","_getTarget4","_getTarget3","compositionTimeout","onScroll","handleCompositionStart","handleCompositionEnd","_doc$defaultView","onKeyDown","onMouseUp","useFloating","internalRootContext","onOpenChangeProp","elementsProp","floatingId","nested","positionReference","setPositionReference","useFloatingRootContext","rootContext","computedElements","_domReference","setDomReference","_setPositionReference","domReferenceRef","externalReference","externalFloating","whileElementsMounted","isPositioned","latestMiddleware","setLatestMiddleware","_reference","_setReference","_floating","_setFloating","setReference","referenceRef","setFloating","floatingRef","hasWhileElementsMounted","whileElementsMountedRef","platformRef","fullData","isMountedRef","floatingStyles","initialStyles","useFloating$1","computedPositionReference","useFocus","visibleOnly","blockFocusRef","keyboardModalityRef","onBlur","onFocus","maxTouchPoints","movedToFocusGuard","activeEl","ACTIVE_KEY","SELECTED_KEY","mergeProps","userProps","propsList","elementKey","isItem","domUserProps","__","validProps","tabIndex","propsOrGetProps","componentRoleToAriaRoleMap","useRole","_componentRoleToAriaR","ariaRole","referenceId","isNested","floatingProps","commonProps","refProp","defaultOpened","tooltip","TooltipFloating","portalProps","opened","boundaryRef","setOpened","horizontalOffset","verticalOffset","parents","useFloatingTooltip","targetRef","_childrenProps","_childrenProps$onMous","_childrenProps$onMous2","TooltipGroupContext","TooltipGroupProvider","TooltipGroup","close","getTooltipMiddlewares","middlewaresOptions","middlewares","getDefaultMiddlewares","arrowRef","useTooltip","_settings$events","_settings$events2","_settings$events3","uncontrolledOpened","setUncontrolledOpened","withinGroup","_opened","groupDelay","optionId","groupContext","unset","useDelayGroup","getReferenceProps","getFloatingProps","referenceDeps","floatingDeps","itemDeps","getItemProps","useInteractions","touch","positionDependencies","delayedUpdate","setDelayedUpdate","useFloatingAutoUpdate","_settings$onPositionC","onPositionChange","isGroupPhase","Tooltip","withArrow","floatingStrategy","componentTransition","_tooltip$y","_tooltip$x","Floating","ActionIconGroup","ActionIconGroupSection","ActionIcon","defaultAttributes","outline","stroke","strokeLinecap","strokeLinejoin","filled","createReactComponent","iconName","iconNamePascal","iconNode","attrs","IconPolygonOff","IconPolygon","IconPinnedOff","IconPin","IconHome","ModalBaseProvider","useModalBaseContext","ModalBaseBody","bodyId","setBodyMounted","getBodyId","useModalBodyId","ModalProvider","useModalContext","ModalBody","ModalBaseCloseButton","ModalCloseButton","TABBABLE_NODES","FOCUS_SELECTOR","getElementTabIndex","isTabIndexNotNaN","HTMLAnchorElement","tabbable","scopeTab","finalTabbable","leavingFinalTabbable","activeRadioGroup","VisuallyHidden","FocusTrap","innerRef","focusTrapRef","focusElement","preventScroll","useFocusTrap","FocusTrapInitialFocus","InitialFocus","ModalBaseContent","innerProps","_ctx$onExitTransition","_ctx$transitionProps","_ctx$transitionProps$","onExitTransitionEnd","_ctx$onEnterTransitio","_ctx$transitionProps2","_ctx$transitionProps3","onEnterTransitionEnd","trapFocus","bodyMounted","titleMounted","getTitleId","NativeScrollArea","ModalContent","__hidden","scrollAreaComponent","fullScreen","yOffset","ModalBaseHeader","ModalHeader","backgroundOpacity","Overlay","DEFAULT_TRANSITION","ModalBaseOverlay","transitionOverride","useModalTransition","closeOnClickOutside","ModalOverlay","__assign","__rest","propertyIsEnumerable","__spreadArray","SuppressedError","zeroRightClassName","fullWidthClassName","currentValues","callbackRef","facade","useCallbackRef","oldValue","prevRefs_1","nextRefs_1","current_1","ItoI","innerCreateMedium","assigned","medium","useMedium","assignSyncMedium","cbs","assignMedium","pendingQueue","executeQueue","cycle","effectCar","ssr","createSidecarMedium","nothing","RemoveScroll","parentRef","onScrollCapture","onWheelCapture","onTouchMoveCapture","setCallbacks","forwardProps","removeScrollBar","shards","sideCar","noIsolation","inert","allowPinchZoom","Container","gapMode","SideCar","containerProps","lockRef","zeroRight","currentNonce","Target","isSideCarExport","makeStyleTag","__webpack_nonce__","stylesheetSingleton","counter","styleSheet","cssText","insertStyleTag","styleSingleton","useStyle","sheet","isDynamic","styleHookSingleton","zeroGap","getGapWidth","documentWidth","windowWidth","lockAttribute","allowRelative","important","getCurrentUseCounter","RemoveScrollBar","noRelative","noImportant","newCounter","passiveSupported","nonPassive","elementCanBeScrolled","alwaysContainsScroll","locationCouldBeScrolled","elementCouldBeScrolled","getScrollVariables","elementCouldBeVScrolled","elementCouldBeHScrolled","getHScrollVariables","getTouchXY","getDeltaXY","extractRef","generateStyle","idCounter","lockStack","getOutermostShadowParent","shadowParent","exported","shouldPreventQueue","touchStartRef","activeAxis","lastProps","allow_1","shouldCancelEvent","currentAxis","touchStart","moveDirection","canBeScrolledInMainDirection","cancelingAxis","endTarget","sourceDelta","noOverscroll","directionFactor","getDirectionFactor","targetInLock","shouldCancelScroll","isDeltaPositive","availableScroll","availableScrollTop","elementScroll","handleScroll","shouldPrevent","_event","sourceEvent","deltaCompare","should","shardNodes","shouldCancel","scrollTouchStart","scrollWheel","scrollTouchMove","inst","ReactRemoveScroll","useModal","closeOnEscape","returnFocus","setTitleMounted","shouldLockScroll","setShouldLockScroll","_transitionDuration","useLockScroll","useWindowEvent","_event$target","shouldReturnFocus","lastActiveElement","_lastActiveElement$cu","clearFocusTimeout","useFocusReturn","ModalBase","lockScroll","removeScrollProps","removeScrollKey","otherRemoveScrollProps","xOffset","ModalRoot","centered","ModalStackProvider","useModalStackContext","ModalStack","setStack","maxZIndex","setMaxZIndex","addModal","removeModal","getZIndex","ModalBaseTitle","useModalTitle","ModalTitle","withOverlay","withCloseButton","Modal","overlayProps","closeButtonProps","stackId","hasHeader","stackProps","overlayVisible","Root","Content","Body","Header","Stack","notificationsStore","initialState","createStore","notifications","defaultPosition","useNotifications","store","useStore","updateNotificationsState","updated","notifications2","getDistributedNotifications","hideNotification","notification","_notification$onClose","clean","cleanQueue","_setPrototypeOf","setPrototypeOf","isMounting","_inheritsLoose","_proto","forceReflow","appearing","maybeNode","maybeAppearing","enterTimeout","maybeNextCallback","TransitionGroupContext","propTypes","getChildMapping","mapFn","mapper","getProp","getNextChildMapping","prevChildMapping","nextChildMapping","getValueForKey","nextKeysPending","pendingKeys","prevKey","childMapping","nextKey","pendingNextKey","mergeChildMappings","hasPrev","hasNext","prevChild","isLeaving","TransitionGroup","handleExited","ReferenceError","firstRender","currentChildMapping","childFactory","reducer","transforms","noTransform","getNotificationStateStyles","commonStyles","inState","outState","Notification","NotificationContainer","onHide","autoClose","_autoClose","notificationProps","autoCloseDuration","notificationAutoClose","getAutoClose","autoCloseTimeout","cancelAutoClose","handleHide","handleAutoClose","_data$onOpen","Transition$1","containerWidth","notificationMaxHeight","Notifications","useForceUpdate","previousLength","grouped","getGroupedNotifications","groupedComponents","notificationStyle","u2","l2","_lastHandleId","_lastImmediate","clearImmediate","O1","_strategy","z1","t3","n0","currentScript","u1","printErr","thisProgram","L1","U1","o1","l1","t1","w2","wasmBinary","C1","L2","HEAP8","HEAP16","HEAPU8","HEAPU16","HEAP32","HEAPU32","HEAPF32","HEAPF64","C2","M2","E2","preRun","n1","M1","onAbort","RuntimeError","P2","I2","S2","T2","j1","H1","noExitRuntime","E1","v3","P1","N1","v1","fromWireType","f1","A2","s1","i1","I1","m3","V1","J1","R2","D2","k2","_3","S1","m1","writable","FinalizationRegistry","unregister","T1","_1","O2","G1","q1","L3","t2","C3","F1","M3","g1","toWireType","W2","z2","P3","E3","$2","q2","K1","Y1","I3","U2","X1","Z1","Q1","B2","readValueFromPointer","S3","T3","x3","F3","optional","j2","A3","R3","D3","k3","O3","z3","n2","i2","U3","H2","N2","r2","V2","USER","LOGNAME","PATH","PWD","HOME","LANG","languages","J2","j3","InternalError","G2","A1","BindingError","isAliasOf","isDeleted","deleteLater","g3","UnboundTypeError","count_emval_handles","R1","H3","w1","w3","s2","Z2","o2","$3","W3","B3","K2","getFullYear","getTimezoneOffset","padStart","monitorRunDependencies","instantiateWasm","locateFile","p3","Y2","calledRun","onRuntimeInitialized","postRun","dynCall_iijj","dynCall_vijj","dynCall_jiii","dynCall_jii","dynCall_viijii","dynCall_iiiiij","dynCall_iiiiijj","dynCall_iiiiiijj","preInit","i3","r1","_tryLoad","_loadWithBackup","_ModulePromise","_wasmURL","setWasmUrl","_eventListeners","removeAllEventListeners","_initializeObserver","_observer","_observedCanvases","isIntersecting","unfreeze","i0","p2","r3","v2","W1","f2","createCoreMode","Mode","Reverse","Bounce","ReverseBounce","Forward","m2","createCoreFit","Fit","Contain","Cover","Fill","FitHeight","FitWidth","None","_2","createCoreAlign","VectorFloat","push_back","g2","createCoreSegment","_eventManager","_frameManager","_renderConfig","renderConfig","freezeOnOffscreen","_wasmModule","_dotLottieCore","DotLottiePlayer","themeId","autoplay","loopAnimation","useFrameInterpolation","createDefaultLayout","_loadFromData","_loadFromSrc","setBackgroundColor","_pointerUpMethod","_onPointerUp","_pointerDownMethod","_onPointerDown","_pointerMoveMethod","_onPointerMove","_pointerEnterMethod","_onPointerEnter","_pointerExitMethod","_onPointerLeave","_dispatchError","_fetchData","loadAnimationData","loadDotLottieData","currentFrame","isPlaying","_animationFrameId","_draw","autoResize","activeAnimationId","activeThemeId","manifestString","isFrozen","_isFrozen","_backgroundColor","isReady","isPaused","isStopped","loopCount","totalFrames","segmentDuration","createImageData","putImageData","requestFrame","setFrame","isComplete","setSpeed","setLoop","setUseFrameInterpolation","_cleanupStateMachineListeners","setSegment","setMode","setRenderConfig","k1","loadAnimation","setTheme","resetTheme","setThemeData","setSlots","setLayout","setViewport","loadStateMachine","startStateMachine","_setupStateMachineListeners","stopStateMachine","_getPointerPosition","postPointerUpEvent","postPointerDownEvent","postPointerMoveEvent","postPointerEnterEvent","postPointerExitEvent","getStateMachineListeners","stateMachineFrameworkSetup","loadStateMachineData","animationSize","setStateMachineBooleanContext","setStateMachineNumericContext","setStateMachineStringContext","getLayerBoundingBox","getLayerBounds","transformThemeToLottieSlots","o3","s3","u3","workerId","_worker","_workerManager","getWorker","assignAnimationToWorker","_wasmUrl","_sendMessage","_create","_handleWorkerEvent","instanceId","_updateDotLottieInstanceState","_dotLottieInstanceState","transferControlToOffscreen","_created","unassignAnimationFromWorker","animationId","themeData","stateMachineId","stateMachineData","_workers","_animationWorkerMap","sendMessage","terminateWorker","createDotLottie","dotLottieRefCallback","playOnHover","_f$current","_f$current2","_t$current","_t$current2","_f$current3","_f$current4","_t$current3","_t$current4","_t$current5","_t$current6","_t$current7","_t$current8","_t$current9","_t$current10","_t$current11","_t$current12","_v$marker","_t$current13","_t$current14","_t$current15","_t$current16","_n$align","_n$fit","DotLottie","WelcomeModal","marginTop","justifyContent","handleContinue","DotLottieReact","TableProvider","useTableContext","getDataAttributes","columnBorder","withColumnBorders","rowBorder","withRowBorders","striped","highlightOnHover","captionSide","stickyHeader","tableElement","TableTh","TableTd","TableTr","TableThead","TableTbody","TableTfoot","TableCaption","TableDataRenderer","caption","row","rowIndex","ScrollAreaProvider","useScrollAreaContext","_callbackRef$current","useResizeObserver","onResize","rAF","Corner","setWidth","setHeight","hasSize","scrollbarX","_ctx$scrollbarX","onCornerHeightChange","scrollbarY","_ctx$scrollbarY","onCornerWidthChange","ScrollAreaCorner","hasBothScrollbarsVisible","scrollHideDelay","ScrollAreaRoot","scrollbars","scrollArea","setScrollArea","setContent","setScrollbarX","setScrollbarY","cornerWidth","setCornerWidth","cornerHeight","setCornerHeight","scrollbarXEnabled","setScrollbarXEnabled","scrollbarYEnabled","setScrollbarYEnabled","onViewportChange","onContentChange","onScrollbarXChange","onScrollbarXEnabledChange","onScrollbarYChange","onScrollbarYEnabledChange","useDebouncedCallback","flushOnUnmount","handleCallback","debounceTimerRef","lastCallback","getThumbRatio","viewportSize","contentSize","getThumbSize","scrollbarPadding","scrollbar","paddingStart","paddingEnd","thumbSize","linearScale","getThumbOffsetFromScroll","scrollPos","thumbSizePx","maxScrollPos","maxThumbPos","scrollWithoutMomentum","isScrollingWithinScrollbarBounds","toInt","composeEventHandlers","originalEventHandler","ourEventHandler","checkForDefaultPrevented","ScrollbarProvider","useScrollbarContext","Scrollbar","hasThumb","onThumbChange","onThumbPointerUp","onThumbPointerDown","onThumbPositionChange","onDragScroll","onWheelScroll","scrollbarProps","setScrollbar","composeRefs","rectRef","prevWebkitUserSelectRef","handleWheelScroll","handleThumbPositionChange","handleDragScroll","handleWheel","setPointerCapture","webkitUserSelect","onPointerMove","onPointerUp","hasPointerCapture","releasePointerCapture","onLostPointerCapture","ScrollAreaScrollbarX","onSizesChange","setComputedStyle","pointerPos","paddingRight","ScrollAreaScrollbarY","paddingBottom","ScrollAreaScrollbarVisible","thumbRef","pointerOffsetRef","setSizes","thumbRatio","thumb","pointerOffset","thumbOffsetFromEnd","minPointerPos","maxPointerPos","getScrollPositionFromPointer","ScrollAreaScrollbarAuto","forceMount","isHorizontal","isOverflowX","isOverflowY","ScrollAreaScrollbarHover","hideTimer","handlePointerEnter","handlePointerLeave","ScrollAreaScrollbarScroll","debounceScrollEnd","scrollDirection","prevScrollPos","onPointerLeave","ScrollAreaScrollbar","Thumb","scrollAreaContext","scrollbarContext","composedRef","removeUnlinkedScrollListenerRef","prevPosition","isHorizontalScroll","isVerticalScroll","addUnlinkedScrollListener","onPointerDownCapture","thumbRect","ScrollAreaThumb","thumbProps","ScrollAreaViewport","scrollbarSize","overscrollBehavior","ScrollArea","viewportProps","viewportRef","onScrollPositionChange","offsetScrollbars","onBottomReached","onTopReached","scrollbarHovered","setScrollbarHovered","verticalThumbVisible","setVerticalThumbVisible","horizontalThumbVisible","setHorizontalThumbVisible","localViewportRef","combinedViewportRef","observer","_viewportProps$onScro","ScrollAreaAutosize","Autosize","scrollContainer","TableScrollContainer","verticalSpacing","horizontalSpacing","stripedColor","highlightOnHoverColor","stickyHeaderOffset","table","Table","withTableBorder","tabularNums","Thead","Tbody","Tfoot","Caption","ScrollContainer","DataRenderer","about","textDecoration","needHelp","contact","InformationModal","modalContent","setModalContent","modalTitle","setModalTitle","activeButton","setActiveButton","openModal","buttonType","marginBottom","modalContentData","closeModal","MAPBOX_TOKEN","DEFAULT_VIEW","centre","_selectedFeature$prop","_selectedFeature$prop2","_selectedFeature$prop3","_selectedFeature$prop4","_selectedFeature$prop5","_selectedFeature$prop6","mapRef","selectedFeature","setSelectedFeature","showSideBar","setShowSideBar","geojsonData","setGeojsonData","POIData","setPOIData","POILineData","setPOILineData","boundaryData","setBoundaryData","isPinned","setIsPinned","isWardLabel","setIsWardLabel","zoomLevel","setZoomLevel","wardLabels","WardLabels","layersVisibility","setLayersVisibility","handleMapClick","_event$features","_mapRef$current","_mapRef$current2","loadImageWithRetry","retries","attemptLoad","retryCount","preloadImages","handleMouseLeave","_mapRef$current3","flyToHome","_mapRef$current4","fetchDatasetsAndMatchProperties","geojsonResponses","datasets","matchingData","wardResponse","wardText","wardData","json_geometry","WARD_NAME","GISID","matchingDataLookup","fid","PropertyId","matchingDataShortlist","seenPropertyIds","combinedGeojson","propertyId","matchingFeature","mappedProperties","tech1Feature","mapboxFeature","ApplicationStage","ApplicationStatus","LodgedDate","Category","Compliance","Status","SiteName","Decision","ApplicationUrl","Applicat_3","BuildingHeight","EAVE_Elev","ApplicationId","APPLN_ID","ProjectId","Project_ID","POIGeometry","PDDAM1","PDDAM2","ELECTORATE","mapTech1ToMapboxProperties","processedPOIData","FID","Lodged_Dat","handleZoomChange","_mapRef$current5","zoomlv","updateLineData","lineFeatures","pixelPoint","floatingPixelPoint","floatingGeoPoint","handleUpdateLineData","FilterPanel","wardLabelButtonHandle","pinButtonHandle","ClusteredLayer","MapPage","UNSAFE_mapRouteProperties","App","onPerfEntry","getCLS","getFID","getFCP","getLCP","getTTFB","reportWebVitals"],"sourceRoot":""}